Cubic Beziers and more SVG stuff
authorSam Moore <[email protected]>
Thu, 7 Aug 2014 02:42:02 +0000 (10:42 +0800)
committerSam Moore <[email protected]>
Thu, 7 Aug 2014 02:42:02 +0000 (10:42 +0800)
Cubic Beziers!
Actually transform the coordinates properly!

Sort of maybe kind of render shape.svg correctly*

* Shading and stroke width will be available in the premium edition, order today for $99.99

src/bezier.h
src/document.cpp
src/objectrenderer.cpp
src/objectrenderer.h
src/shaders/bezier_texbuf_geom.glsl
src/svg-tests/glyphs.svg [new file with mode: 0644]
src/svg-tests/koch1.svg [new symlink]
src/svg-tests/rabbit_simple.svg [new symlink]
src/svg-tests/shape.svg [new symlink]
src/view.cpp

index 3a8e80d..0e9217f 100644 (file)
@@ -9,21 +9,25 @@ namespace IPDF
        extern int BinomialCoeff(int n, int k);
        extern Real Bernstein(int k, int n, const Real & u);
 
        extern int BinomialCoeff(int n, int k);
        extern Real Bernstein(int k, int n, const Real & u);
 
-       /** A _quadratic_ bezier. **/
+       /** A _cubic_ bezier. **/
        struct Bezier
        {
                Real x0; Real y0;
                Real x1; Real y1;
                Real x2; Real y2;
        struct Bezier
        {
                Real x0; Real y0;
                Real x1; Real y1;
                Real x2; Real y2;
+               Real x3; Real y3;
                Bezier() = default; // Needed so we can fread/fwrite this struct... for now.
                Bezier() = default; // Needed so we can fread/fwrite this struct... for now.
-               Bezier(Real _x0, Real _y0, Real _x1, Real _y1, Real _x2, Real _y2) : x0(_x0), y0(_y0), x1(_x1), y1(_y1), x2(_x2), y2(_y2) {}
+               Bezier(Real _x0, Real _y0, Real _x1, Real _y1, Real _x2, Real _y2, Real _x3, Real _y3) : x0(_x0), y0(_y0), x1(_x1), y1(_y1), x2(_x2), y2(_y2), x3(_x3), y3(_y3) {}
+               
+               Bezier(Real _x0, Real _y0, Real _x1, Real _y1, Real _x2, Real _y2) : x0(_x0), y0(_y0), x1(_x1), y1(_y1), x2(_x2), y2(_y2), x3(_x2), y3(_y2) {}
+               
                std::string Str() const
                {
                        std::stringstream s;
                std::string Str() const
                {
                        std::stringstream s;
-                       s << "Bezier{" << Float(x0) << "," << Float(y0) << " -> " << Float(x1) << "," << Float(y1) << " -> " << Float(x2) << "," << Float(y2) << "}";
+                       s << "Bezier{" << Float(x0) << "," << Float(y0) << " -> " << Float(x1) << "," << Float(y1) << " -> " << Float(x2) << "," << Float(y2) << " -> " << Float(x3) << "," << Float(y3) << "}";
                        return s.str();
                }
                        return s.str();
                }
-               Bezier(const Bezier & cpy, const Rect & t = Rect(0,0,1,1)) : x0(cpy.x0), y0(cpy.y0), x1(cpy.x1), y1(cpy.y1), x2(cpy.x2),y2(cpy.y2)
+               Bezier(const Bezier & cpy, const Rect & t = Rect(0,0,1,1)) : x0(cpy.x0), y0(cpy.y0), x1(cpy.x1), y1(cpy.y1), x2(cpy.x2),y2(cpy.y2), x3(cpy.x3), y3(cpy.y3)
                {
                        x0 *= t.w;
                        y0 *= t.h;
                {
                        x0 *= t.w;
                        y0 *= t.h;
@@ -31,24 +35,28 @@ namespace IPDF
                        y1 *= t.h;
                        x2 *= t.w;
                        y2 *= t.h;
                        y1 *= t.h;
                        x2 *= t.w;
                        y2 *= t.h;
+                       x3 *= t.w;
+                       y3 *= t.h;
                        x0 += t.x;
                        y0 += t.y;
                        x1 += t.x;
                        y1 += t.y;
                        x2 += t.x;
                        y2 += t.y;
                        x0 += t.x;
                        y0 += t.y;
                        x1 += t.x;
                        y1 += t.y;
                        x2 += t.x;
                        y2 += t.y;
+                       x3 += t.x;
+                       y3 += t.y;
                }
 
                }
 
-               Rect ToRect() {return Rect(x0,y0,x2-x0,y2-y0);}
+               Rect ToRect() {return Rect(x0,y0,x3-x0,y3-y0);}
 
                /** Evaluate the Bezier at parametric parameter u, puts resultant point in (x,y) **/
                void Evaluate(Real & x, Real & y, const Real & u)
                {
 
                /** Evaluate the Bezier at parametric parameter u, puts resultant point in (x,y) **/
                void Evaluate(Real & x, Real & y, const Real & u)
                {
-                       Real coeff[3];
-                       for (unsigned i = 0; i < 3; ++i)
-                               coeff[i] = Bernstein(i,2,u);
-                       x = x0*coeff[0] + x1*coeff[1] + x2*coeff[2];
-                       y = y0*coeff[0] + y1*coeff[1] + y2*coeff[2];
+                       Real coeff[4];
+                       for (unsigned i = 0; i < 4; ++i)
+                               coeff[i] = Bernstein(i,3,u);
+                       x = x0*coeff[0] + x1*coeff[1] + x2*coeff[2] + x3*coeff[3];
+                       y = y0*coeff[0] + y1*coeff[1] + y2*coeff[2] + y3*coeff[3];
                }
 
        };
                }
 
        };
index 7c49074..892f77a 100644 (file)
@@ -225,6 +225,9 @@ bool Document::operator==(const Document & equ) const
 #include "../contrib/pugixml-1.4/src/pugixml.hpp"
 #include "../contrib/pugixml-1.4/src/pugixml.cpp"
 
 #include "../contrib/pugixml-1.4/src/pugixml.hpp"
 #include "../contrib/pugixml-1.4/src/pugixml.cpp"
 
+/**
+ * Load an SVG into a rectangle
+ */
 void Document::LoadSVG(const string & filename, const Rect & bounds)
 {
        using namespace pugi;
 void Document::LoadSVG(const string & filename, const Rect & bounds)
 {
        using namespace pugi;
@@ -306,7 +309,7 @@ static string & GetToken(const string & d, string & token, unsigned & i)
        
        while (i < d.size())
        {
        
        while (i < d.size())
        {
-               if (d[i] == ',' || isalpha(d[i]) || iswspace(d[i]))
+               if (d[i] == ',' || (isalpha(d[i]) && d[i] != 'e') || iswspace(d[i]))
                {
                        if (token.size() == 0 && !iswspace(d[i]))
                        {
                {
                        if (token.size() == 0 && !iswspace(d[i]))
                        {
@@ -325,17 +328,20 @@ static string & GetToken(const string & d, string & token, unsigned & i)
 // Seriously this isn't really very DOM-like at all is it?
 void Document::AddPathFromString(const string & d, const Rect & bounds)
 {
 // Seriously this isn't really very DOM-like at all is it?
 void Document::AddPathFromString(const string & d, const Rect & bounds)
 {
-       Real x[3] = {0,0,0};
-       Real y[3] = {0,0,0};
+       Real x[4] = {0,0,0,0};
+       Real y[4] = {0,0,0,0};
        
        string token("");
        string command("m");
        
        
        string token("");
        string command("m");
        
+       Real x0(0);
+       Real y0(0);
+       
        unsigned i = 0;
        unsigned prev_i = 0;
        unsigned i = 0;
        unsigned prev_i = 0;
-       Real x0;
-       Real y0;
-       bool started = false;
+       
+       bool start = false;
+       
        while (i < d.size() && GetToken(d, token, i).size() > 0)
        {
                if (isalpha(token[0]))
        while (i < d.size() && GetToken(d, token, i).size() > 0)
        {
                if (isalpha(token[0]))
@@ -344,87 +350,111 @@ void Document::AddPathFromString(const string & d, const Rect & bounds)
                {
                        i = prev_i; // hax
                        if(command == "")
                {
                        i = prev_i; // hax
                        if(command == "")
-                               command = "l";
+                               command = "L";
                }
                }
+               
+               bool relative = islower(command[0]);
                        
                        
-               if (command == "m")
+               if (command == "m" || command == "M")
                {
                        Debug("Construct moveto command");
                {
                        Debug("Construct moveto command");
-                       x[0] = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.w;
+                       Real dx = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.w;
                        assert(GetToken(d,token,i) == ",");
                        assert(GetToken(d,token,i) == ",");
-                       y[0] = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.h;
-                       if (!started)
-                       {
-                               x0 = x[0];
-                               y0 = y[0];
-                               started = true;
-                       }
+                       Real dy = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.h;
+                       
+                       x[0] = (relative) ? x[0] + dx : dx;
+                       y[0] = (relative) ? y[0] + dy : dy;
+                       
+
+                       
                        Debug("mmoveto %f,%f", Float(x[0]),Float(y[0]));
                        Debug("mmoveto %f,%f", Float(x[0]),Float(y[0]));
-                       command = "l";
+                       command = (command == "m") ? "l" : "L";
                }
                }
-               else if (command == "c")
+               else if (command == "c" || command == "C" || command == "q" || command == "Q")
                {
                        Debug("Construct curveto command");
                {
                        Debug("Construct curveto command");
-                       x[0] = strtod(GetToken(d,token,i).c_str(),NULL)/bounds.w;
+                       Real dx = strtod(GetToken(d,token,i).c_str(),NULL)/bounds.w;
                        assert(GetToken(d,token,i) == ",");
                        assert(GetToken(d,token,i) == ",");
-                       y[0] = strtod(GetToken(d,token,i).c_str(),NULL)/bounds.h;
+                       Real dy = strtod(GetToken(d,token,i).c_str(),NULL)/bounds.h;
                        
                        
-                       x[1] = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.w;
-                       assert(GetToken(d,token,i) == ",");
-                       y[1] = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.h;
+                       x[1] = (relative) ? x[0] + dx : dx;
+                       y[1] = (relative) ? y[0] + dy : dy;
                        
                        
-                       x[2] = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.w;
+                       dx = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.w;
                        assert(GetToken(d,token,i) == ",");
                        assert(GetToken(d,token,i) == ",");
-                       y[2] = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.h;
+                       dy = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.h;
                        
                        
-                       unsigned index = AddBezierData(Bezier(x[0],y[0],x[1],y[1],x[2],y[2]));
-                       Add(BEZIER,bounds,index);
+                       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;
+                               assert(GetToken(d,token,i) == ",");
+                               dy = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.h;
+                               x[3] = (relative) ? x[0] + dx : dx;
+                               y[3] = (relative) ? y[0] + dy : dy;
+                       }
+                       else
+                       {
+                               x[3] = x[2];
+                               y[3] = y[2];
+                       }
                        
                        
-                       Debug("[%u] curveto %f,%f %f,%f %f,%f", index, Float(x[0]),Float(y[0]),Float(x[1]),Float(y[1]),Float(x[2]),Float(y[2]));
+                       unsigned index = AddBezierData(Bezier(x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3]));
+                       Add(BEZIER,Rect(0,0,1,1),index);
                        
                        
-                       x[0] = x[2];
-                       y[0] = y[2];
+                       
+                       Debug("[%u] curveto %f,%f %f,%f %f,%f", index, Float(x[1]),Float(y[1]),Float(x[2]),Float(y[2]),Float(x[3]),Float(y[3]));
+                       
+                       x[0] = x[3];
+                       y[0] = y[3];
 
                        
                }
 
                        
                }
-               else if (command == "l")
+               else if (command == "l" || command == "L")
                {
                        Debug("Construct lineto command");
                
                {
                        Debug("Construct lineto command");
                
-                       x[1] = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.w;
+                       Real dx = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.w;
                        assert(GetToken(d,token,i) == ",");
                        assert(GetToken(d,token,i) == ",");
-                       y[1] = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.h;
+                       Real dy = strtod(GetToken(d,token,i).c_str(),NULL) / bounds.h;
+                       
+                       x[1] = (relative) ? x0 + dx : dx;
+                       y[1] = (relative) ? y0 + dy : dy;
                        
                        x[2] = x[1];
                        y[2] = y[1];
                        
                        x[2] = x[1];
                        y[2] = y[1];
-
-                       Rect segment_bounds(x[0], y[0], x[2] - x[0], y[2] - y[0]);
                        
                        
-                       unsigned index = AddBezierData(Bezier(x[0],y[0],x[1],y[1],x[2],y[2]));
-                       Add(BEZIER,bounds,index);
+                       x[3] = x[1];
+                       y[3] = y[1];
+
+                       unsigned index = AddBezierData(Bezier(x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3]));
+                       Add(BEZIER,Rect(0,0,1,1),index);
                        
                        Debug("[%u] lineto %f,%f %f,%f", index, Float(x[0]),Float(y[0]),Float(x[1]),Float(y[1]));
                        
                        
                        Debug("[%u] lineto %f,%f %f,%f", index, Float(x[0]),Float(y[0]),Float(x[1]),Float(y[1]));
                        
-                       x[0] = x[2];
-                       y[0] = y[2];
+                       x[0] = x[3];
+                       y[0] = y[3];
 
                }
 
                }
-               else if (command == "z")
+               else if (command == "z" || command == "Z")
                {
                        Debug("Construct returnto command");
                        x[1] = x0;
                        y[1] = y0;
                        x[2] = x0;
                        y[2] = y0;
                {
                        Debug("Construct returnto command");
                        x[1] = x0;
                        y[1] = y0;
                        x[2] = x0;
                        y[2] = y0;
+                       x[3] = x0;
+                       y[3] = y0;
                        
                        
-                       unsigned index = AddBezierData(Bezier(x[0],y[0],x[1],y[1],x[2],y[2]));
-                       Add(BEZIER,bounds,index);
+                       unsigned index = AddBezierData(Bezier(x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3]));
+                       Add(BEZIER,Rect(0,0,1,1),index);
                        
                        Debug("[%u] returnto %f,%f %f,%f", index, Float(x[0]),Float(y[0]),Float(x[1]),Float(y[1]));
                        
                        
                        Debug("[%u] returnto %f,%f %f,%f", index, Float(x[0]),Float(y[0]),Float(x[1]),Float(y[1]));
                        
-                       x[0] = x[2];
-                       y[0] = y[2];
+                       x[0] = x[3];
+                       y[0] = y[3];
                        command = "m";
                }
                else
                        command = "m";
                }
                else
@@ -432,6 +462,13 @@ void Document::AddPathFromString(const string & d, const Rect & bounds)
                        Warn("Unrecognised command \"%s\", set to \"m\"", command.c_str());
                        command = "m";
                }
                        Warn("Unrecognised command \"%s\", set to \"m\"", command.c_str());
                        command = "m";
                }
+               
+               if (!start)
+               {
+                       x0 = x[0];
+                       y0 = y[0];
+                       start = true;
+               }
                prev_i = i;
        }
 }
                prev_i = i;
        }
 }
index d23cd98..cb96c30 100644 (file)
@@ -241,15 +241,12 @@ void BezierRenderer::RenderUsingCPU(const Objects & objects, const View & view,
                
                Real x[2]; Real y[2];
                control.Evaluate(x[0], y[0], Real(0));
                
                Real x[2]; Real y[2];
                control.Evaluate(x[0], y[0], Real(0));
-               Debug("target is (%lu, %lu)", target.w, target.h);
-               int64_t blen = 1;
-               if ((control.x1 != control.x2 || control.y1 != control.y2)
-                       && (control.x1 != control.x0 || control.y1 != control.y0))
-               {
-                       blen = min(max((int64_t)2, (int64_t)(target.w/view.GetBounds().w)), (int64_t)100);
-               }
+               //Debug("target is (%lu, %lu)", target.w, target.h);
+               int64_t blen = 100;
+               //blen = min(max((int64_t)2, (int64_t)(target.w/view.GetBounds().w)), (int64_t)100);
+               
                Real invblen(1); invblen /= blen;
                Real invblen(1); invblen /= blen;
-               Debug("Using %li lines, inverse %f", blen, Double(invblen));
+               //Debug("Using %li lines, inverse %f", blen, Double(invblen));
                for (int64_t j = 1; j <= blen; ++j)
                {
                        control.Evaluate(x[j % 2],y[j % 2], invblen*j);
                for (int64_t j = 1; j <= blen; ++j)
                {
                        control.Evaluate(x[j % 2],y[j % 2], invblen*j);
@@ -288,7 +285,8 @@ void BezierRenderer::PrepareBezierGPUBuffer(const Objects& objects)
                GPUBezierCoeffs coeffs = {
                        Float(bez->x0), Float(bez->y0),
                        Float(bez->x1), Float(bez->y1),
                GPUBezierCoeffs coeffs = {
                        Float(bez->x0), Float(bez->y0),
                        Float(bez->x1), Float(bez->y1),
-                       Float(bez->x2), Float(bez->y2)
+                       Float(bez->x2), Float(bez->y2),
+                       Float(bez->x3), Float(bez->y3)
                        };
                builder.Add(coeffs);
        }
                        };
                builder.Add(coeffs);
        }
@@ -425,7 +423,7 @@ void ObjectRenderer::RenderLineOnCPU(int64_t x0, int64_t y0, int64_t x1, int64_t
                        if (neg_m) --y; else ++y;
                        p += two_dxdy;
                }
                        if (neg_m) --y; else ++y;
                        p += two_dxdy;
                }
-       } while (++x < x_end);
+       } while (++x <= x_end);
 }
 
 }
 }
 
 }
index 602b461..697cf5b 100644 (file)
@@ -121,6 +121,7 @@ namespace IPDF
                                float x0, y0;
                                float x1, y1;
                                float x2, y2;
                                float x0, y0;
                                float x1, y1;
                                float x2, y2;
+                               float x3, y3;
                        };
 
                        GLuint m_bezier_buffer_texture;
                        };
 
                        GLuint m_bezier_buffer_texture;
index bb9a219..281627d 100644 (file)
@@ -19,9 +19,11 @@ void main()
 {
        int bezierid = texelFetch(bezier_id_buffer_texture, objectid[0]).r;
        vec2 boundssize = gl_in[1].gl_Position.xy - gl_in[0].gl_Position.xy;
 {
        int bezierid = texelFetch(bezier_id_buffer_texture, objectid[0]).r;
        vec2 boundssize = gl_in[1].gl_Position.xy - gl_in[0].gl_Position.xy;
-       vec2 coeff0 = texelFetch(bezier_buffer_texture, bezierid*3).rg;
-       vec2 coeff1 = texelFetch(bezier_buffer_texture, bezierid*3+1).rg;
-       vec2 coeff2 = texelFetch(bezier_buffer_texture, bezierid*3+2).rg;
+       vec2 coeff0 = texelFetch(bezier_buffer_texture, bezierid*4).rg;
+       vec2 coeff1 = texelFetch(bezier_buffer_texture, bezierid*4+1).rg;
+       vec2 coeff2 = texelFetch(bezier_buffer_texture, bezierid*4+2).rg;
+       vec2 coeff3 = texelFetch(bezier_buffer_texture, bezierid*4+3).rg;
+
        vec2 boundspxsize = pixsize[0];
        int blen = clamp(int(abs(boundspxsize.x)),2,100);
        float invblen = 1.0f/float(blen);
        vec2 boundspxsize = pixsize[0];
        int blen = clamp(int(abs(boundspxsize.x)),2,100);
        float invblen = 1.0f/float(blen);
@@ -29,10 +31,11 @@ void main()
        {
                float t = i * invblen;
                float oneminust = 1.0f - t;
        {
                float t = i * invblen;
                float oneminust = 1.0f - t;
-               float bernstein0 = t*t;
-               float bernstein1 = 2*t*oneminust;
-               float bernstein2 = oneminust*oneminust;
-               gl_Position = vec4((coeff0*bernstein0 + coeff1*bernstein1 + coeff2*bernstein2) * boundssize + gl_in[0].gl_Position.xy, 0.0, 1.0);
+               float bernstein0 = t*t*t;
+               float bernstein1 = 3*t*t*oneminust;
+               float bernstein2 = 3*t*oneminust*oneminust;
+               float bernstein3 = oneminust*oneminust*oneminust;
+               gl_Position = vec4((coeff0*bernstein0 + coeff1*bernstein1 + coeff2*bernstein2 + coeff3*bernstein3) * boundssize + gl_in[0].gl_Position.xy, 0.0, 1.0);
                EmitVertex();
                
        }
                EmitVertex();
                
        }
diff --git a/src/svg-tests/glyphs.svg b/src/svg-tests/glyphs.svg
new file mode 100644 (file)
index 0000000..e258dee
--- /dev/null
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.1"
+   width="252"
+   height="30"
+   id="svg2">
+  <defs
+     id="defs4" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+      <path
+         d="M 4.9764862,6.4616947 C 4.367108,6.4617027 3.9081241,6.7624836 3.5995331,7.3640385 3.2948434,7.9617012 3.1424999,8.8620909 3.1425018,10.06521 c -1.9e-6,1.199222 0.1523416,2.099612 0.4570313,2.701172 0.308591,0.597658 0.7675749,0.896485 1.3769531,0.896485 0.6132768,0 1.0722607,-0.298827 1.3769531,-0.896485 C 6.6620276,12.164822 6.8163243,11.264432 6.81633,10.06521 6.8163243,8.8620909 6.6620276,7.9617012 6.3534393,7.3640385 6.0487469,6.7624836 5.589763,6.4617027 4.9764862,6.4616947 m 0,-0.9375 c 0.980464,8.9e-6 1.7285101,0.3886804 2.2441406,1.1660156 0.5195247,0.7734445 0.7792901,1.8984434 0.7792969,3.3749997 -6.8e-6,1.472659 -0.2597722,2.597658 -0.7792969,3.375 -0.5156305,0.773438 -1.2636766,1.160156 -2.2441406,1.160157 -0.9804716,-1e-6 -1.7304708,-0.386719 -2.25,-1.160157 -0.515626,-0.777342 -0.7734383,-1.902341 -0.7734375,-3.375 -8e-7,-1.4765563 0.2578115,-2.6015552 0.7734375,-3.3749997 0.5195292,-0.7773352 1.2695284,-1.1660067 2.25,-1.1660156"
+         id="path2990" />
+      <path
+         d="m 10.290939,13.434351 1.933594,0 0,-6.6738282 -2.103516,0.421875 0,-1.078125 2.091797,-0.421875 1.183594,0 0,7.7519532 1.933594,0 0,0.996094 -5.039063,0 0,-0.996094"
+         id="path2992" />
+      <path
+         d="m 18.746017,13.434351 4.13086,0 0,0.996094 -5.554688,0 0,-0.996094 c 0.449218,-0.464842 1.060545,-1.087889 1.833985,-1.869141 0.77734,-0.785152 1.265621,-1.291011 1.464843,-1.517578 0.378902,-0.4257762 0.642574,-0.7851509 0.791016,-1.0781248 0.152339,-0.2968692 0.228511,-0.5878846 0.228516,-0.8730469 -5e-6,-0.4648369 -0.164068,-0.8437428 -0.492188,-1.1367187 -0.324223,-0.292961 -0.748051,-0.4394452 -1.271484,-0.4394531 -0.371097,7.9e-6 -0.763675,0.064461 -1.177735,0.1933593 -0.410158,0.1289139 -0.84961,0.3242262 -1.318359,0.5859375 l 0,-1.1953125 c 0.476561,-0.1913977 0.921873,-0.3359288 1.335938,-0.4335937 0.414059,-0.097647 0.792965,-0.1464755 1.136718,-0.1464844 0.906246,8.9e-6 1.628902,0.2265712 2.167969,0.6796875 0.539056,0.4531328 0.808587,1.0586009 0.808594,1.8164063 -7e-6,0.359381 -0.06837,0.7011776 -0.205078,1.0253906 -0.132819,0.3203176 -0.376959,0.6992234 -0.732422,1.1367189 -0.09766,0.113285 -0.408208,0.44141 -0.931641,0.984375 -0.523441,0.539065 -1.261722,1.294924 -2.214844,2.267578"
+         id="path2994" />
+      <path
+         d="m 28.953049,9.7136478 c 0.566401,0.1210984 1.007806,0.3730512 1.324218,0.7558592 0.320306,0.382816 0.480463,0.855472 0.480469,1.417969 -6e-6,0.863283 -0.296881,1.531251 -0.890625,2.003906 -0.593755,0.472657 -1.437504,0.708984 -2.53125,0.708985 -0.36719,-1e-6 -0.746096,-0.03711 -1.136719,-0.111329 -0.38672,-0.07031 -0.78711,-0.177734 -1.201171,-0.322265 l 0,-1.142578 c 0.328123,0.191407 0.687498,0.335938 1.078125,0.433593 0.390622,0.09766 0.798825,0.146486 1.224609,0.146485 0.742183,1e-6 1.306636,-0.146484 1.693359,-0.439453 0.39062,-0.292967 0.585932,-0.718748 0.585938,-1.277344 -6e-6,-0.515622 -0.181646,-0.917965 -0.544922,-1.207031 -0.35938,-0.292965 -0.861332,-0.439449 -1.505859,-0.439453 l -1.019532,0 0,-0.9726567 1.066407,0 c 0.582027,5.2e-6 1.027339,-0.1152291 1.335937,-0.3457031 0.308589,-0.2343692 0.462885,-0.5703064 0.462891,-1.0078125 -6e-6,-0.4492118 -0.160162,-0.7929614 -0.480469,-1.03125 C 28.578044,6.64139 28.122967,6.5202964 27.529221,6.5202885 c -0.324222,7.9e-6 -0.671878,0.035164 -1.042969,0.1054687 -0.371096,0.07032 -0.779299,0.1796951 -1.22461,0.328125 l 0,-1.0546875 c 0.449218,-0.1249913 0.869139,-0.2187412 1.259766,-0.28125 0.394528,-0.062491 0.765622,-0.093741 1.113281,-0.09375 0.898433,8.9e-6 1.60937,0.2050868 2.132813,0.6152344 0.523431,0.4062579 0.78515,0.9570386 0.785156,1.6523437 -6e-6,0.4843812 -0.138678,0.894537 -0.416016,1.2304688 -0.277349,0.3320363 -0.67188,0.5625048 -1.183593,0.6914062"
+         id="path2996" />
+      <path
+         d="m 36.259689,6.7136478 -2.988281,4.6699222 2.988281,0 0,-4.6699222 m -0.310547,-1.03125 1.488282,0 0,5.7011722 1.248047,0 0,0.984375 -1.248047,0 0,2.0625 -1.177735,0 0,-2.0625 -3.949218,0 0,-1.142578 3.638671,-5.5429692"
+         id="path2998" />
+      <path
+         d="m 40.66008,5.6823978 4.646484,0 0,0.9960938 -3.5625,0 0,2.1445312 c 0.171873,-0.058588 0.343748,-0.1015567 0.515625,-0.1289062 0.171872,-0.031244 0.343747,-0.046869 0.515625,-0.046875 0.976558,5.8e-6 1.749995,0.2675836 2.320313,0.8027344 0.570306,0.5351607 0.855462,1.259769 0.855469,2.173828 -7e-6,0.941408 -0.292975,1.673829 -0.878907,2.197266 -0.585942,0.519531 -1.412113,0.779296 -2.478515,0.779297 -0.367191,-1e-6 -0.74219,-0.03125 -1.125,-0.09375 -0.378908,-0.0625 -0.771486,-0.15625 -1.177735,-0.28125 l 0,-1.189454 c 0.351562,0.191408 0.714842,0.333986 1.089844,0.427735 0.374998,0.09375 0.771482,0.140626 1.189453,0.140625 0.675778,1e-6 1.210933,-0.177734 1.605469,-0.533203 0.394526,-0.355467 0.591791,-0.837889 0.591797,-1.447266 -6e-6,-0.609371 -0.197271,-1.091793 -0.591797,-1.447266 -0.394536,-0.3554637 -0.929691,-0.5331979 -1.605469,-0.5332027 -0.316409,4.8e-6 -0.632815,0.035161 -0.949219,0.1054688 -0.312501,0.070317 -0.632814,0.179692 -0.960937,0.3281249 l 0,-4.3945312"
+         id="path3000" />
+      <path
+         d="m 50.966721,9.5847416 c -0.531254,4.8e-6 -0.953128,0.1816453 -1.265625,0.5449214 -0.308597,0.363286 -0.462893,0.861332 -0.462891,1.494141 -2e-6,0.628909 0.154294,1.126955 0.462891,1.494141 0.312497,0.363282 0.734371,0.544922 1.265625,0.544922 0.531245,0 0.951167,-0.18164 1.259765,-0.544922 0.312495,-0.367186 0.468745,-0.865232 0.46875,-1.494141 -5e-6,-0.632809 -0.156255,-1.130855 -0.46875,-1.494141 -0.308598,-0.3632761 -0.72852,-0.5449166 -1.259765,-0.5449214 m 2.349609,-3.7089844 0,1.078125 C 53.019449,6.8132648 52.718668,6.7058431 52.413986,6.6316166 52.1132,6.5574057 51.814372,6.5202964 51.517502,6.5202885 50.736248,6.5202964 50.138592,6.783968 49.724533,7.3113041 49.314375,7.8386544 49.08,8.6355286 49.021408,9.7019291 49.251875,9.3620904 49.540937,9.102325 49.888596,8.9226322 c 0.347653,-0.183588 0.730465,-0.2753848 1.148437,-0.2753906 0.878901,5.8e-6 1.57226,0.2675836 2.080078,0.8027344 0.511712,0.5312544 0.767571,1.255863 0.767578,2.173828 -7e-6,0.89844 -0.265631,1.619142 -0.796875,2.162109 -0.531255,0.542969 -1.238286,0.814453 -2.121093,0.814454 -1.011722,-1e-6 -1.785159,-0.386719 -2.320313,-1.160157 -0.535157,-0.777342 -0.802735,-1.902341 -0.802734,-3.375 -10e-7,-1.3828064 0.328124,-2.4843678 0.984375,-3.3046872 0.656247,-0.8242102 1.537106,-1.2363192 2.642578,-1.2363281 0.29687,8.9e-6 0.595698,0.029306 0.896484,0.087891 0.304682,0.058603 0.621088,0.1464931 0.949219,0.2636719"
+         id="path3002" />
+      <path
+         d="m 55.630783,5.6823978 5.625,0 0,0.5039063 -3.175781,8.2441409 -1.236328,0 2.988281,-7.7519534 -4.201172,0 0,-0.9960938"
+         id="path3004" />
+      <path
+         d="m 66.101486,10.276148 c -0.562503,4e-6 -1.005862,0.150394 -1.330078,0.451172 -0.320315,0.300784 -0.480471,0.714846 -0.480469,1.242187 -2e-6,0.527346 0.160154,0.941408 0.480469,1.242188 0.324216,0.300782 0.767575,0.451172 1.330078,0.451172 0.562496,0 1.005855,-0.15039 1.330078,-0.451172 0.324214,-0.304686 0.486323,-0.718748 0.486328,-1.242188 -5e-6,-0.527341 -0.162114,-0.941403 -0.486328,-1.242187 -0.320317,-0.300778 -0.763676,-0.451168 -1.330078,-0.451172 M 64.917892,9.7722416 C 64.410078,9.6472464 64.013594,9.4109185 63.728439,9.0632572 63.447188,8.7156067 63.306563,8.291779 63.306564,7.7917728 c -1e-6,-0.6992114 0.248046,-1.2519452 0.744141,-1.6582031 0.499998,-0.4062413 1.183591,-0.6093661 2.050781,-0.609375 0.871089,8.9e-6 1.554682,0.2031337 2.050781,0.609375 0.496088,0.4062579 0.744134,0.9589917 0.744141,1.6582031 -7e-6,0.5000062 -0.142585,0.9238339 -0.427734,1.2714844 -0.281256,0.3476613 -0.673834,0.5839892 -1.177735,0.7089844 0.570307,0.132817 1.013666,0.3925824 1.330078,0.7792964 0.320306,0.386723 0.480462,0.859378 0.480469,1.417969 -7e-6,0.847658 -0.259772,1.498048 -0.779297,1.951172 -0.51563,0.453125 -1.255864,0.679687 -2.220703,0.679688 -0.964846,-1e-6 -1.707033,-0.226563 -2.226562,-0.679688 -0.515626,-0.453124 -0.773439,-1.103514 -0.773438,-1.951172 -1e-6,-0.558591 0.160155,-1.031246 0.480469,-1.417969 0.320311,-0.386714 0.765623,-0.6464794 1.335937,-0.7792964 M 64.484299,7.903101 c -2e-6,0.453131 0.140622,0.8066463 0.421875,1.0605468 0.285153,0.2539115 0.68359,0.3808645 1.195312,0.3808594 0.507808,5.1e-6 0.904292,-0.1269479 1.189453,-0.3808594 0.289058,-0.2539005 0.433589,-0.6074158 0.433594,-1.0605468 -5e-6,-0.4531181 -0.144536,-0.8066333 -0.433594,-1.0605469 -0.285161,-0.2538984 -0.681645,-0.3808514 -1.189453,-0.3808594 -0.511722,8e-6 -0.910159,0.126961 -1.195312,0.3808594 -0.281253,0.2539136 -0.421877,0.6074288 -0.421875,1.0605469"
+         id="path3006" />
+      <path
+         d="m 71.246017,14.248804 0,-1.078125 c 0.296874,0.140626 0.597655,0.248048 0.902344,0.322266 0.304685,0.07422 0.603513,0.111329 0.896485,0.111328 0.781246,1e-6 1.376948,-0.261718 1.787109,-0.785156 0.414057,-0.527342 0.650385,-1.326169 0.708984,-2.396485 -0.226568,0.335941 -0.513677,0.593754 -0.861328,0.773438 -0.34766,0.17969 -0.732426,0.269534 -1.154297,0.269531 -0.875002,3e-6 -1.568361,-0.263669 -2.080078,-0.791016 -0.507813,-0.531245 -0.761719,-1.255854 -0.761719,-2.1738278 0,-0.8984307 0.265624,-1.6191331 0.796875,-2.1621094 0.531248,-0.5429601 1.238279,-0.8144442 2.121094,-0.8144531 1.011714,8.9e-6 1.783198,0.3886804 2.314453,1.1660156 0.53515,0.7734445 0.802728,1.8984434 0.802735,3.3749997 -7e-6,1.37891 -0.328132,2.480471 -0.984375,3.304688 -0.652349,0.820313 -1.531255,1.230468 -2.636719,1.230469 -0.296878,-1e-6 -0.597659,-0.0293 -0.902344,-0.08789 -0.304689,-0.05859 -0.621095,-0.146484 -0.949219,-0.263672 m 2.355469,-3.708984 c 0.531246,4e-6 0.951167,-0.181637 1.259766,-0.5449222 0.312495,-0.3632764 0.468744,-0.8613228 0.46875,-1.4941406 -6e-6,-0.6288997 -0.156255,-1.1249929 -0.46875,-1.4882812 -0.308599,-0.3671797 -0.72852,-0.5507733 -1.259766,-0.5507813 -0.531253,8e-6 -0.953128,0.1836016 -1.265625,0.5507813 -0.308596,0.3632883 -0.462892,0.8593815 -0.46289,1.4882812 -2e-6,0.6328178 0.154294,1.1308642 0.46289,1.4941406 0.312497,0.3632852 0.734372,0.5449262 1.265625,0.5449222"
+         id="path3008" />
+      <path
+         d="m 81.681564,11.131617 c -0.871097,3e-6 -1.474612,0.09961 -1.810547,0.298828 -0.335939,0.199221 -0.503908,0.539065 -0.503906,1.019531 -2e-6,0.382814 0.124998,0.687501 0.375,0.914062 0.253904,0.222658 0.597654,0.333986 1.03125,0.333985 0.597653,1e-6 1.076168,-0.210937 1.435547,-0.632813 0.363276,-0.425779 0.544917,-0.990232 0.544922,-1.693359 l 0,-0.240234 -1.072266,0 m 2.150391,-0.445313 0,3.744141 -1.078125,0 0,-0.996094 c -0.246099,0.398438 -0.552739,0.69336 -0.919922,0.884766 -0.367191,0.1875 -0.81641,0.281249 -1.347656,0.28125 -0.671877,-1e-6 -1.207033,-0.1875 -1.605469,-0.5625 -0.394532,-0.378906 -0.591798,-0.884765 -0.591797,-1.517579 -10e-7,-0.738278 0.246093,-1.294918 0.738281,-1.669921 0.496092,-0.374996 1.234373,-0.562496 2.214844,-0.5625 l 1.511719,0 0,-0.105469 c -5e-6,-0.4960892 -0.164068,-0.8789013 -0.492188,-1.1484377 -0.324223,-0.2734318 -0.781253,-0.4101504 -1.371093,-0.4101562 -0.375003,5.8e-6 -0.740237,0.044928 -1.095703,0.1347656 -0.355471,0.089849 -0.697268,0.2246148 -1.025391,0.4042969 l 0,-0.9960938 c 0.39453,-0.1523373 0.777342,-0.2656184 1.148437,-0.3398437 0.371091,-0.078118 0.732419,-0.1171808 1.083985,-0.1171875 0.949214,6.7e-6 1.658198,0.2461002 2.126953,0.7382812 0.468744,0.492193 0.703119,1.238286 0.703125,2.2382812"
+         id="path3010" />
+      <path
+         d="m 90.769455,11.155054 c -6e-6,-0.792965 -0.164068,-1.4140577 -0.492188,-1.8632812 -0.324223,-0.4531194 -0.771488,-0.6796816 -1.341796,-0.6796875 -0.570316,5.9e-6 -1.019535,0.2265681 -1.347657,0.6796875 -0.324221,0.4492235 -0.48633,1.0703162 -0.486328,1.8632812 -2e-6,0.792971 0.162107,1.416018 0.486328,1.869141 0.328122,0.449219 0.777341,0.673829 1.347657,0.673828 0.570308,1e-6 1.017573,-0.224609 1.341796,-0.673828 0.32812,-0.453123 0.492182,-1.07617 0.492188,-1.869141 M 87.101486,8.8640385 c 0.22656,-0.3906191 0.511716,-0.6796813 0.855469,-0.8671875 0.347653,-0.1913997 0.761715,-0.2871027 1.242187,-0.2871094 0.79687,6.7e-6 1.443354,0.3164126 1.939454,0.9492187 0.499993,0.6328177 0.749993,1.4648477 0.75,2.4960937 -7e-6,1.031252 -0.250007,1.863283 -0.75,2.496094 -0.4961,0.632812 -1.142584,0.949218 -1.939454,0.949219 -0.480472,-1e-6 -0.894534,-0.09375 -1.242187,-0.28125 -0.343753,-0.191406 -0.628909,-0.482422 -0.855469,-0.873047 l 0,0.984375 -1.083984,0 0,-9.1171878 1.083984,0 0,3.5507813"
+         id="path3012" />
+      <path
+         d="m 98.398361,8.1198978 0,1.0078125 c -0.304693,-0.1679632 -0.611333,-0.2929631 -0.919922,-0.375 -0.304692,-0.085932 -0.613285,-0.1289004 -0.925781,-0.1289062 -0.699222,5.8e-6 -1.24219,0.2226618 -1.628906,0.6679687 -0.386721,0.441411 -0.58008,1.0625042 -0.580078,1.8632812 -2e-6,0.800784 0.193357,1.42383 0.580078,1.869141 0.386716,0.441407 0.929684,0.66211 1.628906,0.662109 0.312496,1e-6 0.621089,-0.04101 0.925781,-0.123047 0.308589,-0.08594 0.615229,-0.212889 0.919922,-0.380859 l 0,0.996094 c -0.300787,0.140625 -0.613286,0.246093 -0.9375,0.316406 -0.320317,0.07031 -0.662113,0.105468 -1.02539,0.105469 -0.988285,-1e-6 -1.77344,-0.310547 -2.355469,-0.931641 -0.582032,-0.621092 -0.873048,-1.458982 -0.873047,-2.513672 -10e-7,-1.070308 0.292968,-1.9121041 0.878906,-2.5253905 0.589842,-0.6132749 1.396482,-0.9199152 2.419922,-0.9199219 0.332027,6.7e-6 0.656245,0.035163 0.972656,0.1054687 0.316401,0.066413 0.623042,0.1679752 0.919922,0.3046875"
+         id="path3014" />
+      <path
+         d="m 104.60344,8.8640385 0,-3.5507813 1.07812,0 0,9.1171878 -1.07812,0 0,-0.984375 c -0.22657,0.390625 -0.51368,0.681641 -0.86133,0.873047 -0.34375,0.1875 -0.75782,0.281249 -1.24219,0.28125 -0.79297,-1e-6 -1.43945,-0.316407 -1.93945,-0.949219 -0.49609,-0.632811 -0.744141,-1.464842 -0.74414,-2.496094 -10e-7,-1.031246 0.24805,-1.863276 0.74414,-2.4960937 0.5,-0.6328061 1.14648,-0.949212 1.93945,-0.9492187 0.48437,6.7e-6 0.89844,0.09571 1.24219,0.2871094 0.34765,0.1875062 0.63476,0.4765684 0.86133,0.8671875 m -3.67383,2.2910155 c 0,0.792971 0.16211,1.416018 0.48633,1.869141 0.32812,0.449219 0.77734,0.673829 1.34766,0.673828 0.5703,1e-6 1.01952,-0.224609 1.34765,-0.673828 0.32812,-0.453123 0.49218,-1.07617 0.49219,-1.869141 -1e-5,-0.792965 -0.16407,-1.4140577 -0.49219,-1.8632812 -0.32813,-0.4531194 -0.77735,-0.6796816 -1.34765,-0.6796875 -0.57032,5.9e-6 -1.01954,0.2265681 -1.34766,0.6796875 -0.32422,0.4492235 -0.48633,1.0703162 -0.48633,1.8632812"
+         id="path3016" />
+      <path
+         d="m 113.51555,10.879663 0,0.527344 -4.95703,0 c 0.0469,0.74219 0.26953,1.308596 0.66797,1.699219 0.40234,0.38672 0.96093,0.580079 1.67578,0.580078 0.41406,1e-6 0.81445,-0.05078 1.20117,-0.152344 0.39062,-0.101561 0.77734,-0.253905 1.16016,-0.457031 l 0,1.019531 c -0.38673,0.164063 -0.78321,0.289063 -1.18946,0.375 -0.40625,0.08594 -0.81836,0.128906 -1.23633,0.128907 -1.04687,-1e-6 -1.87695,-0.304688 -2.49023,-0.914063 -0.60938,-0.609374 -0.91406,-1.433591 -0.91406,-2.472656 0,-1.074215 0.28906,-1.9257763 0.86718,-2.5546877 0.58203,-0.6328061 1.36524,-0.949212 2.34961,-0.9492187 0.88281,6.7e-6 1.58008,0.2851627 2.0918,0.8554687 0.51562,0.5664116 0.77343,1.3378952 0.77344,2.3144527 m -1.07813,-0.316406 c -0.008,-0.5898391 -0.17383,-1.0605417 -0.49804,-1.4121092 -0.32032,-0.3515568 -0.7461,-0.5273379 -1.27735,-0.5273437 -0.60156,5.8e-6 -1.08398,0.1699275 -1.44726,0.5097656 -0.35938,0.3398487 -0.56641,0.8183639 -0.6211,1.4355473 l 3.84375,-0.0059"
+         id="path3018" />
+      <path
+         d="m 118.60735,5.3132572 0,0.8964844 -1.03125,0 c -0.38673,8.2e-6 -0.65626,0.078133 -0.8086,0.234375 -0.14844,0.1562578 -0.22266,0.4375075 -0.22265,0.84375 l 0,0.5800781 1.77539,0 0,0.8378906 -1.77539,0 0,5.7246097 -1.08399,0 0,-5.7246097 -1.03125,0 0,-0.8378906 1.03125,0 0,-0.4570312 c 0,-0.730461 0.16992,-1.2617105 0.50977,-1.59375 0.33984,-0.3359286 0.8789,-0.5038972 1.61718,-0.5039063 l 1.01954,0"
+         id="path3020" />
+      <path
+         d="m 123.82219,11.073023 c -1e-5,-0.781246 -0.16212,-1.3867142 -0.48633,-1.8164064 -0.32032,-0.4296819 -0.77149,-0.6445254 -1.35351,-0.6445313 -0.57813,5.9e-6 -1.0293,0.2148494 -1.35352,0.6445313 -0.32031,0.4296922 -0.48047,1.0351604 -0.48047,1.8164064 0,0.777346 0.16016,1.380861 0.48047,1.810547 0.32422,0.429688 0.77539,0.644532 1.35352,0.644531 0.58202,1e-6 1.03319,-0.214843 1.35351,-0.644531 0.32421,-0.429686 0.48632,-1.033201 0.48633,-1.810547 m 1.07812,2.542969 c 0,1.117187 -0.24805,1.947264 -0.74414,2.490234 -0.4961,0.546873 -1.25586,0.82031 -2.27929,0.820312 -0.37891,-2e-6 -0.73633,-0.0293 -1.07227,-0.08789 -0.33594,-0.05469 -0.66211,-0.140627 -0.97851,-0.257813 l 0,-1.048828 c 0.3164,0.171874 0.6289,0.298827 0.9375,0.38086 0.30859,0.08203 0.62304,0.123045 0.94335,0.123046 0.70703,-1e-6 1.23633,-0.185548 1.5879,-0.55664 0.35155,-0.367188 0.52733,-0.923828 0.52734,-1.669922 l 0,-0.533203 c -0.22266,0.386719 -0.50782,0.675782 -0.85547,0.867187 -0.34766,0.191407 -0.76368,0.28711 -1.24805,0.28711 -0.80469,0 -1.45312,-0.306641 -1.94531,-0.919922 -0.49219,-0.61328 -0.73828,-1.425779 -0.73828,-2.4375 0,-1.015621 0.24609,-1.8300731 0.73828,-2.4433595 0.49219,-0.6132749 1.14062,-0.9199152 1.94531,-0.9199219 0.48437,6.7e-6 0.90039,0.09571 1.24805,0.2871094 0.34765,0.1914125 0.63281,0.4804747 0.85547,0.8671875 l 0,-0.9960938 1.07812,0 0,5.7480473"
+         id="path3022" />
+      <path
+         d="m 132.5761,10.469507 0,3.960938 -1.07813,0 0,-3.925782 c 0,-0.6210887 -0.1211,-1.085932 -0.36328,-1.3945308 -0.24219,-0.3085881 -0.60547,-0.4628848 -1.08984,-0.4628906 -0.58204,5.8e-6 -1.04102,0.1855525 -1.37696,0.5566406 -0.33594,0.3710986 -0.50391,0.8769578 -0.5039,1.5175778 l 0,3.708985 -1.08399,0 0,-9.1171878 1.08399,0 0,3.5742188 c 0.25781,-0.3945253 0.56054,-0.6894469 0.9082,-0.8847657 0.35156,-0.1953058 0.75585,-0.292962 1.21289,-0.2929687 0.7539,6.7e-6 1.32421,0.2343815 1.71094,0.703125 0.38671,0.4648493 0.58007,1.1503955 0.58008,2.0566404"
+         id="path3024" />
+      <path
+         d="m 134.7382,7.8679447 1.07813,0 0,6.5625003 -1.07813,0 0,-6.5625003 m 0,-2.5546875 1.07813,0 0,1.3652344 -1.07813,0 0,-1.3652344"
+         id="path3026" />
+      <path
+         d="m 138.06633,7.8679447 1.07812,0 0,6.6796873 c 0,0.835937 -0.16015,1.441405 -0.48046,1.816406 -0.31641,0.374998 -0.82813,0.562498 -1.53516,0.5625 l -0.41016,0 0,-0.914062 0.28711,0 c 0.41016,-2e-6 0.68946,-0.0957 0.83789,-0.287109 0.14844,-0.187502 0.22266,-0.580079 0.22266,-1.177735 l 0,-6.6796873 m 0,-2.5546875 1.07812,0 0,1.3652344 -1.07812,0 0,-1.3652344"
+         id="path3028" />
+      <path
+         d="m 141.35344,5.3132572 1.08398,0 0,5.3847658 3.2168,-2.8300783 1.37695,0 -3.48047,3.0703123 3.62696,3.492188 -1.40625,0 -3.33399,-3.205078 0,3.205078 -1.08398,0 0,-9.1171878"
+         id="path3030" />
+      <path
+         d="m 148.35539,5.3132572 1.07813,0 0,9.1171878 -1.07813,0 0,-9.1171878"
+         id="path3032" />
+      <path
+         d="m 156.79289,9.1277103 c 0.26953,-0.4843692 0.59179,-0.8417907 0.9668,-1.0722656 0.37499,-0.2304621 0.8164,-0.3456964 1.32422,-0.3457031 0.68358,6.7e-6 1.21093,0.2402408 1.58203,0.7207031 0.37108,0.476568 0.55663,1.1562549 0.55664,2.0390623 l 0,3.960938 -1.08398,0 0,-3.925782 c -1e-5,-0.6289012 -0.11134,-1.0956976 -0.33399,-1.4003902 -0.22266,-0.3046818 -0.56251,-0.4570254 -1.01953,-0.4570312 -0.5586,5.8e-6 -1.00001,0.1855525 -1.32422,0.5566406 -0.32422,0.3710986 -0.48633,0.8769578 -0.48633,1.5175778 l 0,3.708985 -1.08398,0 0,-3.925782 c -1e-5,-0.6328075 -0.11133,-1.0996039 -0.33399,-1.4003902 -0.22266,-0.3046818 -0.56641,-0.4570254 -1.03125,-0.4570312 -0.55078,5.8e-6 -0.98828,0.1875056 -1.3125,0.5625 -0.32422,0.3710986 -0.48633,0.8750044 -0.48632,1.5117184 l 0,3.708985 -1.08399,0 0,-6.5625003 1.08399,0 0,1.0195313 c 0.24609,-0.4023378 0.54101,-0.6992125 0.88476,-0.890625 0.34375,-0.1913997 0.75195,-0.2871027 1.22461,-0.2871094 0.47656,6.7e-6 0.88086,0.1211003 1.21289,0.3632812 0.33593,0.2421937 0.58398,0.5937558 0.74414,1.0546875"
+         id="path3034" />
+      <path
+         d="m 168.83391,10.469507 0,3.960938 -1.07813,0 0,-3.925782 c 0,-0.6210887 -0.1211,-1.085932 -0.36328,-1.3945308 -0.24219,-0.3085881 -0.60547,-0.4628848 -1.08984,-0.4628906 -0.58204,5.8e-6 -1.04102,0.1855525 -1.37696,0.5566406 -0.33593,0.3710986 -0.5039,0.8769578 -0.5039,1.5175778 l 0,3.708985 -1.08399,0 0,-6.5625003 1.08399,0 0,1.0195313 c 0.25781,-0.3945253 0.56054,-0.6894469 0.9082,-0.8847657 0.35156,-0.1953058 0.75586,-0.292962 1.21289,-0.2929687 0.7539,6.7e-6 1.32422,0.2343815 1.71094,0.703125 0.38671,0.4648493 0.58007,1.1503955 0.58008,2.0566404"
+         id="path3036" />
+      <path
+         d="m 173.53899,8.6238041 c -0.57813,5.8e-6 -1.03516,0.2265681 -1.3711,0.6796875 -0.33594,0.4492234 -0.50391,1.0664104 -0.5039,1.8515624 -1e-5,0.785159 0.16601,1.404299 0.49804,1.857422 0.33594,0.44922 0.79492,0.673829 1.37696,0.673828 0.57421,1e-6 1.02929,-0.226561 1.36523,-0.679687 0.33593,-0.453124 0.5039,-1.07031 0.50391,-1.851563 -1e-5,-0.77734 -0.16798,-1.3925734 -0.50391,-1.845703 -0.33594,-0.4570257 -0.79102,-0.6855411 -1.36523,-0.6855469 m 0,-0.9140625 c 0.93749,6.7e-6 1.67382,0.3046939 2.20898,0.9140625 0.53515,0.6093802 0.80273,1.4531289 0.80273,2.5312499 0,1.074221 -0.26758,1.91797 -0.80273,2.53125 -0.53516,0.609375 -1.27149,0.914062 -2.20898,0.914063 -0.94141,-1e-6 -1.67969,-0.304688 -2.21485,-0.914063 -0.53125,-0.61328 -0.79687,-1.457029 -0.79687,-2.53125 0,-1.078121 0.26562,-1.9218697 0.79687,-2.5312499 0.53516,-0.6093686 1.27344,-0.9140558 2.21485,-0.9140625"
+         id="path3038" />
+      <path
+         d="m 179.37492,13.44607 0,3.480468 -1.08398,0 0,-9.0585933 1.08398,0 0,0.9960938 c 0.22656,-0.3906191 0.51172,-0.6796813 0.85547,-0.8671875 0.34766,-0.1913997 0.76172,-0.2871027 1.24219,-0.2871094 0.79687,6.7e-6 1.44335,0.3164126 1.93945,0.9492187 0.5,0.6328177 0.75,1.4648477 0.75,2.4960937 0,1.031252 -0.25,1.863283 -0.75,2.496094 -0.4961,0.632812 -1.14258,0.949218 -1.93945,0.949219 -0.48047,-1e-6 -0.89453,-0.09375 -1.24219,-0.28125 -0.34375,-0.191406 -0.62891,-0.482422 -0.85547,-0.873047 m 3.66797,-2.291016 c 0,-0.792965 -0.16407,-1.4140577 -0.49219,-1.8632812 -0.32422,-0.4531194 -0.77148,-0.6796816 -1.34179,-0.6796875 -0.57032,5.9e-6 -1.01954,0.2265681 -1.34766,0.6796875 -0.32422,0.4492235 -0.48633,1.0703162 -0.48633,1.8632812 0,0.792971 0.16211,1.416018 0.48633,1.869141 0.32812,0.449219 0.77734,0.673829 1.34766,0.673828 0.57031,1e-6 1.01757,-0.224609 1.34179,-0.673828 0.32812,-0.453123 0.49219,-1.07617 0.49219,-1.869141"
+         id="path3040" />
+      <path
+         d="m 186.59367,11.155054 c 0,0.792971 0.16211,1.416018 0.48633,1.869141 0.32812,0.449219 0.77734,0.673829 1.34766,0.673828 0.57031,1e-6 1.01952,-0.224609 1.34765,-0.673828 0.32812,-0.453123 0.49219,-1.07617 0.49219,-1.869141 0,-0.792965 -0.16407,-1.4140577 -0.49219,-1.8632812 -0.32813,-0.4531194 -0.77734,-0.6796816 -1.34765,-0.6796875 -0.57032,5.9e-6 -1.01954,0.2265681 -1.34766,0.6796875 -0.32422,0.4492235 -0.48633,1.0703162 -0.48633,1.8632812 m 3.67383,2.291016 c -0.22657,0.390625 -0.51367,0.681641 -0.86133,0.873047 -0.34375,0.1875 -0.75781,0.281249 -1.24218,0.28125 -0.79298,-1e-6 -1.43946,-0.316407 -1.93946,-0.949219 -0.49609,-0.632811 -0.74414,-1.464842 -0.74414,-2.496094 0,-1.031246 0.24805,-1.863276 0.74414,-2.4960937 0.5,-0.6328061 1.14648,-0.949212 1.93946,-0.9492187 0.48437,6.7e-6 0.89843,0.09571 1.24218,0.2871094 0.34766,0.1875062 0.63476,0.4765684 0.86133,0.8671875 l 0,-0.9960938 1.07813,0 0,9.0585933 -1.07813,0 0,-3.480468"
+         id="path3042" />
+      <path
+         d="m 197.36906,8.8757572 c -0.12109,-0.070307 -0.25391,-0.1210881 -0.39843,-0.1523437 -0.14063,-0.035151 -0.29688,-0.052729 -0.46875,-0.052734 -0.60938,5.8e-6 -1.07813,0.1992243 -1.40625,0.5976562 -0.32422,0.3945361 -0.48633,0.9628943 -0.48633,1.7050773 l 0,3.457032 -1.08399,0 0,-6.5624999 1.08399,0 0,1.0195313 c 0.22656,-0.3984316 0.52148,-0.6933532 0.88476,-0.8847657 0.36328,-0.1953058 0.80469,-0.292962 1.32422,-0.2929687 0.0742,6.7e-6 0.15625,0.00587 0.2461,0.017578 0.0898,0.00782 0.18945,0.021491 0.29882,0.041016 l 0.006,1.1074219"
+         id="path3044" />
+      <path
+         d="m 202.69524,8.0613041 0,1.0195312 c -0.3047,-0.1562445 -0.6211,-0.2734318 -0.94922,-0.3515625 -0.32813,-0.078119 -0.66797,-0.1171816 -1.01953,-0.1171875 -0.53516,5.9e-6 -0.93751,0.082037 -1.20704,0.2460938 -0.26562,0.1640679 -0.39843,0.4101614 -0.39843,0.7382812 0,0.2500046 0.0957,0.4472697 0.28711,0.5917967 0.1914,0.140629 0.57617,0.275395 1.15429,0.404297 l 0.36914,0.08203 c 0.76563,0.164066 1.30859,0.396488 1.62891,0.697266 0.32421,0.296878 0.48632,0.712893 0.48633,1.248047 -1e-5,0.609376 -0.24219,1.091797 -0.72656,1.447265 -0.48048,0.355469 -1.14259,0.533203 -1.98633,0.533204 -0.35157,-10e-7 -0.71875,-0.03516 -1.10156,-0.105469 -0.37891,-0.06641 -0.7793,-0.167969 -1.20118,-0.304688 l 0,-1.113281 c 0.39844,0.207032 0.79102,0.363282 1.17774,0.46875 0.38671,0.101563 0.76953,0.152345 1.14844,0.152344 0.5078,10e-7 0.89843,-0.08594 1.17187,-0.257813 0.27343,-0.17578 0.41015,-0.421873 0.41016,-0.738281 -1e-5,-0.292967 -0.0996,-0.517576 -0.29883,-0.673828 -0.19532,-0.156247 -0.62696,-0.306638 -1.29492,-0.451172 l -0.375,-0.08789 c -0.66797,-0.140621 -1.1504,-0.355465 -1.44727,-0.644531 -0.29687,-0.292965 -0.44531,-0.693355 -0.44531,-1.2011717 0,-0.6171821 0.21875,-1.0937441 0.65625,-1.4296875 0.4375,-0.3359309 1.05859,-0.5038995 1.86328,-0.5039062 0.39843,6.7e-6 0.77343,0.029304 1.125,0.087891 0.35156,0.0586 0.67578,0.1464909 0.97266,0.2636719"
+         id="path3046" />
+      <path
+         d="m 205.83586,6.0046635 0,1.8632812 2.2207,0 0,0.8378906 -2.2207,0 0,3.5624997 c 0,0.535158 0.0723,0.878908 0.2168,1.03125 0.14843,0.152345 0.44726,0.228517 0.89648,0.228516 l 1.10742,0 0,0.902344 -1.10742,0 c -0.83203,0 -1.40625,-0.154297 -1.72265,-0.462891 -0.31641,-0.312499 -0.47461,-0.878905 -0.47461,-1.699219 l 0,-3.5624997 -0.79102,0 0,-0.8378906 0.79102,0 0,-1.8632812 1.08398,0"
+         id="path3048" />
+      <path
+         d="m 209.36906,11.840601 0,-3.9726563 1.07813,0 0,3.9316403 c 0,0.621096 0.12109,1.087893 0.36328,1.400391 0.24219,0.308595 0.60547,0.462891 1.08984,0.462891 0.58203,0 1.04102,-0.185546 1.37696,-0.556641 0.33984,-0.371092 0.50976,-0.876951 0.50976,-1.517578 l 0,-3.7207033 1.07813,0 0,6.5625003 -1.07813,0 0,-1.007813 c -0.26172,0.398438 -0.56641,0.695313 -0.91406,0.890625 -0.34375,0.191406 -0.74414,0.287109 -1.20117,0.28711 -0.75391,-1e-6 -1.32618,-0.234375 -1.7168,-0.703125 -0.39062,-0.468749 -0.58594,-1.154296 -0.58594,-2.056641 m 2.71289,-4.1308594 0,0"
+         id="path3050" />
+      <path
+         d="m 216.32414,7.8679447 1.14258,0 2.05078,5.5078123 2.05078,-5.5078123 1.14258,0 -2.46094,6.5625003 -1.46484,0 -2.46094,-6.5625003"
+         id="path3052" />
+      <path
+         d="m 223.57219,7.8679447 1.07812,0 1.34766,5.1210933 1.3418,-5.1210933 1.27148,0 1.34766,5.1210933 1.34179,-5.1210933 1.07813,0 -1.7168,6.5625003 -1.27148,0 -1.41211,-5.3789065 -1.41797,5.3789065 -1.27148,0 -1.7168,-6.5625003"
+         id="path3054" />
+      <path
+         d="m 239.47453,7.8679447 -2.37304,3.1933593 2.49609,3.369141 -1.27148,0 -1.91016,-2.578125 -1.91016,2.578125 -1.27148,0 2.54883,-3.433594 -2.33203,-3.1289063 1.27148,0 1.74023,2.3378903 1.74024,-2.3378903 1.27148,0"
+         id="path3056" />
+      <path
+         d="m 243.85149,15.03982 c -0.30469,0.781248 -0.60157,1.291013 -0.89063,1.529297 -0.28906,0.238278 -0.67578,0.357419 -1.16016,0.357421 l -0.86132,0 0,-0.902343 0.63281,0 c 0.29687,-2e-6 0.52734,-0.07031 0.69141,-0.210938 0.16406,-0.140626 0.3457,-0.472657 0.54492,-0.996094 l 0.19336,-0.492187 -2.6543,-6.4570313 1.14258,0 2.05078,5.1328123 2.05078,-5.1328123 1.14258,0 -2.88281,7.1718753"
+         id="path3058" />
+      <path
+         d="m 247.75383,7.8679447 5.12109,0 0,0.984375 -4.05468,4.7167973 4.05468,0 0,0.861328 -5.26757,0 0,-0.984375 4.05468,-4.7167972 -3.9082,0 0,-0.8613281"
+         id="path3060" />
+</svg>
diff --git a/src/svg-tests/koch1.svg b/src/svg-tests/koch1.svg
new file mode 120000 (symlink)
index 0000000..2305547
--- /dev/null
@@ -0,0 +1 @@
+/home/sam/ipdf/sam/figures/koch1.svg
\ No newline at end of file
diff --git a/src/svg-tests/rabbit_simple.svg b/src/svg-tests/rabbit_simple.svg
new file mode 120000 (symlink)
index 0000000..30fed1a
--- /dev/null
@@ -0,0 +1 @@
+/home/sam/ipdf/sam/figures/rabbit_simple.svg
\ No newline at end of file
diff --git a/src/svg-tests/shape.svg b/src/svg-tests/shape.svg
new file mode 120000 (symlink)
index 0000000..62d71a8
--- /dev/null
@@ -0,0 +1 @@
+/home/sam/ipdf/sam/figures/shape.svg
\ No newline at end of file
index 496b3b0..4bbe5f0 100644 (file)
@@ -330,7 +330,7 @@ void View::PrepareRender()
                m_object_renderers.at(type)->AddObjectToBuffers(id); // Use at() in case the document is corrupt TODO: Better error handling?
                // (Also, Wow I just actually used std::vector::at())
                // (Also, I just managed to make it throw an exception because I'm a moron)
                m_object_renderers.at(type)->AddObjectToBuffers(id); // Use at() in case the document is corrupt TODO: Better error handling?
                // (Also, Wow I just actually used std::vector::at())
                // (Also, I just managed to make it throw an exception because I'm a moron)
-               Debug("Object of type %d", type);
+               //Debug("Object of type %d", type);
        }
 
        // Finish the buffers
        }
 
        // Finish the buffers

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