added setparameter().
[swftools.git] / pdf2swf / SWFOutputDev.cc
index 070e34a..10e0ffe 100644 (file)
@@ -22,7 +22,9 @@
 #include <stddef.h>
 #include <string.h>
 #include <unistd.h>
+#include "../config.h"
 //xpdf header files
+#include "config.h"
 #include "gfile.h"
 #include "GString.h"
 #include "gmem.h"
@@ -35,7 +37,6 @@
 #include "Page.h"
 #include "PDFDoc.h"
 #include "Error.h"
-#include "config.h"
 #include "OutputDev.h"
 #include "GfxState.h"
 #include "GfxFont.h"
@@ -441,6 +442,14 @@ T1_OUTLINE* gfxPath_to_T1_OUTLINE(GfxState*state, GfxPath*path)
     bezierpathsegment*outline = start = new bezierpathsegment();
     int cpos = 0;
     double lastx=0,lasty=0;
+    if(!num) {
+       logf("<warning> empty path");
+       outline->type = T1_PATHTYPE_MOVE;
+       outline->dest.x = 0;
+       outline->dest.y = 0;
+       outline->link = 0;
+       return (T1_OUTLINE*)outline;
+    }
     for(t = 0; t < num; t++) {
        GfxSubpath *subpath = path->getSubpath(t);
        int subnum = subpath->getNumPoints();
@@ -880,7 +889,7 @@ int SWFOutputDev::searchT1Font(char*name)
            }
 
            if(fontname && !strcmp(name, fontname)) {
-               logf("<notice> Extra font %s is being used.\n", fontname);
+               logf("<notice> Extra font %d, \"%s\" is being used.\n", i, fontname);
                return i;
            }
            fontname = T1_GetFontFileName(i);
@@ -888,7 +897,7 @@ int SWFOutputDev::searchT1Font(char*name)
                    fontname = strrchr(fontname,'/')+1;
  
            if(strstr(fontname, name)) {
-               logf("<notice> Extra font %s is being used.\n", fontname);
+               logf("<notice> Extra font %d, \"%s\" is being used.\n", i, fontname);
                return i;
            }
        }
@@ -964,8 +973,30 @@ char*SWFOutputDev::writeEmbeddedFontToFile(XRef*ref, GfxFont*font)
        refObj.fetch(ref, &strObj);
        refObj.free();
        strObj.streamReset();
-       while ((c = strObj.streamGetChar()) != EOF) {
-         fputc(c, f);
+       int f4[4];
+       char f4c[4];
+       int t;
+       for(t=0;t<4;t++) {
+           f4[t] = strObj.streamGetChar();
+           f4c[t] = (char)f4[t];
+           if(f4[t] == EOF)
+               break;
+       }
+       if(t==4) {
+           if(!strncmp(f4c, "true", 4)) {
+               /* some weird TTF fonts don't start with 0,1,0,0 but with "true".
+                  Change this on the fly */
+               f4[0] = f4[2] = f4[3] = 0;
+               f4[1] = 1;
+           }
+           fputc(f4[0], f);
+           fputc(f4[1], f);
+           fputc(f4[2], f);
+           fputc(f4[3], f);
+
+           while ((c = strObj.streamGetChar()) != EOF) {
+             fputc(c, f);
+           }
        }
        strObj.streamClose();
        strObj.free();
@@ -1018,6 +1049,7 @@ char* SWFOutputDev::substituteFont(GfxFont*gfxFont, char* oldname)
 /* ------------------------------ V1 */
 
     char*fontname = "Times-Roman";
+    logf("<verbose> substituteFont(,%s)", FIXNULL(oldname));
     this->t1id = searchT1Font(fontname);
     if(substitutepos>=sizeof(substitutesource)/sizeof(char*)) {
        logf("<fatal> Too many fonts in file.");
@@ -1230,12 +1262,15 @@ void SWFOutputDev::updateFont(GfxState *state)
     if(fontname) {
        int newt1id = searchT1Font(fontname);
        if(newt1id<0) {
+           showFontError(gfxFont,1);
            fontname = substituteFont(gfxFont, fontname);
        } else
            this->t1id = newt1id;
     }
-    else
+    else {
+       showFontError(gfxFont,1);
        fontname = substituteFont(gfxFont, fontname);
+    }
   }
 
   if(t1id<0) {