[poppler] Branch 'xpdf303merge' - fofi/FoFiTrueType.cc fofi/FoFiTrueType.h fofi/FoFiType1C.cc fofi/FoFiType1C.h poppler/PSOutputDev.cc

Carlos Garcia Campos carlosgc at kemper.freedesktop.org
Fri Sep 2 09:02:49 PDT 2011


 fofi/FoFiTrueType.cc   |    8 ++--
 fofi/FoFiTrueType.h    |    4 +-
 fofi/FoFiType1C.cc     |   84 +++++++++++++++++++++++++++++++++++--------------
 fofi/FoFiType1C.h      |   19 ++++++++---
 poppler/PSOutputDev.cc |   13 +++++--
 5 files changed, 91 insertions(+), 37 deletions(-)

New commits:
commit 9531a52b227a994ab8e0d66aeaff2b21358ca73e
Author: Carlos Garcia Campos <carlosgc at gnome.org>
Date:   Fri Sep 2 18:01:35 2011 +0200

    xpdf303: New signature of methods convertToCIDType0() and convertToType0()

diff --git a/fofi/FoFiTrueType.cc b/fofi/FoFiTrueType.cc
index 1a171cb..431910d 100644
--- a/fofi/FoFiTrueType.cc
+++ b/fofi/FoFiTrueType.cc
@@ -702,7 +702,7 @@ void FoFiTrueType::convertToCIDType2(char *psName,
 		56);
 }
 
-void FoFiTrueType::convertToCIDType0(char *psName,
+void FoFiTrueType::convertToCIDType0(char *psName, int *cidMap, int nCIDs,
 				     FoFiOutputFunc outputFunc,
 				     void *outputStream) {
   char *start;
@@ -715,7 +715,7 @@ void FoFiTrueType::convertToCIDType0(char *psName,
   if (!(ff = FoFiType1C::make(start, length))) {
     return;
   }
-  ff->convertToCIDType0(psName, outputFunc, outputStream);
+  ff->convertToCIDType0(psName, cidMap, nCIDs, outputFunc, outputStream);
   delete ff;
 }
 
@@ -823,7 +823,7 @@ void FoFiTrueType::convertToType0(char *psName, int *cidMap, int nCIDs,
   (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40);
 }
 
-void FoFiTrueType::convertToType0(char *psName,
+void FoFiTrueType::convertToType0(char *psName, int *cidMap, int nCIDs,
 				  FoFiOutputFunc outputFunc,
 				  void *outputStream) {
   char *start;
@@ -836,7 +836,7 @@ void FoFiTrueType::convertToType0(char *psName,
   if (!(ff = FoFiType1C::make(start, length))) {
     return;
   }
-  ff->convertToType0(psName, outputFunc, outputStream);
+  ff->convertToType0(psName, cidMap, nCIDs, outputFunc, outputStream);
   delete ff;
 }
 
diff --git a/fofi/FoFiTrueType.h b/fofi/FoFiTrueType.h
index 76be424..c2d7bd4 100644
--- a/fofi/FoFiTrueType.h
+++ b/fofi/FoFiTrueType.h
@@ -133,7 +133,7 @@ public:
   // Convert to a Type 0 CIDFont, suitable for embedding in a
   // PostScript file.  <psName> will be used as the PostScript font
   // name.  (Only useful for OpenType CFF fonts.)
-  void convertToCIDType0(char *psName,
+  void convertToCIDType0(char *psName, int *cidMap, int nCIDs,
 			 FoFiOutputFunc outputFunc, void *outputStream);
 
   // Convert to a Type 0 (but non-CID) composite font, suitable for
@@ -148,7 +148,7 @@ public:
   // Convert to a Type 0 (but non-CID) composite font, suitable for
   // embedding in a PostScript file.  <psName> will be used as the
   // PostScript font name.  (Only useful for OpenType CFF fonts.)
-  void convertToType0(char *psName,
+  void convertToType0(char *psName, int *cidMap, int nCIDs,
 		      FoFiOutputFunc outputFunc, void *outputStream);
 
   // Write a clean TTF file, filling in missing tables and correcting
diff --git a/fofi/FoFiType1C.cc b/fofi/FoFiType1C.cc
index 97943de..76931d7 100644
--- a/fofi/FoFiType1C.cc
+++ b/fofi/FoFiType1C.cc
@@ -473,7 +473,7 @@ void FoFiType1C::convertToType1(char *psName, const char **newEncoding, GBool as
   (*outputFunc)(outputStream, "cleartomark\n", 12);
 }
 
-void FoFiType1C::convertToCIDType0(char *psName,
+void FoFiType1C::convertToCIDType0(char *psName, int *codeMap, int nCodes,
 				   FoFiOutputFunc outputFunc,
 				   void *outputStream) {
   int *cidMap;
@@ -488,18 +488,36 @@ void FoFiType1C::convertToCIDType0(char *psName,
   int gid, offset, n, i, j, k;
 
   // compute the CID count and build the CID-to-GID mapping
-  nCIDs = 0;
-  for (i = 0; i < nGlyphs; ++i) {
-    if (charset[i] >= nCIDs) {
-      nCIDs = charset[i] + 1;
+  if (codeMap) {
+    nCIDs = nCodes;
+    cidMap = (int *)gmallocn(nCIDs, sizeof(int));
+    for (i = 0; i < nCodes; ++i) {
+      if (codeMap[i] >= 0 && codeMap[i] < nGlyphs) {
+	cidMap[i] = codeMap[i];
+      } else {
+	cidMap[i] = -1;
+      }
+    }
+  } else if (topDict.firstOp == 0x0c1e) {
+    nCIDs = 0;
+    for (i = 0; i < nGlyphs; ++i) {
+      if (charset[i] >= nCIDs) {
+	nCIDs = charset[i] + 1;
+      }
+    }
+    cidMap = (int *)gmallocn(nCIDs, sizeof(int));
+    for (i = 0; i < nCIDs; ++i) {
+      cidMap[i] = -1;
+    }
+    for (i = 0; i < nGlyphs; ++i) {
+      cidMap[charset[i]] = i;
+    }
+  } else {
+    nCIDs = nGlyphs;
+    cidMap = (int *)gmallocn(nCIDs, sizeof(int));
+    for (i = 0; i < nCIDs; ++i) {
+      cidMap[i] = i;
     }
-  }
-  cidMap = (int *)gmallocn(nCIDs, sizeof(int));
-  for (i = 0; i < nCIDs; ++i) {
-    cidMap[i] = -1;
-  }
-  for (i = 0; i < nGlyphs; ++i) {
-    cidMap[charset[i]] = i;
   }
 
   // build the charstrings
@@ -799,7 +817,7 @@ void FoFiType1C::convertToCIDType0(char *psName,
   gfree(cidMap);
 }
 
-void FoFiType1C::convertToType0(char *psName,
+void FoFiType1C::convertToType0(char *psName, int *codeMap, int nCodes,
 				FoFiOutputFunc outputFunc,
 				void *outputStream) {
   int *cidMap;
@@ -812,18 +830,36 @@ void FoFiType1C::convertToType0(char *psName,
   int fd, i, j, k;
 
   // compute the CID count and build the CID-to-GID mapping
-  nCIDs = 0;
-  for (i = 0; i < nGlyphs; ++i) {
-    if (charset[i] >= nCIDs) {
-      nCIDs = charset[i] + 1;
+  if (codeMap) {
+    nCIDs = nCodes;
+    cidMap = (int *)gmallocn(nCIDs, sizeof(int));
+    for (i = 0; i < nCodes; ++i) {
+      if (codeMap[i] >= 0 && codeMap[i] < nGlyphs) {
+	cidMap[i] = codeMap[i];
+      } else {
+	cidMap[i] = -1;
+      }
+    }
+  } else if (topDict.firstOp == 0x0c1e) {
+    nCIDs = 0;
+    for (i = 0; i < nGlyphs; ++i) {
+      if (charset[i] >= nCIDs) {
+	nCIDs = charset[i] + 1;
+      }
+    }
+    cidMap = (int *)gmallocn(nCIDs, sizeof(int));
+    for (i = 0; i < nCIDs; ++i) {
+      cidMap[i] = -1;
+    }
+    for (i = 0; i < nGlyphs; ++i) {
+      cidMap[charset[i]] = i;
+    }
+  } else {
+    nCIDs = nGlyphs;
+    cidMap = (int *)gmallocn(nCIDs, sizeof(int));
+    for (i = 0; i < nCIDs; ++i) {
+      cidMap[i] = i;
     }
-  }
-  cidMap = (int *)gmallocn(nCIDs, sizeof(int));
-  for (i = 0; i < nCIDs; ++i) {
-    cidMap[i] = -1;
-  }
-  for (i = 0; i < nGlyphs; ++i) {
-    cidMap[charset[i]] = i;
   }
 
   // write the descendant Type 1 fonts
diff --git a/fofi/FoFiType1C.h b/fofi/FoFiType1C.h
index 7c8d30a..a1dd3ee 100644
--- a/fofi/FoFiType1C.h
+++ b/fofi/FoFiType1C.h
@@ -179,14 +179,25 @@ public:
 
   // Convert to a Type 0 CIDFont, suitable for embedding in a
   // PostScript file.  <psName> will be used as the PostScript font
-  // name.
-  void convertToCIDType0(char *psName,
+  // name.  There are three cases for the CID-to-GID mapping:
+  // (1) if <codeMap> is non-NULL, then it is the CID-to-GID mapping
+  // (2) if <codeMap> is NULL and this is a CID CFF font, then the
+  //     font's internal CID-to-GID mapping is used
+  // (3) is <codeMap> is NULL and this is an 8-bit CFF font, then
+  //     the identity CID-to-GID mapping is used
+  void convertToCIDType0(char *psName, int *codeMap, int nCodes,
 			 FoFiOutputFunc outputFunc, void *outputStream);
 
   // Convert to a Type 0 (but non-CID) composite font, suitable for
   // embedding in a PostScript file.  <psName> will be used as the
-  // PostScript font name.
-  void convertToType0(char *psName,
+  // PostScript font name.  There are three cases for the CID-to-GID
+  // mapping:
+  // (1) if <codeMap> is non-NULL, then it is the CID-to-GID mapping
+  // (2) if <codeMap> is NULL and this is a CID CFF font, then the
+  //     font's internal CID-to-GID mapping is used
+  // (3) is <codeMap> is NULL and this is an 8-bit CFF font, then
+  //     the identity CID-to-GID mapping is used
+  void convertToType0(char *psName, int *codeMap, int nCodes,
 		      FoFiOutputFunc outputFunc, void *outputStream);
 
 private:
diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc
index 5c16d44..ae08570 100644
--- a/poppler/PSOutputDev.cc
+++ b/poppler/PSOutputDev.cc
@@ -2452,10 +2452,12 @@ void PSOutputDev::setupEmbeddedCIDType0Font(GfxFont *font, Ref *id,
   if ((ffT1C = FoFiType1C::make(fontBuf, fontLen))) {
     if (globalParams->getPSLevel() >= psLevel3) {
       // Level 3: use a CID font
-      ffT1C->convertToCIDType0(psName->getCString(), outputFunc, outputStream);
+      ffT1C->convertToCIDType0(psName->getCString(), NULL, 0,
+                               outputFunc, outputStream);
     } else {
       // otherwise: use a non-CID composite font
-      ffT1C->convertToType0(psName->getCString(), outputFunc, outputStream);
+      ffT1C->convertToType0(psName->getCString(), NULL, 0,
+                            outputFunc, outputStream);
     }
     delete ffT1C;
   }
@@ -2555,10 +2557,15 @@ void PSOutputDev::setupEmbeddedOpenTypeCFFFont(GfxFont *font, Ref *id,
       if (globalParams->getPSLevel() >= psLevel3) {
 	// Level 3: use a CID font
 	ffTT->convertToCIDType0(psName->getCString(),
+                                ((GfxCIDFont *)font)->getCIDToGID(),
+                                ((GfxCIDFont *)font)->getCIDToGIDLen(),
 				outputFunc, outputStream);
       } else {
 	// otherwise: use a non-CID composite font
-	ffTT->convertToType0(psName->getCString(), outputFunc, outputStream);
+	ffTT->convertToType0(psName->getCString(),
+                             ((GfxCIDFont *)font)->getCIDToGID(),
+                             ((GfxCIDFont *)font)->getCIDToGIDLen(),
+                             outputFunc, outputStream);
       }
     }
     delete ffTT;


More information about the poppler mailing list