switch (type)
{
case QTC_TOP_LEFT:
- orig_node = m_quadtree.nodes[orig_parent].top_left = new_index;
+ orig_node = m_quadtree.nodes[orig_parent].top_left;
break;
case QTC_TOP_RIGHT:
- orig_node = m_quadtree.nodes[orig_parent].top_right = new_index;
+ orig_node = m_quadtree.nodes[orig_parent].top_right;
break;
case QTC_BOTTOM_LEFT:
- orig_node = m_quadtree.nodes[orig_parent].bottom_left = new_index;
+ orig_node = m_quadtree.nodes[orig_parent].bottom_left;
break;
case QTC_BOTTOM_RIGHT:
- orig_node = m_quadtree.nodes[orig_parent].bottom_right = new_index;
+ orig_node = m_quadtree.nodes[orig_parent].bottom_right;
break;
default:
Fatal("Tried to overlay a QuadTree child of invalid type!");
// Add us to the node's overlay linked list.
QuadTreeIndex prev_overlay = orig_node;
- while (m_quadtree.nodes[prev_overlay].next_overlay != -1);
+ while (m_quadtree.nodes[prev_overlay].next_overlay != -1) prev_overlay = m_quadtree.nodes[prev_overlay].next_overlay;
+ Debug("- Original node %d, Previous overlay %d, new overlay %d", orig_node, prev_overlay, new_index);
m_quadtree.nodes[prev_overlay].next_overlay = new_index;
// Recurse into any extant children.
OverlayQuadChildren(orig_node, new_index, QTC_BOTTOM_RIGHT);
m_quadtree.nodes[new_index].object_dirty = m_quadtree.nodes[new_index].object_end;
+ m_quadtree.nodes[new_index].next_overlay = -1;
}
void Document::PropagateQuadChanges(QuadTreeIndex node)
m_count++;
PropagateQuadChanges(qti);
}
-#else // Although empty documents do always render correctly at any zoom,
- // I suspect the markers will not be amused
- m_count++;
+ return m_count-1;
+#else // words fail me (still not amused)
+ return (m_count++);
#endif
- return m_count; // Why can't we just use the size of types or something?
+
}
unsigned Document::AddBezierData(const Bezier & bezier)
stbtt_FreeShape(font, instructions);
}
-void Document::TransformObjectBounds(const SVGMatrix & transform)
+void Document::TransformObjectBounds(const SVGMatrix & transform, 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 = transform.a * p.m_bounds.x + transform.e;
+ p.m_bounds.y = transform.d * p.m_bounds.y + transform.f;
+ p.m_bounds.w *= transform.a;
+ p.m_bounds.h *= transform.d;
+ }
+ return;
+ #endif
+
for (unsigned i = 0; i < m_count; ++i)
{
- TransformXYPair(m_objects.bounds[i].x, m_objects.bounds[i].y, transform);
- m_objects.bounds[i].w *= transform.a;
- m_objects.bounds[i].h *= transform.d;
+ if (type == NUMBER_OF_OBJECT_TYPES || m_objects.types[i] == type)
+ {
+ TransformXYPair(m_objects.bounds[i].x, m_objects.bounds[i].y, transform);
+ m_objects.bounds[i].w *= transform.a;
+ m_objects.bounds[i].h *= transform.d;
+ }
}
}
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_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)