summaryrefslogtreecommitdiff
path: root/pdf2swf
diff options
context:
space:
mode:
Diffstat (limited to 'pdf2swf')
-rw-r--r--pdf2swf/swfoutput.cc51
1 files changed, 31 insertions, 20 deletions
diff --git a/pdf2swf/swfoutput.cc b/pdf2swf/swfoutput.cc
index be993e4c..6ed1c312 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("<error> 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("<verbose> 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("<debug> 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);