Author: ssteiner
Date: Wed Oct 11 07:49:30 2017
New Revision: 1811798
URL: http://svn.apache.org/viewvc?rev=1811798&view=rev
Log:
FOP-2750: Use streams for OTF subsetting
Modified:
xmlgraphics/fop-pdf-images/trunk/lib/fop.jar
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/OTFSubSetFile.java
Modified: xmlgraphics/fop-pdf-images/trunk/lib/fop.jar
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/lib/fop.jar?rev=1811798&r1=1811797&r2=1811798&view=diff
==============================================================================
Binary files - no diff available.
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=1811798&r1=1811797&r2=1811798&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 Wed Oct 11 07:49:30 2017
@@ -16,6 +16,7 @@
*/
package org.apache.fop.render.pdf.pdfbox;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
@@ -218,7 +219,6 @@ public class MergeCFFFonts extends OTFSu
}
public byte[] getMergedFontSubset() throws IOException {
- output = new byte[fontFileSize * 2];
if (noOfFonts == 1) {
writeBytes(fontFile.getAllBytes());
return super.getFontSubset();
@@ -287,33 +287,25 @@ public class MergeCFFFonts extends OTFSu
if (hasFDSelect) {
offsets.fdArray = currentPos;
- int fdByteData = currentPos + cffReader.getFDFonts().size() + 4;
List<byte[]> index = new ArrayList<byte[]>();
- List<Integer> privateDictOffsets = new ArrayList<Integer>();
- for (CFFDataReader.FontDict fdFont : cffReader.getFDFonts()) {
- index.add(fdFont.getByteData());
- }
- writeIndex(index, 1);
- for (CFFDataReader.FontDict fdFont : cffReader.getFDFonts()) {
- privateDictOffsets.add(currentPos);
- writeBytes(fdFont.getPrivateDictData());
- writeIndex(new ArrayList<byte[]>());
- }
- currentPos = fdByteData;
- int i = 0;
+ int offset = currentPos + 5;
for (CFFDataReader.FontDict fdFont : cffReader.getFDFonts()) {
byte[] fdFontByteData = fdFont.getByteData();
+ offset += fdFontByteData.length;
Map<String, CFFDataReader.DICTEntry> fdFontDict = cffReader.parseDictData(fdFontByteData);
//Update the Private dict reference
CFFDataReader.DICTEntry fdPrivate = fdFontDict.get("Private");
updateOffset(fdFontByteData,
fdPrivate.getOffset() + fdPrivate.getOperandLengths().get(0),
fdPrivate.getOperandLengths().get(1),
- privateDictOffsets.get(i));
- writeBytes(fdFontByteData);
- i++;
+ offset);
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ bos.write(fdFontByteData);
+ bos.write(fdFont.getPrivateDictData());
+ bos.write(new byte[3]);
+ index.add(bos.toByteArray());
}
-
+ writeIndex(index, 1);
updateCIDOffsets(offsets);
} else {
//Update the offsets
@@ -456,40 +448,41 @@ public class MergeCFFFonts extends OTFSu
}
@Override
- protected void updateFixedOffsets(Map<String, CFFDataReader.DICTEntry> topDICT, Offsets offsets) {
+ protected void updateFixedOffsets(Map<String, CFFDataReader.DICTEntry> topDICT, Offsets offsets)
+ throws IOException {
//Charset offset in the top dict
final CFFDataReader.DICTEntry charset = topDICT.get("charset");
if (charset != null) {
int oldCharsetOffset = offsets.topDictData + charset.getOffset();
- int oldCharset = Integer.parseInt(String.format("%02x", output[oldCharsetOffset] & 0xff), 16);
+ int oldCharset = Integer.parseInt(String.format("%02x", getFontSubset()[oldCharsetOffset] & 0xff), 16);
if (oldCharset >= 32 && oldCharset <= 246) {
charsetOffset += 139;
}
- updateOffset(output, oldCharsetOffset, charset.getOperandLength(), charsetOffset);
+ updateOffset(oldCharsetOffset, charset.getOperandLength(), charsetOffset);
}
//Char string index offset in the private dict
final CFFDataReader.DICTEntry charString = topDICT.get("CharStrings");
int oldCharStringOffset = offsets.topDictData + charString.getOffset();
- int oldString = Integer.parseInt(String.format("%02x", output[oldCharStringOffset] & 0xff), 16);
+ int oldString = Integer.parseInt(String.format("%02x", getFontSubset()[oldCharStringOffset] & 0xff), 16);
if (oldString >= 32 && oldString <= 246) {
offsets.charString += 139;
}
if (!(fileFont.getCharset() instanceof CFFISOAdobeCharset)) {
- updateOffset(output, oldCharStringOffset, charString.getOperandLength(), offsets.charString);
+ updateOffset(oldCharStringOffset, charString.getOperandLength(), offsets.charString);
}
final CFFDataReader.DICTEntry encodingEntry = topDICT.get("Encoding");
if (encodingEntry != null && encodingEntry.getOperands().get(0).intValue() != 0
&& encodingEntry.getOperands().get(0).intValue() != 1) {
int oldEncodingOffset = offsets.topDictData + encodingEntry.getOffset();
- int oldEnc = Integer.parseInt(String.format("%02x", output[oldEncodingOffset] & 0xff), 16);
+ int oldEnc = Integer.parseInt(String.format("%02x", getFontSubset()[oldEncodingOffset] & 0xff), 16);
if (oldEnc >= 32 && oldEnc <= 246) {
offsets.encoding += 139;
} else {
offsets.encoding--;
}
- updateOffset(output, oldEncodingOffset, encodingEntry.getOperandLength(), offsets.encoding);
+ updateOffset(oldEncodingOffset, encodingEntry.getOperandLength(), offsets.encoding);
}
}
}
Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/OTFSubSetFile.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/OTFSubSetFile.java?rev=1811798&r1=1811797&r2=1811798&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/OTFSubSetFile.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/OTFSubSetFile.java Wed Oct 11 07:49:30 2017
@@ -268,7 +268,7 @@ public abstract class OTFSubSetFile exte
if (privateDICT != null) {
//Private index offset in the top dict
int oldPrivateOffset = offsets.topDictData + privateEntry.getOffset();
- updateOffset(output, oldPrivateOffset + privateEntry.getOperandLengths().get(0),
+ updateOffset(oldPrivateOffset + privateEntry.getOperandLengths().get(0),
privateEntry.getOperandLengths().get(1), offsets.privateDict);
//Update the local subroutine index offset in the private dict
@@ -280,7 +280,7 @@ public abstract class OTFSubSetFile exte
if (subroutines.getOperandLength() == 1) {
encodeValue = 139;
}
- updateOffset(output, oldLocalSubrOffset, subroutines.getOperandLength(),
+ updateOffset(oldLocalSubrOffset, subroutines.getOperandLength(),
(offsets.localIndex - offsets.privateDict) + encodeValue);
}
}
@@ -296,26 +296,33 @@ public abstract class OTFSubSetFile exte
Integer localIndex;
}
- protected abstract void updateFixedOffsets(Map<String, DICTEntry> topDICT, Offsets offsets);
+ protected abstract void updateFixedOffsets(Map<String, DICTEntry> topDICT, Offsets offsets) throws IOException;
- protected void updateCIDOffsets(Offsets offsets) {
+ protected void updateCIDOffsets(Offsets offsets) throws IOException {
Map<String, DICTEntry> topDict = cffReader.getTopDictEntries();
DICTEntry fdArrayEntry = topDict.get("FDArray");
if (fdArrayEntry != null) {
- updateOffset(output, offsets.topDictData + fdArrayEntry.getOffset() - 1,
+ updateOffset(offsets.topDictData + fdArrayEntry.getOffset() - 1,
fdArrayEntry.getOperandLength(), offsets.fdArray);
}
DICTEntry fdSelect = topDict.get("FDSelect");
if (fdSelect != null) {
- updateOffset(output, offsets.topDictData + fdSelect.getOffset() - 1,
+ updateOffset(offsets.topDictData + fdSelect.getOffset() - 1,
fdSelect.getOperandLength(), offsets.fdSelect);
}
updateFixedOffsets(topDict, offsets);
}
+ protected void updateOffset(int position, int length, int replacement) throws IOException {
+ byte[] out = output.toByteArray();
+ updateOffset(out, position, length, replacement);
+ output.reset();
+ output.write(out);
+ }
+
protected void updateOffset(byte[] out, int position, int length, int replacement) {
switch (length) {
case 1:
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.