+ fprintf(stderr, "polyon %p (gridsize: %f)\n", poly, poly->gridsize);
+ gfxpolystroke_t*stroke = poly->strokes;
+ for(;stroke;stroke=stroke->next) {
+ fprintf(stderr, "%11p", stroke);
+ if(stroke->dir==DIR_UP) {
+ for(s=stroke->num_points-1;s>=1;s--) {
+ point_t a = stroke->points[s];
+ point_t b = stroke->points[s-1];
+ fprintf(stderr, "%s (%f,%f) -> (%f,%f)%s%s\n", s!=stroke->num_points-1?" ":"", a.x*g, a.y*g, b.x*g, b.y*g,
+ s==1?"]":"", a.y==b.y?"H":"");
+ }
+ } else {
+ for(s=0;s<stroke->num_points-1;s++) {
+ point_t a = stroke->points[s];
+ point_t b = stroke->points[s+1];
+ fprintf(stderr, "%s (%f,%f) -> (%f,%f)%s%s\n", s?" ":"", a.x*g, a.y*g, b.x*g, b.y*g,
+ s==stroke->num_points-2?"]":"", a.y==b.y?"H":"");
+ }
+ }
+ }
+}
+
+void gfxpoly_save(gfxpoly_t*poly, const char*filename)
+{
+ FILE*fi = fopen(filename, "wb");
+ fprintf(fi, "%% gridsize %f\n", poly->gridsize);
+ fprintf(fi, "%% begin\n");
+ int s,t;
+ gfxpolystroke_t*stroke = poly->strokes;
+ for(;stroke;stroke=stroke->next) {
+ fprintf(fi, "%g setgray\n", stroke->dir==DIR_UP ? 0.7 : 0);
+ point_t p = stroke->points[0];
+ fprintf(fi, "%d %d moveto\n", p.x, p.y);
+ for(s=1;s<stroke->num_points;s++) {
+ p = stroke->points[s];
+ fprintf(fi, "%d %d lineto\n", p.x, p.y);
+ }
+ fprintf(fi, "stroke\n");
+ }
+ fprintf(fi, "showpage\n");
+ fclose(fi);
+}
+
+void gfxpoly_save_arrows(gfxpoly_t*poly, const char*filename)
+{
+ FILE*fi = fopen(filename, "wb");
+ fprintf(fi, "%% gridsize %f\n", poly->gridsize);
+ fprintf(fi, "%% begin\n");
+ int t;
+ double l = 5.0 / poly->gridsize;
+ double g = poly->gridsize;
+ gfxpolystroke_t*stroke = poly->strokes;
+ for(;stroke;stroke=stroke->next) {
+ fprintf(fi, "%g setgray\n", 0);
+
+ int s = stroke->dir==DIR_UP?stroke->num_points-1:0;
+ int end = stroke->dir==DIR_UP?-1:stroke->num_points;
+ int dir = stroke->dir==DIR_UP?-1:1;
+
+ point_t p = stroke->points[s];
+ s+=dir;
+ point_t o = p;
+ fprintf(fi, "%f %f moveto\n", p.x * g, p.y * g);
+ for(;s!=end;s+=dir) {
+ p = stroke->points[s];
+ int lx = p.x - o.x;
+ int ly = p.y - o.y;
+ double d = sqrt(lx*lx+ly*ly);
+ if(!d) d=1;
+ else d = l / d;
+ double d2 = d*1.5;
+ fprintf(fi, "%f %f lineto\n", (p.x - lx*d2) * g, (p.y - ly*d2) * g);
+ fprintf(fi, "%f %f lineto\n", (p.x - lx*d2 + (ly*d))*g,
+ (p.y - ly*d2 - (lx*d))*g);
+ fprintf(fi, "%f %f lineto\n", p.x * g, p.y * g);
+ fprintf(fi, "%f %f lineto\n", (p.x - lx*d2 - (ly*d))*g,
+ (p.y - ly*d2 + (lx*d))*g);
+ fprintf(fi, "%f %f lineto\n", (p.x - lx*d2) * g, (p.y - ly*d2) * g);
+ fprintf(fi, "%f %f moveto\n", p.x * g, p.y * g);
+ o = p;
+ }
+ fprintf(fi, "stroke\n");