From: kramm Date: Sat, 14 Aug 2004 12:46:21 +0000 (+0000) Subject: * remove empty shapes from output X-Git-Tag: release-0-6-0~17 X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=commitdiff_plain;h=25bf0e14cdf91c28c4a301485471fa7b15316dec * remove empty shapes from output * added fix for Powerpoint lines-with-arrow bug. --- diff --git a/pdf2swf/swfoutput.cc b/pdf2swf/swfoutput.cc index be993e4..6ed1c31 100644 --- a/pdf2swf/swfoutput.cc +++ b/pdf2swf/swfoutput.cc @@ -67,7 +67,6 @@ static SHAPE* shape; static int shapeid = -1; static int textid = -1; -static int drawmode = -1; static int fillstyleid; static int linestyleid; static int swflastx=0; @@ -198,27 +197,26 @@ static void stopFill() { if(lastwasfill) { - swf_ShapeSetStyle(tag,shape,linestyleid,0x8000,0); - fillstylechanged = 1; - lastwasfill = 0; + swf_ShapeSetStyle(tag,shape,linestyleid,0x8000,0); + fillstylechanged = 1; + lastwasfill = 0; } } static void startFill() { if(!lastwasfill) { - swf_ShapeSetStyle(tag,shape,0x8000,fillstyleid,0); - fillstylechanged = 1; - lastwasfill = 1; + swf_ShapeSetStyle(tag,shape,0x8000,fillstyleid,0); + fillstylechanged = 1; + lastwasfill = 1; } } /* draw an outline. These are generated by pdf2swf and by t1lib (representing characters). */ -void drawpath(TAG*tag, SWF_OUTLINE*outline, struct swfmatrix*m, int log) +void drawpath(struct swfoutput*output, SWF_OUTLINE*outline, struct swfmatrix*m, int log) { - if(tag->id != ST_DEFINEFONT && - tag->id != ST_DEFINESHAPE && + if( tag->id != ST_DEFINESHAPE && tag->id != ST_DEFINESHAPE2 && tag->id != ST_DEFINESHAPE3) { @@ -236,6 +234,17 @@ void drawpath(TAG*tag, SWF_OUTLINE*outline, struct swfmatrix*m, int log) y += (outline->dest.y/(float)0xffff); if(outline->type == SWF_PATHTYPE_MOVE) { + if(!init && fill && output->drawmode != DRAWMODE_EOFILL && !ignoredraworder) { + /* drawmode=FILL (not EOFILL) means that + seperate shapes do not cancel each other out. + On SWF side, we need to start a new shape for each + closed polygon, because SWF only knows EOFILL. + */ + endshape(); + startshape(output); + startFill(); + } + if(((int)(lastx*20) != (int)(firstx*20) || (int)(lasty*20) != (int)(firsty*20)) && fill && !init) @@ -657,8 +666,7 @@ static float t1linelen(SWF_OUTLINE*line) void drawpath2poly(struct swfoutput *output, SWF_OUTLINE*outline, struct swfmatrix*m, int log, int line_join, int line_cap, double line_width, double miter_limit) { - if(tag->id != ST_DEFINEFONT && - tag->id != ST_DEFINESHAPE && + if( tag->id != ST_DEFINESHAPE && tag->id != ST_DEFINESHAPE2 && tag->id != ST_DEFINESHAPE3) { msg(" internal error: drawpath needs a shape tag, not %d\n",tag->id); @@ -988,7 +996,7 @@ void swfoutput_drawpath(swfoutput*output, SWF_OUTLINE*outline, else startFill(); - drawpath(tag, outline,m, 0); + drawpath(output, outline,m, 0); } void swfoutput_drawpath2poly(struct swfoutput*output, SWF_OUTLINE*outline, struct swfmatrix*m, int line_join, int line_cap, double line_width, double miter_limit) @@ -1164,6 +1172,7 @@ void swfoutput_init(struct swfoutput* obj, char*_filename, int x1, int y1, int x msg(" initializing swf output for size %d*%d\n", sizex,sizey); obj->swffont = 0; + obj->drawmode = -1; memset(&swf,0x00,sizeof(SWF)); @@ -1293,12 +1302,14 @@ static void endshape() swf_ShapeSetEnd(tag); if(shapeisempty) { - msg(" empty shape"); - // TODO: delete tag + // delete the tag again, we didn't do anything + TAG*todel = tag; + tag = tag->prev; + swf_DeleteTag(todel); + } else { + tag = swf_InsertTag(tag,ST_PLACEOBJECT2); + swf_ObjectPlace(tag,shapeid,/*depth*/depth++,NULL,NULL,NULL); } - - tag = swf_InsertTag(tag,ST_PLACEOBJECT2); - swf_ObjectPlace(tag,shapeid,/*depth*/depth++,NULL,NULL,NULL); shapeid = -1; } @@ -1392,7 +1403,7 @@ void swfoutput_destroy(struct swfoutput* obj) void swfoutput_setdrawmode(swfoutput* obj, int mode) { - drawmode = mode; + obj->drawmode = mode; if(mode == DRAWMODE_FILL) fill = 1; else if(mode == DRAWMODE_EOFILL) @@ -1460,7 +1471,7 @@ void swfoutput_startclip(swfoutput*obj, SWF_OUTLINE*outline, struct swfmatrix*m) } startshape(obj); - int olddrawmode = drawmode; + int olddrawmode = obj->drawmode; swfoutput_setdrawmode(obj, DRAWMODE_CLIP); swfoutput_drawpath(obj, outline, m); swf_ShapeSetEnd(tag);