X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fgfxpoly%2Ftest.c;h=46df1f5c50fe5f026b9db30e64e0586108d72705;hp=c990ca281113953fb17e0d383807a3be4a675319;hb=879d0eec420fe0fd5ddcd56c8fe62b82a6744edd;hpb=e3f35893d64112de70839da517c31e239a250b6a diff --git a/lib/gfxpoly/test.c b/lib/gfxpoly/test.c index c990ca2..46df1f5 100644 --- a/lib/gfxpoly/test.c +++ b/lib/gfxpoly/test.c @@ -6,6 +6,7 @@ #include "poly.h" #include "convert.h" #include "renderpoly.h" +#include "stroke.h" gfxline_t*mkstar(int x1, int y1, int x2, int y2) { @@ -114,82 +115,156 @@ gfxline_t* mkchessboard() return b; } -gfxline_t* make_circles() +gfxline_t* make_circles(int n) { gfxline_t*b = 0; unsigned int c = 0; int t; - for(t=0;t<30;t++) { + for(t=0;tedges; - while(e) { + swf_ShapeSetAll(tag,s,UNDEFINED_COORD,UNDEFINED_COORD,0,fs,0); + + int i,j; + gfxpolystroke_t*stroke = poly2->strokes; + for(;stroke;stroke=stroke->next) { + for(j=0;jnum_points-1;j++) { + point_t a = stroke->points[j]; + point_t b = stroke->points[j+1]; #define ROTATE #ifdef ROTATE - swf_ShapeSetMove(tag, s, e->a.y, e->a.x); - swf_ShapeSetLine(tag, s, e->b.y - e->a.y, e->b.x - e->a.x); + swf_ShapeSetMove(tag, s, a.y, a.x); + swf_ShapeSetLine(tag, s, b.y - a.y, b.x - a.x); #else - swf_ShapeSetMove(tag, s, e->a.x, e->a.y); - swf_ShapeSetLine(tag, s, e->b.x - e->a.x, e->b.y - e->a.y); + swf_ShapeSetMove(tag, s, a.x, a.y); + swf_ShapeSetLine(tag, s, b.x - a.x, b.y - a.y); #endif - e = e->next; - } + } + } #else swf_ShapeSetAll(tag,s,0,0,ls,0,0); edge_t*e = poly2->edges; @@ -325,7 +409,7 @@ void test3(int argn, char*argv[]) swf_ShapeSetEnd(tag); swf_ShapeFree(s); - gfxpoly_destroy(poly); + gfxpoly_destroy(poly1); gfxpoly_destroy(poly2); gfxline_free(l); @@ -346,15 +430,14 @@ void test3(int argn, char*argv[]) void rotate90(gfxpoly_t*poly) { - edge_t*e = poly->edges; - 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; + int i,j; + gfxpolystroke_t*stroke = poly->strokes; + for(;stroke;stroke=stroke->next) { + for(j=0;jnum_points;j++) { + point_t a = stroke->points[j]; + stroke->points[j].x = a.y; + stroke->points[j].y = a.x; + } } } @@ -380,25 +463,26 @@ void test4(int argn, char*argv[]) filename = argv[1]; windrule_t*rule = &windrule_evenodd; - gfxpoly_t*poly = gfxpoly_from_file(filename, 1.0);//0.01); + gfxpoly_t*poly1 = gfxpoly_from_file(filename, 1.0);//0.01); if(argn!=2) free(filename); double zoom = 1.0; - if(!gfxpoly_check(poly)) { + if(!gfxpoly_check(poly1, 0)) { printf("bad polygon\n"); continue; } - gfxpoly_t*poly2 = gfxpoly_process(poly, rule, &onepolygon); + gfxpoly_t*poly2 = gfxpoly_process(poly1, 0, rule, &onepolygon); + assert(gfxpoly_check(poly2, 1)); 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); + 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_circular, &onepolygon); if(!bitmap_ok(&bbox, bitmap1) || !bitmap_ok(&bbox, bitmap2)) { save_two_bitmaps(&bbox, bitmap1, bitmap2, "error.png"); assert(!"error in bitmaps"); @@ -409,13 +493,13 @@ void test4(int argn, char*argv[]) } free(bitmap1); free(bitmap2); - + // second pass renders the 90° rotated version - rotate90(poly); + rotate90(poly1); rotate90(poly2); } - gfxpoly_destroy(poly); + gfxpoly_destroy(poly1); gfxpoly_destroy(poly2); if(argn==2) break; @@ -426,39 +510,51 @@ void test4(int argn, char*argv[]) #include "../gfxdevice.h" #include "../pdf/pdf.h" +static int max_segments = 0; +static int max_any_segments = 0; 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*c = gfxpoly_from_fill(line, 0.05); + //gfxpoly_free(c); + + //gfxpoly_t*poly1 = gfxpoly_from_fill(line, 0.05); + gfxpoly_t*poly1 = gfxpoly_from_fill(line, 0.05); - gfxpoly_t*poly = gfxpoly_from_gfxline(line, 0.05); + //gfxline_dump(line, stderr, ""); + //gfxpoly_dump(poly); - gfxline_dump(line, stderr, ""); - gfxpoly_dump(poly); + int size = gfxpoly_size(poly1); + if(size == 4) { + //rectangles are boring. + gfxpoly_destroy(poly1); + return; + } - if(gfxpoly_size(poly)>100000) { - fprintf(stderr, "%d segments (skipping)\n", gfxpoly_size(poly)); + max_any_segments = size > max_any_segments? size : max_any_segments; + if(size>100000) { + fprintf(stderr, "%d segments (skipping)\n", size); return; } else { - //fprintf(stderr, "%d segments\n", gfxpoly_size(poly)); + max_segments = size > max_segments? size : max_segments; + fprintf(stderr, "%d segments (max so far: %d/%d)\n", size, max_segments, max_any_segments); } - if(!gfxpoly_check(poly)) { - gfxpoly_destroy(poly); + if(!gfxpoly_check(poly1, 0)) { + gfxpoly_destroy(poly1); fprintf(stderr, "bad polygon\n"); return; } windrule_t*rule = &windrule_evenodd; - + double zoom = 1.0; - intbbox_t bbox = intbbox_from_polygon(poly, zoom); - unsigned char*bitmap1 = render_polygon(poly, &bbox, zoom, rule, &onepolygon); + 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); + gfxpoly_t*poly2 = gfxpoly_process(poly1, 0, 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"); @@ -471,7 +567,7 @@ void extract_polygons_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) free(bitmap1); free(bitmap2); - gfxpoly_destroy(poly); + gfxpoly_destroy(poly1); gfxpoly_destroy(poly2); } int extract_polygons_setparameter(gfxdevice_t*dev, const char*key, const char*value) { @@ -530,6 +626,7 @@ finish: 0, internal: 0 }; +#if 0 void test5(int argn, char*argv[]) { gfxsource_t*driver = gfxsource_pdf_create(); @@ -565,9 +662,10 @@ void test5(int argn, char*argv[]) closedir(_dir); driver->destroy(driver); } +#endif int main(int argn, char*argv[]) { - test3(argn, argv); + teststroke(argn, argv); }