X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fgfxpoly%2Frenderpoly.c;h=c1a428f6c39d1546799f24e099e655e21a22d774;hp=06440fa17fe107951e07e18bed812cae909b017f;hb=336f6de943b8c0bbeb0f64b7e35dd9511147a20a;hpb=ae7c92fe5721f97e786a8bbe9153eadbf292460d diff --git a/lib/gfxpoly/renderpoly.c b/lib/gfxpoly/renderpoly.c index 06440fa..c1a428f 100644 --- a/lib/gfxpoly/renderpoly.c +++ b/lib/gfxpoly/renderpoly.c @@ -36,10 +36,10 @@ static inline void add_pixel(renderbuf_t*buf, double x, int y, segment_dir_t dir p.fs = fs; p.e = e; p.polygon_nr = polygon_nr; - - if(x >= buf->bbox.xmax || y >= buf->bbox.ymax || y < buf->bbox.ymin) - return; + if(y >= buf->bbox.ymax || y < buf->bbox.ymin) + return; + renderline_t*l = &buf->lines[y-buf->bbox.ymin]; if(l->num == l->size) { @@ -120,7 +120,7 @@ static void fill_bitwise(unsigned char*line, int x1, int x2) } } -unsigned char* render_polygon(gfxpoly_t*polygon, intbbox_t*bbox, double zoom, windrule_t*rule) +unsigned char* render_polygon(gfxpoly_t*polygon, intbbox_t*bbox, double zoom, windrule_t*rule, windcontext_t*context) { renderbuf_t _buf, *buf=&_buf; buf->width = (bbox->xmax - bbox->xmin); @@ -128,9 +128,10 @@ unsigned char* render_polygon(gfxpoly_t*polygon, intbbox_t*bbox, double zoom, wi buf->bbox = *bbox; buf->zoom = zoom * polygon->gridsize; int width8 = (buf->width+7) >> 3; + char bleeding = 0; unsigned char* image = (unsigned char*)malloc(width8*buf->height); memset(image, 0, width8*buf->height); - + buf->lines = (renderline_t*)rfx_alloc(buf->height*sizeof(renderline_t)); int y; for(y=0;yheight;y++) { @@ -152,27 +153,29 @@ unsigned char* render_polygon(gfxpoly_t*polygon, intbbox_t*bbox, double zoom, wi int num = buf->lines[y].num; qsort(points, num, sizeof(renderpoint_t), compare_renderpoints); int lastx = 0; - - windstate_t fill = rule->start(1); + + windstate_t fill = rule->start(context); for(n=0;nx - bbox->xmin); - + if(x < lastx) - x = lastx; - if(x > buf->width) { - break; - } - if(fill.is_filled && x!=lastx) { + x = lastx; + if(x > buf->width) + x = buf->width; + + if(fill.is_filled && lastxadd(fill, p->fs, p->dir, p->polygon_nr); + fill = rule->add(context, fill, p->fs, p->dir, p->polygon_nr); lastx = x; } if(fill.is_filled && lastx!=buf->width) { /* we're bleeding, fill over padding, too. */ fprintf(stderr, "Polygon %08x is bleeding in line %d\n", polygon, y); fill_bitwise(line, lastx, width8*8); + assert(line[width8-1]&0x01); + bleeding = 1; } } @@ -182,6 +185,9 @@ unsigned char* render_polygon(gfxpoly_t*polygon, intbbox_t*bbox, double zoom, wi } memset(&buf->lines[y], 0, sizeof(renderline_t)); } + if(bleeding) { + assert(!bitmap_ok(bbox, image)); + } free(buf->lines);buf->lines=0; return image; } @@ -192,6 +198,14 @@ unsigned char* render_polygon(gfxpoly_t*polygon, intbbox_t*bbox, double zoom, wi static inline max(double a, double b) {return a>b?a:b;} static inline min(double a, double b) {return a b.xmax) b.xmax = x2; if(y2 > b.ymax) b.ymax = y2; } - + if(b.xmax > (int)(MAX_WIDTH*zoom)) b.xmax = (int)(MAX_WIDTH*zoom); if(b.ymax > (int)(MAX_HEIGHT*zoom)) @@ -246,10 +261,8 @@ intbbox_t intbbox_from_polygon(gfxpoly_t*polygon, double zoom) b.xmin = b.xmax; if(b.ymin > b.ymax) b.ymin = b.ymax; - - b.xmax += 8; - while(((b.xmax - b.xmin)&0x07) != 0x04) - b.xmax++; + + b.xmax = adjust_x(b.xmin, b.xmax); b.width = b.xmax - b.xmin; b.height = b.ymax - b.ymin; @@ -279,8 +292,6 @@ int bitmap_ok(intbbox_t*bbox, unsigned char*data) { int y; int width8 = (bbox->width+7) >> 3; - if((bbox->width&7) == 0) - return 1; for(y=0;yheight;y++) { if(data[width8-1]&0x01) return 0; //bleeding