* remove empty shapes from output
authorkramm <kramm>
Sat, 14 Aug 2004 12:46:21 +0000 (12:46 +0000)
committerkramm <kramm>
Sat, 14 Aug 2004 12:46:21 +0000 (12:46 +0000)
* added fix for Powerpoint lines-with-arrow bug.

pdf2swf/swfoutput.cc

index be993e4..6ed1c31 100644 (file)
@@ -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);