added -z option.
[swftools.git] / pdf2swf / swfoutput.cc
index 170d3cf..d6974b2 100644 (file)
@@ -35,6 +35,7 @@ int ignoredraworder=0;
 int drawonlyshapes=0;
 int jpegquality=85;
 int storeallcharacters=0;
+int enablezlib=0;
 static int flag_protected = 0;
 
 typedef unsigned char u8;
@@ -71,6 +72,8 @@ int clippos = 0;
 int CHARMIDX = 0;
 int CHARMIDY = 0;
 
+char fillstylechanged = 0;
+
 static void startshape(struct swfoutput* obj);
 static void starttext(struct swfoutput* obj);
 static void endshape();
@@ -91,8 +94,9 @@ static void moveto(TAG*tag, plotxy p0)
 {
     int rx = (int)(p0.x*20);
     int ry = (int)(p0.y*20);
-    if(rx!=swflastx || ry!=swflasty) {
+    if(rx!=swflastx || ry!=swflasty || fillstylechanged) {
       swf_ShapeSetMove (tag, shape, rx,ry);
+      fillstylechanged = 0;
     }
     swflastx=rx;
     swflasty=ry;
@@ -121,7 +125,8 @@ static void splineto(TAG*tag, plotxy control,plotxy end)
     int ey = ((int)(end.y*20)-swflasty);
     swflastx += ex;
     swflasty += ey;
-    swf_ShapeSetCurve(tag, shape, cx,cy,ex,ey);
+    if(cx || cy || ex || ey)
+       swf_ShapeSetCurve(tag, shape, cx,cy,ex,ey);
 }
 
 /* write a line, given two points and the transformation
@@ -465,8 +470,10 @@ static void drawchar(struct swfoutput*obj, SWFFont*font, char*character, int cha
         if(shapeid<0)
             startshape(obj);
 
-        if(!lastwasfill)
+        if(!lastwasfill) {
          swf_ShapeSetStyle(tag,shape,0x8000,fillstyleid,0);
+        fillstylechanged = 1;
+       }
         lastwasfill = 1;
 
         int lf = fill;
@@ -482,17 +489,27 @@ void swfoutput_drawpath(swfoutput*output, T1_OUTLINE*outline,
 {
     if(textid>=0)
         endtext();
+
+    /* Multiple polygons in one shape don't overlap correctly, 
+       so we better start a new shape here if the polygon is filled
+     */
+    if(shapeid>=0 && fill && !ignoredraworder) {
+       endshape();
+    }
+
     if(shapeid<0)
         startshape(output);
 
     if(lastwasfill && !fill)
     {
      swf_ShapeSetStyle(tag,shape,linestyleid,0x8000,0);
+     fillstylechanged = 1;
      lastwasfill = 0;
     }
     if(!lastwasfill && fill)
     {
      swf_ShapeSetStyle(tag,shape,0x8000,fillstyleid,0);
+     fillstylechanged = 1;
      lastwasfill = 1;
     }
 
@@ -634,6 +651,7 @@ SWFFont::~SWFFont()
             s.bits.fill = 1;
             s.bits.line = 0;
             swf_ShapeSetStyle(ftag,&s,0,1,0);
+           fillstylechanged = 1;
             int lastfill = fill;
             fill = 1;
             storefont = 1;
@@ -996,8 +1014,14 @@ void swfoutput_destroy(struct swfoutput* obj)
  
     tag = swf_InsertTag(tag,ST_END);
 
-    if FAILED(swf_WriteSWF(fi,&swf)) 
-     logf("<error> WriteSWF() failed.\n");
+    if(enablezlib) {
+      if FAILED(swf_WriteSWC(fi,&swf)) 
+       logf("<error> WriteSWC() failed.\n");
+    } else {
+      if FAILED(swf_WriteSWF(fi,&swf)) 
+       logf("<error> WriteSWF() failed.\n");
+    }
+
     if(filename)
      close(fi);
     logf("<notice> SWF written\n");
@@ -1024,9 +1048,9 @@ void swfoutput_setfillcolor(swfoutput* obj, u8 r, u8 g, u8 b, u8 a)
        obj->fillrgb.g == g &&
        obj->fillrgb.b == b &&
        obj->fillrgb.a == a) return;
-
     if(shapeid>=0)
      endshape();
+
     obj->fillrgb.r = r;
     obj->fillrgb.g = g;
     obj->fillrgb.b = b;
@@ -1179,6 +1203,8 @@ static void drawlink(struct swfoutput*obj, ActionTAG*actions1, ActionTAG*actions
     int myshapeid2;
     double xmin,ymin;
     double xmax=xmin=points[0].x,ymax=ymin=points[0].y;
+    double posx = 0;
+    double posy = 0;
     int t;
     int buttonid = ++currentswfid;
     for(t=1;t<4;t++)
@@ -1188,8 +1214,18 @@ static void drawlink(struct swfoutput*obj, ActionTAG*actions1, ActionTAG*actions
         if(points[t].x<xmin) xmin=points[t].x;
         if(points[t].y<ymin) ymin=points[t].y;
     }
+   
     p1.x=points[0].x; p1.y=points[0].y; p2.x=points[1].x; p2.y=points[1].y; 
     p3.x=points[2].x; p3.y=points[2].y; p4.x=points[3].x; p4.y=points[3].y;
+   
+    /* the following code subtracts the upper left edge from all coordinates,
+       and set's posx,posy so that ST_PLACEOBJECT is used with a matrix.
+       Necessary for preprocessing with swfcombine. */
+    posx = xmin; posy = ymin;
+    p1.x-=posx;p2.x-=posx;p3.x-=posx;p4.x-=posx;
+    p1.y-=posy;p2.y-=posy;p3.y-=posy;p4.y-=posy;
+    xmin -= posx; ymin -= posy;
+    xmax -= posx; ymax -= posy;
     
     /* shape */
     myshapeid = ++currentswfid;
@@ -1277,7 +1313,17 @@ static void drawlink(struct swfoutput*obj, ActionTAG*actions1, ActionTAG*actions
     }
     
     tag = swf_InsertTag(tag,ST_PLACEOBJECT2);
-    swf_ObjectPlace(tag, buttonid, depth++,0,0,0);
+
+    if(posx!=0 || posy!=0) {
+       MATRIX m;
+       swf_GetMatrix(0,&m);
+       m.tx = (int)(posx*20);
+       m.ty = (int)(posy*20);
+       swf_ObjectPlace(tag, buttonid, depth++,&m,0,0);
+    }
+    else {
+       swf_ObjectPlace(tag, buttonid, depth++,0,0,0);
+    }
 }
 
 static void drawimage(struct swfoutput*obj, int bitid, int sizex,int sizey,