generates simple_viewer.swf.
[swftools.git] / pdf2swf / swfoutput.cc
index 74c982d..b031546 100644 (file)
@@ -154,9 +154,15 @@ void spline(TAG*tag,plotxy p0,plotxy p1,plotxy p2,plotxy p3,struct swfmatrix*m)
     }
 }
 
+void resetdrawer()
+{
+    swflastx = 0;
+    swflasty = 0;
+}
+
 /* draw a T1 outline. These are generated by pdf2swf and by t1lib.
    (representing characters) */
-void drawpath(TAG*tag, T1_OUTLINE*outline, struct swfmatrix*m)
+void drawpath(TAG*tag, T1_OUTLINE*outline, struct swfmatrix*m, int log)
 {
     if(tag->id != ST_DEFINEFONT &&
         tag->id != ST_DEFINESHAPE &&
@@ -166,8 +172,6 @@ void drawpath(TAG*tag, T1_OUTLINE*outline, struct swfmatrix*m)
         logf("<error> internal error: drawpath needs a shape tag, not %d\n",tag->id);
         exit(1);
     }
-    int log = 0;
-
     double x=0,y=0;
     double lastx=0,lasty=0;
     double firstx=0,firsty=0;
@@ -467,7 +471,7 @@ void drawchar(struct swfoutput*obj, SWFFont*font, char*character, int charnr, sw
 
         int lf = fill;
         fill = 1;
-        drawpath(tag, outline, &m2);
+        drawpath(tag, outline, &m2, 0);
         fill = lf;
     }
 }
@@ -492,7 +496,7 @@ void swfoutput_drawpath(swfoutput*output, T1_OUTLINE*outline,
      lastwasfill = 1;
     }
 
-    drawpath(tag, outline,m); 
+    drawpath(tag, outline,m, 0); 
 }
 
 /* SWFFont: copy all t1 font outlines to a local 
@@ -606,7 +610,7 @@ SWFFont::~SWFFont()
         logf("<verbose> Font %s has %d used characters",fontid, usednum);
         TAG*ftag = swf_InsertTag(swf.firstTag,ST_DEFINEFONT);
         swf_SetU16(ftag, this->swfid);
-        int initpos = swf_GetDataSize(ftag);
+        int initpos = swf_GetTagLen(ftag);
         swfmatrix m;
         m.m11 = m.m22 = 1;
         m.m21 = m.m12 = 0;
@@ -615,12 +619,14 @@ SWFFont::~SWFFont()
 
         for(t=0;t<swfcharpos;t++) 
         {
-            ptr[t] = swf_GetDataSize(ftag);
+            ptr[t] = swf_GetTagLen(ftag);
             swf_SetU16(ftag, 0x1234);
         }
         for(t=0;t<swfcharpos;t++)
         {
-            *(U16*)&ftag->data[ptr[t]] = swf_GetDataSize(ftag)-initpos;
+            *(U16*)&ftag->data[ptr[t]] = 
+               SWAP16(swf_GetTagLen(ftag)-initpos);
+
             swflastx=0;
             swflasty=0;
             swf_SetU8(ftag,0x10); //0 fill bits, 0 linestyle bits
@@ -631,7 +637,7 @@ SWFFont::~SWFFont()
             int lastfill = fill;
             fill = 1;
             storefont = 1;
-            drawpath(ftag, outline[swfcharid2char[t]],&m);
+            drawpath(ftag, outline[swfcharid2char[t]],&m, 0);
             storefont = 0;
             fill = lastfill;
             swf_ShapeSetEnd(ftag);
@@ -692,6 +698,17 @@ T1_OUTLINE*SWFFont::getOutline(char*name)
     return 0;
 }
 
+int SWFFont::getWidth(char*name)
+{
+    int t;
+    for(t=0;t<this->charnum;t++) {
+        if(!strcmp(this->charname[t],name)) {
+            return this->width[t];
+        }
+    }
+    return 0;
+}
+
 int SWFFont::getSWFCharID(char*name, int charnr)
 {
     int t;
@@ -1295,15 +1312,21 @@ int swfoutput_drawimagejpeg(struct swfoutput*obj, char*filename, int sizex,int s
         double x3,double y3,
         double x4,double y4)
 {
+    TAG*oldtag;
     if(shapeid>=0)
      endshape();
     if(textid>=0)
      endtext();
 
     int bitid = ++currentswfid;
+    oldtag = tag;
     tag = swf_InsertTag(tag,ST_DEFINEBITSJPEG2);
     swf_SetU16(tag, bitid);
-    swf_SetJPEGBits(tag, filename, jpegquality);
+    if(swf_SetJPEGBits(tag, filename, jpegquality)<0) {
+       swf_DeleteTag(tag);
+       tag = oldtag;
+       return -1;
+    }
 
     drawimage(obj, bitid, sizex, sizey, x1,y1,x2,y2,x3,y3,x4,y4);
     return bitid;
@@ -1315,15 +1338,21 @@ int swfoutput_drawimagelossless(struct swfoutput*obj, RGBA*mem, int sizex,int si
         double x3,double y3,
         double x4,double y4)
 {
+    TAG*oldtag;
     if(shapeid>=0)
      endshape();
     if(textid>=0)
      endtext();
 
     int bitid = ++currentswfid;
+    oldtag = tag;
     tag = swf_InsertTag(tag,ST_DEFINEBITSLOSSLESS);
     swf_SetU16(tag, bitid);
-    swf_SetLosslessBits(tag,sizex,sizey,mem, BMF_32BIT);
+    if(swf_SetLosslessBits(tag,sizex,sizey,mem, BMF_32BIT)<0) {
+       swf_DeleteTag(tag);
+       tag = oldtag;
+       return -1;
+    }
     
     drawimage(obj, bitid, sizex, sizey, x1,y1,x2,y2,x3,y3,x4,y4);
     return bitid;
@@ -1335,15 +1364,21 @@ int swfoutput_drawimagelossless256(struct swfoutput*obj, U8*mem, RGBA*pal, int s
         double x3,double y3,
         double x4,double y4)
 {
+    TAG*oldtag;
     if(shapeid>=0)
      endshape();
     if(textid>=0)
      endtext();
 
     int bitid = ++currentswfid;
+    oldtag = tag;
     tag = swf_InsertTag(tag,ST_DEFINEBITSLOSSLESS2);
     swf_SetU16(tag, bitid);
-    swf_SetLosslessBitsIndexed(tag,sizex,sizey,mem, pal, 256);
+    if(swf_SetLosslessBitsIndexed(tag,sizex,sizey,mem, pal, 256)<0) {
+       swf_DeleteTag(tag);
+       tag = oldtag;
+       return -1;
+    }
   
     drawimage(obj, bitid, sizex, sizey, x1,y1,x2,y2,x3,y3,x4,y4);
     return bitid;
@@ -1355,6 +1390,7 @@ void swfoutput_drawimageagain(struct swfoutput*obj, int id, int sizex,int sizey,
         double x3,double y3,
         double x4,double y4)
 {
+    if(id<0) return;
     if(shapeid>=0)
      endshape();
     if(textid>=0)