using namespace IPDF;
-void DebugScript::ParseAction()
+void DebugScript::ParseAction(View * view, Screen * scr)
{
std::string actionType;
inp >> actionType;
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;
+ }
}
{
if (m_index >= m_actions.size())
{
- ParseAction();
+ ParseAction(view, scr);
if (m_labels.size() > 0)
{
m_actions.push_back(currentAction);
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.");
}
// 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;
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
};
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("") {}
};
void PrintPerformance(View * view, Screen * scr);
void ClearPerformance(View * view, Screen * scr);
- void ParseAction();
+ void ParseAction(View * view, Screen * scr);
};
}
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)
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);
# Test how well document scales back to original...
-gpu
+cpu
lazy
-debugfont off
+debugfont on
clearperf
label start
printperf
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
int main(int argc, char ** argv)
{
+
+
//Debug("Main!");
signal(SIGFPE, sigfpe_handler);
#if REALTYPE == REAL_IRRAM
#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));
DebugScript script;
scr.DebugFontInit("fonts/DejaVuSansMono.ttf", 12);
+ //scr.DebugFontInit("fonts/DejaVuSansMono.ttf", 18);
scr.SetMouseHandler(RatCatcher);
if (script_filename)
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");
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)));
}
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);
}
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;
#if REALTYPE == REAL_MPFRCPP
#include <mpreal.h>
+
#endif //REALTYPE
#if REALTYPE == REAL_IRRAM
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);}
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)
--- /dev/null
+#!/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>"
<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"
--- /dev/null
+<?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>
#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
* @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());
*/
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;
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");
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
{
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)
};
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),
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();
}
/**
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();
+}
#include "path.h"
#include "transformationtype.h"
-#define USE_GPU_TRANSFORM true
+#define USE_GPU_TRANSFORM false
#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
{
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;}
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
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
]
}
],
- "prompt_number": 1
+ "prompt_number": 2
},
{
"cell_type": "code",
"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",
--- /dev/null
+#!/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))