Author: ssteiner
Date: Mon Feb 29 11:21:02 2016
New Revision: 1732856

URL: http://svn.apache.org/viewvc?rev=1732856&view=rev
Log:
FOP-2584: Move merge font classes under a interface

Added:
    
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFonts.java
   (with props)
Modified:
    
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFMultiByteFont.java
    
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFSingleByteFont.java
    
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeCFFFonts.java
    
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java
    
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeType1Fonts.java

Modified: 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFMultiByteFont.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFMultiByteFont.java?rev=1732856&r1=1732855&r2=1732856&view=diff
==============================================================================
--- 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFMultiByteFont.java
 (original)
+++ 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFMultiByteFont.java
 Mon Feb 29 11:21:02 2016
@@ -54,7 +54,6 @@ import org.apache.fop.fonts.CustomFont;
 import org.apache.fop.fonts.EmbeddingMode;
 import org.apache.fop.fonts.FontType;
 import org.apache.fop.fonts.MultiByteFont;
-import org.apache.fop.fonts.truetype.FontFileReader;
 import org.apache.fop.pdf.PDFDictionary;
 import org.apache.fop.util.CharUtilities;
 
@@ -62,8 +61,7 @@ public class FOPPDFMultiByteFont extends
     protected PDFDictionary ref;
     private Map<Integer, Integer> newWidth = new TreeMap<Integer, Integer>();
     private Map<String, Integer> charMapGlobal = new LinkedHashMap<String, 
Integer>();
-    private MergeTTFonts mergeTTFonts = new MergeTTFonts();
-    private MergeCFFFonts mergeCFFFonts = new MergeCFFFonts();
+    private MergeFonts mergeFonts;
     //private Map<String, GlyphData> glyphs = new HashMap<String, GlyphData>();
     private final Map<COSDictionary, PDFont> fontMap = new 
HashMap<COSDictionary, PDFont>();
 
@@ -122,16 +120,23 @@ public class FOPPDFMultiByteFont extends
             }
         }
         readCharMap(font, gidToGlyph, glyphData, mainFont, oldToNewGIMap);
-        FontFileReader ffr = readFontFile(mainFont);
-        if (ttf != null) {
-            mergeMaxp(ttf, mergeTTFonts.maxp);
+        InputStream ffr = readFontFile(mainFont);
+        if (mergeFonts == null) {
+            if (ttf != null) {
+                mergeFonts = new MergeTTFonts(null);
+            } else {
+                mergeFonts = new MergeCFFFonts();
+            }
+        }
+        if (mergeFonts instanceof MergeTTFonts) {
+            mergeMaxp(ttf, ((MergeTTFonts)mergeFonts).maxp);
             int sizeNoCompGlyphs = oldToNewGIMap.size();
-            mergeTTFonts.readFont(ffr, oldToNewGIMap, true);
+            mergeFonts.readFont(ffr, null, null, oldToNewGIMap, true);
             if (oldToNewGIMap.size() > sizeNoCompGlyphs) {
                 cidSet.mapChar(256 * 256, (char) 0);
             }
         } else {
-            mergeCFFFonts.readType1CFont(new 
ByteArrayInputStream(ffr.getAllBytes()), getEmbedFontName());
+            mergeFonts.readFont(ffr, getEmbedFontName(), null, null, true);
         }
         return getFontName();
     }
@@ -239,7 +244,7 @@ public class FOPPDFMultiByteFont extends
 //            return false;
 //        }
 
-    private FontFileReader readFontFile(PDFont font) throws IOException {
+    private InputStream readFontFile(PDFont font) throws IOException {
         PDFontDescriptorDictionary fd = (PDFontDescriptorDictionary) 
font.getFontDescriptor();
         PDStream ff = fd.getFontFile3();
         if (ff == null) {
@@ -248,8 +253,11 @@ public class FOPPDFMultiByteFont extends
                 ff = fd.getFontFile();
             }
         }
+        if (ff == null) {
+            throw new IOException(font.getBaseFont() + " no fontfile");
+        }
         InputStream is = ff.createInputStream();
-        return new FontFileReader(new 
ByteArrayInputStream(IOUtils.toByteArray(is)));
+        return new ByteArrayInputStream(IOUtils.toByteArray(is));
     }
 
     public Map<Integer, Integer> getWidthsMap() {
@@ -302,12 +310,7 @@ public class FOPPDFMultiByteFont extends
     }
 
     public InputStream getInputStream() throws IOException {
-        if (getFontType() == FontType.CIDTYPE0) {
-            mergeCFFFonts.writeFont();
-            return new ByteArrayInputStream(mergeCFFFonts.getFontSubset());
-        }
-        mergeTTFonts.writeFont(null);
-        return new ByteArrayInputStream(mergeTTFonts.getFontSubset());
+        return new ByteArrayInputStream(mergeFonts.getMergedFontSubset());
     }
 
     protected PDFont getFont(COSDictionary fontData) throws IOException {

Modified: 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFSingleByteFont.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFSingleByteFont.java?rev=1732856&r1=1732855&r2=1732856&view=diff
==============================================================================
--- 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFSingleByteFont.java
 (original)
+++ 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFSingleByteFont.java
 Mon Feb 29 11:21:02 2016
@@ -49,7 +49,6 @@ import org.apache.fop.fonts.EmbeddingMod
 import org.apache.fop.fonts.FontType;
 import org.apache.fop.fonts.SingleByteEncoding;
 import org.apache.fop.fonts.SingleByteFont;
-import org.apache.fop.fonts.truetype.FontFileReader;
 import org.apache.fop.pdf.PDFDictionary;
 
 public class FOPPDFSingleByteFont extends SingleByteFont implements FOPPDFFont 
{
@@ -62,9 +61,7 @@ public class FOPPDFSingleByteFont extend
     private List<MergeTTFonts.Cmap> newCmap = new 
ArrayList<MergeTTFonts.Cmap>();
     private Map<Integer, String> encodingMap = new TreeMap<Integer, String>();
     private int encodingSkip;
-    private MergeTTFonts mergeTTFonts = new MergeTTFonts();
-    private MergeCFFFonts mergeCFFFonts = new MergeCFFFonts();
-    private MergeType1Fonts mergeType1Fonts = new MergeType1Fonts();
+    private MergeFonts mergeFonts;
     private String shortFontName;
     private final Map<COSDictionary, PDFont> fontMap = new 
HashMap<COSDictionary, PDFont>();
 
@@ -149,6 +146,9 @@ public class FOPPDFSingleByteFont extend
         if (font.getFontEncoding() != null) {
             return font.getFontEncoding();
         }
+        if (font.getToUnicodeCMap() == null) {
+            throw new IOException("No cmap found in " + font.getBaseFont());
+        }
         return font.getToUnicodeCMap();
     }
 
@@ -185,7 +185,7 @@ public class FOPPDFSingleByteFont extend
                     }
                 }
             }
-            FOPPDFMultiByteFont.mergeMaxp(ttfont, mergeTTFonts.maxp);
+            FOPPDFMultiByteFont.mergeMaxp(ttfont, 
((MergeTTFonts)mergeFonts).maxp);
         }
     }
 
@@ -454,31 +454,23 @@ public class FOPPDFSingleByteFont extend
     }
 
     private void mergeFontFile(InputStream ff, PDFont pdFont) throws 
IOException {
-        if (getFontType() == FontType.TRUETYPE) {
-            Map<Integer, Integer> chars = new HashMap<Integer, Integer>();
-            chars.put(0, 0);
-            mergeTTFonts.readFont(new FontFileReader(ff), chars, false);
-        } else if (getFontType() == FontType.TYPE1) {
-            mergeType1Fonts.readFont(ff, (PDType1Font) pdFont);
-        } else {
-            mergeCFFFonts.readType1CFont(ff, shortFontName);
+        if (mergeFonts == null) {
+            if (getFontType() == FontType.TRUETYPE) {
+                mergeFonts = new MergeTTFonts(newCmap);
+            } else if (getFontType() == FontType.TYPE1) {
+                mergeFonts = new MergeType1Fonts();
+            } else {
+                mergeFonts = new MergeCFFFonts();
+            }
         }
+        Map<Integer, Integer> chars = new HashMap<Integer, Integer>();
+        chars.put(0, 0);
+        mergeFonts.readFont(ff, shortFontName, pdFont, chars, false);
         fontCount++;
     }
 
     public InputStream getInputStream() throws IOException {
-        if (getFontType() == FontType.TYPE1C) {
-            mergeCFFFonts.writeFont();
-            return new ByteArrayInputStream(mergeCFFFonts.getFontSubset());
-        }
-        if (getFontType() == FontType.TRUETYPE) {
-            mergeTTFonts.writeFont(newCmap);
-            return new ByteArrayInputStream(mergeTTFonts.getFontSubset());
-        }
-        if (getFontType() == FontType.TYPE1) {
-            return new ByteArrayInputStream(mergeType1Fonts.writeFont());
-        }
-        return null;
+        return new ByteArrayInputStream(mergeFonts.getMergedFontSubset());
     }
 
     protected PDFont getFont(COSDictionary fontData) throws IOException {

Modified: 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeCFFFonts.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeCFFFonts.java?rev=1732856&r1=1732855&r2=1732856&view=diff
==============================================================================
--- 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeCFFFonts.java
 (original)
+++ 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeCFFFonts.java
 Mon Feb 29 11:21:02 2016
@@ -34,12 +34,13 @@ import org.apache.fontbox.cff.charset.CF
 import org.apache.fontbox.cff.charset.CFFISOAdobeCharset;
 import org.apache.fontbox.cff.encoding.CFFEncoding;
 import org.apache.fontbox.cff.encoding.CFFStandardEncoding;
+import org.apache.pdfbox.pdmodel.font.PDFont;
 
 import org.apache.fop.fonts.cff.CFFDataReader;
 import org.apache.fop.fonts.truetype.FontFileReader;
 import org.apache.fop.fonts.truetype.OTFSubSetFile;
 
-public class MergeCFFFonts extends OTFSubSetFile {
+public class MergeCFFFonts extends OTFSubSetFile implements MergeFonts {
     protected List<LinkedHashMap<Integer, Integer>> subsetGlyphsList = new 
ArrayList<LinkedHashMap<Integer, Integer>>();
     private boolean fallbackIndex;
     private int charsetOffset;
@@ -56,9 +57,10 @@ public class MergeCFFFonts extends OTFSu
         subsetCharStringsIndex = new ArrayList<byte[]>();
     }
 
-    public void readType1CFont(InputStream stream, String embeddedName) throws 
IOException {
-        this.embeddedName = embeddedName;
-        FontFileReader fontFile = new FontFileReader(stream);
+    public void readFont(InputStream is, String name, PDFont pdFont, 
Map<Integer, Integer> subsetGlyphs, boolean cid)
+        throws IOException {
+        this.embeddedName = name;
+        FontFileReader fontFile = new FontFileReader(is);
         CFFParser p = new CFFParser();
         CFFFont ff = p.parse(fontFile.getAllBytes()).get(0);
 
@@ -155,14 +157,15 @@ public class MergeCFFFonts extends OTFSu
         return ff.getCharStringsDict();
     }
 
-    public void writeFont() throws IOException {
+    public byte[] getMergedFontSubset() throws IOException {
         output = new byte[fontFileSize * 2];
         if (noOfFonts == 1) {
             writeBytes(fontFile.getAllBytes());
-            return;
+            return super.getFontSubset();
         }
         subsetGlyphs = subsetGlyphsList.get(0);
         createCFF();
+        return super.getFontSubset();
     }
 
     @Override

Added: 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFonts.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFonts.java?rev=1732856&view=auto
==============================================================================
--- 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFonts.java
 (added)
+++ 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFonts.java
 Mon Feb 29 11:21:02 2016
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.fop.render.pdf.pdfbox;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+
+import org.apache.pdfbox.pdmodel.font.PDFont;
+
+public interface MergeFonts {
+    void readFont(InputStream is, String name, PDFont pdFont, Map<Integer, 
Integer> subsetGlyphs, boolean cid)
+            throws IOException;
+    byte[] getMergedFontSubset() throws IOException;
+}

Propchange: 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFonts.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java?rev=1732856&r1=1732855&r2=1732856&view=diff
==============================================================================
--- 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java
 (original)
+++ 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java
 Mon Feb 29 11:21:02 2016
@@ -17,11 +17,13 @@
 package org.apache.fop.render.pdf.pdfbox;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
 
 import org.apache.fontbox.ttf.MaximumProfileTable;
+import org.apache.pdfbox.pdmodel.font.PDFont;
 
 import org.apache.fop.fonts.truetype.FontFileReader;
 import org.apache.fop.fonts.truetype.GlyfTable;
@@ -30,12 +32,13 @@ import org.apache.fop.fonts.truetype.OFM
 import org.apache.fop.fonts.truetype.OFTableName;
 import org.apache.fop.fonts.truetype.TTFSubSetFile;
 
-public class MergeTTFonts extends TTFSubSetFile {
+public class MergeTTFonts extends TTFSubSetFile implements MergeFonts {
     private Map<Integer, Glyph> added = new TreeMap<Integer, Glyph>();
     private int origIndexesLen;
     private int size;
     protected MaximumProfileTable maxp = new MaximumProfileTable();
     private Integer nhmtxDiff = null;
+    private List<Cmap> cmap;
 
     static class Glyph {
         final byte[] data;
@@ -46,6 +49,10 @@ public class MergeTTFonts extends TTFSub
         }
     }
 
+    public MergeTTFonts(List<Cmap> cmap) {
+        this.cmap = cmap;
+    }
+
     /**
      * Create the glyf table and fill in loca table
      * @param glyphs map of glyphs
@@ -200,18 +207,21 @@ public class MergeTTFonts extends TTFSub
     /**
      * Returns a subset of the original font.
      *
-     * @param fontFile font file
+     * @param is font file
+     * @param name name
+     * @param pdFont pdFont
      * @param subsetGlyphs Map of glyphs (glyphs has old index as (Integer) 
key and
      * new index as (Integer) value)
      * @param cid is cid
      * @throws IOException in case of an I/O problem
      */
-    public void readFont(FontFileReader fontFile, Map<Integer, Integer> 
subsetGlyphs, boolean cid) throws IOException {
+    public void readFont(InputStream is, String name, PDFont pdFont, 
Map<Integer, Integer> subsetGlyphs, boolean cid)
+        throws IOException {
         this.cid = cid;
         if (subsetGlyphs.isEmpty()) {
             return;
         }
-        this.fontFile = fontFile;
+        this.fontFile = new FontFileReader(is);
         size += fontFile.getAllBytes().length;
 
         readDirTabs();
@@ -265,7 +275,7 @@ public class MergeTTFonts extends TTFSub
         }
     }
 
-    public void writeFont(List<Cmap> cmap) throws IOException {
+    public byte[] getMergedFontSubset() throws IOException {
         output = new byte[size * 2];
         createDirectory();     // Create the TrueType header and directory
         int sgsize = added.size();
@@ -295,6 +305,7 @@ public class MergeTTFonts extends TTFSub
         createGlyf(); //create glyf table and update loca table
         pad4();
         createCheckSumAdjustment();
+        return getFontSubset();
     }
 
     private void writeMaxp() {

Modified: 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeType1Fonts.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeType1Fonts.java?rev=1732856&r1=1732855&r2=1732856&view=diff
==============================================================================
--- 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeType1Fonts.java
 (original)
+++ 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeType1Fonts.java
 Mon Feb 29 11:21:02 2016
@@ -28,6 +28,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.fontbox.encoding.Encoding;
+import org.apache.pdfbox.pdmodel.font.PDFont;
 import org.apache.pdfbox.pdmodel.font.PDType1Font;
 
 import org.apache.fop.fonts.type1.PFBData;
@@ -35,7 +36,7 @@ import org.apache.fop.fonts.type1.PFBPar
 import org.apache.fop.fonts.type1.PostscriptParser;
 import org.apache.fop.fonts.type1.Type1SubsetFile;
 
-public class MergeType1Fonts extends Type1SubsetFile {
+public class MergeType1Fonts extends Type1SubsetFile implements MergeFonts {
     private Map<Integer, String> nameMap = new HashMap<Integer, String>();
     private PostscriptParser.PSElement encoding;
     private List<String> subsetEncodingEntries = new ArrayList<String>();
@@ -54,12 +55,14 @@ public class MergeType1Fonts extends Typ
         subsetEncodingEntries.add("dup 0 /.notdef put");
     }
 
-    public void readFont(InputStream fontFile, PDType1Font font) throws 
IOException {
+    public void readFont(InputStream fontFile, String name, PDFont pdFont,
+                         Map<Integer, Integer> subsetGlyphs, boolean cid) 
throws IOException {
         PFBParser pfbParser = new PFBParser();
         pfbData = pfbParser.parsePFB(fontFile);
 
         PostscriptParser psParser = new PostscriptParser();
         List<Integer> glyphs = new ArrayList<Integer>();
+        PDType1Font font = (PDType1Font) pdFont;
         Encoding enc = font.getType1Font().getEncoding();
         for (int i = font.getFirstChar(); i <= font.getLastChar(); i++) {
             if (!enc.getName(i).equals(".notdef")) {
@@ -108,16 +111,19 @@ public class MergeType1Fonts extends Typ
             lenIV = Integer.parseInt(lenIVVar.getValue());
         }
         for (String e : cs.keySet()) {
-            byte[] charStringEntry = 
getBinaryEntry(charStrings.getBinaryEntries().get("/" + e), decoded);
-            if (lenIV != 4) {
-                charStringEntry = BinaryCoder.decodeBytes(charStringEntry, 
4330, lenIV);
-                charStringEntry = BinaryCoder.encodeBytes(charStringEntry, 
4330, 4);
+            int[] be = charStrings.getBinaryEntries().get("/" + e);
+            if (be != null) {
+                byte[] charStringEntry = getBinaryEntry(be, decoded);
+                if (lenIV != 4) {
+                    charStringEntry = BinaryCoder.decodeBytes(charStringEntry, 
4330, lenIV);
+                    charStringEntry = BinaryCoder.encodeBytes(charStringEntry, 
4330, 4);
+                }
+                subsetCharStrings.put("/" + e, charStringEntry);
             }
-            subsetCharStrings.put("/" + e, charStringEntry);
         }
     }
 
-    public byte[] writeFont() throws IOException {
+    public byte[] getMergedFontSubset() throws IOException {
         ByteArrayOutputStream boasHeader = writeHeader(pfbData, encoding);
 
         ByteArrayOutputStream boasMain = writeMainSection(decoded, 
mainSection, charStrings);
@@ -221,10 +227,12 @@ public class MergeType1Fonts extends Typ
         writeString("/lenIV 4 def", main);
         writeString("/Subrs " + subByteMap.size() + " array" + eol, main);
         for (Map.Entry<Integer, byte[]> e : subByteMap.entrySet()) {
-            byte[] encoded = BinaryCoder.encodeBytes(e.getValue(), 4330, 4);
-            writeString("dup " + e.getKey() + " " + encoded.length + " " + rd 
+ " ", main);
-            main.write(encoded);
-            writeString(" " + np + eol, main);
+            if (e.getValue() != null) {
+                byte[] encoded = BinaryCoder.encodeBytes(e.getValue(), 4330, 
4);
+                writeString("dup " + e.getKey() + " " + encoded.length + " " + 
rd + " ", main);
+                main.write(encoded);
+                writeString(" " + np + eol, main);
+            }
         }
         writeString(nd + eol, main);
         main.write(subrsEndStream.toByteArray());



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

Reply via email to