Add MinGW Win32 Cross Compiling
[ipdf/code.git] / src / document.cpp
index bcf003b..22e4235 100644 (file)
@@ -4,6 +4,7 @@
 #include <fstream>
 
 #include "../contrib/pugixml-1.4/src/pugixml.cpp"
+#include "transformationtype.h"
 
 #include "stb_truetype.h"
 
@@ -172,11 +173,14 @@ QuadTreeIndex Document::GenQuadChild(QuadTreeIndex parent, QuadTreeNodeChildren
        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();
@@ -207,12 +211,15 @@ QuadTreeIndex Document::GenQuadParent(QuadTreeIndex child, QuadTreeNodeChildren
        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)
@@ -333,19 +340,22 @@ unsigned Document::Add(ObjectType type, const Rect & bounds, unsigned data_index
 #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;
        }
+done: // matches is not amused
 #endif
        return (m_count++); // Why can't we just use the size of types or something?
 }
@@ -1059,8 +1069,8 @@ void Document::TranslateObjects(const Real & dx, const Real & dy, ObjectType typ
                for (unsigned i = 0; i < m_objects.paths.size(); ++i)
                {
                        Path & p = m_objects.paths[i];
-                       p.x += dx;
-                       p.y += dy;
+                       p.m_bounds.x += dx;
+                       p.m_bounds.y += dy;
                }
                return;
        #endif  
@@ -1081,14 +1091,14 @@ void Document::ScaleObjectsAboutPoint(const Real & x, const Real & y, const Real
                for (unsigned i = 0; i < m_objects.paths.size(); ++i)
                {
                        Path & p = m_objects.paths[i];
-                       p.w /= scale_amount;
-                       p.h /= scale_amount;
-                       p.x -= x;
-                       p.x /= scale_amount;
-                       p.x += x;
-                       p.y -= y;
-                       p.y /= scale_amount;
-                       p.y += y;
+                       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

UCC git Repository :: git.ucc.asn.au