static fontfile_t fonts[2048];
static int fontnum = 0;
+static int config_use_fontconfig = 1;
+
// swf <-> pdf pages
// TODO: move into pdf_doc_t
static int*pages = 0;
char*name = getFontName(gfxFont);
char*fontname = 0;
char*filename = 0;
+
+ if(!config_use_fontconfig)
+ return 0;
#ifdef HAVE_FONTCONFIG
FcPattern *pattern, *match;
FcChar8 *v;
static int fcinitcalled = false;
+
+ msg("<debug> searchForSuitableFont(%s)", name);
// call init ony once
if (!fcinitcalled) {
+ msg("<debug> Initializing FontConfig...");
fcinitcalled = true;
- FcInit(); //leaks
+ if(FcInit()) {
+ msg("<debug> FontConfig Initialization failed. Disabling.");
+ config_use_fontconfig = 0;
+ return 0;
+ }
+ msg("<debug> ...initialized FontConfig");
}
+ msg("<debug> FontConfig: Create \"%s\" Family Pattern", name);
pattern = FcPatternBuild(NULL, FC_FAMILY, FcTypeString, name, NULL);
if (gfxFont->isItalic()) // check for italic
+ msg("<debug> FontConfig: Adding Italic Slant");
FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC);
if (gfxFont->isBold()) // check for bold
+ msg("<debug> FontConfig: Adding Bold Weight");
FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD);
+ msg("<debug> FontConfig: Try to match...");
// configure and match using the original font name
FcConfigSubstitute(0, pattern, FcMatchPattern);
FcDefaultSubstitute(pattern);
match = FcFontMatch(0, pattern, &result);
if (FcPatternGetString(match, "family", 0, &v) == FcResultMatch) {
+ msg("<debug> FontConfig: family=%s", (char*)v);
// if we get an exact match
if (strcmp((char *)v, name) == 0) {
if (FcPatternGetString(match, "file", 0, &v) == FcResultMatch) {
if(nfn) fontname = strdup(nfn+1);
else fontname = filename;
}
+ msg("<debug> FontConfig: Returning \"%s\"", fontname);
} else {
// initialize patterns
FcPatternDestroy(pattern);
// now match against serif etc.
if (gfxFont->isSerif()) {
+ msg("<debug> FontConfig: Create Serif Family Pattern");
pattern = FcPatternBuild (NULL, FC_FAMILY, FcTypeString, "serif", NULL);
} else if (gfxFont->isFixedWidth()) {
+ msg("<debug> FontConfig: Create Monospace Family Pattern");
pattern = FcPatternBuild (NULL, FC_FAMILY, FcTypeString, "monospace", NULL);
} else {
+ msg("<debug> FontConfig: Create Sans Family Pattern");
pattern = FcPatternBuild (NULL, FC_FAMILY, FcTypeString, "sans", NULL);
}
// check for italic
if (gfxFont->isItalic()) {
+ msg("<debug> FontConfig: Adding Italic Slant");
int bb = FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC);
}
// check for bold
if (gfxFont->isBold()) {
+ msg("<debug> FontConfig: Adding Bold Weight");
int bb = FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD);
}
+ msg("<debug> FontConfig: Try to match... (2)");
// configure and match using serif etc
FcConfigSubstitute (0, pattern, FcMatchPattern);
FcDefaultSubstitute (pattern);
if(nfn) fontname = strdup(nfn+1);
else fontname = filename;
}
+ msg("<debug> FontConfig: Returning \"%s\"", fontname);
}
}
zoom = atoi(value);
} else if(!strcmp(name, "fontdir")) {
pdfswf_addfontdir(value);
+ } else if(!strcmp(name, "languagedir")) {
+ pdfswf_addlanguagedir(value);
+ } else if(!strcmp(name, "fontconfig")) {
+ config_use_fontconfig = atoi(value);
} else {
swfoutput_setparameter(name, value);
}
}
}
+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) + 1 + sizeof("add-to-xpdfrc"));
+ 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", config_file);
+ 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);
{
char*fontname = (char*)malloc(strlen(dirname)+strlen(name)+2);
strcpy(fontname, dirname);
-#ifdef WIN32
- strcat(fontname, "\\");
-#else
- strcat(fontname, "/");
-#endif
+ strcat(fontname, dirseparator());
strcat(fontname, name);
- msg("<debug> Adding %s to fonts", fontname);
+ msg("<verbose> Adding %s to fonts", fontname);
pdfswf_addfont(fontname);
}
}
closedir(dir);
#else
- msg("<warning> No dirent.h- unable to add font dir %s");
+ msg("<warning> No dirent.h- unable to add font dir %s", dir);
#endif
}
Object info;
// read config file
- globalParams = new GlobalParams("");
+ if(!globalParams)
+ globalParams = new GlobalParams("");
// open PDF file
if (userPassword && userPassword[0]) {
{
public: ~MemCheck()
{
- delete globalParams;
+ delete globalParams;globalParams=0;
Object::memCheck(stderr);
gMemReport(stderr);
}