#include <fstream>
#include "../contrib/pugixml-1.4/src/pugixml.cpp"
+#include "transformationtype.h"
#include "stb_truetype.h"
QuadTreeIndex Document::GenQuadChild(QuadTreeIndex parent, QuadTreeNodeChildren type)
{
QuadTreeIndex new_index = m_quadtree.nodes.size();
- Debug("-------------- Generating Quadtree Node %d (parent %d) ----------------------", new_index, parent);
+ Debug("-------------- Generating Quadtree Node %d (parent %d, type %d) ----------------------", new_index, parent, type);
m_quadtree.nodes.push_back(QuadTreeNode{QUADTREE_EMPTY, QUADTREE_EMPTY, QUADTREE_EMPTY, QUADTREE_EMPTY, parent, type, 0, 0, -1});
m_quadtree.nodes[new_index].object_begin = m_objects.bounds.size();
- for (unsigned i = m_quadtree.nodes[parent].object_begin; i < m_quadtree.nodes[parent].object_end; ++i)
+ for (QuadTreeIndex overlay = parent; overlay != -1; overlay = m_quadtree.nodes[overlay].next_overlay)
{
- if (IntersectsQuadChild(m_objects.bounds[i], type))
+ for (unsigned i = m_quadtree.nodes[overlay].object_begin; i < m_quadtree.nodes[overlay].object_end; ++i)
{
- m_count += ClipObjectToQuadChild(i, type);
+ if (IntersectsQuadChild(m_objects.bounds[i], type))
+ {
+ m_count += ClipObjectToQuadChild(i, type);
+ }
}
}
m_quadtree.nodes[new_index].object_end = m_objects.bounds.size();
m_quadtree.nodes.push_back(QuadTreeNode{QUADTREE_EMPTY, QUADTREE_EMPTY, QUADTREE_EMPTY, QUADTREE_EMPTY, -1, QTC_UNKNOWN, 0, 0, -1});
m_quadtree.nodes[new_index].object_begin = m_objects.bounds.size();
- for (unsigned i = m_quadtree.nodes[child].object_begin; i < m_quadtree.nodes[child].object_end; ++i)
+ for (QuadTreeIndex overlay = child; overlay != -1; overlay = m_quadtree.nodes[overlay].next_overlay)
{
- m_objects.bounds.push_back(TransformFromQuadChild(m_objects.bounds[i], type));
- m_objects.types.push_back(m_objects.types[i]);
- m_objects.data_indices.push_back(m_objects.data_indices[i]);
- m_count++;
+ for (unsigned i = m_quadtree.nodes[overlay].object_begin; i < m_quadtree.nodes[overlay].object_end; ++i)
+ {
+ m_objects.bounds.push_back(TransformFromQuadChild(m_objects.bounds[i], type));
+ m_objects.types.push_back(m_objects.types[i]);
+ m_objects.data_indices.push_back(m_objects.data_indices[i]);
+ m_count++;
+ }
}
m_quadtree.nodes[new_index].object_end = m_objects.bounds.size();
switch (type)
#ifndef QUADTREE_DISABLED
if (qti != -1)
{
- if (m_count == m_quadtree.nodes[qti].object_end+1)
+ while (m_quadtree.nodes[qti].next_overlay != -1)
{
- m_quadtree.nodes[qti].object_end++;
- }
- else
- {
- QuadTreeIndex overlay = m_quadtree.nodes.size();
- m_quadtree.nodes.push_back(m_quadtree.nodes[qti]);
- m_quadtree.nodes[overlay].object_begin = m_count;
- m_quadtree.nodes[overlay].object_end = m_count+1;
- m_quadtree.nodes[qti].next_overlay = overlay;
+ if (m_count == m_quadtree.nodes[qti].object_end+1)
+ {
+ m_quadtree.nodes[qti].object_end++;
+ goto done;
+ }
+ qti = m_quadtree.nodes[qti].next_overlay;
}
+ QuadTreeIndex overlay = m_quadtree.nodes.size();
+ m_quadtree.nodes.push_back(m_quadtree.nodes[qti]);
+ m_quadtree.nodes[overlay].object_begin = m_count;
+ m_quadtree.nodes[overlay].object_end = m_count+1;
+ m_quadtree.nodes[qti].next_overlay = overlay;
}
#endif
+done:
return (m_count++); // Why can't we just use the size of types or something?
}
void Document::TranslateObjects(const Real & dx, const Real & dy, ObjectType type)
{
+ #ifdef TRANSFORM_BEZIERS_TO_PATH
+ for (unsigned i = 0; i < m_objects.paths.size(); ++i)
+ {
+ Path & p = m_objects.paths[i];
+ p.m_bounds.x += dx;
+ p.m_bounds.y += dy;
+ }
+ return;
+ #endif
+
for (unsigned i = 0; i < m_count; ++i)
{
if (type == NUMBER_OF_OBJECT_TYPES || m_objects.types[i] == type)
void Document::ScaleObjectsAboutPoint(const Real & x, const Real & y, const Real & scale_amount, ObjectType type)
{
+ #ifdef TRANSFORM_BEZIERS_TO_PATH
+ for (unsigned i = 0; i < m_objects.paths.size(); ++i)
+ {
+ Path & p = m_objects.paths[i];
+ p.m_bounds.w /= scale_amount;
+ p.m_bounds.h /= scale_amount;
+ p.m_bounds.x -= x;
+ p.m_bounds.x /= scale_amount;
+ p.m_bounds.x += x;
+ p.m_bounds.y -= y;
+ p.m_bounds.y /= scale_amount;
+ p.m_bounds.y += y;
+ }
+ return;
+ #endif
+
for (unsigned i = 0; i < m_count; ++i)
{
if (type != NUMBER_OF_OBJECT_TYPES && m_objects.types[i] != type)
m_objects.bounds[i].y /= scale_amount;
m_objects.bounds[i].y += y;
}
+
}