diff options
Diffstat (limited to 'Build/source/libs/poppler/poppler-0.20.2/poppler/GlobalParams.cc')
-rw-r--r-- | Build/source/libs/poppler/poppler-0.20.2/poppler/GlobalParams.cc | 2283 |
1 files changed, 0 insertions, 2283 deletions
diff --git a/Build/source/libs/poppler/poppler-0.20.2/poppler/GlobalParams.cc b/Build/source/libs/poppler/poppler-0.20.2/poppler/GlobalParams.cc deleted file mode 100644 index 76394cafa5f..00000000000 --- a/Build/source/libs/poppler/poppler-0.20.2/poppler/GlobalParams.cc +++ /dev/null @@ -1,2283 +0,0 @@ -//======================================================================== -// -// GlobalParams.cc -// -// Copyright 2001-2003 Glyph & Cog, LLC -// -//======================================================================== - -//======================================================================== -// -// Modified under the Poppler project - http://poppler.freedesktop.org -// -// All changes made under the Poppler project to this file are licensed -// under GPL version 2 or later -// -// Copyright (C) 2005 Martin Kretzschmar <martink@gnome.org> -// Copyright (C) 2005, 2006 Kristian Høgsberg <krh@redhat.com> -// Copyright (C) 2005, 2007-2010, 2012 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2005 Jonathan Blandford <jrb@redhat.com> -// Copyright (C) 2006, 2007 Jeff Muizelaar <jeff@infidigm.net> -// Copyright (C) 2006 Takashi Iwai <tiwai@suse.de> -// Copyright (C) 2006 Ed Catmur <ed@catmur.co.uk> -// Copyright (C) 2007 Krzysztof Kowalczyk <kkowalczyk@gmail.com> -// Copyright (C) 2007, 2009 Jonathan Kew <jonathan_kew@sil.org> -// Copyright (C) 2009 Petr Gajdos <pgajdos@novell.com> -// Copyright (C) 2009, 2011, 2012 William Bader <williambader@hotmail.com> -// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net> -// Copyright (C) 2010 Hib Eris <hib@hiberis.nl> -// Copyright (C) 2010 Patrick Spendrin <ps_ml@gmx.de> -// Copyright (C) 2010 Jakub Wilk <ubanus@users.sf.net> -// Copyright (C) 2011 Pino Toscano <pino@kde.org> -// Copyright (C) 2011 Koji Otani <sho@bbr.jp> -// Copyright (C) 2012 Yi Yang <ahyangyi@gmail.com> -// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2012 Peter Breitenlohner <peb@mppmu.mpg.de> -// -// To see a description of the changes please see the Changelog file that -// came with your tarball or type make ChangeLog if you are building from git -// -//======================================================================== - -#include <config.h> - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include <string.h> -#include <stdio.h> -#include <ctype.h> -#ifdef ENABLE_PLUGINS -# ifndef _WIN32 -# include <dlfcn.h> -# endif -#endif -#ifdef _WIN32 -# include <shlobj.h> -# include <mbstring.h> -#endif -#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" -#ifdef ENABLE_PLUGINS -# include "XpdfPluginAPI.h" -#endif -#include "GlobalParams.h" -#include "GfxFont.h" - -#if WITH_FONTCONFIGURATION_FONTCONFIG -#include <fontconfig/fontconfig.h> -#endif - -#ifdef _WIN32 -# define strcasecmp stricmp -#else -# include <strings.h> -#endif - -#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 - -#ifndef FC_WEIGHT_BOOK -#define FC_WEIGHT_BOOK 75 -#endif - -#include "NameToUnicodeTable.h" -#include "UnicodeMapTables.h" -#include "UTF8.h" - -#ifdef ENABLE_PLUGINS -# ifdef _WIN32 -extern XpdfPluginVecTable xpdfPluginVecTable; -# endif -#endif - -//------------------------------------------------------------------------ - -#define cidToUnicodeCacheSize 4 -#define unicodeToUnicodeCacheSize 4 - -//------------------------------------------------------------------------ - -GlobalParams *globalParams = NULL; - -//------------------------------------------------------------------------ -// PSFontParam16 -//------------------------------------------------------------------------ - -PSFontParam16::PSFontParam16(GooString *nameA, int wModeA, - GooString *psFontNameA, GooString *encodingA) { - name = nameA; - wMode = wModeA; - psFontName = psFontNameA; - encoding = encodingA; -} - -PSFontParam16::~PSFontParam16() { - delete name; - delete psFontName; - delete encoding; -} - -#if ENABLE_RELOCATABLE && defined(_WIN32) - -/* search for data relative to where we are installed */ - -static HMODULE hmodule; - -extern "C" { -BOOL WINAPI -DllMain (HINSTANCE hinstDLL, - DWORD fdwReason, - LPVOID lpvReserved) -{ - switch (fdwReason) - { - case DLL_PROCESS_ATTACH: - hmodule = hinstDLL; - break; - } - - return TRUE; -} -} - -static char * -get_poppler_datadir (void) -{ - static char retval[MAX_PATH]; - static int beenhere = 0; - - unsigned char *p; - - if (beenhere) - return retval; - - if (!GetModuleFileName (hmodule, (CHAR *) retval, sizeof(retval) - 20)) - return POPPLER_DATADIR; - - p = _mbsrchr ((unsigned char *) retval, '\\'); - *p = '\0'; - p = _mbsrchr ((unsigned char *) retval, '\\'); - if (p) { - if (stricmp ((const char *) (p+1), "bin") == 0) - *p = '\0'; - } - strcat (retval, "\\share\\poppler"); - - beenhere = 1; - - return retval; -} - -#undef POPPLER_DATADIR -#define POPPLER_DATADIR get_poppler_datadir () - -#endif - -//------------------------------------------------------------------------ -// SysFontInfo -//------------------------------------------------------------------------ - -class SysFontInfo { -public: - - GooString *name; - GBool bold; - GBool italic; - GBool oblique; - GBool fixedWidth; - GooString *path; - SysFontType type; - int fontNum; // for TrueType collections - GooString *substituteName; - - SysFontInfo(GooString *nameA, GBool boldA, GBool italicA, GBool obliqueA, GBool fixedWidthA, - GooString *pathA, SysFontType typeA, int fontNumA, GooString *substituteNameA); - ~SysFontInfo(); - GBool match(SysFontInfo *fi); - GBool match(GooString *nameA, GBool boldA, GBool italicA, GBool obliqueA, GBool fixedWidthA); - GBool match(GooString *nameA, GBool boldA, GBool italicA); -}; - -SysFontInfo::SysFontInfo(GooString *nameA, GBool boldA, GBool italicA, GBool obliqueA, GBool fixedWidthA, - GooString *pathA, SysFontType typeA, int fontNumA, GooString *substituteNameA) { - name = nameA; - bold = boldA; - italic = italicA; - oblique = obliqueA; - fixedWidth = fixedWidthA; - path = pathA; - type = typeA; - fontNum = fontNumA; - substituteName = substituteNameA; -} - -SysFontInfo::~SysFontInfo() { - delete name; - delete path; - delete substituteName; -} - -GBool SysFontInfo::match(SysFontInfo *fi) { - return !strcasecmp(name->getCString(), fi->name->getCString()) && - bold == fi->bold && italic == fi->italic && oblique == fi->oblique && fixedWidth == fi->fixedWidth; -} - -GBool SysFontInfo::match(GooString *nameA, GBool boldA, GBool italicA, GBool obliqueA, GBool fixedWidthA) { - return !strcasecmp(name->getCString(), nameA->getCString()) && - bold == boldA && italic == italicA && oblique == obliqueA && fixedWidth == fixedWidthA; -} - -GBool SysFontInfo::match(GooString *nameA, GBool boldA, GBool italicA) { - return !strcasecmp(name->getCString(), nameA->getCString()) && - bold == boldA && italic == italicA; -} - -//------------------------------------------------------------------------ -// SysFontList -//------------------------------------------------------------------------ - -class SysFontList { -public: - - SysFontList(); - ~SysFontList(); - SysFontInfo *find(GooString *name, GBool isFixedWidth, GBool exact); - -#ifdef WIN32 - void scanWindowsFonts(GooString *winFontDir); -#endif -#ifdef WITH_FONTCONFIGURATION_FONTCONFIG - void addFcFont(SysFontInfo *si) {fonts->append(si);} -#endif -private: - -#ifdef WIN32 - SysFontInfo *makeWindowsFont(char *name, int fontNum, - char *path); -#endif - - GooList *fonts; // [SysFontInfo] -}; - -SysFontList::SysFontList() { - fonts = new GooList(); -} - -SysFontList::~SysFontList() { - deleteGooList(fonts, SysFontInfo); -} - -SysFontInfo *SysFontList::find(GooString *name, GBool fixedWidth, GBool exact) { - GooString *name2; - GBool bold, italic, oblique; - SysFontInfo *fi; - char c; - int n, i; - - name2 = name->copy(); - - // remove space, comma, dash chars - i = 0; - while (i < name2->getLength()) { - c = name2->getChar(i); - if (c == ' ' || c == ',' || c == '-') { - name2->del(i); - } else { - ++i; - } - } - n = name2->getLength(); - - // remove trailing "MT" (Foo-MT, Foo-BoldMT, etc.) - if (n > 2 && !strcmp(name2->getCString() + n - 2, "MT")) { - name2->del(n - 2, 2); - n -= 2; - } - - // look for "Regular" - if (n > 7 && !strcmp(name2->getCString() + n - 7, "Regular")) { - name2->del(n - 7, 7); - n -= 7; - } - - // look for "Italic" - if (n > 6 && !strcmp(name2->getCString() + n - 6, "Italic")) { - name2->del(n - 6, 6); - italic = gTrue; - n -= 6; - } else { - italic = gFalse; - } - - // look for "Oblique" - if (n > 6 && !strcmp(name2->getCString() + n - 7, "Oblique")) { - name2->del(n - 7, 7); - oblique = gTrue; - n -= 6; - } else { - oblique = gFalse; - } - - // look for "Bold" - if (n > 4 && !strcmp(name2->getCString() + n - 4, "Bold")) { - name2->del(n - 4, 4); - bold = gTrue; - n -= 4; - } else { - bold = gFalse; - } - - // remove trailing "MT" (FooMT-Bold, etc.) - if (n > 2 && !strcmp(name2->getCString() + n - 2, "MT")) { - name2->del(n - 2, 2); - n -= 2; - } - - // remove trailing "PS" - if (n > 2 && !strcmp(name2->getCString() + n - 2, "PS")) { - name2->del(n - 2, 2); - n -= 2; - } - - // remove trailing "IdentityH" - if (n > 9 && !strcmp(name2->getCString() + n - 9, "IdentityH")) { - name2->del(n - 9, 9); - n -= 9; - } - - // search for the font - fi = NULL; - for (i = 0; i < fonts->getLength(); ++i) { - fi = (SysFontInfo *)fonts->get(i); - if (fi->match(name2, bold, italic, oblique, fixedWidth)) { - break; - } - fi = NULL; - } - if (!fi && !exact && bold) { - // try ignoring the bold flag - for (i = 0; i < fonts->getLength(); ++i) { - fi = (SysFontInfo *)fonts->get(i); - if (fi->match(name2, gFalse, italic)) { - break; - } - fi = NULL; - } - } - if (!fi && !exact && (bold || italic)) { - // try ignoring the bold and italic flags - for (i = 0; i < fonts->getLength(); ++i) { - fi = (SysFontInfo *)fonts->get(i); - if (fi->match(name2, gFalse, gFalse)) { - break; - } - fi = NULL; - } - } - - delete name2; - return fi; -} - - -#ifdef ENABLE_PLUGINS -//------------------------------------------------------------------------ -// Plugin -//------------------------------------------------------------------------ - -class Plugin { -public: - - static Plugin *load(char *type, char *name); - ~Plugin(); - -private: - -#ifdef _WIN32 - Plugin(HMODULE libA); - HMODULE lib; -#else - Plugin(void *dlA); - void *dl; -#endif -}; - -Plugin *Plugin::load(char *type, char *name) { - GooString *path; - Plugin *plugin; - XpdfPluginVecTable *vt; - XpdfBool (*xpdfInitPlugin)(void); -#ifdef _WIN32 - HMODULE libA; -#else - void *dlA; -#endif - - path = globalParams->getBaseDir(); - appendToPath(path, "plugins"); - appendToPath(path, type); - appendToPath(path, name); - -#ifdef _WIN32 - path->append(".dll"); - if (!(libA = LoadLibrary(path->getCString()))) { - error(errIO, -1, "Failed to load plugin '{0:t}'", path); - goto err1; - } - if (!(vt = (XpdfPluginVecTable *) - GetProcAddress(libA, "xpdfPluginVecTable"))) { - error(errIO, -1, "Failed to find xpdfPluginVecTable in plugin '{0:t}'", - path); - goto err2; - } -#else - //~ need to deal with other extensions here - path->append(".so"); - if (!(dlA = dlopen(path->getCString(), RTLD_NOW))) { - error(errIO, -1, "Failed to load plugin '{0:t}': {1:s}", - path, dlerror()); - goto err1; - } - if (!(vt = (XpdfPluginVecTable *)dlsym(dlA, "xpdfPluginVecTable"))) { - error(errIO, -1, "Failed to find xpdfPluginVecTable in plugin '{0:t}'", - path); - goto err2; - } -#endif - - if (vt->version != xpdfPluginVecTable.version) { - error(errIO, -1, "Plugin '{0:t}' is wrong version", path); - goto err2; - } - memcpy(vt, &xpdfPluginVecTable, sizeof(xpdfPluginVecTable)); - -#ifdef _WIN32 - if (!(xpdfInitPlugin = (XpdfBool (*)(void)) - GetProcAddress(libA, "xpdfInitPlugin"))) { - error(errIO, -1, "Failed to find xpdfInitPlugin in plugin '{0:t}'", - path); - goto err2; - } -#else - if (!(xpdfInitPlugin = (XpdfBool (*)(void))dlsym(dlA, "xpdfInitPlugin"))) { - error(errIO, -1, "Failed to find xpdfInitPlugin in plugin '{0:t}'", - path); - goto err2; - } -#endif - - if (!(*xpdfInitPlugin)()) { - error(errIO, -1, "Initialization of plugin '{0:t}' failed", path); - goto err2; - } - -#ifdef _WIN32 - plugin = new Plugin(libA); -#else - plugin = new Plugin(dlA); -#endif - - delete path; - return plugin; - - err2: -#ifdef _WIN32 - FreeLibrary(libA); -#else - dlclose(dlA); -#endif - err1: - delete path; - return NULL; -} - -#ifdef _WIN32 -Plugin::Plugin(HMODULE libA) { - lib = libA; -} -#else -Plugin::Plugin(void *dlA) { - dl = dlA; -} -#endif - -Plugin::~Plugin() { - void (*xpdfFreePlugin)(void); - -#ifdef _WIN32 - if ((xpdfFreePlugin = (void (*)(void)) - GetProcAddress(lib, "xpdfFreePlugin"))) { - (*xpdfFreePlugin)(); - } - FreeLibrary(lib); -#else - if ((xpdfFreePlugin = (void (*)(void))dlsym(dl, "xpdfFreePlugin"))) { - (*xpdfFreePlugin)(); - } - dlclose(dl); -#endif -} - -#endif // ENABLE_PLUGINS - -//------------------------------------------------------------------------ -// parsing -//------------------------------------------------------------------------ - -GlobalParams::GlobalParams(const char *customPopplerDataDir) - : popplerDataDir(customPopplerDataDir) -{ - UnicodeMap *map; - int i; - -#if MULTITHREADED - gInitMutex(&mutex); - gInitMutex(&unicodeMapCacheMutex); - gInitMutex(&cMapCacheMutex); -#endif - - initBuiltinFontTables(); - - // scan the encoding in reverse because we want the lowest-numbered - // index for each char name ('space' is encoded twice) - macRomanReverseMap = new NameToCharCode(); - for (i = 255; i >= 0; --i) { - if (macRomanEncoding[i]) { - macRomanReverseMap->add(macRomanEncoding[i], (CharCode)i); - } - } - -#ifdef _WIN32 - // baseDir will be set by a call to setBaseDir - baseDir = new GooString(); - substFiles = new GooHash(gTrue); -#else - baseDir = appendToPath(getHomeDir(), ".xpdf"); -#endif - nameToUnicode = new NameToCharCode(); - cidToUnicodes = new GooHash(gTrue); - unicodeToUnicodes = new GooHash(gTrue); - residentUnicodeMaps = new GooHash(); - unicodeMaps = new GooHash(gTrue); - cMapDirs = new GooHash(gTrue); - toUnicodeDirs = new GooList(); - fontFiles = new GooHash(gTrue); - fontDirs = new GooList(); - ccFontFiles = new GooHash(gTrue); - sysFonts = new SysFontList(); - psExpandSmaller = gFalse; - psShrinkLarger = gTrue; - psCenter = gTrue; - psLevel = psLevel2; - psFile = NULL; - psResidentFonts = new GooHash(gTrue); - psResidentFonts16 = new GooList(); - psResidentFontsCC = new GooList(); - psEmbedType1 = gTrue; - psEmbedTrueType = gTrue; - psEmbedCIDPostScript = gTrue; - psEmbedCIDTrueType = gTrue; - psFontPassthrough = gFalse; - psPreload = gFalse; - psOPI = gFalse; - psASCIIHex = gFalse; - psBinary = gFalse; - psUncompressPreloadedImages = gFalse; - psRasterResolution = 300; - psRasterMono = gFalse; - textEncoding = new GooString("UTF-8"); -#if defined(_WIN32) - textEOL = eolDOS; -#elif defined(MACOS) - textEOL = eolMac; -#else - textEOL = eolUnix; -#endif - textPageBreaks = gTrue; - textKeepTinyChars = gFalse; - enableFreeType = gTrue; - antialias = gTrue; - vectorAntialias = gTrue; - antialiasPrinting = gFalse; - strokeAdjust = gTrue; - screenType = screenUnset; - screenSize = -1; - screenDotRadius = -1; - screenGamma = 1.0; - screenBlackThreshold = 0.0; - screenWhiteThreshold = 1.0; - minLineWidth = 0.0; - overprintPreview = gFalse; - mapNumericCharNames = gTrue; - mapUnknownCharNames = gFalse; - printCommands = gFalse; - profileCommands = gFalse; - errQuiet = gFalse; - - cidToUnicodeCache = new CharCodeToUnicodeCache(cidToUnicodeCacheSize); - unicodeToUnicodeCache = - new CharCodeToUnicodeCache(unicodeToUnicodeCacheSize); - unicodeMapCache = new UnicodeMapCache(); - cMapCache = new CMapCache(); - - baseFontsInitialized = gFalse; -#ifdef ENABLE_PLUGINS - plugins = new GooList(); - securityHandlers = new GooList(); -#endif - - // set up the initial nameToUnicode table - for (i = 0; nameToUnicodeTab[i].name; ++i) { - nameToUnicode->add(nameToUnicodeTab[i].name, nameToUnicodeTab[i].u); - } - - // set up the residentUnicodeMaps table - map = new UnicodeMap("Latin1", gFalse, - latin1UnicodeMapRanges, latin1UnicodeMapLen); - residentUnicodeMaps->add(map->getEncodingName(), map); - map = new UnicodeMap("ASCII7", gFalse, - ascii7UnicodeMapRanges, ascii7UnicodeMapLen); - residentUnicodeMaps->add(map->getEncodingName(), map); - map = new UnicodeMap("Symbol", gFalse, - symbolUnicodeMapRanges, symbolUnicodeMapLen); - residentUnicodeMaps->add(map->getEncodingName(), map); - map = new UnicodeMap("ZapfDingbats", gFalse, zapfDingbatsUnicodeMapRanges, - zapfDingbatsUnicodeMapLen); - residentUnicodeMaps->add(map->getEncodingName(), map); - map = new UnicodeMap("UTF-8", gTrue, &mapUTF8); - residentUnicodeMaps->add(map->getEncodingName(), map); - map = new UnicodeMap("UCS-2", gTrue, &mapUCS2); - residentUnicodeMaps->add(map->getEncodingName(), map); - - scanEncodingDirs(); -} - -void GlobalParams::scanEncodingDirs() { - GDir *dir; - GDirEntry *entry; - const char *dataRoot = popplerDataDir ? popplerDataDir : POPPLER_DATADIR; - - // allocate buffer large enough to append "/nameToUnicode" - size_t bufSize = strlen(dataRoot) + strlen("/nameToUnicode") + 1; - char *dataPathBuffer = new char[bufSize]; - - snprintf(dataPathBuffer, bufSize, "%s/nameToUnicode", dataRoot); - dir = new GDir(dataPathBuffer, gTrue); - while (entry = dir->getNextEntry(), entry != NULL) { - if (!entry->isDir()) { - parseNameToUnicode(entry->getFullPath()); - } - delete entry; - } - delete dir; - - snprintf(dataPathBuffer, bufSize, "%s/cidToUnicode", dataRoot); - dir = new GDir(dataPathBuffer, gFalse); - while (entry = dir->getNextEntry(), entry != NULL) { - addCIDToUnicode(entry->getName(), entry->getFullPath()); - delete entry; - } - delete dir; - - snprintf(dataPathBuffer, bufSize, "%s/unicodeMap", dataRoot); - dir = new GDir(dataPathBuffer, gFalse); - while (entry = dir->getNextEntry(), entry != NULL) { - addUnicodeMap(entry->getName(), entry->getFullPath()); - delete entry; - } - delete dir; - - snprintf(dataPathBuffer, bufSize, "%s/cMap", dataRoot); - dir = new GDir(dataPathBuffer, gFalse); - while (entry = dir->getNextEntry(), entry != NULL) { - addCMapDir(entry->getName(), entry->getFullPath()); - toUnicodeDirs->append(entry->getFullPath()->copy()); - delete entry; - } - delete dir; - - delete[] dataPathBuffer; -} - -void GlobalParams::parseNameToUnicode(GooString *name) { - char *tok1, *tok2; - FILE *f; - char buf[256]; - int line; - Unicode u; - char *tokptr; - - if (!(f = openFile(name->getCString(), "r"))) { - error(errIO, -1, "Couldn't open 'nameToUnicode' file '{0:t}'", - name); - return; - } - line = 1; - while (getLine(buf, sizeof(buf), f)) { - tok1 = strtok_r(buf, " \t\r\n", &tokptr); - tok2 = strtok_r(NULL, " \t\r\n", &tokptr); - if (tok1 && tok2) { - sscanf(tok1, "%x", &u); - nameToUnicode->add(tok2, u); - } else { - error(errConfig, -1, "Bad line in 'nameToUnicode' file ({0:t}:{1:d})", - name, line); - } - ++line; - } - fclose(f); -} - -void GlobalParams::addCIDToUnicode(GooString *collection, - GooString *fileName) { - GooString *old; - - if ((old = (GooString *)cidToUnicodes->remove(collection))) { - delete old; - } - cidToUnicodes->add(collection->copy(), fileName->copy()); -} - -void GlobalParams::addUnicodeMap(GooString *encodingName, GooString *fileName) -{ - GooString *old; - - if ((old = (GooString *)unicodeMaps->remove(encodingName))) { - delete old; - } - unicodeMaps->add(encodingName->copy(), fileName->copy()); -} - -void GlobalParams::addCMapDir(GooString *collection, GooString *dir) { - GooList *list; - - if (!(list = (GooList *)cMapDirs->lookup(collection))) { - list = new GooList(); - cMapDirs->add(collection->copy(), list); - } - list->append(dir->copy()); -} - -GBool GlobalParams::parseYesNo2(const char *token, GBool *flag) { - if (!strcmp(token, "yes")) { - *flag = gTrue; - } else if (!strcmp(token, "no")) { - *flag = gFalse; - } else { - return gFalse; - } - return gTrue; -} - -GlobalParams::~GlobalParams() { - freeBuiltinFontTables(); - - delete macRomanReverseMap; - - delete baseDir; - delete nameToUnicode; - deleteGooHash(cidToUnicodes, GooString); - deleteGooHash(unicodeToUnicodes, GooString); - deleteGooHash(residentUnicodeMaps, UnicodeMap); - deleteGooHash(unicodeMaps, GooString); - deleteGooList(toUnicodeDirs, GooString); - deleteGooHash(fontFiles, GooString); - deleteGooList(fontDirs, GooString); - deleteGooHash(ccFontFiles, GooString); -#ifdef _WIN32 - deleteGooHash(substFiles, GooString); -#endif - delete sysFonts; - if (psFile) { - delete psFile; - } - deleteGooHash(psResidentFonts, GooString); - deleteGooList(psResidentFonts16, PSFontParam16); - deleteGooList(psResidentFontsCC, PSFontParam16); - delete textEncoding; - - GooHashIter *iter; - GooString *key; - cMapDirs->startIter(&iter); - void *val; - while (cMapDirs->getNext(&iter, &key, &val)) { - GooList* list = (GooList*)val; - deleteGooList(list, GooString); - } - delete cMapDirs; - - delete cidToUnicodeCache; - delete unicodeToUnicodeCache; - delete unicodeMapCache; - delete cMapCache; - -#ifdef ENABLE_PLUGINS - delete securityHandlers; - deleteGooList(plugins, Plugin); -#endif - -#if MULTITHREADED - gDestroyMutex(&mutex); - gDestroyMutex(&unicodeMapCacheMutex); - gDestroyMutex(&cMapCacheMutex); -#endif -} - -//------------------------------------------------------------------------ - -void GlobalParams::setBaseDir(const char *dir) { - delete baseDir; - baseDir = new GooString(dir); -} - -//------------------------------------------------------------------------ -// accessors -//------------------------------------------------------------------------ - -CharCode GlobalParams::getMacRomanCharCode(char *charName) { - // no need to lock - macRomanReverseMap is constant - return macRomanReverseMap->lookup(charName); -} - -GooString *GlobalParams::getBaseDir() { - GooString *s; - - lockGlobalParams; - s = baseDir->copy(); - unlockGlobalParams; - return s; -} - -Unicode GlobalParams::mapNameToUnicode(const char *charName) { - // no need to lock - nameToUnicode is constant - return nameToUnicode->lookup(charName); -} - -UnicodeMap *GlobalParams::getResidentUnicodeMap(GooString *encodingName) { - UnicodeMap *map; - - lockGlobalParams; - map = (UnicodeMap *)residentUnicodeMaps->lookup(encodingName); - unlockGlobalParams; - if (map) { - map->incRefCnt(); - } - return map; -} - -FILE *GlobalParams::getUnicodeMapFile(GooString *encodingName) { - GooString *fileName; - FILE *f; - - lockGlobalParams; - if ((fileName = (GooString *)unicodeMaps->lookup(encodingName))) { - f = openFile(fileName->getCString(), "r"); - } else { - f = NULL; - } - unlockGlobalParams; - return f; -} - -FILE *GlobalParams::findCMapFile(GooString *collection, GooString *cMapName) { - GooList *list; - GooString *dir; - GooString *fileName; - FILE *f; - int i; - - lockGlobalParams; - if (!(list = (GooList *)cMapDirs->lookup(collection))) { - unlockGlobalParams; - return NULL; - } - for (i = 0; i < list->getLength(); ++i) { - dir = (GooString *)list->get(i); - fileName = appendToPath(dir->copy(), cMapName->getCString()); - f = openFile(fileName->getCString(), "r"); - delete fileName; - if (f) { - unlockGlobalParams; - return f; - } - } - unlockGlobalParams; - return NULL; -} - -FILE *GlobalParams::findToUnicodeFile(GooString *name) { - GooString *dir, *fileName; - FILE *f; - int i; - - lockGlobalParams; - for (i = 0; i < toUnicodeDirs->getLength(); ++i) { - dir = (GooString *)toUnicodeDirs->get(i); - fileName = appendToPath(dir->copy(), name->getCString()); - f = openFile(fileName->getCString(), "r"); - delete fileName; - if (f) { - unlockGlobalParams; - return f; - } - } - unlockGlobalParams; - return NULL; -} - -#if WITH_FONTCONFIGURATION_FONTCONFIG -static GBool findModifier(const char *name, const char *modifier, const char **start) -{ - const char *match; - - if (name == NULL) - return gFalse; - - match = strstr(name, modifier); - if (match) { - if (*start == NULL || match < *start) - *start = match; - return gTrue; - } - else { - return gFalse; - } -} - -static const char *getFontLang(GfxFont *font) -{ - const char *lang; - - // find the language we want the font to support - if (font->isCIDFont()) - { - GooString *collection = ((GfxCIDFont *)font)->getCollection(); - if (collection) - { - if (strcmp(collection->getCString(), "Adobe-GB1") == 0) - lang = "zh-cn"; // Simplified Chinese - else if (strcmp(collection->getCString(), "Adobe-CNS1") == 0) - lang = "zh-tw"; // Traditional Chinese - else if (strcmp(collection->getCString(), "Adobe-Japan1") == 0) - lang = "ja"; // Japanese - else if (strcmp(collection->getCString(), "Adobe-Japan2") == 0) - lang = "ja"; // Japanese - else if (strcmp(collection->getCString(), "Adobe-Korea1") == 0) - lang = "ko"; // Korean - else if (strcmp(collection->getCString(), "Adobe-UCS") == 0) - lang = "xx"; - else if (strcmp(collection->getCString(), "Adobe-Identity") == 0) - lang = "xx"; - else - { - error(errUnimplemented, -1, "Unknown CID font collection, please report to poppler bugzilla."); - lang = "xx"; - } - } - else lang = "xx"; - } - else lang = "xx"; - return lang; -} - -static FcPattern *buildFcPattern(GfxFont *font, GooString *base14Name) -{ - int weight = -1, - slant = -1, - width = -1, - spacing = -1; - bool deleteFamily = false; - char *family, *name, *modifiers; - const char *start; - FcPattern *p; - - // this is all heuristics will be overwritten if font had proper info - name = (base14Name == NULL) ? font->getName()->getCString() : base14Name->getCString(); - - modifiers = strchr (name, ','); - if (modifiers == NULL) - modifiers = strchr (name, '-'); - - // remove the - from the names, for some reason, Fontconfig does not - // understand "MS-Mincho" but does with "MS Mincho" - int len = strlen(name); - for (int i = 0; i < len; i++) - name[i] = (name[i] == '-' ? ' ' : name[i]); - - start = NULL; - findModifier(modifiers, "Regular", &start); - findModifier(modifiers, "Roman", &start); - - if (findModifier(modifiers, "Oblique", &start)) - slant = FC_SLANT_OBLIQUE; - if (findModifier(modifiers, "Italic", &start)) - slant = FC_SLANT_ITALIC; - if (findModifier(modifiers, "Bold", &start)) - weight = FC_WEIGHT_BOLD; - if (findModifier(modifiers, "Light", &start)) - weight = FC_WEIGHT_LIGHT; - if (findModifier(modifiers, "Medium", &start)) - weight = FC_WEIGHT_MEDIUM; - if (findModifier(modifiers, "Condensed", &start)) - width = FC_WIDTH_CONDENSED; - - if (start) { - // There have been "modifiers" in the name, crop them to obtain - // the family name - family = new char[len+1]; - strcpy(family, name); - int pos = (modifiers - name); - family[pos] = '\0'; - deleteFamily = true; - } - else { - family = name; - } - - // use font flags - if (font->isFixedWidth()) - spacing = FC_MONO; - if (font->isBold()) - weight = FC_WEIGHT_BOLD; - if (font->isItalic()) - slant = FC_SLANT_ITALIC; - - // if the FontDescriptor specified a family name use it - if (font->getFamily()) { - if (deleteFamily) { - delete[] family; - deleteFamily = false; - } - family = font->getFamily()->getCString(); - } - - // if the FontDescriptor specified a weight use it - switch (font -> getWeight()) - { - case GfxFont::W100: weight = FC_WEIGHT_EXTRALIGHT; break; - case GfxFont::W200: weight = FC_WEIGHT_LIGHT; break; - case GfxFont::W300: weight = FC_WEIGHT_BOOK; break; - case GfxFont::W400: weight = FC_WEIGHT_NORMAL; break; - case GfxFont::W500: weight = FC_WEIGHT_MEDIUM; break; - case GfxFont::W600: weight = FC_WEIGHT_DEMIBOLD; break; - case GfxFont::W700: weight = FC_WEIGHT_BOLD; break; - case GfxFont::W800: weight = FC_WEIGHT_EXTRABOLD; break; - case GfxFont::W900: weight = FC_WEIGHT_BLACK; break; - default: break; - } - - // if the FontDescriptor specified a width use it - switch (font -> getStretch()) - { - case GfxFont::UltraCondensed: width = FC_WIDTH_ULTRACONDENSED; break; - case GfxFont::ExtraCondensed: width = FC_WIDTH_EXTRACONDENSED; break; - case GfxFont::Condensed: width = FC_WIDTH_CONDENSED; break; - case GfxFont::SemiCondensed: width = FC_WIDTH_SEMICONDENSED; break; - case GfxFont::Normal: width = FC_WIDTH_NORMAL; break; - case GfxFont::SemiExpanded: width = FC_WIDTH_SEMIEXPANDED; break; - case GfxFont::Expanded: width = FC_WIDTH_EXPANDED; break; - case GfxFont::ExtraExpanded: width = FC_WIDTH_EXTRAEXPANDED; break; - case GfxFont::UltraExpanded: width = FC_WIDTH_ULTRAEXPANDED; break; - default: break; - } - - const char *lang = getFontLang(font); - - p = FcPatternBuild(NULL, - FC_FAMILY, FcTypeString, family, - FC_LANG, FcTypeString, lang, - NULL); - if (slant != -1) FcPatternAddInteger(p, FC_SLANT, slant); - if (weight != -1) FcPatternAddInteger(p, FC_WEIGHT, weight); - if (width != -1) FcPatternAddInteger(p, FC_WIDTH, width); - if (spacing != -1) FcPatternAddInteger(p, FC_SPACING, spacing); - - if (deleteFamily) - delete[] family; - return p; -} -#endif - -GooString *GlobalParams::findFontFile(GooString *fontName) { - static const char *exts[] = { ".pfa", ".pfb", ".ttf", ".ttc", ".otf" }; - GooString *path, *dir; -#ifdef WIN32 - GooString *fontNameU; -#endif - const char *ext; - FILE *f; - int i, j; - - setupBaseFonts(NULL); - lockGlobalParams; - if ((path = (GooString *)fontFiles->lookup(fontName))) { - path = path->copy(); - unlockGlobalParams; - return path; - } - for (i = 0; i < fontDirs->getLength(); ++i) { - dir = (GooString *)fontDirs->get(i); - for (j = 0; j < (int)(sizeof(exts) / sizeof(exts[0])); ++j) { - ext = exts[j]; -#ifdef WIN32 - fontNameU = fileNameToUTF8(fontName->getCString()); - path = appendToPath(dir->copy(), fontNameU->getCString()); - delete fontNameU; -#else - path = appendToPath(dir->copy(), fontName->getCString()); -#endif - path->append(ext); - if ((f = openFile(path->getCString(), "rb"))) { - fclose(f); - unlockGlobalParams; - return path; - } - delete path; - } - } - unlockGlobalParams; - return NULL; -} - -/* if you can't or don't want to use Fontconfig, you need to implement - this function for your platform. For Windows, it's in GlobalParamsWin.cc -*/ -#if WITH_FONTCONFIGURATION_FONTCONFIG -// not needed for fontconfig -void GlobalParams::setupBaseFonts(char *dir) { -} - -GooString *GlobalParams::findBase14FontFile(GooString *base14Name, GfxFont *font) { - SysFontType type; - int fontNum; - - return findSystemFontFile(font, &type, &fontNum, NULL, base14Name); -} - -GooString *GlobalParams::findSystemFontFile(GfxFont *font, - SysFontType *type, - int *fontNum, GooString *substituteFontName, GooString *base14Name) { - SysFontInfo *fi = NULL; - FcPattern *p=0; - GooString *path = NULL; - GooString *fontName = font->getName(); - GooString substituteName; - if (!fontName) return NULL; - lockGlobalParams; - - if ((fi = sysFonts->find(fontName, font->isFixedWidth(), gTrue))) { - path = fi->path->copy(); - *type = fi->type; - *fontNum = fi->fontNum; - substituteName.Set(fi->substituteName->getCString()); - } else { - FcChar8* s; - char * ext; - FcResult res; - FcFontSet *set; - int i; - FcLangSet *lb = NULL; - p = buildFcPattern(font, base14Name); - - if (!p) - goto fin; - FcConfigSubstitute(NULL, p, FcMatchPattern); - FcDefaultSubstitute(p); - set = FcFontSort(NULL, p, FcFalse, NULL, &res); - if (!set) - goto fin; - - // find the language we want the font to support - const char *lang = getFontLang(font); - if (strcmp(lang,"xx") != 0) { - lb = FcLangSetCreate(); - FcLangSetAdd(lb,(FcChar8 *)lang); - } - - /* - scan twice. - first: fonts support the language - second: all fonts (fall back) - */ - while (fi == NULL) - { - for (i = 0; i < set->nfont; ++i) - { - res = FcPatternGetString(set->fonts[i], FC_FILE, 0, &s); - if (res != FcResultMatch || !s) - continue; - if (lb != NULL) { - FcLangSet *l; - res = FcPatternGetLangSet(set->fonts[i], FC_LANG, 0, &l); - if (res != FcResultMatch || !FcLangSetContains(l,lb)) { - continue; - } - } - FcChar8* s2; - res = FcPatternGetString(set->fonts[i], FC_FULLNAME, 0, &s2); - if (res == FcResultMatch && s2) { - substituteName.Set((char*)s2); - } else { - // fontconfig does not extract fullname for some fonts - // create the fullname from family and style - res = FcPatternGetString(set->fonts[i], FC_FAMILY, 0, &s2); - if (res == FcResultMatch && s2) { - substituteName.Set((char*)s2); - res = FcPatternGetString(set->fonts[i], FC_STYLE, 0, &s2); - if (res == FcResultMatch && s2) { - GooString *style = new GooString((char*)s2); - if (style->cmp("Regular") != 0) { - substituteName.append(" "); - substituteName.append(style); - } - delete style; - } - } - } - ext = strrchr((char*)s,'.'); - if (!ext) - continue; - if (!strncasecmp(ext,".ttf",4) || !strncasecmp(ext, ".ttc", 4) || !strncasecmp(ext, ".otf", 4)) - { - int weight, slant; - GBool bold = font->isBold(); - GBool italic = font->isItalic(); - GBool oblique = gFalse; - FcPatternGetInteger(set->fonts[i], FC_WEIGHT, 0, &weight); - FcPatternGetInteger(set->fonts[i], FC_SLANT, 0, &slant); - if (weight == FC_WEIGHT_DEMIBOLD || weight == FC_WEIGHT_BOLD - || weight == FC_WEIGHT_EXTRABOLD || weight == FC_WEIGHT_BLACK) - { - bold = gTrue; - } - if (slant == FC_SLANT_ITALIC) - italic = gTrue; - if (slant == FC_SLANT_OBLIQUE) - oblique = gTrue; - *fontNum = 0; - *type = (!strncasecmp(ext,".ttc",4)) ? sysFontTTC : sysFontTTF; - FcPatternGetInteger(set->fonts[i], FC_INDEX, 0, fontNum); - fi = new SysFontInfo(fontName->copy(), bold, italic, oblique, font->isFixedWidth(), - new GooString((char*)s), *type, *fontNum, substituteName.copy()); - sysFonts->addFcFont(fi); - path = new GooString((char*)s); - } - else if (!strncasecmp(ext,".pfa",4) || !strncasecmp(ext,".pfb",4)) - { - int weight, slant; - GBool bold = font->isBold(); - GBool italic = font->isItalic(); - GBool oblique = gFalse; - FcPatternGetInteger(set->fonts[i], FC_WEIGHT, 0, &weight); - FcPatternGetInteger(set->fonts[i], FC_SLANT, 0, &slant); - if (weight == FC_WEIGHT_DEMIBOLD || weight == FC_WEIGHT_BOLD - || weight == FC_WEIGHT_EXTRABOLD || weight == FC_WEIGHT_BLACK) - { - bold = gTrue; - } - if (slant == FC_SLANT_ITALIC) - italic = gTrue; - if (slant == FC_SLANT_OBLIQUE) - oblique = gTrue; - *fontNum = 0; - *type = (!strncasecmp(ext,".pfa",4)) ? sysFontPFA : sysFontPFB; - FcPatternGetInteger(set->fonts[i], FC_INDEX, 0, fontNum); - fi = new SysFontInfo(fontName->copy(), bold, italic, oblique, font->isFixedWidth(), - new GooString((char*)s), *type, *fontNum, substituteName.copy()); - sysFonts->addFcFont(fi); - path = new GooString((char*)s); - } - else - continue; - break; - } - if (lb != NULL) { - FcLangSetDestroy(lb); - lb = NULL; - } else { - /* scan all fonts of the list */ - break; - } - } - FcFontSetDestroy(set); - } - if (path == NULL && (fi = sysFonts->find(fontName, font->isFixedWidth(), gFalse))) { - path = fi->path->copy(); - *type = fi->type; - *fontNum = fi->fontNum; - } - if (substituteFontName) { - substituteFontName->Set(substituteName.getCString()); - } -fin: - if (p) - FcPatternDestroy(p); - unlockGlobalParams; - return path; -} - -#elif WITH_FONTCONFIGURATION_WIN32 -#include "GlobalParamsWin.cc" - -GooString *GlobalParams::findBase14FontFile(GooString *base14Name, GfxFont *font) { - return findFontFile(base14Name); -} -#else -GooString *GlobalParams::findBase14FontFile(GooString *base14Name, GfxFont *font) { - return findFontFile(base14Name); -} - -static struct { - const char *name; - const char *t1FileName; - const 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"}, - {"Symbol", "s050000l.pfb", NULL}, - {"Times-Bold", "n021004l.pfb", "timesbd.ttf"}, - {"Times-BoldItalic", "n021024l.pfb", "timesbi.ttf"}, - {"Times-Italic", "n021023l.pfb", "timesi.ttf"}, - {"Times-Roman", "n021003l.pfb", "times.ttf"}, - {"ZapfDingbats", "d050000l.pfb", NULL}, - {NULL} -}; - -static const char *displayFontDirs[] = { - "/usr/share/ghostscript/fonts", - "/usr/local/share/ghostscript/fonts", - "/usr/share/fonts/default/Type1", - "/usr/share/fonts/default/ghostscript", - "/usr/share/fonts/type1/gsfonts", - NULL -}; - -void GlobalParams::setupBaseFonts(char *dir) { - GooString *fontName; - GooString *fileName; - FILE *f; - int i, j; - - for (i = 0; displayFontTab[i].name; ++i) { - if (fontFiles->lookup(displayFontTab[i].name)) { - continue; - } - fontName = new GooString(displayFontTab[i].name); - fileName = NULL; - if (dir) { - fileName = appendToPath(new GooString(dir), displayFontTab[i].t1FileName); - if ((f = fopen(fileName->getCString(), "rb"))) { - fclose(f); - } else { - delete fileName; - fileName = NULL; - } - } - for (j = 0; !fileName && displayFontDirs[j]; ++j) { - fileName = appendToPath(new GooString(displayFontDirs[j]), - displayFontTab[i].t1FileName); - if ((f = fopen(fileName->getCString(), "rb"))) { - fclose(f); - } else { - delete fileName; - fileName = NULL; - } - } - if (!fileName) { - error(errConfig, -1, "No display font for '{0:s}'", - displayFontTab[i].name); - delete fontName; - continue; - } - addFontFile(fontName, fileName); - } - -} - -GooString *GlobalParams::findSystemFontFile(GfxFont *font, - SysFontType *type, - int *fontNum, GooString * /*substituteFontName*/, - GooString * /*base14Name*/) { - SysFontInfo *fi; - GooString *path; - - path = NULL; - lockGlobalParams; - if ((fi = sysFonts->find(font->getName(), font->isFixedWidth(), gFalse))) { - path = fi->path->copy(); - *type = fi->type; - *fontNum = fi->fontNum; - } - unlockGlobalParams; - return path; -} -#endif - -GooString *GlobalParams::findCCFontFile(GooString *collection) { - GooString *path; - - lockGlobalParams; - if ((path = (GooString *)ccFontFiles->lookup(collection))) { - path = path->copy(); - } - unlockGlobalParams; - return path; -} - - -GBool GlobalParams::getPSExpandSmaller() { - GBool f; - - lockGlobalParams; - f = psExpandSmaller; - unlockGlobalParams; - return f; -} - -GBool GlobalParams::getPSShrinkLarger() { - GBool f; - - lockGlobalParams; - f = psShrinkLarger; - unlockGlobalParams; - return f; -} - -GBool GlobalParams::getPSCenter() { - GBool f; - - lockGlobalParams; - f = psCenter; - unlockGlobalParams; - return f; -} - -PSLevel GlobalParams::getPSLevel() { - PSLevel level; - - lockGlobalParams; - level = psLevel; - unlockGlobalParams; - return level; -} - -GooString *GlobalParams::getPSResidentFont(GooString *fontName) { - GooString *psName; - - lockGlobalParams; - psName = (GooString *)psResidentFonts->lookup(fontName); - unlockGlobalParams; - return psName; -} - -GooList *GlobalParams::getPSResidentFonts() { - GooList *names; - GooHashIter *iter; - GooString *name; - GooString *psName; - - names = new GooList(); - lockGlobalParams; - psResidentFonts->startIter(&iter); - while (psResidentFonts->getNext(&iter, &name, (void **)&psName)) { - names->append(psName->copy()); - } - unlockGlobalParams; - return names; -} - -PSFontParam16 *GlobalParams::getPSResidentFont16(GooString *fontName, - int wMode) { - PSFontParam16 *p; - int i; - - lockGlobalParams; - p = NULL; - for (i = 0; i < psResidentFonts16->getLength(); ++i) { - p = (PSFontParam16 *)psResidentFonts16->get(i); - if (!(p->name->cmp(fontName)) && p->wMode == wMode) { - break; - } - p = NULL; - } - unlockGlobalParams; - return p; -} - -PSFontParam16 *GlobalParams::getPSResidentFontCC(GooString *collection, - int wMode) { - PSFontParam16 *p; - int i; - - lockGlobalParams; - p = NULL; - for (i = 0; i < psResidentFontsCC->getLength(); ++i) { - p = (PSFontParam16 *)psResidentFontsCC->get(i); - if (!(p->name->cmp(collection)) && p->wMode == wMode) { - break; - } - p = NULL; - } - unlockGlobalParams; - return p; -} - -GBool GlobalParams::getPSEmbedType1() { - GBool e; - - lockGlobalParams; - e = psEmbedType1; - unlockGlobalParams; - return e; -} - -GBool GlobalParams::getPSEmbedTrueType() { - GBool e; - - lockGlobalParams; - e = psEmbedTrueType; - unlockGlobalParams; - return e; -} - -GBool GlobalParams::getPSEmbedCIDPostScript() { - GBool e; - - lockGlobalParams; - e = psEmbedCIDPostScript; - unlockGlobalParams; - return e; -} - -GBool GlobalParams::getPSEmbedCIDTrueType() { - GBool e; - - lockGlobalParams; - e = psEmbedCIDTrueType; - unlockGlobalParams; - return e; -} - -GBool GlobalParams::getPSFontPassthrough() { - GBool e; - - lockGlobalParams; - e = psFontPassthrough; - unlockGlobalParams; - return e; -} - -GBool GlobalParams::getPSPreload() { - GBool preload; - - lockGlobalParams; - preload = psPreload; - unlockGlobalParams; - return preload; -} - -GBool GlobalParams::getPSOPI() { - GBool opi; - - lockGlobalParams; - opi = psOPI; - unlockGlobalParams; - return opi; -} - -GBool GlobalParams::getPSASCIIHex() { - GBool ah; - - lockGlobalParams; - ah = psASCIIHex; - unlockGlobalParams; - return ah; -} - -GBool GlobalParams::getPSBinary() { - GBool binary; - - lockGlobalParams; - binary = psBinary; - unlockGlobalParams; - return binary; -} - -GBool GlobalParams::getPSUncompressPreloadedImages() { - GBool ah; - - lockGlobalParams; - ah = psUncompressPreloadedImages; - unlockGlobalParams; - return ah; -} - -double GlobalParams::getPSRasterResolution() { - double res; - - lockGlobalParams; - res = psRasterResolution; - unlockGlobalParams; - return res; -} - -GBool GlobalParams::getPSRasterMono() { - GBool mono; - - lockGlobalParams; - mono = psRasterMono; - unlockGlobalParams; - return mono; -} - -GooString *GlobalParams::getTextEncodingName() { - GooString *s; - - lockGlobalParams; - s = textEncoding->copy(); - unlockGlobalParams; - return s; -} - -EndOfLineKind GlobalParams::getTextEOL() { - EndOfLineKind eol; - - lockGlobalParams; - eol = textEOL; - unlockGlobalParams; - return eol; -} - -GBool GlobalParams::getTextPageBreaks() { - GBool pageBreaks; - - lockGlobalParams; - pageBreaks = textPageBreaks; - unlockGlobalParams; - return pageBreaks; -} - -GBool GlobalParams::getTextKeepTinyChars() { - GBool tiny; - - lockGlobalParams; - tiny = textKeepTinyChars; - unlockGlobalParams; - return tiny; -} - -GBool GlobalParams::getEnableFreeType() { - GBool f; - - lockGlobalParams; - f = enableFreeType; - unlockGlobalParams; - return f; -} - -GBool GlobalParams::getAntialias() { - GBool f; - - lockGlobalParams; - f = antialias; - unlockGlobalParams; - return f; -} - -GBool GlobalParams::getVectorAntialias() { - GBool f; - - lockGlobalParams; - f = vectorAntialias; - unlockGlobalParams; - return f; -} - -GBool GlobalParams::getAntialiasPrinting() { - GBool f; - - lockGlobalParams; - f = antialiasPrinting; - unlockGlobalParams; - return f; -} - -GBool GlobalParams::getStrokeAdjust() { - GBool f; - - lockGlobalParams; - f = strokeAdjust; - unlockGlobalParams; - return f; -} - -ScreenType GlobalParams::getScreenType() { - ScreenType t; - - lockGlobalParams; - t = screenType; - unlockGlobalParams; - return t; -} - -int GlobalParams::getScreenSize() { - int size; - - lockGlobalParams; - size = screenSize; - unlockGlobalParams; - return size; -} - -int GlobalParams::getScreenDotRadius() { - int r; - - lockGlobalParams; - r = screenDotRadius; - unlockGlobalParams; - return r; -} - -double GlobalParams::getScreenGamma() { - double gamma; - - lockGlobalParams; - gamma = screenGamma; - unlockGlobalParams; - return gamma; -} - -double GlobalParams::getScreenBlackThreshold() { - double thresh; - - lockGlobalParams; - thresh = screenBlackThreshold; - unlockGlobalParams; - return thresh; -} - -double GlobalParams::getScreenWhiteThreshold() { - double thresh; - - lockGlobalParams; - thresh = screenWhiteThreshold; - unlockGlobalParams; - return thresh; -} - -double GlobalParams::getMinLineWidth() { - double minLineWidthA; - - lockGlobalParams; - minLineWidthA = minLineWidth; - unlockGlobalParams; - return minLineWidthA; -} - -GBool GlobalParams::getMapNumericCharNames() { - GBool map; - - lockGlobalParams; - map = mapNumericCharNames; - unlockGlobalParams; - return map; -} - -GBool GlobalParams::getMapUnknownCharNames() { - GBool map; - - lockGlobalParams; - map = mapUnknownCharNames; - unlockGlobalParams; - return map; -} - -GBool GlobalParams::getPrintCommands() { - GBool p; - - lockGlobalParams; - p = printCommands; - unlockGlobalParams; - return p; -} - -GBool GlobalParams::getProfileCommands() { - GBool p; - - lockGlobalParams; - p = profileCommands; - unlockGlobalParams; - return p; -} - -GBool GlobalParams::getErrQuiet() { - // no locking -- this function may get called from inside a locked - // section - return errQuiet; -} - -CharCodeToUnicode *GlobalParams::getCIDToUnicode(GooString *collection) { - GooString *fileName; - CharCodeToUnicode *ctu; - - lockGlobalParams; - if (!(ctu = cidToUnicodeCache->getCharCodeToUnicode(collection))) { - if ((fileName = (GooString *)cidToUnicodes->lookup(collection)) && - (ctu = CharCodeToUnicode::parseCIDToUnicode(fileName, collection))) { - cidToUnicodeCache->add(ctu); - } - } - unlockGlobalParams; - return ctu; -} - -CharCodeToUnicode *GlobalParams::getUnicodeToUnicode(GooString *fontName) { - lockGlobalParams; - GooHashIter *iter; - unicodeToUnicodes->startIter(&iter); - GooString *fileName = NULL; - GooString *fontPattern; - void *val; - while (!fileName && unicodeToUnicodes->getNext(&iter, &fontPattern, &val)) { - if (strstr(fontName->getCString(), fontPattern->getCString())) { - unicodeToUnicodes->killIter(&iter); - fileName = (GooString*)val; - } - } - CharCodeToUnicode *ctu = NULL; - if (fileName) { - ctu = unicodeToUnicodeCache->getCharCodeToUnicode(fileName); - if (!ctu) { - ctu = CharCodeToUnicode::parseUnicodeToUnicode(fileName); - if (ctu) - unicodeToUnicodeCache->add(ctu); - } - } - unlockGlobalParams; - return ctu; -} - -UnicodeMap *GlobalParams::getUnicodeMap(GooString *encodingName) { - return getUnicodeMap2(encodingName); -} - -UnicodeMap *GlobalParams::getUnicodeMap2(GooString *encodingName) { - UnicodeMap *map; - - if (!(map = getResidentUnicodeMap(encodingName))) { - lockUnicodeMapCache; - map = unicodeMapCache->getUnicodeMap(encodingName); - unlockUnicodeMapCache; - } - return map; -} - -CMap *GlobalParams::getCMap(GooString *collection, GooString *cMapName, Stream *stream) { - CMap *cMap; - - lockCMapCache; - cMap = cMapCache->getCMap(collection, cMapName, stream); - unlockCMapCache; - return cMap; -} - -UnicodeMap *GlobalParams::getTextEncoding() { - return getUnicodeMap2(textEncoding); -} - -GooList *GlobalParams::getEncodingNames() -{ - GooList *result = new GooList; - GooHashIter *iter; - GooString *key; - void *val; - residentUnicodeMaps->startIter(&iter); - while (residentUnicodeMaps->getNext(&iter, &key, &val)) { - result->append(key); - } - residentUnicodeMaps->killIter(&iter); - unicodeMaps->startIter(&iter); - while (unicodeMaps->getNext(&iter, &key, &val)) { - result->append(key); - } - unicodeMaps->killIter(&iter); - return result; -} - -//------------------------------------------------------------------------ -// functions to set parameters -//------------------------------------------------------------------------ - -void GlobalParams::addFontFile(GooString *fontName, GooString *path) { - lockGlobalParams; - fontFiles->add(fontName, path); - unlockGlobalParams; -} - -void GlobalParams::setPSFile(char *file) { - lockGlobalParams; - if (psFile) { - delete psFile; - } - psFile = new GooString(file); - unlockGlobalParams; -} - -void GlobalParams::setPSExpandSmaller(GBool expand) { - lockGlobalParams; - psExpandSmaller = expand; - unlockGlobalParams; -} - -void GlobalParams::setPSShrinkLarger(GBool shrink) { - lockGlobalParams; - psShrinkLarger = shrink; - unlockGlobalParams; -} - -void GlobalParams::setPSCenter(GBool center) { - lockGlobalParams; - psCenter = center; - unlockGlobalParams; -} - -void GlobalParams::setPSLevel(PSLevel level) { - lockGlobalParams; - psLevel = level; - unlockGlobalParams; -} - -void GlobalParams::setPSEmbedType1(GBool embed) { - lockGlobalParams; - psEmbedType1 = embed; - unlockGlobalParams; -} - -void GlobalParams::setPSEmbedTrueType(GBool embed) { - lockGlobalParams; - psEmbedTrueType = embed; - unlockGlobalParams; -} - -void GlobalParams::setPSEmbedCIDPostScript(GBool embed) { - lockGlobalParams; - psEmbedCIDPostScript = embed; - unlockGlobalParams; -} - -void GlobalParams::setPSEmbedCIDTrueType(GBool embed) { - lockGlobalParams; - psEmbedCIDTrueType = embed; - unlockGlobalParams; -} - -void GlobalParams::setPSFontPassthrough(GBool passthrough) { - lockGlobalParams; - psFontPassthrough = passthrough; - unlockGlobalParams; -} - -void GlobalParams::setPSPreload(GBool preload) { - lockGlobalParams; - psPreload = preload; - unlockGlobalParams; -} - -void GlobalParams::setPSOPI(GBool opi) { - lockGlobalParams; - psOPI = opi; - unlockGlobalParams; -} - -void GlobalParams::setPSASCIIHex(GBool hex) { - lockGlobalParams; - psASCIIHex = hex; - unlockGlobalParams; -} - -void GlobalParams::setPSBinary(GBool binary) { - lockGlobalParams; - psBinary = binary; - unlockGlobalParams; -} - -void GlobalParams::setPSUncompressPreloadedImages(GBool uncomp) { - lockGlobalParams; - psUncompressPreloadedImages = uncomp; - unlockGlobalParams; -} - -void GlobalParams::setPSRasterResolution(double res) { - lockGlobalParams; - psRasterResolution = res; - unlockGlobalParams; -} - -void GlobalParams::setPSRasterMono(GBool mono) { - lockGlobalParams; - psRasterMono = mono; - unlockGlobalParams; -} - -void GlobalParams::setTextEncoding(char *encodingName) { - lockGlobalParams; - delete textEncoding; - textEncoding = new GooString(encodingName); - unlockGlobalParams; -} - -GBool GlobalParams::setTextEOL(char *s) { - lockGlobalParams; - if (!strcmp(s, "unix")) { - textEOL = eolUnix; - } else if (!strcmp(s, "dos")) { - textEOL = eolDOS; - } else if (!strcmp(s, "mac")) { - textEOL = eolMac; - } else { - unlockGlobalParams; - return gFalse; - } - unlockGlobalParams; - return gTrue; -} - -void GlobalParams::setTextPageBreaks(GBool pageBreaks) { - lockGlobalParams; - textPageBreaks = pageBreaks; - unlockGlobalParams; -} - -void GlobalParams::setTextKeepTinyChars(GBool keep) { - lockGlobalParams; - textKeepTinyChars = keep; - unlockGlobalParams; -} - -GBool GlobalParams::setEnableFreeType(char *s) { - GBool ok; - - lockGlobalParams; - ok = parseYesNo2(s, &enableFreeType); - unlockGlobalParams; - return ok; -} - -GBool GlobalParams::setDisableFreeTypeHinting(char *s) { - GBool ok; - - lockGlobalParams; - ok = parseYesNo2(s, &disableFreeTypeHinting); - unlockGlobalParams; - return ok; -} - -GBool GlobalParams::setAntialias(char *s) { - GBool ok; - - lockGlobalParams; - ok = parseYesNo2(s, &antialias); - unlockGlobalParams; - return ok; -} - -GBool GlobalParams::setVectorAntialias(char *s) { - GBool ok; - - lockGlobalParams; - ok = parseYesNo2(s, &vectorAntialias); - unlockGlobalParams; - return ok; -} - -void GlobalParams::setAntialiasPrinting(GBool anti) { - lockGlobalParams; - antialiasPrinting = anti; - unlockGlobalParams; -} - -void GlobalParams::setStrokeAdjust(GBool adjust) -{ - lockGlobalParams; - strokeAdjust = adjust; - unlockGlobalParams; -} - -void GlobalParams::setScreenType(ScreenType st) -{ - lockGlobalParams; - screenType = st; - unlockGlobalParams; -} - -void GlobalParams::setScreenSize(int size) -{ - lockGlobalParams; - screenSize = size; - unlockGlobalParams; -} - -void GlobalParams::setScreenDotRadius(int radius) -{ - lockGlobalParams; - screenDotRadius = radius; - unlockGlobalParams; -} - -void GlobalParams::setScreenGamma(double gamma) -{ - lockGlobalParams; - screenGamma = gamma; - unlockGlobalParams; -} - -void GlobalParams::setScreenBlackThreshold(double blackThreshold) -{ - lockGlobalParams; - screenBlackThreshold = blackThreshold; - unlockGlobalParams; -} - -void GlobalParams::setScreenWhiteThreshold(double whiteThreshold) -{ - lockGlobalParams; - screenWhiteThreshold = whiteThreshold; - unlockGlobalParams; -} - -void GlobalParams::setMinLineWidth(double minLineWidthA) -{ - lockGlobalParams; - minLineWidth = minLineWidthA; - unlockGlobalParams; -} - -void GlobalParams::setOverprintPreview(GBool overprintPreviewA) { - lockGlobalParams; - overprintPreview = overprintPreviewA; - unlockGlobalParams; -} - -void GlobalParams::setMapNumericCharNames(GBool map) { - lockGlobalParams; - mapNumericCharNames = map; - unlockGlobalParams; -} - -void GlobalParams::setMapUnknownCharNames(GBool map) { - lockGlobalParams; - mapUnknownCharNames = map; - unlockGlobalParams; -} - -void GlobalParams::setPrintCommands(GBool printCommandsA) { - lockGlobalParams; - printCommands = printCommandsA; - unlockGlobalParams; -} - -void GlobalParams::setProfileCommands(GBool profileCommandsA) { - lockGlobalParams; - profileCommands = profileCommandsA; - unlockGlobalParams; -} - -void GlobalParams::setErrQuiet(GBool errQuietA) { - lockGlobalParams; - errQuiet = errQuietA; - unlockGlobalParams; -} - -void GlobalParams::addSecurityHandler(XpdfSecurityHandler *handler) { -#ifdef ENABLE_PLUGINS - lockGlobalParams; - securityHandlers->append(handler); - unlockGlobalParams; -#endif -} - -XpdfSecurityHandler *GlobalParams::getSecurityHandler(char *name) { -#ifdef ENABLE_PLUGINS - XpdfSecurityHandler *hdlr; - int i; - - lockGlobalParams; - for (i = 0; i < securityHandlers->getLength(); ++i) { - hdlr = (XpdfSecurityHandler *)securityHandlers->get(i); - if (!strcasecmp(hdlr->name, name)) { - unlockGlobalParams; - return hdlr; - } - } - unlockGlobalParams; - - if (!loadPlugin("security", name)) { - return NULL; - } - - lockGlobalParams; - for (i = 0; i < securityHandlers->getLength(); ++i) { - hdlr = (XpdfSecurityHandler *)securityHandlers->get(i); - if (!strcmp(hdlr->name, name)) { - unlockGlobalParams; - return hdlr; - } - } - unlockGlobalParams; -#else - (void)name; -#endif - - return NULL; -} - -#ifdef ENABLE_PLUGINS -//------------------------------------------------------------------------ -// plugins -//------------------------------------------------------------------------ - -GBool GlobalParams::loadPlugin(char *type, char *name) { - Plugin *plugin; - - if (!(plugin = Plugin::load(type, name))) { - return gFalse; - } - lockGlobalParams; - plugins->append(plugin); - unlockGlobalParams; - return gTrue; -} - -#endif // ENABLE_PLUGINS |