X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fdevices%2Fswf.c;h=b12f27baaa06130ceee9e0070d5b428d0f906152;hb=66f6d2a40bed5716c469f0e2c8de1cc13e0022a2;hp=86b2e2c804b3b75b3e03e5023a621e2687677f55;hpb=255ce8bb8fa14085b4d1e65073a60f4e8cdedd98;p=swftools.git diff --git a/lib/devices/swf.c b/lib/devices/swf.c index 86b2e2c..b12f27b 100644 --- a/lib/devices/swf.c +++ b/lib/devices/swf.c @@ -78,6 +78,7 @@ typedef struct _swfoutput_internal int config_enablezlib; int config_insertstoptag; int config_flashversion; + int config_reordertags; int config_splinemaxerror; int config_fontsplinemaxerror; int config_filloverlap; @@ -234,6 +235,7 @@ static swfoutput_internal* init_internal_struct() i->config_linktarget=0; i->config_internallinkfunction=0; i->config_externallinkfunction=0; + i->config_reordertags=1; i->config_linkcolor.r = i->config_linkcolor.g = i->config_linkcolor.b = 255; i->config_linkcolor.a = 0x40; @@ -247,8 +249,10 @@ static U16 getNewID(gfxdevice_t* dev) { swfoutput_internal*i = (swfoutput_internal*)dev->internal; if(i->currentswfid == 65535) { - if(!id_error) + if(!id_error) { msg(" ID Table overflow"); + msg(" This file is too complex to render- SWF only supports 65536 shapes at once"); + } id_error=1; i->overflow = 1; exit(1); @@ -259,8 +263,10 @@ static U16 getNewDepth(gfxdevice_t* dev) { swfoutput_internal*i = (swfoutput_internal*)dev->internal; if(i->depth == 65535) { - if(!id_error) + if(!id_error) { msg(" Depth Table overflow"); + msg(" This file is too complex to render- SWF only supports 65536 shapes at once"); + } id_error=1; i->overflow = 1; exit(1); @@ -734,6 +740,18 @@ static void endtext(gfxdevice_t*dev) putcharacters(dev, i->tag); swf_SetU8(i->tag,0); + + if(i->swf->fileVersion >= 8) { + i->tag = swf_InsertTag(i->tag, ST_CSMTEXTSETTINGS); + swf_SetU16(i->tag, i->textid); + //swf_SetU8(i->tag, /*subpixel grid*/(2<<3)|/*flashtype*/0x40); + //swf_SetU8(i->tag, /*grid*/(1<<3)|/*flashtype*/0x40); + //swf_SetU8(i->tag, /*grid*/(0<<3)|/*flashtype*/0x40); + swf_SetU8(i->tag, /*grid*/(1<<3)|/*no flashtype*/0x00); + swf_SetU32(i->tag, 0);//thickness + swf_SetU32(i->tag, 0);//sharpness + swf_SetU8(i->tag, 0);//reserved + } i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); swf_ObjectPlace(i->tag,i->textid,getNewDepth(dev),&i->page_matrix,NULL,NULL); @@ -873,6 +891,9 @@ static void setBackground(gfxdevice_t*dev, int x1, int y1, int x2, int y2) void gfxdevice_swf_init(gfxdevice_t* dev) { memset(dev, 0, sizeof(gfxdevice_t)); + + dev->name = "swf"; + dev->internal = init_internal_struct(); dev->startpage = swf_startframe; @@ -1211,6 +1232,9 @@ void swfoutput_finalize(gfxdevice_t*dev) if(i->config_enablezlib || i->config_flashversion>=6) { i->swf->compressed = 1; } + + if(i->config_reordertags) + swf_Optimize(i->swf); } int swfresult_save(gfxresult_t*gfx, char*filename) @@ -1511,24 +1535,23 @@ static void drawgfxline(gfxdevice_t*dev, gfxline_t*line) swfoutput_internal*i = (swfoutput_internal*)dev->internal; gfxcoord_t lastx=0,lasty=0,px=0,py=0; char lastwasmoveto; + int lines= 0, splines=0; while(1) { if(!line) break; /* check whether the next segment is zero */ if(line->type == gfx_moveTo) { - msg(" ======== moveTo %.2f %.2f", line->x, line->y); moveto(dev, i->tag, line->x, line->y); px = lastx = line->x; py = lasty = line->y; lastwasmoveto = 1; } if(line->type == gfx_lineTo) { - msg(" ======== lineTo %.2f %.2f", line->x, line->y); lineto(dev, i->tag, line->x, line->y); px = line->x; py = line->y; lastwasmoveto = 0; + lines++; } else if(line->type == gfx_splineTo) { - msg(" ======== splineTo %.2f %.2f", line->x, line->y); plotxy_t s,p; s.x = line->sx;p.x = line->x; s.y = line->sy;p.y = line->y; @@ -1536,9 +1559,11 @@ static void drawgfxline(gfxdevice_t*dev, gfxline_t*line) px = line->x; py = line->y; lastwasmoveto = 0; + splines++; } line = line->next; } + msg(" drawgfxline, %d lines, %d splines", lines, splines); } @@ -1732,6 +1757,8 @@ int swf_setparameter(gfxdevice_t*dev, const char*name, const char*value) i->config_enablezlib = atoi(value); } else if(!strcmp(name, "bboxvars")) { i->config_bboxvars = atoi(value); + } else if(!strcmp(name, "reordertags")) { + i->config_reordertags = atoi(value); } else if(!strcmp(name, "internallinkfunction")) { i->config_internallinkfunction = strdup(value); } else if(!strcmp(name, "externallinkfunction")) { @@ -1794,7 +1821,6 @@ int swf_setparameter(gfxdevice_t*dev, const char*name, const char*value) i->config_linkcolor.a); } else { - fprintf(stderr, "unknown parameter: %s (=%s)\n", name, value); return 0; } return 1; @@ -1876,10 +1902,10 @@ static int add_image(swfoutput_internal*i, gfximage_t*img, int targetwidth, int int num_colors = swf_ImageGetNumberOfPaletteEntries(mem,sizex,sizey,0); int has_alpha = swf_ImageHasAlpha(mem,sizex,sizey); - msg(" Drawing %dx%d %s%simage at size %dx%d (%dx%d), %s%d colors", + msg(" Drawing %dx%d %s%simage (id %d) at size %dx%d (%dx%d), %s%d colors", sizex, sizey, has_alpha?(has_alpha==2?"semi-transparent ":"transparent "):"", - is_jpeg?"jpeg-":"", + is_jpeg?"jpeg-":"", i->currentswfid+1, newsizex, newsizey, targetwidth, targetheight, /*newsizex, newsizey,*/ @@ -2001,6 +2027,7 @@ static void swf_startclip(gfxdevice_t*dev, gfxline_t*line) i->tag = swf_InsertTag(i->tag,ST_DEFINESHAPE3); RGBA col; memset(&col, 0, sizeof(RGBA)); + col.a = 255; SHAPE*shape; swf_ShapeNew(&shape); int fsid = swf_ShapeAddSolidFillStyle(shape,&col); @@ -2230,6 +2257,8 @@ static void swf_fill(gfxdevice_t*dev, gfxline_t*line, gfxcolor_t*color) swfoutput_internal*i = (swfoutput_internal*)dev->internal; if(line_is_empty(line)) return; + if(!color->a) + return; gfxbbox_t r = gfxline_getbbox(line); int is_outside_page = !is_inside_page(dev, r.xmin, r.ymin) || !is_inside_page(dev, r.xmax, r.ymax);