X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fgfxpoly%2Ftest.c;h=4e3c875cabc7b4ceb96e1c672298378f4dfcf5c0;hp=74c6497b81440e50cc476b185cc506bfc5b5ca68;hb=336f6de943b8c0bbeb0f64b7e35dd9511147a20a;hpb=c41f4433d3e721073c60d55cd923a087761e45f7 diff --git a/lib/gfxpoly/test.c b/lib/gfxpoly/test.c index 74c6497..4e3c875 100644 --- a/lib/gfxpoly/test.c +++ b/lib/gfxpoly/test.c @@ -1,6 +1,5 @@ #include #include -#include #include #include #include "../gfxtools.h" @@ -26,10 +25,144 @@ gfxline_t*mkstar(int x1, int y1, int x2, int y2) return line; } -int test1() +gfxline_t* mkrandomshape(int range, int n) +{ + int i; + gfxline_t* line = malloc(sizeof(gfxline_t)*n); + for(i=0;i>4)%10-5)*spacing; + int sizex = ((r>>8)%4)*spacing; + int sizey = sizex; + if(r&65536) + sizex = -sizex; + gfxline_t*l = malloc(sizeof(gfxline_t)*5); + l[0].type = gfx_moveTo;l[0].next = &l[1]; + l[1].type = gfx_lineTo;l[1].next = &l[2]; + l[2].type = gfx_lineTo;l[2].next = &l[3]; + l[3].type = gfx_lineTo;l[3].next = &l[4]; + l[4].type = gfx_lineTo;l[4].next = 0; + l[0].x = x; + l[0].y = y-sizey; + l[1].x = x+sizex; + l[1].y = y; + l[2].x = x; + l[2].y = y+sizey; + l[3].x = x-sizex; + l[3].y = y; + l[4].x = x; + l[4].y = y-sizey; + gfxline_append(b, l); + } + if(do_centerpiece) { + for(t=0;t<5;t++) { + gfxline_t*l = gfxline_makerectangle(-9*spacing,-10,9*spacing,10); + gfxmatrix_t matrix; + memset(&matrix, 0, sizeof(gfxmatrix_t)); + double ua=t*0.43; + matrix.m00=cos(ua);matrix.m10=sin(ua); + matrix.m01=-sin(ua);matrix.m11=cos(ua); + gfxline_transform(l, &matrix); + gfxline_append(b, l); + } + gfxline_append(b, gfxline_makecircle(100,100,100,100)); + } + return b; +} + +gfxline_t* make_circles() +{ + gfxline_t*b = 0; + unsigned int c = 0; + int t; + for(t=0;t<30;t++) { + c = crc32_add_byte(c, t); + int x = c%200; + c = crc32_add_byte(c, t); + int y = c%200;; + c = crc32_add_byte(c, t^0x55); + int r = c%100; + b = gfxline_append(b, gfxline_makecircle(x,y,r,r)); + //b = gfxline_append(b, gfxline_makerectangle(10,10,100,100)); + } + return b; +} + +static windcontext_t onepolygon = {1}; + +int test0() +{ + //gfxline_t* b = mkchessboard(); + //gfxline_t* b = mkrandomshape(100,7); + gfxline_t* b = gfxline_makecircle(100,100,100,100); + + gfxmatrix_t m; + memset(&m, 0, sizeof(gfxmatrix_t)); + int t; + for(t=0;t<360;t++) { + m.m00 = cos(t*M_PI/180.0); + m.m01 = sin(t*M_PI/180.0); + m.m10 = -sin(t*M_PI/180.0); + m.m11 = cos(t*M_PI/180.0); + m.tx = 400*1.41/2; + m.ty = 400*1.41/2; + gfxline_transform(b, &m); + gfxcompactpoly_t*poly = gfxcompactpoly_from_gfxline(b, 0.05); + + gfxpoly_t*poly2 = gfxpoly_process(poly, &windrule_evenodd, &onepolygon); + gfxcompactpoly_destroy(poly); + gfxpoly_destroy(poly2); + } + gfxline_free(b); +} + +int test1(int argn, char*argv[]) { gfxline_t*box1 = gfxline_makerectangle(50,50,150,150); - // put box2 and box3 on top of each other *snicker* gfxline_t*box2 = gfxline_makerectangle(100,100,200,200); gfxline_t*box3 = gfxline_makerectangle(100,100,200,200); gfxline_t*star = mkstar(50,50, 150,150); @@ -37,7 +170,6 @@ int test1() b = gfxline_append(b, box1); b = gfxline_append(b, box2); b = gfxline_append(b, box3); - b = gfxline_append(b, star); gfxmatrix_t matrix; memset(&matrix, 0, sizeof(gfxmatrix_t)); @@ -45,15 +177,40 @@ int test1() matrix.m00=cos(ua);matrix.m10=sin(ua); matrix.m01=-sin(ua);matrix.m11=cos(ua); - gfxline_transform(b, &matrix); - gfxpoly_t*poly = gfxpoly_fillToPoly(b, 0.05); + //gfxline_transform(b, &matrix); + + gfxline_dump(b, stderr, ""); + + gfxcompactpoly_t*poly = gfxcompactpoly_from_gfxline(b, 0.05); gfxline_free(box1); gfxline_free(box2); gfxline_free(box3); gfxline_free(star); - gfxpoly_dump(poly); - gfxpoly_process(poly, &windrule_evenodd); + gfxcompactpoly_dump(poly); + gfxpoly_t*poly2 = gfxpoly_process(poly, &windrule_evenodd, &onepolygon); + gfxcompactpoly_destroy(poly); + gfxpoly_destroy(poly2); +} + +static void test_conversion(gfxline_t*line, double gridsize) +{ + double zoom=1.0; + gfxcompactpoly_t*poly = gfxcompactpoly_from_gfxline(line, gridsize); + gfxpoly_t*poly1 = gfxpoly_from_gfxline(line, gridsize); + gfxpoly_t*poly2 = gfxpoly_from_gfxcompactpoly(poly); + assert(gfxpoly_check(poly1)); + assert(gfxpoly_check(poly2)); + assert(gfxcompactpoly_check(poly)); + intbbox_t bbox = intbbox_from_polygon(poly1, zoom); + unsigned char*bitmap1 = render_polygon(poly1, &bbox, zoom, &windrule_evenodd, &onepolygon); + assert(bitmap_ok(&bbox, bitmap1)); + unsigned char*bitmap2 = render_polygon(poly2, &bbox, zoom, &windrule_evenodd, &onepolygon); + assert(bitmap_ok(&bbox, bitmap2)); + if(!compare_bitmaps(&bbox, bitmap1, bitmap2)) { + save_two_bitmaps(&bbox, bitmap1, bitmap2, "error.png"); + assert(!"bitmaps don't match"); + } } int test_square(int width, int height, int num, double gridsize, char bitmaptest) @@ -69,31 +226,38 @@ int test_square(int width, int height, int num, double gridsize, char bitmaptest line[num-1].x = line[0].x; line[num-1].y = line[0].y; line[num-1].next = 0; + + test_conversion(line, gridsize); - gfxpoly_t*poly = gfxpoly_fillToPoly(line, gridsize); + gfxcompactpoly_t*poly = gfxcompactpoly_from_gfxline(line, gridsize); gfxline_free(line); + gfxpoly_t*poly1 = gfxpoly_from_gfxcompactpoly(poly); windrule_t*rule = &windrule_circular; - gfxpoly_t*poly2 = gfxpoly_process(poly, rule); + gfxpoly_t*poly2 = gfxpoly_process(poly, rule, &onepolygon); if(bitmaptest) { intbbox_t bbox = intbbox_new(0, 0, width, height); - unsigned char*bitmap1 = render_polygon(poly, &bbox, 1.0, rule); - unsigned char*bitmap2 = render_polygon(poly2, &bbox, 1.0, &windrule_evenodd); + unsigned char*bitmap1 = render_polygon(poly1, &bbox, 1.0, rule, &onepolygon); + assert(bitmap_ok(&bbox, bitmap1)); + unsigned char*bitmap2 = render_polygon(poly2, &bbox, 1.0, &windrule_evenodd, &onepolygon); + assert(bitmap_ok(&bbox, bitmap2)); if(!compare_bitmaps(&bbox, bitmap1, bitmap2)) { save_two_bitmaps(&bbox, bitmap1, bitmap2, "error.png"); assert(!"bitmaps don't match"); } } + gfxpoly_destroy(poly1); gfxpoly_destroy(poly2); - gfxpoly_destroy(poly); + gfxcompactpoly_destroy(poly); } -int test2() +int test2(int argn, char*argv[]) { test_square(400,400, 3, 0.05, 1); int t; for(t=0;t<400;t++) { + fprintf(stderr, "%d\n", t); test_square(400,400, 50, 0.05, 1); test_square(200,3, 1000, 1.0, 0); test_square(3,200, 1000, 1.0, 0); @@ -102,30 +266,19 @@ int test2() } #include "../rfxswf.h" -void test3() +void test3(int argn, char*argv[]) { #undef N #undef RANGE #define N 100 #define RANGE 400 - int i; - gfxline_t* line = malloc(sizeof(gfxline_t)*N*2); - for(i=0;iedges; while(e) { +#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); +#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); +#endif e = e->next; } #else @@ -192,7 +355,7 @@ void test3() swf_ShapeSetEnd(tag); swf_ShapeFree(s); - gfxpoly_destroy(poly); + gfxcompactpoly_destroy(poly); gfxpoly_destroy(poly2); gfxline_free(l); @@ -211,8 +374,22 @@ void test3() swf_SaveSWF(&swf, "test.swf"); } +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; + } +} + #include -void test4() +void test4(int argn, char*argv[]) { char*dir = "ps"; DIR*_dir = opendir(dir); @@ -225,35 +402,207 @@ 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); + gfxcompactpoly_t*poly = gfxcompactpoly_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)) { + if(!gfxcompactpoly_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*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; +} +void extract_polygons_startclip(gfxdevice_t*dev, gfxline_t*line) +{ + extract_polygons_fill(dev, line, 0); +} +void extract_polygons_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*imgcoord2devcoord, gfxcxform_t*cxform) +{ + extract_polygons_fill(dev, line, 0); +} +void extract_polygons_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*gradient, gfxgradienttype_t type, gfxmatrix_t*gradcoord2devcoord) +{ + extract_polygons_fill(dev, line, 0); +} +void extract_polygons_drawlink(gfxdevice_t*dev, gfxline_t*line, const char*action) +{ + extract_polygons_fill(dev, line, 0); +} +void extract_polygons_addfont(gfxdevice_t*dev, gfxfont_t*font) +{ + int t; + for(t=0;tnum_glyphs;t++) { + //extract_polygons_fill(dev, font->glyphs[t].line, 0); + } +} +void extract_polygons_endclip(gfxdevice_t*dev) +{ +} +void extract_polygons_stroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit) +{ +} +void extract_polygons_drawchar(gfxdevice_t*dev, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix) +{ +} + +gfxdevice_t extract_polygons = +{ +name: "extract polygons", +setparameter:extract_polygons_setparameter, +startclip: extract_polygons_startclip, +endclip: extract_polygons_endclip, +stroke: extract_polygons_stroke, +fill: extract_polygons_fill, +fillbitmap: extract_polygons_fillbitmap, +fillgradient: extract_polygons_fillgradient, +addfont: extract_polygons_addfont, +drawchar: extract_polygons_drawchar, +drawlink: extract_polygons_drawlink, +startpage: 0, +endpage: 0, +geterror: 0, +finish: 0, +internal: 0 +}; + +void test5(int argn, char*argv[]) +{ + gfxsource_t*driver = gfxsource_pdf_create(); + char*dir = "pdfs"; + DIR*_dir = opendir(dir); + if(!_dir) return; + struct dirent*file; + while(1) { + file = readdir(_dir); + if (!file) + break; + if(!strstr(file->d_name, ".pdf")) + continue; + char* filename = allocprintf("%s/%s", dir, file->d_name); + + 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++) { + fprintf(stderr, "%s (page %d)\n", filename, t); + gfxpage_t* page = doc->getpage(doc, t); + page->render(page, out); + page->destroy(page); + } + doc->destroy(doc); + if(argn>1) + break; + free(filename); } + closedir(_dir); + driver->destroy(driver); } -int main() +int main(int argn, char*argv[]) { - test4(); + test4(argn, argv); } +