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]