]> www.fi.muni.cz Git - evince.git/commitdiff
Import of Xpdf 2.00 for merge XPDF_2_00
authorMartin Kretzschmar <mkretzschmar@src.gnome.org>
Mon, 31 Mar 2003 16:45:09 +0000 (16:45 +0000)
committerMartin Kretzschmar <mkretzschmar@src.gnome.org>
Mon, 31 Mar 2003 16:45:09 +0000 (16:45 +0000)
37 files changed:
pdf/goo/GHash.cc
pdf/goo/GHash.h
pdf/goo/GList.cc
pdf/goo/GList.h
pdf/xpdf/Annot.cc
pdf/xpdf/Annot.h
pdf/xpdf/BuiltinFont.cc
pdf/xpdf/BuiltinFont.h
pdf/xpdf/BuiltinFontTables.cc
pdf/xpdf/CMap.cc
pdf/xpdf/CMap.h
pdf/xpdf/CharCodeToUnicode.cc
pdf/xpdf/CharCodeToUnicode.h
pdf/xpdf/Decrypt.cc
pdf/xpdf/Decrypt.h
pdf/xpdf/FTFont.cc
pdf/xpdf/FTFont.h
pdf/xpdf/FontFile.cc
pdf/xpdf/FontFile.h
pdf/xpdf/Function.cc
pdf/xpdf/Function.h
pdf/xpdf/GlobalParams.cc
pdf/xpdf/GlobalParams.h
pdf/xpdf/NameToCharCode.cc
pdf/xpdf/NameToCharCode.h
pdf/xpdf/NameToUnicodeTable.h
pdf/xpdf/PSTokenizer.cc
pdf/xpdf/PSTokenizer.h
pdf/xpdf/SFont.cc
pdf/xpdf/SFont.h
pdf/xpdf/T1Font.cc
pdf/xpdf/T1Font.h
pdf/xpdf/TTFont.cc
pdf/xpdf/TTFont.h
pdf/xpdf/UnicodeMap.cc
pdf/xpdf/UnicodeMap.h
pdf/xpdf/pdffonts.cc

index dc09f717c6607535cb1e700bff875d5e38bfa148..dfab92607a564d0d4303afbf3a4b394e51faf40c 100644 (file)
@@ -6,11 +6,12 @@
 //
 //========================================================================
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma implementation
 #endif
 
-#include <aconf.h>
 #include "gmem.h"
 #include "GString.h"
 #include "GHash.h"
index 91d970068da38be2e09cad33585b59edf18396cf..8d73f3bbf38ead84220daa9e8c0a1b2f0795025c 100644 (file)
@@ -9,7 +9,9 @@
 #ifndef GHASH_H
 #define GHASH_H
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma interface
 #endif
 
index f52bc26267406bae90e6a13444ca2519d289a35e..accd73dcfd44dd71822ba6201c35a0111ce1a302 100644 (file)
@@ -6,11 +6,12 @@
 //
 //========================================================================
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma implementation
 #endif
 
-#include <aconf.h>
 #include <string.h>
 #include "gmem.h"
 #include "GList.h"
index 0ef4fd78168905cb557c4dead52422bd6042f498..6a610ed1295dad4046327d4a11b5df431e276147 100644 (file)
@@ -9,7 +9,9 @@
 #ifndef GLIST_H
 #define GLIST_H
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma interface
 #endif
 
index b9c606f4d47c305aee429846167dbee438073daf..8ebf6a0c088fdfe817340a5be19fa814b25fd8b9 100644 (file)
@@ -6,11 +6,12 @@
 //
 //========================================================================
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma implementation
 #endif
 
-#include <aconf.h>
 #include "gmem.h"
 #include "Object.h"
 #include "Gfx.h"
index 4113a0bd59609fb1c6751ce15ebaf4657bdcfbd5..731fa8a5844a9fbec433a67f27aab6da5bc83450 100644 (file)
@@ -9,7 +9,9 @@
 #ifndef ANNOT_H
 #define ANNOT_H
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma interface
 #endif
 
index 1b070646fd8323e864a0e5bbd6af1395a5c835c6..a504b4c31790edbc7a8b8c4db6159c6b28b6466d 100644 (file)
@@ -6,11 +6,12 @@
 //
 //========================================================================
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma implementation
 #endif
 
-#include <aconf.h>
 #include <stdlib.h>
 #include <string.h>
 #include "gmem.h"
index a795311510a29498333ba04f277c80006ff32486..69d2e75d1a93230ea4f111960be3534324e18b35 100644 (file)
@@ -9,7 +9,9 @@
 #ifndef BUILTINFONT_H
 #define BUILTINFONT_H
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma interface
 #endif
 
index 845abcd3a9043977319063f462d9ab1cede121d9..e2acfef8a46a59bcdd6639df62dd959def16f3c4 100644 (file)
@@ -1448,6 +1448,7 @@ static BuiltinFontWidth helveticaBoldWidthsTab[] = {
   { "ydieresis",                         556, NULL },
   { "Ccedilla",                          722, NULL },
   { "tilde",                             333, NULL },
+  { "dbldaggerumlaut",                   556, NULL },
   { "at",                                975, NULL },
   { "eacute",                            556, NULL },
   { "underscore",                        556, NULL },
@@ -3346,7 +3347,7 @@ void initBuiltinFontTables() {
   builtinFonts[2].widths = new BuiltinFontWidths(courierBoldObliqueWidthsTab, 260);
   builtinFonts[3].widths = new BuiltinFontWidths(courierObliqueWidthsTab, 260);
   builtinFonts[4].widths = new BuiltinFontWidths(helveticaWidthsTab, 228);
-  builtinFonts[5].widths = new BuiltinFontWidths(helveticaBoldWidthsTab, 228);
+  builtinFonts[5].widths = new BuiltinFontWidths(helveticaBoldWidthsTab, 229);
   builtinFonts[6].widths = new BuiltinFontWidths(helveticaBoldObliqueWidthsTab, 228);
   builtinFonts[7].widths = new BuiltinFontWidths(helveticaObliqueWidthsTab, 228);
   builtinFonts[8].widths = new BuiltinFontWidths(symbolWidthsTab, 189);
index b49cffdc2bbe5f9782927e3970ac1c2a9b45d524..b00021835342d1736b41e41d574023e42ec4bbe1 100644 (file)
@@ -6,11 +6,12 @@
 //
 //========================================================================
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma implementation
 #endif
 
-#include <aconf.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
index fe49acf70fdc879fec86ee4362d8d6bbbbf9d369..ce926baf3f54c7535b8ba12c4ea392975c5d8228 100644 (file)
@@ -9,7 +9,9 @@
 #ifndef CMAP_H
 #define CMAP_H
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma interface
 #endif
 
index 912981e99e96f6562ad9a53c77aef56e043457a5..f61d4007d866cabb025457d4d4cd2d4637ab8be7 100644 (file)
@@ -6,11 +6,12 @@
 //
 //========================================================================
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma implementation
 #endif
 
-#include <aconf.h>
 #include <stdio.h>
 #include <string.h>
 #include "gmem.h"
@@ -85,6 +86,7 @@ CharCodeToUnicode *CharCodeToUnicode::parseCIDToUnicode(GString *collectionA) {
     }
     ++mapLenA;
   }
+  fclose(f);
 
   ctu = new CharCodeToUnicode(collectionA->copy(), mapA, mapLenA, gTrue,
                              NULL, 0);
index 06916c8fabf98937a4a6fe3d7dbb2858aa234863..9cbd2a96b4da69ca5268e6441fafacba8ca73ea4 100644 (file)
@@ -11,7 +11,9 @@
 #ifndef CHARCODETOUNICODE_H
 #define CHARCODETOUNICODE_H
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma interface
 #endif
 
index 8de40911a0e192366ac2e9e891521b5cce0278ae..bb3e3f1f6ef06be5d33e088a33564af4631651ed 100644 (file)
@@ -6,11 +6,12 @@
 //
 //========================================================================
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma implementation
 #endif
 
-#include <aconf.h>
 #include "gmem.h"
 #include "Decrypt.h"
 
@@ -65,11 +66,12 @@ GBool Decrypt::makeFileKey(int encVersion, int encRevision, int keyLength,
                           int permissions, GString *fileID,
                           GString *ownerPassword, GString *userPassword,
                           Guchar *fileKey, GBool *ownerPasswordOk) {
-  Guchar test[32];
+  Guchar test[32], test2[32];
   GString *userPassword2;
   Guchar fState[256];
+  Guchar tmpKey[16];
   Guchar fx, fy;
-  int len, i;
+  int len, i, j;
 
   // try using the supplied owner password to generate the user password
   if (ownerPassword) {
@@ -89,12 +91,26 @@ GBool Decrypt::makeFileKey(int encVersion, int encRevision, int keyLength,
       md5(test, 16, test);
     }
   }
-  rc4InitKey(test, keyLength, fState);
-  fx = fy = 0;
-  for (i = 0; i < 32; ++i) {
-    test[i] = rc4DecryptByte(fState, &fx, &fy, ownerKey->getChar(i));
+  if (encRevision == 2) {
+    rc4InitKey(test, keyLength, fState);
+    fx = fy = 0;
+    for (i = 0; i < 32; ++i) {
+      test2[i] = rc4DecryptByte(fState, &fx, &fy, ownerKey->getChar(i));
+    }
+  } else {
+    memcpy(test2, ownerKey->getCString(), 32);
+    for (i = 19; i >= 0; --i) {
+      for (j = 0; j < keyLength; ++j) {
+       tmpKey[j] = test[j] ^ i;
+      }
+      rc4InitKey(tmpKey, keyLength, fState);
+      fx = fy = 0;
+      for (j = 0; j < 32; ++j) {
+       test2[j] = rc4DecryptByte(fState, &fx, &fy, test2[j]);
+      }
+    }
   }
-  userPassword2 = new GString((char *)test, 32);
+  userPassword2 = new GString((char *)test2, 32);
   if (makeFileKey2(encVersion, encRevision, keyLength, ownerKey, userKey,
                   permissions, fileID, userPassword2, fileKey)) {
     *ownerPasswordOk = gTrue;
@@ -143,7 +159,7 @@ GBool Decrypt::makeFileKey2(int encVersion, int encRevision, int keyLength,
   md5(buf, 68 + fileID->getLength(), fileKey);
   if (encRevision == 3) {
     for (i = 0; i < 50; ++i) {
-      md5(fileKey, 16, fileKey);
+      md5(fileKey, keyLength, fileKey);
     }
   }
 
index 52afb2f6036d118c75151e21fc17404f687ff7ab..903ee12b1b0439e28850b1e1913a623a7eff8131 100644 (file)
@@ -9,7 +9,9 @@
 #ifndef DECRYPT_H
 #define DECRYPT_H
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma interface
 #endif
 
index 0524c7edc135c4d057bc3e0e9e846572420334cf..8de09e0e61046f3cbe482c375b6ce8b7c6047143 100644 (file)
@@ -6,14 +6,14 @@
 //
 //========================================================================
 
-#ifdef __GNUC__
-#pragma implementation
-#endif
-
 #include <aconf.h>
 
 #if FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
 
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
 #include <math.h>
 #include <string.h>
 #include "gmem.h"
@@ -261,15 +261,11 @@ FTFont::FTFont(FTFontFile *fontFileA, double *m) {
     yMax = (int)(1.2 * size);
   }
   // this should be (max - min + 1), but we add some padding to
-  // deal with rounding errors
+  // deal with rounding errors, bogus bboxes, etc.
   glyphW = xMax - xMin + 3;
+  glyphW += glyphW >> 1;
   glyphH = yMax - yMin + 3;
-  // another kludge: some CJK TT fonts have bogus bboxes, so add more
-  // padding
-  if (face->num_glyphs > 1000) {
-    glyphW += glyphW >> 1;
-    glyphH += glyphH >> 1;
-  }
+  glyphH += glyphH >> 1;
   if (engine->aa) {
     glyphSize = glyphW * glyphH;
   } else {
@@ -444,9 +440,9 @@ Guchar *FTFont::getGlyphPixmap(CharCode c, Unicode u,
                               int *x, int *y, int *w, int *h) {
   FT_GlyphSlot slot;
   FT_UInt idx;
-  int gSize;
+  int rowSize;
   int i, j, k;
-  Guchar *ret;
+  Guchar *ret, *p, *q;
 
   // check the cache
   i = (c & (cacheSets - 1)) * cacheAssoc;
@@ -516,12 +512,16 @@ Guchar *FTFont::getGlyphPixmap(CharCode c, Unicode u,
       cacheTags[i+j].w = *w;
       cacheTags[i+j].h = *h;
       if (fontFile->engine->aa) {
-       gSize = *w * *h;
+       rowSize = *w;
       } else {
-       gSize = ((*w + 7) >> 3) * *h;
+       rowSize = (*w + 7) >> 3;
       }
       ret = cache + (i+j) * glyphSize;
-      memcpy(ret, slot->bitmap.buffer, gSize);
+      for (k = 0, p = ret, q = slot->bitmap.buffer;
+          k < slot->bitmap.rows;
+          ++k, p += rowSize, q += slot->bitmap.pitch) {
+       memcpy(p, q, rowSize);
+      }
     } else {
       ++cacheTags[i+j].mru;
     }
index 4894a3168ddebde95b6fe074b6740d22a96c1143..02c257ada6e02b6d5adf1d98ea06507240ee8709 100644 (file)
 #ifndef FTFONT_H
 #define FTFONT_H
 
+#include <aconf.h>
+
 #if FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
 
-#ifdef __GNUC__
+#ifdef USE_GCC_PRAGMAS
 #pragma interface
 #endif
 
index ae585470d696089d2942cb06637a1d65a8ad9787..74769096011090880ca9b331c2be6a018ec6e2b7 100644 (file)
@@ -6,14 +6,16 @@
 //
 //========================================================================
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma implementation
 #endif
 
-#include <aconf.h>
 #include <math.h>
 #include <stdlib.h>
 #include <stddef.h>
+#include <stdarg.h>
 #include <string.h>
 #include <ctype.h>
 #include "gmem.h"
@@ -344,10 +346,11 @@ void Type1CFontFile::readNameAndEncoding() {
   }
 }
 
-void Type1CFontFile::convertToType1(FILE *outA) {
+void Type1CFontFile::convertToType1(FontFileOutputFunc outputFuncA,
+                                   void *outputStreamA) {
   Type1CTopDict dict;
   Type1CPrivateDict privateDict;
-  char buf[256], eBuf[256];
+  char buf[512], eBuf[256];
   Guchar *idxPtr0, *idxPtr1, *subrsIdxPtr, *charStringsIdxPtr, *ptr;
   int nGlyphs, nCodes, nRanges, nLeft, nSups;
   Gushort *glyphNames;
@@ -355,7 +358,8 @@ void Type1CFontFile::convertToType1(FILE *outA) {
   int c, sid;
   int i, j, n;
 
-  out = outA;
+  outputFunc = outputFuncA;
+  outputStream = outputStreamA;
 
   // read top dict (first font only)
   readTopDict(&dict);
@@ -364,54 +368,81 @@ void Type1CFontFile::convertToType1(FILE *outA) {
   //~ ... global subrs are unimplemented
 
   // write header and font dictionary, up to encoding
-  fprintf(out, "%%!FontType1-1.0: %s", name->getCString());
+  (*outputFunc)(outputStream, "%!FontType1-1.0: ", 17);
+  (*outputFunc)(outputStream, name->getCString(), name->getLength());
   if (dict.version != 0) {
-    fprintf(out, "%s", getString(dict.version, buf));
+    getString(dict.version, buf);
+    (*outputFunc)(outputStream, buf, strlen(buf));
   }
-  fprintf(out, "\n");
-  fprintf(out, "11 dict begin\n");
-  fprintf(out, "/FontInfo 10 dict dup begin\n");
+  (*outputFunc)(outputStream, "\n", 1);
+  (*outputFunc)(outputStream, "11 dict begin\n", 14);
+  (*outputFunc)(outputStream, "/FontInfo 10 dict dup begin\n", 28);
   if (dict.version != 0) {
-    fprintf(out, "/version (%s) readonly def\n",
-           getString(dict.version, buf));
+    (*outputFunc)(outputStream, "/version (", 10);
+    (*outputFunc)(outputStream, buf, strlen(buf));
+    (*outputFunc)(outputStream, ") readonly def\n", 15);
   }
   if (dict.notice != 0) {
-    fprintf(out, "/Notice (%s) readonly def\n",
-           getString(dict.notice, buf));
+    getString(dict.notice, buf);
+    (*outputFunc)(outputStream, "/Notice (", 9);
+    (*outputFunc)(outputStream, buf, strlen(buf));
+    (*outputFunc)(outputStream, ") readonly def\n", 15);
   }
   if (dict.copyright != 0) {
-    fprintf(out, "/Copyright (%s) readonly def\n",
-           getString(dict.copyright, buf));
+    getString(dict.copyright, buf);
+    (*outputFunc)(outputStream, "/Copyright (", 12);
+    (*outputFunc)(outputStream, buf, strlen(buf));
+    (*outputFunc)(outputStream, ") readonly def\n", 15);
   }
   if (dict.fullName != 0) {
-    fprintf(out, "/FullName (%s) readonly def\n",
-           getString(dict.fullName, buf));
+    getString(dict.fullName, buf);
+    (*outputFunc)(outputStream, "/FullName (", 11);
+    (*outputFunc)(outputStream, buf, strlen(buf));
+    (*outputFunc)(outputStream, ") readonly def\n", 15);
   }
   if (dict.familyName != 0) {
-    fprintf(out, "/FamilyName (%s) readonly def\n",
-           getString(dict.familyName, buf));
+    getString(dict.familyName, buf);
+    (*outputFunc)(outputStream, "/FamilyName (", 13);
+    (*outputFunc)(outputStream, buf, strlen(buf));
+    (*outputFunc)(outputStream, ") readonly def\n", 15);
   }
   if (dict.weight != 0) {
-    fprintf(out, "/Weight (%s) readonly def\n",
-           getString(dict.weight, buf));
-  }
-  fprintf(out, "/isFixedPitch %s def\n", dict.isFixedPitch ? "true" : "false");
-  fprintf(out, "/ItalicAngle %g def\n", dict.italicAngle);
-  fprintf(out, "/UnderlinePosition %g def\n", dict.underlinePosition);
-  fprintf(out, "/UnderlineThickness %g def\n", dict.underlineThickness);
-  fprintf(out, "end readonly def\n");
-  fprintf(out, "/FontName /%s def\n", name->getCString());
-  fprintf(out, "/PaintType %d def\n", dict.paintType);
-  fprintf(out, "/FontType 1 def\n");
-  fprintf(out, "/FontMatrix [%g %g %g %g %g %g] readonly def\n",
+    getString(dict.weight, buf);
+    (*outputFunc)(outputStream, "/Weight (", 9);
+    (*outputFunc)(outputStream, buf, strlen(buf));
+    (*outputFunc)(outputStream, ") readonly def\n", 15);
+  }
+  if (dict.isFixedPitch) {
+    (*outputFunc)(outputStream, "/isFixedPitch true def\n", 23);
+  } else {
+    (*outputFunc)(outputStream, "/isFixedPitch false def\n", 24);
+  }
+  sprintf(buf, "/ItalicAngle %g def\n", dict.italicAngle);
+  (*outputFunc)(outputStream, buf, strlen(buf));
+  sprintf(buf, "/UnderlinePosition %g def\n", dict.underlinePosition);
+  (*outputFunc)(outputStream, buf, strlen(buf));
+  sprintf(buf, "/UnderlineThickness %g def\n", dict.underlineThickness);
+  (*outputFunc)(outputStream, buf, strlen(buf));
+  (*outputFunc)(outputStream, "end readonly def\n", 17);
+  (*outputFunc)(outputStream, "/FontName /", 11);
+  (*outputFunc)(outputStream, name->getCString(), name->getLength());
+  (*outputFunc)(outputStream, " def\n", 5);
+  sprintf(buf, "/PaintType %d def\n", dict.paintType);
+  (*outputFunc)(outputStream, buf, strlen(buf));
+  (*outputFunc)(outputStream, "/FontType 1 def\n", 16);
+  sprintf(buf, "/FontMatrix [%g %g %g %g %g %g] readonly def\n",
          dict.fontMatrix[0], dict.fontMatrix[1], dict.fontMatrix[2],
          dict.fontMatrix[3], dict.fontMatrix[4], dict.fontMatrix[5]);
-  fprintf(out, "/FontBBox [%g %g %g %g] readonly def\n",
+  (*outputFunc)(outputStream, buf, strlen(buf));
+  sprintf(buf, "/FontBBox [%g %g %g %g] readonly def\n",
          dict.fontBBox[0], dict.fontBBox[1],
          dict.fontBBox[2], dict.fontBBox[3]);
-  fprintf(out, "/StrokeWidth %g def\n", dict.strokeWidth);
+  (*outputFunc)(outputStream, buf, strlen(buf));
+  sprintf(buf, "/StrokeWidth %g def\n", dict.strokeWidth);
+  (*outputFunc)(outputStream, buf, strlen(buf));
   if (dict.uniqueID != 0) {
-    fprintf(out, "/UniqueID %d def\n", dict.uniqueID);
+    sprintf(buf, "/UniqueID %d def\n", dict.uniqueID);
+    (*outputFunc)(outputStream, buf, strlen(buf));
   }
 
   // get number of glyphs from charstrings index
@@ -421,16 +452,18 @@ void Type1CFontFile::convertToType1(FILE *outA) {
   glyphNames = readCharset(dict.charset, nGlyphs);
 
   // read encoding (glyph -> code mapping), write Type 1 encoding
-  fprintf(out, "/Encoding ");
+  (*outputFunc)(outputStream, "/Encoding ", 10);
   if (dict.encoding == 0) {
-    fprintf(out, "StandardEncoding def\n");
+    (*outputFunc)(outputStream, "StandardEncoding def\n", 21);
   } else {
-    fprintf(out, "256 array\n");
-    fprintf(out, "0 1 255 {1 index exch /.notdef put} for\n");
+    (*outputFunc)(outputStream, "256 array\n", 10);
+    (*outputFunc)(outputStream,
+                 "0 1 255 {1 index exch /.notdef put} for\n", 40);
     if (dict.encoding == 1) {
       for (i = 0; i < 256; ++i) {
        if (expertEncoding[i]) {
-         fprintf(out, "dup %d /%s put\n", i, expertEncoding[i]);
+         sprintf(buf, "dup %d /%s put\n", i, expertEncoding[i]);
+         (*outputFunc)(outputStream, buf, strlen(buf));
        }
       }
     } else {
@@ -443,8 +476,11 @@ void Type1CFontFile::convertToType1(FILE *outA) {
        }
        for (i = 1; i < nCodes; ++i) {
          c = *ptr++;
-         fprintf(out, "dup %d /%s put\n",
-                 c, getString(glyphNames[i], buf));
+         sprintf(buf, "dup %d /", c);
+         (*outputFunc)(outputStream, buf, strlen(buf));
+         getString(glyphNames[i], buf);
+         (*outputFunc)(outputStream, buf, strlen(buf));
+         (*outputFunc)(outputStream, " put\n", 5);
        }
       } else if ((encFormat & 0x7f) == 1) {
        nRanges = *ptr++;
@@ -453,8 +489,11 @@ void Type1CFontFile::convertToType1(FILE *outA) {
          c = *ptr++;
          nLeft = *ptr++;
          for (j = 0; j <= nLeft && nCodes < nGlyphs; ++j) {
-           fprintf(out, "dup %d /%s put\n",
-                   c, getString(glyphNames[nCodes], buf));
+           sprintf(buf, "dup %d /", c);
+           (*outputFunc)(outputStream, buf, strlen(buf));
+           getString(glyphNames[nCodes], buf);
+           (*outputFunc)(outputStream, buf, strlen(buf));
+           (*outputFunc)(outputStream, " put\n", 5);
            ++nCodes;
            ++c;
          }
@@ -466,16 +505,20 @@ void Type1CFontFile::convertToType1(FILE *outA) {
          c = *ptr++;
          sid = getWord(ptr, 2);
          ptr += 2;
-         fprintf(out, "dup %d /%s put\n", c, getString(sid, buf));
+         sprintf(buf, "dup %d /", c);
+         (*outputFunc)(outputStream, buf, strlen(buf));
+         getString(sid, buf);
+         (*outputFunc)(outputStream, buf, strlen(buf));
+         (*outputFunc)(outputStream, " put\n", 5);
        }
       }
     }
-    fprintf(out, "readonly def\n");
+    (*outputFunc)(outputStream, "readonly def\n", 13);
   }
-  fprintf(out, "currentdict end\n");
+  (*outputFunc)(outputStream, "currentdict end\n", 16);
 
   // start the binary section
-  fprintf(out, "currentfile eexec\n");
+  (*outputFunc)(outputStream, "currentfile eexec\n", 18);
   r1 = 55665;
   line = 0;
 
@@ -538,12 +581,12 @@ void Type1CFontFile::convertToType1(FILE *outA) {
 
   // trailer
   if (line > 0) {
-    fputc('\n', out);
+    (*outputFunc)(outputStream, "\n", 1);
   }
   for (i = 0; i < 8; ++i) {
-    fprintf(out, "0000000000000000000000000000000000000000000000000000000000000000\n");
+    (*outputFunc)(outputStream, "0000000000000000000000000000000000000000000000000000000000000000\n", 65);
   }
-  fprintf(out, "cleartomark\n");
+  (*outputFunc)(outputStream, "cleartomark\n", 12);
 
   // clean up
   delete privateDict.dictData;
@@ -552,7 +595,9 @@ void Type1CFontFile::convertToType1(FILE *outA) {
   }
 }
 
-void Type1CFontFile::convertToCIDType0(char *psName, FILE *outA) {
+void Type1CFontFile::convertToCIDType0(char *psName,
+                                      FontFileOutputFunc outputFuncA,
+                                      void *outputStreamA) {
   Type1CTopDict dict;
   Type1CPrivateDict *privateDicts;
   GString *charStrings;
@@ -561,7 +606,7 @@ void Type1CFontFile::convertToCIDType0(char *psName, FILE *outA) {
   int *cidMap;
   Guchar *fdSelect;
   Guchar *charStringsIdxPtr, *fdArrayIdx, *idxPtr0, *idxPtr1, *ptr;
-  char buf[256];
+  char buf[512], buf2[16];
   int nGlyphs, nCIDs, gdBytes, nFDs;
   int fdSelectFmt, nRanges, gid0, gid1, fd, offset;
   int key;
@@ -569,9 +614,10 @@ void Type1CFontFile::convertToCIDType0(char *psName, FILE *outA) {
   GBool isFP;
   int i, j, k, n;
 
-  out = outA;
+  outputFunc = outputFuncA;
+  outputStream = outputStreamA;
 
-  fprintf(out, "/CIDInit /ProcSet findresource begin\n");
+  (*outputFunc)(outputStream, "/CIDInit /ProcSet findresource begin\n", 37);
 
   // read top dict (first font only)
   readTopDict(&dict);
@@ -718,65 +764,84 @@ void Type1CFontFile::convertToCIDType0(char *psName, FILE *outA) {
   }
 
   // begin the font dictionary
-  fprintf(out, "20 dict begin\n");
-  fprintf(out, "/CIDFontName /%s def\n", psName);
-  fprintf(out, "/CIDFontType 0 def\n");
-  fprintf(out, "/CIDSystemInfo 3 dict dup begin\n");
+  (*outputFunc)(outputStream, "20 dict begin\n", 14);
+  (*outputFunc)(outputStream, "/CIDFontName /", 14);
+  (*outputFunc)(outputStream, psName, strlen(psName));
+  (*outputFunc)(outputStream, " def\n", 5);
+  (*outputFunc)(outputStream, "/CIDFontType 0 def\n", 19);
+  (*outputFunc)(outputStream, "/CIDSystemInfo 3 dict dup begin\n", 32);
   if (dict.registry > 0 && dict.ordering > 0) {
-    fprintf(out, "  /Registry (%s) def\n", getString(dict.registry, buf));
-    fprintf(out, "  /Ordering (%s) def\n", getString(dict.ordering, buf));
+    getString(dict.registry, buf);
+    (*outputFunc)(outputStream, "  /Registry (", 13);
+    (*outputFunc)(outputStream, buf, strlen(buf));
+    (*outputFunc)(outputStream, ") def\n", 6);
+    getString(dict.ordering, buf);
+    (*outputFunc)(outputStream, "  /Ordering (", 13);
+    (*outputFunc)(outputStream, buf, strlen(buf));
+    (*outputFunc)(outputStream, ") def\n", 6);
   } else {
-    fprintf(out, "  /Registry (Adobe) def\n");
-    fprintf(out, "  /Ordering (Identity) def\n");
+    (*outputFunc)(outputStream, "  /Registry (Adobe) def\n", 24);
+    (*outputFunc)(outputStream, "  /Ordering (Identity) def\n", 27);
   }
-  fprintf(out, "  /Supplement %d def\n", dict.supplement);
-  fprintf(out, "end def\n");
-  fprintf(out, "/FontMatrix [%g %g %g %g %g %g] def\n",
+  sprintf(buf, "  /Supplement %d def\n", dict.supplement);
+  (*outputFunc)(outputStream, buf, strlen(buf));
+  (*outputFunc)(outputStream, "end def\n", 8);
+  sprintf(buf, "/FontMatrix [%g %g %g %g %g %g] def\n",
          dict.fontMatrix[0], dict.fontMatrix[1], dict.fontMatrix[2],
          dict.fontMatrix[3], dict.fontMatrix[4], dict.fontMatrix[5]);
-  fprintf(out, "/FontBBox [%g %g %g %g] def\n",
+  (*outputFunc)(outputStream, buf, strlen(buf));
+  sprintf(buf, "/FontBBox [%g %g %g %g] def\n",
          dict.fontBBox[0], dict.fontBBox[1],
          dict.fontBBox[2], dict.fontBBox[3]);
-  fprintf(out, "/FontInfo 1 dict dup begin\n");
-  fprintf(out, "  /FSType 8 def\n");
-  fprintf(out, "end def\n");
+  (*outputFunc)(outputStream, buf, strlen(buf));
+  (*outputFunc)(outputStream, "/FontInfo 1 dict dup begin\n", 27);
+  (*outputFunc)(outputStream, "  /FSType 8 def\n", 16);
+  (*outputFunc)(outputStream, "end def\n", 8);
 
   // CIDFont-specific entries
-  fprintf(out, "/CIDCount %d def\n", nCIDs);
-  fprintf(out, "/FDBytes 1 def\n");
-  fprintf(out, "/GDBytes %d def\n", gdBytes);
-  fprintf(out, "/CIDMapOffset 0 def\n");
+  sprintf(buf, "/CIDCount %d def\n", nCIDs);
+  (*outputFunc)(outputStream, buf, strlen(buf));
+  (*outputFunc)(outputStream, "/FDBytes 1 def\n", 15);
+  sprintf(buf, "/GDBytes %d def\n", gdBytes);
+  (*outputFunc)(outputStream, buf, strlen(buf));
+  (*outputFunc)(outputStream, "/CIDMapOffset 0 def\n", 20);
   if (dict.paintType != 0) {
-    fprintf(out, "/PaintType %d def\n", dict.paintType);
-    fprintf(out, "/StrokeWidth %g def\n", dict.strokeWidth);
+    sprintf(buf, "/PaintType %d def\n", dict.paintType);
+    (*outputFunc)(outputStream, buf, strlen(buf));
+    sprintf(buf, "/StrokeWidth %g def\n", dict.strokeWidth);
+    (*outputFunc)(outputStream, buf, strlen(buf));
   }
 
   // FDArray entry
-  fprintf(out, "/FDArray %d array\n", nFDs);
+  sprintf(buf, "/FDArray %d array\n", nFDs);
+  (*outputFunc)(outputStream, buf, strlen(buf));
   for (i = 0; i < nFDs; ++i) {
-    fprintf(out, "dup %d 10 dict begin\n", i);
-    fprintf(out, "/FontType 1 def\n");
-    fprintf(out, "/FontMatrix [1 0 0 1 0 0] def\n");
-    fprintf(out, "/PaintType %d def\n", dict.paintType);
-    fprintf(out, "/Private 32 dict begin\n");
-    fwrite(privateDicts[i].dictData->getCString(), 1,
-          privateDicts[i].dictData->getLength(), out);
-    fprintf(out, "currentdict end def\n");
-    fprintf(out, "currentdict end put\n");
-  }
-  fprintf(out, "def\n");
+    sprintf(buf, "dup %d 10 dict begin\n", i);
+    (*outputFunc)(outputStream, buf, strlen(buf));
+    (*outputFunc)(outputStream, "/FontType 1 def\n", 16);
+    (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
+    sprintf(buf, "/PaintType %d def\n", dict.paintType);
+    (*outputFunc)(outputStream, buf, strlen(buf));
+    (*outputFunc)(outputStream, "/Private 32 dict begin\n", 23);
+    (*outputFunc)(outputStream, privateDicts[i].dictData->getCString(),
+                 privateDicts[i].dictData->getLength());
+    (*outputFunc)(outputStream, "currentdict end def\n", 20);
+    (*outputFunc)(outputStream, "currentdict end put\n", 20);
+  }
+  (*outputFunc)(outputStream, "def\n", 4);
 
   //~ need to deal with subrs
   
   // start the binary section
   offset = (nCIDs + 1) * (1 + gdBytes);
-  fprintf(out, "(Hex) %d StartData\n",
+  sprintf(buf, "(Hex) %d StartData\n",
          offset + charStrings->getLength());
+  (*outputFunc)(outputStream, buf, strlen(buf));
 
   // write the charstring offset (CIDMap) table
   for (i = 0; i <= nCIDs; i += 6) {
     for (j = 0; j < 6 && i+j <= nCIDs; ++j) {
-      if (cidMap[i+j] >= 0) {
+      if (i+j < nCIDs && cidMap[i+j] >= 0) {
        buf[0] = (char)fdSelect[cidMap[i+j]];
       } else {
        buf[0] = (char)0;
@@ -787,22 +852,24 @@ void Type1CFontFile::convertToCIDType0(char *psName, FILE *outA) {
        n >>= 8;
       }
       for (k = 0; k <= gdBytes; ++k) {
-       fprintf(out, "%02x", buf[k] & 0xff);
+       sprintf(buf2, "%02x", buf[k] & 0xff);
+       (*outputFunc)(outputStream, buf2, 2);
       }
     }
-    fputc('\n', out);
+    (*outputFunc)(outputStream, "\n", 1);
   }
 
   // write the charstring data
   n = charStrings->getLength();
   for (i = 0; i < n; i += 32) {
     for (j = 0; j < 32 && i+j < n; ++j) {
-      fprintf(out, "%02x", charStrings->getChar(i+j) & 0xff);
+      sprintf(buf, "%02x", charStrings->getChar(i+j) & 0xff);
+      (*outputFunc)(outputStream, buf, strlen(buf));
     }
     if (i + 32 >= n) {
-      fputc('>', out);
+      (*outputFunc)(outputStream, ">", 1);
     }
-    fputc('\n', out);
+    (*outputFunc)(outputStream, "\n", 1);
   }
 
   for (i = 0; i < nFDs; ++i) {
@@ -816,14 +883,16 @@ void Type1CFontFile::convertToCIDType0(char *psName, FILE *outA) {
   gfree(fdSelect);
 }
 
-void Type1CFontFile::convertToType0(char *psName, FILE *outA) {
+void Type1CFontFile::convertToType0(char *psName,
+                                   FontFileOutputFunc outputFuncA,
+                                   void *outputStreamA) {
   Type1CTopDict dict;
   Type1CPrivateDict *privateDicts;
   Gushort *charset;
   int *cidMap;
   Guchar *fdSelect;
   Guchar *charStringsIdxPtr, *fdArrayIdx, *idxPtr0, *idxPtr1, *ptr;
-  char buf[256];
+  char buf[512];
   char eBuf[256];
   int nGlyphs, nCIDs, nFDs;
   int fdSelectFmt, nRanges, gid0, gid1, fd;
@@ -832,7 +901,8 @@ void Type1CFontFile::convertToType0(char *psName, FILE *outA) {
   GBool isFP;
   int i, j, n;
 
-  out = outA;
+  outputFunc = outputFuncA;
+  outputStream = outputStreamA;
 
   // read top dict (first font only)
   readTopDict(&dict);
@@ -957,28 +1027,36 @@ void Type1CFontFile::convertToType0(char *psName, FILE *outA) {
     }
 
     // font dictionary (unencrypted section)
-    fprintf(out, "16 dict begin\n");
-    fprintf(out, "/FontName /%s_%02x def\n", psName, i >> 8);
-    fprintf(out, "/FontType 1 def\n");
-    fprintf(out, "/FontMatrix [%g %g %g %g %g %g] def\n",
+    (*outputFunc)(outputStream, "16 dict begin\n", 14);
+    (*outputFunc)(outputStream, "/FontName /", 11);
+    (*outputFunc)(outputStream, psName, strlen(psName));
+    sprintf(buf, "_%02x def\n", i >> 8);
+    (*outputFunc)(outputStream, buf, strlen(buf));
+    (*outputFunc)(outputStream, "/FontType 1 def\n", 16);
+    sprintf(buf, "/FontMatrix [%g %g %g %g %g %g] def\n",
            dict.fontMatrix[0], dict.fontMatrix[1], dict.fontMatrix[2],
            dict.fontMatrix[3], dict.fontMatrix[4], dict.fontMatrix[5]);
-    fprintf(out, "/FontBBox [%g %g %g %g] def\n",
+    (*outputFunc)(outputStream, buf, strlen(buf));
+    sprintf(buf, "/FontBBox [%g %g %g %g] def\n",
            dict.fontBBox[0], dict.fontBBox[1],
            dict.fontBBox[2], dict.fontBBox[3]);
-    fprintf(out, "/PaintType %d def\n", dict.paintType);
+    (*outputFunc)(outputStream, buf, strlen(buf));
+    sprintf(buf, "/PaintType %d def\n", dict.paintType);
+    (*outputFunc)(outputStream, buf, strlen(buf));
     if (dict.paintType != 0) {
-      fprintf(out, "/StrokeWidth %g def\n", dict.strokeWidth);
+      sprintf(buf, "/StrokeWidth %g def\n", dict.strokeWidth);
+      (*outputFunc)(outputStream, buf, strlen(buf));
     }
-    fprintf(out, "/Encoding 256 array\n");
+    (*outputFunc)(outputStream, "/Encoding 256 array\n", 20);
     for (j = 0; j < 256 && i+j < nCIDs; ++j) {
-      fprintf(out, "dup %d /c%02x put\n", j, j);
+      sprintf(buf, "dup %d /c%02x put\n", j, j);
+      (*outputFunc)(outputStream, buf, strlen(buf));
     }
-    fprintf(out, "readonly def\n");
-    fprintf(out, "currentdict end\n");
+    (*outputFunc)(outputStream, "readonly def\n", 13);
+    (*outputFunc)(outputStream, "currentdict end\n", 16);
 
     // start the binary section
-    fprintf(out, "currentfile eexec\n");
+    (*outputFunc)(outputStream, "currentfile eexec\n", 18);
     r1 = 55665;
     line = 0;
 
@@ -1024,31 +1102,37 @@ void Type1CFontFile::convertToType0(char *psName, FILE *outA) {
 
     // trailer
     if (line > 0) {
-      fputc('\n', out);
+      (*outputFunc)(outputStream, "\n", 1);
     }
     for (j = 0; j < 8; ++j) {
-      fprintf(out, "0000000000000000000000000000000000000000000000000000000000000000\n");
+      (*outputFunc)(outputStream, "0000000000000000000000000000000000000000000000000000000000000000\n", 65);
     }
-    fprintf(out, "cleartomark\n");
+    (*outputFunc)(outputStream, "cleartomark\n", 12);
   }
 
   // write the Type 0 parent font
-  fprintf(out, "16 dict begin\n");
-  fprintf(out, "/FontName /%s def\n", psName);
-  fprintf(out, "/FontType 0 def\n");
-  fprintf(out, "/FontMatrix [1 0 0 1 0 0] def\n");
-  fprintf(out, "/FMapType 2 def\n");
-  fprintf(out, "/Encoding [\n");
+  (*outputFunc)(outputStream, "16 dict begin\n", 14);
+  (*outputFunc)(outputStream, "/FontName /", 11);
+  (*outputFunc)(outputStream, psName, strlen(psName));
+  (*outputFunc)(outputStream, " def\n", 5);
+  (*outputFunc)(outputStream, "/FontType 0 def\n", 16);
+  (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
+  (*outputFunc)(outputStream, "/FMapType 2 def\n", 16);
+  (*outputFunc)(outputStream, "/Encoding [\n", 12);
   for (i = 0; i < nCIDs; i += 256) {
-    fprintf(out, "%d\n", i >> 8);
+    sprintf(buf, "%d\n", i >> 8);
+    (*outputFunc)(outputStream, buf, strlen(buf));
   }
-  fprintf(out, "] def\n");
-  fprintf(out, "/FDepVector [\n");
+  (*outputFunc)(outputStream, "] def\n", 6);
+  (*outputFunc)(outputStream, "/FDepVector [\n", 14);
   for (i = 0; i < nCIDs; i += 256) {
-    fprintf(out, "/%s_%02x findfont\n", psName, i >> 8);
+    (*outputFunc)(outputStream, "/", 1);
+    (*outputFunc)(outputStream, psName, strlen(psName));
+    sprintf(buf, "_%02x findfont\n", i >> 8);
+    (*outputFunc)(outputStream, buf, strlen(buf));
   }
-  fprintf(out, "] def\n");
-  fprintf(out, "FontName currentdict end definefont pop\n");
+  (*outputFunc)(outputStream, "] def\n", 6);
+  (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40);
 
   // clean up
   for (i = 0; i < nFDs; ++i) {
@@ -1328,11 +1412,11 @@ void Type1CFontFile::eexecWrite(char *s) {
   for (p = (Guchar *)s; *p; ++p) {
     x = *p ^ (r1 >> 8);
     r1 = (x + r1) * 52845 + 22719;
-    fputc(hexChars[x >> 4], out);
-    fputc(hexChars[x & 0x0f], out);
+    (*outputFunc)(outputStream, &hexChars[x >> 4], 1);
+    (*outputFunc)(outputStream, &hexChars[x & 0x0f], 1);
     line += 2;
     if (line == 64) {
-      fputc('\n', out);
+      (*outputFunc)(outputStream, "\n", 1);
       line = 0;
     }
   }
@@ -2004,11 +2088,11 @@ void Type1CFontFile::eexecWriteCharstring(Guchar *s, int n) {
   for (i = 0; i < n; ++i) {
     x = s[i] ^ (r1 >> 8);
     r1 = (x + r1) * 52845 + 22719;
-    fputc(hexChars[x >> 4], out);
-    fputc(hexChars[x & 0x0f], out);
+    (*outputFunc)(outputStream, &hexChars[x >> 4], 1);
+    (*outputFunc)(outputStream, &hexChars[x & 0x0f], 1);
     line += 2;
     if (line == 64) {
-      fputc('\n', out);
+      (*outputFunc)(outputStream, "\n", 1);
       line = 0;
     }
   }
@@ -2529,7 +2613,8 @@ enum T42FontIndexMode {
 };
 
 TrueTypeFontFile::TrueTypeFontFile(char *fileA, int lenA) {
-  int pos, i;
+  int pos, i, idx, n, length;
+  Guint size, startPos, endPos;
 
   file = fileA;
   len = lenA;
@@ -2563,6 +2648,31 @@ TrueTypeFontFile::TrueTypeFontFile(char *fileA, int lenA) {
     return;
   }
 
+  // some embedded TrueType fonts have an incorrect (too small) cmap
+  // table size
+  idx = seekTableIdx("cmap");
+  if (idx >= 0) {
+    pos = tableHdrs[idx].offset;
+    n = getUShort(pos + 2);
+    size = (Guint)(4 + 8 * n);
+    for (i = 0; i < n; ++i) {
+      startPos = getULong(pos + 4 + 8*i + 4);
+      length = getUShort(pos + startPos + 2);
+      endPos = startPos + length;
+      if (endPos > size) {
+       size = endPos;
+      }
+    }
+    if ((mungedCmapSize = size > tableHdrs[idx].length)) {
+#if 0 // don't bother printing this error message - it's too common
+      error(-1, "Bad cmap table size in TrueType font");
+#endif
+      tableHdrs[idx].length = size;
+    }
+  } else {
+    mungedCmapSize = gFalse;
+  }
+
   // read the 'head' table
   pos = seekTable("head");
   bbox[0] = getShort(pos + 36);
@@ -2766,168 +2876,215 @@ char **TrueTypeFontFile::getEncoding() {
 
 void TrueTypeFontFile::convertToType42(char *name, char **encodingA,
                                       CharCodeToUnicode *toUnicode,
-                                      GBool pdfFontHasEncoding, FILE *out) {
+                                      GBool pdfFontHasEncoding,
+                                      FontFileOutputFunc outputFunc,
+                                      void *outputStream) {
+  char buf[512];
+
   // write the header
-  fprintf(out, "%%!PS-TrueTypeFont-%g\n", getFixed(0));
+  sprintf(buf, "%%!PS-TrueTypeFont-%g\n", getFixed(0));
+  (*outputFunc)(outputStream, buf, strlen(buf));
 
   // begin the font dictionary
-  fprintf(out, "10 dict begin\n");
-  fprintf(out, "/FontName /%s def\n", name);
-  fprintf(out, "/FontType 42 def\n");
-  fprintf(out, "/FontMatrix [1 0 0 1 0 0] def\n");
-  fprintf(out, "/FontBBox [%d %d %d %d] def\n",
+  (*outputFunc)(outputStream, "10 dict begin\n", 14);
+  (*outputFunc)(outputStream, "/FontName /", 11);
+  (*outputFunc)(outputStream, name, strlen(name));
+  (*outputFunc)(outputStream, " def\n", 5);
+  (*outputFunc)(outputStream, "/FontType 42 def\n", 17);
+  (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
+  sprintf(buf, "/FontBBox [%d %d %d %d] def\n",
          bbox[0], bbox[1], bbox[2], bbox[3]);
-  fprintf(out, "/PaintType 0 def\n");
+  (*outputFunc)(outputStream, buf, strlen(buf));
+  (*outputFunc)(outputStream, "/PaintType 0 def\n", 17);
 
   // write the guts of the dictionary
-  cvtEncoding(encodingA, out);
-  cvtCharStrings(encodingA, toUnicode, pdfFontHasEncoding, out);
-  cvtSfnts(out, NULL);
+  cvtEncoding(encodingA, pdfFontHasEncoding, outputFunc, outputStream);
+  cvtCharStrings(encodingA, toUnicode, pdfFontHasEncoding,
+                outputFunc, outputStream);
+  cvtSfnts(outputFunc, outputStream, NULL);
 
   // end the dictionary and define the font
-  fprintf(out, "FontName currentdict end definefont pop\n");
+  (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40);
 }
 
 void TrueTypeFontFile::convertToCIDType2(char *name, Gushort *cidMap,
-                                        int nCIDs, FILE *out) {
+                                        int nCIDs,
+                                        FontFileOutputFunc outputFunc,
+                                        void *outputStream) {
+  char buf[512];
   Gushort cid;
   int i, j, k;
 
   // write the header
-  fprintf(out, "%%!PS-TrueTypeFont-%g\n", getFixed(0));
+  sprintf(buf, "%%!PS-TrueTypeFont-%g\n", getFixed(0));
+  (*outputFunc)(outputStream, buf, strlen(buf));
 
   // begin the font dictionary
-  fprintf(out, "20 dict begin\n");
-  fprintf(out, "/CIDFontName /%s def\n", name);
-  fprintf(out, "/CIDFontType 2 def\n");
-  fprintf(out, "/FontType 42 def\n");
-  fprintf(out, "/CIDSystemInfo 3 dict dup begin\n");
-  fprintf(out, "  /Registry (Adobe) def\n");
-  fprintf(out, "  /Ordering (Identity) def\n");
-  fprintf(out, "  /Supplement 0 def\n");
-  fprintf(out, "  end def\n");
-  fprintf(out, "/GDBytes 2 def\n");
+  (*outputFunc)(outputStream, "20 dict begin\n", 14);
+  (*outputFunc)(outputStream, "/CIDFontName /", 14);
+  (*outputFunc)(outputStream, name, strlen(name));
+  (*outputFunc)(outputStream, " def\n", 5);
+  (*outputFunc)(outputStream, "/CIDFontType 2 def\n", 19);
+  (*outputFunc)(outputStream, "/FontType 42 def\n", 17);
+  (*outputFunc)(outputStream, "/CIDSystemInfo 3 dict dup begin\n", 32);
+  (*outputFunc)(outputStream, "  /Registry (Adobe) def\n", 24);
+  (*outputFunc)(outputStream, "  /Ordering (Identity) def\n", 27);
+  (*outputFunc)(outputStream, "  /Supplement 0 def\n", 20);
+  (*outputFunc)(outputStream, "  end def\n", 10);
+  (*outputFunc)(outputStream, "/GDBytes 2 def\n", 15);
   if (cidMap) {
-    fprintf(out, "/CIDCount %d def\n", nCIDs);
+    sprintf(buf, "/CIDCount %d def\n", nCIDs);
+    (*outputFunc)(outputStream, buf, strlen(buf));
     if (nCIDs > 32767) {
-      fprintf(out, "/CIDMap [");
+      (*outputFunc)(outputStream, "/CIDMap [", 9);
       for (i = 0; i < nCIDs; i += 32768 - 16) {
-       fprintf(out, "<\n");
+       (*outputFunc)(outputStream, "<\n", 2);
        for (j = 0; j < 32768 - 16 && i+j < nCIDs; j += 16) {
-         fprintf(out, "  ");
+         (*outputFunc)(outputStream, "  ", 2);
          for (k = 0; k < 16 && i+j+k < nCIDs; ++k) {
            cid = cidMap[i+j+k];
-           fprintf(out, "%02x%02x", (cid >> 8) & 0xff, cid & 0xff);
+           sprintf(buf, "%02x%02x", (cid >> 8) & 0xff, cid & 0xff);
+           (*outputFunc)(outputStream, buf, strlen(buf));
          }
-         fprintf(out, "\n");
+         (*outputFunc)(outputStream, "\n", 1);
        }
-       fprintf(out, "  >");
+       (*outputFunc)(outputStream, "  >", 3);
       }
-      fprintf(out, "\n");
-      fprintf(out, "] def\n");
+      (*outputFunc)(outputStream, "\n", 1);
+      (*outputFunc)(outputStream, "] def\n", 6);
     } else {
-      fprintf(out, "/CIDMap <\n");
+      (*outputFunc)(outputStream, "/CIDMap <\n", 10);
       for (i = 0; i < nCIDs; i += 16) {
-       fprintf(out, "  ");
+       (*outputFunc)(outputStream, "  ", 2);
        for (j = 0; j < 16 && i+j < nCIDs; ++j) {
          cid = cidMap[i+j];
-         fprintf(out, "%02x%02x", (cid >> 8) & 0xff, cid & 0xff);
+         sprintf(buf, "%02x%02x", (cid >> 8) & 0xff, cid & 0xff);
+         (*outputFunc)(outputStream, buf, strlen(buf));
        }
-       fprintf(out, "\n");
+       (*outputFunc)(outputStream, "\n", 1);
       }
-      fprintf(out, "> def\n");
+      (*outputFunc)(outputStream, "> def\n", 6);
     }
   } else {
     // direct mapping - just fill the string(s) with s[i]=i
-    fprintf(out, "/CIDCount %d def\n", nGlyphs);
+    sprintf(buf, "/CIDCount %d def\n", nGlyphs);
+    (*outputFunc)(outputStream, buf, strlen(buf));
     if (nGlyphs > 32767) {
-      fprintf(out, "/CIDMap [\n");
+      (*outputFunc)(outputStream, "/CIDMap [\n", 10);
       for (i = 0; i < nGlyphs; i += 32767) {
        j = nGlyphs - i < 32767 ? nGlyphs - i : 32767;
-       fprintf(out, "  %d string 0 1 %d {\n", 2 * j, j - 1);
-       fprintf(out, "    2 copy dup 2 mul exch %d add -8 bitshift put\n", i);
-       fprintf(out, "    1 index exch dup 2 mul 1 add exch %d add"
+       sprintf(buf, "  %d string 0 1 %d {\n", 2 * j, j - 1);
+       (*outputFunc)(outputStream, buf, strlen(buf));
+       sprintf(buf, "    2 copy dup 2 mul exch %d add -8 bitshift put\n", i);
+       (*outputFunc)(outputStream, buf, strlen(buf));
+       sprintf(buf, "    1 index exch dup 2 mul 1 add exch %d add"
                " 255 and put\n", i);
-       fprintf(out, "  } for\n");
+       (*outputFunc)(outputStream, buf, strlen(buf));
+       (*outputFunc)(outputStream, "  } for\n", 8);
       }
-      fprintf(out, "] def\n");
+      (*outputFunc)(outputStream, "] def\n", 6);
     } else {
-      fprintf(out, "/CIDMap %d string\n", 2 * nGlyphs);
-      fprintf(out, "  0 1 %d {\n", nGlyphs - 1);
-      fprintf(out, "    2 copy dup 2 mul exch -8 bitshift put\n");
-      fprintf(out, "    1 index exch dup 2 mul 1 add exch 255 and put\n");
-      fprintf(out, "  } for\n");
-      fprintf(out, "def\n");
-    }
-  }
-  fprintf(out, "/FontMatrix [1 0 0 1 0 0] def\n");
-  fprintf(out, "/FontBBox [%d %d %d %d] def\n",
+      sprintf(buf, "/CIDMap %d string\n", 2 * nGlyphs);
+      (*outputFunc)(outputStream, buf, strlen(buf));
+      sprintf(buf, "  0 1 %d {\n", nGlyphs - 1);
+      (*outputFunc)(outputStream, buf, strlen(buf));
+      (*outputFunc)(outputStream,
+                   "    2 copy dup 2 mul exch -8 bitshift put\n", 42);
+      (*outputFunc)(outputStream,
+                   "    1 index exch dup 2 mul 1 add exch 255 and put\n", 50);
+      (*outputFunc)(outputStream, "  } for\n", 8);
+      (*outputFunc)(outputStream, "def\n", 4);
+    }
+  }
+  (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
+  sprintf(buf, "/FontBBox [%d %d %d %d] def\n",
          bbox[0], bbox[1], bbox[2], bbox[3]);
-  fprintf(out, "/PaintType 0 def\n");
-  fprintf(out, "/Encoding [] readonly def\n");
-  fprintf(out, "/CharStrings 1 dict dup begin\n");
-  fprintf(out, "  /.notdef 0 def\n");
-  fprintf(out, "  end readonly def\n");
+  (*outputFunc)(outputStream, buf, strlen(buf));
+  (*outputFunc)(outputStream, "/PaintType 0 def\n", 17);
+  (*outputFunc)(outputStream, "/Encoding [] readonly def\n", 26);
+  (*outputFunc)(outputStream, "/CharStrings 1 dict dup begin\n", 30);
+  (*outputFunc)(outputStream, "  /.notdef 0 def\n", 17);
+  (*outputFunc)(outputStream, "  end readonly def\n", 19);
 
   // write the guts of the dictionary
-  cvtSfnts(out, NULL);
+  cvtSfnts(outputFunc, outputStream, NULL);
 
   // end the dictionary and define the font
-  fprintf(out, "CIDFontName currentdict end /CIDFont defineresource pop\n");
+  (*outputFunc)(outputStream,
+               "CIDFontName currentdict end /CIDFont defineresource pop\n",
+               56);
 }
 
 void TrueTypeFontFile::convertToType0(char *name, Gushort *cidMap,
-                                     int nCIDs, FILE *out) {
+                                     int nCIDs,
+                                     FontFileOutputFunc outputFunc,
+                                     void *outputStream) {
+  char buf[512];
   GString *sfntsName;
   int n, i, j;
 
   // write the Type 42 sfnts array
   sfntsName = (new GString(name))->append("_sfnts");
-  cvtSfnts(out, sfntsName);
+  cvtSfnts(outputFunc, outputStream, sfntsName);
   delete sfntsName;
 
   // write the descendant Type 42 fonts
   n = cidMap ? nCIDs : nGlyphs;
   for (i = 0; i < n; i += 256) {
-    fprintf(out, "10 dict begin\n");
-    fprintf(out, "/FontName /%s_%02x def\n", name, i >> 8);
-    fprintf(out, "/FontType 42 def\n");
-    fprintf(out, "/FontMatrix [1 0 0 1 0 0] def\n");
-    fprintf(out, "/FontBBox [%d %d %d %d] def\n",
+    (*outputFunc)(outputStream, "10 dict begin\n", 14);
+    (*outputFunc)(outputStream, "/FontName /", 11);
+    (*outputFunc)(outputStream, name, strlen(name));
+    sprintf(buf, "_%02x def\n", i >> 8);
+    (*outputFunc)(outputStream, buf, strlen(buf));
+    (*outputFunc)(outputStream, "/FontType 42 def\n", 17);
+    (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
+    sprintf(buf, "/FontBBox [%d %d %d %d] def\n",
            bbox[0], bbox[1], bbox[2], bbox[3]);
-    fprintf(out, "/PaintType 0 def\n");
-    fprintf(out, "/sfnts %s_sfnts def\n", name);
-    fprintf(out, "/Encoding 256 array\n");
+    (*outputFunc)(outputStream, buf, strlen(buf));
+    (*outputFunc)(outputStream, "/PaintType 0 def\n", 17);
+    (*outputFunc)(outputStream, "/sfnts ", 7);
+    (*outputFunc)(outputStream, name, strlen(name));
+    (*outputFunc)(outputStream, "_sfnts def\n", 11);
+    (*outputFunc)(outputStream, "/Encoding 256 array\n", 20);
     for (j = 0; j < 256 && i+j < n; ++j) {
-      fprintf(out, "dup %d /c%02x put\n", j, j);
+      sprintf(buf, "dup %d /c%02x put\n", j, j);
+      (*outputFunc)(outputStream, buf, strlen(buf));
     }
-    fprintf(out, "readonly def\n");
-    fprintf(out, "/CharStrings 257 dict dup begin\n");
-    fprintf(out, "/.notdef 0 def\n");
+    (*outputFunc)(outputStream, "readonly def\n", 13);
+    (*outputFunc)(outputStream, "/CharStrings 257 dict dup begin\n", 32);
+    (*outputFunc)(outputStream, "/.notdef 0 def\n", 15);
     for (j = 0; j < 256 && i+j < n; ++j) {
-      fprintf(out, "/c%02x %d def\n", j, cidMap ? cidMap[i+j] : i+j);
+      sprintf(buf, "/c%02x %d def\n", j, cidMap ? cidMap[i+j] : i+j);
+      (*outputFunc)(outputStream, buf, strlen(buf));
     }
-    fprintf(out, "end readonly def\n");
-    fprintf(out, "FontName currentdict end definefont pop\n");
+    (*outputFunc)(outputStream, "end readonly def\n", 17);
+    (*outputFunc)(outputStream,
+                 "FontName currentdict end definefont pop\n", 40);
   }
 
   // write the Type 0 parent font
-  fprintf(out, "16 dict begin\n");
-  fprintf(out, "/FontName /%s def\n", name);
-  fprintf(out, "/FontType 0 def\n");
-  fprintf(out, "/FontMatrix [1 0 0 1 0 0] def\n");
-  fprintf(out, "/FMapType 2 def\n");
-  fprintf(out, "/Encoding [\n");
+  (*outputFunc)(outputStream, "16 dict begin\n", 14);
+  (*outputFunc)(outputStream, "/FontName /", 11);
+  (*outputFunc)(outputStream, name, strlen(name));
+  (*outputFunc)(outputStream, " def\n", 5);
+  (*outputFunc)(outputStream, "/FontType 0 def\n", 16);
+  (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
+  (*outputFunc)(outputStream, "/FMapType 2 def\n", 16);
+  (*outputFunc)(outputStream, "/Encoding [\n", 12);
   for (i = 0; i < n; i += 256) {
-    fprintf(out, "%d\n", i >> 8);
+    sprintf(buf, "%d\n", i >> 8);
+    (*outputFunc)(outputStream, buf, strlen(buf));
   }
-  fprintf(out, "] def\n");
-  fprintf(out, "/FDepVector [\n");
+  (*outputFunc)(outputStream, "] def\n", 6);
+  (*outputFunc)(outputStream, "/FDepVector [\n", 14);
   for (i = 0; i < n; i += 256) {
-    fprintf(out, "/%s_%02x findfont\n", name, i >> 8);
+    (*outputFunc)(outputStream, "/", 1);
+    (*outputFunc)(outputStream, name, strlen(name));
+    sprintf(buf, "_%02x findfont\n", i >> 8);
+    (*outputFunc)(outputStream, buf, strlen(buf));
   }
-  fprintf(out, "] def\n");
-  fprintf(out, "FontName currentdict end definefont pop\n");
+  (*outputFunc)(outputStream, "] def\n", 6);
+  (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40);
 }
 
 int TrueTypeFontFile::getByte(int pos) {
@@ -3016,33 +3173,49 @@ int TrueTypeFontFile::seekTableIdx(char *tag) {
   return -1;
 }
 
-void TrueTypeFontFile::cvtEncoding(char **encodingA, FILE *out) {
+void TrueTypeFontFile::cvtEncoding(char **encodingA, GBool pdfFontHasEncoding,
+                                  FontFileOutputFunc outputFunc,
+                                  void *outputStream) {
   char *name;
+  char buf[64];
   int i;
 
-  fprintf(out, "/Encoding 256 array\n");
-  for (i = 0; i < 256; ++i) {
-    if (!(name = encodingA[i])) {
-      name = ".notdef";
+  (*outputFunc)(outputStream, "/Encoding 256 array\n", 20);
+  if (pdfFontHasEncoding) {
+    for (i = 0; i < 256; ++i) {
+      if (!(name = encodingA[i])) {
+       name = ".notdef";
+      }
+      sprintf(buf, "dup %d /", i);
+      (*outputFunc)(outputStream, buf, strlen(buf));
+      (*outputFunc)(outputStream, name, strlen(name));
+      (*outputFunc)(outputStream, " put\n", 5);
+    }
+  } else {
+    for (i = 0; i < 256; ++i) {
+      sprintf(buf, "dup %d /c%02x put\n", i, i);
+      (*outputFunc)(outputStream, buf, strlen(buf));
     }
-    fprintf(out, "dup %d /%s put\n", i, name);
   }
-  fprintf(out, "readonly def\n");
+  (*outputFunc)(outputStream, "readonly def\n", 13);
 }
 
 void TrueTypeFontFile::cvtCharStrings(char **encodingA,
                                      CharCodeToUnicode *toUnicode,
-                                     GBool pdfFontHasEncoding, FILE *out) {
+                                     GBool pdfFontHasEncoding,
+                                     FontFileOutputFunc outputFunc,
+                                     void *outputStream) {
   int unicodeCmap, macRomanCmap, msSymbolCmap;
   int nCmaps, cmapPlatform, cmapEncoding, cmapFmt, cmapOffset;
   T42FontIndexMode mode;
   char *name;
+  char buf[64], buf2[16];
   Unicode u;
   int pos, i, j, k;
 
   // always define '.notdef'
-  fprintf(out, "/CharStrings 256 dict dup begin\n");
-  fprintf(out, "/.notdef 0 def\n");
+  (*outputFunc)(outputStream, "/CharStrings 256 dict dup begin\n", 32);
+  (*outputFunc)(outputStream, "/.notdef 0 def\n", 15);
 
   // if there's no 'cmap' table, punt
   if ((pos = seekTable("cmap")) < 0) {
@@ -3113,7 +3286,12 @@ void TrueTypeFontFile::cvtCharStrings(char **encodingA,
   // 2. use cmap to map char code to glyph index
   j = 0; // make gcc happy
   for (i = 0; i < 256; ++i) {
-    name = encodingA[i];
+    if (pdfFontHasEncoding) {
+      name = encodingA[i];
+    } else {
+      sprintf(buf2, "c%02x", i);
+      name = buf2;
+    }
     if (name && strcmp(name, ".notdef")) {
       switch (mode) {
       case t42FontModeUnicode:
@@ -3136,13 +3314,16 @@ void TrueTypeFontFile::cvtCharStrings(char **encodingA,
       // test
       if ((k = getCmapEntry(cmapFmt, pos, j)) > 0 &&
          k < nGlyphs) {
-       fprintf(out, "/%s %d def\n", name, k);
+       (*outputFunc)(outputStream, "/", 1);
+       (*outputFunc)(outputStream, name, strlen(name));
+       sprintf(buf, " %d def\n", k);
+       (*outputFunc)(outputStream, buf, strlen(buf));
       }
     }
   }
 
  err:
-  fprintf(out, "end readonly def\n");
+  (*outputFunc)(outputStream, "end readonly def\n", 17);
 }
 
 int TrueTypeFontFile::getCmapEntry(int cmapFmt, int pos, int code) {
@@ -3207,7 +3388,8 @@ int TrueTypeFontFile::getCmapEntry(int cmapFmt, int pos, int code) {
   return 0;
 }
 
-void TrueTypeFontFile::cvtSfnts(FILE *out, GString *name) {
+void TrueTypeFontFile::cvtSfnts(FontFileOutputFunc outputFunc,
+                               void *outputStream, GString *name) {
   TTFontTableHdr newTableHdrs[nT42Tables];
   char tableDir[12 + nT42Tables*16];
   char headTable[54];
@@ -3359,27 +3541,30 @@ void TrueTypeFontFile::cvtSfnts(FILE *out, GString *name) {
 
   // start the sfnts array
   if (name) {
-    fprintf(out, "/%s [\n", name->getCString());
+    (*outputFunc)(outputStream, "/", 1);
+    (*outputFunc)(outputStream, name->getCString(), name->getLength());
+    (*outputFunc)(outputStream, " [\n", 3);
   } else {
-    fprintf(out, "/sfnts [\n");
+    (*outputFunc)(outputStream, "/sfnts [\n", 9);
   }
 
   // write the table directory
-  dumpString(tableDir, 12 + nNewTables*16, out);
+  dumpString(tableDir, 12 + nNewTables*16, outputFunc, outputStream);
 
   // write the tables
   for (i = 0; i < nNewTables; ++i) {
     if (i == t42HeadTable) {
-      dumpString(headTable, 54, out);
+      dumpString(headTable, 54, outputFunc, outputStream);
     } else if (i == t42LocaTable) {
       length = (nGlyphs + 1) * (locaFmt ? 4 : 2);
-      dumpString(locaTable, length, out);
+      dumpString(locaTable, length, outputFunc, outputStream);
     } else if (i == t42GlyfTable) {
       glyfPos = seekTable("glyf");
       for (j = 0; j < nGlyphs; ++j) {
        length = origLocaTable[j+1] - origLocaTable[j];
        if (length > 0) {
-         dumpString(file + glyfPos + origLocaTable[j], length, out);
+         dumpString(file + glyfPos + origLocaTable[j], length,
+                    outputFunc, outputStream);
        }
       }
     } else {
@@ -3387,40 +3572,45 @@ void TrueTypeFontFile::cvtSfnts(FILE *out, GString *name) {
       // already reported during the construction of the table
       // headers
       if ((length = newTableHdrs[i].length) > 0) {
-       dumpString(file + seekTable(t42Tables[i].tag), length, out);
+       dumpString(file + seekTable(t42Tables[i].tag), length,
+                  outputFunc, outputStream);
       }
     }
   }
 
   // end the sfnts array
-  fprintf(out, "] def\n");
+  (*outputFunc)(outputStream, "] def\n", 6);
 
   gfree(origLocaTable);
   gfree(locaTable);
 }
 
-void TrueTypeFontFile::dumpString(char *s, int length, FILE *out) {
+void TrueTypeFontFile::dumpString(char *s, int length,
+                                 FontFileOutputFunc outputFunc,
+                                 void *outputStream) {
+  char buf[64];
   int pad, i, j;
 
-  fprintf(out, "<");
+  (*outputFunc)(outputStream, "<", 1);
   for (i = 0; i < length; i += 32) {
     for (j = 0; j < 32 && i+j < length; ++j) {
-      fprintf(out, "%02X", s[i+j] & 0xff);
+      sprintf(buf, "%02X", s[i+j] & 0xff);
+      (*outputFunc)(outputStream, buf, strlen(buf));
     }
     if (i % (65536 - 32) == 65536 - 64) {
-      fprintf(out, ">\n<");
+      (*outputFunc)(outputStream, ">\n<", 3);
     } else if (i+32 < length) {
-      fprintf(out, "\n");
+      (*outputFunc)(outputStream, "\n", 1);
     }
   }
   if (length & 3) {
     pad = 4 - (length & 3);
     for (i = 0; i < pad; ++i) {
-      fprintf(out, "00");
+      (*outputFunc)(outputStream, "00", 2);
     }
   }
   // add an extra zero byte because the Adobe Type 42 spec says so
-  fprintf(out, "00>\n");
+  (*outputFunc)(outputStream, "00>\n", 4);
 }
 
 Guint TrueTypeFontFile::computeTableChecksum(char *data, int length) {
@@ -3494,7 +3684,7 @@ void TrueTypeFontFile::writeTTF(FILE *out) {
   haveName = seekTable("name") >= 0;
   havePost = seekTable("post") >= 0;
   nNewTables = (haveCmap ? 0 : 1) + (haveName ? 0 : 1) + (havePost ? 0 : 1);
-  if (!nNewTables) {
+  if (!nNewTables && !mungedCmapSize) {
     // none are missing - write the TTF file as is
     fwrite(file, 1, len, out);
     return;
@@ -3585,12 +3775,23 @@ void TrueTypeFontFile::writeTTF(FILE *out) {
       ++j;
       dirPost = gTrue;
     }
-    memcpy(&tableDir[12 + 16*j], file + 12 + 16*i, 16);
+    tableDir[12 + 16*j     ] = tableHdrs[i].tag[0];
+    tableDir[12 + 16*j +  1] = tableHdrs[i].tag[1];
+    tableDir[12 + 16*j +  2] = tableHdrs[i].tag[2];
+    tableDir[12 + 16*j +  3] = tableHdrs[i].tag[3];
+    tableDir[12 + 16*j +  4] = (char)((tableHdrs[i].checksum >> 24) & 0xff);
+    tableDir[12 + 16*j +  5] = (char)((tableHdrs[i].checksum >> 16) & 0xff);
+    tableDir[12 + 16*j +  6] = (char)((tableHdrs[i].checksum >>  8) & 0xff);
+    tableDir[12 + 16*j +  7] = (char)( tableHdrs[i].checksum        & 0xff);
     t = tableHdrs[i].offset + nNewTables * 16;
     tableDir[12 + 16*j +  8] = (char)((t >> 24) & 0xff);
     tableDir[12 + 16*j +  9] = (char)((t >> 16) & 0xff);
     tableDir[12 + 16*j + 10] = (char)((t >>  8) & 0xff);
     tableDir[12 + 16*j + 11] = (char)( t        & 0xff);
+    tableDir[12 + 16*j + 12] = (char)((tableHdrs[i].length >> 24) & 0xff);
+    tableDir[12 + 16*j + 13] = (char)((tableHdrs[i].length >> 16) & 0xff);
+    tableDir[12 + 16*j + 14] = (char)((tableHdrs[i].length >>  8) & 0xff);
+    tableDir[12 + 16*j + 15] = (char)( tableHdrs[i].length        & 0xff);
     ++j;
   }
   if (!dirCmap) {
index d5de25c5a6996a944817e6932a43e699e54b2c78..729399221cf0e9a619004810e5960b8638a0ec87 100644 (file)
@@ -9,7 +9,9 @@
 #ifndef FONTFILE_H
 #define FONTFILE_H
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma interface
 #endif
 
 
 class CharCodeToUnicode;
 
+//------------------------------------------------------------------------
+
+typedef void (*FontFileOutputFunc)(void *stream, char *data, int len);
+
 //------------------------------------------------------------------------
 // FontFile
 //------------------------------------------------------------------------
@@ -75,17 +81,19 @@ public:
 
   // Convert to a Type 1 font, suitable for embedding in a PostScript
   // file.  The name will be used as the PostScript font name.
-  void convertToType1(FILE *outA);
+  void convertToType1(FontFileOutputFunc outputFuncA, void *outputStreamA);
 
   // Convert to a Type 0 CIDFont, suitable for embedding in a
   // PostScript file.  The name will be used as the PostScript font
   // name.
-  void convertToCIDType0(char *psName, FILE *outA);
+  void convertToCIDType0(char *psName,
+                        FontFileOutputFunc outputFuncA, void *outputStreamA);
 
   // Convert to a Type 0 (but non-CID) composite font, suitable for
   // embedding in a PostScript file.  The name will be used as the
   // PostScript font name.
-  void convertToType0(char *psName, FILE *outA);
+  void convertToType0(char *psName,
+                     FontFileOutputFunc outputFuncA, void *outputStreamA);
 
 private:
 
@@ -122,7 +130,8 @@ private:
   Guchar *stringIdxPtr;
   Guchar *gsubrIdxPtr;
 
-  FILE *out;
+  FontFileOutputFunc outputFunc;
+  void *outputStream;
   double op[48];               // operands
   GBool fp[48];                        // true if operand is fixed point
   int nOps;                    // number of operands
@@ -161,21 +170,22 @@ public:
   // encoding.
   void convertToType42(char *name, char **encodingA,
                       CharCodeToUnicode *toUnicode,
-                      GBool pdfFontHasEncoding, FILE *out);
+                      GBool pdfFontHasEncoding,
+                      FontFileOutputFunc outputFunc, void *outputStream);
 
   // Convert to a Type 2 CIDFont, suitable for embedding in a
   // PostScript file.  The name will be used as the PostScript font
   // name (so we don't need to depend on the 'name' table in the
   // font).
-  void convertToCIDType2(char *name, Gushort *cidMap,
-                        int nCIDs, FILE *out);
+  void convertToCIDType2(char *name, Gushort *cidMap, int nCIDs,
+                        FontFileOutputFunc outputFunc, void *outputStream);
 
   // Convert to a Type 0 (but non-CID) composite font, suitable for
   // embedding in a PostScript file.  The name will be used as the
   // PostScript font name (so we don't need to depend on the 'name'
   // table in the font).
-  void convertToType0(char *name, Gushort *cidMap,
-                     int nCIDs, FILE *out);
+  void convertToType0(char *name, Gushort *cidMap, int nCIDs,
+                     FontFileOutputFunc outputFunc, void *outputStream);
 
   // Write a TTF file, filling in any missing tables that are required
   // by the TrueType spec.  If the font already has all the required
@@ -194,6 +204,7 @@ private:
   int bbox[4];
   int locaFmt;
   int nGlyphs;
+  GBool mungedCmapSize;
 
   int getByte(int pos);
   int getChar(int pos);
@@ -203,12 +214,16 @@ private:
   double getFixed(int pos);
   int seekTable(char *tag);
   int seekTableIdx(char *tag);
-  void cvtEncoding(char **encodingA, FILE *out);
+  void cvtEncoding(char **encodingA, GBool pdfFontHasEncoding,
+                  FontFileOutputFunc outputFunc, void *outputStream);
   void cvtCharStrings(char **encodingA, CharCodeToUnicode *toUnicode,
-                     GBool pdfFontHasEncoding, FILE *out);
+                     GBool pdfFontHasEncoding,
+                     FontFileOutputFunc outputFunc, void *outputStream);
   int getCmapEntry(int cmapFmt, int pos, int code);
-  void cvtSfnts(FILE *out, GString *name);
-  void dumpString(char *s, int length, FILE *out);
+  void cvtSfnts(FontFileOutputFunc outputFunc, void *outputStream,
+               GString *name);
+  void dumpString(char *s, int length,
+                 FontFileOutputFunc outputFunc, void *outputStream);
   Guint computeTableChecksum(char *data, int length);
 };
 
index 64ea60c1902e6bbbcc8b7e3e3b0ef21ceb993fa6..82bbdce2c0cbca26d188fdc4581697ad473cff27 100644 (file)
@@ -6,11 +6,12 @@
 //
 //========================================================================
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma implementation
 #endif
 
-#include <aconf.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
@@ -1095,14 +1096,14 @@ GBool PostScriptFunction::parseCode(Stream *str, int *codePtr) {
        if (!parseCode(str, codePtr)) {
          return gFalse;
        }
+       delete tok;
+       if (!(tok = getToken(str))) {
+         error(-1, "Unexpected end of PostScript function stream");
+         return gFalse;
+       }
       } else {
        elsePtr = -1;
       }
-      delete tok;
-      if (!(tok = getToken(str))) {
-       error(-1, "Unexpected end of PostScript function stream");
-       return gFalse;
-      }
       if (!tok->cmp("if")) {
        if (elsePtr >= 0) {
          error(-1, "Got 'if' operator with two blocks in PostScript function");
index 9b0879f3dff152e42aa0e1a3c957723078283361..eb88211dd16a0f43722a22cccb369b3dc45db507 100644 (file)
@@ -9,7 +9,9 @@
 #ifndef FUNCTION_H
 #define FUNCTION_H
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma interface
 #endif
 
index 0bc908eada7a8c4d78f01fa65996887ac34ffbbb..b50c15bd1cfcfd2eab951dfbc1b465b4464f417c 100644 (file)
@@ -6,11 +6,12 @@
 //
 //========================================================================
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma implementation
 #endif
 
-#include <aconf.h>
 #include <string.h>
 #include <ctype.h>
 #if HAVE_PAPER_H
@@ -144,11 +145,18 @@ GlobalParams::GlobalParams(char *cfgFileName) {
   displayCIDFonts = new GHash();
   displayNamedCIDFonts = new GHash();
 #if HAVE_PAPER_H
+  char *paperName;
   const struct paper *paperType;
   paperinit();
-  paperType = paperinfo(systempapername());
-  psPaperWidth = (int)paperpswidth(paperType);
-  psPaperHeight = (int)paperpsheight(paperType);
+  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;
@@ -174,12 +182,15 @@ GlobalParams::GlobalParams(char *cfgFileName) {
 #else
   textEOL = eolUnix;
 #endif
+  textKeepTinyChars = gFalse;
   fontDirs = new GList();
   initialZoom = new GString("1");
   t1libControl = fontRastAALow;
   freetypeControl = fontRastAALow;
   urlCommand = NULL;
+  movieCommand = NULL;
   mapNumericCharNames = gTrue;
+  printCommands = gFalse;
   errQuiet = gFalse;
 
   cidToUnicodeCache = new CIDToUnicodeCache();
@@ -192,18 +203,21 @@ GlobalParams::GlobalParams(char *cfgFileName) {
   }
 
   // set up the residentUnicodeMaps table
-  map = new UnicodeMap("Latin1", latin1UnicodeMapRanges, latin1UnicodeMapLen);
+  map = new UnicodeMap("Latin1", gFalse,
+                      latin1UnicodeMapRanges, latin1UnicodeMapLen);
   residentUnicodeMaps->add(map->getEncodingName(), map);
-  map = new UnicodeMap("ASCII7", ascii7UnicodeMapRanges, ascii7UnicodeMapLen);
+  map = new UnicodeMap("ASCII7", gFalse,
+                      ascii7UnicodeMapRanges, ascii7UnicodeMapLen);
   residentUnicodeMaps->add(map->getEncodingName(), map);
-  map = new UnicodeMap("Symbol", symbolUnicodeMapRanges, symbolUnicodeMapLen);
+  map = new UnicodeMap("Symbol", gFalse,
+                      symbolUnicodeMapRanges, symbolUnicodeMapLen);
   residentUnicodeMaps->add(map->getEncodingName(), map);
-  map = new UnicodeMap("ZapfDingbats", zapfDingbatsUnicodeMapRanges,
+  map = new UnicodeMap("ZapfDingbats", gFalse, zapfDingbatsUnicodeMapRanges,
                       zapfDingbatsUnicodeMapLen);
   residentUnicodeMaps->add(map->getEncodingName(), map);
-  map = new UnicodeMap("UTF-8", &mapUTF8);
+  map = new UnicodeMap("UTF-8", gTrue, &mapUTF8);
   residentUnicodeMaps->add(map->getEncodingName(), map);
-  map = new UnicodeMap("UCS-2", &mapUCS2);
+  map = new UnicodeMap("UCS-2", gTrue, &mapUCS2);
   residentUnicodeMaps->add(map->getEncodingName(), map);
 
   // default displayFonts table
@@ -235,7 +249,7 @@ GlobalParams::GlobalParams(char *cfgFileName) {
     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[i] = '\0';
+      buf[0] = '\0';
     }
     fileName = grabPath(buf);
     appendToPath(fileName, xpdfSysConfigFile);
@@ -249,6 +263,7 @@ GlobalParams::GlobalParams(char *cfgFileName) {
   if (f) {
     parseFile(fileName, f);
     delete fileName;
+    fclose(f);
   }
 }
 
@@ -354,6 +369,9 @@ void GlobalParams::parseFile(GString *fileName, FILE *f) {
        parseTextEncoding(tokens, fileName, line);
       } else if (!cmd->cmp("textEOL")) {
        parseTextEOL(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")) {
@@ -365,10 +383,14 @@ void GlobalParams::parseFile(GString *fileName, FILE *f) {
        parseFontRastControl("freetypeControl", &freetypeControl,
                             tokens, fileName, line);
       } else if (!cmd->cmp("urlCommand")) {
-       parseURLCommand(tokens, fileName, line);
+       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("printCommands")) {
+       parseYesNo("printCommands", &printCommands, tokens, fileName, line);
       } else if (!cmd->cmp("errQuiet")) {
        parseYesNo("errQuiet", &errQuiet, tokens, fileName, line);
       } else if (!cmd->cmp("fontpath") || !cmd->cmp("fontmap")) {
@@ -697,17 +719,17 @@ void GlobalParams::parseFontRastControl(char *cmdName, FontRastControl *val,
   }
 }
 
-void GlobalParams::parseURLCommand(GList *tokens, GString *fileName,
-                                  int line) {
+void GlobalParams::parseCommand(char *cmdName, GString **val,
+                               GList *tokens, GString *fileName, int line) {
   if (tokens->getLength() != 2) {
-    error(-1, "Bad 'urlCommand' config file command (%s:%d)",
-         fileName->getCString(), line);
+    error(-1, "Bad '%s' config file command (%s:%d)",
+         cmdName, fileName->getCString(), line);
     return;
   }
-  if (urlCommand) {
-    delete urlCommand;
+  if (*val) {
+    delete *val;
   }
-  urlCommand = ((GString *)tokens->get(1))->copy();
+  *val = ((GString *)tokens->get(1))->copy();
 }
 
 void GlobalParams::parseYesNo(char *cmdName, GBool *flag,
@@ -759,6 +781,9 @@ GlobalParams::~GlobalParams() {
   if (urlCommand) {
     delete urlCommand;
   }
+  if (movieCommand) {
+    delete movieCommand;
+  }
 
   cMapDirs->startIter(&iter);
   while (cMapDirs->getNext(&iter, &key, (void **)&list)) {
@@ -948,6 +973,15 @@ UnicodeMap *GlobalParams::getTextEncoding() {
 // functions to set parameters
 //------------------------------------------------------------------------
 
+void GlobalParams::addDisplayFont(DisplayFontParam *param) {
+  DisplayFontParam *old;
+
+  if ((old = (DisplayFontParam *)displayFonts->remove(param->name))) {
+    delete old;
+  }
+  displayFonts->add(param->name, param);
+}
+
 void GlobalParams::setPSFile(char *file) {
   if (psFile) {
     delete psFile;
@@ -1032,6 +1066,10 @@ GBool GlobalParams::setTextEOL(char *s) {
   return gTrue;
 }
 
+void GlobalParams::setTextKeepTinyChars(GBool keep) {
+  textKeepTinyChars = keep;
+}
+
 void GlobalParams::setInitialZoom(char *s) {
   delete initialZoom;
   initialZoom = new GString(s);
@@ -1060,6 +1098,14 @@ GBool GlobalParams::setFontRastControl(FontRastControl *val, char *s) {
   return gTrue;
 }
 
+void GlobalParams::setMapNumericCharNames(GBool map) {
+  mapNumericCharNames = map;
+}
+
+void GlobalParams::setPrintCommands(GBool printCommandsA) {
+  printCommands = printCommandsA;
+}
+
 void GlobalParams::setErrQuiet(GBool errQuietA) {
   errQuiet = errQuietA;
 }
index b65111091a95d0b4cb418b6da74bec376a0b9dd6..0f783e806b8fb5dfaa9ebcbdd2932f65aa802119 100644 (file)
@@ -9,7 +9,9 @@
 #ifndef GLOBALPARAMS_H
 #define GLOBALPARAMS_H
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma interface
 #endif
 
@@ -150,12 +152,15 @@ public:
   GBool getPSASCIIHex() { return psASCIIHex; }
   GString *getTextEncodingName() { return textEncoding; }
   EndOfLineKind getTextEOL() { return textEOL; }
+  GBool getTextKeepTinyChars() { return textKeepTinyChars; }
   GString *findFontFile(GString *fontName, char *ext1, char *ext2);
   GString *getInitialZoom() { return initialZoom; }
   FontRastControl getT1libControl() { return t1libControl; }
   FontRastControl getFreeTypeControl() { return freetypeControl; }
   GString *getURLCommand() { return urlCommand; }
+  GString *getMovieCommand() { return movieCommand; }
   GBool getMapNumericCharNames() { return mapNumericCharNames; }
+  GBool getPrintCommands() { return printCommands; }
   GBool getErrQuiet() { return errQuiet; }
 
   CharCodeToUnicode *getCIDToUnicode(GString *collection);
@@ -165,6 +170,7 @@ public:
 
   //----- functions to set parameters
 
+  void addDisplayFont(DisplayFontParam *param);
   void setPSFile(char *file);
   GBool setPSPaperSize(char *size);
   void setPSPaperWidth(int width);
@@ -179,9 +185,12 @@ public:
   void setPSASCIIHex(GBool hex);
   void setTextEncoding(char *encodingName);
   GBool setTextEOL(char *s);
+  void setTextKeepTinyChars(GBool keep);
   void setInitialZoom(char *s);
   GBool setT1libControl(char *s);
   GBool setFreeTypeControl(char *s);
+  void setMapNumericCharNames(GBool map);
+  void setPrintCommands(GBool printCommandsA);
   void setErrQuiet(GBool errQuietA);
 
 private:
@@ -207,7 +216,8 @@ private:
   void parseInitialZoom(GList *tokens, GString *fileName, int line);
   void parseFontRastControl(char *cmdName, FontRastControl *val,
                            GList *tokens, GString *fileName, int line);
-  void parseURLCommand(GList *tokens, GString *fileName, int line);
+  void parseCommand(char *cmdName, GString **val,
+                   GList *tokens, GString *fileName, int line);
   void parseYesNo(char *cmdName, GBool *flag,
                  GList *tokens, GString *fileName, int line);
   GBool setFontRastControl(FontRastControl *val, char *s);
@@ -256,13 +266,16 @@ private:
                                //   output
   EndOfLineKind textEOL;       // type of EOL marker to use for text
                                //   output
+  GBool textKeepTinyChars;     // keep all characters in text output
   GList *fontDirs;             // list of font dirs [GString]
   GString *initialZoom;                // initial zoom level
   FontRastControl t1libControl;        // t1lib rasterization mode
   FontRastControl              // FreeType rasterization mode
     freetypeControl;
   GString *urlCommand;         // command executed for URL links
+  GString *movieCommand;       // command executed for movie annotations
   GBool mapNumericCharNames;   // map numeric char names (from font subsets)?
+  GBool printCommands;         // print the drawing commands
   GBool errQuiet;              // suppress error messages?
 
   CIDToUnicodeCache *cidToUnicodeCache;
index b9cde77df7f400fc12fe64bad990bac3b14052a7..29a1dbbf14559bca991613eaccd835b40cb7d6d8 100644 (file)
@@ -6,11 +6,12 @@
 //
 //========================================================================
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma implementation
 #endif
 
-#include <aconf.h>
 #include <string.h>
 #include "gmem.h"
 #include "NameToCharCode.h"
index 22e41b61584914fb22623ad1324dd38173d3fac1..622e7d679eb367311fe334364a670550c27fb4d6 100644 (file)
@@ -9,7 +9,9 @@
 #ifndef NAMETOCHARCODE_H
 #define NAMETOCHARCODE_H
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma interface
 #endif
 
index 432fafb3169ef1e84ba23eba83895d20f9638f0c..320c5588ee87e98ee9660ea94f144761dcac8f3c 100644 (file)
@@ -10,6 +10,37 @@ static struct {
   Unicode u;
   char *name;
 } nameToUnicodeTab[] = {
+  {0x0021, "!"},
+  {0x0023, "#"},
+  {0x0024, "$"},
+  {0x0025, "%"},
+  {0x0026, "&"},
+  {0x0027, "'"},
+  {0x0028, "("},
+  {0x0029, ")"},
+  {0x002a, "*"},
+  {0x002b, "+"},
+  {0x002c, ","},
+  {0x002d, "-"},
+  {0x002e, "."},
+  {0x002f, "/"},
+  {0x0030, "0"},
+  {0x0031, "1"},
+  {0x0032, "2"},
+  {0x0033, "3"},
+  {0x0034, "4"},
+  {0x0035, "5"},
+  {0x0036, "6"},
+  {0x0037, "7"},
+  {0x0038, "8"},
+  {0x0039, "9"},
+  {0x003a, ":"},
+  {0x003b, ";"},
+  {0x003c, "<"},
+  {0x003d, "="},
+  {0x003e, ">"},
+  {0x003f, "?"},
+  {0x0040, "@"},
   {0x0041, "A"},
   {0x00c6, "AE"},
   {0x01fc, "AEacute"},
@@ -304,6 +335,12 @@ static struct {
   {0x017b, "Zdotaccent"},
   {0x0396, "Zeta"},
   {0x005a, "Zsmall"},
+  {0x0022, "\""},
+  {0x005c, "\\"},
+  {0x005d, "]"},
+  {0x005e, "^"},
+  {0x005f, "_"},
+  {0x0060, "`"},
   {0x0061, "a"},
   {0x00e1, "aacute"},
   {0x0103, "abreve"},
@@ -715,6 +752,7 @@ static struct {
   {0x203c, "exclamdbl"},
   {0x00a1, "exclamdown"},
   {0x00a1, "exclamdownsmall"},
+  {0x0021, "exclamleft"},
   {0x0021, "exclamsmall"},
   {0x2203, "existential"},
   {0x0066, "f"},
@@ -1051,5 +1089,9 @@ static struct {
   {0x0030, "zerooldstyle"},
   {0x2070, "zerosuperior"},
   {0x03b6, "zeta"},
+  {0x007b, "{"},
+  {0x007c, "|"},
+  {0x007d, "}"},
+  {0x007e, "~"},
   { 0, NULL }
 };
index 8d654bd2192059509cc7945a9621adec23012cd0..570a7bac71cf42b345d8c647e090cf7e19a28fa9 100644 (file)
@@ -6,7 +6,9 @@
 //
 //========================================================================
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma implementation
 #endif
 
index 1053c675ae6d55522d8549a43e87b8b7c7a5100d..c885ae1f4f2e8ef9a3204639e3c78915cac79e82 100644 (file)
@@ -9,7 +9,9 @@
 #ifndef PSTOKENIZER_H
 #define PSTOKENIZER_H
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma interface
 #endif
 
index 69c1e4841c20131307a2d0a2d45706bd835e8f94..53214b08f2fa5769e404a28b43a6824bebd4d6f6 100644 (file)
@@ -6,11 +6,12 @@
 //
 //========================================================================
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma implementation
 #endif
 
-#include <aconf.h>
 #include "SFont.h"
 
 //------------------------------------------------------------------------
index c4fb341e05948552715280e35f1613418a8e6b4c..8481ddaa0ce0490754887514a305dababe60bf62 100644 (file)
@@ -11,7 +11,9 @@
 #ifndef SFONT_H
 #define SFONT_H
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma interface
 #endif
 
index 7b79d8747fe4a9e8685244ae1045e344b4f6a42a..9815e490147c5278de8a9d55ee9d9964cec96f31 100644 (file)
@@ -6,14 +6,14 @@
 //
 //========================================================================
 
-#ifdef __GNUC__
-#pragma implementation
-#endif
-
 #include <aconf.h>
 
 #if HAVE_T1LIB_H
 
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
 #include <math.h>
 #include <string.h>
 #include <X11/Xlib.h>
 
 //------------------------------------------------------------------------
 
+int T1FontEngine::t1libInitCount = 0;
+
+//------------------------------------------------------------------------
+
 T1FontEngine::T1FontEngine(Display *displayA, Visual *visualA, int depthA,
                           Colormap colormapA, GBool aaA, GBool aaHighA):
   SFontEngine(displayA, visualA, depthA, colormapA)
@@ -32,30 +36,37 @@ T1FontEngine::T1FontEngine(Display *displayA, Visual *visualA, int depthA,
   };
 
   ok = gFalse;
-  T1_SetBitmapPad(8);
-  if (!T1_InitLib(NO_LOGFILE | IGNORE_CONFIGFILE | IGNORE_FONTDATABASE |
-                 T1_NO_AFM)) {
-    return;
-  }
   aa = aaA;
   aaHigh = aaHighA;
-  if (aa) {
-    T1_AASetBitsPerPixel(8);
-    if (aaHigh) {
-      T1_AASetLevel(T1_AA_HIGH);
-      T1_AAHSetGrayValues(grayVals);
+  //~ for multithreading: need a mutex here
+  if (t1libInitCount == 0) {
+    T1_SetBitmapPad(8);
+    if (!T1_InitLib(NO_LOGFILE | IGNORE_CONFIGFILE | IGNORE_FONTDATABASE |
+                   T1_NO_AFM)) {
+      return;
+    }
+    if (aa) {
+      T1_AASetBitsPerPixel(8);
+      if (aaHigh) {
+       T1_AASetLevel(T1_AA_HIGH);
+       T1_AAHSetGrayValues(grayVals);
+      } else {
+       T1_AASetLevel(T1_AA_LOW);
+       T1_AASetGrayValues(0, 1, 2, 3, 4);
+      }
     } else {
-      T1_AASetLevel(T1_AA_LOW);
-      T1_AASetGrayValues(0, 1, 2, 3, 4);
+      T1_AANSetGrayValues(0, 1);
     }
-  } else {
-    T1_AANSetGrayValues(0, 1);
   }
+  ++t1libInitCount;
   ok = gTrue;
 }
 
 T1FontEngine::~T1FontEngine() {
-  T1_CloseLib();
+  //~ for multithreading: need a mutex here
+  if (--t1libInitCount == 0) {
+    T1_CloseLib();
+  }
 }
 
 //------------------------------------------------------------------------
index 5215c3a6e8e0e69e4404750a029fdebb805a272c..cfd7f620611fc6ecf0a15cbbf0bc0da5062fe54b 100644 (file)
 #ifndef T1FONT_H
 #define T1FONT_H
 
+#include <aconf.h>
+
 #if HAVE_T1LIB_H
 
-#ifdef __GNUC__
+#ifdef USE_GCC_PRAGMAS
 #pragma interface
 #endif
 
@@ -39,6 +41,8 @@ private:
   GBool aaHigh;                        // use high-res anti-aliasing?
   GBool ok;
 
+  static int t1libInitCount;
+
   friend class T1FontFile;
   friend class T1Font;
 };
index ea3fad2223b4fe66ed4a3dbd9229e808854cbeed..6107fd43aa117bc7af7fe324833eefdaab1d1969 100644 (file)
@@ -6,14 +6,14 @@
 //
 //========================================================================
 
-#ifdef __GNUC__
-#pragma implementation
-#endif
-
 #include <aconf.h>
 
 #if !FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
 
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
 #include <string.h>
 #include "gmem.h"
 #include "GlobalParams.h"
index b4ebd96e10c50fde7c2dfa71667d4a2c4ef3bf6b..997076c2649ec3a582e76e7b5924829236685d26 100644 (file)
 #ifndef TTFONT_H
 #define TTFONT_H
 
+#include <aconf.h>
+
 #if !FREETYPE2 && (HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H)
 
-#ifdef __GNUC__
+#ifdef USE_GCC_PRAGMAS
 #pragma interface
 #endif
 
index 75f23d2b7bcb28a888c77ae816615060e327fee4..bfa5eccb9c605224dde4fe0b02c390db8bade250 100644 (file)
@@ -6,11 +6,12 @@
 //
 //========================================================================
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma implementation
 #endif
 
-#include <aconf.h>
 #include <stdio.h>
 #include <string.h>
 #include "gmem.h"
@@ -101,11 +102,14 @@ UnicodeMap *UnicodeMap::parse(GString *encodingNameA) {
     ++line;
   }
 
+  fclose(f);
+
   return map;
 }
 
 UnicodeMap::UnicodeMap(GString *encodingNameA) {
   encodingName = encodingNameA;
+  unicodeOut = gFalse;
   kind = unicodeMapUser;
   ranges = NULL;
   len = 0;
@@ -114,9 +118,10 @@ UnicodeMap::UnicodeMap(GString *encodingNameA) {
   refCnt = 1;
 }
 
-UnicodeMap::UnicodeMap(char *encodingNameA,
+UnicodeMap::UnicodeMap(char *encodingNameA, GBool unicodeOutA,
                       UnicodeMapRange *rangesA, int lenA) {
   encodingName = new GString(encodingNameA);
+  unicodeOut = unicodeOutA;
   kind = unicodeMapResident;
   ranges = rangesA;
   len = lenA;
@@ -125,8 +130,10 @@ UnicodeMap::UnicodeMap(char *encodingNameA,
   refCnt = 1;
 }
 
-UnicodeMap::UnicodeMap(char *encodingNameA, UnicodeMapFunc funcA) {
+UnicodeMap::UnicodeMap(char *encodingNameA, GBool unicodeOutA,
+                      UnicodeMapFunc funcA) {
   encodingName = new GString(encodingNameA);
+  unicodeOut = unicodeOutA;
   kind = unicodeMapFunc;
   func = funcA;
   eMaps = NULL;
index 274c4472eafa590ab9fb61e24cfe36bfc120e712..60c0c279296871477c39ffab11884a7a00b1519b 100644 (file)
@@ -11,7 +11,9 @@
 #ifndef UNICODEMAP_H
 #define UNICODEMAP_H
 
-#ifdef __GNUC__
+#include <aconf.h>
+
+#ifdef USE_GCC_PRAGMAS
 #pragma interface
 #endif
 
@@ -47,12 +49,13 @@ public:
   static UnicodeMap *parse(GString *encodingNameA);
 
   // Create a resident UnicodeMap.
-  UnicodeMap(char *encodingNameA,
+  UnicodeMap(char *encodingNameA, GBool unicodeOutA,
             UnicodeMapRange *rangesA, int lenA);
 
   // Create a resident UnicodeMap that uses a function instead of a
   // list of ranges.
-  UnicodeMap(char *encodingNameA, UnicodeMapFunc funcA);
+  UnicodeMap(char *encodingNameA, GBool unicodeOutA,
+            UnicodeMapFunc funcA);
 
   ~UnicodeMap();
 
@@ -61,6 +64,8 @@ public:
 
   GString *getEncodingName() { return encodingName; }
 
+  GBool isUnicode() { return unicodeOut; }
+
   // Return true if this UnicodeMap matches the specified
   // <encodingNameA>.
   GBool match(GString *encodingNameA);
@@ -77,6 +82,7 @@ private:
 
   GString *encodingName;
   UnicodeMapKind kind;
+  GBool unicodeOut;
   union {
     UnicodeMapRange *ranges;   // (user, resident)
     UnicodeMapFunc func;       // (func)
index 4a6ed40138d3df04c594c49e244e7b23590e8f5c..fcb739a20a6320251cf6e41f18b0b2dfa89895af 100644 (file)
@@ -84,6 +84,9 @@ int main(int argc, char *argv[]) {
   Annots *annots;
   Object obj1, obj2;
   int pg, i;
+  int exitCode;
+
+  exitCode = 99;
 
   // parse args
   ok = parseArgs(argDesc, &argc, argv);
@@ -93,7 +96,7 @@ int main(int argc, char *argv[]) {
     if (!printVersion) {
       printUsage("pdfinfo", "<PDF-file>", argDesc);
     }
-    exit(1);
+    goto err0;
   }
   fileName = new GString(argv[1]);
 
@@ -119,7 +122,8 @@ int main(int argc, char *argv[]) {
     delete ownerPW;
   }
   if (!doc->isOk()) {
-    exit(1);
+    exitCode = 1;
+    goto err1;
   }
 
   // get page range
@@ -155,16 +159,20 @@ int main(int argc, char *argv[]) {
     delete annots;
   }
 
+  exitCode = 0;
+
   // clean up
   gfree(fonts);
+ err1:
   delete doc;
   delete globalParams;
+ err0:
 
   // check for memory leaks
   Object::memCheck(stderr);
   gMemReport(stderr);
 
-  return 0;
+  return exitCode;
 }
 
 static void scanFonts(Dict *resDict, PDFDoc *doc) {
@@ -249,13 +257,17 @@ static void scanFont(GfxFont *font, PDFDoc *doc) {
   }
 
   // print the font info
-  printf("%-36s %-12s %-3s %-3s %-3s %6d %2d\n",
+  printf("%-36s %-12s %-3s %-3s %-3s",
         name ? name->getCString() : "[none]",
         fontTypeNames[font->getType()],
         font->getEmbeddedFontID(&embRef) ? "yes" : "no",
         subset ? "yes" : "no",
-        hasToUnicode ? "yes" : "no",
-        fontRef.num, fontRef.gen);
+        hasToUnicode ? "yes" : "no");
+  if (fontRef.gen == 999999) {
+    printf(" [none]\n");
+  } else {
+    printf(" %6d %2d\n", fontRef.num, fontRef.gen);
+  }
   if (name) {
     delete name;
   }