Makefile fixes
[swftools.git] / pdf2swf / SWFOutputDev.cc
index 1af448c..070e34a 100644 (file)
@@ -39,6 +39,8 @@
 #include "OutputDev.h"
 #include "GfxState.h"
 #include "GfxFont.h"
+#include "CharCodeToUnicode.h"
+#include "NameToUnicodeTable.h"
 #include "FontFile.h"
 #include "GlobalParams.h"
 //swftools header files
@@ -578,41 +580,60 @@ void SWFOutputDev::beginString(GfxState *state, GString *s)
 }
 
 int charcounter = 0;
-int ciderror = 0;
 void SWFOutputDev::drawChar(GfxState *state, double x, double y,
                        double dx, double dy,
                        double originX, double originY,
-                       CharCode c, Unicode *u, int uLen)
+                       CharCode c, Unicode *_u, int uLen)
 {
     logf("<debug> drawChar(%f,%f,%f,%f,'%c')\n",x,y,dx,dy,c);
+    
     // check for invisible text -- this is used by Acrobat Capture
-    if ((state->getRender() & 3) != 3)
-    {
-       GfxFont*font = state->getFont();
-       Gfx8BitFont*font8;
-       if(font->isCIDFont()) {
-          if(!ciderror)
-           logf("<error> Not drawing CID Font characters!");
-          ciderror++;
-          return;
-       }
-       if(font->getType() == fontType3) {
-          /* type 3 chars are passed primarily as graphics */
-          return;
-       }
-       font8 = (Gfx8BitFont*)font;
-
-       char**enc=font8->getEncoding();
-
-       double x1,y1;
-       x1 = x;
-       y1 = y;
-       state->transform(x, y, &x1, &y1);
-
-       if(enc[c])
-         swfoutput_drawchar(&output, x1, y1, enc[c], c);
-       else
-         logf("<warning> couldn't get name for character %02x from Encoding", c);
+    if ((state->getRender() & 3) == 3)
+       return;
+
+    GfxFont*font = state->getFont();
+
+    if(font->getType() == fontType3) {
+       /* type 3 chars are passed primarily as graphics */
+       return;
+    }
+    double x1,y1;
+    x1 = x;
+    y1 = y;
+    state->transform(x, y, &x1, &y1);
+
+    if(font->isCIDFont()) {
+       GfxCIDFont*cfont = (GfxCIDFont*)font;
+       Unicode u=0;
+       char*name=0;
+       if(_u) 
+           u = *_u;
+       if(u) {
+           int t;
+           for(t=0;t<sizeof(nameToUnicodeTab)/sizeof(nameToUnicodeTab[0]);t++)
+               /* todo: should be precomputed */
+               if(nameToUnicodeTab[t].u == u) {
+                   name = nameToUnicodeTab[t].name;
+                   break;
+               }
+       }
+/*        printf("%02x %04x/%04x-%d \"%s\" %s %d\n", c,u, *_u, uLen, name, cfont->getName()->getCString(),
+               cfont->getType());*/
+
+       if(name)
+          swfoutput_drawchar(&output, x1, y1, name, c);
+       else
+          logf("<warning> couldn't get name for CID character %02x from Encoding", c);
+    } else {
+       Gfx8BitFont*font8;
+       font8 = (Gfx8BitFont*)font;
+       char**enc=font8->getEncoding();
+
+       if(enc && enc[c])
+          swfoutput_drawchar(&output, x1, y1, enc[c], c);
+       else {
+          logf("<warning> couldn't get name for character %02x from Encoding", c);
+       }
     }
 }
 
@@ -722,24 +743,27 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog)
            LinkNamed*l = (LinkNamed*)action;
            GString*name = l->getName();
            if(name) {
-             s = name->lowerCase()->getCString();
-             named = name->getCString();
-             if(strstr(s, "next") || strstr(s, "forward"))
-             {
-                 page = currentpage + 1;
-             }
-             else if(strstr(s, "prev") || strstr(s, "back"))
-             {
-                 page = currentpage - 1;
-             }
-             else if(strstr(s, "last") || strstr(s, "end"))
-             {
-                 page = pages[pagepos-1]; //:)
-             }
-             else if(strstr(s, "first") || strstr(s, "top"))
-             {
-                 page = 1;
-             }
+               s = name->lowerCase()->getCString();
+               named = name->getCString();
+               if(!strchr(s,':')) 
+               {
+                   if(strstr(s, "next") || strstr(s, "forward"))
+                   {
+                       page = currentpage + 1;
+                   }
+                   else if(strstr(s, "prev") || strstr(s, "back"))
+                   {
+                       page = currentpage - 1;
+                   }
+                   else if(strstr(s, "last") || strstr(s, "end"))
+                   {
+                       page = pages[pagepos-1]; //:)
+                   }
+                   else if(strstr(s, "first") || strstr(s, "top"))
+                   {
+                       page = 1;
+                   }
+               }
            }
        }
         break;
@@ -825,10 +849,6 @@ int SWFOutputDev::searchT1Font(char*name)
     int i;
     int mapid=-1;
     char*filename=0;
-    
-    char*name2 = 0;
-    if(name) name2 = strchr(name,'+');
-    if(name2) name2++;
 
     for(i=0;i<sizeof(pdf2t1map)/sizeof(mapping);i++) 
     {
@@ -859,19 +879,15 @@ int SWFOutputDev::searchT1Font(char*name)
                                                                  FIXNULL(T1_GetFontFileName(i)));
            }
 
-           if(fontname) {
-               if((!strcmp(name, fontname)) || 
-                  (name2 && !strcmp(name2, fontname)))
-                  {
-                   logf("<notice> Extra font %s is being used.\n", fontname);
-                   return 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) || (name2 && strstr(fontname,name2))) {
+           if(strstr(fontname, name)) {
                logf("<notice> Extra font %s is being used.\n", fontname);
                return i;
            }
@@ -921,6 +937,7 @@ char*SWFOutputDev::writeEmbeddedFontToFile(XRef*ref, GfxFont*font)
 
       ret = font->getEmbeddedFontID(&embRef);
       if(!ret) {
+         logf("<verbose> Didn't get embedded font id");
          /* not embedded- the caller should now search the font
             directories for this font */
          return 0;
@@ -955,7 +972,8 @@ char*SWFOutputDev::writeEmbeddedFontToFile(XRef*ref, GfxFont*font)
       }
       fclose(f);
 
-      if(font->getType() == fontTrueType)
+      if(font->getType() == fontTrueType ||
+        font->getType() == fontCIDType2)
       {
          if(!ttfinfo) {
              logf("<notice> File contains TrueType fonts");
@@ -1178,11 +1196,11 @@ void SWFOutputDev::updateFont(GfxState *state)
   Ref embRef;
   GBool embedded = gfxFont->getEmbeddedFontID(&embRef);
   if(embedded) {
-    if (!gfxFont->isCIDFont() &&
-       (gfxFont->getType() == fontType1 ||
-        gfxFont->getType() == fontType1C ||
-        gfxFont->getType() == fontTrueType)) {
-       
+    if (gfxFont->getType() == fontType1 ||
+       gfxFont->getType() == fontType1C ||
+       gfxFont->getType() == fontTrueType ||
+       gfxFont->getType() == fontCIDType2) 
+    {
        fileName = writeEmbeddedFontToFile(xref, gfxFont);
        if(!fileName) {
          logf("<error> Couldn't write font to file");
@@ -1198,8 +1216,15 @@ void SWFOutputDev::updateFont(GfxState *state)
        }
     }
     else {
-       showFontError(gfxFont,0);
-       fontname = substituteFont(gfxFont, fontname);
+       /* in case the font is embedded, but has an
+          unsupported format, we just look through the
+          font directories */
+       int newt1id = searchT1Font(fontname);
+       if(newt1id<0) {
+           showFontError(gfxFont,0);
+           fontname = substituteFont(gfxFont, fontname);
+       } else
+           this->t1id = newt1id;
     }
   } else {
     if(fontname) {
@@ -1751,6 +1776,11 @@ void pdfswf_insertstop()
     insertstoptag = 1;
 }
 
+void pdfswf_setversion(int n)
+{
+    flashversion = n;
+}
+
 int closed=0;
 void pdfswf_close()
 {