added -z option.
[swftools.git] / pdf2swf / SWFOutputDev.cc
index 41eda26..c7b9a66 100644 (file)
@@ -23,6 +23,7 @@
 #include <string.h>
 #include <unistd.h>
 //xpdf header files
+#include "gfile.h"
 #include "GString.h"
 #include "gmem.h"
 #include "Object.h"
@@ -342,11 +343,11 @@ void dumpFontInfo(char*loglevel, GfxFont*font)
   char*name;
   gstr = font->getName();
   Ref r=font->getID();
-  logf("%s=========== %s (ID:%d,%d) ==========\n", loglevel, gstr?gstr->getCString():"(unknown font)", r.num,r.gen);
+  logf("%s=========== %s (ID:%d,%d) ==========\n", loglevel, gstr?FIXNULL(gstr->getCString()):"(unknown font)", r.num,r.gen);
 
   gstr  = font->getTag();
   if(gstr) 
-   logf("%sTag: %s\n", loglevel, gstr->getCString());
+   logf("%sTag: %s\n", loglevel, FIXNULL(gstr->getCString()));
   if(font->is16Bit()) logf("%sis 16 bit\n", loglevel);
 
   GfxFontType type=font->getType();
@@ -375,11 +376,11 @@ void dumpFontInfo(char*loglevel, GfxFont*font)
   GBool embedded = font->getEmbeddedFontID(&embRef);
   name = font->getEmbeddedFontName();
   if(embedded)
-   logf("%sEmbedded name: %s id: %d\n",loglevel, name, embRef.num);
+   logf("%sEmbedded name: %s id: %d\n",loglevel, FIXNULL(name), embRef.num);
 
   gstr = font->getExtFontFile();
   if(gstr)
-   logf("%sExternal Font file: %s\n", loglevel, gstr->getCString());
+   logf("%sExternal Font file: %s\n", loglevel, FIXNULL(gstr->getCString()));
 
   // Get font descriptor flags.
   if(font->isFixedWidth()) logf("%sis fixed width\n", loglevel);
@@ -408,7 +409,7 @@ T1_OUTLINE* gfxPath_to_T1_OUTLINE(GfxState*state, GfxPath*path)
 {
     int num = path->getNumSubpaths();
     int s,t;
-    bezierpathsegment*start,*last;
+    bezierpathsegment*start,*last=0;
     bezierpathsegment*outline = start = new bezierpathsegment();
     int cpos = 0;
     double lastx=0,lasty=0;
@@ -547,7 +548,7 @@ void SWFOutputDev::beginString(GfxState *state, GString *s)
     state->getFontTransMat(&m11, &m12, &m21, &m22);
     m11 *= state->getHorizScaling();
     m21 *= state->getHorizScaling();
-    swfoutput_setfontmatrix(&output, m11, -m12, m21, -m22);
+    swfoutput_setfontmatrix(&output, m11, -m21, m12, -m22);
 }
 
 int charcounter = 0;
@@ -601,6 +602,7 @@ void SWFOutputDev::startPage(int pageNum, GfxState *state)
 
 void SWFOutputDev::drawLink(Link *link, Catalog *catalog) 
 {
+  logf("<debug> drawlink\n");
   double x1, y1, x2, y2, w;
   GfxRGB rgb;
   swfcoord points[5];
@@ -630,6 +632,7 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog)
     char*s = "-?-";
     char*type = "-?-";
     char*url = 0;
+    char*named = 0;
     int page = -1;
     switch(action->getKind())
     {
@@ -665,6 +668,7 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog)
            GString*name = l->getName();
            if(name) {
              s = name->lowerCase()->getCString();
+             named = name->getCString();
              if(strstr(s, "next") || strstr(s, "forward"))
              {
                  page = currentpage + 1;
@@ -731,7 +735,11 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog)
     {
        swfoutput_linktourl(&output, url, points);
     }
-    logf("<verbose> \"%s\" link to \"%s\" (%d)\n", type, s, page);
+    else if(named)
+    {
+       swfoutput_namedlink(&output, named, points);
+    }
+    logf("<verbose> \"%s\" link to \"%s\" (%d)\n", type, FIXNULL(s), page);
   }
 }
 
@@ -760,8 +768,6 @@ char type3Warning=0;
 int SWFOutputDev::searchT1Font(char*name) 
 {      
     int i;
-    
-    int id=-1;
     int mapid=-1;
     char*filename=0;
     for(i=0;i<sizeof(pdf2t1map)/sizeof(mapping);i++) 
@@ -772,17 +778,41 @@ int SWFOutputDev::searchT1Font(char*name)
            mapid = i;
        }
     }
-    if(filename)
-    for(i=0; i<T1_Get_no_fonts(); i++)
-    {
-       char*fontfilename = T1_GetFontFileName (i);
-       if(strstr(fontfilename, filename))
+    if(filename) {
+       for(i=0; i<T1_Get_no_fonts(); i++)
        {
-               id = i;
-               pdf2t1map[i].id = mapid;
+           char*fontfilename = T1_GetFontFileName (i);
+           if(strstr(fontfilename, filename))
+           {
+                   pdf2t1map[i].id = mapid;
+                   return i;
+           }
+       }
+    } else {
+       for(i=0; i<T1_Get_no_fonts(); i++)
+       {
+           char*fontname = T1_GetFontName (i);
+           if(!fontname) {
+               T1_LoadFont(i);
+               fontname = T1_GetFontName (i);
+               logf("<verbose> Loading extra font %s from %s\n", FIXNULL(fontname), 
+                                                                 FIXNULL(T1_GetFontFileName(i)));
+           }
+           if(fontname && !strcmp(name, fontname)) {
+               logf("<notice> Extra font %s is being used.\n", fontname);
+               return i;
+           }
+           fontname = T1_GetFontFileName(i);
+           if(strrchr(fontname,'/'))
+                   fontname = strrchr(fontname,'/')+1;
+           if(strstr(fontname, name)) {
+               logf("<notice> Extra font %s is being used.\n", fontname);
+               return i;
+           }
        }
     }
-    return id;
+    return -1;
 }
 
 void SWFOutputDev::updateLineWidth(GfxState *state)
@@ -860,14 +890,14 @@ char*SWFOutputDev::writeEmbeddedFontToFile(GfxFont*font)
              ttfinfo = 1;
          }
          char name2[80];
-         int r1 = lrand48();
-         int r2 = lrand48();
-         sprintf(name2,"%04x%04x",r1,r2);
+         char*tmp;
+         tmp = strdup(mktmpname((char*)name2));
+         sprintf(name2, "%s", tmp);
          char*a[] = {"./ttf2pt1","-pttf","-b", tmpFileName, name2};
          logf("<verbose> Invoking ttf2pt1...");
          ttf2pt1_main(5,a);
          unlink(tmpFileName);
-         sprintf(name2,"%04x%04x.pfb",r1,r2);
+         sprintf(name2,"%s.pfb",tmp);
          tmpFileName = strdup(name2);
       }
 
@@ -976,7 +1006,7 @@ char* SWFOutputDev::substituteFont(GfxFont*gfxFont, char* oldname)
       if(oldname) {
          substitutesource[substitutepos] = oldname;
          substitutetarget[substitutepos] = fontname;
-         logf("<verbose> substituting %s -> %s", oldname, fontname);
+         logf("<verbose> substituting %s -> %s", FIXNULL(oldname), FIXNULL(fontname));
          substitutepos ++;
       }
       return fontname;
@@ -1093,7 +1123,7 @@ void SWFOutputDev::updateFont(GfxState *state)
       return;
   }
 
-  logf("<verbose> Creating new SWF font: t1id: %d, filename: %s name:%s", this->t1id, fileName, fontname);
+  logf("<verbose> Creating new SWF font: t1id: %d, filename: %s name:%s", this->t1id, FIXNULL(fileName), FIXNULL(fontname));
   swfoutput_setfont(&output, fontname, this->t1id, fileName);
   if(fileName)
       unlinkfont(fileName);
@@ -1138,7 +1168,7 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str,
   if (str->getKind() == strDCT &&
       (colorMap->getNumPixelComps() == 3 || !mask) )
   {
-    sprintf(fileName, "/tmp/tmp%08x.jpg",lrand48());
+    sprintf(fileName, "%s.jpg",mktmpname(0));
     logf("<verbose> Found jpeg. Temporary storage is %s", fileName);
     if(!jpeginfo)
     {
@@ -1195,7 +1225,7 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str,
     if(mask) {
        imgStr = new ImageStream(str, width, 1, 1);
        imgStr->reset();
-       return;
+       //return;
        int yes=0,i,j;
        unsigned char buf[8];
        int xid = 0;
@@ -1342,6 +1372,7 @@ void SWFOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str,
                                   int width, int height, GBool invert,
                                   GBool inlineImg) 
 {
+  logf("<debug> drawImageMask");
   drawGeneralImage(state,ref,str,width,height,0,invert,inlineImg,1);
 }
 
@@ -1349,6 +1380,7 @@ void SWFOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
                               int width, int height,
                               GfxImageColorMap *colorMap, GBool inlineImg) 
 {
+  logf("<debug> drawImage");
   drawGeneralImage(state,ref,str,width,height,colorMap,0,inlineImg,0);
 }
 
@@ -1492,6 +1524,11 @@ void pdfswf_storeallcharacters()
     storeallcharacters = 1;
 }
 
+void pdfswf_enablezlib()
+{
+    enablezlib = 1;
+}
+
 void pdfswf_jpegquality(int val)
 {
     if(val<0) val=0;
@@ -1527,7 +1564,7 @@ void pdfswf_performconversion()
     for(t=0;t<pagepos;t++)
     {
        currentpage = pages[t];
-       doc->displayPage((OutputDev*)output, currentpage, /*zoom*/100, /*rotate*/0, /*doLinks*/(int)1);
+       doc->displayPage((OutputDev*)output, currentpage, /*dpi*/72, /*rotate*/0, /*doLinks*/(int)1);
     }
 }