fix for rendering w/o user clip boxes
[swftools.git] / lib / pdf / GFXOutputDev.cc
index deb6f0a..46e9c26 100644 (file)
@@ -93,9 +93,6 @@ typedef struct _fontfile
 static fontfile_t* global_fonts = 0;
 static fontfile_t* global_fonts_next = 0;
 
-static fontfile_t* global_fontdirs = 0;
-static fontfile_t* global_fontdirs_next = 0;
-
 static int fontnum = 0;
 
 /* config */
@@ -395,17 +392,6 @@ char* fontconfig_searchForFont(char*name)
            fprintf(fi, "<dir>WINDOWSFONTDIR</dir>\n");
 #endif
            fprintf(fi, "<dir>~/.fonts</dir>\n");
-
-            /* add external font dirs to fontconfig's config. Maybe fc will make more out
-               of them than we did 
-                FIXME: we don't do that yet if there's a system config file
-             */
-            fontfile_t*fd = global_fontdirs;
-            while(fd) {
-               fprintf(fi, "<dir>%s</dir>\n", fd->filename);
-                fd = fd->next;
-            }
-
 #ifdef WIN32
            fprintf(fi, "<cachedir>WINDOWSTEMPDIR_FONTCONFIG_CACHE</cachedir>\n");
 #endif
@@ -428,6 +414,14 @@ char* fontconfig_searchForFont(char*name)
             config_use_fontconfig = 0;
             return 0;
         }
+
+        /* add external fonts to fontconfig's config, too. */
+        fontfile_t*fd = global_fonts;
+        while(fd) {
+            FcConfigAppFontAddFile(config, (FcChar8*)fd->filename);
+            fd = fd->next;
+        }
+
        FcFontSet * set =  FcConfigGetFonts(config, FcSetSystem);
         msg("<verbose> FontConfig initialized. Found %d fonts", set?set->nfont:0);
        if(!set || !set->nfont) {
@@ -538,7 +532,7 @@ DisplayFontParam *GFXGlobalParams::getDisplayFont(GString *fontName)
     const char*bestfilename = 0;
    
 #ifndef HAVE_FONTCONFIG
-    /* if we don't have fontconfig, try a simple approach */
+    /* if we don't have fontconfig, try a simple filename-comparison approach */
     fontfile_t*f = global_fonts;
     while(f) {
        if(strstr(f->filename, name)) {
@@ -1545,6 +1539,11 @@ void GFXOutputDev::startPage(int pageNum, GfxState *state, double crop_x1, doubl
         /*if(user_clipy1 > y1)*/ y1 = user_clipy1;
         /*if(user_clipy2 < y2)*/ y2 = user_clipy2;
        msg("<verbose> Using user clip box %f/%f/%f/%f",x1,y1,x2,y2);
+    } else {
+        x1 += this->clipmovex;
+        y1 += this->clipmovey;
+        x2 += this->clipmovex;
+        y2 += this->clipmovey;
     }
 
     //msg("<verbose> Bounding box is (%f,%f)-(%f,%f) [shifted by %d/%d]", x1,y1,x2,y2, user_movex, user_movey);
@@ -1633,7 +1632,8 @@ void GFXOutputDev::processLink(Link *link, Catalog *catalog)
             LinkDest *dest=NULL;
             if (ha->getDest()==NULL) 
                 dest=catalog->findDest(ha->getNamedDest());
-            else dest=ha->getDest();
+            else 
+                dest=ha->getDest()->copy();
             if (dest){ 
               if (dest->isPageRef()){
                 Ref pageref=dest->getPageRef();
@@ -1642,6 +1642,7 @@ void GFXOutputDev::processLink(Link *link, Catalog *catalog)
               else  page=dest->getPageNum();
               sprintf(buf, "%d", page);
               s = strdup(buf);
+              delete dest;
             }
         }
         break;
@@ -2461,7 +2462,7 @@ void addGlobalFont(const char*filename)
     }
     f->len = len;
 
-    msg("<notice> Adding font \"%s\".", filename);
+    msg("<verbose> Adding font \"%s\".", filename);
     if(global_fonts_next) {
         global_fonts_next->next = f;
         global_fonts_next = global_fonts_next->next;
@@ -2492,13 +2493,13 @@ void addGlobalLanguageDir(const char*dir)
 void addGlobalFontDir(const 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", dirname);
        return;
     }
     struct dirent*ent;
+    int fonts = 0;
     while(1) {
        ent = readdir (dir);
        if (!ent) 
@@ -2522,22 +2523,14 @@ void addGlobalFontDir(const char*dirname)
             strcat(fontname, dirseparator());
            strcat(fontname, name);
            addGlobalFont(fontname);
+            fonts++;
        }
     }
+    msg("<notice> Added %s to font directories (%d fonts)", dirname, fonts);
     closedir(dir);
 #else
     msg("<warning> No dirent.h");
 #endif
-    
-    fontfile_t* f = (fontfile_t*)malloc(sizeof(fontfile_t));
-    memset(f, 0, sizeof(fontfile_t));
-    f->filename = dirname;
-    if(global_fontdirs_next) {
-        global_fontdirs_next->next = f;
-        global_fontdirs_next = global_fontdirs_next->next;
-    } else {
-        global_fontdirs_next = global_fontdirs = f;
-    }
 }
 
 void GFXOutputDev::beginTransparencyGroup(GfxState *state, double *bbox,