added pdfswf_addlanguagedir() function.
[swftools.git] / pdf2swf / SWFOutputDev.cc
index 23cb0c3..5186af3 100644 (file)
 #include <string.h>
 #include <unistd.h>
 #include "../config.h"
+#ifdef HAVE_DIRENT_H
+#include <dirent.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
 #ifdef HAVE_FONTCONFIG_H
 #include <fontconfig.h>
 #endif
@@ -104,8 +110,8 @@ struct mapping {
 {"ZapfDingbats",          "d050000l"}};
 
 class SWFOutputDev:  public OutputDev {
-  struct swfoutput output;
   int outputstarted;
+  struct swfoutput output;
 public:
 
   // Constructor.
@@ -117,7 +123,9 @@ public:
   void setMove(int x,int y);
   void setClip(int x1,int y1,int x2,int y2);
   
-  void save(char*filename);
+  int save(char*filename);
+
+  void getDimensions(int*x1,int*y1,int*x2,int*y2);
 
   //----- get info about output device
 
@@ -341,6 +349,13 @@ void SWFOutputDev::setClip(int x1,int y1,int x2,int y2)
     this->user_clipx2 = x2;
     this->user_clipy2 = y2;
 }
+void SWFOutputDev::getDimensions(int*x1,int*y1,int*x2,int*y2)
+{
+    if(x1) *x1 = output.swf.movieSize.xmin/20;
+    if(y1) *y1 = output.swf.movieSize.ymin/20;
+    if(x2) *x2 = output.swf.movieSize.xmax/20;
+    if(y2) *y2 = output.swf.movieSize.ymax/20;
+}
 
 static char*getFontID(GfxFont*font)
 {
@@ -685,7 +700,7 @@ void SWFOutputDev::stroke(GfxState *state)
     m.m12 = 0; m.m13 = 0; m.m23 = 0;
     SWF_OUTLINE*outline = gfxPath_to_SWF_OUTLINE(state, path);
     
-    if(screenloglevel >= LOGLEVEL_TRACE)  {
+    if(getLogLevel() >= LOGLEVEL_TRACE)  {
         msg("<trace> stroke\n");
         dump_outline(outline);
     }
@@ -721,7 +736,7 @@ void SWFOutputDev::fill(GfxState *state)
     m.m12 = 0; m.m13 = 0; m.m23 = 0;
     SWF_OUTLINE*outline = gfxPath_to_SWF_OUTLINE(state, path);
 
-    if(screenloglevel >= LOGLEVEL_TRACE)  {
+    if(getLogLevel() >= LOGLEVEL_TRACE)  {
         msg("<trace> fill\n");
         dump_outline(outline);
     }
@@ -738,7 +753,7 @@ void SWFOutputDev::eoFill(GfxState *state)
     m.m12 = 0; m.m13 = 0; m.m23 = 0;
     SWF_OUTLINE*outline = gfxPath_to_SWF_OUTLINE(state, path);
 
-    if(screenloglevel >= LOGLEVEL_TRACE)  {
+    if(getLogLevel() >= LOGLEVEL_TRACE)  {
         msg("<trace> eofill\n");
         dump_outline(outline);
     }
@@ -756,7 +771,7 @@ void SWFOutputDev::clip(GfxState *state)
     m.m13 = 0; m.m23 = 0;
     SWF_OUTLINE*outline = gfxPath_to_SWF_OUTLINE(state, path);
 
-    if(screenloglevel >= LOGLEVEL_TRACE)  {
+    if(getLogLevel() >= LOGLEVEL_TRACE)  {
         msg("<trace> clip\n");
         dump_outline(outline);
     }
@@ -773,7 +788,7 @@ void SWFOutputDev::eoClip(GfxState *state)
     m.m12 = 0; m.m13 = 0; m.m23 = 0;
     SWF_OUTLINE*outline = gfxPath_to_SWF_OUTLINE(state, path);
 
-    if(screenloglevel >= LOGLEVEL_TRACE)  {
+    if(getLogLevel() >= LOGLEVEL_TRACE)  {
         msg("<trace> eoclip\n");
         dump_outline(outline);
     }
@@ -782,9 +797,9 @@ void SWFOutputDev::eoClip(GfxState *state)
     clipping[clippos] ++;
     free_outline(outline);
 }
-void SWFOutputDev::save(char*filename)
+int SWFOutputDev::save(char*filename)
 {
-    swfoutput_save(&output, filename);
+    return swfoutput_save(&output, filename);
 }
 
 SWFOutputDev::~SWFOutputDev() 
@@ -1894,10 +1909,15 @@ static void printInfoDate(Dict *infoDict, char *key, char *fmt) {
 
 void pdfswf_setparameter(char*name, char*value)
 {
+    msg("<verbose> setting parameter %s to \"%s\"", name, value);
     if(!strcmp(name, "caplinewidth")) {
        caplinewidth = atof(value);
     } else if(!strcmp(name, "zoom")) {
        zoom = atoi(value);
+    } else if(!strcmp(name, "fontdir")) {
+        pdfswf_addfontdir(value);
+    } else if(!strcmp(name, "languagedir")) {
+        pdfswf_addlanguagedir(value);
     } else {
        swfoutput_setparameter(name, value);
     }
@@ -1914,6 +1934,82 @@ void pdfswf_addfont(char*filename)
     }
 }
 
+static char* dirseparator()
+{
+#ifdef WIN32
+    return "\\";
+#else
+    return "/";
+#endif
+}
+
+void pdfswf_addlanguagedir(char*dir)
+{
+    if(!globalParams)
+        globalParams = new GlobalParams("");
+    
+    msg("<notice> Adding %s to language pack directories", dir);
+
+    int l;
+    FILE*fi = 0;
+    char* config_file = (char*)malloc(strlen(dir)+256);
+    strcpy(config_file, dir);
+    strcat(config_file, dirseparator());
+    strcat(config_file, "add-to-xpdfrc");
+
+    fi = fopen(config_file, "rb");
+    if(!fi) {
+        msg("<error> Could not open %s");
+        return;
+    }
+    globalParams->parseFile(new GString(config_file), fi);
+    fclose(fi);
+}
+
+void pdfswf_addfontdir(char*dirname)
+{
+#ifdef HAVE_DIRENT_H
+    msg("<notice> Adding %s to font directories", dirname);
+    DIR*dir = opendir(dirname);
+    if(!dir) {
+       msg("<warning> Couldn't open directory %s\n", dirname);
+       return;
+    }
+    struct dirent*ent;
+    while(1) {
+       ent = readdir (dir);
+       if (!ent) 
+           break;
+       int l;
+       char*name = ent->d_name;
+       char type = 0;
+       if(!name) continue;
+       l=strlen(name);
+       if(l<4)
+           continue;
+       if(!strncasecmp(&name[l-4], ".pfa", 4)) 
+           type=1;
+       if(!strncasecmp(&name[l-4], ".pfb", 4)) 
+           type=3;
+       if(!strncasecmp(&name[l-4], ".ttf", 4)) 
+           type=2;
+       if(type)
+       {
+           char*fontname = (char*)malloc(strlen(dirname)+strlen(name)+2);
+           strcpy(fontname, dirname);
+            strcat(fontname, dirseparator());
+           strcat(fontname, name);
+           msg("<verbose> Adding %s to fonts", fontname);
+           pdfswf_addfont(fontname);
+       }
+    }
+    closedir(dir);
+#else
+    msg("<warning> No dirent.h- unable to add font dir %s");
+#endif
+}
+
+
 typedef struct _pdf_doc_internal
 {
     int protect;
@@ -1940,7 +2036,8 @@ pdf_doc_t* pdf_init(char*filename, char*userPassword)
     Object info;
 
     // read config file
-    globalParams = new GlobalParams("");
+    if(!globalParams)
+        globalParams = new GlobalParams("");
 
     // open PDF file
     if (userPassword && userPassword[0]) {
@@ -1959,7 +2056,7 @@ pdf_doc_t* pdf_init(char*filename, char*userPassword)
     // print doc info
     i->doc->getDocInfo(&info);
     if (info.isDict() &&
-      (screenloglevel>=LOGLEVEL_NOTICE)) {
+      (getScreenLogLevel()>=LOGLEVEL_NOTICE)) {
       printInfoString(info.getDict(), "Title",        "Title:        %s\n");
       printInfoString(info.getDict(), "Subject",      "Subject:      %s\n");
       printInfoString(info.getDict(), "Keywords",     "Keywords:     %s\n");
@@ -1987,8 +2084,8 @@ pdf_doc_t* pdf_init(char*filename, char*userPassword)
     i->protect = 0;
     if (i->doc->isEncrypted()) {
           if(!i->doc->okToCopy()) {
-              printf("PDF disallows copying. Terminating.\n");
-              exit(1); //bail out
+              printf("PDF disallows copying.\n");
+              return 0;
           }
           if(!i->doc->okToChange() || !i->doc->okToAddNotes())
               i->protect = 1;
@@ -2017,7 +2114,7 @@ class MemCheck
 {
     public: ~MemCheck()
     {
-        delete globalParams;
+        delete globalParams;globalParams=0;
         Object::memCheck(stderr);
         gMemReport(stderr);
     }
@@ -2078,10 +2175,12 @@ void swf_output_setparameter(swf_output_t*swf_output, char*name, char*value)
     pdfswf_setparameter(name, value);
 }
 
-void swf_output_save(swf_output_t*swf, char*filename)
+int swf_output_save(swf_output_t*swf, char*filename)
 {
     swf_output_internal_t*i= (swf_output_internal_t*)swf->internal;
-    i->outputDev->save(filename);
+    int ret = i->outputDev->save(filename);
+    i->outputDev->getDimensions(&swf->x1, &swf->y1, &swf->x2, &swf->y2);
+    return ret;
 }
 
 void swf_output_destroy(swf_output_t*output)
@@ -2092,10 +2191,10 @@ void swf_output_destroy(swf_output_t*output)
     free(output);
 }
 
-void pdf_page_render2(pdf_page_t*page, swf_output_t*output)
+void pdf_page_render2(pdf_page_t*page, swf_output_t*swf)
 {
     pdf_doc_internal_t*pi = (pdf_doc_internal_t*)page->parent->internal;
-    swf_output_internal_t*si = (swf_output_internal_t*)output->internal;
+    swf_output_internal_t*si = (swf_output_internal_t*)swf->internal;
 
     if(pi->protect) {
         swfoutput_setparameter("protect", "1");
@@ -2106,6 +2205,7 @@ void pdf_page_render2(pdf_page_t*page, swf_output_t*output)
 #else
     pi->doc->displayPage((OutputDev*)si->outputDev, page->nr, zoom, zoom, /*rotate*/0, true, /*doLinks*/(int)1);
 #endif
+    si->outputDev->getDimensions(&swf->x1, &swf->y1, &swf->x2, &swf->y2);
 }
 
 void pdf_page_rendersection(pdf_page_t*page, swf_output_t*output, int x, int y, int x1, int y1, int x2, int y2)