Author: jeremias
Date: Mon Nov 15 15:31:38 2010
New Revision: 1035307

URL: http://svn.apache.org/viewvc?rev=1035307&view=rev
Log:
Added full support for single-byte encodings when TTF fonts are embedded in 
PostScript.
Deprecated MultiByteFont.setBFEntries() in favor of CustomFont.setCMap().
Added some TODO related to BFEntry and TTFCmapEntry essentially being the same 
class. Maybe we should rename BFEntry.

Modified:
    
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/BFEntry.java
    
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/CustomFont.java
    
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/FontReader.java
    
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/MultiByteFont.java
    
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/SingleByteFont.java
    
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/truetype/TTFCmapEntry.java
    
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/truetype/TTFFile.java
    
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java
    
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/ps/PSFontUtils.java

Modified: 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/BFEntry.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/BFEntry.java?rev=1035307&r1=1035306&r2=1035307&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/BFEntry.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/BFEntry.java
 Mon Nov 15 15:31:38 2010
@@ -24,6 +24,9 @@ package org.apache.fop.fonts;
  */
 public class BFEntry {
 
+    //TODO Think about renaming this class to CMapRange or something.
+    //TODO Copy equals() and hashCode() from TTFCmapEntry
+
     private int unicodeStart;
     private int unicodeEnd;
     private int glyphStartIndex;

Modified: 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/CustomFont.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/CustomFont.java?rev=1035307&r1=1035306&r2=1035307&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/CustomFont.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/CustomFont.java
 Mon Nov 15 15:31:38 2010
@@ -59,6 +59,9 @@ public abstract class CustomFont extends
 
     private boolean useKerning = true;
 
+    /** the character map, mapping Unicode ranges to glyph indices. */
+    protected BFEntry[] cmap;
+
     /** {...@inheritdoc} */
     public String getFontName() {
         return fontName;
@@ -454,4 +457,25 @@ public abstract class CustomFont extends
         }
     }
 
+    /**
+     * Sets the identity character map for this font. It maps all available 
Unicode characters
+     * to their glyph indices inside the font.
+     * @param cmap the identity character map
+     */
+    public void setCMap(BFEntry[] cmap) {
+        this.cmap = new BFEntry[cmap.length];
+        System.arraycopy(cmap, 0, this.cmap, 0, cmap.length);
+    }
+
+    /**
+     * Returns the identity character map for this font. It maps all available 
Unicode characters
+     * to their glyph indices inside the font.
+     * @return the identity character map
+     */
+    public BFEntry[] getCMap() {
+        BFEntry[] copy = new BFEntry[cmap.length];
+        System.arraycopy(this.cmap, 0, copy, 0, this.cmap.length);
+        return copy;
+    }
+
 }

Modified: 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/FontReader.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/FontReader.java?rev=1035307&r1=1035306&r2=1035307&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/FontReader.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/FontReader.java
 Mon Nov 15 15:31:38 2010
@@ -143,12 +143,14 @@ public class FontReader extends DefaultH
     /**
      * {...@inheritdoc}
      */
+    @Override
     public void startDocument() {
     }
 
     /**
      * {...@inheritdoc}
      */
+    @Override
     public void setDocumentLocator(Locator locator) {
         this.locator = locator;
     }
@@ -156,6 +158,7 @@ public class FontReader extends DefaultH
     /**
      * {...@inheritdoc}
      */
+    @Override
     public void startElement(String uri, String localName, String qName,
                              Attributes attributes) throws SAXException {
         if (localName.equals("font-metrics")) {
@@ -224,6 +227,7 @@ public class FontReader extends DefaultH
     /**
      * {...@inheritdoc}
      */
+    @Override
     public void endElement(String uri, String localName, String qName) throws 
SAXException {
         String content = text.toString().trim();
         if ("font-name".equals(localName)) {
@@ -292,7 +296,7 @@ public class FontReader extends DefaultH
             multiFont.setWidthArray(wds);
 
         } else if ("bfranges".equals(localName)) {
-            multiFont.setBFEntries((BFEntry[])bfranges.toArray(new 
BFEntry[0]));
+            multiFont.setCMap((BFEntry[])bfranges.toArray(new BFEntry[0]));
         }
         text.setLength(0); //Reset text buffer (see characters())
     }
@@ -300,6 +304,7 @@ public class FontReader extends DefaultH
     /**
      * {...@inheritdoc}
      */
+    @Override
     public void characters(char[] ch, int start, int length) {
         text.append(ch, start, length);
     }

Modified: 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/MultiByteFont.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/MultiByteFont.java?rev=1035307&r1=1035306&r2=1035307&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/MultiByteFont.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/MultiByteFont.java
 Mon Nov 15 15:31:38 2010
@@ -41,9 +41,6 @@ public class MultiByteFont extends CIDFo
 
     private CIDSubset subset = new CIDSubset();
 
-    /** A map from Unicode indices to glyph indices */
-    private BFEntry[] bfentries = null;
-
     /**
      * Default constructor
      */
@@ -74,26 +71,31 @@ public class MultiByteFont extends CIDFo
     }
 
     /** {...@inheritdoc} */
+    @Override
     public int getDefaultWidth() {
         return defaultWidth;
     }
 
     /** {...@inheritdoc} */
+    @Override
     public String getRegistry() {
         return "Adobe";
     }
 
     /** {...@inheritdoc} */
+    @Override
     public String getOrdering() {
         return "UCS";
     }
 
     /** {...@inheritdoc} */
+    @Override
     public int getSupplement() {
         return 0;
     }
 
     /** {...@inheritdoc} */
+    @Override
     public CIDFontType getCIDType() {
         return cidType;
     }
@@ -111,6 +113,7 @@ public class MultiByteFont extends CIDFo
     }
 
     /** {...@inheritdoc} */
+    @Override
     public String getEmbedFontName() {
         if (isEmbeddable()) {
             return getPrefixedFontName();
@@ -125,11 +128,13 @@ public class MultiByteFont extends CIDFo
     }
 
     /** {...@inheritdoc} */
+    @Override
     public CIDSubset getCIDSubset() {
         return this.subset;
     }
 
     /** {...@inheritdoc} */
+    @Override
     public String getEncodingName() {
         return encoding;
     }
@@ -158,22 +163,23 @@ public class MultiByteFont extends CIDFo
      * @return the glyph index (or 0 if the glyph is not available)
      */
     private int findGlyphIndex(char c) {
-        int idx = (int)c;
+        int idx = c;
         int retIdx = SingleByteEncoding.NOT_FOUND_CODE_POINT;
 
-        for (int i = 0; (i < bfentries.length) && retIdx == 0; i++) {
-            if (bfentries[i].getUnicodeStart() <= idx
-                    && bfentries[i].getUnicodeEnd() >= idx) {
+        for (int i = 0; (i < cmap.length) && retIdx == 0; i++) {
+            if (cmap[i].getUnicodeStart() <= idx
+                    && cmap[i].getUnicodeEnd() >= idx) {
 
-                retIdx = bfentries[i].getGlyphStartIndex()
+                retIdx = cmap[i].getGlyphStartIndex()
                     + idx
-                    - bfentries[i].getUnicodeStart();
+                    - cmap[i].getUnicodeStart();
             }
         }
         return retIdx;
     }
 
     /** {...@inheritdoc} */
+    @Override
     public char mapChar(char c) {
         notifyMapOperation();
         int glyphIndex = findGlyphIndex(c);
@@ -188,6 +194,7 @@ public class MultiByteFont extends CIDFo
     }
 
     /** {...@inheritdoc} */
+    @Override
     public boolean hasChar(char c) {
         return (findGlyphIndex(c) != SingleByteEncoding.NOT_FOUND_CODE_POINT);
     }
@@ -196,9 +203,11 @@ public class MultiByteFont extends CIDFo
      * Sets the array of BFEntry instances which constitutes the Unicode to 
glyph index map for
      * a font. ("BF" means "base font")
      * @param entries the Unicode to glyph index map
+     * @deprecated use {...@link #setCMap(BFEntry[])} instead
      */
+    @Deprecated
     public void setBFEntries(BFEntry[] entries) {
-        this.bfentries = entries;
+        setCMap(entries);
     }
 
     /**

Modified: 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/SingleByteFont.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/SingleByteFont.java?rev=1035307&r1=1035306&r2=1035307&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/SingleByteFont.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/SingleByteFont.java
 Mon Nov 15 15:31:38 2010
@@ -46,8 +46,6 @@ public class SingleByteFont extends Cust
     //Map<Character, UnencodedCharacter>
     private List additionalEncodings;
 
-    private List cmaps;
-
     private PostScriptVersion ttPostScriptVersion;
 
     /**
@@ -64,6 +62,7 @@ public class SingleByteFont extends Cust
     }
 
     /** {...@inheritdoc} */
+    @Override
     public String getEncodingName() {
         return this.mapping.getName();
     }
@@ -104,6 +103,7 @@ public class SingleByteFont extends Cust
     }
 
     /** {...@inheritdoc} */
+    @Override
     public char mapChar(char c) {
         notifyMapOperation();
         char d = mapping.mapChar(c);
@@ -155,6 +155,7 @@ public class SingleByteFont extends Cust
     }
 
     /** {...@inheritdoc} */
+    @Override
     public boolean hasChar(char c) {
         char d = mapping.mapChar(c);
         if (d != SingleByteEncoding.NOT_FOUND_CODE_POINT) {
@@ -334,6 +335,7 @@ public class SingleByteFont extends Cust
         }
 
         /** {...@inheritdoc} */
+        @Override
         public String toString() {
             return getCharacter().toString();
         }
@@ -360,15 +362,5 @@ public class SingleByteFont extends Cust
         return ttPostScriptVersion;
     }
 
-    /** TODO remove */
-    public void setCMaps(List cmaps) {
-        this.cmaps = cmaps;
-    }
-
-    /** TODO remove */
-    public List getCMaps() {
-        return cmaps;
-    }
-
 }
 

Modified: 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/truetype/TTFCmapEntry.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/truetype/TTFCmapEntry.java?rev=1035307&r1=1035306&r2=1035307&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/truetype/TTFCmapEntry.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/truetype/TTFCmapEntry.java
 Mon Nov 15 15:31:38 2010
@@ -25,6 +25,8 @@ package org.apache.fop.fonts.truetype;
  */
 public class TTFCmapEntry {
 
+    //TODO this class is redundant: BFEntry does the same but doesn't have an 
intuitive name
+
     private int unicodeStart;
     private int unicodeEnd;
     private int glyphStartIndex;
@@ -44,6 +46,7 @@ public class TTFCmapEntry {
     /**
      * {...@inheritdoc}
      */
+    @Override
     public int hashCode() {
         int hc = super.hashCode();
         hc ^= ( hc * 11 ) + unicodeStart;
@@ -55,6 +58,7 @@ public class TTFCmapEntry {
     /**
      * {...@inheritdoc}
      */
+    @Override
     public boolean equals(Object o) {
         if (o instanceof TTFCmapEntry) {
             TTFCmapEntry ce = (TTFCmapEntry)o;

Modified: 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/truetype/TTFFile.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/truetype/TTFFile.java?rev=1035307&r1=1035306&r2=1035307&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/truetype/TTFFile.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/truetype/TTFFile.java
 Mon Nov 15 15:31:38 2010
@@ -143,7 +143,7 @@ public class TTFFile {
     protected Map dirTabs;
     private Map kerningTab;                          // for CIDs
     private Map ansiKerningTab;                      // For winAnsiEncoding
-    private List cmaps;
+    private List<TTFCmapEntry> cmaps;
     private List unicodeMapping;
 
     private int upem;                                // unitsPerEm from "head" 
table
@@ -597,7 +597,7 @@ public class TTFFile {
         ansiIndex = new java.util.HashMap();
         for (int i = 32; i < Glyphs.WINANSI_ENCODING.length; i++) {
             Integer ansi = new Integer(i);
-            Integer uni = new Integer((int)Glyphs.WINANSI_ENCODING[i]);
+            Integer uni = new Integer(Glyphs.WINANSI_ENCODING[i]);
 
             List v = (List)ansiIndex.get(uni);
             if (v == null) {
@@ -669,7 +669,7 @@ public class TTFFile {
     }
 
     private void createCMaps() {
-        cmaps = new java.util.ArrayList();
+        this.cmaps = new java.util.ArrayList<TTFCmapEntry>();
         TTFCmapEntry tce = new TTFCmapEntry();
 
         Iterator e = unicodeMapping.listIterator();
@@ -750,7 +750,7 @@ public class TTFFile {
      * @return int The CapHeight
      */
     public int getCapHeight() {
-        return (int)convertTTFUnit2PDFUnit(capHeight);
+        return convertTTFUnit2PDFUnit(capHeight);
     }
 
     /**
@@ -758,7 +758,7 @@ public class TTFFile {
      * @return int The XHeight
      */
     public int getXHeight() {
-        return (int)convertTTFUnit2PDFUnit(xHeight);
+        return convertTTFUnit2PDFUnit(xHeight);
     }
 
     /**
@@ -817,10 +817,10 @@ public class TTFFile {
      */
     public int[] getFontBBox() {
         final int[] fbb = new int[4];
-        fbb[0] = (int)convertTTFUnit2PDFUnit(fontBBox1);
-        fbb[1] = (int)convertTTFUnit2PDFUnit(fontBBox2);
-        fbb[2] = (int)convertTTFUnit2PDFUnit(fontBBox3);
-        fbb[3] = (int)convertTTFUnit2PDFUnit(fontBBox4);
+        fbb[0] = convertTTFUnit2PDFUnit(fontBBox1);
+        fbb[1] = convertTTFUnit2PDFUnit(fontBBox2);
+        fbb[2] = convertTTFUnit2PDFUnit(fontBBox3);
+        fbb[3] = convertTTFUnit2PDFUnit(fontBBox4);
 
         return fbb;
     }
@@ -830,7 +830,7 @@ public class TTFFile {
      * @return int The LowerCaseAscent
      */
     public int getLowerCaseAscent() {
-        return (int)convertTTFUnit2PDFUnit(ascender);
+        return convertTTFUnit2PDFUnit(ascender);
     }
 
     /**
@@ -838,7 +838,7 @@ public class TTFFile {
      * @return int The LowerCaseDescent
      */
     public int getLowerCaseDescent() {
-        return (int)convertTTFUnit2PDFUnit(descender);
+        return convertTTFUnit2PDFUnit(descender);
     }
 
     /**
@@ -865,7 +865,7 @@ public class TTFFile {
     public int[] getWidths() {
         int[] wx = new int[mtxTab.length];
         for (int i = 0; i < wx.length; i++) {
-            wx[i] = (int)convertTTFUnit2PDFUnit(mtxTab[i].getWx());
+            wx[i] = convertTTFUnit2PDFUnit(mtxTab[i].getWx());
         }
 
         return wx;
@@ -877,7 +877,7 @@ public class TTFFile {
      * @return int Standard width
      */
     public int getCharWidth(int idx) {
-        return (int)convertTTFUnit2PDFUnit(ansiWidth[idx]);
+        return convertTTFUnit2PDFUnit(ansiWidth[idx]);
     }
 
     /**
@@ -1557,7 +1557,7 @@ public class TTFFile {
                             if (adjTab == null) {
                                 adjTab = new java.util.HashMap();
                             }
-                            adjTab.put(u2, new 
Integer((int)convertTTFUnit2PDFUnit(kpx)));
+                            adjTab.put(u2, new 
Integer(convertTTFUnit2PDFUnit(kpx)));
                             kerningTab.put(iObj, adjTab);
                         }
                     }
@@ -1608,7 +1608,7 @@ public class TTFFile {
      * Return a List with TTFCmapEntry.
      * @return A list of TTFCmapEntry objects
      */
-    public List getCMaps() {
+    public List<TTFCmapEntry> getCMaps() {
         return cmaps;
     }
 
@@ -1753,8 +1753,8 @@ public class TTFFile {
         System.out.println("Family name: " + familyNames);
         System.out.println("Subfamily name: " + subFamilyName);
         System.out.println("Notice:      " + notice);
-        System.out.println("xHeight:     " + 
(int)convertTTFUnit2PDFUnit(xHeight));
-        System.out.println("capheight:   " + 
(int)convertTTFUnit2PDFUnit(capHeight));
+        System.out.println("xHeight:     " + convertTTFUnit2PDFUnit(xHeight));
+        System.out.println("capheight:   " + 
convertTTFUnit2PDFUnit(capHeight));
 
         int italic = (int)(italicAngle >> 16);
         System.out.println("Italic:      " + italic);
@@ -1767,10 +1767,10 @@ public class TTFFile {
         System.out.println();
         System.out.println("Ascender:    " + convertTTFUnit2PDFUnit(ascender));
         System.out.println("Descender:   " + 
convertTTFUnit2PDFUnit(descender));
-        System.out.println("FontBBox:    [" + 
(int)convertTTFUnit2PDFUnit(fontBBox1)
-                           + " " + (int)convertTTFUnit2PDFUnit(fontBBox2) + " "
-                           + (int)convertTTFUnit2PDFUnit(fontBBox3) + " "
-                           + (int)convertTTFUnit2PDFUnit(fontBBox4) + "]");
+        System.out.println("FontBBox:    [" + convertTTFUnit2PDFUnit(fontBBox1)
+                           + " " + convertTTFUnit2PDFUnit(fontBBox2) + " "
+                           + convertTTFUnit2PDFUnit(fontBBox3) + " "
+                           + convertTTFUnit2PDFUnit(fontBBox4) + "]");
     }
 
     private String formatUnitsForDebug(int units) {

Modified: 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java?rev=1035307&r1=1035306&r2=1035307&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java
 Mon Nov 15 15:31:38 2010
@@ -80,6 +80,7 @@ public class TTFFontLoader extends FontL
     }
 
     /** {...@inheritdoc} */
+    @Override
     protected void read() throws IOException {
         read(this.subFontName);
     }
@@ -147,26 +148,15 @@ public class TTFFontLoader extends FontL
             multiFont.setCIDType(CIDFontType.CIDTYPE2);
             int[] wx = ttf.getWidths();
             multiFont.setWidthArray(wx);
-            List entries = ttf.getCMaps();
-            BFEntry[] bfentries = new BFEntry[entries.size()];
-            int pos = 0;
-            Iterator iter = ttf.getCMaps().listIterator();
-            while (iter.hasNext()) {
-                TTFCmapEntry ce = (TTFCmapEntry)iter.next();
-                bfentries[pos] = new BFEntry(ce.getUnicodeStart(), 
ce.getUnicodeEnd(),
-                        ce.getGlyphStartIndex());
-                pos++;
-            }
-            multiFont.setBFEntries(bfentries);
         } else {
             singleFont.setFontType(FontType.TRUETYPE);
             singleFont.setEncoding(ttf.getCharSetName());
             returnFont.setFirstChar(ttf.getFirstChar());
             returnFont.setLastChar(ttf.getLastChar());
-            singleFont.setCMaps(ttf.getCMaps());
             
singleFont.setTrueTypePostScriptVersion(ttf.getPostScriptVersion());
             copyWidthsSingleByte(ttf);
         }
+        returnFont.setCMap(getCMap(ttf));
 
         if (useKerning) {
             copyKerning(ttf, isCid);
@@ -176,6 +166,18 @@ public class TTFFontLoader extends FontL
         }
     }
 
+    private BFEntry[] getCMap(TTFFile ttf) {
+        List<TTFCmapEntry> entries = ttf.getCMaps();
+        BFEntry[] bfentries = new BFEntry[entries.size()];
+        int pos = 0;
+        for (TTFCmapEntry ce : ttf.getCMaps()) {
+            bfentries[pos] = new BFEntry(ce.getUnicodeStart(), 
ce.getUnicodeEnd(),
+                    ce.getGlyphStartIndex());
+            pos++;
+        }
+        return bfentries;
+    }
+
     private void copyWidthsSingleByte(TTFFile ttf) {
         int[] wx = ttf.getWidths();
         for (int i = singleFont.getFirstChar(); i <= singleFont.getLastChar(); 
i++) {

Modified: 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/ps/PSFontUtils.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/ps/PSFontUtils.java?rev=1035307&r1=1035306&r2=1035307&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/ps/PSFontUtils.java
 (original)
+++ 
xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/ps/PSFontUtils.java
 Mon Nov 15 15:31:38 2010
@@ -23,11 +23,8 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.MalformedURLException;
-import java.util.Collections;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import javax.xml.transform.Source;
 import javax.xml.transform.stream.StreamSource;
@@ -42,6 +39,7 @@ import org.apache.xmlgraphics.ps.PSResou
 import org.apache.xmlgraphics.ps.dsc.ResourceTracker;
 import org.apache.xmlgraphics.util.io.ASCIIHexOutputStream;
 
+import org.apache.fop.fonts.BFEntry;
 import org.apache.fop.fonts.Base14Font;
 import org.apache.fop.fonts.CIDFontType;
 import org.apache.fop.fonts.CIDSubset;
@@ -55,7 +53,6 @@ import org.apache.fop.fonts.SingleByteEn
 import org.apache.fop.fonts.SingleByteFont;
 import org.apache.fop.fonts.Typeface;
 import org.apache.fop.fonts.truetype.FontFileReader;
-import org.apache.fop.fonts.truetype.TTFCmapEntry;
 import org.apache.fop.fonts.truetype.TTFSubSetFile;
 import org.apache.fop.fonts.truetype.TTFFile.PostScriptVersion;
 import org.apache.fop.util.HexEncoder;
@@ -152,7 +149,7 @@ public class PSFontUtils extends org.apa
                             && sbf.getTrueTypePostScriptVersion() != 
PostScriptVersion.V2) {
                         derivedFontRes = defineDerivedTrueTypeFont(gen, 
eventProducer,
                                 tf.getEmbedFontName(), tf.getEmbedFontName() + 
postFix, encoding,
-                                sbf.getCMaps());
+                                sbf.getCMap());
                     } else {
                         derivedFontRes = defineDerivedFont(gen, 
tf.getEmbedFontName(),
                                 tf.getEmbedFontName() + postFix, 
encoding.getName());
@@ -298,12 +295,12 @@ public class PSFontUtils extends org.apa
         /* See Adobe Technical Note #5012, "The Type 42 Font Format 
Specification" */
         gen.commentln("%!PS-TrueTypeFont-65536-65536-1"); // TODO TrueType & 
font versions
         gen.writeln("11 dict begin");
-        createType42DictionaryEntries(gen, font, fontStream, font.getCMaps());
+        createType42DictionaryEntries(gen, font, fontStream, font.getCMap());
         gen.writeln("FontName currentdict end definefont pop");
     }
 
     private static void createType42DictionaryEntries(PSGenerator gen, 
CustomFont font,
-            InputStream fontStream, List cmaps) throws IOException {
+            InputStream fontStream, BFEntry[] cmap) throws IOException {
         gen.write("/FontName /");
         gen.write(font.getEmbedFontName());
         gen.writeln(" def");
@@ -313,12 +310,13 @@ public class PSFontUtils extends org.apa
         gen.writeln("/FontType 42 def");
         gen.writeln("/Encoding 256 array");
         gen.writeln("0 1 255{1 index exch/.notdef put}for");
-        Set<String> glyphs = null;
+        boolean buildCharStrings;
         if (font.getFontType() == FontType.TYPE0) {
             //"/Encoding" is required but ignored for CID fonts
             //so we keep it minimal to save space
+            buildCharStrings = false;
         } else {
-            glyphs = new java.util.HashSet<String>();
+            buildCharStrings = true;
             for (int i = 0; i < Glyphs.WINANSI_ENCODING.length; i++) {
                 gen.write("dup ");
                 gen.write(i);
@@ -327,7 +325,6 @@ public class PSFontUtils extends org.apa
                 if (glyphName.equals("")) {
                     gen.write(Glyphs.NOTDEF);
                 } else {
-                    glyphs.add(glyphName); //TODO don't just register the 
WinAnsi subset!
                     gen.write(glyphName);
                 }
                 gen.writeln(" put");
@@ -357,33 +354,48 @@ public class PSFontUtils extends org.apa
         }
         gen.writeln("]def");
         gen.write("/CharStrings ");
-        gen.write(glyphs != null ? glyphs.size() + 1 : 1);
+        if (buildCharStrings) {
+            int charCount = 1; //1 for .notdef
+            for (BFEntry entry : cmap) {
+                charCount += entry.getUnicodeEnd() - entry.getUnicodeStart() + 
1;
+            }
+            gen.write(charCount);
+        } else {
+            gen.write(1);
+        }
         gen.writeln(" dict dup begin");
         gen.write("/");
         gen.write(Glyphs.NOTDEF);
         gen.writeln(" 0 def"); // .notdef always has to be at index 0
-        if (glyphs != null) {
-            //Only performed in singly-byte mode
-            for (String glyphName : glyphs) {
-                gen.write("/");
-                gen.write(glyphName);
-                gen.write(" ");
-                gen.write(getGlyphIndex(glyphName, cmaps));
-                gen.writeln(" def");
+        if (buildCharStrings) {
+            //Only performed in singly-byte mode, ignored for CID fonts
+
+            for (BFEntry entry : cmap) {
+                int glyphIndex = entry.getGlyphStartIndex();
+                for (int ch = entry.getUnicodeStart(); ch <= 
entry.getUnicodeEnd(); ch++) {
+                    char ch16 = (char)ch; //TODO Handle Unicode characters 
beyond 16bit
+                    String glyphName = Glyphs.charToGlyphName(ch16);
+
+                    if ("".equals(glyphName)) {
+                        glyphName = "u" + 
Integer.toHexString(ch).toUpperCase();
+                    }
+                    gen.write("/");
+                    gen.write(glyphName);
+                    gen.write(" ");
+                    gen.write(glyphIndex);
+                    gen.writeln(" def");
+
+                    glyphIndex++;
+                }
             }
         }
         gen.writeln("end readonly def");
     }
 
-    private static int getGlyphIndex(String glyphName, List cmaps) {
-        return 
getGlyphIndex(Glyphs.getUnicodeSequenceForGlyphName(glyphName).charAt(0), 
cmaps);
-    }
-
-    private static int getGlyphIndex(char c, List cmaps) {
-        for (Iterator iter = cmaps.iterator(); iter.hasNext();) {
-            TTFCmapEntry cmap = (TTFCmapEntry) iter.next();
-            if (cmap.getUnicodeStart() <= c && c <= cmap.getUnicodeEnd()) {
-                return cmap.getGlyphStartIndex() + c - cmap.getUnicodeStart();
+    private static int getGlyphIndex(char c, BFEntry[] cmap) {
+        for (BFEntry entry : cmap) {
+            if (entry.getUnicodeStart() <= c && c <= entry.getUnicodeEnd()) {
+                return entry.getGlyphStartIndex() + c - 
entry.getUnicodeStart();
             }
         }
         return 0;
@@ -481,7 +493,7 @@ public class PSFontUtils extends org.apa
         gen.writeln("] def");
 
         InputStream subsetInput = new java.io.ByteArrayInputStream(subsetFont);
-        createType42DictionaryEntries(gen, font, subsetInput, 
Collections.EMPTY_LIST);
+        createType42DictionaryEntries(gen, font, subsetInput, new BFEntry[0]);
         gen.writeln("CIDFontName currentdict end /CIDFont defineresource pop");
         gen.writeln("end");
         gen.writeln("%%EndResource");
@@ -659,7 +671,7 @@ public class PSFontUtils extends org.apa
 
     private static PSResource defineDerivedTrueTypeFont(PSGenerator gen,
             PSEventProducer eventProducer, String baseFontName, String 
fontName,
-            SingleByteEncoding encoding, List cmaps) throws IOException {
+            SingleByteEncoding encoding, BFEntry[] cmap) throws IOException {
         checkPostScriptLevel3(gen, eventProducer);
         PSResource res = new PSResource(PSResource.TYPE_FONT, fontName);
         gen.writeDSCComment(DSCConstants.BEGIN_RESOURCE, res);
@@ -682,7 +694,7 @@ public class PSFontUtils extends org.apa
             if (glyphName.equals(".notdef")) {
                 gen.write(0);
             } else {
-                gen.write(getGlyphIndex(unicodeCharMap[i], cmaps));
+                gen.write(getGlyphIndex(unicodeCharMap[i], cmap));
             }
             gen.writeln(" def");
         }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to