Merge branch 'master' of git://git.ucc.asn.au/ipdf/code
[ipdf/code.git] / src / document.cpp
index d4d8eac..a6c6fad 100644 (file)
@@ -282,16 +282,16 @@ void Document::LoadSVG(const string & filename, const Rect & bounds)
        input.close();
 
        // Combine all SVG tags into one thing because lazy
-       for (xml_node svg : doc_xml.children("svg"))
+       for (xml_node svg = doc_xml.child("svg"); svg; svg = svg.next_sibling("svg"))
        {
-               Real width = svg.attribute("width").as_float() * bounds.w;
-               Real height = svg.attribute("width").as_float() * bounds.h;
+               Real width = Real(svg.attribute("width").as_float()) * bounds.w;
+               Real height = Real(svg.attribute("width").as_float()) * bounds.h;
                
                
                // Rectangles
                Real coords[4];
                const char * attrib_names[] = {"x", "y", "width", "height"};
-               for (pugi::xml_node rect : svg.children("rect"))
+               for (pugi::xml_node rect = svg.child("rect"); rect; rect = rect.next_sibling("rect"))
                {
                        for (size_t i = 0; i < 4; ++i)
                                coords[i] = rect.attribute(attrib_names[i]).as_float();
@@ -302,7 +302,7 @@ void Document::LoadSVG(const string & filename, const Rect & bounds)
                }               
                
                // Circles
-               for (pugi::xml_node circle : svg.children("circle"))
+               for (pugi::xml_node circle = svg.child("circle"); circle; circle = circle.next_sibling("circle"))
                {
                        Real cx = circle.attribute("cx").as_float();
                        Real cy = circle.attribute("cy").as_float();
@@ -310,8 +310,8 @@ void Document::LoadSVG(const string & filename, const Rect & bounds)
                        
                        Real x = (cx - r)/width + bounds.x; 
                        Real y = (cy - r)/height + bounds.y; 
-                       Real w = 2*r/width; 
-                       Real h = 2*r/height;
+                       Real w = Real(2)*r/width; 
+                       Real h = Real(2)*r/height;
                        
                        Rect rect(x,y,w,h);
                        Add(CIRCLE_FILLED, rect,0);
@@ -320,7 +320,7 @@ void Document::LoadSVG(const string & filename, const Rect & bounds)
                }               
                
                // paths
-               for (pugi::xml_node path : svg.children("path"))
+               for (pugi::xml_node path = svg.child("path"); path; path = path.next_sibling("path"))
                {
                        
                        string d = path.attribute("d").as_string();
@@ -396,9 +396,9 @@ void Document::AddPathFromString(const string & d, const Rect & bounds)
                if (command == "m" || command == "M")
                {
                        Debug("Construct moveto command");
-                       Real dx = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.w;
+                       Real dx = Real(strtod(GetToken(d,token,i).c_str(),NULL)) / bounds.w;
                        assert(GetToken(d,token,i) == ",");
-                       Real dy = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.h;
+                       Real dy = Real(strtod(GetToken(d,token,i).c_str(),NULL)) / bounds.h;
                        
                        x[0] = (relative) ? x[0] + dx : dx;
                        y[0] = (relative) ? y[0] + dy : dy;
@@ -411,25 +411,25 @@ void Document::AddPathFromString(const string & d, const Rect & bounds)
                else if (command == "c" || command == "C" || command == "q" || command == "Q")
                {
                        Debug("Construct curveto command");
-                       Real dx = strtod(GetToken(d,token,i).c_str(),NULL)/bounds.w;
+                       Real dx = Real(strtod(GetToken(d,token,i).c_str(),NULL))/bounds.w;
                        assert(GetToken(d,token,i) == ",");
-                       Real dy = strtod(GetToken(d,token,i).c_str(),NULL)/bounds.h;
+                       Real dy = Real(strtod(GetToken(d,token,i).c_str(),NULL))/bounds.h;
                        
                        x[1] = (relative) ? x[0] + dx : dx;
                        y[1] = (relative) ? y[0] + dy : dy;
                        
-                       dx = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.w;
+                       dx = Real(strtod(GetToken(d,token,i).c_str(),NULL)) / bounds.w;
                        assert(GetToken(d,token,i) == ",");
-                       dy = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.h;
+                       dy = Real(strtod(GetToken(d,token,i).c_str(),NULL)) / bounds.h;
                        
                        x[2] = (relative) ? x[0] + dx : dx;
                        y[2] = (relative) ? y[0] + dy : dy;
                        
                        if (command != "q" && command != "Q")
                        {
-                               dx = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.w;
+                               dx = Real(strtod(GetToken(d,token,i).c_str(),NULL)) / bounds.w;
                                assert(GetToken(d,token,i) == ",");
-                               dy = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.h;
+                               dy = Real(strtod(GetToken(d,token,i).c_str(),NULL)) / bounds.h;
                                x[3] = (relative) ? x[0] + dx : dx;
                                y[3] = (relative) ? y[0] + dy : dy;
                        }
@@ -437,6 +437,11 @@ void Document::AddPathFromString(const string & d, const Rect & bounds)
                        {
                                x[3] = x[2];
                                y[3] = y[2];
+                               Real old_x1(x[1]), old_y1(y[1]);
+                               x[1] = x[0] + Real(2) * (old_x1 - x[0])/ Real(3);
+                               y[1] = y[0] + Real(2) * (old_y1 - y[0])/ Real(3);
+                               x[2] = x[3] + Real(2) * (old_x1 - x[3])/ Real(3);
+                               y[2] = y[3] + Real(2) * (old_y1 - y[3])/ Real(3);
                        }
                        
                        unsigned index = AddBezierData(Bezier(x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3]));
@@ -454,12 +459,12 @@ void Document::AddPathFromString(const string & d, const Rect & bounds)
                {
                        Debug("Construct lineto command");
                
-                       Real dx = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.w;
+                       Real dx = Real(strtod(GetToken(d,token,i).c_str(),NULL)) / bounds.w;
                        assert(GetToken(d,token,i) == ",");
-                       Real dy = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.h;
+                       Real dy = Real(strtod(GetToken(d,token,i).c_str(),NULL)) / bounds.h;
                        
-                       x[1] = (relative) ? x0 + dx : dx;
-                       y[1] = (relative) ? y0 + dy : dy;
+                       x[1] = (relative) ? x[0] + dx : dx;
+                       y[1] = (relative) ? y[0] + dy : dy;
                        
                        x[2] = x[1];
                        y[2] = y[1];

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