added fillstyle and linestyle primitives.
[swftools.git] / pdf2swf / swfoutput.cc
index 3318cfb..1c12e46 100644 (file)
@@ -97,8 +97,8 @@ typedef struct _swfoutput_internal
     int lastwasfill;
     int shapeisempty;
     char fill;
-    int max_x;
-    int max_y;
+    int min_x,max_x;
+    int min_y,max_y;
     TAG* cliptags[128];
     int clipshapes[128];
     U32 clipdepths[128];
@@ -1160,7 +1160,7 @@ static void endtext(swfoutput*obj)
     swf_SetRect(i->tag,&r);
 
     MATRIX m;
-    swf_GetMatrix(0, &m);
+    swf_GetMatrix(0, &m); /* set unit matrix- the real matrix is in the placeobject */
     swf_SetMatrix(i->tag,&m);
 
     putcharacters(obj, i->tag);
@@ -1507,6 +1507,8 @@ void swfoutput_newpage(struct swfoutput*obj, int pageNum, int movex, int movey,
         swf_PlaceObjectFree(&obj);
     }
 
+    i->min_x = x1;
+    i->min_y = y1;
     i->max_x = x2;
     i->max_y = y2;
     
@@ -1718,8 +1720,15 @@ static void endshape(swfoutput*obj, int clipdepth)
        fixAreas(obj);
        
     if(i->shapeisempty ||
+       /*bbox empty?*/
        (i->bboxrect.xmin == i->bboxrect.xmax && 
-        i->bboxrect.ymin == i->bboxrect.ymax)) 
+        i->bboxrect.ymin == i->bboxrect.ymax) ||
+       /*bbox outside page?*/
+       (i->bboxrect.xmax <= i->min_x ||
+       i->bboxrect.ymax <= i->min_y ||
+       i->bboxrect.xmin >= i->max_x ||
+       i->bboxrect.ymin >= i->max_y)
+       ) 
     {
        // delete the shape again, we didn't do anything
        cancelshape(obj);
@@ -1749,7 +1758,7 @@ void swfoutput_finalize(struct swfoutput*obj)
 
     if(i->tag && i->tag->id == ST_END)
         return; //already done
-       
+
     if(i->frameno == i->lastframeno) // fix: add missing pagefeed
         swfoutput_pagefeed(obj);
 
@@ -1767,6 +1776,15 @@ void swfoutput_finalize(struct swfoutput*obj)
         iterator = iterator->next;
     }
     i->tag = swf_InsertTag(i->tag,ST_END);
+    TAG* tag = i->tag->prev;
+
+    /* remove the removeobject2 tags between the last ST_SHOWFRAME
+       and the ST_END- they confuse the flash player  */
+    while(tag->id == ST_REMOVEOBJECT2) {
+        TAG* prev = tag->prev;
+        swf_DeleteTag(tag);
+        tag = prev;
+    }
 }
 
 SWF* swfoutput_get(struct swfoutput*obj)