+ char*dir = "ps";
+ DIR*_dir = opendir(dir);
+ if(!_dir) return;
+ struct dirent*file;
+ while(1) {
+ file = readdir(_dir);
+ if (!file)
+ break;
+ if(!strstr(file->d_name, ".ps"))
+ continue;
+
+ char* filename;
+
+ if(argn<2)
+ filename = allocprintf("%s/%s", dir, file->d_name);
+ else
+ filename = argv[1];
+
+ windrule_t*rule = &windrule_evenodd;
+ gfxcompactpoly_t*poly = gfxcompactpoly_from_file(filename, 1.0);//0.01);
+
+ if(argn!=2)
+ free(filename);
+
+ double zoom = 1.0;
+
+ if(!gfxcompactpoly_check(poly)) {
+ printf("bad polygon\n");
+ continue;
+ }
+
+ gfxpoly_t*poly1 = gfxpoly_from_gfxcompactpoly(poly);
+ gfxpoly_t*poly2 = gfxpoly_process(poly, rule, &onepolygon);
+
+ int pass;
+ for(pass=0;pass<2;pass++) {
+ intbbox_t bbox = intbbox_from_polygon(poly1, zoom);
+ unsigned char*bitmap1 = render_polygon(poly1, &bbox, zoom, rule, &onepolygon);
+ unsigned char*bitmap2 = render_polygon(poly2, &bbox, zoom, &windrule_evenodd, &onepolygon);
+ if(!bitmap_ok(&bbox, bitmap1) || !bitmap_ok(&bbox, bitmap2)) {
+ save_two_bitmaps(&bbox, bitmap1, bitmap2, "error.png");
+ assert(!"error in bitmaps");
+ }
+ if(!compare_bitmaps(&bbox, bitmap1, bitmap2)) {
+ save_two_bitmaps(&bbox, bitmap1, bitmap2, "error.png");
+ assert(!"bitmaps don't match");
+ }
+ free(bitmap1);
+ free(bitmap2);
+
+ // second pass renders the 90° rotated version
+ rotate90(poly1);
+ rotate90(poly2);
+ }
+
+ gfxpoly_destroy(poly1);
+ gfxpoly_destroy(poly2);
+ gfxcompactpoly_destroy(poly);
+ if(argn==2)
+ break;
+ }
+ closedir(_dir);
+}
+
+#include "../gfxdevice.h"
+#include "../pdf/pdf.h"
+
+void extract_polygons_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color)
+{
+ //gfxcompactpoly_t*c = gfxcompactpoly_from_gfxline(line, 0.05);
+ //gfxcompactpoly_free(c);
+
+ gfxcompactpoly_t*poly = gfxcompactpoly_from_gfxline(line, 0.05);
+
+ //gfxline_dump(line, stderr, "");
+ //gfxcompactpoly_dump(poly);
+
+ if(gfxcompactpoly_size(poly)>100000) {
+ fprintf(stderr, "%d segments (skipping)\n", gfxcompactpoly_size(poly));
+ return;
+ } else {
+ //fprintf(stderr, "%d segments\n", gfxpoly_size(poly));
+ }
+
+ if(!gfxcompactpoly_check(poly)) {
+ gfxcompactpoly_destroy(poly);
+ fprintf(stderr, "bad polygon\n");
+ return;
+ }
+
+ windrule_t*rule = &windrule_evenodd;
+
+ gfxpoly_t*poly1 = gfxpoly_from_gfxcompactpoly(poly);
+
+ double zoom = 1.0;
+ intbbox_t bbox = intbbox_from_polygon(poly1, zoom);
+ unsigned char*bitmap1 = render_polygon(poly1, &bbox, zoom, rule, &onepolygon);
+ if(!bitmap_ok(&bbox, bitmap1)) {
+ fprintf(stderr, "bad polygon or error in renderer\n");
+ return;
+ }
+ gfxpoly_t*poly2 = gfxpoly_process(poly, rule, &onepolygon);
+ unsigned char*bitmap2 = render_polygon(poly2, &bbox, zoom, &windrule_evenodd, &onepolygon);
+ if(!bitmap_ok(&bbox, bitmap2)) {
+ save_two_bitmaps(&bbox, bitmap1, bitmap2, "error.png");
+ assert(!"error in bitmap");
+ }
+ if(!compare_bitmaps(&bbox, bitmap1, bitmap2)) {
+ save_two_bitmaps(&bbox, bitmap1, bitmap2, "error.png");
+ assert(!"bitmaps don't match");
+ }
+ free(bitmap1);
+ free(bitmap2);
+
+ gfxpoly_destroy(poly1);
+ gfxpoly_destroy(poly2);
+ gfxcompactpoly_destroy(poly);
+}
+int extract_polygons_setparameter(gfxdevice_t*dev, const char*key, const char*value) {
+ return 0;