summaryrefslogtreecommitdiff
path: root/Build/source/libs/poppler/poppler-0.18.0/poppler/GlobalParamsWin.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/poppler/poppler-0.18.0/poppler/GlobalParamsWin.cc')
-rw-r--r--Build/source/libs/poppler/poppler-0.18.0/poppler/GlobalParamsWin.cc291
1 files changed, 291 insertions, 0 deletions
diff --git a/Build/source/libs/poppler/poppler-0.18.0/poppler/GlobalParamsWin.cc b/Build/source/libs/poppler/poppler-0.18.0/poppler/GlobalParamsWin.cc
new file mode 100644
index 00000000000..f989fb89434
--- /dev/null
+++ b/Build/source/libs/poppler/poppler-0.18.0/poppler/GlobalParamsWin.cc
@@ -0,0 +1,291 @@
+/* Written by Krzysztof Kowalczyk (http://blog.kowalczyk.info)
+ but mostly based on xpdf code.
+
+ // Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
+
+TODO: instead of a fixed mapping defined in displayFontTab, it could
+scan the whole fonts directory, parse TTF files and build font
+description for all fonts available in Windows. That's how MuPDF works.
+*/
+
+#ifndef PACKAGE_NAME
+#include <config.h>
+#endif
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <windows.h>
+#if !(_WIN32_IE >= 0x0500)
+#error "_WIN32_IE must be defined >= 0x0500 for SHGFP_TYPE_CURRENT from shlobj.h"
+#endif
+#include <shlobj.h>
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "goo/gmem.h"
+#include "goo/GooString.h"
+#include "goo/GooList.h"
+#include "goo/GooHash.h"
+#include "goo/gfile.h"
+#include "Error.h"
+#include "NameToCharCode.h"
+#include "CharCodeToUnicode.h"
+#include "UnicodeMap.h"
+#include "CMap.h"
+#include "BuiltinFontTables.h"
+#include "FontEncodingTables.h"
+#include "GlobalParams.h"
+#include "GfxFont.h"
+
+#if MULTITHREADED
+# define lockGlobalParams gLockMutex(&mutex)
+# define lockUnicodeMapCache gLockMutex(&unicodeMapCacheMutex)
+# define lockCMapCache gLockMutex(&cMapCacheMutex)
+# define unlockGlobalParams gUnlockMutex(&mutex)
+# define unlockUnicodeMapCache gUnlockMutex(&unicodeMapCacheMutex)
+# define unlockCMapCache gUnlockMutex(&cMapCacheMutex)
+#else
+# define lockGlobalParams
+# define lockUnicodeMapCache
+# define lockCMapCache
+# define unlockGlobalParams
+# define unlockUnicodeMapCache
+# define unlockCMapCache
+#endif
+
+#define DEFAULT_SUBSTITUTE_FONT "Helvetica"
+
+static struct {
+ char *name;
+ char *t1FileName;
+ char *ttFileName;
+} displayFontTab[] = {
+ {"Courier", "n022003l.pfb", "cour.ttf"},
+ {"Courier-Bold", "n022004l.pfb", "courbd.ttf"},
+ {"Courier-BoldOblique", "n022024l.pfb", "courbi.ttf"},
+ {"Courier-Oblique", "n022023l.pfb", "couri.ttf"},
+ {"Helvetica", "n019003l.pfb", "arial.ttf"},
+ {"Helvetica-Bold", "n019004l.pfb", "arialbd.ttf"},
+ {"Helvetica-BoldOblique", "n019024l.pfb", "arialbi.ttf"},
+ {"Helvetica-Oblique", "n019023l.pfb", "ariali.ttf"},
+ // TODO: not sure if "symbol.ttf" is right
+ {"Symbol", "s050000l.pfb", "symbol.ttf"},
+ {"Times-Bold", "n021004l.pfb", "timesbd.ttf"},
+ {"Times-BoldItalic", "n021024l.pfb", "timesbi.ttf"},
+ {"Times-Italic", "n021023l.pfb", "timesi.ttf"},
+ {"Times-Roman", "n021003l.pfb", "times.ttf"},
+ // TODO: not sure if "wingding.ttf" is right
+ {"ZapfDingbats", "d050000l.pfb", "wingding.ttf"},
+
+ // those seem to be frequently accessed by PDF files and I kind of guess
+ // which font file do the refer to
+ {"Palatino", NULL, "pala.ttf"},
+ {"Palatino-Roman", NULL, "pala.ttf"},
+ {"Palatino-Bold", NULL, "palab.ttf"},
+ {"Palatino-Italic", NULL, "palai.ttf"},
+ {"Palatino,Italic", NULL, "palai.ttf"},
+ {"Palatino-BoldItalic", NULL, "palabi.ttf"},
+
+ {"ArialBlack", NULL, "arialbd.ttf"},
+
+ {"ArialNarrow", NULL, "arialn.ttf"},
+ {"ArialNarrow,Bold", NULL, "arialnb.ttf"},
+ {"ArialNarrow,Italic", NULL, "arialni.ttf"},
+ {"ArialNarrow,BoldItalic", NULL, "arialnbi.ttf"},
+ {"ArialNarrow-Bold", NULL, "arialnb.ttf"},
+ {"ArialNarrow-Italic", NULL, "arialni.ttf"},
+ {"ArialNarrow-BoldItalic", NULL, "arialnbi.ttf"},
+
+ {"HelveticaNarrow", NULL, "arialn.ttf"},
+ {"HelveticaNarrow,Bold", NULL, "arialnb.ttf"},
+ {"HelveticaNarrow,Italic", NULL, "arialni.ttf"},
+ {"HelveticaNarrow,BoldItalic", NULL, "arialnbi.ttf"},
+ {"HelveticaNarrow-Bold", NULL, "arialnb.ttf"},
+ {"HelveticaNarrow-Italic", NULL, "arialni.ttf"},
+ {"HelveticaNarrow-BoldItalic", NULL, "arialnbi.ttf"},
+
+ {"BookAntiqua", NULL, "bkant.ttf"},
+ {"BookAntiqua,Bold", NULL, "bkant.ttf"},
+ {"BookAntiqua,Italic", NULL, "bkant.ttf"},
+ {"BookAntiqua,BoldItalic", NULL, "bkant.ttf"},
+ {"BookAntiqua-Bold", NULL, "bkant.ttf"},
+ {"BookAntiqua-Italic", NULL, "bkant.ttf"},
+ {"BookAntiqua-BoldItalic", NULL, "bkant.ttf"},
+
+ {"Verdana", NULL, "verdana.ttf"},
+ {"Verdana,Bold", NULL, "verdanab.ttf"},
+ {"Verdana,Italic", NULL, "verdanai.ttf"},
+ {"Verdana,BoldItalic", NULL, "verdanaz.ttf"},
+ {"Verdana-Bold", NULL, "verdanab.ttf"},
+ {"Verdana-Italic", NULL, "verdanai.ttf"},
+ {"Verdana-BoldItalic", NULL, "verdanaz.ttf"},
+
+ {"Tahoma", NULL, "tahoma.ttf"},
+ {"Tahoma,Bold", NULL, "tahomabd.ttf"},
+ {"Tahoma,Italic", NULL, "tahoma.ttf"},
+ {"Tahoma,BoldItalic", NULL, "tahomabd.ttf"},
+ {"Tahoma-Bold", NULL, "tahomabd.ttf"},
+ {"Tahoma-Italic", NULL, "tahoma.ttf"},
+ {"Tahoma-BoldItalic", NULL, "tahomabd.ttf"},
+
+ {"CCRIKH+Verdana", NULL, "verdana.ttf"},
+ {"CCRIKH+Verdana,Bold", NULL, "verdanab.ttf"},
+ {"CCRIKH+Verdana,Italic", NULL, "verdanai.ttf"},
+ {"CCRIKH+Verdana,BoldItalic", NULL, "verdanaz.ttf"},
+ {"CCRIKH+Verdana-Bold", NULL, "verdanab.ttf"},
+ {"CCRIKH+Verdana-Italic", NULL, "verdanai.ttf"},
+ {"CCRIKH+Verdana-BoldItalic", NULL, "verdanaz.ttf"},
+
+ {"Georgia", NULL, "georgia.ttf"},
+ {"Georgia,Bold", NULL, "georgiab.ttf"},
+ {"Georgia,Italic", NULL, "georgiai.ttf"},
+ {"Georgia,BoldItalic", NULL, "georgiaz.ttf"},
+ {"Georgia-Bold", NULL, "georgiab.ttf"},
+ {"Georgia-Italic", NULL, "georgiai.ttf"},
+ {"Georgia-BoldItalic", NULL, "georgiaz.ttf"},
+
+ {NULL}
+};
+
+#define FONTS_SUBDIR "\\fonts"
+
+static void GetWindowsFontDir(char *winFontDir, int cbWinFontDirLen)
+{
+ BOOL (__stdcall *SHGetSpecialFolderPathFunc)(HWND hwndOwner,
+ LPTSTR lpszPath,
+ int nFolder,
+ BOOL fCreate);
+ HRESULT (__stdcall *SHGetFolderPathFunc)(HWND hwndOwner,
+ int nFolder,
+ HANDLE hToken,
+ DWORD dwFlags,
+ LPTSTR pszPath);
+
+ // SHGetSpecialFolderPath isn't available in older versions of shell32.dll (Win95 and
+ // WinNT4), so do a dynamic load of ANSI versions.
+ winFontDir[0] = '\0';
+
+ HMODULE hLib = LoadLibrary("shell32.dll");
+ if (hLib) {
+ SHGetFolderPathFunc = (HRESULT (__stdcall *)(HWND, int, HANDLE, DWORD, LPTSTR))
+ GetProcAddress(hLib, "SHGetFolderPathA");
+ if (SHGetFolderPathFunc)
+ (*SHGetFolderPathFunc)(NULL, CSIDL_FONTS, NULL, SHGFP_TYPE_CURRENT, winFontDir);
+
+ if (!winFontDir[0]) {
+ // Try an older function
+ SHGetSpecialFolderPathFunc = (BOOL (__stdcall *)(HWND, LPTSTR, int, BOOL))
+ GetProcAddress(hLib, "SHGetSpecialFolderPathA");
+ if (SHGetSpecialFolderPathFunc)
+ (*SHGetSpecialFolderPathFunc)(NULL, winFontDir, CSIDL_FONTS, FALSE);
+ }
+ FreeLibrary(hLib);
+ }
+ if (winFontDir[0])
+ return;
+
+ // Try older DLL
+ hLib = LoadLibrary("SHFolder.dll");
+ if (hLib) {
+ SHGetFolderPathFunc = (HRESULT (__stdcall *)(HWND, int, HANDLE, DWORD, LPTSTR))
+ GetProcAddress(hLib, "SHGetFolderPathA");
+ if (SHGetFolderPathFunc)
+ (*SHGetFolderPathFunc)(NULL, CSIDL_FONTS, NULL, SHGFP_TYPE_CURRENT, winFontDir);
+ FreeLibrary(hLib);
+ }
+ if (winFontDir[0])
+ return;
+
+ // Everything else failed so the standard fonts directory.
+ GetWindowsDirectory(winFontDir, cbWinFontDirLen);
+ if (winFontDir[0]) {
+ strncat(winFontDir, FONTS_SUBDIR, cbWinFontDirLen);
+ winFontDir[cbWinFontDirLen-1] = 0;
+ }
+}
+
+static bool FileExists(const char *path)
+{
+ FILE * f = fopen(path, "rb");
+ if (f) {
+ fclose(f);
+ return true;
+ }
+ return false;
+}
+
+static void AddFont(GooHash *displayFonts, char *fontName, GooString *fontPath, DisplayFontParamKind kind)
+{
+ DisplayFontParam *dfp = new DisplayFontParam(new GooString(fontName), kind);
+ dfp->setFileName(fontPath);
+ displayFonts->add(dfp->name, dfp);
+}
+
+void GlobalParams::setupBaseFonts(char * dir)
+{
+ if (baseFontsInitialized)
+ return;
+ baseFontsInitialized = true;
+
+ char winFontDir[MAX_PATH];
+ GetWindowsFontDir(winFontDir, sizeof(winFontDir));
+
+ for (int i = 0; displayFontTab[i].name; ++i) {
+ char *fontName = displayFontTab[i].name;
+ if (displayFonts->lookup(fontName))
+ continue;
+
+ if (dir) {
+ GooString *fontPath = appendToPath(new GooString(dir), displayFontTab[i].t1FileName);
+ if (FileExists(fontPath->getCString())) {
+ AddFont(displayFonts, fontName, fontPath, displayFontT1);
+ continue;
+ }
+ delete fontPath;
+ }
+
+ if (winFontDir[0] && displayFontTab[i].ttFileName) {
+ GooString *fontPath = appendToPath(new GooString(winFontDir), displayFontTab[i].ttFileName);
+ if (FileExists(fontPath->getCString())) {
+ AddFont(displayFonts, fontName, fontPath, displayFontTT);
+ continue;
+ }
+ delete fontPath;
+ }
+
+ error(-1, "No display font for '%s'", fontName);
+ }
+}
+
+static char *findSubstituteName(const char *origName)
+{
+ assert(origName);
+ if (!origName) return NULL;
+ /* TODO: try to at least guess bold/italic/bolditalic from the name */
+ return DEFAULT_SUBSTITUTE_FONT;
+}
+
+/* Windows implementation of external font matching code */
+DisplayFontParam *GlobalParams::getDisplayFont(GfxFont *font) {
+ DisplayFontParam * dfp;
+ GooString * fontName = font->getName();
+ char * substFontName = NULL;
+
+ if (!fontName) return NULL;
+ lockGlobalParams;
+ setupBaseFonts(NULL);
+ dfp = (DisplayFontParam *)displayFonts->lookup(fontName);
+ if (!dfp) {
+ substFontName = findSubstituteName(fontName->getCString());
+ error(-1, "Couldn't find a font for '%s', subst is '%s'", fontName->getCString(), substFontName);
+ dfp = (DisplayFontParam *)displayFonts->lookup(substFontName);
+ assert(dfp);
+ }
+ unlockGlobalParams;
+ return dfp;
+}
+