X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fdevices%2Frender.c;h=410c5f75f13bc58f5480592d9653d982326d173f;hb=580c48fef10df9184cf2728338e89f7db0fef2f5;hp=b8dc8134ae752633de3b4276c4a23359de1c33c7;hpb=31c9d97d7757968e8275b611fab047125aad01cd;p=swftools.git diff --git a/lib/devices/render.c b/lib/devices/render.c index b8dc813..410c5f7 100644 --- a/lib/devices/render.c +++ b/lib/devices/render.c @@ -48,6 +48,7 @@ typedef struct _renderline typedef struct _internal_result { gfximage_t img; struct _internal_result*next; + char palette; } internal_result_t; typedef struct _clipbuffer { @@ -67,6 +68,8 @@ typedef struct _internal { int ymin, ymax; int fillwhite; + char palette; + RGBA* img; clipbuffer_t*clipbuf; @@ -308,7 +311,7 @@ static void fill_line_bitmap(RGBA*line, U32*z, int y, int x1, int x2, fillinfo_t gfxmatrix_t*m = info->matrix; gfximage_t*b = info->image; - if(!b->width || !b->height) { + if(!b || !b->width || !b->height) { gfxcolor_t red = {255,255,0,0}; fill_line_solid(line, z, y, x1, x2, red); return; @@ -517,6 +520,9 @@ int render_setparameter(struct _gfxdevice*dev, const char*key, const char*value) } else if(!strcmp(key, "fillwhite")) { i->fillwhite = atoi(value); return 1; + } else if(!strcmp(key, "palette")) { + i->palette = atoi(value); + return 1; } return 0; } @@ -566,7 +572,7 @@ void render_stroke(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxc } else if(line->type == gfx_lineTo) { double x1=x*i->zoom,y1=y*i->zoom; double x3=line->x*i->zoom,y3=line->y*i->zoom; - add_solidline(dev, x1, y1, x3, y3, width * i->multiply); + add_solidline(dev, x1, y1, x3, y3, width * i->zoom); fill_solid(dev, color); } else if(line->type == gfx_splineTo) { int t,parts; @@ -587,7 +593,7 @@ void render_stroke(struct _gfxdevice*dev, gfxline_t*line, gfxcoord_t width, gfxc double nx = (double)(t*t*x3 + 2*t*(parts-t)*x2 + (parts-t)*(parts-t)*x1)/(double)(parts*parts); double ny = (double)(t*t*y3 + 2*t*(parts-t)*y2 + (parts-t)*(parts-t)*y1)/(double)(parts*parts); - add_solidline(dev, xx, yy, nx, ny, width * i->multiply); + add_solidline(dev, xx, yy, nx, ny, width * i->zoom); fill_solid(dev, color); xx = nx; yy = ny; @@ -793,12 +799,20 @@ int render_result_save(gfxresult_t*r, const char*filename) } while(i->next) { sprintf(filenamebuf, "%s.%d.png", origname, nr); - writePNG(filename, (unsigned char*)i->img.data, i->img.width, i->img.height); + if(!i->palette) { + writePNG(filename, (unsigned char*)i->img.data, i->img.width, i->img.height); + } else { + writePalettePNG(filename, (unsigned char*)i->img.data, i->img.width, i->img.height); + } nr++; } free(origname); } else { - writePNG(filename, (unsigned char*)i->img.data, i->img.width, i->img.height); + if(!i->palette) { + writePNG(filename, (unsigned char*)i->img.data, i->img.width, i->img.height); + } else { + writePalettePNG(filename, (unsigned char*)i->img.data, i->img.width, i->img.height); + } } return 1; } @@ -990,12 +1004,18 @@ void render_endpage(struct _gfxdevice*dev) } endclip(dev, 1); + int unclosed = 0; while(i->clipbuf) { - fprintf(stderr, "Warning: unclosed clip while processing endpage()\n"); endclip(dev, 1); + unclosed++; + } + + if(unclosed) { + fprintf(stderr, "Warning: %d unclosed clip(s) while processing endpage()\n", unclosed); } internal_result_t*ir= (internal_result_t*)rfx_calloc(sizeof(internal_result_t)); + ir->palette = i->palette; int y,x; @@ -1058,3 +1078,10 @@ void gfxdevice_render_init(gfxdevice_t*dev) dev->finish = render_finish; } + +gfxdevice_t* gfxdevice_render_new() +{ + gfxdevice_t* d = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); + gfxdevice_render_init(d); + return d; +}