s/GetDataSize/GetTagLen/g
[swftools.git] / pdf2swf / swfoutput.cc
index 07969d9..de6ace2 100644 (file)
@@ -34,6 +34,7 @@ int opennewwindow=0;
 int ignoredraworder=0;
 int drawonlyshapes=0;
 int jpegquality=85;
+int storeallcharacters=0;
 static int flag_protected = 0;
 
 typedef unsigned char u8;
@@ -420,7 +421,7 @@ void putcharacter(struct swfoutput*obj, int fontid, int charid,
 
 
 /* process a character. */
-void drawchar(struct swfoutput*obj, SWFFont*font, char*character, swfmatrix*m)
+void drawchar(struct swfoutput*obj, SWFFont*font, char*character, int charnr, swfmatrix*m)
 {
     int usefonts=1;
     if(m->m12!=0 || m->m21!=0)
@@ -430,7 +431,7 @@ void drawchar(struct swfoutput*obj, SWFFont*font, char*character, swfmatrix*m)
 
     if(usefonts && ! drawonlyshapes)
     {
-        int charid = font->getSWFCharID(character);
+        int charid = font->getSWFCharID(character, charnr);
         if(shapeid>=0)
             endshape();
         if(textid<0)
@@ -504,29 +505,45 @@ SWFFont::SWFFont(char*name, int id, char*filename)
     this->name = strdup(T1_GetFontFileName(id));
     this->fontid = strdup(name);
     this->t1id = id;
-
+    
     char**a= T1_GetAllCharNames(id);
-    int t=0, outlinepos=0;
+    int t, outlinepos=0;
     char*map[256];
+
+    t=0;
     while(a[t])
         t++;
     this->charnum = t;
-    if(!t) 
+
+    if(!charnum) 
         return;
-    logf("<verbose> Font %s(%d): Storing %d outlines.\n", name, id, t);
+    logf("<verbose> Font %s(%d): Storing %d outlines.\n", name, id, charnum);
+
+    this->standardtablesize = 256;
+    if(this->charnum < this->standardtablesize)
+       this->standardtablesize = this->charnum;
+    this->standardtable = (char**)malloc(standardtablesize*sizeof(char*));
+
+    for(t = 0; t < this->standardtablesize; t++) {
+       char*name = T1_GetCharName(id,t);
+       if(!name)
+           name = "";
+       standardtable[t] = strdup(name);
+    }
     
-    outline = (T1_OUTLINE**)malloc(t*sizeof(T1_OUTLINE*));
-    charname = (char**)malloc(t*sizeof(char*));
-    used = (char*)malloc(t*sizeof(char));
-    char2swfcharid = (U16*)malloc(t*2);
-    swfcharid2char = (U16*)malloc(t*2);
+    outline = (T1_OUTLINE**)malloc(charnum*sizeof(T1_OUTLINE*));
+    charname = (char**)malloc(charnum*sizeof(char*));
+    width = (int*)malloc(charnum*sizeof(int));
+    memset(width, 0, charnum*sizeof(int));
+    memset(charname, 0, charnum*sizeof(char*));
+    used = (char*)malloc(charnum*sizeof(char));
+    char2swfcharid = (U16*)malloc(charnum*2);
+    swfcharid2char = (U16*)malloc(charnum*2);
     swfcharpos = 0;
 
-    memset(used,0,t*sizeof(char));
+    memset(used,0,charnum*sizeof(char));
 
     this->swfid = ++currentswfid;
-
     
     t=0;
     while(*a)
@@ -551,8 +568,11 @@ SWFFont::SWFFont(char*name, int id, char*filename)
             // parsecharacters
             for(s=0;s<t;s++)
             {
+               char* name = T1_GetCharName(id, s);
+               if(!name) name = "";
                 this->outline[outlinepos] = T1_CopyOutline(T1_GetCharOutline(id, s, 100.0, 0));
-                this->charname[outlinepos] = strdup(T1_GetCharName(id, s));
+               this->width[outlinepos] = T1_GetCharWidth(id, s);
+                this->charname[outlinepos] = strdup(name);
                 outlinepos++;
             }
             t=0;
@@ -564,7 +584,19 @@ SWFFont::SWFFont(char*name, int id, char*filename)
 SWFFont::~SWFFont()
 {
     int t,usednum=0;
-    int*ptr = (int*)malloc(swfcharpos*sizeof(int));
+    int*ptr; 
+
+    if(storeallcharacters)
+    {
+       int t;
+       for(t=0;t<this->charnum;t++) 
+       {
+           if(this->charname[t])
+             getSWFCharID(this->charname[t], -1);
+       }
+    }
+    
+    ptr = (int*)malloc(swfcharpos*sizeof(int));
 
     for(t=0;t<charnum;t++)
         if(used[t]) usednum++;
@@ -574,20 +606,21 @@ 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;
         m.m13 = CHARMIDX;
         m.m23 = CHARMIDY;
+
         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]] = swf_GetTagLen(ftag)-initpos;
             swflastx=0;
             swflasty=0;
             swf_SetU8(ftag,0x10); //0 fill bits, 0 linestyle bits
@@ -605,16 +638,20 @@ SWFFont::~SWFFont()
         }
         ftag = swf_InsertTag(ftag,ST_DEFINEFONTINFO);
        swf_SetU16(ftag, this->swfid);
-       swf_SetU8(ftag, strlen(this->fontid));
-       swf_SetBlock(ftag, (U8*)this->fontid, strlen(this->fontid));
-       swf_SetU8(ftag, 0);
+       if(this->fontid) {
+           swf_SetU8(ftag, strlen(this->fontid));
+           swf_SetBlock(ftag, (U8*)this->fontid, strlen(this->fontid));
+       } else {
+           swf_SetU8(ftag, 0);
+       }
+       swf_SetU8(ftag, 0); //flags
        for(t=0;t<swfcharpos;t++)
        {
            int s;
            char * name = this->charname[this->swfcharid2char[t]];
            for(s=0;s<256;s++) {
                if(standardEncodingNames[s] && 
-                       !strcasecmp(name,standardEncodingNames[s]))
+                       !strcmp(name,standardEncodingNames[s]))
                    break;
            }
            swf_SetU8(ftag, (U8)s);
@@ -625,7 +662,13 @@ SWFFont::~SWFFont()
     free(outline);
     for(t=0;t<charnum;t++)
         free(charname[t]);
+    for(t=0;t<standardtablesize;t++)
+       if(standardtable[t]) {
+           free(standardtable[t]);
+       }
+    free(standardtable);
     free(charname);
+    free(width);
     free(used);
     free(swfcharid2char);
     free(char2swfcharid);
@@ -649,7 +692,7 @@ T1_OUTLINE*SWFFont::getOutline(char*name)
     return 0;
 }
 
-int SWFFont::getSWFCharID(char*name)
+int SWFFont::getSWFCharID(char*name, int charnr)
 {
     int t;
     for(t=0;t<this->charnum;t++) {
@@ -663,6 +706,9 @@ int SWFFont::getSWFCharID(char*name)
             return char2swfcharid[t];
         }
     }
+    if(this->standardtable && charnr>=0 && charnr < this->standardtablesize) {
+       return getSWFCharID(this->standardtable[charnr], -1);
+    }
     logf("<warning> Didn't find character '%s' in font '%s'", name, this->name);
     return 0;
 }
@@ -744,7 +790,7 @@ void swfoutput_setfontmatrix(struct swfoutput*obj,double m11,double m12,
 }
 
 /* draws a character at x,y. */
-void swfoutput_drawchar(struct swfoutput* obj,double x,double y,char*character) 
+void swfoutput_drawchar(struct swfoutput* obj,double x,double y,char*character, int charnr) 
 {
     swfmatrix m;
     m.m11 = obj->fontm11;
@@ -753,7 +799,7 @@ void swfoutput_drawchar(struct swfoutput* obj,double x,double y,char*character)
     m.m22 = obj->fontm22;
     m.m13 = x;
     m.m23 = y;
-    drawchar(obj, obj->font, character, &m);
+    drawchar(obj, obj->font, character, charnr, &m);
 }
 
 /* initialize the swf writer */
@@ -1157,7 +1203,7 @@ void drawlink(struct swfoutput*obj, ActionTAG*actions, swfcoord*points)
     swf_ButtonSetRecord(tag,0x04,myshapeid2,depth,0,0);
     swf_ButtonSetRecord(tag,0x08,myshapeid,depth,0,0);
     swf_SetU8(tag,0);
-    swf_SetActions(tag,actions);
+    swf_ActionSet(tag,actions);
     swf_SetU8(tag,0);
     
     tag = swf_InsertTag(tag,ST_PLACEOBJECT2);
@@ -1249,15 +1295,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;
@@ -1269,15 +1321,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;
@@ -1289,15 +1347,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;
@@ -1309,6 +1373,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)