add font dirs to fontconfig's config
[swftools.git] / lib / pdf / GFXOutputDev.cc
index def11a6..deb6f0a 100644 (file)
@@ -93,12 +93,13 @@ 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 */
 
-static char* lastfontdir = 0;
-
 struct fontentry {
     const char*pdffont;
     const char*filename;
@@ -394,6 +395,17 @@ 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
@@ -524,7 +536,9 @@ DisplayFontParam *GFXGlobalParams::getDisplayFont(GString *fontName)
     
     int bestlen = 0x7fffffff;
     const char*bestfilename = 0;
-    
+   
+#ifndef HAVE_FONTCONFIG
+    /* if we don't have fontconfig, try a simple approach */
     fontfile_t*f = global_fonts;
     while(f) {
        if(strstr(f->filename, name)) {
@@ -535,6 +549,7 @@ DisplayFontParam *GFXGlobalParams::getDisplayFont(GString *fontName)
         }
         f = f->next;
     }
+#endif
 
     /* if we didn't find anything up to now, try looking for the
        font via fontconfig */
@@ -546,6 +561,7 @@ DisplayFontParam *GFXGlobalParams::getDisplayFont(GString *fontName)
     }
 
     if(filename) {
+        msg("<verbose> Font %s maps to %s\n", name, filename);
        DisplayFontParamKind kind = detectFontType(filename);
         DisplayFontParam *dfp = new DisplayFontParam(new GString(fontName), kind);
        if(kind == displayFontTT) {
@@ -579,6 +595,7 @@ GFXOutputDev::GFXOutputDev(InfoOutputDev*info, PDFDoc*doc)
     this->user_clipy1 = 0;
     this->user_clipx2 = 0;
     this->user_clipy2 = 0;
+    this->current_fontinfo = 0;
     this->current_text_stroke = 0;
     this->current_text_clip = 0;
     this->outer_clip_box = 0;
@@ -762,6 +779,13 @@ static void dumpFontInfo(const char*loglevel, GfxFont*font)
 
 void dump_outline(gfxline_t*line)
 {
+    /*gfxbbox_t*r = gfxline_isrectangle(line);
+    if(!r)
+        printf("is not a rectangle\n");
+    else
+        printf("is a rectangle: (%f,%f)-(%f-%f)\n", r->xmin, r->ymin, r->xmax, r->ymax);
+    */
+
     while(line) {
        if(line->type == gfx_moveTo) {
            msg("<debug> |     moveTo %.2f %.2f", line->x,line->y);
@@ -1882,6 +1906,7 @@ void GFXOutputDev::updateFont(GfxState *state)
     }
 
     this->current_fontinfo = this->info->getFont(id);
+
     if(!this->current_fontinfo) {
        msg("<error> Internal Error: no fontinfo for font %s", id);
        return;
@@ -1890,7 +1915,7 @@ void GFXOutputDev::updateFont(GfxState *state)
        dumpFontInfo("<verbose>", gfxFont);
     }
 
-    current_gfxfont = this->current_fontinfo->gfxfont;
+    current_gfxfont = this->current_fontinfo->getGfxFont();
     device->addfont(device, current_gfxfont);
     free(id);
 
@@ -2468,7 +2493,6 @@ void addGlobalFontDir(const char*dirname)
 {
 #ifdef HAVE_DIRENT_H
     msg("<notice> Adding %s to font directories", dirname);
-    lastfontdir = strdup(dirname);
     DIR*dir = opendir(dirname);
     if(!dir) {
        msg("<warning> Couldn't open directory %s", dirname);
@@ -2502,8 +2526,18 @@ void addGlobalFontDir(const char*dirname)
     }
     closedir(dir);
 #else
-    msg("<warning> No dirent.h- unable to add font dir %s", dirname);
+    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,