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;t<n;t++) {
c = crc32_add_byte(c, t);
int x = c%200;
c = crc32_add_byte(c, t);
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()
+int test_speed()
{
//gfxline_t* b = mkchessboard();
//gfxline_t* b = mkrandomshape(100,7);
- gfxline_t* b = gfxline_makecircle(100,100,100,100);
+ gfxline_t* b = make_circles(30);
gfxmatrix_t m;
memset(&m, 0, sizeof(gfxmatrix_t));
int t;
for(t=0;t<360;t++) {
+ printf("%d\n", 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);
- gfxpoly_t*poly = gfxpoly_from_gfxline(b, 0.05);
+ gfxline_t*l = gfxline_clone(b);
+ gfxline_transform(l, &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);
- gfxpoly_destroy(poly);
+ gfxline_free(l);
}
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);
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));
//gfxline_transform(b, &matrix);
- gfxpoly_t*poly = gfxpoly_from_gfxline(b, 0.05);
+ 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);
+ gfxcompactpoly_dump(poly);
gfxpoly_t*poly2 = gfxpoly_process(poly, &windrule_evenodd, &onepolygon);
+ gfxcompactpoly_destroy(poly);
gfxpoly_destroy(poly2);
- gfxpoly_destroy(poly);
+}
+
+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)
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_from_gfxline(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, &onepolygon);
if(bitmaptest) {
intbbox_t bbox = intbbox_new(0, 0, width, height);
- unsigned char*bitmap1 = render_polygon(poly, &bbox, 1.0, rule, &onepolygon);
+ 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 argn, char*argv[])
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);
//gfxline_t*line = mkrandomshape(RANGE, N);
//windrule_t*rule = &windrule_circular;
//gfxline_t*line = mkchessboard();
- gfxline_t*line = make_circles();
+ gfxline_t*line = make_circles(30);
windrule_t*rule = &windrule_evenodd;
//windrule_t*rule = &windrule_circular;
gfxline_t*l = gfxline_clone(line);
gfxline_transform(l, &m);
+
+ test_conversion(l, 0.05);
- gfxpoly_t*poly = gfxpoly_from_gfxline(l, 0.05);
+ gfxcompactpoly_t*poly = gfxcompactpoly_from_gfxline(l, 0.05);
gfxpoly_t*poly2 = gfxpoly_process(poly, rule, &onepolygon);
tag = swf_InsertTag(tag, ST_DEFINESHAPE);
swf_ShapeSetEnd(tag);
swf_ShapeFree(s);
- gfxpoly_destroy(poly);
+ gfxcompactpoly_destroy(poly);
gfxpoly_destroy(poly2);
gfxline_free(l);
filename = argv[1];
windrule_t*rule = &windrule_evenodd;
- gfxpoly_t*poly = gfxpoly_from_file(filename, 1.0);//0.01);
+ gfxcompactpoly_t*poly = gfxcompactpoly_from_file(filename, 1.0);//0.01);
if(argn!=2)
free(filename);
double zoom = 1.0;
- if(!gfxpoly_check(poly)) {
+ 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(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);
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");
free(bitmap2);
// second pass renders the 90° rotated version
- rotate90(poly);
+ rotate90(poly1);
rotate90(poly2);
}
- gfxpoly_destroy(poly);
+ gfxpoly_destroy(poly1);
gfxpoly_destroy(poly2);
+ gfxcompactpoly_destroy(poly);
if(argn==2)
break;
}
//gfxcompactpoly_t*c = gfxcompactpoly_from_gfxline(line, 0.05);
//gfxcompactpoly_free(c);
- gfxpoly_t*poly = gfxpoly_from_gfxline(line, 0.05);
+ gfxcompactpoly_t*poly = gfxcompactpoly_from_gfxline(line, 0.05);
- gfxline_dump(line, stderr, "");
- gfxpoly_dump(poly);
+ //gfxline_dump(line, stderr, "");
+ //gfxcompactpoly_dump(poly);
- if(gfxpoly_size(poly)>100000) {
- fprintf(stderr, "%d segments (skipping)\n", gfxpoly_size(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(!gfxpoly_check(poly)) {
- gfxpoly_destroy(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(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;
free(bitmap1);
free(bitmap2);
- gfxpoly_destroy(poly);
+ gfxpoly_destroy(poly1);
gfxpoly_destroy(poly2);
+ gfxcompactpoly_destroy(poly);
}
int extract_polygons_setparameter(gfxdevice_t*dev, const char*key, const char*value) {
return 0;
int main(int argn, char*argv[])
{
- test3(argn, argv);
+ test_speed(argn, argv);
}