X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fdocument.cpp;h=a6c6fadb9c4ea50f40a43c4d53df9ec2d107aa88;hp=d4d8eacf53f5d14b85decd8e6632b37db47158e1;hb=239870c67910883756cffe6c963c7f7fa44402b9;hpb=7e00a47f18e0ccdb0c7255f30bc7820cabb3206a diff --git a/src/document.cpp b/src/document.cpp index d4d8eac..a6c6fad 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -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];