Mostly features added to DebugScript
authorSam Moore <matches@ucc.asn.au>
Wed, 8 Oct 2014 14:50:58 +0000 (22:50 +0800)
committerSam Moore <matches@ucc.asn.au>
Wed, 8 Oct 2014 14:50:58 +0000 (22:50 +0800)
Also got MPFR C++ reals to work

Should allow for a quantitative comparison between Rationals and Arbitrary Precision Floats

Just... overwhelming amounts of results that it would be nice to get, so I don't know where to start...

21 files changed:
src/debugscript.cpp
src/debugscript.h
src/document.cpp
src/document.h
src/eye_of_the_rabbit.script
src/foxzoom.script [new file with mode: 0644]
src/grid.script [new file with mode: 0644]
src/gridtest.script [new file with mode: 0644]
src/main.cpp
src/main.h
src/objectrenderer.cpp
src/path.cpp
src/real.h
src/svg-tests/create_grid.py [new file with mode: 0755]
src/svg-tests/fox-vector.svg
src/svg-tests/grid.svg [new file with mode: 0644]
src/transformationtype.h
src/view.cpp
src/view.h
tools/analysis.ipynb
tools/gpubounds_error.py [new file with mode: 0755]

index d7ccad3..ff00f9e 100644 (file)
@@ -4,7 +4,7 @@
 
 using namespace IPDF;
 
-void DebugScript::ParseAction()
+void DebugScript::ParseAction(View * view, Screen * scr)
 {
        std::string actionType;
        inp >> actionType;
@@ -118,6 +118,52 @@ void DebugScript::ParseAction()
                currentAction.type = AT_DebugFont;
                inp >> currentAction.textargs;
        }
+       else if (actionType == "approachz") // approach zenoistically
+       {
+               currentAction.type = AT_ApproachBoundsZeno;
+               std::string _x, _y, _w, _h, _z;
+               inp >> _x >> _y >> _w >> _h >> _z;
+               currentAction.x = RealFromStr(_x.c_str());
+               currentAction.y = RealFromStr(_y.c_str());
+               currentAction.w = RealFromStr(_w.c_str());
+               currentAction.h = RealFromStr(_h.c_str());
+               currentAction.z = RealFromStr(_z.c_str());
+       }
+       else if (actionType == "approachl") // approach linearly
+       {
+               currentAction.type = AT_ApproachBoundsLinear;
+               std::string _x, _y, _w, _h, _z;
+               inp >> _x >> _y >> _w >> _h >> _z;
+               currentAction.x = RealFromStr(_x.c_str());
+               currentAction.y = RealFromStr(_y.c_str());
+               currentAction.w = RealFromStr(_w.c_str());
+               currentAction.h = RealFromStr(_h.c_str());
+               currentAction.z = RealFromStr(_z.c_str());
+               currentAction.x = (currentAction.x - view->GetBounds().x)/currentAction.z;
+               currentAction.y = (currentAction.y - view->GetBounds().y)/currentAction.z;
+               currentAction.w = (currentAction.w - view->GetBounds().w)/currentAction.z;
+               currentAction.h = (currentAction.h - view->GetBounds().h)/currentAction.z;
+       }
+       else if (actionType == "setbounds")
+       {
+               currentAction.type = AT_SetBounds;
+               std::string _x, _y, _w, _h;
+               inp >> _x >> _y >> _w >> _h;
+               currentAction.x = RealFromStr(_x.c_str());
+               currentAction.y = RealFromStr(_y.c_str());
+               currentAction.w = RealFromStr(_w.c_str());
+               currentAction.h = RealFromStr(_h.c_str());
+       }
+       else if (actionType == "querygpubounds")
+       {
+               currentAction.type = AT_QueryGPUBounds;
+               inp >> currentAction.textargs;
+       }
+       else if (actionType == "screenshot")
+       {
+               currentAction.type = AT_ScreenShot;
+               inp >> currentAction.textargs;  
+       }
 
 }
 
@@ -127,7 +173,7 @@ bool DebugScript::Execute(View *view, Screen *scr)
        {
                if (m_index >= m_actions.size())
                {
-                       ParseAction();
+                       ParseAction(view, scr);
                        if (m_labels.size() > 0)
                        {
                                m_actions.push_back(currentAction);
@@ -217,6 +263,79 @@ bool DebugScript::Execute(View *view, Screen *scr)
                scr->ShowDebugFont(currentAction.textargs == "1" || currentAction.textargs == "on");
                currentAction.loops = 1;
                break;
+               
+       case AT_ApproachBoundsZeno:
+       {       
+               VRect target(currentAction.x, currentAction.y, currentAction.w, currentAction.h);
+               if (currentAction.z != VReal(1))
+               {
+                       target.x = view->GetBounds().x + (target.x-view->GetBounds().x)/VReal(currentAction.z);
+                       target.y = view->GetBounds().y + (target.y-view->GetBounds().y)/VReal(currentAction.z);
+                       target.w = view->GetBounds().w + (target.w-view->GetBounds().w)/VReal(currentAction.z);
+                       target.h = view->GetBounds().h + (target.h-view->GetBounds().h)/VReal(currentAction.z);
+               }
+               
+
+               VReal s = target.w/(view->GetBounds().w);
+               if (Real(s) != 1)
+               {
+                       VReal x0;
+                       VReal y0;
+                       x0 = (view->GetBounds().x - target.x)/((s - VReal(1))*view->GetBounds().w);
+                       y0 = (view->GetBounds().y - target.y)/((s - VReal(1))*view->GetBounds().h);
+                       view->ScaleAroundPoint(x0, y0, s);
+                       currentAction.loops++;
+               }
+               else
+               {
+                       Debug("Already at target view; Waiting for remaining %d frames", currentAction.loops);
+                       currentAction.type = AT_WaitFrame;
+               }
+               break;
+       }
+       case AT_ApproachBoundsLinear:
+       {
+               VRect target(currentAction.x, currentAction.y, currentAction.w, currentAction.h);
+               target.x += view->GetBounds().x;
+               target.y += view->GetBounds().y;
+               target.w += view->GetBounds().w;
+               target.h += view->GetBounds().h;
+               VReal s = target.w/(view->GetBounds().w);
+               if (Real(s) != 1)
+               {
+                       VReal x0;
+                       VReal y0;
+                       x0 = (view->GetBounds().x - target.x)/((s - VReal(1))*view->GetBounds().w);
+                       y0 = (view->GetBounds().y - target.y)/((s - VReal(1))*view->GetBounds().h);
+                       view->ScaleAroundPoint(x0, y0, s);
+                       currentAction.loops++;
+               }
+               else
+               {
+                       Debug("Already at target view; Waiting for remaining %d frames", currentAction.loops);
+                       currentAction.type = AT_WaitFrame;
+               }
+               break;
+       }
+       case AT_SetBounds:
+       {
+               VRect target(currentAction.x, currentAction.y, currentAction.w, currentAction.h);
+               view->SetBounds(target);
+               break;
+       }
+       
+       case AT_QueryGPUBounds:
+       {
+               view->QueryGPUBounds(currentAction.textargs.c_str(), "w");
+               currentAction.loops = 1;
+               break;
+       }
+       case AT_ScreenShot:
+       {
+               view->SaveBMP(currentAction.textargs.c_str());
+               currentAction.loops = 1;
+               break;
+       }
        default:
                Fatal("Unknown script command in queue.");
        }
@@ -241,12 +360,12 @@ void DebugScript::PrintPerformance(View * view, Screen * scr)
 
        // object_count  clock  delta_clock  x  Log10(x)  y  Log10(y)  w  Log10(w)  Size(w)
        #ifdef QUADTREE_DISABLED
-       printf("%d\t%llu\t%llu\t%s\t%f\t%s\t%f\t%s\t%f\t%u\n",
+       printf("%d\t%llu\t%llu\t%s\t%s\t%s\t%s\t%s\t%s\t%u\n",
                now.object_count, (long long unsigned)now.clock,
                (long long unsigned)(now.clock - m_perf_last.clock),
-               Str(now.view_bounds.x).c_str(), Log10(Abs(now.view_bounds.x)),
-               Str(now.view_bounds.y).c_str(), Log10(Abs(now.view_bounds.y)),
-               Str(now.view_bounds.w).c_str(), Log10(now.view_bounds.w),
+               Str(now.view_bounds.x).c_str(), Str(Log10(Abs(now.view_bounds.x))).c_str(),
+               Str(now.view_bounds.y).c_str(), Str(Log10(Abs(now.view_bounds.y))).c_str(),
+               Str(now.view_bounds.w).c_str(), Str(Log10(now.view_bounds.w)).c_str(),
                (unsigned)Size(now.view_bounds.w));
        #endif
        m_perf_last = now;
index fd1a195..9e85b51 100644 (file)
@@ -41,6 +41,11 @@ private:
                AT_PrintPerformance,
                AT_RecordPerformance,
                AT_DebugFont,
+               AT_ApproachBoundsZeno,
+               AT_ApproachBoundsLinear,
+               AT_SetBounds,
+               AT_QueryGPUBounds, // query bounds of Beziers when transformed to GPU
+               AT_ScreenShot, // take screenshot
                AT_Quit
        };
 
@@ -52,6 +57,7 @@ private:
                Real z;
                int iz;
                int loops;
+               Real w, h;
                std::string textargs;
                Action() : type(AT_WaitFrame), x(0), y(0), ix(0), iy(0), z(0), loops(0), textargs("") {}
        };
@@ -76,7 +82,7 @@ private:
        void PrintPerformance(View * view, Screen * scr);
        void ClearPerformance(View * view, Screen * scr);
        
-       void ParseAction();
+       void ParseAction(View * view, Screen * scr);
 };
 
 }
index f8a1796..d01e075 100644 (file)
@@ -1145,28 +1145,43 @@ void Document::AddFontGlyphAtPoint(stbtt_fontinfo *font, int character, Real sca
        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)
index 94be6cc..d6f41f3 100644 (file)
@@ -82,7 +82,7 @@ namespace IPDF
                        
                        void AddFontGlyphAtPoint(stbtt_fontinfo *font, int character, Real scale, Real x, Real y);
                        
-                       void TransformObjectBounds(const SVGMatrix & transform);
+                       void TransformObjectBounds(const SVGMatrix & transform, ObjectType type = NUMBER_OF_OBJECT_TYPES);
                        void TranslateObjects(const Real & x, const Real & y, ObjectType type = NUMBER_OF_OBJECT_TYPES);
                        void ScaleObjectsAboutPoint(const Real & x, const Real & y, const Real & scale_amount, ObjectType type = NUMBER_OF_OBJECT_TYPES);
                        
index 12e6af9..db76eeb 100644 (file)
@@ -1,7 +1,7 @@
 # Test how well document scales back to original...
-gpu
+cpu
 lazy
-debugfont off
+debugfont on
 clearperf
 label start
 printperf
diff --git a/src/foxzoom.script b/src/foxzoom.script
new file mode 100644 (file)
index 0000000..bf191e0
--- /dev/null
@@ -0,0 +1,12 @@
+label start
+setbounds 0 0 1 1
+loadsvg svg-tests/fox-vector.svg
+querygpubounds original.dat
+screenshot original.bmp
+loop 1950 pxzoom 0 0 -1
+loop 200 wait
+debug hi
+loop 1950 pxzoom 0 0 1
+querygpubounds transformed.dat
+screenshot transformed.bmp
+wait
diff --git a/src/grid.script b/src/grid.script
new file mode 100644 (file)
index 0000000..a053e9c
--- /dev/null
@@ -0,0 +1,9 @@
+gpu
+lazy
+setbounds 0.5 0.5 1e-6 1e-6
+loadsvg svg-tests/grid.svg
+screenshot grid1.bmp
+loop 10 translate 1e-6 0
+loadsvg svg-tests/grid.svg
+screenshot grid2.bmp
+wait
diff --git a/src/gridtest.script b/src/gridtest.script
new file mode 100644 (file)
index 0000000..fce1fac
--- /dev/null
@@ -0,0 +1,6 @@
+setbounds 0 0 1 1
+loadsvg svg-tests/grid.svg
+loop 1000 wait
+setbounds 0.5 0.5 1e-5 1e-5
+loadsvg svg-tests/grid.svg
+loop 1000 wait
index 67e2076..22a1f6b 100644 (file)
@@ -21,6 +21,8 @@ void sigfpe_handler(int sig)
 
 int main(int argc, char ** argv)
 {      
+       
+       
        //Debug("Main!");
        signal(SIGFPE, sigfpe_handler);
        #if REALTYPE == REAL_IRRAM
@@ -36,9 +38,13 @@ int main(int argc, char ** argv)
        #ifndef __MINGW32__
        feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
        #endif
-
+       #if REALTYPE == REAL_MPFRCPP
+       mpfr_set_default_prec(6);
+       #endif
        DebugRealInfo();
 
+
+
        Document doc("","fonts/ComicSans.ttf");
        srand(time(NULL));
 
index 5015044..bd43c12 100644 (file)
@@ -80,6 +80,7 @@ void MainLoop(Document & doc, Screen & scr, View & view, int max_frames = -1)
        DebugScript script;
 
        scr.DebugFontInit("fonts/DejaVuSansMono.ttf", 12);
+       //scr.DebugFontInit("fonts/DejaVuSansMono.ttf", 18);
        scr.SetMouseHandler(RatCatcher);
 
        if (script_filename)
@@ -143,20 +144,26 @@ void MainLoop(Document & doc, Screen & scr, View & view, int max_frames = -1)
                        data_points++;
                }
                
-               scr.DebugFontPrintF("View Width = %s m\n", Str(view.GetBounds().w * VReal(22e-3)).c_str());
-               scr.DebugFontPrintF("Similar size: %s\n", HumanScale(view.GetBounds().w * VReal(22e-3)));
+
+               
+
+               scr.DebugFontPrintF("Top Left: (%s,%s)\n", Str(view.GetBounds().x).c_str(),Str(view.GetBounds().y).c_str());
+               scr.DebugFontPrintF("Width: %s\n", Str(view.GetBounds().w).c_str());
+               scr.DebugFontPrintF("Zoom: %s %%\n", Str(VReal(100)/VReal(view.GetBounds().w)).c_str());
+               //scr.DebugFontPrintF("Similar size: %s\n", HumanScale(view.GetBounds().w * VReal(22e-3)));
                
-               #if 0
+               #if 1
                scr.DebugFontPrintF("Rendered frame %lu\n", (uint64_t)frames);
                scr.DebugFontPrintF("Lazy Rendering = %d\n", view.UsingLazyRendering());
-               if (cpu_frame > 0 && total_cpu_time > 0)
+               /*if (cpu_frame > 0 && total_cpu_time > 0)
                        scr.DebugFontPrintF("[CPU] Render took %lf ms (%lf FPS) (total %lf s, avg FPS %lf)\n", cpu_frame*1e3, 1.0/cpu_frame, total_cpu_time,frames/total_cpu_time);
                if (gpu_frame > 0 && total_gpu_time > 0)
                        scr.DebugFontPrintF("[GPU] Render took %lf ms (%lf FPS) (total %lf s, avg FPS %lf)\n", gpu_frame*1e3, 1.0/gpu_frame, total_gpu_time, frames/total_gpu_time);
+                       */
                if (real_frame > 0 && total_real_time > 0)
-                       scr.DebugFontPrintF("[REALTIME] Render+Present+Cruft took %lf ms (%lf FPS) (total %lf s, avg FPS %lf)\n", real_frame*1e3, 1.0/real_frame, total_real_time,frames/total_real_time);
+                       scr.DebugFontPrintF("[REALTIME] Render took %lf ms (%lf FPS) (total %lf s, avg FPS %lf)\n", real_frame*1e3, 1.0/real_frame, total_real_time,frames/total_real_time);
 
-               scr.DebugFontPrintF("View bounds: %s\n", view.GetBounds().Str().c_str());
+               //scr.DebugFontPrintF("View bounds: %s\n", view.GetBounds().Str().c_str());
                scr.DebugFontPrintF("type of Real == %s\n", g_real_name[REALTYPE]);
                //#if REALTYPE == REAL_MPFRCPP
                //      scr.DebugFontPrintf("Precision: %s\nRounding: %s\n");
index 886871c..3f1bc41 100644 (file)
@@ -390,6 +390,12 @@ void BezierRenderer::RenderUsingGPU(unsigned first_obj_id, unsigned last_obj_id)
        glUniform1i(m_shader_program.GetUniformLocation("bezier_buffer_texture"), 0);
        glUniform1i(m_shader_program.GetUniformLocation("bezier_id_buffer_texture"), 1);
        m_ibo.Bind();
+       
+       // To antialias the line... causes SIGFPE because why would anything make sense
+       //glEnable(GL_BLEND);
+       //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+       //glEnable(GL_LINE_SMOOTH);
+       //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
        glDrawElements(GL_LINES, (last_index-first_index)*2, GL_UNSIGNED_INT, (GLvoid*)(2*first_index*sizeof(uint32_t)));
 }
 
@@ -429,7 +435,7 @@ void PathRenderer::RenderUsingCPU(Objects & objects, const View & view, const CP
                        continue;
                for (unsigned b = path.m_start; b <= path.m_end; ++b)
                {
-                       Rect & bbounds = objects.bounds[b];
+                       Rect bbounds = view.TransformToViewCoords(objects.bounds[b]);
                        Bezier & bez = objects.beziers[objects.data_indices[b]];
                        BezierRenderer::RenderBezierOnCPU(bez,bbounds,view,target,path.m_stroke);
                }
index 0516e5b..cae1e68 100644 (file)
@@ -126,7 +126,7 @@ bool Path::PointInside(const Objects & objects, const Vec2 & pt, bool debug) con
 
 vector<Vec2> & Path::FillPoints(const Objects & objects, const View & view)
 {
-       if (m_fill_points.size() != 0)
+       //if (m_fill_points.size() != 0)
                return m_fill_points;
                
        
index e72709b..13395fb 100644 (file)
@@ -41,6 +41,7 @@
 
 #if REALTYPE == REAL_MPFRCPP
        #include <mpreal.h>
+
 #endif //REALTYPE
 
 #if REALTYPE == REAL_IRRAM
@@ -98,6 +99,10 @@ namespace IPDF
        inline Real Sqrt(const Real & r) {return mpfr::sqrt(r, mpfr::mpreal::get_default_rnd());}
        inline Real Abs(const Real & r) {return mpfr::abs(r, mpfr::mpreal::get_default_rnd());}
        inline Real RealFromStr(const char * str) {return Real(strtod(str, NULL));}
+       inline std::string Str(const mpfr::mpreal & a) {std::stringstream s; s << a; return s.str();}
+       inline size_t Size(mpfr::mpreal & a) {return a.get_prec();}
+       inline mpfr::mpreal Log10(const mpfr::mpreal & a) {return mpfr::log10(a);}      
+       
 #elif REALTYPE == REAL_IRRAM
        typedef iRRAM::REAL Real;
        inline double Double(const Real & r) {return r.as_double(53);}
@@ -138,8 +143,9 @@ namespace IPDF
        inline double Sqrt(double f) {return sqrt(f);}
        inline double Abs(double a) {return fabs(a);}
        inline double Log10(double a) {return log(a)/log(10.0);}
-       inline size_t Size(double a) {return sizeof(a);}
        inline size_t Size(float a) {return sizeof(a);}
+       inline size_t Size(double a) {return sizeof(a);}
+       
        
        // Don't cause an exception
        inline float ClampFloat(double d)
diff --git a/src/svg-tests/create_grid.py b/src/svg-tests/create_grid.py
new file mode 100755 (executable)
index 0000000..b928991
--- /dev/null
@@ -0,0 +1,27 @@
+#!/usr/bin/python
+
+w = 800
+h = 600
+step = 1
+print '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n \
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"\n \
+"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n \
+<svg xmlns="http://www.w3.org/2000/svg"\n \
+     xmlns:xlink="http://www.w3.org/1999/xlink"\n \
+     width="%d" height="%d">\n' % (w,h)
+     
+print "\t<path"
+print "\t\td=\""
+for y in xrange(0,h+step,step):
+       print "\t\t\tM 0,%d L %d,%d" % (y,w,y)
+
+print "\t\t\" style=\"stroke-width:1px; stroke:black;\"/>"
+
+print "\t<path"
+print "\t\td=\""
+for x in xrange(0,w+step,step):
+       print "\t\t\tM %d,0 L %d,%d" % (x,x,h)
+
+print "\t\t\" style=\"stroke:#aaaaff;stroke-width:1px; fill:none;\"/>"
+
+print "</svg>"
index cd3641c..cc30737 100644 (file)
     <g
        id="g3636"
        transform="matrix(1.32835,0,0,1.32835,180.62125,44.059858)">
-      <rect
+      <!--<rect
          y="-152.77502"
          x="-681.08765"
          height="159"
          width="262"
          id="rect3436"
-         style="fill:#ffffff;fill-opacity:1;stroke:none" />
+         style="fill:#ffffff;fill-opacity:1;stroke:none" />-->
       <path
          inkscape:connector-curvature="0"
          id="path2991-6"
diff --git a/src/svg-tests/grid.svg b/src/svg-tests/grid.svg
new file mode 100644 (file)
index 0000000..0d1ee9e
--- /dev/null
@@ -0,0 +1,1416 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+ <svg xmlns="http://www.w3.org/2000/svg"
+      xmlns:xlink="http://www.w3.org/1999/xlink"
+      width="800" height="600">
+
+       <path
+               d="
+                       M 0,0 L 800,0
+                       M 0,1 L 800,1
+                       M 0,2 L 800,2
+                       M 0,3 L 800,3
+                       M 0,4 L 800,4
+                       M 0,5 L 800,5
+                       M 0,6 L 800,6
+                       M 0,7 L 800,7
+                       M 0,8 L 800,8
+                       M 0,9 L 800,9
+                       M 0,10 L 800,10
+                       M 0,11 L 800,11
+                       M 0,12 L 800,12
+                       M 0,13 L 800,13
+                       M 0,14 L 800,14
+                       M 0,15 L 800,15
+                       M 0,16 L 800,16
+                       M 0,17 L 800,17
+                       M 0,18 L 800,18
+                       M 0,19 L 800,19
+                       M 0,20 L 800,20
+                       M 0,21 L 800,21
+                       M 0,22 L 800,22
+                       M 0,23 L 800,23
+                       M 0,24 L 800,24
+                       M 0,25 L 800,25
+                       M 0,26 L 800,26
+                       M 0,27 L 800,27
+                       M 0,28 L 800,28
+                       M 0,29 L 800,29
+                       M 0,30 L 800,30
+                       M 0,31 L 800,31
+                       M 0,32 L 800,32
+                       M 0,33 L 800,33
+                       M 0,34 L 800,34
+                       M 0,35 L 800,35
+                       M 0,36 L 800,36
+                       M 0,37 L 800,37
+                       M 0,38 L 800,38
+                       M 0,39 L 800,39
+                       M 0,40 L 800,40
+                       M 0,41 L 800,41
+                       M 0,42 L 800,42
+                       M 0,43 L 800,43
+                       M 0,44 L 800,44
+                       M 0,45 L 800,45
+                       M 0,46 L 800,46
+                       M 0,47 L 800,47
+                       M 0,48 L 800,48
+                       M 0,49 L 800,49
+                       M 0,50 L 800,50
+                       M 0,51 L 800,51
+                       M 0,52 L 800,52
+                       M 0,53 L 800,53
+                       M 0,54 L 800,54
+                       M 0,55 L 800,55
+                       M 0,56 L 800,56
+                       M 0,57 L 800,57
+                       M 0,58 L 800,58
+                       M 0,59 L 800,59
+                       M 0,60 L 800,60
+                       M 0,61 L 800,61
+                       M 0,62 L 800,62
+                       M 0,63 L 800,63
+                       M 0,64 L 800,64
+                       M 0,65 L 800,65
+                       M 0,66 L 800,66
+                       M 0,67 L 800,67
+                       M 0,68 L 800,68
+                       M 0,69 L 800,69
+                       M 0,70 L 800,70
+                       M 0,71 L 800,71
+                       M 0,72 L 800,72
+                       M 0,73 L 800,73
+                       M 0,74 L 800,74
+                       M 0,75 L 800,75
+                       M 0,76 L 800,76
+                       M 0,77 L 800,77
+                       M 0,78 L 800,78
+                       M 0,79 L 800,79
+                       M 0,80 L 800,80
+                       M 0,81 L 800,81
+                       M 0,82 L 800,82
+                       M 0,83 L 800,83
+                       M 0,84 L 800,84
+                       M 0,85 L 800,85
+                       M 0,86 L 800,86
+                       M 0,87 L 800,87
+                       M 0,88 L 800,88
+                       M 0,89 L 800,89
+                       M 0,90 L 800,90
+                       M 0,91 L 800,91
+                       M 0,92 L 800,92
+                       M 0,93 L 800,93
+                       M 0,94 L 800,94
+                       M 0,95 L 800,95
+                       M 0,96 L 800,96
+                       M 0,97 L 800,97
+                       M 0,98 L 800,98
+                       M 0,99 L 800,99
+                       M 0,100 L 800,100
+                       M 0,101 L 800,101
+                       M 0,102 L 800,102
+                       M 0,103 L 800,103
+                       M 0,104 L 800,104
+                       M 0,105 L 800,105
+                       M 0,106 L 800,106
+                       M 0,107 L 800,107
+                       M 0,108 L 800,108
+                       M 0,109 L 800,109
+                       M 0,110 L 800,110
+                       M 0,111 L 800,111
+                       M 0,112 L 800,112
+                       M 0,113 L 800,113
+                       M 0,114 L 800,114
+                       M 0,115 L 800,115
+                       M 0,116 L 800,116
+                       M 0,117 L 800,117
+                       M 0,118 L 800,118
+                       M 0,119 L 800,119
+                       M 0,120 L 800,120
+                       M 0,121 L 800,121
+                       M 0,122 L 800,122
+                       M 0,123 L 800,123
+                       M 0,124 L 800,124
+                       M 0,125 L 800,125
+                       M 0,126 L 800,126
+                       M 0,127 L 800,127
+                       M 0,128 L 800,128
+                       M 0,129 L 800,129
+                       M 0,130 L 800,130
+                       M 0,131 L 800,131
+                       M 0,132 L 800,132
+                       M 0,133 L 800,133
+                       M 0,134 L 800,134
+                       M 0,135 L 800,135
+                       M 0,136 L 800,136
+                       M 0,137 L 800,137
+                       M 0,138 L 800,138
+                       M 0,139 L 800,139
+                       M 0,140 L 800,140
+                       M 0,141 L 800,141
+                       M 0,142 L 800,142
+                       M 0,143 L 800,143
+                       M 0,144 L 800,144
+                       M 0,145 L 800,145
+                       M 0,146 L 800,146
+                       M 0,147 L 800,147
+                       M 0,148 L 800,148
+                       M 0,149 L 800,149
+                       M 0,150 L 800,150
+                       M 0,151 L 800,151
+                       M 0,152 L 800,152
+                       M 0,153 L 800,153
+                       M 0,154 L 800,154
+                       M 0,155 L 800,155
+                       M 0,156 L 800,156
+                       M 0,157 L 800,157
+                       M 0,158 L 800,158
+                       M 0,159 L 800,159
+                       M 0,160 L 800,160
+                       M 0,161 L 800,161
+                       M 0,162 L 800,162
+                       M 0,163 L 800,163
+                       M 0,164 L 800,164
+                       M 0,165 L 800,165
+                       M 0,166 L 800,166
+                       M 0,167 L 800,167
+                       M 0,168 L 800,168
+                       M 0,169 L 800,169
+                       M 0,170 L 800,170
+                       M 0,171 L 800,171
+                       M 0,172 L 800,172
+                       M 0,173 L 800,173
+                       M 0,174 L 800,174
+                       M 0,175 L 800,175
+                       M 0,176 L 800,176
+                       M 0,177 L 800,177
+                       M 0,178 L 800,178
+                       M 0,179 L 800,179
+                       M 0,180 L 800,180
+                       M 0,181 L 800,181
+                       M 0,182 L 800,182
+                       M 0,183 L 800,183
+                       M 0,184 L 800,184
+                       M 0,185 L 800,185
+                       M 0,186 L 800,186
+                       M 0,187 L 800,187
+                       M 0,188 L 800,188
+                       M 0,189 L 800,189
+                       M 0,190 L 800,190
+                       M 0,191 L 800,191
+                       M 0,192 L 800,192
+                       M 0,193 L 800,193
+                       M 0,194 L 800,194
+                       M 0,195 L 800,195
+                       M 0,196 L 800,196
+                       M 0,197 L 800,197
+                       M 0,198 L 800,198
+                       M 0,199 L 800,199
+                       M 0,200 L 800,200
+                       M 0,201 L 800,201
+                       M 0,202 L 800,202
+                       M 0,203 L 800,203
+                       M 0,204 L 800,204
+                       M 0,205 L 800,205
+                       M 0,206 L 800,206
+                       M 0,207 L 800,207
+                       M 0,208 L 800,208
+                       M 0,209 L 800,209
+                       M 0,210 L 800,210
+                       M 0,211 L 800,211
+                       M 0,212 L 800,212
+                       M 0,213 L 800,213
+                       M 0,214 L 800,214
+                       M 0,215 L 800,215
+                       M 0,216 L 800,216
+                       M 0,217 L 800,217
+                       M 0,218 L 800,218
+                       M 0,219 L 800,219
+                       M 0,220 L 800,220
+                       M 0,221 L 800,221
+                       M 0,222 L 800,222
+                       M 0,223 L 800,223
+                       M 0,224 L 800,224
+                       M 0,225 L 800,225
+                       M 0,226 L 800,226
+                       M 0,227 L 800,227
+                       M 0,228 L 800,228
+                       M 0,229 L 800,229
+                       M 0,230 L 800,230
+                       M 0,231 L 800,231
+                       M 0,232 L 800,232
+                       M 0,233 L 800,233
+                       M 0,234 L 800,234
+                       M 0,235 L 800,235
+                       M 0,236 L 800,236
+                       M 0,237 L 800,237
+                       M 0,238 L 800,238
+                       M 0,239 L 800,239
+                       M 0,240 L 800,240
+                       M 0,241 L 800,241
+                       M 0,242 L 800,242
+                       M 0,243 L 800,243
+                       M 0,244 L 800,244
+                       M 0,245 L 800,245
+                       M 0,246 L 800,246
+                       M 0,247 L 800,247
+                       M 0,248 L 800,248
+                       M 0,249 L 800,249
+                       M 0,250 L 800,250
+                       M 0,251 L 800,251
+                       M 0,252 L 800,252
+                       M 0,253 L 800,253
+                       M 0,254 L 800,254
+                       M 0,255 L 800,255
+                       M 0,256 L 800,256
+                       M 0,257 L 800,257
+                       M 0,258 L 800,258
+                       M 0,259 L 800,259
+                       M 0,260 L 800,260
+                       M 0,261 L 800,261
+                       M 0,262 L 800,262
+                       M 0,263 L 800,263
+                       M 0,264 L 800,264
+                       M 0,265 L 800,265
+                       M 0,266 L 800,266
+                       M 0,267 L 800,267
+                       M 0,268 L 800,268
+                       M 0,269 L 800,269
+                       M 0,270 L 800,270
+                       M 0,271 L 800,271
+                       M 0,272 L 800,272
+                       M 0,273 L 800,273
+                       M 0,274 L 800,274
+                       M 0,275 L 800,275
+                       M 0,276 L 800,276
+                       M 0,277 L 800,277
+                       M 0,278 L 800,278
+                       M 0,279 L 800,279
+                       M 0,280 L 800,280
+                       M 0,281 L 800,281
+                       M 0,282 L 800,282
+                       M 0,283 L 800,283
+                       M 0,284 L 800,284
+                       M 0,285 L 800,285
+                       M 0,286 L 800,286
+                       M 0,287 L 800,287
+                       M 0,288 L 800,288
+                       M 0,289 L 800,289
+                       M 0,290 L 800,290
+                       M 0,291 L 800,291
+                       M 0,292 L 800,292
+                       M 0,293 L 800,293
+                       M 0,294 L 800,294
+                       M 0,295 L 800,295
+                       M 0,296 L 800,296
+                       M 0,297 L 800,297
+                       M 0,298 L 800,298
+                       M 0,299 L 800,299
+                       M 0,300 L 800,300
+                       M 0,301 L 800,301
+                       M 0,302 L 800,302
+                       M 0,303 L 800,303
+                       M 0,304 L 800,304
+                       M 0,305 L 800,305
+                       M 0,306 L 800,306
+                       M 0,307 L 800,307
+                       M 0,308 L 800,308
+                       M 0,309 L 800,309
+                       M 0,310 L 800,310
+                       M 0,311 L 800,311
+                       M 0,312 L 800,312
+                       M 0,313 L 800,313
+                       M 0,314 L 800,314
+                       M 0,315 L 800,315
+                       M 0,316 L 800,316
+                       M 0,317 L 800,317
+                       M 0,318 L 800,318
+                       M 0,319 L 800,319
+                       M 0,320 L 800,320
+                       M 0,321 L 800,321
+                       M 0,322 L 800,322
+                       M 0,323 L 800,323
+                       M 0,324 L 800,324
+                       M 0,325 L 800,325
+                       M 0,326 L 800,326
+                       M 0,327 L 800,327
+                       M 0,328 L 800,328
+                       M 0,329 L 800,329
+                       M 0,330 L 800,330
+                       M 0,331 L 800,331
+                       M 0,332 L 800,332
+                       M 0,333 L 800,333
+                       M 0,334 L 800,334
+                       M 0,335 L 800,335
+                       M 0,336 L 800,336
+                       M 0,337 L 800,337
+                       M 0,338 L 800,338
+                       M 0,339 L 800,339
+                       M 0,340 L 800,340
+                       M 0,341 L 800,341
+                       M 0,342 L 800,342
+                       M 0,343 L 800,343
+                       M 0,344 L 800,344
+                       M 0,345 L 800,345
+                       M 0,346 L 800,346
+                       M 0,347 L 800,347
+                       M 0,348 L 800,348
+                       M 0,349 L 800,349
+                       M 0,350 L 800,350
+                       M 0,351 L 800,351
+                       M 0,352 L 800,352
+                       M 0,353 L 800,353
+                       M 0,354 L 800,354
+                       M 0,355 L 800,355
+                       M 0,356 L 800,356
+                       M 0,357 L 800,357
+                       M 0,358 L 800,358
+                       M 0,359 L 800,359
+                       M 0,360 L 800,360
+                       M 0,361 L 800,361
+                       M 0,362 L 800,362
+                       M 0,363 L 800,363
+                       M 0,364 L 800,364
+                       M 0,365 L 800,365
+                       M 0,366 L 800,366
+                       M 0,367 L 800,367
+                       M 0,368 L 800,368
+                       M 0,369 L 800,369
+                       M 0,370 L 800,370
+                       M 0,371 L 800,371
+                       M 0,372 L 800,372
+                       M 0,373 L 800,373
+                       M 0,374 L 800,374
+                       M 0,375 L 800,375
+                       M 0,376 L 800,376
+                       M 0,377 L 800,377
+                       M 0,378 L 800,378
+                       M 0,379 L 800,379
+                       M 0,380 L 800,380
+                       M 0,381 L 800,381
+                       M 0,382 L 800,382
+                       M 0,383 L 800,383
+                       M 0,384 L 800,384
+                       M 0,385 L 800,385
+                       M 0,386 L 800,386
+                       M 0,387 L 800,387
+                       M 0,388 L 800,388
+                       M 0,389 L 800,389
+                       M 0,390 L 800,390
+                       M 0,391 L 800,391
+                       M 0,392 L 800,392
+                       M 0,393 L 800,393
+                       M 0,394 L 800,394
+                       M 0,395 L 800,395
+                       M 0,396 L 800,396
+                       M 0,397 L 800,397
+                       M 0,398 L 800,398
+                       M 0,399 L 800,399
+                       M 0,400 L 800,400
+                       M 0,401 L 800,401
+                       M 0,402 L 800,402
+                       M 0,403 L 800,403
+                       M 0,404 L 800,404
+                       M 0,405 L 800,405
+                       M 0,406 L 800,406
+                       M 0,407 L 800,407
+                       M 0,408 L 800,408
+                       M 0,409 L 800,409
+                       M 0,410 L 800,410
+                       M 0,411 L 800,411
+                       M 0,412 L 800,412
+                       M 0,413 L 800,413
+                       M 0,414 L 800,414
+                       M 0,415 L 800,415
+                       M 0,416 L 800,416
+                       M 0,417 L 800,417
+                       M 0,418 L 800,418
+                       M 0,419 L 800,419
+                       M 0,420 L 800,420
+                       M 0,421 L 800,421
+                       M 0,422 L 800,422
+                       M 0,423 L 800,423
+                       M 0,424 L 800,424
+                       M 0,425 L 800,425
+                       M 0,426 L 800,426
+                       M 0,427 L 800,427
+                       M 0,428 L 800,428
+                       M 0,429 L 800,429
+                       M 0,430 L 800,430
+                       M 0,431 L 800,431
+                       M 0,432 L 800,432
+                       M 0,433 L 800,433
+                       M 0,434 L 800,434
+                       M 0,435 L 800,435
+                       M 0,436 L 800,436
+                       M 0,437 L 800,437
+                       M 0,438 L 800,438
+                       M 0,439 L 800,439
+                       M 0,440 L 800,440
+                       M 0,441 L 800,441
+                       M 0,442 L 800,442
+                       M 0,443 L 800,443
+                       M 0,444 L 800,444
+                       M 0,445 L 800,445
+                       M 0,446 L 800,446
+                       M 0,447 L 800,447
+                       M 0,448 L 800,448
+                       M 0,449 L 800,449
+                       M 0,450 L 800,450
+                       M 0,451 L 800,451
+                       M 0,452 L 800,452
+                       M 0,453 L 800,453
+                       M 0,454 L 800,454
+                       M 0,455 L 800,455
+                       M 0,456 L 800,456
+                       M 0,457 L 800,457
+                       M 0,458 L 800,458
+                       M 0,459 L 800,459
+                       M 0,460 L 800,460
+                       M 0,461 L 800,461
+                       M 0,462 L 800,462
+                       M 0,463 L 800,463
+                       M 0,464 L 800,464
+                       M 0,465 L 800,465
+                       M 0,466 L 800,466
+                       M 0,467 L 800,467
+                       M 0,468 L 800,468
+                       M 0,469 L 800,469
+                       M 0,470 L 800,470
+                       M 0,471 L 800,471
+                       M 0,472 L 800,472
+                       M 0,473 L 800,473
+                       M 0,474 L 800,474
+                       M 0,475 L 800,475
+                       M 0,476 L 800,476
+                       M 0,477 L 800,477
+                       M 0,478 L 800,478
+                       M 0,479 L 800,479
+                       M 0,480 L 800,480
+                       M 0,481 L 800,481
+                       M 0,482 L 800,482
+                       M 0,483 L 800,483
+                       M 0,484 L 800,484
+                       M 0,485 L 800,485
+                       M 0,486 L 800,486
+                       M 0,487 L 800,487
+                       M 0,488 L 800,488
+                       M 0,489 L 800,489
+                       M 0,490 L 800,490
+                       M 0,491 L 800,491
+                       M 0,492 L 800,492
+                       M 0,493 L 800,493
+                       M 0,494 L 800,494
+                       M 0,495 L 800,495
+                       M 0,496 L 800,496
+                       M 0,497 L 800,497
+                       M 0,498 L 800,498
+                       M 0,499 L 800,499
+                       M 0,500 L 800,500
+                       M 0,501 L 800,501
+                       M 0,502 L 800,502
+                       M 0,503 L 800,503
+                       M 0,504 L 800,504
+                       M 0,505 L 800,505
+                       M 0,506 L 800,506
+                       M 0,507 L 800,507
+                       M 0,508 L 800,508
+                       M 0,509 L 800,509
+                       M 0,510 L 800,510
+                       M 0,511 L 800,511
+                       M 0,512 L 800,512
+                       M 0,513 L 800,513
+                       M 0,514 L 800,514
+                       M 0,515 L 800,515
+                       M 0,516 L 800,516
+                       M 0,517 L 800,517
+                       M 0,518 L 800,518
+                       M 0,519 L 800,519
+                       M 0,520 L 800,520
+                       M 0,521 L 800,521
+                       M 0,522 L 800,522
+                       M 0,523 L 800,523
+                       M 0,524 L 800,524
+                       M 0,525 L 800,525
+                       M 0,526 L 800,526
+                       M 0,527 L 800,527
+                       M 0,528 L 800,528
+                       M 0,529 L 800,529
+                       M 0,530 L 800,530
+                       M 0,531 L 800,531
+                       M 0,532 L 800,532
+                       M 0,533 L 800,533
+                       M 0,534 L 800,534
+                       M 0,535 L 800,535
+                       M 0,536 L 800,536
+                       M 0,537 L 800,537
+                       M 0,538 L 800,538
+                       M 0,539 L 800,539
+                       M 0,540 L 800,540
+                       M 0,541 L 800,541
+                       M 0,542 L 800,542
+                       M 0,543 L 800,543
+                       M 0,544 L 800,544
+                       M 0,545 L 800,545
+                       M 0,546 L 800,546
+                       M 0,547 L 800,547
+                       M 0,548 L 800,548
+                       M 0,549 L 800,549
+                       M 0,550 L 800,550
+                       M 0,551 L 800,551
+                       M 0,552 L 800,552
+                       M 0,553 L 800,553
+                       M 0,554 L 800,554
+                       M 0,555 L 800,555
+                       M 0,556 L 800,556
+                       M 0,557 L 800,557
+                       M 0,558 L 800,558
+                       M 0,559 L 800,559
+                       M 0,560 L 800,560
+                       M 0,561 L 800,561
+                       M 0,562 L 800,562
+                       M 0,563 L 800,563
+                       M 0,564 L 800,564
+                       M 0,565 L 800,565
+                       M 0,566 L 800,566
+                       M 0,567 L 800,567
+                       M 0,568 L 800,568
+                       M 0,569 L 800,569
+                       M 0,570 L 800,570
+                       M 0,571 L 800,571
+                       M 0,572 L 800,572
+                       M 0,573 L 800,573
+                       M 0,574 L 800,574
+                       M 0,575 L 800,575
+                       M 0,576 L 800,576
+                       M 0,577 L 800,577
+                       M 0,578 L 800,578
+                       M 0,579 L 800,579
+                       M 0,580 L 800,580
+                       M 0,581 L 800,581
+                       M 0,582 L 800,582
+                       M 0,583 L 800,583
+                       M 0,584 L 800,584
+                       M 0,585 L 800,585
+                       M 0,586 L 800,586
+                       M 0,587 L 800,587
+                       M 0,588 L 800,588
+                       M 0,589 L 800,589
+                       M 0,590 L 800,590
+                       M 0,591 L 800,591
+                       M 0,592 L 800,592
+                       M 0,593 L 800,593
+                       M 0,594 L 800,594
+                       M 0,595 L 800,595
+                       M 0,596 L 800,596
+                       M 0,597 L 800,597
+                       M 0,598 L 800,598
+                       M 0,599 L 800,599
+                       M 0,600 L 800,600
+               " style="stroke-width:1px; stroke:black;"/>
+       <path
+               d="
+                       M 0,0 L 0,600
+                       M 1,0 L 1,600
+                       M 2,0 L 2,600
+                       M 3,0 L 3,600
+                       M 4,0 L 4,600
+                       M 5,0 L 5,600
+                       M 6,0 L 6,600
+                       M 7,0 L 7,600
+                       M 8,0 L 8,600
+                       M 9,0 L 9,600
+                       M 10,0 L 10,600
+                       M 11,0 L 11,600
+                       M 12,0 L 12,600
+                       M 13,0 L 13,600
+                       M 14,0 L 14,600
+                       M 15,0 L 15,600
+                       M 16,0 L 16,600
+                       M 17,0 L 17,600
+                       M 18,0 L 18,600
+                       M 19,0 L 19,600
+                       M 20,0 L 20,600
+                       M 21,0 L 21,600
+                       M 22,0 L 22,600
+                       M 23,0 L 23,600
+                       M 24,0 L 24,600
+                       M 25,0 L 25,600
+                       M 26,0 L 26,600
+                       M 27,0 L 27,600
+                       M 28,0 L 28,600
+                       M 29,0 L 29,600
+                       M 30,0 L 30,600
+                       M 31,0 L 31,600
+                       M 32,0 L 32,600
+                       M 33,0 L 33,600
+                       M 34,0 L 34,600
+                       M 35,0 L 35,600
+                       M 36,0 L 36,600
+                       M 37,0 L 37,600
+                       M 38,0 L 38,600
+                       M 39,0 L 39,600
+                       M 40,0 L 40,600
+                       M 41,0 L 41,600
+                       M 42,0 L 42,600
+                       M 43,0 L 43,600
+                       M 44,0 L 44,600
+                       M 45,0 L 45,600
+                       M 46,0 L 46,600
+                       M 47,0 L 47,600
+                       M 48,0 L 48,600
+                       M 49,0 L 49,600
+                       M 50,0 L 50,600
+                       M 51,0 L 51,600
+                       M 52,0 L 52,600
+                       M 53,0 L 53,600
+                       M 54,0 L 54,600
+                       M 55,0 L 55,600
+                       M 56,0 L 56,600
+                       M 57,0 L 57,600
+                       M 58,0 L 58,600
+                       M 59,0 L 59,600
+                       M 60,0 L 60,600
+                       M 61,0 L 61,600
+                       M 62,0 L 62,600
+                       M 63,0 L 63,600
+                       M 64,0 L 64,600
+                       M 65,0 L 65,600
+                       M 66,0 L 66,600
+                       M 67,0 L 67,600
+                       M 68,0 L 68,600
+                       M 69,0 L 69,600
+                       M 70,0 L 70,600
+                       M 71,0 L 71,600
+                       M 72,0 L 72,600
+                       M 73,0 L 73,600
+                       M 74,0 L 74,600
+                       M 75,0 L 75,600
+                       M 76,0 L 76,600
+                       M 77,0 L 77,600
+                       M 78,0 L 78,600
+                       M 79,0 L 79,600
+                       M 80,0 L 80,600
+                       M 81,0 L 81,600
+                       M 82,0 L 82,600
+                       M 83,0 L 83,600
+                       M 84,0 L 84,600
+                       M 85,0 L 85,600
+                       M 86,0 L 86,600
+                       M 87,0 L 87,600
+                       M 88,0 L 88,600
+                       M 89,0 L 89,600
+                       M 90,0 L 90,600
+                       M 91,0 L 91,600
+                       M 92,0 L 92,600
+                       M 93,0 L 93,600
+                       M 94,0 L 94,600
+                       M 95,0 L 95,600
+                       M 96,0 L 96,600
+                       M 97,0 L 97,600
+                       M 98,0 L 98,600
+                       M 99,0 L 99,600
+                       M 100,0 L 100,600
+                       M 101,0 L 101,600
+                       M 102,0 L 102,600
+                       M 103,0 L 103,600
+                       M 104,0 L 104,600
+                       M 105,0 L 105,600
+                       M 106,0 L 106,600
+                       M 107,0 L 107,600
+                       M 108,0 L 108,600
+                       M 109,0 L 109,600
+                       M 110,0 L 110,600
+                       M 111,0 L 111,600
+                       M 112,0 L 112,600
+                       M 113,0 L 113,600
+                       M 114,0 L 114,600
+                       M 115,0 L 115,600
+                       M 116,0 L 116,600
+                       M 117,0 L 117,600
+                       M 118,0 L 118,600
+                       M 119,0 L 119,600
+                       M 120,0 L 120,600
+                       M 121,0 L 121,600
+                       M 122,0 L 122,600
+                       M 123,0 L 123,600
+                       M 124,0 L 124,600
+                       M 125,0 L 125,600
+                       M 126,0 L 126,600
+                       M 127,0 L 127,600
+                       M 128,0 L 128,600
+                       M 129,0 L 129,600
+                       M 130,0 L 130,600
+                       M 131,0 L 131,600
+                       M 132,0 L 132,600
+                       M 133,0 L 133,600
+                       M 134,0 L 134,600
+                       M 135,0 L 135,600
+                       M 136,0 L 136,600
+                       M 137,0 L 137,600
+                       M 138,0 L 138,600
+                       M 139,0 L 139,600
+                       M 140,0 L 140,600
+                       M 141,0 L 141,600
+                       M 142,0 L 142,600
+                       M 143,0 L 143,600
+                       M 144,0 L 144,600
+                       M 145,0 L 145,600
+                       M 146,0 L 146,600
+                       M 147,0 L 147,600
+                       M 148,0 L 148,600
+                       M 149,0 L 149,600
+                       M 150,0 L 150,600
+                       M 151,0 L 151,600
+                       M 152,0 L 152,600
+                       M 153,0 L 153,600
+                       M 154,0 L 154,600
+                       M 155,0 L 155,600
+                       M 156,0 L 156,600
+                       M 157,0 L 157,600
+                       M 158,0 L 158,600
+                       M 159,0 L 159,600
+                       M 160,0 L 160,600
+                       M 161,0 L 161,600
+                       M 162,0 L 162,600
+                       M 163,0 L 163,600
+                       M 164,0 L 164,600
+                       M 165,0 L 165,600
+                       M 166,0 L 166,600
+                       M 167,0 L 167,600
+                       M 168,0 L 168,600
+                       M 169,0 L 169,600
+                       M 170,0 L 170,600
+                       M 171,0 L 171,600
+                       M 172,0 L 172,600
+                       M 173,0 L 173,600
+                       M 174,0 L 174,600
+                       M 175,0 L 175,600
+                       M 176,0 L 176,600
+                       M 177,0 L 177,600
+                       M 178,0 L 178,600
+                       M 179,0 L 179,600
+                       M 180,0 L 180,600
+                       M 181,0 L 181,600
+                       M 182,0 L 182,600
+                       M 183,0 L 183,600
+                       M 184,0 L 184,600
+                       M 185,0 L 185,600
+                       M 186,0 L 186,600
+                       M 187,0 L 187,600
+                       M 188,0 L 188,600
+                       M 189,0 L 189,600
+                       M 190,0 L 190,600
+                       M 191,0 L 191,600
+                       M 192,0 L 192,600
+                       M 193,0 L 193,600
+                       M 194,0 L 194,600
+                       M 195,0 L 195,600
+                       M 196,0 L 196,600
+                       M 197,0 L 197,600
+                       M 198,0 L 198,600
+                       M 199,0 L 199,600
+                       M 200,0 L 200,600
+                       M 201,0 L 201,600
+                       M 202,0 L 202,600
+                       M 203,0 L 203,600
+                       M 204,0 L 204,600
+                       M 205,0 L 205,600
+                       M 206,0 L 206,600
+                       M 207,0 L 207,600
+                       M 208,0 L 208,600
+                       M 209,0 L 209,600
+                       M 210,0 L 210,600
+                       M 211,0 L 211,600
+                       M 212,0 L 212,600
+                       M 213,0 L 213,600
+                       M 214,0 L 214,600
+                       M 215,0 L 215,600
+                       M 216,0 L 216,600
+                       M 217,0 L 217,600
+                       M 218,0 L 218,600
+                       M 219,0 L 219,600
+                       M 220,0 L 220,600
+                       M 221,0 L 221,600
+                       M 222,0 L 222,600
+                       M 223,0 L 223,600
+                       M 224,0 L 224,600
+                       M 225,0 L 225,600
+                       M 226,0 L 226,600
+                       M 227,0 L 227,600
+                       M 228,0 L 228,600
+                       M 229,0 L 229,600
+                       M 230,0 L 230,600
+                       M 231,0 L 231,600
+                       M 232,0 L 232,600
+                       M 233,0 L 233,600
+                       M 234,0 L 234,600
+                       M 235,0 L 235,600
+                       M 236,0 L 236,600
+                       M 237,0 L 237,600
+                       M 238,0 L 238,600
+                       M 239,0 L 239,600
+                       M 240,0 L 240,600
+                       M 241,0 L 241,600
+                       M 242,0 L 242,600
+                       M 243,0 L 243,600
+                       M 244,0 L 244,600
+                       M 245,0 L 245,600
+                       M 246,0 L 246,600
+                       M 247,0 L 247,600
+                       M 248,0 L 248,600
+                       M 249,0 L 249,600
+                       M 250,0 L 250,600
+                       M 251,0 L 251,600
+                       M 252,0 L 252,600
+                       M 253,0 L 253,600
+                       M 254,0 L 254,600
+                       M 255,0 L 255,600
+                       M 256,0 L 256,600
+                       M 257,0 L 257,600
+                       M 258,0 L 258,600
+                       M 259,0 L 259,600
+                       M 260,0 L 260,600
+                       M 261,0 L 261,600
+                       M 262,0 L 262,600
+                       M 263,0 L 263,600
+                       M 264,0 L 264,600
+                       M 265,0 L 265,600
+                       M 266,0 L 266,600
+                       M 267,0 L 267,600
+                       M 268,0 L 268,600
+                       M 269,0 L 269,600
+                       M 270,0 L 270,600
+                       M 271,0 L 271,600
+                       M 272,0 L 272,600
+                       M 273,0 L 273,600
+                       M 274,0 L 274,600
+                       M 275,0 L 275,600
+                       M 276,0 L 276,600
+                       M 277,0 L 277,600
+                       M 278,0 L 278,600
+                       M 279,0 L 279,600
+                       M 280,0 L 280,600
+                       M 281,0 L 281,600
+                       M 282,0 L 282,600
+                       M 283,0 L 283,600
+                       M 284,0 L 284,600
+                       M 285,0 L 285,600
+                       M 286,0 L 286,600
+                       M 287,0 L 287,600
+                       M 288,0 L 288,600
+                       M 289,0 L 289,600
+                       M 290,0 L 290,600
+                       M 291,0 L 291,600
+                       M 292,0 L 292,600
+                       M 293,0 L 293,600
+                       M 294,0 L 294,600
+                       M 295,0 L 295,600
+                       M 296,0 L 296,600
+                       M 297,0 L 297,600
+                       M 298,0 L 298,600
+                       M 299,0 L 299,600
+                       M 300,0 L 300,600
+                       M 301,0 L 301,600
+                       M 302,0 L 302,600
+                       M 303,0 L 303,600
+                       M 304,0 L 304,600
+                       M 305,0 L 305,600
+                       M 306,0 L 306,600
+                       M 307,0 L 307,600
+                       M 308,0 L 308,600
+                       M 309,0 L 309,600
+                       M 310,0 L 310,600
+                       M 311,0 L 311,600
+                       M 312,0 L 312,600
+                       M 313,0 L 313,600
+                       M 314,0 L 314,600
+                       M 315,0 L 315,600
+                       M 316,0 L 316,600
+                       M 317,0 L 317,600
+                       M 318,0 L 318,600
+                       M 319,0 L 319,600
+                       M 320,0 L 320,600
+                       M 321,0 L 321,600
+                       M 322,0 L 322,600
+                       M 323,0 L 323,600
+                       M 324,0 L 324,600
+                       M 325,0 L 325,600
+                       M 326,0 L 326,600
+                       M 327,0 L 327,600
+                       M 328,0 L 328,600
+                       M 329,0 L 329,600
+                       M 330,0 L 330,600
+                       M 331,0 L 331,600
+                       M 332,0 L 332,600
+                       M 333,0 L 333,600
+                       M 334,0 L 334,600
+                       M 335,0 L 335,600
+                       M 336,0 L 336,600
+                       M 337,0 L 337,600
+                       M 338,0 L 338,600
+                       M 339,0 L 339,600
+                       M 340,0 L 340,600
+                       M 341,0 L 341,600
+                       M 342,0 L 342,600
+                       M 343,0 L 343,600
+                       M 344,0 L 344,600
+                       M 345,0 L 345,600
+                       M 346,0 L 346,600
+                       M 347,0 L 347,600
+                       M 348,0 L 348,600
+                       M 349,0 L 349,600
+                       M 350,0 L 350,600
+                       M 351,0 L 351,600
+                       M 352,0 L 352,600
+                       M 353,0 L 353,600
+                       M 354,0 L 354,600
+                       M 355,0 L 355,600
+                       M 356,0 L 356,600
+                       M 357,0 L 357,600
+                       M 358,0 L 358,600
+                       M 359,0 L 359,600
+                       M 360,0 L 360,600
+                       M 361,0 L 361,600
+                       M 362,0 L 362,600
+                       M 363,0 L 363,600
+                       M 364,0 L 364,600
+                       M 365,0 L 365,600
+                       M 366,0 L 366,600
+                       M 367,0 L 367,600
+                       M 368,0 L 368,600
+                       M 369,0 L 369,600
+                       M 370,0 L 370,600
+                       M 371,0 L 371,600
+                       M 372,0 L 372,600
+                       M 373,0 L 373,600
+                       M 374,0 L 374,600
+                       M 375,0 L 375,600
+                       M 376,0 L 376,600
+                       M 377,0 L 377,600
+                       M 378,0 L 378,600
+                       M 379,0 L 379,600
+                       M 380,0 L 380,600
+                       M 381,0 L 381,600
+                       M 382,0 L 382,600
+                       M 383,0 L 383,600
+                       M 384,0 L 384,600
+                       M 385,0 L 385,600
+                       M 386,0 L 386,600
+                       M 387,0 L 387,600
+                       M 388,0 L 388,600
+                       M 389,0 L 389,600
+                       M 390,0 L 390,600
+                       M 391,0 L 391,600
+                       M 392,0 L 392,600
+                       M 393,0 L 393,600
+                       M 394,0 L 394,600
+                       M 395,0 L 395,600
+                       M 396,0 L 396,600
+                       M 397,0 L 397,600
+                       M 398,0 L 398,600
+                       M 399,0 L 399,600
+                       M 400,0 L 400,600
+                       M 401,0 L 401,600
+                       M 402,0 L 402,600
+                       M 403,0 L 403,600
+                       M 404,0 L 404,600
+                       M 405,0 L 405,600
+                       M 406,0 L 406,600
+                       M 407,0 L 407,600
+                       M 408,0 L 408,600
+                       M 409,0 L 409,600
+                       M 410,0 L 410,600
+                       M 411,0 L 411,600
+                       M 412,0 L 412,600
+                       M 413,0 L 413,600
+                       M 414,0 L 414,600
+                       M 415,0 L 415,600
+                       M 416,0 L 416,600
+                       M 417,0 L 417,600
+                       M 418,0 L 418,600
+                       M 419,0 L 419,600
+                       M 420,0 L 420,600
+                       M 421,0 L 421,600
+                       M 422,0 L 422,600
+                       M 423,0 L 423,600
+                       M 424,0 L 424,600
+                       M 425,0 L 425,600
+                       M 426,0 L 426,600
+                       M 427,0 L 427,600
+                       M 428,0 L 428,600
+                       M 429,0 L 429,600
+                       M 430,0 L 430,600
+                       M 431,0 L 431,600
+                       M 432,0 L 432,600
+                       M 433,0 L 433,600
+                       M 434,0 L 434,600
+                       M 435,0 L 435,600
+                       M 436,0 L 436,600
+                       M 437,0 L 437,600
+                       M 438,0 L 438,600
+                       M 439,0 L 439,600
+                       M 440,0 L 440,600
+                       M 441,0 L 441,600
+                       M 442,0 L 442,600
+                       M 443,0 L 443,600
+                       M 444,0 L 444,600
+                       M 445,0 L 445,600
+                       M 446,0 L 446,600
+                       M 447,0 L 447,600
+                       M 448,0 L 448,600
+                       M 449,0 L 449,600
+                       M 450,0 L 450,600
+                       M 451,0 L 451,600
+                       M 452,0 L 452,600
+                       M 453,0 L 453,600
+                       M 454,0 L 454,600
+                       M 455,0 L 455,600
+                       M 456,0 L 456,600
+                       M 457,0 L 457,600
+                       M 458,0 L 458,600
+                       M 459,0 L 459,600
+                       M 460,0 L 460,600
+                       M 461,0 L 461,600
+                       M 462,0 L 462,600
+                       M 463,0 L 463,600
+                       M 464,0 L 464,600
+                       M 465,0 L 465,600
+                       M 466,0 L 466,600
+                       M 467,0 L 467,600
+                       M 468,0 L 468,600
+                       M 469,0 L 469,600
+                       M 470,0 L 470,600
+                       M 471,0 L 471,600
+                       M 472,0 L 472,600
+                       M 473,0 L 473,600
+                       M 474,0 L 474,600
+                       M 475,0 L 475,600
+                       M 476,0 L 476,600
+                       M 477,0 L 477,600
+                       M 478,0 L 478,600
+                       M 479,0 L 479,600
+                       M 480,0 L 480,600
+                       M 481,0 L 481,600
+                       M 482,0 L 482,600
+                       M 483,0 L 483,600
+                       M 484,0 L 484,600
+                       M 485,0 L 485,600
+                       M 486,0 L 486,600
+                       M 487,0 L 487,600
+                       M 488,0 L 488,600
+                       M 489,0 L 489,600
+                       M 490,0 L 490,600
+                       M 491,0 L 491,600
+                       M 492,0 L 492,600
+                       M 493,0 L 493,600
+                       M 494,0 L 494,600
+                       M 495,0 L 495,600
+                       M 496,0 L 496,600
+                       M 497,0 L 497,600
+                       M 498,0 L 498,600
+                       M 499,0 L 499,600
+                       M 500,0 L 500,600
+                       M 501,0 L 501,600
+                       M 502,0 L 502,600
+                       M 503,0 L 503,600
+                       M 504,0 L 504,600
+                       M 505,0 L 505,600
+                       M 506,0 L 506,600
+                       M 507,0 L 507,600
+                       M 508,0 L 508,600
+                       M 509,0 L 509,600
+                       M 510,0 L 510,600
+                       M 511,0 L 511,600
+                       M 512,0 L 512,600
+                       M 513,0 L 513,600
+                       M 514,0 L 514,600
+                       M 515,0 L 515,600
+                       M 516,0 L 516,600
+                       M 517,0 L 517,600
+                       M 518,0 L 518,600
+                       M 519,0 L 519,600
+                       M 520,0 L 520,600
+                       M 521,0 L 521,600
+                       M 522,0 L 522,600
+                       M 523,0 L 523,600
+                       M 524,0 L 524,600
+                       M 525,0 L 525,600
+                       M 526,0 L 526,600
+                       M 527,0 L 527,600
+                       M 528,0 L 528,600
+                       M 529,0 L 529,600
+                       M 530,0 L 530,600
+                       M 531,0 L 531,600
+                       M 532,0 L 532,600
+                       M 533,0 L 533,600
+                       M 534,0 L 534,600
+                       M 535,0 L 535,600
+                       M 536,0 L 536,600
+                       M 537,0 L 537,600
+                       M 538,0 L 538,600
+                       M 539,0 L 539,600
+                       M 540,0 L 540,600
+                       M 541,0 L 541,600
+                       M 542,0 L 542,600
+                       M 543,0 L 543,600
+                       M 544,0 L 544,600
+                       M 545,0 L 545,600
+                       M 546,0 L 546,600
+                       M 547,0 L 547,600
+                       M 548,0 L 548,600
+                       M 549,0 L 549,600
+                       M 550,0 L 550,600
+                       M 551,0 L 551,600
+                       M 552,0 L 552,600
+                       M 553,0 L 553,600
+                       M 554,0 L 554,600
+                       M 555,0 L 555,600
+                       M 556,0 L 556,600
+                       M 557,0 L 557,600
+                       M 558,0 L 558,600
+                       M 559,0 L 559,600
+                       M 560,0 L 560,600
+                       M 561,0 L 561,600
+                       M 562,0 L 562,600
+                       M 563,0 L 563,600
+                       M 564,0 L 564,600
+                       M 565,0 L 565,600
+                       M 566,0 L 566,600
+                       M 567,0 L 567,600
+                       M 568,0 L 568,600
+                       M 569,0 L 569,600
+                       M 570,0 L 570,600
+                       M 571,0 L 571,600
+                       M 572,0 L 572,600
+                       M 573,0 L 573,600
+                       M 574,0 L 574,600
+                       M 575,0 L 575,600
+                       M 576,0 L 576,600
+                       M 577,0 L 577,600
+                       M 578,0 L 578,600
+                       M 579,0 L 579,600
+                       M 580,0 L 580,600
+                       M 581,0 L 581,600
+                       M 582,0 L 582,600
+                       M 583,0 L 583,600
+                       M 584,0 L 584,600
+                       M 585,0 L 585,600
+                       M 586,0 L 586,600
+                       M 587,0 L 587,600
+                       M 588,0 L 588,600
+                       M 589,0 L 589,600
+                       M 590,0 L 590,600
+                       M 591,0 L 591,600
+                       M 592,0 L 592,600
+                       M 593,0 L 593,600
+                       M 594,0 L 594,600
+                       M 595,0 L 595,600
+                       M 596,0 L 596,600
+                       M 597,0 L 597,600
+                       M 598,0 L 598,600
+                       M 599,0 L 599,600
+                       M 600,0 L 600,600
+                       M 601,0 L 601,600
+                       M 602,0 L 602,600
+                       M 603,0 L 603,600
+                       M 604,0 L 604,600
+                       M 605,0 L 605,600
+                       M 606,0 L 606,600
+                       M 607,0 L 607,600
+                       M 608,0 L 608,600
+                       M 609,0 L 609,600
+                       M 610,0 L 610,600
+                       M 611,0 L 611,600
+                       M 612,0 L 612,600
+                       M 613,0 L 613,600
+                       M 614,0 L 614,600
+                       M 615,0 L 615,600
+                       M 616,0 L 616,600
+                       M 617,0 L 617,600
+                       M 618,0 L 618,600
+                       M 619,0 L 619,600
+                       M 620,0 L 620,600
+                       M 621,0 L 621,600
+                       M 622,0 L 622,600
+                       M 623,0 L 623,600
+                       M 624,0 L 624,600
+                       M 625,0 L 625,600
+                       M 626,0 L 626,600
+                       M 627,0 L 627,600
+                       M 628,0 L 628,600
+                       M 629,0 L 629,600
+                       M 630,0 L 630,600
+                       M 631,0 L 631,600
+                       M 632,0 L 632,600
+                       M 633,0 L 633,600
+                       M 634,0 L 634,600
+                       M 635,0 L 635,600
+                       M 636,0 L 636,600
+                       M 637,0 L 637,600
+                       M 638,0 L 638,600
+                       M 639,0 L 639,600
+                       M 640,0 L 640,600
+                       M 641,0 L 641,600
+                       M 642,0 L 642,600
+                       M 643,0 L 643,600
+                       M 644,0 L 644,600
+                       M 645,0 L 645,600
+                       M 646,0 L 646,600
+                       M 647,0 L 647,600
+                       M 648,0 L 648,600
+                       M 649,0 L 649,600
+                       M 650,0 L 650,600
+                       M 651,0 L 651,600
+                       M 652,0 L 652,600
+                       M 653,0 L 653,600
+                       M 654,0 L 654,600
+                       M 655,0 L 655,600
+                       M 656,0 L 656,600
+                       M 657,0 L 657,600
+                       M 658,0 L 658,600
+                       M 659,0 L 659,600
+                       M 660,0 L 660,600
+                       M 661,0 L 661,600
+                       M 662,0 L 662,600
+                       M 663,0 L 663,600
+                       M 664,0 L 664,600
+                       M 665,0 L 665,600
+                       M 666,0 L 666,600
+                       M 667,0 L 667,600
+                       M 668,0 L 668,600
+                       M 669,0 L 669,600
+                       M 670,0 L 670,600
+                       M 671,0 L 671,600
+                       M 672,0 L 672,600
+                       M 673,0 L 673,600
+                       M 674,0 L 674,600
+                       M 675,0 L 675,600
+                       M 676,0 L 676,600
+                       M 677,0 L 677,600
+                       M 678,0 L 678,600
+                       M 679,0 L 679,600
+                       M 680,0 L 680,600
+                       M 681,0 L 681,600
+                       M 682,0 L 682,600
+                       M 683,0 L 683,600
+                       M 684,0 L 684,600
+                       M 685,0 L 685,600
+                       M 686,0 L 686,600
+                       M 687,0 L 687,600
+                       M 688,0 L 688,600
+                       M 689,0 L 689,600
+                       M 690,0 L 690,600
+                       M 691,0 L 691,600
+                       M 692,0 L 692,600
+                       M 693,0 L 693,600
+                       M 694,0 L 694,600
+                       M 695,0 L 695,600
+                       M 696,0 L 696,600
+                       M 697,0 L 697,600
+                       M 698,0 L 698,600
+                       M 699,0 L 699,600
+                       M 700,0 L 700,600
+                       M 701,0 L 701,600
+                       M 702,0 L 702,600
+                       M 703,0 L 703,600
+                       M 704,0 L 704,600
+                       M 705,0 L 705,600
+                       M 706,0 L 706,600
+                       M 707,0 L 707,600
+                       M 708,0 L 708,600
+                       M 709,0 L 709,600
+                       M 710,0 L 710,600
+                       M 711,0 L 711,600
+                       M 712,0 L 712,600
+                       M 713,0 L 713,600
+                       M 714,0 L 714,600
+                       M 715,0 L 715,600
+                       M 716,0 L 716,600
+                       M 717,0 L 717,600
+                       M 718,0 L 718,600
+                       M 719,0 L 719,600
+                       M 720,0 L 720,600
+                       M 721,0 L 721,600
+                       M 722,0 L 722,600
+                       M 723,0 L 723,600
+                       M 724,0 L 724,600
+                       M 725,0 L 725,600
+                       M 726,0 L 726,600
+                       M 727,0 L 727,600
+                       M 728,0 L 728,600
+                       M 729,0 L 729,600
+                       M 730,0 L 730,600
+                       M 731,0 L 731,600
+                       M 732,0 L 732,600
+                       M 733,0 L 733,600
+                       M 734,0 L 734,600
+                       M 735,0 L 735,600
+                       M 736,0 L 736,600
+                       M 737,0 L 737,600
+                       M 738,0 L 738,600
+                       M 739,0 L 739,600
+                       M 740,0 L 740,600
+                       M 741,0 L 741,600
+                       M 742,0 L 742,600
+                       M 743,0 L 743,600
+                       M 744,0 L 744,600
+                       M 745,0 L 745,600
+                       M 746,0 L 746,600
+                       M 747,0 L 747,600
+                       M 748,0 L 748,600
+                       M 749,0 L 749,600
+                       M 750,0 L 750,600
+                       M 751,0 L 751,600
+                       M 752,0 L 752,600
+                       M 753,0 L 753,600
+                       M 754,0 L 754,600
+                       M 755,0 L 755,600
+                       M 756,0 L 756,600
+                       M 757,0 L 757,600
+                       M 758,0 L 758,600
+                       M 759,0 L 759,600
+                       M 760,0 L 760,600
+                       M 761,0 L 761,600
+                       M 762,0 L 762,600
+                       M 763,0 L 763,600
+                       M 764,0 L 764,600
+                       M 765,0 L 765,600
+                       M 766,0 L 766,600
+                       M 767,0 L 767,600
+                       M 768,0 L 768,600
+                       M 769,0 L 769,600
+                       M 770,0 L 770,600
+                       M 771,0 L 771,600
+                       M 772,0 L 772,600
+                       M 773,0 L 773,600
+                       M 774,0 L 774,600
+                       M 775,0 L 775,600
+                       M 776,0 L 776,600
+                       M 777,0 L 777,600
+                       M 778,0 L 778,600
+                       M 779,0 L 779,600
+                       M 780,0 L 780,600
+                       M 781,0 L 781,600
+                       M 782,0 L 782,600
+                       M 783,0 L 783,600
+                       M 784,0 L 784,600
+                       M 785,0 L 785,600
+                       M 786,0 L 786,600
+                       M 787,0 L 787,600
+                       M 788,0 L 788,600
+                       M 789,0 L 789,600
+                       M 790,0 L 790,600
+                       M 791,0 L 791,600
+                       M 792,0 L 792,600
+                       M 793,0 L 793,600
+                       M 794,0 L 794,600
+                       M 795,0 L 795,600
+                       M 796,0 L 796,600
+                       M 797,0 L 797,600
+                       M 798,0 L 798,600
+                       M 799,0 L 799,600
+                       M 800,0 L 800,600
+               " style="stroke:#aaaaff;stroke-width:1px; fill:none;"/>
+</svg>
index 4f27d5f..63a743e 100644 (file)
@@ -2,8 +2,8 @@
 #define _TRANSFORMATIONTYPE_H
 
 #ifdef QUADTREE_DISABLED
-#define TRANSFORM_OBJECTS_NOT_VIEW
-#define TRANSFORM_BEZIERS_TO_PATH
+//#define TRANSFORM_OBJECTS_NOT_VIEW
+//#define TRANSFORM_BEZIERS_TO_PATH
 #endif
 
 #endif
index 09b7f2c..3de7fb4 100644 (file)
@@ -25,11 +25,12 @@ using namespace std;
  * @param colour - Colour to use for rendering this view. TODO: Make sure this actually works, or just remove it
  */
 View::View(Document & document, Screen & screen, const VRect & bounds, const Colour & colour)
-       : m_use_gpu_transform(USE_GPU_TRANSFORM), m_use_gpu_rendering(USE_GPU_RENDERING), m_bounds_dirty(true), m_buffer_dirty(true), 
+       : m_use_gpu_transform(false), m_use_gpu_rendering(USE_GPU_RENDERING), m_bounds_dirty(true), m_buffer_dirty(true), 
                m_render_dirty(true), m_document(document), m_screen(screen), m_cached_display(), m_bounds(bounds), m_colour(colour), m_bounds_ubo(), 
                m_objbounds_vbo(), m_object_renderers(NUMBER_OF_OBJECT_TYPES), m_cpu_rendering_pixels(NULL),
                m_perform_shading(USE_SHADING), m_show_bezier_bounds(false), m_show_bezier_type(false),
-               m_show_fill_points(false), m_show_fill_bounds(false), m_lazy_rendering(true)
+               m_show_fill_points(false), m_show_fill_bounds(false), m_lazy_rendering(true),
+               m_query_gpu_bounds_on_next_frame(NULL)
 {
        Debug("View Created - Bounds => {%s}", m_bounds.Str().c_str());
 
@@ -109,6 +110,14 @@ void View::Translate(Real x, Real y)
  */
 void View::SetBounds(const Rect & bounds)
 {
+       #ifdef TRANSFORM_OBJECTS_NOT_VIEW
+       ObjectType type = NUMBER_OF_OBJECT_TYPES;
+       #ifdef TRANSFORM_BEZIERS_TO_PATH
+               type = PATH;
+       #endif
+       SVGMatrix transform = {Real(m_bounds.w)/bounds.w, 0, Real(m_bounds.x) - bounds.x, 0,Real(m_bounds.h)/bounds.h, Real(m_bounds.y) - bounds.y};
+       m_document.TransformObjectBounds(transform, type);
+       #endif
        m_bounds.x = bounds.x;
        m_bounds.y = bounds.y;
        m_bounds.w = bounds.w;
@@ -512,6 +521,11 @@ void View::RenderRange(int width, int height, unsigned first_obj, unsigned last_
 
 void View::UpdateObjBoundsVBO(unsigned first_obj, unsigned last_obj)
 {
+       if (m_query_gpu_bounds_on_next_frame != NULL)
+       {
+               fprintf(m_query_gpu_bounds_on_next_frame,"# View: %s\t%s\t%s\t%s", Str(m_bounds.x).c_str(), Str(m_bounds.y).c_str(), Str(m_bounds.w).c_str(), Str(m_bounds.h).c_str());
+       }       
+       
        //m_objbounds_vbo.Invalidate();
        m_objbounds_vbo.SetType(GraphicsBuffer::BufferTypeVertex);
        m_objbounds_vbo.SetName("Object Bounds VBO");
@@ -549,6 +563,11 @@ void View::UpdateObjBoundsVBO(unsigned first_obj, unsigned last_obj)
                        Float(obj_bounds.y + obj_bounds.h)
                };
 
+               if (m_query_gpu_bounds_on_next_frame != NULL)
+               {       
+                       fprintf(m_query_gpu_bounds_on_next_frame,"%d\t%f\t%f\t%f\t%f\n", id, Float(obj_bounds.x), Float(obj_bounds.y), Float(obj_bounds.w), Float(obj_bounds.h));
+               }
+               
                obj_bounds_builder.Add(gpu_bounds);
        }
        #else
@@ -556,6 +575,10 @@ void View::UpdateObjBoundsVBO(unsigned first_obj, unsigned last_obj)
        {
                Path & path = m_document.m_objects.paths[i];
                Rect & pbounds = path.GetBounds(m_document.m_objects); // Not very efficient...
+               //TODO: Add clipping here
+               //if (!pbounds.Intersects(Rect(0,0,1,1)) || pbounds.w < Real(1)/Real(800))
+               //      continue;
+
                for (unsigned id = path.m_start; id <= path.m_end; ++id)
                {
                        if (id < first_obj || id >= last_obj)
@@ -580,6 +603,11 @@ void View::UpdateObjBoundsVBO(unsigned first_obj, unsigned last_obj)
                        };
                        obj_bounds_builder.Add(gpu_bounds);
                        //Debug("Path %d %s -> %s via %s", id, m_document.m_objects.bounds[id].Str().c_str(), obj_bounds.Str().c_str(), pbounds.Str().c_str()); 
+                       
+                       if (m_query_gpu_bounds_on_next_frame != NULL)
+                       {
+                               fprintf(m_query_gpu_bounds_on_next_frame,"%d\t%f\t%f\t%f\t%f\n", id, ClampFloat(obj_bounds.x), ClampFloat(obj_bounds.y), ClampFloat(obj_bounds.w), ClampFloat(obj_bounds.h));
+                       }
                }
                GPUObjBounds p_gpu_bounds = {
                                ClampFloat(pbounds.x),
@@ -590,6 +618,12 @@ void View::UpdateObjBoundsVBO(unsigned first_obj, unsigned last_obj)
                obj_bounds_builder.Add(p_gpu_bounds);
        }
        #endif
+       if (m_query_gpu_bounds_on_next_frame != NULL)
+       {
+               if (m_query_gpu_bounds_on_next_frame != stdout && m_query_gpu_bounds_on_next_frame != stderr)
+                       fclose(m_query_gpu_bounds_on_next_frame);
+               m_query_gpu_bounds_on_next_frame = NULL;
+       }
        m_objbounds_vbo.UnMap();
 }
 /**
@@ -660,3 +694,14 @@ void View::SaveGPUBMP(const char * filename)
        m_screen.ScreenShot(filename);
        SetGPURendering(prev);  
 }
+
+void View::QueryGPUBounds(const char * filename, const char * mode)
+{
+       m_query_gpu_bounds_on_next_frame = fopen(filename, mode); 
+       Debug("File: %s", filename);
+       if (m_query_gpu_bounds_on_next_frame == NULL)
+               Error("Couldn't open file \"%s\" : %s", filename, strerror(errno));
+       ForceBoundsDirty(); 
+       ForceBufferDirty(); 
+       ForceRenderDirty();
+}
index 4bcff89..712b95a 100644 (file)
@@ -8,14 +8,13 @@
 #include "path.h"
 #include "transformationtype.h"
 
-#define USE_GPU_TRANSFORM tru
+#define USE_GPU_TRANSFORM fals
 #define USE_GPU_RENDERING true
 #define USE_SHADING !(USE_GPU_RENDERING) && true
 
-#ifdef TRANSFORM_BEZIERS_TO_PATH
+
 #include "gmprat.h"
-#include "paranoidnumber.h"
-#endif
+
 
 namespace IPDF
 {
@@ -73,6 +72,8 @@ namespace IPDF
                        void ForceBufferDirty() {m_buffer_dirty = true;}                
                        void ForceRenderDirty() {m_render_dirty = true;}
                        
+                       void QueryGPUBounds(const char * filename, const char * mode="r");
+                       
                        void SetLazyRendering(bool state = true) {m_lazy_rendering = state;}
                        bool UsingLazyRendering() const {return m_lazy_rendering;}
                        
@@ -89,6 +90,8 @@ namespace IPDF
                                float x0, y0;
                                float x1, y1;
                        } __attribute__((packed));
+                       
+                       
 
                        void PrepareRender(); // call when m_render_dirty is true
                        void UpdateObjBoundsVBO(unsigned first_obj, unsigned last_obj); // call when m_buffer_dirty is true
@@ -127,6 +130,8 @@ namespace IPDF
                        bool m_show_fill_bounds;
                        
                        bool m_lazy_rendering;// don't redraw frames unless we need to
+                       
+                       FILE * m_query_gpu_bounds_on_next_frame;
 
 
 #ifndef QUADTREE_DISABLED
index a91b2f4..2fc7ea7 100644 (file)
@@ -24,7 +24,7 @@
        ]
       }
      ],
-     "prompt_number": 1
+     "prompt_number": 2
     },
     {
      "cell_type": "code",
@@ -35,7 +35,7 @@
      "language": "python",
      "metadata": {},
      "outputs": [],
-     "prompt_number": 2
+     "prompt_number": 3
     },
     {
      "cell_type": "markdown",
         "[*****************67%*****             ]  2 of 3 complete"
        ]
       },
+      {
+       "metadata": {},
+       "output_type": "display_data",
+       "text": [
+        "'Failed to build GMPrat'"
+       ]
+      },
       {
        "output_type": "stream",
        "stream": "stdout",
      "metadata": {},
      "outputs": [
       {
-       "metadata": {},
-       "output_type": "display_data",
-       "text": [
-        "'Precision vs Zoom of \"svg-tests/fox-vector.svg\" using single'"
-       ]
-      },
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        " \r",
-        "[****************100%******************]  100 of 100 complete"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "iVBORw0KGgoAAAANSUhEUgAAAlsAAAHNCAYAAAApEr6yAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XtYVWXe//HPJjRT8IAiGKh4JjwyleZkSYNYTUqaM4x4\nGBo7TOMhc5pDNU5ipWKHMa2xx8qMPIQ2/kKaGjQnMfNEU5ajWFhhoaKlgKEmKHx/f/S0n1BOKsu9\nwffrurgu9rrXuu/vvvcCPqy19touMzMBAADAET6eLgAAAKA+I2wBAAA4iLAFAADgIMIWAACAgwhb\nAAAADiJsAQAAOIiwBUlSWFiY/v3vf59XHy+//LIuueQSNW3aVJ9++mktVQYAuJCKi4vl5+enhg0b\n6q9//auny6kXCFseFBYWpsaNG8vf318BAQEaMmSI9u7d65FaXC6XXC7Xefdz7bXX6ttvv1W3bt3c\ny+bMmaM2bdqoWbNmuuOOO1RSUlLp9j4+PvLz85O/v7/8/f11991313js/Px8DR8+XH5+fgoLC9Or\nr75a6bo/BMMfxvH399e7775b47FefPFFdenSRf7+/rr55puVl5dX6bq7du3Sz372MzVv3lxdunRR\nampqjfsqLCxUQkKCgoKCFBQUpOnTp5fbdtOmTerbt6+aNm2q3r17a+PGjeXaZ8yYofbt26tZs2aK\nj49XUVGRu23fvn269dZb1bJlS7Vt21YLFiwot+0bb7yhHj16yN/fX9dee6127drlbisuLtaUKVMU\nEhKigIAATZgwQadOnfKK5/z888+rc+fOatasma6++upy7cXFxRo3bpyaNWumNm3aaM6cOe62w4cP\n69prr1WrVq3UrFkzRUZGnlH32ahqrA0bNpTb9/z9/eXj46PXX3+9Rn1XN7+n1+Gtr1V93D937typ\nqKgoNW/eXG3bttVjjz1Wrn3ZsmVq3769/Pz8NHz4cBUUFLjb/vSnP6ldu3Zq2rSpQkND9fvf/75c\n3WerqrG6d+9ebv9r0KCBYmNjJUmXXnqpjh49qtGjR9fK3wVIMnhMWFiY/fvf/zYzsxMnTti4ceNs\n2LBhHq/lXC1atMgGDBhQbll6eroFBQVZVlaWFRQUWFRUlD3wwAOV9uFyueyLL744p/FHjhxpI0eO\ntGPHjtl7771nzZo1s507d1Za63XXXXdO46xbt85at25tWVlZVlJSYr/73e9s4MCBFa578uRJ69Kl\ni82ZM8fKysrsnXfesSZNmlh2dnaN+rr99tstLi7OvvvuO9uzZ4916tTJFi1aZGZmhw8ftoCAAPvH\nP/5hZWVltmTJEmvRooUVFBSYmdnLL79s4eHhtnfvXjt69KjdeuutlpCQ4O47KirKpkyZYqdOnbKP\nP/7YAgICbN26dWZmlp2dbU2bNrWNGzdaaWmpzZo1yzp37mylpaVmZpaYmGjXX3+9FRQU2DfffGPX\nXHONTZs2zePPedu2bebn52cffvihmZk999xzFhgYaGVlZWZm9sADD9j1119vhYWFtmvXLgsODrb0\n9HQz+/5n8JNPPnE/x9TUVGvQoIEVFRWdxd7xf6oa63QZGRnm7+9vx48fr7bf6ub3dN76WtXH/dPM\nLDIy0qZOnWplZWX2+eefW5s2bSwtLc3MzHbs2GH+/v62YcMGO3r0qI0aNcpGjhzp3vaTTz5x72/7\n9u2z7t2723PPPVftPlGR6sY6XYcOHWzx4sXllt1+++02derUcxof5RG2POj0gPPmm29a165d3Y8L\nCwtt7NixFhgYaO3bt7fHHnvM/Udj2rRpNmbMGPe6OTk55nK53L9sBg4caH/961/t2muvNX9/fxs8\neLAdOnTIvf4rr7xi7dq1s5YtW9qMGTPK1bJ161a78sorrWnTphYUFGS///3va/R8Kgpb8fHx9pe/\n/MX9+J133rHg4OBK+3C5XPbZZ5/VaLwfO3r0qDVs2NB2797tXvbrX/+60mBXUa01df/999uECRPc\nj/fv319pSPzvf/9rfn5+5ZYNHjzY/vrXv9aor1atWtn777/vbp85c6Y7JL7xxhsWERFRru+uXbva\nwoULzcxsxIgR9sQTT7jbNm3aZI0aNbLvvvvOioqKzOVy2TfffONuv/vuu23s2LFmZvbMM8/YLbfc\n4m4rKyuzyy67zN555x0zM7vqqqvstddec7cvW7bM2rZt6/HnvHTpUuvbt6+77ejRo+ZyuezAgQNm\nZnb55Zfb22+/7W5/+OGHK/wDVFpaamlpadamTRsrLi52z8GsWbOsU6dO1rJlS4uLi7P8/Pwztv1B\nTccy+/6P2rhx4yrt68eqm9/TeetrVR/3TzOzSy+91Hbt2uV+/Mtf/tKSkpLMzOzBBx+00aNHu9s+\n//xza9iwoR09etROt3fvXuvZs6elpqa6l23evNn69+9vzZs3t969e1tGRsYZ2/3gbMaqLOwTtmoP\npxE9zP7305KOHz+u5cuXq3///u62SZMmqaioSDk5OVq/fr1eeeUVLVq0SJJqdGj31Vdf1csvv6yv\nv/5aJSUlevLJJyVJWVlZGj9+vJYuXar9+/fr8OHD5U5fTp48WVOmTNGRI0f0xRdfKC4uzt3Wu3dv\npaSk1Pj5ZWVlqXfv3u7HvXr10sGDB8sdzj7d9ddfrzZt2mjEiBH68ssvazROdna2fH191blz53K1\n7ty5s8L1XS6Xtm3bpsDAQHXr1k2PPfaYSktLazSWy+Vyv26SVFZWJknasWNHjbYvKytz11WTvk5v\nr2qc6vouLi7W7t273csr67uibc2syrr27t1b7jSQJ57zddddp5ycHGVmZqq0tFQvvfSSIiMjFRQU\npIKCAuXl5Z2xP56+j/Tq1UuXXXaZbr/9dr3++utq2LChJGnevHlKS0vTu+++q7y8PLVo0UITJkyo\nsKaajiVJx44d08qVK5WQkFDpc6xOdXPkja9Vfd0/Bw8erOTkZJ06dUqffPKJNm/erEGDBkk68/dh\nx44ddemllyo7O9u9LCkpSf7+/mrbtq2GDBmiW2+9VdL3p1WHDBmihx9+WAUFBXryySc1YsQIHTp0\nqMLnVJOxfpCcnKxf/OIXuuyyyyrsC7XgAgY7nKZ9+/bm5+dnzZs3twYNGlhISIj997//NTOzU6dO\nWcOGDcv9h7RgwQKLiooys+qPbEVFRdmMGTPc7fPnz7ebbrrJzMymT59u8fHx7rZjx45Zw4YN3Ue2\nrr/+eps2bVq5/yproqKjRZ06dbLVq1e7H5eUlJjL5bIvv/yywj42bNhgJ0+etMLCQps4caL16NHD\nTp06Ve3Y77777hlHzJ5//nn3fJ3uiy++sD179pjZ9//pRkRE2KxZs6odx8xs7dq1FhgYaNu3b7fj\nx4/b3XffbT4+PpaSknLGuiUlJdaxY0d7/PHHraSkxFavXm0NGzZ0vxbV9TVmzBgbMWKEFRUV2e7d\nu61jx47WqFEjMzM7dOiQtWjRwlJSUqykpMRefvll8/HxsXvuucfMzF588UXr2rWr7dmzxwoLC23o\n0KHmcrlsy5YtZmY2YMAAmzRpkp04ccI++OADCwgIsPDwcDMz27VrlzVp0sQyMjKsuLjYHnnkEfPx\n8XH/hz516lS79tpr7ZtvvrG8vDzr27ev+fj42IEDBzz6nM2+/znx9fU1X19fCwwMdB+F+Oqrr8zl\n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\nREQoLi5OERER8vX11fz586s8xQgAAFCfVRu2BgwYUOmtG9auXVvh8oceekgPPfTQ+VUGAABQD3AH\neQAAAAcRtgAAABxE2AIAAHAQYQsAAMBBhC0AAAAHEbYAAAAcRNgCAABwEGELAADAQYQtAAAABxG2\nAAAAHFTtx/UAF0pBQYGnS/AqLVq08HQJ9dqpU6dUVFTk6TLOSklJiWM/J40bN9all17qSN/AxY6w\nBa8RGBioqVOnntU2//znP/XBBx+4H0+bNq1ce0lJiTZs2KDo6Oga97ly5Urt2LHD/bh3794aNmzY\nWdV1vubOnUv4dNjGjRv197//XREREZ4upVovvviiJCkgIEBz586t9f4LCgrUoUMH3XfffbXeNwDC\nFrxMYmJijddt1aqVpk+frtWrV7uXtWzZstw6bdu21aeffqrGjRvXuN8//OEPKi4udj9+/fXX9cAD\nD7gfHzp0qMZ9navk5GTHx4D0q1/9SiNGjPB0GVVq1aqVVqxYoSuvvFITJkw4q5+RmsrJydGqVatq\nvV8A3yNsoc55+umn9f7771cZegoLC5WUlKTc3Nyz7t/Pz09+fn7ux3feeafuvPNO9+PRo0dLkm66\n6SZdcsklkqRRo0ad9ThAZZYtW6bdu3crOzv7goR7AM4ibKFOue222zRr1qxqT3fccccdeu655xyp\nYenSpZKk999/X6WlpZKk/v37S5Jat27NEQKcs08//VS333675syZo+uuu05t27b1dEkAagFhC3XC\n1q1bde+99+r111/X5ZdfXul6BQUFmjRpklauXOl4TVdffbX7+82bN0uSDh48qH79+kmSnnnmGfXs\n2VOXXXaZ47WgbsvMzNScOXPUoEED974EoP4gbMHrvfLKK7rkkku0devWatedMWOGnnrqqQtQVcWC\ngoLcdS5ZskQvvfSSOnTooD//+c8eqwne64033tCKFSt04403at68eQoMDKx2m6KiIo0fP16SNGDA\nAP32t791ukwA54mwBa+2bds2FRcX66677qpyvRMnTujKK6/Uzp07L1Bl1RszZozGjBmjjIwMBQQE\n6PPPP+ft9VBpaam+/fZbderUSffdd58WL158Vtv/5Cc/0e7duyVJKSkp7n2rSZMmatiwoRMlAzhP\nhC14rWXLlunQoUO69957q1yvtLRUs2fP1qZNmy5QZWcnKipK+fn5SkxMlMvlknTmLSpwcXjllVeU\nk5MjM1N+fv459fFD0JKkkSNHauTIke59i/0K8E6ELXitJUuW6K233qp2vdDQUPdRI2+WmJioY8eO\n6cSJE2pp//tUAAAgAElEQVTVqpUyMzPVsWNHT5eFC6RVq1Z65ZVXFBsbq+bNm9dq34mJiSoqKlJE\nRISysrJqtW8A54+wBa+Unp6uSZMmVbnOkSNHlJSUpLy8vAtU1flr0qSJmjRpokOHDun+++/X0KFD\nFRUV5emy4JBly5bpiy++0K5duxy/hYO/v782bdqkRx99VA8++KB8ffn1DngLPhsRXmn58uXu2ylU\nJiEhoU7f8fqpp55STk6OtmzZ4ulSUMv27Nmj/v37q2PHjho7dqz7diFOa968uW6//XZFR0dr5syZ\nF2RMANXjXx94ne3bt6tp06aVnmopLCzU5MmTlZqaeoErq32/+c1vNHnyZDVu3Fi9evXydDk4T5mZ\nmfr73/+uEydOeOwWDm3bttX69euVlpam1NTUC/5RUwDOxJEteJW3335bW7ZsqfLz3x555BElJSVd\nwKqcNXfuXG3ZskVr1671dCk4R6tXr9bYsWOVnZ2tpKQkLV++3NMlKTY2Vg0aNNCMGTM8XQpw0ePI\nFrzKrl27dMstt1TYVlxcrKuvvlrbt2+/wFU57+6779bEiRM1aNAgT5eCGiorK9ORI0fUqVMn3XPP\nPWd9C4cL4ZZbblGzZs2UkpKikSNHeroc4KLFkS14ld27d6tTp05nLDczJSUlaf369R6o6sK4+eab\n9eijj3q6DNTAsmXL9Oijj2ru3LnKz8/36uujBgwYIJfLpaefftrTpQAXLcIW6oSgoCD94Q9/UIsW\nLTxdimNuueUWTZ8+3dNloBqtWrVSo0aNNHnyZCUmJnq6nBr51a9+pUGDBunZZ5/1dCnARYnTiPAq\nzzzzTLnHRUVFSkpK0tdff+2hii6s4uJi3X///Z4uA6d59dVXtWfPHu3YscPxWzg4pUePHtq+fbuW\nLl2q0aNHe7oc4KLCkS14tdGjR1d7v636xMfHR4GBgXXq3mH1WV5envr376+wsDDFx8dfsFs4OGXU\nqFHq0qWLHn/8cU+XAlxUOLIFr3TkyBHdd999SktL83QpF5TL5VLDhg1VXFzs6VIuapmZmXr++ed1\n6NAhj93CwSl9+/bV3r17lZaWptjYWE+XA1wUOLIFr5SYmMhb1nHBvfPOO+5bOCQmJtaLe7lV5Lbb\n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\n4GAdOHBAwcHBysvLU+vWrSVJISEhys3NdW+/d+9ehYSElOvzo48+qm5YAACAeqHa04jBwcFq27at\nsrOzJUlr165V9+7dNXToUCUnJ0uSkpOTNWzYMElSbGysUlJSVFJSopycHO3evVt9+/Z18CkAAAB4\nr2qPbEnSM888o9GjR6ukpESdOnXSokWLVFpaqri4OC1cuFBhYWFasWKFJCkiIkJxcXGKiIiQr6+v\n5s+fL5fL5eiTAAAA8FYuMzNPFwEAAFBfXfA7yKenpys8PFxdunTR7NmzL/TwHjVu3DgFBQWpZ8+e\n7mUX+81hc3NzdcMNN6h79+7q0aOH5s2bJ4l5OXHihPr166c+ffooIiJCDz74oCTm5QelpaWKjIzU\n0KFDJTEvYWFh6tWrlyIjI92XbVzscyJxQ+6KfPrpp4qMjHR/NWvWTPPmzbvo50X6/nl2795dPXv2\n1KhRo1RcXFx783Jel9efpVOnTlmnTp0sJyfHSkpKrHfv3paVlXUhS/Cod9991z788EPr0aOHe9kf\n//hHmz17tpmZJSUl2Z///GczM9u5c6f17t3bSkpKLCcnxzp16mSlpaUeqdtJeXl5tm3bNjMzKyoq\nsq5du1pWVtZFPy9mZseOHTMzs5MnT1q/fv1sw4YNzMv/euqpp2zUqFE2dOhQM+PnKCwszA4fPlxu\n2cU+J2Zmv/71r23hwoVm9v3PUWFhIfPyI6WlpRYcHGxfffXVRT8vOTk51qFDBztx4oSZmcXFxdnL\nL79ca/NyQcPWpk2b7MYbb3Q/njVrls2aNetCluBxOTk55cJWt27d7MCBA2b2ffDo1q2bmZnNnDnT\nkpKS3OvdeOONtnnz5gtbrAfceuut9vbbbzMvP3Ls2DG76qqrbMeOHcyLmeXm5lp0dLS98847NmTI\nEDPj5ygsLMwOHTpUbtnFPieFhYXWoUOHM5Zf7PPyY6tXr7YBAwaYGfNy+PBh69q1q+Xn59vJkydt\nyJAhtmbNmlqblwt6GnHfvn1q27at+zE3PBU3h/2RPXv2aNu2berXrx/zIqmsrEx9+vRRUFCQ+1Qr\n8yJNmTJFTzzxhHx8/u/X18U+Ly6XS4MGDdJVV12lF154QRJzwg25q5eSkqL4+HhJ7C8BAQG6//77\n1a5dO11++eVq3ry5YmJiam1eLmjY4l2JVXO5XFXOUX2ev6NHj2rEiBGaO3eu/P39y7VdrPPi4+Oj\njz76SHv3/v/27p6lkSiMAvARtLKwCFECNhL8YDROBlNZKlZCIBHBFEljZ+WfMKCVja2NgtqqOBJF\nxdlnruIAAAKtSURBVKAR0UlIK5pAFrFQFI0GRuHdKrObXZdlWScue89Tzh3IcBguLyT35AsODw+x\nv79fs65iLpubm2htbYVhGJBfnO1RMZejoyNks1mYpomFhQWk0+madRUzeXt7g2VZmJqagmVZaG5u\ndv7Dt0rFXKps28bGxgbGx8d/WlMxl8vLS8zPz6NYLOL6+hrlchnLy8s19/xNLnUdtn4sPC2VSjWT\noYra2tpwc3MDAH9cDvu/eH19xdjYGOLxuNPXxly+aWlpwejoKM7Pz5XP5fj4GOvr6+jo6EAsFsPe\n3h7i8bjyufh8PgCA1+tFJBLB6emp8pm8V8htWZZTyA2omUuVaZoYGBiA1+sFwD337OwMg4OD8Hg8\naGxsRDQaRSaT+bD3pa7DVigUwsXFBYrFImzbxtraGsLhcD0f4Z8TDoeVLocVEUxOTkLTNExPTzvX\nVc/l9vbWOfVSqVSws7MDwzCUzyWZTKJUKqFQKGB1dRVDQ0NYWlpSOpeXlxc8PT0BAJ6fn5FKpRAI\nBJTOBGAh9++srKw4XyEC3HN7enpwcnKCSqUCEcHu7i40Tfu498XF35u9a2trS7q6usTv90symaz3\nx3+qiYkJ8fl80tTUJO3t7bK4uCh3d3cyPDwsnZ2dMjIyIvf39879MzMz4vf7pbu7W7a3tz/xyd2T\nTqeloaFBdF2XYDAowWBQTNNUPpd8Pi+GYYiu6xIIBGRubk5ERPlcvndwcOCcRlQ5l6urK9F1XXRd\nl97eXmdfVTmTqlwuJ6FQSPr7+yUSicjDwwNzEZFyuSwej0ceHx+da8xFZHZ2VjRNk76+PkkkEmLb\n9oflwlJTIiIiIhfVvdSUiIiISCUctoiIiIhcxGGLiIiIyEUctoiIiIhcxGGLiIiIyEUctoiIiIhc\nxGGLiIiIyEVfAQcK06wQj5M7AAAAAElFTkSuQmCC\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f25259bf290>"
-       ]
-      },
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "\n"
+       "ename": "NameError",
+       "evalue": "name 'precision_vs_zoom' is not defined",
+       "output_type": "pyerr",
+       "traceback": [
+        "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
+        "\u001b[1;32m<ipython-input-1-177c6c5e9c41>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mpz\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mprecision_vs_zoom\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"single\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;36m0.5\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m0.5\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1e-5\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1e-5\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1e-6\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1e-6\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m100\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"svg-tests/fox-vector.svg\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mshow_outputs\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
+        "\u001b[1;31mNameError\u001b[0m: name 'precision_vs_zoom' is not defined"
        ]
       }
      ],
-     "prompt_number": 13
+     "prompt_number": 1
     },
     {
      "cell_type": "code",
diff --git a/tools/gpubounds_error.py b/tools/gpubounds_error.py
new file mode 100755 (executable)
index 0000000..ecf13c4
--- /dev/null
@@ -0,0 +1,51 @@
+#!/usr/bin/python
+import sys
+import os
+import math
+
+# Calculates the total error in coordinates of GPU bounds rectangles of objects
+
+def ComputeError(reference, other):
+       reference = open(reference, "r")
+       other = open(other, "r")
+       total = 0.0
+       while True:
+               a = reference.readline()
+               b = other.readline()
+               if a == "" and b == "":
+                       reference.close()
+                       other.close()
+                       return total
+               if a[0] == '#' and b[0] == '#':
+                       continue
+               a = map(float, a.strip(" \r\n").split("\t"))
+               b = map(float, b.strip(" \r\n").split("\t"))
+               deltaArea = abs(b[3]*b[4] - a[3]*a[4])
+               
+               deltaCoord = b[1] - a[1] + b[2] - a[2]
+               total += math.sqrt(deltaArea) + abs(deltaCoord)
+
+# Counts the number of unique bounds
+def UniqueBounds(other):
+       other = open(other, "r")
+       store = {}
+       for l in other.readlines():
+               if l[0] == "#":
+                       continue
+               #print "L is " + str(l)
+               l = map(float, l.strip(" \r\n").split("\t"))
+               l = tuple(l[1:])
+               if not l in store.keys():
+                       store[l] = 1
+               else:
+                       store[l] += 1
+       other.close()
+       return len(store.keys())
+       
+def main(argv):
+       print str(ComputeError(argv[1], argv[2])) + "\t" + str(UniqueBounds(argv[1])) + "\t" + str(UniqueBounds(argv[2]))
+       return 0
+       
+       
+if __name__ == "__main__":
+       sys.exit(main(sys.argv))

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