X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fgfxpoly%2Ftest.c;h=c990ca281113953fb17e0d383807a3be4a675319;hb=refs%2Ftags%2Fpolyok;hp=aff9208ede9b49ae9ed7e00065706a2bebff5f40;hpb=ae7c92fe5721f97e786a8bbe9153eadbf292460d;p=swftools.git diff --git a/lib/gfxpoly/test.c b/lib/gfxpoly/test.c index aff9208..c990ca2 100644 --- a/lib/gfxpoly/test.c +++ b/lib/gfxpoly/test.c @@ -1,6 +1,5 @@ #include #include -#include #include #include #include "../gfxtools.h" @@ -29,21 +28,17 @@ gfxline_t*mkstar(int x1, int y1, int x2, int y2) gfxline_t* mkrandomshape(int range, int n) { int i; - gfxline_t* line = malloc(sizeof(gfxline_t)*n*2); + gfxline_t* line = malloc(sizeof(gfxline_t)*n); for(i=0;iedges; + while(e) { + point_t a = e->a; + point_t b = e->b; + e->a.x = a.y; + e->a.y = a.x; + e->b.x = b.y; + e->b.y = b.x; + e = e->next; + } +} + #include -void test4() +void test4(int argn, char*argv[]) { char*dir = "ps"; DIR*_dir = opendir(dir); @@ -335,32 +372,55 @@ void test4() if(!strstr(file->d_name, ".ps")) continue; - char* filename = allocprintf("%s/%s", dir, file->d_name); + char* filename; + + if(argn<2) + filename = allocprintf("%s/%s", dir, file->d_name); + else + filename = argv[1]; + windrule_t*rule = &windrule_evenodd; - gfxpoly_t*poly = gfxpoly_from_file(filename, 0.01); - free(filename); + gfxpoly_t*poly = gfxpoly_from_file(filename, 1.0);//0.01); + + if(argn!=2) + free(filename); double zoom = 1.0; - intbbox_t bbox = intbbox_from_polygon(poly, zoom); if(!gfxpoly_check(poly)) { printf("bad polygon\n"); continue; } - gfxpoly_t*poly2 = gfxpoly_process(poly, rule); - unsigned char*bitmap1 = render_polygon(poly, &bbox, zoom, rule); - unsigned char*bitmap2 = render_polygon(poly2, &bbox, zoom, &windrule_evenodd); - 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"); - } + gfxpoly_t*poly2 = gfxpoly_process(poly, rule, &onepolygon); + + int pass; + for(pass=0;pass<2;pass++) { + intbbox_t bbox = intbbox_from_polygon(poly, zoom); + unsigned char*bitmap1 = render_polygon(poly, &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(poly); + rotate90(poly2); + } + + gfxpoly_destroy(poly); gfxpoly_destroy(poly2); + if(argn==2) + break; } + closedir(_dir); } #include "../gfxdevice.h" @@ -368,26 +428,38 @@ void test4() 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); + gfxpoly_t*poly = gfxpoly_from_gfxline(line, 0.05); - printf("%d segments\n", gfxpoly_size(poly)); + + gfxline_dump(line, stderr, ""); + gfxpoly_dump(poly); + + if(gfxpoly_size(poly)>100000) { + fprintf(stderr, "%d segments (skipping)\n", gfxpoly_size(poly)); + return; + } else { + //fprintf(stderr, "%d segments\n", gfxpoly_size(poly)); + } if(!gfxpoly_check(poly)) { gfxpoly_destroy(poly); - printf("bad polygon\n"); + fprintf(stderr, "bad polygon\n"); return; } windrule_t*rule = &windrule_evenodd; - gfxpoly_t*poly2 = gfxpoly_process(poly, rule); double zoom = 1.0; intbbox_t bbox = intbbox_from_polygon(poly, zoom); - unsigned char*bitmap1 = render_polygon(poly, &bbox, zoom, rule); - unsigned char*bitmap2 = render_polygon(poly2, &bbox, zoom, &windrule_evenodd); + unsigned char*bitmap1 = render_polygon(poly, &bbox, zoom, rule, &onepolygon); if(!bitmap_ok(&bbox, bitmap1)) { - printf("bad polygon or error in renderer\n"); + 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"); @@ -396,6 +468,8 @@ void extract_polygons_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) save_two_bitmaps(&bbox, bitmap1, bitmap2, "error.png"); assert(!"bitmaps don't match"); } + free(bitmap1); + free(bitmap2); gfxpoly_destroy(poly); gfxpoly_destroy(poly2); @@ -456,8 +530,9 @@ finish: 0, internal: 0 }; -void test5() +void test5(int argn, char*argv[]) { + gfxsource_t*driver = gfxsource_pdf_create(); char*dir = "pdfs"; DIR*_dir = opendir(dir); if(!_dir) return; @@ -470,22 +545,29 @@ void test5() continue; char* filename = allocprintf("%s/%s", dir, file->d_name); - gfxsource_t*driver = gfxsource_pdf_create(); + if(argn>1) + filename = argv[1]; + gfxdocument_t*doc = driver->open(driver, filename); gfxdevice_t*out = &extract_polygons; int t; for(t=1;t<=doc->num_pages;t++) { - printf("%s (page %d)\n", filename, t); + fprintf(stderr, "%s (page %d)\n", filename, t); gfxpage_t* page = doc->getpage(doc, t); page->render(page, out); page->destroy(page); - break; } + doc->destroy(doc); + if(argn>1) + break; free(filename); } + closedir(_dir); + driver->destroy(driver); } -int main() +int main(int argn, char*argv[]) { - test0(); + test3(argn, argv); } +