Clean up font merge word mapping
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop-pdf-images/trunk@1814222 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFFont.java b/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFFont.java
index 1f3a93b..9a2302f 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFFont.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFFont.java
@@ -17,6 +17,7 @@
package org.apache.fop.render.pdf.pdfbox;
import java.io.IOException;
+import java.util.List;
import org.apache.pdfbox.cos.COSDictionary;
@@ -28,4 +29,5 @@
void setRef(PDFDictionary d);
String addFont(COSDictionary fontdata) throws IOException;
int size();
+ String getMappedWord(List<String> word, byte[] bytes, FontContainer oldFont);
}
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFMultiByteFont.java b/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFMultiByteFont.java
index db8ba37..873902f 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFMultiByteFont.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFMultiByteFont.java
@@ -21,6 +21,8 @@
import java.io.InputStream;
import java.util.HashMap;
import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
@@ -152,22 +154,23 @@
mappedChar = "" + (char)mappedChar.hashCode();
}
if (!charMapGlobal.containsKey(mappedChar)) {
+ char c = mappedChar.charAt(0);
if (glyphData.length > 0
&& glyphData[key] == null
- && !CharUtilities.isAdjustableSpace(mappedChar.charAt(0))) {
+ && !CharUtilities.isAdjustableSpace(c)) {
continue;
}
boolean addToEnd = charMapGlobal.containsValue(key);
if (addToEnd) {
- addPrivateUseMapping(mappedChar.charAt(0), charMapGlobal.size() + 1);
+ addPrivateUseMapping(c, charMapGlobal.size() + 1);
charMapGlobal.put(mappedChar, charMapGlobal.size() + 1);
} else {
- addPrivateUseMapping(mappedChar.charAt(0), key);
+ addPrivateUseMapping(c, key);
charMapGlobal.put(mappedChar, key);
}
int glyph = 0;
- if (hasChar(mappedChar.charAt(0))) {
- glyph = (int) mapChar(mappedChar.charAt(0));
+ if (hasChar(c)) {
+ glyph = (int) mapChar(c);
}
oldToNewGIMap.put(key, glyph);
if (!skipWidth) {
@@ -370,4 +373,21 @@
outMaxp.setMaxComponentElements(outMaxp.getMaxComponentElements() + mp.getMaxComponentElements());
outMaxp.setMaxComponentDepth(outMaxp.getMaxComponentDepth() + mp.getMaxComponentDepth());
}
+
+ public String getMappedWord(List<String> word, byte[] bytes, FontContainer oldFont) {
+ StringBuilder newHex = new StringBuilder();
+ for (String str : word) {
+ char c = str.charAt(0);
+ if (str.length() > 1) {
+ c = (char) str.hashCode();
+ }
+ if (hasChar(c)) {
+ int mapped = (int)mapChar(c);
+ newHex.append(String.format("%1$04x", mapped & 0xFFFF).toUpperCase(Locale.getDefault()));
+ } else {
+ return null;
+ }
+ }
+ return "<" + newHex.toString() + ">";
+ }
}
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFSingleByteFont.java b/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFSingleByteFont.java
index 5282869..10ac275 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFSingleByteFont.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFSingleByteFont.java
@@ -54,6 +54,7 @@
import org.apache.fop.fonts.SingleByteEncoding;
import org.apache.fop.fonts.SingleByteFont;
import org.apache.fop.pdf.PDFDictionary;
+import org.apache.fop.pdf.PDFText;
public class FOPPDFSingleByteFont extends SingleByteFont implements FOPPDFFont {
private int fontCount;
@@ -477,4 +478,36 @@
}
return fontMap.get(fontData);
}
+
+ public String getMappedWord(List<String> word, byte[] bytes, FontContainer oldFont) {
+ StringBuffer newOct = new StringBuffer();
+ int i = 0;
+ for (String str : word) {
+ Integer mapped = getMapping(bytes[i], oldFont);
+ if (mapped == null) {
+ char c = str.charAt(0);
+ if (str.length() > 1) {
+ c = (char) str.hashCode();
+ }
+ if (hasChar(c)) {
+ mapped = (int)mapChar(c);
+ } else {
+ return null;
+ }
+ }
+ PDFText.escapeStringChar((char)mapped.intValue(), newOct);
+ i++;
+ }
+ return "(" + newOct.toString() + ")";
+ }
+
+ private Integer getMapping(byte i, FontContainer oldFont) {
+ if (oldFont.getEncoding() != null) {
+ String name = oldFont.getEncoding().getName(i);
+ if (!name.equals(".notdef") && charMapGlobal.containsKey(name)) {
+ return charMapGlobal.get(name);
+ }
+ }
+ return null;
+ }
}
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java b/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java
index df24f73..25012ce 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java
@@ -24,7 +24,6 @@
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
-import java.util.Locale;
import java.util.Map;
import java.util.regex.Pattern;
@@ -54,7 +53,6 @@
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.fop.fonts.FontInfo;
-import org.apache.fop.fonts.SingleByteFont;
import org.apache.fop.fonts.Typeface;
import org.apache.fop.fonts.truetype.OTFSubSetFile;
@@ -120,7 +118,7 @@
if (word == null) {
s.append(PDFText.escapeString(getString((COSString) c)));
} else {
- String x = getMappedWord(word, font, ((COSString) c).getBytes());
+ String x = ((FOPPDFFont)font).getMappedWord(word, ((COSString) c).getBytes(), oldFont);
if (x == null) {
s.append(PDFText.escapeString(getString((COSString) c)));
} else {
@@ -240,43 +238,6 @@
return new String(data, start, data.length - start, encoding);
}
- private String getMappedWord(List<String> word, Typeface font, byte[] bytes) throws IOException {
- StringBuffer newOct = new StringBuffer();
- StringBuilder newHex = new StringBuilder();
- int i = 0;
- for (String str : word) {
- Integer mapped = getMapping(bytes[i]);
- if (mapped == null) {
- char c = str.charAt(0);
- if (str.length() > 1) {
- c = (char) str.hashCode();
- }
- if (font.hasChar(c)) {
- mapped = (int)font.mapChar(c);
- } else {
- return null;
- }
- }
- newHex.append(String.format("%1$04x", mapped & 0xFFFF).toUpperCase(Locale.getDefault()));
- PDFText.escapeStringChar((char)mapped.intValue(), newOct);
- i++;
- }
- if (font instanceof SingleByteFont) {
- return "(" + newOct.toString() + ")";
- }
- return "<" + newHex.toString() + ">";
- }
-
- private Integer getMapping(byte i) throws IOException {
- if (oldFont.getEncoding() != null && font instanceof FOPPDFSingleByteFont) {
- String name = oldFont.getEncoding().getName(i);
- if (!name.equals(".notdef") && ((FOPPDFSingleByteFont)font).charMapGlobal.containsKey(name)) {
- return ((FOPPDFSingleByteFont)font).charMapGlobal.get(name);
- }
- }
- return null;
- }
-
private List<String> readCOSString(COSString s, FontContainer oldFont) throws IOException {
List<String> word = new ArrayList<String>();
byte[] string = s.getBytes();