aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/java/org/apache/fop/fonts/apps/TTFReader.java5
-rw-r--r--src/java/org/apache/fop/fonts/truetype/TTFFile.java81
-rw-r--r--src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java4
3 files changed, 72 insertions, 18 deletions
diff --git a/src/java/org/apache/fop/fonts/apps/TTFReader.java b/src/java/org/apache/fop/fonts/apps/TTFReader.java
index 21c7c9a37..95251d060 100644
--- a/src/java/org/apache/fop/fonts/apps/TTFReader.java
+++ b/src/java/org/apache/fop/fonts/apps/TTFReader.java
@@ -207,6 +207,11 @@ public class TTFReader extends AbstractFontReader {
if (!supported) {
return null;
}
+ log.info("Font Family: " + ttfFile.getFamilyName());
+ if (ttfFile.isCFF()) {
+ throw new UnsupportedOperationException(
+ "OpenType fonts with CFF data are not supported, yet");
+ }
return ttfFile;
}
diff --git a/src/java/org/apache/fop/fonts/truetype/TTFFile.java b/src/java/org/apache/fop/fonts/truetype/TTFFile.java
index 8eb7ecf62..319a208d7 100644
--- a/src/java/org/apache/fop/fonts/truetype/TTFFile.java
+++ b/src/java/org/apache/fop/fonts/truetype/TTFFile.java
@@ -88,9 +88,11 @@ public class TTFFile {
private int fontBBox3 = 0;
private int fontBBox4 = 0;
private int capHeight = 0;
+ private int os2CapHeight = 0;
private int underlinePosition = 0;
private int underlineThickness = 0;
private int xHeight = 0;
+ private int os2xHeight = 0;
//Effective ascender/descender
private int ascender = 0;
private int descender = 0;
@@ -113,6 +115,8 @@ public class TTFFile {
private TTFDirTabEntry currentDirTab;
+ private boolean isCFF;
+
/**
* logging instance
*/
@@ -129,8 +133,8 @@ public class TTFFile {
UnicodeMapping(int glyphIndex, int unicodeIndex) {
this.unicodeIndex = unicodeIndex;
this.glyphIndex = glyphIndex;
- glyphToUnicodeMap.put(new Integer(glyphIndex),new Integer(unicodeIndex));
- unicodeToGlyphMap.put(new Integer(unicodeIndex),new Integer(glyphIndex));
+ glyphToUnicodeMap.put(new Integer(glyphIndex), new Integer(unicodeIndex));
+ unicodeToGlyphMap.put(new Integer(unicodeIndex), new Integer(glyphIndex));
}
/**
@@ -205,7 +209,9 @@ public class TTFFile {
int numCMap = in.readTTFUShort(); // Number of cmap subtables
long cmapUniOffset = 0;
- log.info(numCMap + " cmap tables");
+ if (log.isDebugEnabled()) {
+ log.debug(numCMap + " cmap tables");
+ }
//Read offset for all tables. We are only interested in the unicode table
for (int i = 0; i < numCMap; i++) {
@@ -231,7 +237,9 @@ public class TTFFile {
int cmapFormat = in.readTTFUShort();
/*int cmap_length =*/ in.readTTFUShort(); //skip cmap length
- log.info("CMAP format: " + cmapFormat);
+ if (log.isDebugEnabled()) {
+ log.debug("CMAP format: " + cmapFormat);
+ }
if (cmapFormat == 4) {
in.skip(2); // Skip version number
@@ -472,15 +480,19 @@ public class TTFFile {
readDirTabs(in);
readFontHeader(in);
getNumGlyphs(in);
- log.info("Number of glyphs in font: " + numberOfGlyphs);
+ if (log.isDebugEnabled()) {
+ log.debug("Number of glyphs in font: " + numberOfGlyphs);
+ }
readHorizontalHeader(in);
readHorizontalMetrics(in);
initAnsiWidths();
readPostScript(in);
readOS2(in);
determineAscDesc();
- readIndexToLocation(in);
- readGlyf(in);
+ if (!isCFF) {
+ readIndexToLocation(in);
+ readGlyf(in);
+ }
readName(in);
boolean pcltFound = readPCLT(in);
// Read cmap table and fill in ansiwidths
@@ -714,7 +726,15 @@ public class TTFFile {
return isEmbeddable;
}
-
+ /**
+ * Indicates whether or not the font is an OpenType
+ * CFF font (rather than a TrueType font).
+ * @return true if the font is in OpenType CFF format.
+ */
+ public boolean isCFF() {
+ return this.isCFF;
+ }
+
/**
* Read Table Directory from the current position in the
* FontFileReader and fill the global HashMap dirTabs
@@ -724,7 +744,25 @@ public class TTFFile {
* @throws IOException in case of an I/O problem
*/
protected void readDirTabs(FontFileReader in) throws IOException {
- in.skip(4); // TTF_FIXED_SIZE
+ int sfntVersion = in.readTTFLong(); // TTF_FIXED_SIZE (4 bytes)
+ switch (sfntVersion) {
+ case 0x10000:
+ log.debug("sfnt version: OpenType 1.0");
+ break;
+ case 0x4F54544F: //"OTTO"
+ this.isCFF = true;
+ log.debug("sfnt version: OpenType with CFF data");
+ break;
+ case 0x74727565: //"true"
+ log.debug("sfnt version: Apple TrueType");
+ break;
+ case 0x74797031: //"typ1"
+ log.debug("sfnt version: Apple Type 1 housed in sfnt wrapper");
+ break;
+ default:
+ log.debug("Unknown sfnt version: " + Integer.toHexString(sfntVersion));
+ break;
+ }
int ntabs = in.readTTFUShort();
in.skip(6); // 3xTTF_USHORT_SIZE
@@ -954,10 +992,10 @@ public class TTFFile {
v = in.readTTFUShort(); //usWinDescent
log.debug("usWinDescent: " + v + " " + convertTTFUnit2PDFUnit(v));
in.skip(2 * 4);
- v = in.readTTFShort(); //sxHeight
- log.debug("sxHeight: " + v);
- v = in.readTTFShort(); //sCapHeight
- log.debug("sCapHeight: " + v);
+ this.os2xHeight = in.readTTFShort(); //sxHeight
+ log.debug("sxHeight: " + this.os2xHeight);
+ this.os2CapHeight = in.readTTFShort(); //sCapHeight
+ log.debug("sCapHeight: " + this.os2CapHeight);
} else {
isEmbeddable = true;
@@ -1223,7 +1261,10 @@ public class TTFFile {
+ " " + convertTTFUnit2PDFUnit(localCapHeight));
if (capHeight == 0) {
capHeight = localCapHeight;
- if (localCapHeight == 0) {
+ if (capHeight == 0) {
+ capHeight = os2CapHeight;
+ }
+ if (capHeight == 0) {
log.warn("capHeight value could not be determined."
+ " The font may not work as expected.");
}
@@ -1231,6 +1272,9 @@ public class TTFFile {
if (xHeight == 0) {
xHeight = localXHeight;
if (xHeight == 0) {
+ xHeight = os2xHeight;
+ }
+ if (xHeight == 0) {
log.warn("xHeight value could not be determined."
+ " The font may not work as expected.");
}
@@ -1270,18 +1314,18 @@ public class TTFFile {
// CID kerning table entry, using unicode indexes
final Integer iObj = glyphToUnicode(i);
final Integer u2 = glyphToUnicode(j);
- if(iObj==null) {
+ if (iObj == null) {
// happens for many fonts (Ubuntu font set),
// stray entries in the kerning table??
log.warn("Unicode index (1) not found for glyph " + i);
- } else if(u2==null) {
+ } else if (u2 == null) {
log.warn("Unicode index (2) not found for glyph " + i);
} else {
Map adjTab = (Map)kerningTab.get(iObj);
if (adjTab == null) {
adjTab = new java.util.HashMap();
}
- adjTab.put(u2,new Integer((int)convertTTFUnit2PDFUnit(kpx)));
+ adjTab.put(u2, new Integer((int)convertTTFUnit2PDFUnit(kpx)));
kerningTab.put(iObj, adjTab);
}
}
@@ -1289,7 +1333,8 @@ public class TTFFile {
}
// Create winAnsiEncoded kerning table from kerningTab
- // (could probably be simplified, for now we remap back to CID indexes and then to winAnsi)
+ // (could probably be simplified, for now we remap back to CID indexes and
+ // then to winAnsi)
Iterator ae = kerningTab.keySet().iterator();
while (ae.hasNext()) {
Integer unicodeKey1 = (Integer)ae.next();
diff --git a/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java b/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java
index 53be6a8d0..81810874d 100644
--- a/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java
+++ b/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java
@@ -54,6 +54,10 @@ public class TTFFontLoader extends FontLoader {
if (!supported) {
throw new IOException("Could not load TrueType font: " + fontFileURI);
}
+ if (ttf.isCFF()) {
+ throw new UnsupportedOperationException(
+ "OpenType fonts with CFF data are not supported, yet");
+ }
multiFont = new MultiByteFont();
multiFont.setResolver(this.resolver);
returnFont = multiFont;