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();