File xpdf-poppler-autohinting-as-option.patch of Package xpdf-poppler

Index: GlobalParamsGUI.cc
===================================================================
--- /dev/null
+++ GlobalParamsGUI.cc
@@ -0,0 +1,3242 @@
+//========================================================================
+//
+// GlobalParamsGUI.cc
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#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>
+#endif
+#if HAVE_PAPER_H
+#include <paper.h>
+#endif
+#include <fontconfig/fontconfig.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 "FontEncodingTables.h"
+#include <langinfo.h>
+#include <locale.h>
+#ifdef ENABLE_PLUGINS
+#  include "XpdfPluginAPI.h"
+#endif
+#include "GlobalParamsGUI.h"
+#include "GfxFont.h"
+
+#ifdef WIN32
+#  define strcasecmp stricmp
+#endif
+
+#if MULTITHREADED
+#  define lockGlobalParamsGUI            gLockMutex(&mutex)
+#  define lockUnicodeMapCache         gLockMutex(&unicodeMapCacheMutex)
+#  define lockCMapCache               gLockMutex(&cMapCacheMutex)
+#  define unlockGlobalParamsGUI          gUnlockMutex(&mutex)
+#  define unlockUnicodeMapCache       gUnlockMutex(&unicodeMapCacheMutex)
+#  define unlockCMapCache             gUnlockMutex(&cMapCacheMutex)
+#else
+#  define lockGlobalParamsGUI
+#  define lockUnicodeMapCache
+#  define lockCMapCache
+#  define unlockGlobalParamsGUI
+#  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
+
+//------------------------------------------------------------------------
+
+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"},
+  {"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}
+};
+
+#ifdef WIN32
+static char *displayFontDirs[] = {
+  "c:/windows/fonts",
+  "c:/winnt/fonts",
+  NULL
+};
+#else
+static 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
+};
+#endif
+
+//------------------------------------------------------------------------
+
+GlobalParamsGUI *globalParamsGUI = NULL;
+
+//------------------------------------------------------------------------
+// DisplayFontParam
+//------------------------------------------------------------------------
+
+DisplayFontParam::DisplayFontParam(GooString *nameA,
+				   DisplayFontParamKind kindA) {
+  name = nameA;
+  kind = kindA;
+  switch (kind) {
+  case displayFontT1:
+    t1.fileName = NULL;
+    break;
+  case displayFontTT:
+    tt.fileName = NULL;
+    break;
+  }
+}
+
+DisplayFontParam::~DisplayFontParam() {
+  delete name;
+  switch (kind) {
+  case displayFontT1:
+    if (t1.fileName) {
+      delete t1.fileName;
+    }
+    break;
+  case displayFontTT:
+    if (tt.fileName) {
+      delete tt.fileName;
+    }
+    break;
+  }
+}
+
+#ifdef WIN32
+
+//------------------------------------------------------------------------
+// WinFontInfo
+//------------------------------------------------------------------------
+
+class WinFontInfo: public DisplayFontParam {
+public:
+
+  GBool bold, italic;
+
+  static WinFontInfo *make(GooString *nameA, GBool boldA, GBool italicA,
+			   HKEY regKey, char *winFontDir);
+  WinFontInfo(GooString *nameA, GBool boldA, GBool italicA,
+	      GooString *fileNameA);
+  virtual ~WinFontInfo();
+  GBool equals(WinFontInfo *fi);
+};
+
+WinFontInfo *WinFontInfo::make(GooString *nameA, GBool boldA, GBool italicA,
+			       HKEY regKey, char *winFontDir) {
+  GooString *regName;
+  GooString *fileNameA;
+  char buf[MAX_PATH];
+  DWORD n;
+  char c;
+  int i;
+
+  //----- find the font file
+  fileNameA = NULL;
+  regName = nameA->copy();
+  if (boldA) {
+    regName->append(" Bold");
+  }
+  if (italicA) {
+    regName->append(" Italic");
+  }
+  regName->append(" (TrueType)");
+  n = sizeof(buf);
+  if (RegQueryValueEx(regKey, regName->getCString(), NULL, NULL,
+		      (LPBYTE)buf, &n) == ERROR_SUCCESS) {
+    fileNameA = new GooString(winFontDir);
+    fileNameA->append('\\')->append(buf);
+  }
+  delete regName;
+  if (!fileNameA) {
+    delete nameA;
+    return NULL;
+  }
+
+  //----- normalize the font name
+  i = 0;
+  while (i < nameA->getLength()) {
+    c = nameA->getChar(i);
+    if (c == ' ' || c == ',' || c == '-') {
+      nameA->del(i);
+    } else {
+      ++i;
+    }
+  }
+
+  return new WinFontInfo(nameA, boldA, italicA, fileNameA);
+}
+
+WinFontInfo::WinFontInfo(GooString *nameA, GBool boldA, GBool italicA,
+			 GooString *fileNameA):
+  DisplayFontParam(nameA, displayFontTT)
+{
+  bold = boldA;
+  italic = italicA;
+  tt.fileName = fileNameA;
+}
+
+WinFontInfo::~WinFontInfo() {
+}
+
+GBool WinFontInfo::equals(WinFontInfo *fi) {
+  return !name->cmp(fi->name) && bold == fi->bold && italic == fi->italic;
+}
+
+//------------------------------------------------------------------------
+// WinFontList
+//------------------------------------------------------------------------
+
+class WinFontList {
+public:
+
+  WinFontList(char *winFontDirA);
+  ~WinFontList();
+  WinFontInfo *find(GooString *font);
+
+private:
+
+  void add(WinFontInfo *fi);
+  static int CALLBACK enumFunc1(CONST LOGFONT *font,
+				CONST TEXTMETRIC *metrics,
+				DWORD type, LPARAM data);
+  static int CALLBACK enumFunc2(CONST LOGFONT *font,
+				CONST TEXTMETRIC *metrics,
+				DWORD type, LPARAM data);
+
+  GooList *fonts;			// [WinFontInfo]
+  HDC dc;			// (only used during enumeration)
+  HKEY regKey;			// (only used during enumeration)
+  char *winFontDir;		// (only used during enumeration)
+};
+
+WinFontList::WinFontList(char *winFontDirA) {
+  OSVERSIONINFO version;
+  char *path;
+
+  fonts = new GooList();
+  dc = GetDC(NULL);
+  winFontDir = winFontDirA;
+  version.dwOSVersionInfoSize = sizeof(version);
+  GetVersionEx(&version);
+  if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) {
+    path = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts\\";
+  } else {
+    path = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Fonts\\";
+  }
+  if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0,
+		   KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS,
+		   &regKey) == ERROR_SUCCESS) {
+    EnumFonts(dc, NULL, &WinFontList::enumFunc1, (LPARAM)this);
+    RegCloseKey(regKey);
+  }
+  ReleaseDC(NULL, dc);
+}
+
+WinFontList::~WinFontList() {
+  deleteGooList(fonts, WinFontInfo);
+}
+
+void WinFontList::add(WinFontInfo *fi) {
+  int i;
+
+  for (i = 0; i < fonts->getLength(); ++i) {
+    if (((WinFontInfo *)fonts->get(i))->equals(fi)) {
+      delete fi;
+      return;
+    }
+  }
+  fonts->append(fi);
+}
+
+WinFontInfo *WinFontList::find(GooString *font) {
+  GooString *name;
+  GBool bold, italic;
+  WinFontInfo *fi;
+  char c;
+  int n, i;
+
+  name = font->copy();
+
+  // remove space, comma, dash chars
+  i = 0;
+  while (i < name->getLength()) {
+    c = name->getChar(i);
+    if (c == ' ' || c == ',' || c == '-') {
+      name->del(i);
+    } else {
+      ++i;
+    }
+  }
+  n = name->getLength();
+
+  // remove trailing "MT" (Foo-MT, Foo-BoldMT, etc.)
+  if (!strcmp(name->getCString() + n - 2, "MT")) {
+    name->del(n - 2, 2);
+    n -= 2;
+  }
+
+  // look for "Italic"
+  if (!strcmp(name->getCString() + n - 6, "Italic")) {
+    name->del(n - 6, 6);
+    italic = gTrue;
+    n -= 6;
+  } else {
+    italic = gFalse;
+  }
+
+  // look for "Bold"
+  if (!strcmp(name->getCString() + n - 4, "Bold")) {
+    name->del(n - 4, 4);
+    bold = gTrue;
+    n -= 4;
+  } else {
+    bold = gFalse;
+  }
+
+  // remove trailing "MT" (FooMT-Bold, etc.)
+  if (!strcmp(name->getCString() + n - 2, "MT")) {
+    name->del(n - 2, 2);
+    n -= 2;
+  }
+
+  // remove trailing "PS"
+  if (!strcmp(name->getCString() + n - 2, "PS")) {
+    name->del(n - 2, 2);
+    n -= 2;
+  }
+
+  // search for the font
+  fi = NULL;
+  for (i = 0; i < fonts->getLength(); ++i) {
+    fi = (WinFontInfo *)fonts->get(i);
+    if (!fi->name->cmp(name) && fi->bold == bold && fi->italic == italic) {
+      break;
+    }
+    fi = NULL;
+  }
+
+  delete name;
+  return fi;
+}
+
+int CALLBACK WinFontList::enumFunc1(CONST LOGFONT *font,
+				    CONST TEXTMETRIC *metrics,
+				    DWORD type, LPARAM data) {
+  WinFontList *fl = (WinFontList *)data;
+
+  EnumFonts(fl->dc, font->lfFaceName, &WinFontList::enumFunc2, (LPARAM)fl);
+  return 1;
+}
+
+int CALLBACK WinFontList::enumFunc2(CONST LOGFONT *font,
+				    CONST TEXTMETRIC *metrics,
+				    DWORD type, LPARAM data) {
+  WinFontList *fl = (WinFontList *)data;
+  WinFontInfo *fi;
+
+  if (type & TRUETYPE_FONTTYPE) {
+    if ((fi = WinFontInfo::make(new GooString(font->lfFaceName),
+				font->lfWeight >= 600,
+				font->lfItalic ? gTrue : gFalse,
+				fl->regKey, fl->winFontDir))) {
+      fl->add(fi);
+    }
+  }
+  return 1;
+}
+
+#endif // WIN32
+
+//------------------------------------------------------------------------
+// PSFontParam
+//------------------------------------------------------------------------
+
+PSFontParam::PSFontParam(GooString *pdfFontNameA, int wModeA,
+			 GooString *psFontNameA, GooString *encodingA) {
+  pdfFontName = pdfFontNameA;
+  wMode = wModeA;
+  psFontName = psFontNameA;
+  encoding = encodingA;
+}
+
+PSFontParam::~PSFontParam() {
+  delete pdfFontName;
+  delete psFontName;
+  if (encoding) {
+    delete encoding;
+  }
+}
+
+//------------------------------------------------------------------------
+// KeyBinding
+//------------------------------------------------------------------------
+
+KeyBinding::KeyBinding(int codeA, int modsA, int contextA, char *cmd0) {
+  code = codeA;
+  mods = modsA;
+  context = contextA;
+  cmds = new GooList();
+  cmds->append(new GooString(cmd0));
+}
+
+KeyBinding::KeyBinding(int codeA, int modsA, int contextA,
+		       char *cmd0, char *cmd1) {
+  code = codeA;
+  mods = modsA;
+  context = contextA;
+  cmds = new GooList();
+  cmds->append(new GooString(cmd0));
+  cmds->append(new GooString(cmd1));
+}
+
+KeyBinding::KeyBinding(int codeA, int modsA, int contextA, GooList *cmdsA) {
+  code = codeA;
+  mods = modsA;
+  context = contextA;
+  cmds = cmdsA;
+}
+
+KeyBinding::~KeyBinding() {
+  deleteGooList(cmds, GooString);
+}
+
+#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 = globalParamsGUI->getBaseDir();
+  appendToPath(path, "plugins");
+  appendToPath(path, type);
+  appendToPath(path, name);
+
+#ifdef WIN32
+  path->append(".dll");
+  if (!(libA = LoadLibrary(path->getCString()))) {
+    error(-1, "Failed to load plugin '%s'",
+	  path->getCString());
+    goto err1;
+  }
+  if (!(vt = (XpdfPluginVecTable *)
+	         GetProcAddress(libA, "xpdfPluginVecTable"))) {
+    error(-1, "Failed to find xpdfPluginVecTable in plugin '%s'",
+	  path->getCString());
+    goto err2;
+  }
+#else
+  //~ need to deal with other extensions here
+  path->append(".so");
+  if (!(dlA = dlopen(path->getCString(), RTLD_NOW))) {
+    error(-1, "Failed to load plugin '%s': %s",
+	  path->getCString(), dlerror());
+    goto err1;
+  }
+  if (!(vt = (XpdfPluginVecTable *)dlsym(dlA, "xpdfPluginVecTable"))) {
+    error(-1, "Failed to find xpdfPluginVecTable in plugin '%s'",
+	  path->getCString());
+    goto err2;
+  }
+#endif
+
+  if (vt->version != xpdfPluginVecTable.version) {
+    error(-1, "Plugin '%s' is wrong version", path->getCString());
+    goto err2;
+  }
+  memcpy(vt, &xpdfPluginVecTable, sizeof(xpdfPluginVecTable));
+
+#ifdef WIN32
+  if (!(xpdfInitPlugin = (XpdfBool (*)(void))
+	                     GetProcAddress(libA, "xpdfInitPlugin"))) {
+    error(-1, "Failed to find xpdfInitPlugin in plugin '%s'",
+	  path->getCString());
+    goto err2;
+  }
+#else
+  if (!(xpdfInitPlugin = (XpdfBool (*)(void))dlsym(dlA, "xpdfInitPlugin"))) {
+    error(-1, "Failed to find xpdfInitPlugin in plugin '%s'",
+	  path->getCString());
+    goto err2;
+  }
+#endif
+
+  if (!(*xpdfInitPlugin)()) {
+    error(-1, "Initialization of plugin '%s' failed",
+	  path->getCString());
+    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
+//------------------------------------------------------------------------
+
+GlobalParamsGUI::GlobalParamsGUI(char *cfgFileName) {
+  UnicodeMap *map;
+  GooString *fileName;
+  FILE *f;
+  int i;
+  
+  FcInit();
+  FCcfg = FcConfigGetCurrent();
+
+#if MULTITHREADED
+  gInitMutex(&mutex);
+  gInitMutex(&unicodeMapCacheMutex);
+  gInitMutex(&cMapCacheMutex);
+#endif
+
+  // 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();
+#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();
+  displayFonts = new GooHash();
+  displayCIDFonts = new GooHash();
+  displayNamedCIDFonts = new GooHash();
+#if HAVE_PAPER_H
+  char *paperName;
+  const struct paper *paperType;
+  paperinit();
+  if ((paperName = systempapername())) {
+    paperType = paperinfo(paperName);
+    psPaperWidth = (int)paperpswidth(paperType);
+    psPaperHeight = (int)paperpsheight(paperType);
+  } else {
+    error(-1, "No paper information available - using defaults");
+    psPaperWidth = defPaperWidth;
+    psPaperHeight = defPaperHeight;
+  }
+  paperdone();
+#else
+  psPaperWidth = defPaperWidth;
+  psPaperHeight = defPaperHeight;
+#endif
+  psImageableLLX = psImageableLLY = 0;
+  psImageableURX = psPaperWidth;
+  psImageableURY = psPaperHeight;
+  psCrop = gTrue;
+  psExpandSmaller = gFalse;
+  psShrinkLarger = gTrue;
+  psCenter = gTrue;
+  psDuplex = gFalse;
+  psLevel = psLevel2;
+  psFile = NULL;
+  psFonts = new GooHash();
+  psNamedFonts16 = new GooList();
+  psFonts16 = new GooList();
+  psEmbedType1 = gTrue;
+  psEmbedTrueType = gTrue;
+  psEmbedCIDPostScript = gTrue;
+  psEmbedCIDTrueType = gTrue;
+  psPreload = gFalse;
+  psOPI = gFalse;
+  psASCIIHex = gFalse;
+  setlocale(LC_ALL,"");
+  setlocale(LC_NUMERIC,"POSIX");
+  if (strcmp("UTF-8",nl_langinfo(CODESET)))
+         textEncoding = new GooString("Latin1");
+  else
+         textEncoding = new GooString("UTF-8");
+#if defined(WIN32)
+  textEOL = eolDOS;
+#elif defined(MACOS)
+  textEOL = eolMac;
+#else
+  textEOL = eolUnix;
+#endif
+  textPageBreaks = gTrue;
+  textKeepTinyChars = gFalse;
+  fontDirs = new GooList();
+  initialZoom = new GooString("125");
+  continuousView = gFalse;
+  enableT1lib = gTrue;
+  enableFreeType = gTrue;
+  enableFreeTypeHinting = gFalse;
+  antialias = gTrue;
+  vectorAntialias = gTrue;
+  strokeAdjust = gTrue;
+  screenType = screenUnset;
+  screenSize = -1;
+  screenDotRadius = -1;
+  screenGamma = 1.0;
+  screenBlackThreshold = 0.0;
+  screenWhiteThreshold = 1.0;
+  urlCommand = NULL;
+  movieCommand = NULL;
+  mapNumericCharNames = gTrue;
+  mapUnknownCharNames = gFalse;
+  createDefaultKeyBindings();
+  printCommands = gFalse;
+  profileCommands = gFalse;
+  errQuiet = gFalse;
+
+  cidToUnicodeCache = new CharCodeToUnicodeCache(cidToUnicodeCacheSize);
+  unicodeToUnicodeCache =
+      new CharCodeToUnicodeCache(unicodeToUnicodeCacheSize);
+  unicodeMapCache = new UnicodeMapCache();
+  cMapCache = new CMapCache();
+
+#ifdef WIN32
+  winFontList = NULL;
+#endif
+
+#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);
+
+  // look for a user config file, then a system-wide config file
+  f = NULL;
+  fileName = NULL;
+  if (cfgFileName && cfgFileName[0]) {
+    fileName = new GooString(cfgFileName);
+    if (!(f = fopen(fileName->getCString(), "r"))) {
+      delete fileName;
+    }
+  }
+  if (!f) {
+    fileName = appendToPath(getHomeDir(), xpdfUserConfigFile);
+    if (!(f = fopen(fileName->getCString(), "r"))) {
+      delete fileName;
+    }
+  }
+  if (!f) {
+#if defined(WIN32) && !defined(__CYGWIN32__)
+    char buf[512];
+    i = GetModuleFileName(NULL, buf, sizeof(buf));
+    if (i <= 0 || i >= sizeof(buf)) {
+      // error or path too long for buffer - just use the current dir
+      buf[0] = '\0';
+    }
+    fileName = grabPath(buf);
+    appendToPath(fileName, xpdfSysConfigFile);
+#else
+    fileName = new GooString(xpdfSysConfigFile);
+#endif
+    if (!(f = fopen(fileName->getCString(), "r"))) {
+      delete fileName;
+    }
+  }
+  if (f) {
+    parseFile(fileName, f);
+    delete fileName;
+    fclose(f);
+  }
+}
+
+void GlobalParamsGUI::createDefaultKeyBindings() {
+  keyBindings = new GooList();
+
+  //----- mouse buttons
+  keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress1, xpdfKeyModNone,
+				     xpdfKeyContextAny, "startSelection"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodeMouseRelease1, xpdfKeyModNone,
+				     xpdfKeyContextAny, "endSelection",
+				     "followLinkNoSel"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress2, xpdfKeyModNone,
+				     xpdfKeyContextAny, "startPan"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodeMouseRelease2, xpdfKeyModNone,
+				     xpdfKeyContextAny, "endPan"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress3, xpdfKeyModNone,
+				     xpdfKeyContextAny, "postPopupMenu"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress4, xpdfKeyModNone,
+				     xpdfKeyContextAny,
+				     "scrollUpPrevPage(16)"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress5, xpdfKeyModNone,
+				     xpdfKeyContextAny,
+				     "scrollDownNextPage(16)"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress6, xpdfKeyModNone,
+				     xpdfKeyContextAny, "scrollLeft(16)"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodeMousePress7, xpdfKeyModNone,
+				     xpdfKeyContextAny, "scrollRight(16)"));
+
+  //----- keys
+  keyBindings->append(new KeyBinding(xpdfKeyCodeHome, xpdfKeyModCtrl,
+				     xpdfKeyContextAny, "gotoPage(1)"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodeHome, xpdfKeyModNone,
+				     xpdfKeyContextAny, "scrollToTopLeft"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodeEnd, xpdfKeyModCtrl,
+				     xpdfKeyContextAny, "gotoLastPage"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodeEnd, xpdfKeyModNone,
+				     xpdfKeyContextAny,
+				     "scrollToBottomRight"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodePgUp, xpdfKeyModNone,
+				     xpdfKeyContextAny, "pageUp"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodeBackspace, xpdfKeyModNone,
+				     xpdfKeyContextAny, "pageUp"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodeDelete, xpdfKeyModNone,
+				     xpdfKeyContextAny, "pageUp"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodePgDn, xpdfKeyModNone,
+				     xpdfKeyContextAny, "pageDown"));
+  keyBindings->append(new KeyBinding(' ', xpdfKeyModNone,
+				     xpdfKeyContextAny, "pageDown"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodeLeft, xpdfKeyModNone,
+				     xpdfKeyContextAny, "scrollLeft(16)"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodeRight, xpdfKeyModNone,
+				     xpdfKeyContextAny, "scrollRight(16)"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodeUp, xpdfKeyModNone,
+				     xpdfKeyContextAny, "scrollUp(16)"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodeDown, xpdfKeyModNone,
+				     xpdfKeyContextAny, "scrollDown(16)"));
+  keyBindings->append(new KeyBinding('o', xpdfKeyModNone,
+				     xpdfKeyContextAny, "open"));
+  keyBindings->append(new KeyBinding('O', xpdfKeyModNone,
+				     xpdfKeyContextAny, "open"));
+  keyBindings->append(new KeyBinding('r', xpdfKeyModNone,
+				     xpdfKeyContextAny, "reload"));
+  keyBindings->append(new KeyBinding('R', xpdfKeyModNone,
+				     xpdfKeyContextAny, "reload"));
+  keyBindings->append(new KeyBinding('f', xpdfKeyModNone,
+				     xpdfKeyContextAny, "find"));
+  keyBindings->append(new KeyBinding('F', xpdfKeyModNone,
+				     xpdfKeyContextAny, "find"));
+  keyBindings->append(new KeyBinding('f', xpdfKeyModCtrl,
+				     xpdfKeyContextAny, "find"));
+  keyBindings->append(new KeyBinding('g', xpdfKeyModCtrl,
+				     xpdfKeyContextAny, "findNext"));
+  keyBindings->append(new KeyBinding('p', xpdfKeyModCtrl,
+				     xpdfKeyContextAny, "print"));
+  keyBindings->append(new KeyBinding('n', xpdfKeyModNone,
+				     xpdfKeyContextScrLockOff, "nextPage"));
+  keyBindings->append(new KeyBinding('N', xpdfKeyModNone,
+				     xpdfKeyContextScrLockOff, "nextPage"));
+  keyBindings->append(new KeyBinding('n', xpdfKeyModNone,
+				     xpdfKeyContextScrLockOn,
+				     "nextPageNoScroll"));
+  keyBindings->append(new KeyBinding('N', xpdfKeyModNone,
+				     xpdfKeyContextScrLockOn,
+				     "nextPageNoScroll"));
+  keyBindings->append(new KeyBinding('p', xpdfKeyModNone,
+				     xpdfKeyContextScrLockOff, "prevPage"));
+  keyBindings->append(new KeyBinding('P', xpdfKeyModNone,
+				     xpdfKeyContextScrLockOff, "prevPage"));
+  keyBindings->append(new KeyBinding('p', xpdfKeyModNone,
+				     xpdfKeyContextScrLockOn,
+				     "prevPageNoScroll"));
+  keyBindings->append(new KeyBinding('P', xpdfKeyModNone,
+				     xpdfKeyContextScrLockOn,
+				     "prevPageNoScroll"));
+  keyBindings->append(new KeyBinding('v', xpdfKeyModNone,
+				     xpdfKeyContextAny, "goForward"));
+  keyBindings->append(new KeyBinding('b', xpdfKeyModNone,
+				     xpdfKeyContextAny, "goBackward"));
+  keyBindings->append(new KeyBinding('g', xpdfKeyModNone,
+				     xpdfKeyContextAny, "focusToPageNum"));
+  keyBindings->append(new KeyBinding('0', xpdfKeyModNone,
+				     xpdfKeyContextAny, "zoomPercent(125)"));
+  keyBindings->append(new KeyBinding('+', xpdfKeyModNone,
+				     xpdfKeyContextAny, "zoomIn"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodeAdd, xpdfKeyModNone,
+				     xpdfKeyContextAny, "zoomIn"));
+  keyBindings->append(new KeyBinding('-', xpdfKeyModNone,
+				     xpdfKeyContextAny, "zoomOut"));
+  keyBindings->append(new KeyBinding(xpdfKeyCodeSubtract, xpdfKeyModNone,
+				     xpdfKeyContextAny, "zoomOut"));
+  keyBindings->append(new KeyBinding('z', xpdfKeyModNone,
+				     xpdfKeyContextAny, "zoomFitPage"));
+  keyBindings->append(new KeyBinding('w', xpdfKeyModNone,
+				     xpdfKeyContextAny, "zoomFitWidth"));
+  keyBindings->append(new KeyBinding('f', xpdfKeyModAlt,
+				     xpdfKeyContextAny,
+				     "toggleFullScreenMode"));
+  keyBindings->append(new KeyBinding('l', xpdfKeyModCtrl,
+				     xpdfKeyContextAny, "redraw"));
+  keyBindings->append(new KeyBinding('w', xpdfKeyModCtrl,
+				     xpdfKeyContextAny, "closeWindow"));
+  keyBindings->append(new KeyBinding('?', xpdfKeyModNone,
+				     xpdfKeyContextAny, "about"));
+  keyBindings->append(new KeyBinding('q', xpdfKeyModNone,
+				     xpdfKeyContextAny, "quit"));
+  keyBindings->append(new KeyBinding('Q', xpdfKeyModNone,
+				     xpdfKeyContextAny, "quit"));
+}
+
+void GlobalParamsGUI::parseFile(GooString *fileName, FILE *f) {
+  int line;
+  char buf[512];
+
+  line = 1;
+  while (getLine(buf, sizeof(buf) - 1, f)) {
+    parseLine(buf, fileName, line);
+    ++line;
+  }
+}
+
+void GlobalParamsGUI::parseLine(char *buf, GooString *fileName, int line) {
+  GooList *tokens;
+  GooString *cmd, *incFile;
+  char *p1, *p2;
+  FILE *f2;
+
+  // break the line into tokens
+  tokens = new GooList();
+  p1 = buf;
+  while (*p1) {
+    for (; *p1 && isspace(*p1); ++p1) ;
+    if (!*p1) {
+      break;
+    }
+    if (*p1 == '"' || *p1 == '\'') {
+      for (p2 = p1 + 1; *p2 && *p2 != *p1; ++p2) ;
+      ++p1;
+    } else {
+      for (p2 = p1 + 1; *p2 && !isspace(*p2); ++p2) ;
+    }
+    tokens->append(new GooString(p1, p2 - p1));
+    p1 = *p2 ? p2 + 1 : p2;
+  }
+
+  // parse the line
+  if (tokens->getLength() > 0 &&
+      ((GooString *)tokens->get(0))->getChar(0) != '#') {
+    cmd = (GooString *)tokens->get(0);
+    if (!cmd->cmp("include")) {
+      if (tokens->getLength() == 2) {
+	incFile = (GooString *)tokens->get(1);
+	if ((f2 = fopen(incFile->getCString(), "r"))) {
+	  parseFile(incFile, f2);
+	  fclose(f2);
+	} else {
+	  error(-1, "Couldn't find included config file: '%s' (%s:%d)",
+		incFile->getCString(), fileName->getCString(), line);
+	}
+      } else {
+	error(-1, "Bad 'include' config file command (%s:%d)",
+	      fileName->getCString(), line);
+      }
+    } else if (!cmd->cmp("nameToUnicode")) {
+      parseNameToUnicode(tokens, fileName, line);
+    } else if (!cmd->cmp("cidToUnicode")) {
+      parseCIDToUnicode(tokens, fileName, line);
+    } else if (!cmd->cmp("unicodeToUnicode")) {
+      parseUnicodeToUnicode(tokens, fileName, line);
+    } else if (!cmd->cmp("unicodeMap")) {
+      parseUnicodeMap(tokens, fileName, line);
+    } else if (!cmd->cmp("cMapDir")) {
+      parseCMapDir(tokens, fileName, line);
+    } else if (!cmd->cmp("toUnicodeDir")) {
+      parseToUnicodeDir(tokens, fileName, line);
+    } else if (!cmd->cmp("displayFontT1")) {
+      parseDisplayFont(tokens, displayFonts, displayFontT1, fileName, line);
+    } else if (!cmd->cmp("displayFontTT")) {
+      parseDisplayFont(tokens, displayFonts, displayFontTT, fileName, line);
+    } else if (!cmd->cmp("displayNamedCIDFontT1")) {
+      parseDisplayFont(tokens, displayNamedCIDFonts,
+		       displayFontT1, fileName, line);
+    } else if (!cmd->cmp("displayCIDFontT1")) {
+      parseDisplayFont(tokens, displayCIDFonts,
+		       displayFontT1, fileName, line);
+    } else if (!cmd->cmp("displayNamedCIDFontTT")) {
+      parseDisplayFont(tokens, displayNamedCIDFonts,
+		       displayFontTT, fileName, line);
+    } else if (!cmd->cmp("displayCIDFontTT")) {
+      parseDisplayFont(tokens, displayCIDFonts,
+		       displayFontTT, fileName, line);
+    } else if (!cmd->cmp("psFile")) {
+      parsePSFile(tokens, fileName, line);
+    } else if (!cmd->cmp("psFont")) {
+      parsePSFont(tokens, fileName, line);
+    } else if (!cmd->cmp("psNamedFont16")) {
+      parsePSFont16("psNamedFont16", psNamedFonts16,
+		    tokens, fileName, line);
+    } else if (!cmd->cmp("psFont16")) {
+      parsePSFont16("psFont16", psFonts16, tokens, fileName, line);
+    } else if (!cmd->cmp("psPaperSize")) {
+      parsePSPaperSize(tokens, fileName, line);
+    } else if (!cmd->cmp("psImageableArea")) {
+      parsePSImageableArea(tokens, fileName, line);
+    } else if (!cmd->cmp("psCrop")) {
+      parseYesNo("psCrop", &psCrop, tokens, fileName, line);
+    } else if (!cmd->cmp("psExpandSmaller")) {
+      parseYesNo("psExpandSmaller", &psExpandSmaller,
+		 tokens, fileName, line);
+    } else if (!cmd->cmp("psShrinkLarger")) {
+      parseYesNo("psShrinkLarger", &psShrinkLarger, tokens, fileName, line);
+    } else if (!cmd->cmp("psCenter")) {
+      parseYesNo("psCenter", &psCenter, tokens, fileName, line);
+    } else if (!cmd->cmp("psDuplex")) {
+      parseYesNo("psDuplex", &psDuplex, tokens, fileName, line);
+    } else if (!cmd->cmp("psLevel")) {
+      parsePSLevel(tokens, fileName, line);
+    } else if (!cmd->cmp("psEmbedType1Fonts")) {
+      parseYesNo("psEmbedType1", &psEmbedType1, tokens, fileName, line);
+    } else if (!cmd->cmp("psEmbedTrueTypeFonts")) {
+      parseYesNo("psEmbedTrueType", &psEmbedTrueType,
+		 tokens, fileName, line);
+    } else if (!cmd->cmp("psEmbedCIDPostScriptFonts")) {
+      parseYesNo("psEmbedCIDPostScript", &psEmbedCIDPostScript,
+		 tokens, fileName, line);
+    } else if (!cmd->cmp("psEmbedCIDTrueTypeFonts")) {
+      parseYesNo("psEmbedCIDTrueType", &psEmbedCIDTrueType,
+		 tokens, fileName, line);
+    } else if (!cmd->cmp("psPreload")) {
+      parseYesNo("psPreload", &psPreload, tokens, fileName, line);
+    } else if (!cmd->cmp("psOPI")) {
+      parseYesNo("psOPI", &psOPI, tokens, fileName, line);
+    } else if (!cmd->cmp("psASCIIHex")) {
+      parseYesNo("psASCIIHex", &psASCIIHex, tokens, fileName, line);
+    } else if (!cmd->cmp("textEncoding")) {
+      parseTextEncoding(tokens, fileName, line);
+    } else if (!cmd->cmp("textEOL")) {
+      parseTextEOL(tokens, fileName, line);
+    } else if (!cmd->cmp("textPageBreaks")) {
+      parseYesNo("textPageBreaks", &textPageBreaks,
+		 tokens, fileName, line);
+    } else if (!cmd->cmp("textKeepTinyChars")) {
+      parseYesNo("textKeepTinyChars", &textKeepTinyChars,
+		 tokens, fileName, line);
+    } else if (!cmd->cmp("fontDir")) {
+      parseFontDir(tokens, fileName, line);
+    } else if (!cmd->cmp("initialZoom")) {
+      parseInitialZoom(tokens, fileName, line);
+    } else if (!cmd->cmp("continuousView")) {
+      parseYesNo("continuousView", &continuousView, tokens, fileName, line);
+    } else if (!cmd->cmp("enableT1lib")) {
+      parseYesNo("enableT1lib", &enableT1lib, tokens, fileName, line);
+    } else if (!cmd->cmp("enableFreeType")) {
+      parseYesNo("enableFreeType", &enableFreeType, tokens, fileName, line);
+    } else if (!cmd->cmp("antialias")) {
+      parseYesNo("antialias", &antialias, tokens, fileName, line);
+    } else if (!cmd->cmp("vectorAntialias")) {
+      parseYesNo("vectorAntialias", &vectorAntialias,
+		 tokens, fileName, line);
+    } else if (!cmd->cmp("strokeAdjust")) {
+      parseYesNo("strokeAdjust", &strokeAdjust, tokens, fileName, line);
+    } else if (!cmd->cmp("screenType")) {
+      parseScreenType(tokens, fileName, line);
+    } else if (!cmd->cmp("screenSize")) {
+      parseInteger("screenSize", &screenSize, tokens, fileName, line);
+    } else if (!cmd->cmp("screenDotRadius")) {
+      parseInteger("screenDotRadius", &screenDotRadius,
+		   tokens, fileName, line);
+    } else if (!cmd->cmp("screenGamma")) {
+      parseFloat("screenGamma", &screenGamma,
+		 tokens, fileName, line);
+    } else if (!cmd->cmp("screenBlackThreshold")) {
+      parseFloat("screenBlackThreshold", &screenBlackThreshold,
+		 tokens, fileName, line);
+    } else if (!cmd->cmp("screenWhiteThreshold")) {
+      parseFloat("screenWhiteThreshold", &screenWhiteThreshold,
+		 tokens, fileName, line);
+    } else if (!cmd->cmp("urlCommand")) {
+      parseCommand("urlCommand", &urlCommand, tokens, fileName, line);
+    } else if (!cmd->cmp("movieCommand")) {
+      parseCommand("movieCommand", &movieCommand, tokens, fileName, line);
+    } else if (!cmd->cmp("mapNumericCharNames")) {
+      parseYesNo("mapNumericCharNames", &mapNumericCharNames,
+		 tokens, fileName, line);
+    } else if (!cmd->cmp("mapUnknownCharNames")) {
+      parseYesNo("mapUnknownCharNames", &mapUnknownCharNames,
+		 tokens, fileName, line);
+    } else if (!cmd->cmp("bind")) {
+      parseBind(tokens, fileName, line);
+    } else if (!cmd->cmp("unbind")) {
+      parseUnbind(tokens, fileName, line);
+    } else if (!cmd->cmp("printCommands")) {
+      parseYesNo("printCommands", &printCommands, tokens, fileName, line);
+    } else if (!cmd->cmp("errQuiet")) {
+      parseYesNo("errQuiet", &errQuiet, tokens, fileName, line);
+    } else {
+      error(-1, "Unknown config file command '%s' (%s:%d)",
+	    cmd->getCString(), fileName->getCString(), line);
+      if (!cmd->cmp("displayFontX") ||
+	  !cmd->cmp("displayNamedCIDFontX") ||
+	  !cmd->cmp("displayCIDFontX")) {
+	error(-1, "-- Xpdf no longer supports X fonts");
+      } else if (!cmd->cmp("t1libControl") || !cmd->cmp("freetypeControl")) {
+	error(-1, "-- The t1libControl and freetypeControl options have been replaced");
+	error(-1, "   by the enableT1lib, enableFreeType, and antialias options");
+      } else if (!cmd->cmp("fontpath") || !cmd->cmp("fontmap")) {
+	error(-1, "-- the config file format has changed since Xpdf 0.9x");
+      }
+    }
+  }
+
+  deleteGooList(tokens, GooString);
+}
+
+void GlobalParamsGUI::parseNameToUnicode(GooList *tokens, GooString *fileName,
+					 int line) {
+  GooString *name;
+  char *tok1, *tok2;
+  FILE *f;
+  char buf[256];
+  int line2;
+  Unicode u;
+
+  if (tokens->getLength() != 2) {
+    error(-1, "Bad 'nameToUnicode' config file command (%s:%d)",
+	  fileName->getCString(), line);
+    return;
+  }
+  name = (GooString *)tokens->get(1);
+  if (!(f = fopen(name->getCString(), "r"))) {
+    error(-1, "Couldn't open 'nameToUnicode' file '%s'",
+	  name->getCString());
+    return;
+  }
+  line2 = 1;
+  while (getLine(buf, sizeof(buf), f)) {
+    tok1 = strtok(buf, " \t\r\n");
+    tok2 = strtok(NULL, " \t\r\n");
+    if (tok1 && tok2) {
+      sscanf(tok1, "%x", &u);
+      nameToUnicode->add(tok2, u);
+    } else {
+      error(-1, "Bad line in 'nameToUnicode' file (%s:%d)",
+	    name->getCString(), line2);
+    }
+    ++line2;
+  }
+  fclose(f);
+}
+
+void GlobalParamsGUI::parseNameToUnicode(GooString *name) {
+  char *tok1, *tok2;
+  FILE *f;
+  char buf[256];
+  int line;
+  Unicode u;
+
+  if (!(f = fopen(name->getCString(), "r"))) {
+    error(-1, "Couldn't open 'nameToUnicode' file '%s'",
+	  name->getCString());
+    return;
+  }
+  line = 1;
+  while (getLine(buf, sizeof(buf), f)) {
+    tok1 = strtok(buf, " \t\r\n");
+    tok2 = strtok(NULL, " \t\r\n");
+    if (tok1 && tok2) {
+      sscanf(tok1, "%x", &u);
+      nameToUnicode->add(tok2, u);
+    } else {
+      error(-1, "Bad line in 'nameToUnicode' file (%s:%d)",
+	    name->getCString(), line);
+    }
+    ++line;
+  }
+  fclose(f);
+}
+
+void GlobalParamsGUI::parseCIDToUnicode(GooList *tokens, GooString *fileName,
+				     int line) {
+  GooString *collection, *name, *old;
+
+  if (tokens->getLength() != 3) {
+    error(-1, "Bad 'cidToUnicode' config file command (%s:%d)",
+	  fileName->getCString(), line);
+    return;
+  }
+  collection = (GooString *)tokens->get(1);
+  name = (GooString *)tokens->get(2);
+  if ((old = (GooString *)cidToUnicodes->remove(collection))) {
+    delete old;
+  }
+  cidToUnicodes->add(collection->copy(), name->copy());
+}
+
+void GlobalParamsGUI::parseUnicodeToUnicode(GooList *tokens, GooString *fileName,
+					 int line) {
+  GooString *font, *file, *old;
+
+  if (tokens->getLength() != 3) {
+    error(-1, "Bad 'unicodeToUnicode' config file command (%s:%d)",
+	  fileName->getCString(), line);
+    return;
+  }
+  font = (GooString *)tokens->get(1);
+  file = (GooString *)tokens->get(2);
+  if ((old = (GooString *)unicodeToUnicodes->remove(font))) {
+    delete old;
+  }
+  unicodeToUnicodes->add(font->copy(), file->copy());
+}
+
+void GlobalParamsGUI::parseUnicodeMap(GooList *tokens, GooString *fileName,
+				   int line) {
+  GooString *encodingName, *name, *old;
+
+  if (tokens->getLength() != 3) {
+    error(-1, "Bad 'unicodeMap' config file command (%s:%d)",
+	  fileName->getCString(), line);
+    return;
+  }
+  encodingName = (GooString *)tokens->get(1);
+  name = (GooString *)tokens->get(2);
+  if ((old = (GooString *)unicodeMaps->remove(encodingName))) {
+    delete old;
+  }
+  unicodeMaps->add(encodingName->copy(), name->copy());
+}
+
+void GlobalParamsGUI::parseCMapDir(GooList *tokens, GooString *fileName, int line) {
+  GooString *collection, *dir;
+  GooList *list;
+
+  if (tokens->getLength() != 3) {
+    error(-1, "Bad 'cMapDir' config file command (%s:%d)",
+	  fileName->getCString(), line);
+    return;
+  }
+  collection = (GooString *)tokens->get(1);
+  dir = (GooString *)tokens->get(2);
+  if (!(list = (GooList *)cMapDirs->lookup(collection))) {
+    list = new GooList();
+    cMapDirs->add(collection->copy(), list);
+  }
+  list->append(dir->copy());
+}
+
+void GlobalParamsGUI::parseToUnicodeDir(GooList *tokens, GooString *fileName,
+				     int line) {
+  if (tokens->getLength() != 2) {
+    error(-1, "Bad 'toUnicodeDir' config file command (%s:%d)",
+	  fileName->getCString(), line);
+    return;
+  }
+  toUnicodeDirs->append(((GooString *)tokens->get(1))->copy());
+}
+
+void GlobalParamsGUI::parseDisplayFont(GooList *tokens, GooHash *fontHash,
+				    DisplayFontParamKind kind,
+				    GooString *fileName, int line) {
+  DisplayFontParam *param, *old;
+
+  if (tokens->getLength() < 2) {
+    goto err1;
+  }
+  param = new DisplayFontParam(((GooString *)tokens->get(1))->copy(), kind);
+  
+  switch (kind) {
+  case displayFontT1:
+    if (tokens->getLength() != 3) {
+      goto err2;
+    }
+    param->t1.fileName = ((GooString *)tokens->get(2))->copy();
+    break;
+  case displayFontTT:
+    if (tokens->getLength() != 3) {
+      goto err2;
+    }
+    param->tt.fileName = ((GooString *)tokens->get(2))->copy();
+    break;
+  }
+
+  if ((old = (DisplayFontParam *)fontHash->remove(param->name))) {
+    delete old;
+  }
+  fontHash->add(param->name, param);
+  return;
+
+ err2:
+  delete param;
+ err1:
+  error(-1, "Bad 'display*Font*' config file command (%s:%d)",
+	fileName->getCString(), line);
+}
+
+void GlobalParamsGUI::parsePSPaperSize(GooList *tokens, GooString *fileName,
+				    int line) {
+  GooString *tok;
+
+  if (tokens->getLength() == 2) {
+    tok = (GooString *)tokens->get(1);
+    if (!setPSPaperSize(tok->getCString())) {
+      error(-1, "Bad 'psPaperSize' config file command (%s:%d)",
+	    fileName->getCString(), line);
+    }
+  } else if (tokens->getLength() == 3) {
+    tok = (GooString *)tokens->get(1);
+    psPaperWidth = atoi(tok->getCString());
+    tok = (GooString *)tokens->get(2);
+    psPaperHeight = atoi(tok->getCString());
+    psImageableLLX = psImageableLLY = 0;
+    psImageableURX = psPaperWidth;
+    psImageableURY = psPaperHeight;
+  } else {
+    error(-1, "Bad 'psPaperSize' config file command (%s:%d)",
+	  fileName->getCString(), line);
+  }
+}
+
+void GlobalParamsGUI::parsePSImageableArea(GooList *tokens, GooString *fileName,
+					int line) {
+  if (tokens->getLength() != 5) {
+    error(-1, "Bad 'psImageableArea' config file command (%s:%d)",
+	  fileName->getCString(), line);
+    return;
+  }
+  psImageableLLX = atoi(((GooString *)tokens->get(1))->getCString());
+  psImageableLLY = atoi(((GooString *)tokens->get(2))->getCString());
+  psImageableURX = atoi(((GooString *)tokens->get(3))->getCString());
+  psImageableURY = atoi(((GooString *)tokens->get(4))->getCString());
+}
+
+void GlobalParamsGUI::parsePSLevel(GooList *tokens, GooString *fileName, int line) {
+  GooString *tok;
+
+  if (tokens->getLength() != 2) {
+    error(-1, "Bad 'psLevel' config file command (%s:%d)",
+	  fileName->getCString(), line);
+    return;
+  }
+  tok = (GooString *)tokens->get(1);
+  if (!tok->cmp("level1")) {
+    psLevel = psLevel1;
+  } else if (!tok->cmp("level1sep")) {
+    psLevel = psLevel1Sep;
+  } else if (!tok->cmp("level2")) {
+    psLevel = psLevel2;
+  } else if (!tok->cmp("level2sep")) {
+    psLevel = psLevel2Sep;
+  } else if (!tok->cmp("level3")) {
+    psLevel = psLevel3;
+  } else if (!tok->cmp("level3Sep")) {
+    psLevel = psLevel3Sep;
+  } else {
+    error(-1, "Bad 'psLevel' config file command (%s:%d)",
+	  fileName->getCString(), line);
+  }
+}
+
+void GlobalParamsGUI::parsePSFile(GooList *tokens, GooString *fileName, int line) {
+  if (tokens->getLength() != 2) {
+    error(-1, "Bad 'psFile' config file command (%s:%d)",
+	  fileName->getCString(), line);
+    return;
+  }
+  if (psFile) {
+    delete psFile;
+  }
+  psFile = ((GooString *)tokens->get(1))->copy();
+}
+
+void GlobalParamsGUI::parsePSFont(GooList *tokens, GooString *fileName, int line) {
+  PSFontParam *param;
+
+  if (tokens->getLength() != 3) {
+    error(-1, "Bad 'psFont' config file command (%s:%d)",
+	  fileName->getCString(), line);
+    return;
+  }
+  param = new PSFontParam(((GooString *)tokens->get(1))->copy(), 0,
+			  ((GooString *)tokens->get(2))->copy(), NULL);
+  psFonts->add(param->pdfFontName, param);
+}
+
+void GlobalParamsGUI::parsePSFont16(char *cmdName, GooList *fontList,
+				 GooList *tokens, GooString *fileName, int line) {
+  PSFontParam *param;
+  int wMode;
+  GooString *tok;
+
+  if (tokens->getLength() != 5) {
+    error(-1, "Bad '%s' config file command (%s:%d)",
+	  cmdName, fileName->getCString(), line);
+    return;
+  }
+  tok = (GooString *)tokens->get(2);
+  if (!tok->cmp("H")) {
+    wMode = 0;
+  } else if (!tok->cmp("V")) {
+    wMode = 1;
+  } else {
+    error(-1, "Bad '%s' config file command (%s:%d)",
+	  cmdName, fileName->getCString(), line);
+    return;
+  }
+  param = new PSFontParam(((GooString *)tokens->get(1))->copy(),
+			  wMode,
+			  ((GooString *)tokens->get(3))->copy(),
+			  ((GooString *)tokens->get(4))->copy());
+  fontList->append(param);
+}
+
+void GlobalParamsGUI::parseTextEncoding(GooList *tokens, GooString *fileName,
+				     int line) {
+  if (tokens->getLength() != 2) {
+    error(-1, "Bad 'textEncoding' config file command (%s:%d)",
+	  fileName->getCString(), line);
+    return;
+  }
+  delete textEncoding;
+  textEncoding = ((GooString *)tokens->get(1))->copy();
+}
+
+void GlobalParamsGUI::parseTextEOL(GooList *tokens, GooString *fileName, int line) {
+  GooString *tok;
+
+  if (tokens->getLength() != 2) {
+    error(-1, "Bad 'textEOL' config file command (%s:%d)",
+	  fileName->getCString(), line);
+    return;
+  }
+  tok = (GooString *)tokens->get(1);
+  if (!tok->cmp("unix")) {
+    textEOL = eolUnix;
+  } else if (!tok->cmp("dos")) {
+    textEOL = eolDOS;
+  } else if (!tok->cmp("mac")) {
+    textEOL = eolMac;
+  } else {
+    error(-1, "Bad 'textEOL' config file command (%s:%d)",
+	  fileName->getCString(), line);
+  }
+}
+
+void GlobalParamsGUI::parseFontDir(GooList *tokens, GooString *fileName, int line) {
+  if (tokens->getLength() != 2) {
+    error(-1, "Bad 'fontDir' config file command (%s:%d)",
+	  fileName->getCString(), line);
+    return;
+  }
+  fontDirs->append(((GooString *)tokens->get(1))->copy());
+}
+
+void GlobalParamsGUI::parseInitialZoom(GooList *tokens,
+				    GooString *fileName, int line) {
+  if (tokens->getLength() != 2) {
+    error(-1, "Bad 'initialZoom' config file command (%s:%d)",
+	  fileName->getCString(), line);
+    return;
+  }
+  delete initialZoom;
+  initialZoom = ((GooString *)tokens->get(1))->copy();
+}
+
+void GlobalParamsGUI::parseScreenType(GooList *tokens, GooString *fileName,
+				   int line) {
+  GooString *tok;
+
+  if (tokens->getLength() != 2) {
+    error(-1, "Bad 'screenType' config file command (%s:%d)",
+	  fileName->getCString(), line);
+    return;
+  }
+  tok = (GooString *)tokens->get(1);
+  if (!tok->cmp("dispersed")) {
+    screenType = screenDispersed;
+  } else if (!tok->cmp("clustered")) {
+    screenType = screenClustered;
+  } else if (!tok->cmp("stochasticClustered")) {
+    screenType = screenStochasticClustered;
+  } else {
+    error(-1, "Bad 'screenType' config file command (%s:%d)",
+	  fileName->getCString(), line);
+  }
+}
+
+void GlobalParamsGUI::parseBind(GooList *tokens, GooString *fileName, int line) {
+  KeyBinding *binding;
+  GooList *cmds;
+  int code, mods, context, i;
+
+  if (tokens->getLength() < 4) {
+    error(-1, "Bad 'bind' config file command (%s:%d)",
+	  fileName->getCString(), line);
+    return;
+  }
+  if (!parseKey((GooString *)tokens->get(1), (GooString *)tokens->get(2),
+		&code, &mods, &context,
+		"bind", tokens, fileName, line)) {
+    return;
+  }
+  for (i = 0; i < keyBindings->getLength(); ++i) {
+    binding = (KeyBinding *)keyBindings->get(i);
+    if (binding->code == code &&
+	binding->mods == mods &&
+	binding->context == context) {
+      delete (KeyBinding *)keyBindings->del(i);
+      break;
+    }
+  }
+  cmds = new GooList();
+  for (i = 3; i < tokens->getLength(); ++i) {
+    cmds->append(((GooString *)tokens->get(i))->copy());
+  }
+  keyBindings->append(new KeyBinding(code, mods, context, cmds));
+}
+
+void GlobalParamsGUI::parseUnbind(GooList *tokens, GooString *fileName, int line) {
+  KeyBinding *binding;
+  int code, mods, context, i;
+
+  if (tokens->getLength() != 3) {
+    error(-1, "Bad 'unbind' config file command (%s:%d)",
+	  fileName->getCString(), line);
+    return;
+  }
+  if (!parseKey((GooString *)tokens->get(1), (GooString *)tokens->get(2),
+		&code, &mods, &context,
+		"unbind", tokens, fileName, line)) {
+    return;
+  }
+  for (i = 0; i < keyBindings->getLength(); ++i) {
+    binding = (KeyBinding *)keyBindings->get(i);
+    if (binding->code == code &&
+	binding->mods == mods &&
+	binding->context == context) {
+      delete (KeyBinding *)keyBindings->del(i);
+      break;
+    }
+  }
+}
+
+GBool GlobalParamsGUI::parseKey(GooString *modKeyStr, GooString *contextStr,
+			     int *code, int *mods, int *context,
+			     char *cmdName,
+			     GooList *tokens, GooString *fileName, int line) {
+  char *p0;
+
+  *mods = xpdfKeyModNone;
+  p0 = modKeyStr->getCString();
+  while (1) {
+    if (!strncmp(p0, "shift-", 6)) {
+      *mods |= xpdfKeyModShift;
+      p0 += 6;
+    } else if (!strncmp(p0, "ctrl-", 5)) {
+      *mods |= xpdfKeyModCtrl;
+      p0 += 5;
+    } else if (!strncmp(p0, "alt-", 4)) {
+      *mods |= xpdfKeyModAlt;
+      p0 += 4;
+    } else {
+      break;
+    }
+  }
+
+  if (!strcmp(p0, "space")) {
+    *code = ' ';
+  } else if (!strcmp(p0, "tab")) {
+    *code = xpdfKeyCodeTab;
+  } else if (!strcmp(p0, "return")) {
+    *code = xpdfKeyCodeReturn;
+  } else if (!strcmp(p0, "enter")) {
+    *code = xpdfKeyCodeEnter;
+  } else if (!strcmp(p0, "backspace")) {
+    *code = xpdfKeyCodeBackspace;
+  } else if (!strcmp(p0, "insert")) {
+    *code = xpdfKeyCodeInsert;
+  } else if (!strcmp(p0, "delete")) {
+    *code = xpdfKeyCodeDelete;
+  } else if (!strcmp(p0, "home")) {
+    *code = xpdfKeyCodeHome;
+  } else if (!strcmp(p0, "end")) {
+    *code = xpdfKeyCodeEnd;
+  } else if (!strcmp(p0, "pgup")) {
+    *code = xpdfKeyCodePgUp;
+  } else if (!strcmp(p0, "pgdn")) {
+    *code = xpdfKeyCodePgDn;
+  } else if (!strcmp(p0, "left")) {
+    *code = xpdfKeyCodeLeft;
+  } else if (!strcmp(p0, "right")) {
+    *code = xpdfKeyCodeRight;
+  } else if (!strcmp(p0, "up")) {
+    *code = xpdfKeyCodeUp;
+  } else if (!strcmp(p0, "down")) {
+    *code = xpdfKeyCodeDown;
+  } else if (p0[0] == 'f' && p0[1] >= '1' && p0[1] <= '9' && !p0[2]) {
+    *code = xpdfKeyCodeF1 + (p0[1] - '1');
+  } else if (p0[0] == 'f' &&
+	     ((p0[1] >= '1' && p0[1] <= '2' && p0[2] >= '0' && p0[2] <= '9') ||
+	      (p0[1] == '3' && p0[2] >= '0' && p0[2] <= '5')) &&
+	     !p0[3]) {
+    *code = xpdfKeyCodeF1 + 10 * (p0[1] - '0') + (p0[2] - '0') - 1;
+  } else if (!strncmp(p0, "mousePress", 10) &&
+	     p0[10] >= '1' && p0[10] <= '7' && !p0[11]) {
+    *code = xpdfKeyCodeMousePress1 + (p0[10] - '1');
+  } else if (!strncmp(p0, "mouseRelease", 12) &&
+	     p0[12] >= '1' && p0[12] <= '7' && !p0[13]) {
+    *code = xpdfKeyCodeMouseRelease1 + (p0[12] - '1');
+  } else if (*p0 >= 0x20 && *p0 <= 0x7e && !p0[1]) {
+    *code = (int)*p0;
+  } else {
+    error(-1, "Bad key/modifier in '%s' config file command (%s:%d)",
+	  cmdName, fileName->getCString(), line);
+    return gFalse;
+  }
+
+  p0 = contextStr->getCString();
+  if (!strcmp(p0, "any")) {
+    *context = xpdfKeyContextAny;
+  } else {
+    *context = xpdfKeyContextAny;
+    while (1) {
+      if (!strncmp(p0, "fullScreen", 10)) {
+	*context |= xpdfKeyContextFullScreen;
+	p0 += 10;
+      } else if (!strncmp(p0, "window", 6)) {
+	*context |= xpdfKeyContextWindow;
+	p0 += 6;
+      } else if (!strncmp(p0, "continuous", 10)) {
+	*context |= xpdfKeyContextContinuous;
+	p0 += 10;
+      } else if (!strncmp(p0, "singlePage", 10)) {
+	*context |= xpdfKeyContextSinglePage;
+	p0 += 10;
+      } else if (!strncmp(p0, "overLink", 8)) {
+	*context |= xpdfKeyContextOverLink;
+	p0 += 8;
+      } else if (!strncmp(p0, "offLink", 7)) {
+	*context |= xpdfKeyContextOffLink;
+	p0 += 7;
+      } else if (!strncmp(p0, "outline", 7)) {
+	*context |= xpdfKeyContextOutline;
+	p0 += 7;
+      } else if (!strncmp(p0, "mainWin", 7)) {
+	*context |= xpdfKeyContextMainWin;
+	p0 += 7;
+      } else if (!strncmp(p0, "scrLockOn", 9)) {
+	*context |= xpdfKeyContextScrLockOn;
+	p0 += 9;
+      } else if (!strncmp(p0, "scrLockOff", 10)) {
+	*context |= xpdfKeyContextScrLockOff;
+	p0 += 10;
+      } else {
+	error(-1, "Bad context in '%s' config file command (%s:%d)",
+	      cmdName, fileName->getCString(), line);
+	return gFalse;
+      }
+      if (!*p0) {
+	break;
+      }
+      if (*p0 != ',') {
+	error(-1, "Bad context in '%s' config file command (%s:%d)",
+	      cmdName, fileName->getCString(), line);
+	return gFalse;
+      }
+      ++p0;
+    }
+  }
+
+  return gTrue;
+}
+
+void GlobalParamsGUI::parseCommand(char *cmdName, GooString **val,
+				GooList *tokens, GooString *fileName, int line) {
+  if (tokens->getLength() != 2) {
+    error(-1, "Bad '%s' config file command (%s:%d)",
+	  cmdName, fileName->getCString(), line);
+    return;
+  }
+  if (*val) {
+    delete *val;
+  }
+  *val = ((GooString *)tokens->get(1))->copy();
+}
+
+void GlobalParamsGUI::parseYesNo(char *cmdName, GBool *flag,
+			      GooList *tokens, GooString *fileName, int line) {
+  GooString *tok;
+
+  if (tokens->getLength() != 2) {
+    error(-1, "Bad '%s' config file command (%s:%d)",
+	  cmdName, fileName->getCString(), line);
+    return;
+  }
+  tok = (GooString *)tokens->get(1);
+  if (!parseYesNo2(tok->getCString(), flag)) {
+    error(-1, "Bad '%s' config file command (%s:%d)",
+	  cmdName, fileName->getCString(), line);
+  }
+}
+
+GBool GlobalParamsGUI::parseYesNo2(char *token, GBool *flag) {
+  if (!strcmp(token, "yes")) {
+    *flag = gTrue;
+  } else if (!strcmp(token, "no")) {
+    *flag = gFalse;
+  } else {
+    return gFalse;
+  }
+  return gTrue;
+}
+
+void GlobalParamsGUI::parseInteger(char *cmdName, int *val,
+				GooList *tokens, GooString *fileName, int line) {
+  GooString *tok;
+  int i;
+
+  if (tokens->getLength() != 2) {
+    error(-1, "Bad '%s' config file command (%s:%d)",
+	  cmdName, fileName->getCString(), line);
+    return;
+  }
+  tok = (GooString *)tokens->get(1);
+  if (tok->getLength() == 0) {
+    error(-1, "Bad '%s' config file command (%s:%d)",
+	  cmdName, fileName->getCString(), line);
+    return;
+  }
+  if (tok->getChar(0) == '-') {
+    i = 1;
+  } else {
+    i = 0;
+  }
+  for (; i < tok->getLength(); ++i) {
+    if (tok->getChar(i) < '0' || tok->getChar(i) > '9') {
+      error(-1, "Bad '%s' config file command (%s:%d)",
+	    cmdName, fileName->getCString(), line);
+      return;
+    }
+  }
+  *val = atoi(tok->getCString());
+}
+
+void GlobalParamsGUI::parseFloat(char *cmdName, double *val,
+			      GooList *tokens, GooString *fileName, int line) {
+  GooString *tok;
+  int i;
+
+  if (tokens->getLength() != 2) {
+    error(-1, "Bad '%s' config file command (%s:%d)",
+	  cmdName, fileName->getCString(), line);
+    return;
+  }
+  tok = (GooString *)tokens->get(1);
+  if (tok->getLength() == 0) {
+    error(-1, "Bad '%s' config file command (%s:%d)",
+	  cmdName, fileName->getCString(), line);
+    return;
+  }
+  if (tok->getChar(0) == '-') {
+    i = 1;
+  } else {
+    i = 0;
+  }
+  for (; i < tok->getLength(); ++i) {
+    if (!((tok->getChar(i) >= '0' && tok->getChar(i) <= '9') ||
+	  tok->getChar(i) == '.')) {
+      error(-1, "Bad '%s' config file command (%s:%d)",
+	    cmdName, fileName->getCString(), line);
+      return;
+    }
+  }
+  *val = atof(tok->getCString());
+}
+
+void GlobalParamsGUI::addCIDToUnicode(GooString *collection,
+				   GooString *fileName) {
+  GooString *old;
+
+  if ((old = (GooString *)cidToUnicodes->remove(collection))) {
+    delete old;
+  }
+  cidToUnicodes->add(collection->copy(), fileName->copy());
+}
+
+void GlobalParamsGUI::addUnicodeMap(GooString *encodingName, GooString *fileName)
+{
+  GooString *old;
+
+  if ((old = (GooString *)unicodeMaps->remove(encodingName))) {
+    delete old;
+  }
+  unicodeMaps->add(encodingName->copy(), fileName->copy());
+}
+
+void GlobalParamsGUI::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());
+}
+
+GlobalParamsGUI::~GlobalParamsGUI() {
+  GooHashIter *iter;
+  GooString *key;
+  GooList *list;
+
+  delete macRomanReverseMap;
+
+  delete baseDir;
+  delete nameToUnicode;
+  deleteGooHash(cidToUnicodes, GooString);
+  deleteGooHash(unicodeToUnicodes, GooString);
+  deleteGooHash(residentUnicodeMaps, UnicodeMap);
+  deleteGooHash(unicodeMaps, GooString);
+  deleteGooList(toUnicodeDirs, GooString);
+  deleteGooHash(displayFonts, DisplayFontParam);
+  deleteGooHash(displayCIDFonts, DisplayFontParam);
+  deleteGooHash(displayNamedCIDFonts, DisplayFontParam);
+#ifdef WIN32
+  if (winFontList) {
+    delete winFontList;
+  }
+#endif
+  if (psFile) {
+    delete psFile;
+  }
+  deleteGooHash(psFonts, PSFontParam);
+  deleteGooList(psNamedFonts16, PSFontParam);
+  deleteGooList(psFonts16, PSFontParam);
+  delete textEncoding;
+  deleteGooList(fontDirs, GooString);
+
+  cMapDirs->startIter(&iter);
+  while (cMapDirs->getNext(&iter, &key, (void **)&list)) {
+    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 GlobalParamsGUI::setBaseDir(char *dir) {
+  delete baseDir;
+  baseDir = new GooString(dir);
+}
+
+void GlobalParamsGUI::setupBaseFonts(char *dir) {
+  GooString *fontName;
+  GooString *fileName;
+#ifdef WIN32
+  HMODULE shell32Lib;
+  BOOL (__stdcall *SHGetSpecialFolderPathFunc)(HWND hwndOwner,
+					       LPTSTR lpszPath,
+					       int nFolder,
+					       BOOL fCreate);
+  char winFontDir[MAX_PATH];
+#endif
+  FILE *f;
+  DisplayFontParamKind kind;
+  DisplayFontParam *dfp;
+  int i, j;
+
+#ifdef WIN32
+  // SHGetSpecialFolderPath isn't available in older versions of
+  // shell32.dll (Win95 and WinNT4), so do a dynamic load
+  winFontDir[0] = '\0';
+  if ((shell32Lib = LoadLibrary("shell32.dll"))) {
+    if ((SHGetSpecialFolderPathFunc = 
+	 (BOOL (__stdcall *)(HWND hwndOwner, LPTSTR lpszPath,
+			     int nFolder, BOOL fCreate))
+	 GetProcAddress(shell32Lib, "SHGetSpecialFolderPathA"))) {
+      if (!(*SHGetSpecialFolderPathFunc)(NULL, winFontDir,
+					 CSIDL_FONTS, FALSE)) {
+	winFontDir[0] = '\0';
+      }
+    }
+  }
+#endif
+  for (i = 0; displayFontTab[i].name; ++i) {
+    fontName = new GooString(displayFontTab[i].name);
+    if (getDisplayFont(fontName)) {
+      delete fontName;
+      continue;
+    }
+    fileName = NULL;
+    kind = displayFontT1; // make gcc happy
+    if (dir) {
+      fileName = appendToPath(new GooString(dir), displayFontTab[i].t1FileName);
+      kind = displayFontT1;
+      if ((f = fopen(fileName->getCString(), "rb"))) {
+	fclose(f);
+      } else {
+	delete fileName;
+	fileName = NULL;
+      }
+    }
+#ifdef WIN32
+    if (!fileName && winFontDir[0] && displayFontTab[i].ttFileName) {
+      fileName = appendToPath(new GooString(winFontDir),
+			      displayFontTab[i].ttFileName);
+      kind = displayFontTT;
+      if ((f = fopen(fileName->getCString(), "rb"))) {
+	fclose(f);
+      } else {
+	delete fileName;
+	fileName = NULL;
+      }
+    }
+    // SHGetSpecialFolderPath(CSIDL_FONTS) doesn't work on Win 2k Server
+    // or Win2003 Server, or with older versions of shell32.dll, so check
+    // the "standard" directories
+    if (displayFontTab[i].ttFileName) {
+      for (j = 0; !fileName && displayFontDirs[j]; ++j) {
+	fileName = appendToPath(new GooString(displayFontDirs[j]),
+				displayFontTab[i].ttFileName);
+	kind = displayFontTT;
+	if ((f = fopen(fileName->getCString(), "rb"))) {
+	  fclose(f);
+	} else {
+	  delete fileName;
+	  fileName = NULL;
+	}
+      }
+    }
+#else
+    for (j = 0; !fileName && displayFontDirs[j]; ++j) {
+      fileName = appendToPath(new GooString(displayFontDirs[j]),
+			      displayFontTab[i].t1FileName);
+      kind = displayFontT1;
+      if ((f = fopen(fileName->getCString(), "rb"))) {
+	fclose(f);
+      } else {
+	delete fileName;
+	fileName = NULL;
+      }
+    }
+#endif
+    if (!fileName) {
+      error(-1, "No display font for '%s'", displayFontTab[i].name);
+      delete fontName;
+      continue;
+    }
+    dfp = new DisplayFontParam(fontName, kind);
+    dfp->t1.fileName = fileName;
+    globalParamsGUI->addDisplayFont(dfp);
+  }
+
+#ifdef WIN32
+  if (winFontDir[0]) {
+    winFontList = new WinFontList(winFontDir);
+  }
+#endif
+}
+
+//------------------------------------------------------------------------
+// accessors
+//------------------------------------------------------------------------
+
+CharCode GlobalParamsGUI::getMacRomanCharCode(char *charName) {
+  // no need to lock - macRomanReverseMap is constant
+  return macRomanReverseMap->lookup(charName);
+}
+
+GooString *GlobalParamsGUI::getBaseDir() {
+  GooString *s;
+
+  lockGlobalParamsGUI;
+  s = baseDir->copy();
+  unlockGlobalParamsGUI;
+  return s;
+}
+
+Unicode GlobalParamsGUI::mapNameToUnicode(char *charName) {
+  // no need to lock - nameToUnicode is constant
+  return nameToUnicode->lookup(charName);
+}
+
+UnicodeMap *GlobalParamsGUI::getResidentUnicodeMap(GooString *encodingName) {
+  UnicodeMap *map;
+
+  lockGlobalParamsGUI;
+  map = (UnicodeMap *)residentUnicodeMaps->lookup(encodingName);
+  unlockGlobalParamsGUI;
+  if (map) {
+    map->incRefCnt();
+  }
+  return map;
+}
+
+FILE *GlobalParamsGUI::getUnicodeMapFile(GooString *encodingName) {
+  GooString *fileName;
+  FILE *f;
+
+  lockGlobalParamsGUI;
+  if ((fileName = (GooString *)unicodeMaps->lookup(encodingName))) {
+    f = fopen(fileName->getCString(), "r");
+  } else {
+    f = NULL;
+  }
+  unlockGlobalParamsGUI;
+  return f;
+}
+
+FILE *GlobalParamsGUI::findCMapFile(GooString *collection, GooString *cMapName) {
+  GooList *list;
+  GooString *dir;
+  GooString *fileName;
+  FILE *f;
+  int i;
+
+  lockGlobalParamsGUI;
+  if (!(list = (GooList *)cMapDirs->lookup(collection))) {
+    unlockGlobalParamsGUI;
+    return NULL;
+  }
+  for (i = 0; i < list->getLength(); ++i) {
+    dir = (GooString *)list->get(i);
+    fileName = appendToPath(dir->copy(), cMapName->getCString());
+    f = fopen(fileName->getCString(), "r");
+    delete fileName;
+    if (f) {
+      unlockGlobalParamsGUI;
+      return f;
+    }
+  }
+  unlockGlobalParamsGUI;
+  return NULL;
+}
+
+FILE *GlobalParamsGUI::findToUnicodeFile(GooString *name) {
+  GooString *dir, *fileName;
+  FILE *f;
+  int i;
+
+  lockGlobalParamsGUI;
+  for (i = 0; i < toUnicodeDirs->getLength(); ++i) {
+    dir = (GooString *)toUnicodeDirs->get(i);
+    fileName = appendToPath(dir->copy(), name->getCString());
+    f = fopen(fileName->getCString(), "r");
+    delete fileName;
+    if (f) {
+      unlockGlobalParamsGUI;
+      return f;
+    }
+  }
+  unlockGlobalParamsGUI;
+  return NULL;
+}
+
+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 FcPattern *buildFcPattern(GfxFont *font)
+{
+  int weight = FC_WEIGHT_NORMAL,
+      slant = FC_SLANT_ROMAN,
+      width = FC_WIDTH_NORMAL,
+      spacing = FC_PROPORTIONAL;
+  bool deleteFamily = false;
+  char *family, *name, *lang, *modifiers;
+  const char *start;
+  FcPattern *p;
+
+  // this is all heuristics will be overwritten if font had proper info
+  name = font->getName()->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, "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; 
+  }
+  
+  // 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(-1, "Unknown CID font collection, please report to poppler bugzilla.");
+        lang = "xx";
+      }
+    }
+    else lang = "xx";
+  }
+  else lang = "xx";
+  
+  p = FcPatternBuild(NULL,
+                    FC_FAMILY, FcTypeString, family,
+                    FC_SLANT, FcTypeInteger, slant, 
+                    FC_WEIGHT, FcTypeInteger, weight,
+                    FC_WIDTH, FcTypeInteger, width, 
+                    FC_SPACING, FcTypeInteger, spacing,
+                    FC_LANG, FcTypeString, lang,
+                    NULL);
+  if (deleteFamily)
+    delete[] family;
+  return p;
+}
+
+DisplayFontParam *GlobalParamsGUI::getDisplayFont(GfxFont *font) {
+  DisplayFontParam *dfp;
+  FcPattern *p=0;
+
+  GooString *fontName = font->getName();
+  if (!fontName) return NULL;
+  
+  lockGlobalParamsGUI;
+  dfp = font->dfp;
+  if (!dfp)
+  {
+    FcChar8* s;
+    char * ext;
+    FcResult res;
+    FcFontSet *set;
+    int i;
+    p = buildFcPattern(font);
+
+    if (!p)
+      goto fin;
+    FcConfigSubstitute(FCcfg, p, FcMatchPattern);
+    FcDefaultSubstitute(p);
+    set = FcFontSort(FCcfg, p, FcFalse, NULL, &res);
+    if (!set)
+      goto fin;
+    for (i = 0; i < set->nfont; ++i)
+    {
+      res = FcPatternGetString(set->fonts[i], FC_FILE, 0, &s);
+      if (res != FcResultMatch || !s)
+        continue;
+      ext = strrchr((char*)s,'.');
+      if (!ext)
+        continue;
+      if (!strncasecmp(ext,".ttf",4) || !strncasecmp(ext, ".ttc", 4))
+      {
+        dfp = new DisplayFontParam(fontName->copy(), displayFontTT);  
+        dfp->tt.fileName = new GooString((char*)s);
+        FcPatternGetInteger(set->fonts[i], FC_INDEX, 0, &(dfp->tt.faceIndex));
+      }
+      else if (!strncasecmp(ext,".pfa",4) || !strncasecmp(ext,".pfb",4)) 
+      {
+        dfp = new DisplayFontParam(fontName->copy(), displayFontT1);  
+        dfp->t1.fileName = new GooString((char*)s);
+      }
+      else
+        continue;
+      font->dfp = dfp;
+      break;
+    }
+    FcFontSetDestroy(set);
+  }
+fin:
+  if (p)
+    FcPatternDestroy(p);
+
+  unlockGlobalParamsGUI;
+  return dfp;
+}
+
+DisplayFontParam *GlobalParamsGUI::getDisplayFont(GooString *fontName) {
+  DisplayFontParam *dfp;
+
+  lockGlobalParamsGUI;
+  dfp = (DisplayFontParam *)displayFonts->lookup(fontName);
+#ifdef WIN32
+  if (!dfp && winFontList) {
+    dfp = winFontList->find(fontName);
+  }
+#endif
+  unlockGlobalParamsGUI;
+  return dfp;
+}
+
+DisplayFontParam *GlobalParamsGUI::getDisplayCIDFont(GooString *fontName,
+						  GooString *collection) {
+  DisplayFontParam *dfp;
+
+  lockGlobalParamsGUI;
+  if (!fontName ||
+      !(dfp = (DisplayFontParam *)displayNamedCIDFonts->lookup(fontName))) {
+    dfp = (DisplayFontParam *)displayCIDFonts->lookup(collection);
+  }
+  unlockGlobalParamsGUI;
+  return dfp;
+}
+
+GooString *GlobalParamsGUI::getPSFile() {
+  GooString *s;
+
+  lockGlobalParamsGUI;
+  s = psFile ? psFile->copy() : (GooString *)NULL;
+  unlockGlobalParamsGUI;
+  return s;
+}
+
+int GlobalParamsGUI::getPSPaperWidth() {
+  int w;
+
+  lockGlobalParamsGUI;
+  w = psPaperWidth;
+  unlockGlobalParamsGUI;
+  return w;
+}
+
+int GlobalParamsGUI::getPSPaperHeight() {
+  int h;
+
+  lockGlobalParamsGUI;
+  h = psPaperHeight;
+  unlockGlobalParamsGUI;
+  return h;
+}
+
+void GlobalParamsGUI::getPSImageableArea(int *llx, int *lly, int *urx, int *ury) {
+  lockGlobalParamsGUI;
+  *llx = psImageableLLX;
+  *lly = psImageableLLY;
+  *urx = psImageableURX;
+  *ury = psImageableURY;
+  unlockGlobalParamsGUI;
+}
+
+GBool GlobalParamsGUI::getPSCrop() {
+  GBool f;
+
+  lockGlobalParamsGUI;
+  f = psCrop;
+  unlockGlobalParamsGUI;
+  return f;
+}
+
+GBool GlobalParamsGUI::getPSExpandSmaller() {
+  GBool f;
+
+  lockGlobalParamsGUI;
+  f = psExpandSmaller;
+  unlockGlobalParamsGUI;
+  return f;
+}
+
+GBool GlobalParamsGUI::getPSShrinkLarger() {
+  GBool f;
+
+  lockGlobalParamsGUI;
+  f = psShrinkLarger;
+  unlockGlobalParamsGUI;
+  return f;
+}
+
+GBool GlobalParamsGUI::getPSCenter() {
+  GBool f;
+
+  lockGlobalParamsGUI;
+  f = psCenter;
+  unlockGlobalParamsGUI;
+  return f;
+}
+
+GBool GlobalParamsGUI::getPSDuplex() {
+  GBool d;
+
+  lockGlobalParamsGUI;
+  d = psDuplex;
+  unlockGlobalParamsGUI;
+  return d;
+}
+
+PSLevel GlobalParamsGUI::getPSLevel() {
+  PSLevel level;
+
+  lockGlobalParamsGUI;
+  level = psLevel;
+  unlockGlobalParamsGUI;
+  return level;
+}
+
+PSFontParam *GlobalParamsGUI::getPSFont(GooString *fontName) {
+  PSFontParam *p;
+
+  lockGlobalParamsGUI;
+  p = (PSFontParam *)psFonts->lookup(fontName);
+  unlockGlobalParamsGUI;
+  return p;
+}
+
+PSFontParam *GlobalParamsGUI::getPSFont16(GooString *fontName,
+				       GooString *collection, int wMode) {
+  PSFontParam *p;
+  int i;
+
+  lockGlobalParamsGUI;
+  p = NULL;
+  if (fontName) {
+    for (i = 0; i < psNamedFonts16->getLength(); ++i) {
+      p = (PSFontParam *)psNamedFonts16->get(i);
+      if (!p->pdfFontName->cmp(fontName) &&
+	  p->wMode == wMode) {
+	break;
+      }
+      p = NULL;
+    }
+  }
+  if (!p && collection) {
+    for (i = 0; i < psFonts16->getLength(); ++i) {
+      p = (PSFontParam *)psFonts16->get(i);
+      if (!p->pdfFontName->cmp(collection) &&
+	  p->wMode == wMode) {
+	break;
+      }
+      p = NULL;
+    }
+  }
+  unlockGlobalParamsGUI;
+  return p;
+}
+
+GBool GlobalParamsGUI::getPSEmbedType1() {
+  GBool e;
+
+  lockGlobalParamsGUI;
+  e = psEmbedType1;
+  unlockGlobalParamsGUI;
+  return e;
+}
+
+GBool GlobalParamsGUI::getPSEmbedTrueType() {
+  GBool e;
+
+  lockGlobalParamsGUI;
+  e = psEmbedTrueType;
+  unlockGlobalParamsGUI;
+  return e;
+}
+
+GBool GlobalParamsGUI::getPSEmbedCIDPostScript() {
+  GBool e;
+
+  lockGlobalParamsGUI;
+  e = psEmbedCIDPostScript;
+  unlockGlobalParamsGUI;
+  return e;
+}
+
+GBool GlobalParamsGUI::getPSEmbedCIDTrueType() {
+  GBool e;
+
+  lockGlobalParamsGUI;
+  e = psEmbedCIDTrueType;
+  unlockGlobalParamsGUI;
+  return e;
+}
+
+GBool GlobalParamsGUI::getPSPreload() {
+  GBool preload;
+
+  lockGlobalParamsGUI;
+  preload = psPreload;
+  unlockGlobalParamsGUI;
+  return preload;
+}
+
+GBool GlobalParamsGUI::getPSOPI() {
+  GBool opi;
+
+  lockGlobalParamsGUI;
+  opi = psOPI;
+  unlockGlobalParamsGUI;
+  return opi;
+}
+
+GBool GlobalParamsGUI::getPSASCIIHex() {
+  GBool ah;
+
+  lockGlobalParamsGUI;
+  ah = psASCIIHex;
+  unlockGlobalParamsGUI;
+  return ah;
+}
+
+GooString *GlobalParamsGUI::getTextEncodingName() {
+  GooString *s;
+
+  lockGlobalParamsGUI;
+  s = textEncoding->copy();
+  unlockGlobalParamsGUI;
+  return s;
+}
+
+EndOfLineKind GlobalParamsGUI::getTextEOL() {
+  EndOfLineKind eol;
+
+  lockGlobalParamsGUI;
+  eol = textEOL;
+  unlockGlobalParamsGUI;
+  return eol;
+}
+
+GBool GlobalParamsGUI::getTextPageBreaks() {
+  GBool pageBreaks;
+
+  lockGlobalParamsGUI;
+  pageBreaks = textPageBreaks;
+  unlockGlobalParamsGUI;
+  return pageBreaks;
+}
+
+GBool GlobalParamsGUI::getTextKeepTinyChars() {
+  GBool tiny;
+
+  lockGlobalParamsGUI;
+  tiny = textKeepTinyChars;
+  unlockGlobalParamsGUI;
+  return tiny;
+}
+
+GooString *GlobalParamsGUI::findFontFile(GooString *fontName, char **exts) {
+  GooString *dir, *fileName;
+  char **ext;
+  FILE *f;
+  int i;
+
+  lockGlobalParamsGUI;
+  for (i = 0; i < fontDirs->getLength(); ++i) {
+    dir = (GooString *)fontDirs->get(i);
+    for (ext = exts; *ext; ++ext) {
+      fileName = appendToPath(dir->copy(), fontName->getCString());
+      fileName->append(*ext);
+      if ((f = fopen(fileName->getCString(), "rb"))) {
+	fclose(f);
+	unlockGlobalParamsGUI;
+	return fileName;
+      }
+      delete fileName;
+    }
+  }
+  unlockGlobalParamsGUI;
+  return NULL;
+}
+
+GooString *GlobalParamsGUI::getInitialZoom() {
+  GooString *s;
+
+  lockGlobalParamsGUI;
+  s = initialZoom->copy();
+  unlockGlobalParamsGUI;
+  return s;
+}
+
+GBool GlobalParamsGUI::getContinuousView() {
+  GBool f;
+
+  lockGlobalParamsGUI;
+  f = continuousView;
+  unlockGlobalParamsGUI;
+  return f;
+}
+
+GBool GlobalParamsGUI::getEnableT1lib() {
+  GBool f;
+
+  lockGlobalParamsGUI;
+  f = enableT1lib;
+  unlockGlobalParamsGUI;
+  return f;
+}
+
+GBool GlobalParamsGUI::getEnableFreeType() {
+  GBool f;
+
+  lockGlobalParamsGUI;
+  f = enableFreeType;
+  unlockGlobalParamsGUI;
+  return f;
+}
+
+GBool GlobalParamsGUI::getEnableFreeTypeHinting() {
+  GBool f;
+
+  lockGlobalParamsGUI;
+  f = enableFreeTypeHinting;
+  unlockGlobalParamsGUI;
+  return f;
+}
+
+GBool GlobalParamsGUI::getAntialias() {
+  GBool f;
+
+  lockGlobalParamsGUI;
+  f = antialias;
+  unlockGlobalParamsGUI;
+  return f;
+}
+
+GBool GlobalParamsGUI::getVectorAntialias() {
+  GBool f;
+
+  lockGlobalParamsGUI;
+  f = vectorAntialias;
+  unlockGlobalParamsGUI;
+  return f;
+}
+
+GBool GlobalParamsGUI::getStrokeAdjust() {
+  GBool f;
+
+  lockGlobalParamsGUI;
+  f = strokeAdjust;
+  unlockGlobalParamsGUI;
+  return f;
+}
+
+ScreenType GlobalParamsGUI::getScreenType() {
+  ScreenType t;
+
+  lockGlobalParamsGUI;
+  t = screenType;
+  unlockGlobalParamsGUI;
+  return t;
+}
+
+int GlobalParamsGUI::getScreenSize() {
+  int size;
+
+  lockGlobalParamsGUI;
+  size = screenSize;
+  unlockGlobalParamsGUI;
+  return size;
+}
+
+int GlobalParamsGUI::getScreenDotRadius() {
+  int r;
+
+  lockGlobalParamsGUI;
+  r = screenDotRadius;
+  unlockGlobalParamsGUI;
+  return r;
+}
+
+double GlobalParamsGUI::getScreenGamma() {
+  double gamma;
+
+  lockGlobalParamsGUI;
+  gamma = screenGamma;
+  unlockGlobalParamsGUI;
+  return gamma;
+}
+
+double GlobalParamsGUI::getScreenBlackThreshold() {
+  double thresh;
+
+  lockGlobalParamsGUI;
+  thresh = screenBlackThreshold;
+  unlockGlobalParamsGUI;
+  return thresh;
+}
+
+double GlobalParamsGUI::getScreenWhiteThreshold() {
+  double thresh;
+
+  lockGlobalParamsGUI;
+  thresh = screenWhiteThreshold;
+  unlockGlobalParamsGUI;
+  return thresh;
+}
+
+GBool GlobalParamsGUI::getMapNumericCharNames() {
+  GBool map;
+
+  lockGlobalParamsGUI;
+  map = mapNumericCharNames;
+  unlockGlobalParamsGUI;
+  return map;
+}
+
+GBool GlobalParamsGUI::getMapUnknownCharNames() {
+  GBool map;
+
+  lockGlobalParamsGUI;
+  map = mapUnknownCharNames;
+  unlockGlobalParamsGUI;
+  return map;
+}
+
+GooList *GlobalParamsGUI::getKeyBinding(int code, int mods, int context) {
+  KeyBinding *binding;
+  GooList *cmds;
+  int modMask;
+  int i, j;
+
+  lockGlobalParamsGUI;
+  cmds = NULL;
+  // for ASCII chars, ignore the shift modifier
+  modMask = code <= 0xff ? ~xpdfKeyModShift : ~0;
+  for (i = 0; i < keyBindings->getLength(); ++i) {
+    binding = (KeyBinding *)keyBindings->get(i);
+    if (binding->code == code &&
+	(binding->mods & modMask) == (mods & modMask) &&
+	(~binding->context | context) == ~0) {
+      cmds = new GooList();
+      for (j = 0; j < binding->cmds->getLength(); ++j) {
+	cmds->append(((GooString *)binding->cmds->get(j))->copy());
+      }
+      break;
+    }
+  }
+  unlockGlobalParamsGUI;
+  return cmds;
+}
+
+GBool GlobalParamsGUI::getPrintCommands() {
+  GBool p;
+
+  lockGlobalParamsGUI;
+  p = printCommands;
+  unlockGlobalParamsGUI;
+  return p;
+}
+
+GBool GlobalParamsGUI::getProfileCommands() {
+  GBool p;
+
+  lockGlobalParamsGUI;
+  p = profileCommands;
+  unlockGlobalParamsGUI;
+  return p;
+}
+
+GBool GlobalParamsGUI::getErrQuiet() {
+  // no locking -- this function may get called from inside a locked
+  // section
+  return errQuiet;
+}
+
+CharCodeToUnicode *GlobalParamsGUI::getCIDToUnicode(GooString *collection) {
+  GooString *fileName;
+  CharCodeToUnicode *ctu;
+
+  lockGlobalParamsGUI;
+  if (!(ctu = cidToUnicodeCache->getCharCodeToUnicode(collection))) {
+    if ((fileName = (GooString *)cidToUnicodes->lookup(collection)) &&
+	(ctu = CharCodeToUnicode::parseCIDToUnicode(fileName, collection))) {
+      cidToUnicodeCache->add(ctu);
+    }
+  }
+  unlockGlobalParamsGUI;
+  return ctu;
+}
+
+CharCodeToUnicode *GlobalParamsGUI::getUnicodeToUnicode(GooString *fontName) {
+  CharCodeToUnicode *ctu;
+  GooHashIter *iter;
+  GooString *fontPattern, *fileName;
+
+  lockGlobalParamsGUI;
+  fileName = NULL;
+  unicodeToUnicodes->startIter(&iter);
+  while (unicodeToUnicodes->getNext(&iter, &fontPattern, (void **)&fileName)) {
+    if (strstr(fontName->getCString(), fontPattern->getCString())) {
+      unicodeToUnicodes->killIter(&iter);
+      break;
+    }
+    fileName = NULL;
+  }
+  if (fileName) {
+    if (!(ctu = unicodeToUnicodeCache->getCharCodeToUnicode(fileName))) {
+      if ((ctu = CharCodeToUnicode::parseUnicodeToUnicode(fileName))) {
+	unicodeToUnicodeCache->add(ctu);
+      }
+    }
+  } else {
+    ctu = NULL;
+  }
+  unlockGlobalParamsGUI;
+  return ctu;
+}
+
+UnicodeMap *GlobalParamsGUI::getUnicodeMap(GooString *encodingName) {
+  return getUnicodeMap2(encodingName);
+}
+
+UnicodeMap *GlobalParamsGUI::getUnicodeMap2(GooString *encodingName) {
+  UnicodeMap *map;
+
+  if (!(map = getResidentUnicodeMap(encodingName))) {
+    lockUnicodeMapCache;
+    map = unicodeMapCache->getUnicodeMap(encodingName);
+    unlockUnicodeMapCache;
+  }
+  return map;
+}
+
+CMap *GlobalParamsGUI::getCMap(GooString *collection, GooString *cMapName) {
+  CMap *cMap;
+
+  lockCMapCache;
+  cMap = cMapCache->getCMap(collection, cMapName);
+  unlockCMapCache;
+  return cMap;
+}
+
+UnicodeMap *GlobalParamsGUI::getTextEncoding() {
+  return getUnicodeMap2(textEncoding);
+}
+
+//------------------------------------------------------------------------
+// functions to set parameters
+//------------------------------------------------------------------------
+
+void GlobalParamsGUI::addDisplayFont(DisplayFontParam *param) {
+  DisplayFontParam *old;
+
+  lockGlobalParamsGUI;
+  if ((old = (DisplayFontParam *)displayFonts->remove(param->name))) {
+    delete old;
+  }
+  displayFonts->add(param->name, param);
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setPSFile(char *file) {
+  lockGlobalParamsGUI;
+  if (psFile) {
+    delete psFile;
+  }
+  psFile = new GooString(file);
+  unlockGlobalParamsGUI;
+}
+
+GBool GlobalParamsGUI::setPSPaperSize(char *size) {
+  lockGlobalParamsGUI;
+  if (!strcmp(size, "match")) {
+    psPaperWidth = psPaperHeight = -1;
+  } else if (!strcmp(size, "letter")) {
+    psPaperWidth = 612;
+    psPaperHeight = 792;
+  } else if (!strcmp(size, "legal")) {
+    psPaperWidth = 612;
+    psPaperHeight = 1008;
+  } else if (!strcmp(size, "A4")) {
+    psPaperWidth = 595;
+    psPaperHeight = 842;
+  } else if (!strcmp(size, "A3")) {
+    psPaperWidth = 842;
+    psPaperHeight = 1190;
+  } else {
+    unlockGlobalParamsGUI;
+    return gFalse;
+  }
+  psImageableLLX = psImageableLLY = 0;
+  psImageableURX = psPaperWidth;
+  psImageableURY = psPaperHeight;
+  unlockGlobalParamsGUI;
+  return gTrue;
+}
+
+void GlobalParamsGUI::setPSPaperWidth(int width) {
+  lockGlobalParamsGUI;
+  psPaperWidth = width;
+  psImageableLLX = 0;
+  psImageableURX = psPaperWidth;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setPSPaperHeight(int height) {
+  lockGlobalParamsGUI;
+  psPaperHeight = height;
+  psImageableLLY = 0;
+  psImageableURY = psPaperHeight;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setPSImageableArea(int llx, int lly, int urx, int ury) {
+  lockGlobalParamsGUI;
+  psImageableLLX = llx;
+  psImageableLLY = lly;
+  psImageableURX = urx;
+  psImageableURY = ury;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setPSCrop(GBool crop) {
+  lockGlobalParamsGUI;
+  psCrop = crop;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setPSExpandSmaller(GBool expand) {
+  lockGlobalParamsGUI;
+  psExpandSmaller = expand;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setPSShrinkLarger(GBool shrink) {
+  lockGlobalParamsGUI;
+  psShrinkLarger = shrink;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setPSCenter(GBool center) {
+  lockGlobalParamsGUI;
+  psCenter = center;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setPSDuplex(GBool duplex) {
+  lockGlobalParamsGUI;
+  psDuplex = duplex;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setPSLevel(PSLevel level) {
+  lockGlobalParamsGUI;
+  psLevel = level;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setPSEmbedType1(GBool embed) {
+  lockGlobalParamsGUI;
+  psEmbedType1 = embed;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setPSEmbedTrueType(GBool embed) {
+  lockGlobalParamsGUI;
+  psEmbedTrueType = embed;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setPSEmbedCIDPostScript(GBool embed) {
+  lockGlobalParamsGUI;
+  psEmbedCIDPostScript = embed;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setPSEmbedCIDTrueType(GBool embed) {
+  lockGlobalParamsGUI;
+  psEmbedCIDTrueType = embed;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setPSPreload(GBool preload) {
+  lockGlobalParamsGUI;
+  psPreload = preload;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setPSOPI(GBool opi) {
+  lockGlobalParamsGUI;
+  psOPI = opi;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setPSASCIIHex(GBool hex) {
+  lockGlobalParamsGUI;
+  psASCIIHex = hex;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setTextEncoding(char *encodingName) {
+  lockGlobalParamsGUI;
+  delete textEncoding;
+  textEncoding = new GooString(encodingName);
+  unlockGlobalParamsGUI;
+}
+
+GBool GlobalParamsGUI::setTextEOL(char *s) {
+  lockGlobalParamsGUI;
+  if (!strcmp(s, "unix")) {
+    textEOL = eolUnix;
+  } else if (!strcmp(s, "dos")) {
+    textEOL = eolDOS;
+  } else if (!strcmp(s, "mac")) {
+    textEOL = eolMac;
+  } else {
+    unlockGlobalParamsGUI;
+    return gFalse;
+  }
+  unlockGlobalParamsGUI;
+  return gTrue;
+}
+
+void GlobalParamsGUI::setTextPageBreaks(GBool pageBreaks) {
+  lockGlobalParamsGUI;
+  textPageBreaks = pageBreaks;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setTextKeepTinyChars(GBool keep) {
+  lockGlobalParamsGUI;
+  textKeepTinyChars = keep;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setInitialZoom(char *s) {
+  lockGlobalParamsGUI;
+  delete initialZoom;
+  initialZoom = new GooString(s);
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setContinuousView(GBool cont) {
+  lockGlobalParamsGUI;
+  continuousView = cont;
+  unlockGlobalParamsGUI;
+}
+
+GBool GlobalParamsGUI::setEnableT1lib(char *s) {
+  GBool ok;
+
+  lockGlobalParamsGUI;
+  ok = parseYesNo2(s, &enableT1lib);
+  unlockGlobalParamsGUI;
+  return ok;
+}
+
+GBool GlobalParamsGUI::setEnableFreeType(char *s) {
+  GBool ok;
+
+  lockGlobalParamsGUI;
+  ok = parseYesNo2(s, &enableFreeType);
+  unlockGlobalParamsGUI;
+  return ok;
+}
+
+GBool GlobalParamsGUI::setEnableFreeTypeHinting(char *s) {
+  GBool ok;
+  
+  lockGlobalParamsGUI;
+  ok = parseYesNo2(s, &enableFreeTypeHinting);
+  unlockGlobalParamsGUI;
+  return ok;
+}
+
+GBool GlobalParamsGUI::setAntialias(char *s) {
+  GBool ok;
+
+  lockGlobalParamsGUI;
+  ok = parseYesNo2(s, &antialias);
+  unlockGlobalParamsGUI;
+  return ok;
+}
+
+GBool GlobalParamsGUI::setVectorAntialias(char *s) {
+  GBool ok;
+
+  lockGlobalParamsGUI;
+  ok = parseYesNo2(s, &vectorAntialias);
+  unlockGlobalParamsGUI;
+  return ok;
+}
+
+void GlobalParamsGUI::setStrokeAdjust(GBool adjust)
+{
+  lockGlobalParamsGUI;
+  strokeAdjust = adjust;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setScreenType(ScreenType st)
+{
+  lockGlobalParamsGUI;
+  screenType = st;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setScreenSize(int size)
+{
+  lockGlobalParamsGUI;
+  screenSize = size;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setScreenDotRadius(int radius)
+{
+  lockGlobalParamsGUI;
+  screenDotRadius = radius;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setScreenGamma(double gamma)
+{
+  lockGlobalParamsGUI;
+  screenGamma = gamma;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setScreenBlackThreshold(double blackThreshold)
+{
+  lockGlobalParamsGUI;
+  screenBlackThreshold = blackThreshold;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setScreenWhiteThreshold(double whiteThreshold)
+{
+  lockGlobalParamsGUI;
+  screenWhiteThreshold = whiteThreshold;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setMapNumericCharNames(GBool map) {
+  lockGlobalParamsGUI;
+  mapNumericCharNames = map;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setMapUnknownCharNames(GBool map) {
+  lockGlobalParamsGUI;
+  mapUnknownCharNames = map;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setPrintCommands(GBool printCommandsA) {
+  lockGlobalParamsGUI;
+  printCommands = printCommandsA;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setProfileCommands(GBool profileCommandsA) {
+  lockGlobalParamsGUI;
+  profileCommands = profileCommandsA;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::setErrQuiet(GBool errQuietA) {
+  lockGlobalParamsGUI;
+  errQuiet = errQuietA;
+  unlockGlobalParamsGUI;
+}
+
+void GlobalParamsGUI::addSecurityHandler(XpdfSecurityHandler *handler) {
+#ifdef ENABLE_PLUGINS
+  lockGlobalParamsGUI;
+  securityHandlers->append(handler);
+  unlockGlobalParamsGUI;
+#endif
+}
+
+XpdfSecurityHandler *GlobalParamsGUI::getSecurityHandler(char *name) {
+#ifdef ENABLE_PLUGINS
+  XpdfSecurityHandler *hdlr;
+  int i;
+
+  lockGlobalParamsGUI;
+  for (i = 0; i < securityHandlers->getLength(); ++i) {
+    hdlr = (XpdfSecurityHandler *)securityHandlers->get(i);
+    if (!strcasecmp(hdlr->name, name)) {
+      unlockGlobalParamsGUI;
+      return hdlr;
+    }
+  }
+  unlockGlobalParamsGUI;
+
+  if (!loadPlugin("security", name)) {
+    return NULL;
+  }
+  deleteGooList(keyBindings, KeyBinding);
+
+  lockGlobalParamsGUI;
+  for (i = 0; i < securityHandlers->getLength(); ++i) {
+    hdlr = (XpdfSecurityHandler *)securityHandlers->get(i);
+    if (!strcmp(hdlr->name, name)) {
+      unlockGlobalParamsGUI;
+      return hdlr;
+    }
+  }
+  unlockGlobalParamsGUI;
+#else
+  (void)name;
+#endif
+
+  return NULL;
+}
+
+#ifdef ENABLE_PLUGINS
+//------------------------------------------------------------------------
+// plugins
+//------------------------------------------------------------------------
+
+GBool GlobalParamsGUI::loadPlugin(char *type, char *name) {
+  Plugin *plugin;
+
+  if (!(plugin = Plugin::load(type, name))) {
+    return gFalse;
+  }
+  lockGlobalParamsGUI;
+  plugins->append(plugin);
+  unlockGlobalParamsGUI;
+  return gTrue;
+}
+
+#endif // ENABLE_PLUGINS
Index: GlobalParamsGUI.h
===================================================================
--- /dev/null
+++ GlobalParamsGUI.h
@@ -0,0 +1,482 @@
+//========================================================================
+//
+// GlobalParamsGUI.h
+//
+// Copyright 2001-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef GLOBALPARAMSGUI_H
+#define GLOBALPARAMSGUI_H
+
+#ifdef USE_GCC_PRAGMAS
+#pragma interface
+#endif
+
+#include "config.h"
+#include <stdio.h>
+#include <fontconfig/fontconfig.h>
+#include <GlobalParams.h>
+#include "goo/gtypes.h"
+#include "CharTypes.h"
+
+#if MULTITHREADED
+#include "goo/GooMutex.h"
+#endif
+
+class GooString;
+class GooList;
+class GooHash;
+class NameToCharCode;
+class CharCodeToUnicode;
+class CharCodeToUnicodeCache;
+class UnicodeMap;
+class UnicodeMapCache;
+class CMap;
+class CMapCache;
+struct XpdfSecurityHandler;
+class GlobalParamsGUI;
+class GfxFont;
+#ifdef WIN32
+class WinFontList;
+#endif
+
+//------------------------------------------------------------------------
+
+// The global parameters object.
+extern GlobalParamsGUI *globalParamsGUI;
+
+//------------------------------------------------------------------------
+
+/*enum DisplayFontParamKind {
+  displayFontT1,
+  displayFontTT
+};
+
+struct DisplayFontParamT1 {
+  GooString *fileName;
+};
+
+struct DisplayFontParamTT {
+  GooString *fileName;
+  int faceIndex;
+};
+
+class DisplayFontParam {
+public:
+
+  GooString *name;		// font name for 8-bit fonts and named
+				//   CID fonts; collection name for
+				//   generic CID fonts
+  DisplayFontParamKind kind;
+  union {
+    DisplayFontParamT1 t1;
+    DisplayFontParamTT tt;
+  };
+
+  DisplayFontParam(GooString *nameA, DisplayFontParamKind kindA);
+  virtual ~DisplayFontParam();
+};
+
+//------------------------------------------------------------------------
+
+class PSFontParam {
+public:
+
+  GooString *pdfFontName;		// PDF font name for 8-bit fonts and
+				//   named 16-bit fonts; char collection
+				//   name for generic 16-bit fonts
+  int wMode;			// writing mode (0=horiz, 1=vert) for
+				//   16-bit fonts
+  GooString *psFontName;		// PostScript font name
+  GooString *encoding;		// encoding, for 16-bit fonts only
+
+  PSFontParam(GooString *pdfFontNameA, int wModeA,
+	      GooString *psFontNameA, GooString *encodingA);
+  ~PSFontParam();
+};*/
+
+//------------------------------------------------------------------------
+
+/*enum PSLevel {
+  psLevel1,
+  psLevel1Sep,
+  psLevel2,
+  psLevel2Sep,
+  psLevel3,
+  psLevel3Sep
+};*/
+
+//------------------------------------------------------------------------
+
+/*enum EndOfLineKind {
+  eolUnix,			// LF
+  eolDOS,			// CR+LF
+  eolMac			// CR
+};*/
+
+//------------------------------------------------------------------------
+
+/*enum ScreenType {
+  screenUnset,
+  screenDispersed,
+  screenClustered,
+  screenStochasticClustered
+};*/
+
+//------------------------------------------------------------------------
+
+class KeyBinding {
+public:
+
+  int code;			// 0x20 .. 0xfe = ASCII,
+				//   >=0x10000 = special keys, mouse buttons,
+				//   etc. (xpdfKeyCode* symbols)
+  int mods;			// modifiers (xpdfKeyMod* symbols, or-ed
+				//   together)
+  int context;			// context (xpdfKeyContext* symbols, or-ed
+				//   together)
+  GooList *cmds;			// list of commands [GooString]
+
+  KeyBinding(int codeA, int modsA, int contextA, char *cmd0);
+  KeyBinding(int codeA, int modsA, int contextA, char *cmd0, char *cmd1);
+  KeyBinding(int codeA, int modsA, int contextA, GooList *cmdsA);
+  ~KeyBinding();
+};
+
+#define xpdfKeyCodeTab            0x1000
+#define xpdfKeyCodeReturn         0x1001
+#define xpdfKeyCodeEnter          0x1002
+#define xpdfKeyCodeBackspace      0x1003
+#define xpdfKeyCodeInsert         0x1004
+#define xpdfKeyCodeDelete         0x1005
+#define xpdfKeyCodeHome           0x1006
+#define xpdfKeyCodeEnd            0x1007
+#define xpdfKeyCodePgUp           0x1008
+#define xpdfKeyCodePgDn           0x1009
+#define xpdfKeyCodeLeft           0x100a
+#define xpdfKeyCodeRight          0x100b
+#define xpdfKeyCodeUp             0x100c
+#define xpdfKeyCodeDown           0x100d
+#define xpdfKeyCodeF1             0x1100
+#define xpdfKeyCodeF35            0x1122
+#define xpdfKeyCodeAdd            0x1200
+#define xpdfKeyCodeSubtract       0x1201
+#define xpdfKeyCodeMousePress1    0x2001
+#define xpdfKeyCodeMousePress2    0x2002
+#define xpdfKeyCodeMousePress3    0x2003
+#define xpdfKeyCodeMousePress4    0x2004
+#define xpdfKeyCodeMousePress5    0x2005
+#define xpdfKeyCodeMousePress6    0x2006
+#define xpdfKeyCodeMousePress7    0x2007
+#define xpdfKeyCodeMouseRelease1  0x2101
+#define xpdfKeyCodeMouseRelease2  0x2102
+#define xpdfKeyCodeMouseRelease3  0x2103
+#define xpdfKeyCodeMouseRelease4  0x2104
+#define xpdfKeyCodeMouseRelease5  0x2105
+#define xpdfKeyCodeMouseRelease6  0x2106
+#define xpdfKeyCodeMouseRelease7  0x2107
+#define xpdfKeyModNone            0
+#define xpdfKeyModShift           (1 << 0)
+#define xpdfKeyModCtrl            (1 << 1)
+#define xpdfKeyModAlt             (1 << 2)
+#define xpdfKeyContextAny         0
+#define xpdfKeyContextFullScreen  (1 << 0)
+#define xpdfKeyContextWindow      (2 << 0)
+#define xpdfKeyContextContinuous  (1 << 2)
+#define xpdfKeyContextSinglePage  (2 << 2)
+#define xpdfKeyContextOverLink    (1 << 4)
+#define xpdfKeyContextOffLink     (2 << 4)
+#define xpdfKeyContextOutline     (1 << 6)
+#define xpdfKeyContextMainWin     (2 << 6)
+#define xpdfKeyContextScrLockOn   (1 << 8)
+#define xpdfKeyContextScrLockOff  (2 << 8)
+
+//------------------------------------------------------------------------
+
+class GlobalParamsGUI {
+public:
+
+  // Initialize the global parameters by attempting to read a config
+  // file.
+  GlobalParamsGUI(char *cfgFileName = NULL);
+
+  ~GlobalParamsGUI();
+
+  void setBaseDir(char *dir);
+  void setupBaseFonts(char *dir);
+
+  void parseLine(char *buf, GooString *fileName, int line);
+
+  //----- accessors
+
+  CharCode getMacRomanCharCode(char *charName);
+
+  GooString *getBaseDir();
+  Unicode mapNameToUnicode(char *charName);
+  UnicodeMap *getResidentUnicodeMap(GooString *encodingName);
+  FILE *getUnicodeMapFile(GooString *encodingName);
+  FILE *findCMapFile(GooString *collection, GooString *cMapName);
+  FILE *findToUnicodeFile(GooString *name);
+  DisplayFontParam *getDisplayFont(GfxFont *font);
+  DisplayFontParam *getDisplayFont(GooString *fontName);
+  DisplayFontParam *getDisplayCIDFont(GooString *fontName, GooString *collection);
+  GooString *getPSFile();
+  int getPSPaperWidth();
+  int getPSPaperHeight();
+  void getPSImageableArea(int *llx, int *lly, int *urx, int *ury);
+  GBool getPSDuplex();
+  GBool getPSCrop();
+  GBool getPSExpandSmaller();
+  GBool getPSShrinkLarger();
+  GBool getPSCenter();
+  PSLevel getPSLevel();
+  PSFontParam *getPSFont(GooString *fontName);
+  PSFontParam *getPSFont16(GooString *fontName, GooString *collection, int wMode);
+  GBool getPSEmbedType1();
+  GBool getPSEmbedTrueType();
+  GBool getPSEmbedCIDPostScript();
+  GBool getPSEmbedCIDTrueType();
+  GBool getPSPreload();
+  GBool getPSOPI();
+  GBool getPSASCIIHex();
+  GooString *getTextEncodingName();
+  EndOfLineKind getTextEOL();
+  GBool getTextPageBreaks();
+  GBool getTextKeepTinyChars();
+  GooString *findFontFile(GooString *fontName, char **exts);
+  GooString *getInitialZoom();
+  GBool getContinuousView();
+  GBool getEnableT1lib();
+  GBool getEnableFreeType();
+  GBool getEnableFreeTypeHinting();
+  GBool getAntialias();
+  GBool getVectorAntialias();
+  GBool getStrokeAdjust();
+  ScreenType getScreenType();
+  int getScreenSize();
+  int getScreenDotRadius();
+  double getScreenGamma();
+  double getScreenBlackThreshold();
+  double getScreenWhiteThreshold();
+  GooString *getURLCommand() { return urlCommand; }
+  GooString *getMovieCommand() { return movieCommand; }
+  GBool getMapNumericCharNames();
+  GBool getMapUnknownCharNames();
+  GooList *getKeyBinding(int code, int mods, int context);
+  GBool getPrintCommands();
+  GBool getProfileCommands();
+  GBool getErrQuiet();
+
+  CharCodeToUnicode *getCIDToUnicode(GooString *collection);
+  CharCodeToUnicode *getUnicodeToUnicode(GooString *fontName);
+  UnicodeMap *getUnicodeMap(GooString *encodingName);
+  CMap *getCMap(GooString *collection, GooString *cMapName);
+  UnicodeMap *getTextEncoding();
+#ifdef ENABLE_PLUGINS
+  GBool loadPlugin(char *type, char *name);
+#endif
+
+  //----- functions to set parameters
+  void addDisplayFont(DisplayFontParam *param);
+  void setPSFile(char *file);
+  GBool setPSPaperSize(char *size);
+  void setPSPaperWidth(int width);
+  void setPSPaperHeight(int height);
+  void setPSImageableArea(int llx, int lly, int urx, int ury);
+  void setPSDuplex(GBool duplex);
+  void setPSCrop(GBool crop);
+  void setPSExpandSmaller(GBool expand);
+  void setPSShrinkLarger(GBool shrink);
+  void setPSCenter(GBool center);
+  void setPSLevel(PSLevel level);
+  void setPSEmbedType1(GBool embed);
+  void setPSEmbedTrueType(GBool embed);
+  void setPSEmbedCIDPostScript(GBool embed);
+  void setPSEmbedCIDTrueType(GBool embed);
+  void setPSPreload(GBool preload);
+  void setPSOPI(GBool opi);
+  void setPSASCIIHex(GBool hex);
+  void setTextEncoding(char *encodingName);
+  GBool setTextEOL(char *s);
+  void setTextPageBreaks(GBool pageBreaks);
+  void setTextKeepTinyChars(GBool keep);
+  void setInitialZoom(char *s);
+  void setContinuousView(GBool cont);
+  GBool setEnableT1lib(char *s);
+  GBool setEnableFreeType(char *s);
+  GBool setEnableFreeTypeHinting(char *s);
+  GBool setAntialias(char *s);
+  GBool setVectorAntialias(char *s);
+  void setStrokeAdjust(GBool strokeAdjust);
+  void setScreenType(ScreenType st);
+  void setScreenSize(int size);
+  void setScreenDotRadius(int radius);
+  void setScreenGamma(double gamma);
+  void setScreenBlackThreshold(double blackThreshold);
+  void setScreenWhiteThreshold(double whiteThreshold);
+  void setMapNumericCharNames(GBool map);
+  void setMapUnknownCharNames(GBool map);
+  void setPrintCommands(GBool printCommandsA);
+  void setProfileCommands(GBool profileCommandsA);
+  void setErrQuiet(GBool errQuietA);
+
+  //----- security handlers
+
+  void addSecurityHandler(XpdfSecurityHandler *handler);
+  XpdfSecurityHandler *getSecurityHandler(char *name);
+
+  GBool parseYesNo2(char *token, GBool *flag);
+private:
+
+  void createDefaultKeyBindings();
+  void parseFile(GooString *fileName, FILE *f);
+  void parseNameToUnicode(GooList *tokens, GooString *fileName, int line);
+  void parseNameToUnicode(GooString *name);
+  void parseCIDToUnicode(GooList *tokens, GooString *fileName, int line);
+  void parseUnicodeToUnicode(GooList *tokens, GooString *fileName, int line);
+  void parseUnicodeMap(GooList *tokens, GooString *fileName, int line);
+  void parseCMapDir(GooList *tokens, GooString *fileName, int line);
+  void parseToUnicodeDir(GooList *tokens, GooString *fileName, int line);
+  void parseDisplayFont(GooList *tokens, GooHash *fontHash,
+			DisplayFontParamKind kind,
+			GooString *fileName, int line);
+  void parsePSFile(GooList *tokens, GooString *fileName, int line);
+  void parsePSPaperSize(GooList *tokens, GooString *fileName, int line);
+  void parsePSImageableArea(GooList *tokens, GooString *fileName, int line);
+  void parsePSLevel(GooList *tokens, GooString *fileName, int line);
+  void parsePSFont(GooList *tokens, GooString *fileName, int line);
+  void parsePSFont16(char *cmdName, GooList *fontList,
+		     GooList *tokens, GooString *fileName, int line);
+  void parseTextEncoding(GooList *tokens, GooString *fileName, int line);
+  void parseTextEOL(GooList *tokens, GooString *fileName, int line);
+  void parseFontDir(GooList *tokens, GooString *fileName, int line);
+  void parseInitialZoom(GooList *tokens, GooString *fileName, int line);
+  void parseScreenType(GooList *tokens, GooString *fileName, int line);
+  void parseBind(GooList *tokens, GooString *fileName, int line);
+  void parseUnbind(GooList *tokens, GooString *fileName, int line);
+  GBool parseKey(GooString *modKeyStr, GooString *contextStr,
+		 int *code, int *mods, int *context,
+		 char *cmdName,
+		 GooList *tokens, GooString *fileName, int line);
+  void parseCommand(char *cmdName, GooString **val,
+		    GooList *tokens, GooString *fileName, int line);
+  void parseYesNo(char *cmdName, GBool *flag,
+		  GooList *tokens, GooString *fileName, int line);
+  void parseInteger(char *cmdName, int *val,
+		    GooList *tokens, GooString *fileName, int line);
+  void parseFloat(char *cmdName, double *val,
+		  GooList *tokens, GooString *fileName, int line);
+  UnicodeMap *getUnicodeMap2(GooString *encodingName);
+
+  void addCIDToUnicode(GooString *collection, GooString *fileName);
+  void addUnicodeMap(GooString *encodingName, GooString *fileName);
+  void addCMapDir(GooString *collection, GooString *dir);
+
+  //----- static tables
+
+  NameToCharCode *		// mapping from char name to
+    macRomanReverseMap;		//   MacRomanEncoding index
+
+  //----- user-modifiable settings
+
+  GooString *baseDir;		// base directory - for plugins, etc.
+  NameToCharCode *		// mapping from char name to Unicode
+    nameToUnicode;
+  GooHash *cidToUnicodes;		// files for mappings from char collections
+				//   to Unicode, indexed by collection name
+				//   [GooString]
+  GooHash *unicodeToUnicodes;	// files for Unicode-to-Unicode mappings,
+				//   indexed by font name pattern [GooString]
+  GooHash *residentUnicodeMaps;	// mappings from Unicode to char codes,
+				//   indexed by encoding name [UnicodeMap]
+  GooHash *unicodeMaps;		// files for mappings from Unicode to char
+				//   codes, indexed by encoding name [GooString]
+  GooHash *cMapDirs;		// list of CMap dirs, indexed by collection
+				//   name [GooList[GooString]]
+  GooList *toUnicodeDirs;		// list of ToUnicode CMap dirs [GooString]
+  GooHash *displayFonts;		// display font info, indexed by font name
+				//   [DisplayFontParam]
+#ifdef WIN32
+  WinFontList *winFontList;	// system TrueType fonts
+#endif
+  GooHash *displayCIDFonts;	// display CID font info, indexed by
+				//   collection [DisplayFontParam]
+  GooHash *displayNamedCIDFonts;	// display CID font info, indexed by
+				//   font name [DisplayFontParam]
+  GooString *psFile;		// PostScript file or command (for xpdf)
+  int psPaperWidth;		// paper size, in PostScript points, for
+  int psPaperHeight;		//   PostScript output
+  int psImageableLLX,		// imageable area, in PostScript points,
+      psImageableLLY,		//   for PostScript output
+      psImageableURX,
+      psImageableURY;
+  GBool psCrop;			// crop PS output to CropBox
+  GBool psExpandSmaller;	// expand smaller pages to fill paper
+  GBool psShrinkLarger;		// shrink larger pages to fit paper
+  GBool psCenter;		// center pages on the paper
+  GBool psDuplex;		// enable duplexing in PostScript?
+  PSLevel psLevel;		// PostScript level to generate
+  GooHash *psFonts;		// PostScript font info, indexed by PDF
+				//   font name [PSFontParam]
+  GooList *psNamedFonts16;	// named 16-bit fonts [PSFontParam]
+  GooList *psFonts16;		// generic 16-bit fonts [PSFontParam]
+  GBool psEmbedType1;		// embed Type 1 fonts?
+  GBool psEmbedTrueType;	// embed TrueType fonts?
+  GBool psEmbedCIDPostScript;	// embed CID PostScript fonts?
+  GBool psEmbedCIDTrueType;	// embed CID TrueType fonts?
+  GBool psPreload;		// preload PostScript images and forms into
+				//   memory
+  GBool psOPI;			// generate PostScript OPI comments?
+  GBool psASCIIHex;		// use ASCIIHex instead of ASCII85?
+  GooString *textEncoding;	// encoding (unicodeMap) to use for text
+				//   output
+  EndOfLineKind textEOL;	// type of EOL marker to use for text
+				//   output
+  GBool textPageBreaks;		// insert end-of-page markers?
+  GBool textKeepTinyChars;	// keep all characters in text output
+  GooList *fontDirs;		// list of font dirs [GooString]
+  GooString *initialZoom;		// initial zoom level
+  GBool continuousView;		// continuous view mode
+  GBool enableT1lib;		// t1lib enable flag
+  GBool enableFreeType;		// FreeType enable flag
+  GBool enableFreeTypeHinting;  // FreeType hinting enable flag
+  GBool antialias;		// anti-aliasing enable flag
+  GBool vectorAntialias;	// vector anti-aliasing enable flag
+  GBool strokeAdjust;		// stroke adjustment enable flag
+  ScreenType screenType;	// halftone screen type
+  int screenSize;		// screen matrix size
+  int screenDotRadius;		// screen dot radius
+  double screenGamma;		// screen gamma correction
+  double screenBlackThreshold;	// screen black clamping threshold
+  double screenWhiteThreshold;	// screen white clamping threshold
+  GooString *urlCommand;		// command executed for URL links
+  GooString *movieCommand;	// command executed for movie annotations
+  GBool mapNumericCharNames;	// map numeric char names (from font subsets)?
+  GBool mapUnknownCharNames;	// map unknown char names?
+  GooList *keyBindings;		// key & mouse button bindings [KeyBinding]
+  GBool printCommands;		// print the drawing commands
+  GBool profileCommands;	// profile the drawing commands
+  GBool errQuiet;		// suppress error messages?
+
+  CharCodeToUnicodeCache *cidToUnicodeCache;
+  CharCodeToUnicodeCache *unicodeToUnicodeCache;
+  UnicodeMapCache *unicodeMapCache;
+  CMapCache *cMapCache;
+  
+  FcConfig *FCcfg;
+
+#ifdef ENABLE_PLUGINS
+  GooList *plugins;		// list of plugins [Plugin]
+  GooList *securityHandlers;	// list of loaded security handlers
+				//   [XpdfSecurityHandler]
+#endif
+
+#if MULTITHREADED
+  GooMutex mutex;
+  GooMutex unicodeMapCacheMutex;
+  GooMutex cMapCacheMutex;
+#endif
+};
+
+#endif
Index: Makefile
===================================================================
--- Makefile.orig
+++ Makefile
@@ -4,7 +4,7 @@ INCLUDES=$(POPPLERBASE) $(POPPLERBASE)/g
 
 CPPFLAGS+= $(INCLUDES) -DHAVE_DIRENT_H
 
-xpdf: CoreOutputDev.o GlobalParams.o ImageOutputDev.o PDFCore.o XPDFApp.o XPDFCore.o XPDFTree.o XPDFViewer.o parseargs.o xpdf.o 
+xpdf: CoreOutputDev.o GlobalParamsGUI.o ImageOutputDev.o PDFCore.o XPDFApp.o XPDFCore.o XPDFTree.o XPDFViewer.o parseargs.o xpdf.o 
 	$(CXX) $(CXXFLAGS) $(LDFLAGS) -o xpdf *.o $(LIBS)
 
 clean:
Index: PDFCore.cc
===================================================================
--- PDFCore.cc.orig
+++ PDFCore.cc
@@ -19,7 +19,7 @@
 #include <endian.h> 
 #include "GooString.h"
 #include "GooList.h"
-#include "GlobalParams.h"
+#include "GlobalParamsGUI.h"
 #include "Splash.h"
 #include "SplashBitmap.h"
 #include "SplashPattern.h"
@@ -88,7 +88,7 @@ PDFCore::PDFCore(SplashColorMode colorMo
   int i;
 
   doc = NULL;
-  continuousMode = globalParams->getContinuousView();
+  continuousMode = globalParamsGUI->getContinuousView();
   drawAreaWidth = drawAreaHeight = 0;
   maxPageW = totalDocH = 0;
   pageY = NULL;
Index: XPDFCore.cc
===================================================================
--- XPDFCore.cc.orig
+++ XPDFCore.cc
@@ -19,7 +19,7 @@
 #include "GooString.h"
 #include "GooList.h"
 #include "Error.h"
-#include "GlobalParams.h"
+#include "GlobalParamsGUI.h"
 #include "PDFDoc.h"
 #include "Link.h"
 #include "FileSpec.h"
@@ -114,7 +114,7 @@ XPDFCore::XPDFCore(Widget shellA, Widget
   if (fullScreen) {
     zoom = zoomPage;
   } else {
-    initialZoom = globalParams->getInitialZoom();
+    initialZoom = globalParamsGUI->getInitialZoom();
     if (!initialZoom->cmp("page")) {
       zoom = zoomPage;
     } else if (!initialZoom->cmp("width")) {
@@ -435,7 +435,7 @@ Boolean XPDFCore::convertSelectionCbk(Wi
     if (!(array = (Atom *)XtMalloc(sizeof(Atom)))) {
       return False;
     }
-    if (strcmp("UTF-8",globalParams->getTextEncodingName()->getCString()))
+    if (strcmp("UTF-8",globalParamsGUI->getTextEncodingName()->getCString()))
 	    array[0] = XA_STRING;
     else
 	    array[0] = utf8str;
@@ -571,7 +571,7 @@ void XPDFCore::doAction(LinkAction *acti
 
   // URI action
   case actionURI:
-    if (!(cmd = globalParams->getURLCommand())) {
+    if (!(cmd = globalParamsGUI->getURLCommand())) {
       error(-1, "No urlCommand defined in config file");
       break;
     }
@@ -608,7 +608,7 @@ void XPDFCore::doAction(LinkAction *acti
 
   // Movie action
   case actionMovie:
-    if (!(cmd = globalParams->getMovieCommand())) {
+    if (!(cmd = globalParamsGUI->getMovieCommand())) {
       error(-1, "No movieCommand defined in config file");
       break;
     }
Index: XPDFViewer.cc
===================================================================
--- XPDFViewer.cc.orig
+++ XPDFViewer.cc
@@ -30,7 +30,7 @@
 #include "GooString.h"
 #include "GooList.h"
 #include "Error.h"
-#include "GlobalParams.h"
+#include "GlobalParamsGUI.h"
 #include "PDFDoc.h"
 #include "Link.h"
 #include "ErrorCodes.h"
@@ -583,7 +583,7 @@ void XPDFViewer::keyPressCbk(void *data,
     return;
   }
 
-  if ((cmds = globalParams->getKeyBinding(keyCode,
+  if ((cmds = globalParamsGUI->getKeyBinding(keyCode,
 					  viewer->getModifiers(modifiers),
 					  viewer->getContext(modifiers)))) {
     for (i = 0; i < cmds->getLength(); ++i) {
@@ -615,7 +615,7 @@ void XPDFViewer::mouseCbk(void *data, XE
     return;
   }
 
-  if ((cmds = globalParams->getKeyBinding(keyCode,
+  if ((cmds = globalParamsGUI->getKeyBinding(keyCode,
 					  viewer->getModifiers(
 						      event->xkey.state),
 					  viewer->getContext(
@@ -2668,11 +2668,11 @@ void XPDFViewer::setupOutline() {
     // create the new labels
     items = core->getDoc()->getOutline()->getItems();
     if (items && items->getLength() > 0) {
-      if (strcmp("UTF-8",globalParams->getTextEncodingName()->getCString()))
+      if (strcmp("UTF-8",globalParamsGUI->getTextEncodingName()->getCString()))
              enc = new GooString("Latin1");
       else
              enc = new GooString("UTF-8");
-      uMap = globalParams->getUnicodeMap(enc);
+      uMap = globalParamsGUI->getUnicodeMap(enc);
       delete enc;
       setupOutlineItems(items, NULL, uMap);
       uMap->decRefCnt();
@@ -3329,7 +3329,7 @@ void XPDFViewer::initPrintDialog() {
   XtSetValues(printDialog, args, n);
 
   //----- initial values
-  if ((psFileName = globalParams->getPSFile())) {
+  if ((psFileName = globalParamsGUI->getPSFile())) {
     if (psFileName->getChar(0) == '|') {
       XmTextFieldSetString(printCmdText,
 			   psFileName->getCString() + 1);
@@ -3347,7 +3347,7 @@ void XPDFViewer::setupPrintDialog() {
   char *p;
 
   doc = core->getDoc();
-  psFileName = globalParams->getPSFile();
+  psFileName = globalParamsGUI->getPSFile();
   if (!psFileName || psFileName->getChar(0) == '|') {
     pdfFileName = doc->getFileName();
     p = pdfFileName->getCString() + pdfFileName->getLength() - 4;
@@ -3453,7 +3453,7 @@ void XPDFViewer::printPrintCbk(Widget wi
 			  firstPage, lastPage, psModePS);
   if (psOut->isOk()) {
     doc->displayPages(psOut, firstPage, lastPage, 72, 72,
-		      0, gTrue, globalParams->getPSCrop(), gTrue);
+		      0, gTrue, globalParamsGUI->getPSCrop(), gTrue);
   }
   delete psOut;
   delete psFileName;
Index: xpdf.cc
===================================================================
--- xpdf.cc.orig
+++ xpdf.cc
@@ -12,7 +12,8 @@
 #include "parseargs.h"
 #include "gfile.h"
 #include "gmem.h"
-#include "GlobalParams.h"
+#include "GlobalParamsGUI.h"
+#include <GlobalParams.h>
 #include "Object.h"
 #include "XPDFApp.h"
 #include "config.h"
@@ -26,6 +27,7 @@ static char enableT1libStr[16] = "";
 static char enableFreeTypeStr[16] = "";
 static char antialiasStr[16] = "";
 static char vectorAntialiasStr[16] = "";
+static char autohintingStr[16] = "no";
 static char psFileArg[256];
 static char paperSize[15] = "";
 static int paperWidth = 0;
@@ -78,6 +80,8 @@ static ArgDesc argDesc[] = {
    "enable font anti-aliasing: yes, no"},
   {"-aaVector",   argString,      vectorAntialiasStr, sizeof(vectorAntialiasStr),
    "enable vector anti-aliasing: yes, no"},
+  {"-ah",         argString,      autohintingStr, sizeof(autohintingStr),
+   "enable font auto-hinting: yes, no (default no)"},
   {"-ps",         argString,      psFileArg,      sizeof(psFileArg),
    "default PostScript file name or command"},
   {"-paper",      argString,      paperSize,      sizeof(paperSize),
@@ -153,63 +157,71 @@ int main(int argc, char *argv[]) {
     goto done0;
   }
 
+  // poppler's globalParams
+  globalParams = new GlobalParams;
+
   // read config file
-  globalParams = new GlobalParams(cfgFileName);
-  globalParams->setupBaseFonts(NULL);
+  globalParamsGUI = new GlobalParamsGUI(cfgFileName);
+  globalParamsGUI->setupBaseFonts(NULL);
   if (contView) {
-    globalParams->setContinuousView(contView);
+    globalParamsGUI->setContinuousView(contView);
   }
   if (psFileArg[0]) {
-    globalParams->setPSFile(psFileArg);
+    globalParamsGUI->setPSFile(psFileArg);
   }
   if (paperSize[0]) {
-    if (!globalParams->setPSPaperSize(paperSize)) {
+    if (!globalParamsGUI->setPSPaperSize(paperSize)) {
       fprintf(stderr, "Invalid paper size\n");
     }
   } else {
     if (paperWidth) {
-      globalParams->setPSPaperWidth(paperWidth);
+      globalParamsGUI->setPSPaperWidth(paperWidth);
     }
     if (paperHeight) {
-      globalParams->setPSPaperHeight(paperHeight);
+      globalParamsGUI->setPSPaperHeight(paperHeight);
     }
   }
   if (level1) {
-    globalParams->setPSLevel(psLevel1);
+    globalParamsGUI->setPSLevel(psLevel1);
   }
   if (textEncName[0]) {
-    globalParams->setTextEncoding(textEncName);
+    globalParamsGUI->setTextEncoding(textEncName);
   }
   if (textEOL[0]) {
-    if (!globalParams->setTextEOL(textEOL)) {
+    if (!globalParamsGUI->setTextEOL(textEOL)) {
       fprintf(stderr, "Bad '-eol' value on command line\n");
     }
   }
   if (enableT1libStr[0]) {
-    if (!globalParams->setEnableT1lib(enableT1libStr)) {
+    if (!globalParamsGUI->setEnableT1lib(enableT1libStr)) {
       fprintf(stderr, "Bad '-t1lib' value on command line\n");
     }
   }
   if (enableFreeTypeStr[0]) {
-    if (!globalParams->setEnableFreeType(enableFreeTypeStr)) {
+    if (!globalParamsGUI->setEnableFreeType(enableFreeTypeStr)) {
       fprintf(stderr, "Bad '-freetype' value on command line\n");
     }
   }
   if (antialiasStr[0]) {
-    if (!globalParams->setAntialias(antialiasStr)) {
+    if (!globalParamsGUI->setAntialias(antialiasStr)) {
       fprintf(stderr, "Bad '-aa' value on command line\n");
     }
   }
   if (vectorAntialiasStr[0]) {
-    if (!globalParams->setVectorAntialias(vectorAntialiasStr)) {
+    if (!globalParamsGUI->setVectorAntialias(vectorAntialiasStr)) {
       fprintf(stderr, "Bad '-aaVector' value on command line\n");
     }
   }
+  if (autohintingStr[0]) {
+    if (!globalParamsGUI->setEnableFreeTypeHinting(autohintingStr)) {
+      fprintf(stderr, "Bad '-ah' value on command line\n");
+    }
+  }
   if (printCommands) {
-    globalParams->setPrintCommands(printCommands);
+    globalParamsGUI->setPrintCommands(printCommands);
   }
   if (quiet) {
-    globalParams->setErrQuiet(quiet);
+    globalParamsGUI->setErrQuiet(quiet);
   }
 
   // create the XPDFApp object
@@ -218,7 +230,7 @@ int main(int argc, char *argv[]) {
   // the initialZoom parameter can be set in either the config file or
   // as an X resource (or command line arg)
   if (app->getInitialZoom()) {
-    globalParams->setInitialZoom(app->getInitialZoom()->getCString());
+    globalParamsGUI->setInitialZoom(app->getInitialZoom()->getCString());
   }
 
   // check command line
@@ -333,6 +345,7 @@ int main(int argc, char *argv[]) {
   }
  done1:
   delete app;
+  delete globalParamsGUI;
   delete globalParams;
 
   // check for memory leaks
Index: CoreOutputDev.cc
===================================================================
--- CoreOutputDev.cc.orig
+++ CoreOutputDev.cc
@@ -15,6 +15,7 @@
 #include "Object.h"
 #include "TextOutputDev.h"
 #include "CoreOutputDev.h"
+#include "GlobalParamsGUI.h"
 
 //------------------------------------------------------------------------
 // CoreOutputDev
@@ -30,6 +31,8 @@ CoreOutputDev::CoreOutputDev(SplashColor
   incrementalUpdate = incrementalUpdateA;
   redrawCbk = redrawCbkA;
   redrawCbkData = redrawCbkDataA;
+
+  setFreeTypeHinting(globalParamsGUI->getEnableFreeTypeHinting());
 }
 
 CoreOutputDev::~CoreOutputDev() {
openSUSE Build Service is sponsored by