[poppler] Branch 'xpdf303merge' - fofi/FoFiTrueType.cc fofi/FoFiTrueType.h fofi/FoFiType1.cc fofi/FoFiType1C.cc fofi/FoFiType1C.h fofi/FoFiType1.h
Carlos Garcia Campos
carlosgc at kemper.freedesktop.org
Thu Sep 1 10:09:23 PDT 2011
fofi/FoFiTrueType.cc | 76 ++++++++++++++++++++++++++++++---------------------
fofi/FoFiTrueType.h | 9 ++++++
fofi/FoFiType1.cc | 37 ++++++++++++++++++++++++
fofi/FoFiType1.h | 4 ++
fofi/FoFiType1C.cc | 29 +++++++++++++++++++
fofi/FoFiType1C.h | 3 ++
6 files changed, 127 insertions(+), 31 deletions(-)
New commits:
commit 876021b1aa16ad38767a91e1be31c392f368fde2
Author: Carlos Garcia Campos <carlosgc at gnome.org>
Date: Thu Sep 1 19:07:01 2011 +0200
xpdf303: Add getFontMatrix()
diff --git a/fofi/FoFiTrueType.cc b/fofi/FoFiTrueType.cc
index c132da1..1a171cb 100644
--- a/fofi/FoFiTrueType.cc
+++ b/fofi/FoFiTrueType.cc
@@ -442,21 +442,32 @@ int FoFiTrueType::mapNameToGID(char *name) {
return nameToGID->lookupInt(name);
}
-int *FoFiTrueType::getCIDToGIDMap(int *nCIDs) {
- FoFiType1C *ff;
- int *map;
+GBool FoFiTrueType::getCFFBlock(char **start, int *length) {
int i;
- *nCIDs = 0;
if (!openTypeCFF) {
- return NULL;
+ return gFalse;
}
i = seekTable("CFF ");
if (!checkRegion(tables[i].offset, tables[i].len)) {
+ return gFalse;
+ }
+ *start = (char *)file + tables[i].offset;
+ *length = tables[i].len;
+ return gTrue;
+}
+
+int *FoFiTrueType::getCIDToGIDMap(int *nCIDs) {
+ char *start;
+ int length;
+ FoFiType1C *ff;
+ int *map;
+
+ *nCIDs = 0;
+ if (!getCFFBlock(&start, &length)) {
return NULL;
}
- if (!(ff = FoFiType1C::make((char *)file + tables[i].offset,
- tables[i].len))) {
+ if (!(ff = FoFiType1C::make(start, length))) {
return NULL;
}
map = ff->getCIDToGIDMap(nCIDs);
@@ -488,6 +499,21 @@ int FoFiTrueType::getEmbeddingRights() {
return 3;
}
+void FoFiTrueType::getFontMatrix(double *mat) {
+ char *start;
+ int length;
+ FoFiType1C *ff;
+
+ if (!getCFFBlock(&start, &length)) {
+ return;
+ }
+ if (!(ff = FoFiType1C::make(start, length))) {
+ return;
+ }
+ ff->getFontMatrix(mat);
+ delete ff;
+}
+
void FoFiTrueType::convertToType42(char *psName, char **encoding,
int *codeToGID,
FoFiOutputFunc outputFunc,
@@ -532,18 +558,14 @@ void FoFiTrueType::convertToType42(char *psName, char **encoding,
void FoFiTrueType::convertToType1(char *psName, const char **newEncoding,
GBool ascii, FoFiOutputFunc outputFunc,
void *outputStream) {
+ char *start;
+ int length;
FoFiType1C *ff;
- int i;
- if (!openTypeCFF) {
- return;
- }
- i = seekTable("CFF ");
- if (!checkRegion(tables[i].offset, tables[i].len)) {
+ if (!getCFFBlock(&start, &length)) {
return;
}
- if (!(ff = FoFiType1C::make((char *)file + tables[i].offset,
- tables[i].len))) {
+ if (!(ff = FoFiType1C::make(start, length))) {
return;
}
ff->convertToType1(psName, newEncoding, ascii, outputFunc, outputStream);
@@ -683,18 +705,14 @@ void FoFiTrueType::convertToCIDType2(char *psName,
void FoFiTrueType::convertToCIDType0(char *psName,
FoFiOutputFunc outputFunc,
void *outputStream) {
+ char *start;
+ int length;
FoFiType1C *ff;
- int i;
- if (!openTypeCFF) {
+ if (!getCFFBlock(&start, &length)) {
return;
}
- i = seekTable("CFF ");
- if (!checkRegion(tables[i].offset, tables[i].len)) {
- return;
- }
- if (!(ff = FoFiType1C::make((char *)file + tables[i].offset,
- tables[i].len))) {
+ if (!(ff = FoFiType1C::make(start, length))) {
return;
}
ff->convertToCIDType0(psName, outputFunc, outputStream);
@@ -808,18 +826,14 @@ void FoFiTrueType::convertToType0(char *psName, int *cidMap, int nCIDs,
void FoFiTrueType::convertToType0(char *psName,
FoFiOutputFunc outputFunc,
void *outputStream) {
+ char *start;
+ int length;
FoFiType1C *ff;
- int i;
- if (!openTypeCFF) {
- return;
- }
- i = seekTable("CFF ");
- if (!checkRegion(tables[i].offset, tables[i].len)) {
+ if (!getCFFBlock(&start, &length)) {
return;
}
- if (!(ff = FoFiType1C::make((char *)file + tables[i].offset,
- tables[i].len))) {
+ if (!(ff = FoFiType1C::make(start, length))) {
return;
}
ff->convertToType0(psName, outputFunc, outputStream);
diff --git a/fofi/FoFiTrueType.h b/fofi/FoFiTrueType.h
index 7a53ebc..76be424 100644
--- a/fofi/FoFiTrueType.h
+++ b/fofi/FoFiTrueType.h
@@ -96,6 +96,10 @@ public:
// * 0: restricted license embedding
int getEmbeddingRights();
+ // Return the font matrix as an array of six numbers. (Only useful
+ // for OpenType CFF fonts.)
+ void getFontMatrix(double *mat);
+
// Convert to a Type 42 font, suitable for embedding in a PostScript
// file. <psName> will be used as the PostScript font name (so we
// don't need to depend on the 'name' table in the font). The
@@ -156,6 +160,11 @@ public:
void writeTTF(FoFiOutputFunc outputFunc, void *outputStream,
char *name = NULL, int *codeToGID = NULL);
+ // Returns a pointer to the CFF font embedded in this OpenType font.
+ // If successful, sets *<start> and *<length>, and returns true.
+ // Otherwise returns false. (Only useful for OpenType CFF fonts).
+ GBool getCFFBlock(char **start, int *length);
+
int setupGSUB(const char *tagName);
private:
diff --git a/fofi/FoFiType1.cc b/fofi/FoFiType1.cc
index 00f2cf9..d47f543 100644
--- a/fofi/FoFiType1.cc
+++ b/fofi/FoFiType1.cc
@@ -59,6 +59,12 @@ FoFiType1::FoFiType1(char *fileA, int lenA, GBool freeFileDataA):
{
name = NULL;
encoding = NULL;
+ fontMatrix[0] = 0.001;
+ fontMatrix[1] = 0;
+ fontMatrix[2] = 0;
+ fontMatrix[3] = 0.001;
+ fontMatrix[4] = 0;
+ fontMatrix[5] = 0;
parsed = gFalse;
}
@@ -90,6 +96,17 @@ char **FoFiType1::getEncoding() {
return encoding;
}
+void FoFiType1::getFontMatrix(double *mat) {
+ int i;
+
+ if (!parsed) {
+ parse();
+ }
+ for (i = 0; i < 6; ++i) {
+ mat[i] = fontMatrix[i];
+ }
+}
+
void FoFiType1::writeEncoded(const char **newEncoding,
FoFiOutputFunc outputFunc, void *outputStream) {
char buf[512];
@@ -195,7 +212,9 @@ void FoFiType1::parse() {
char c;
int n, code, i, j;
char *tokptr;
+ GBool gotMatrix;
+ gotMatrix = gFalse;
for (i = 1, line = (char *)file;
i <= 100 && line && (!name || !encoding);
++i) {
@@ -281,6 +300,24 @@ void FoFiType1::parse() {
}
//~ check for getinterval/putinterval junk
+ } else if (!gotMatrix && !strncmp(line, "/FontMatrix", 11)) {
+ strncpy(buf, line + 11, 255);
+ buf[255] = '\0';
+ if ((p = strchr(buf, '['))) {
+ ++p;
+ if ((p2 = strchr(p, ']'))) {
+ *p2 = '\0';
+ for (j = 0; j < 6; ++j) {
+ if ((p = strtok(j == 0 ? p : (char *)NULL, " \t\n\r"))) {
+ fontMatrix[j] = atof(p);
+ } else {
+ break;
+ }
+ }
+ }
+ }
+ gotMatrix = gTrue;
+
} else {
line = getNextLine(line);
}
diff --git a/fofi/FoFiType1.h b/fofi/FoFiType1.h
index 5abdfb2..ae1d73b 100644
--- a/fofi/FoFiType1.h
+++ b/fofi/FoFiType1.h
@@ -38,6 +38,9 @@ public:
// be NULL).
char **getEncoding();
+ // Return the font matrix as an array of six numbers.
+ void getFontMatrix(double *mat);
+
// Write a version of the Type 1 font file with a new encoding.
void writeEncoded(const char **newEncoding,
FoFiOutputFunc outputFunc, void *outputStream);
@@ -51,6 +54,7 @@ private:
char *name;
char **encoding;
+ double fontMatrix[6];
GBool parsed;
};
diff --git a/fofi/FoFiType1C.cc b/fofi/FoFiType1C.cc
index c97f033..1abc866 100644
--- a/fofi/FoFiType1C.cc
+++ b/fofi/FoFiType1C.cc
@@ -144,6 +144,35 @@ int *FoFiType1C::getCIDToGIDMap(int *nCIDs) {
return map;
}
+void FoFiType1C::getFontMatrix(double *mat) {
+ int i;
+
+ if (topDict.firstOp == 0x0c1e && privateDicts[0].hasFontMatrix) {
+ if (topDict.hasFontMatrix) {
+ mat[0] = topDict.fontMatrix[0] * privateDicts[0].fontMatrix[0] +
+ topDict.fontMatrix[1] * privateDicts[0].fontMatrix[2];
+ mat[1] = topDict.fontMatrix[0] * privateDicts[0].fontMatrix[1] +
+ topDict.fontMatrix[1] * privateDicts[0].fontMatrix[3];
+ mat[2] = topDict.fontMatrix[2] * privateDicts[0].fontMatrix[0] +
+ topDict.fontMatrix[3] * privateDicts[0].fontMatrix[2];
+ mat[3] = topDict.fontMatrix[2] * privateDicts[0].fontMatrix[1] +
+ topDict.fontMatrix[3] * privateDicts[0].fontMatrix[3];
+ mat[4] = topDict.fontMatrix[4] * privateDicts[0].fontMatrix[0] +
+ topDict.fontMatrix[5] * privateDicts[0].fontMatrix[2];
+ mat[5] = topDict.fontMatrix[4] * privateDicts[0].fontMatrix[1] +
+ topDict.fontMatrix[5] * privateDicts[0].fontMatrix[3];
+ } else {
+ for (i = 0; i < 6; ++i) {
+ mat[i] = privateDicts[0].fontMatrix[i];
+ }
+ }
+ } else {
+ for (i = 0; i < 6; ++i) {
+ mat[i] = topDict.fontMatrix[i];
+ }
+ }
+}
+
void FoFiType1C::convertToType1(char *psName, const char **newEncoding, GBool ascii,
FoFiOutputFunc outputFunc,
void *outputStream) {
diff --git a/fofi/FoFiType1C.h b/fofi/FoFiType1C.h
index 2eb1308..7c8d30a 100644
--- a/fofi/FoFiType1C.h
+++ b/fofi/FoFiType1C.h
@@ -165,6 +165,9 @@ public:
// CIDs in *<nCIDs>. This is only useful for CID fonts.
int *getCIDToGIDMap(int *nCIDs);
+ // Return the font matrix as an array of six numbers.
+ void getFontMatrix(double *mat);
+
// Convert to a Type 1 font, suitable for embedding in a PostScript
// file. This is only useful with 8-bit fonts. If <newEncoding> is
// not NULL, it will be used in place of the encoding in the Type 1C
More information about the poppler
mailing list