svn commit: r1811798 - in /xmlgraphics/fop-pdf-images/trunk: lib/fop.jar src/java/org/apache/fop/render/pdf/pdfbox/MergeCFFFonts.java src/java/org/apache/fop/render/pdf/pdfbox/OTFSubSetFile.java

[email protected]
Newsgroups gmane.text.xml.fop.cvs
Message-ID <[email protected]>
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.