svn commit: r1756387 - in /xmlgraphics/fop/trunk/fop-core/src: main/java/org/apache/fop/fonts/ main/java/org/apache/fop/render/pcl/ main/java/org/apache/fop/render/pcl/fonts/ main/java/org/apache/fop/render/pcl/fonts/truetype/ test/java/org/apache/fop/...

[email protected]
Newsgroups gmane.text.xml.fop.cvs
Message-ID <[email protected]>
Author: ssteiner
Date: Mon Aug 15 14:15:27 2016
New Revision: 1756387

URL: http://svn.apache.org/viewvc?rev=1756387&view=rev
Log:
FOP-2642: Add optimize-resources for IF to PCL

Modified:
    xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fonts/CIDSubset.java
    xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/Java2DRendererOption.java
    xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLDocumentHandler.java
    xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLGenerator.java
    xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLPainter.java
    xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLRendererConfig.java
    xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLRendererConfigurator.java
    xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLRenderingUtil.java
    xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLByteWriterUtil.java
    xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLCharacterDefinition.java
    xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLCharacterWriter.java
    xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLFontReader.java
    xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLFontReaderFactory.java
    xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLSoftFontManager.java
    xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFCharacterWriter.java
    xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFFontReader.java
    xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/PCLPainterTestCase.java
    xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/MockPCLTTFFontReader.java
    xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/PCLByteWriterUtilTestCase.java
    xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/PCLFontReaderFactoryTestCase.java
    xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/PCLTTFFontReaderTestCase.java
    xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFCharacterWriterTestCase.java

Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fonts/CIDSubset.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fonts/CIDSubset.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fonts/CIDSubset.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fonts/CIDSubset.java Mon Aug 15 14:15:27 2016
@@ -22,6 +22,7 @@ package org.apache.fop.fonts;
 import java.util.BitSet;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Map;
 
 import org.apache.fop.util.CharUtilities;
@@ -40,7 +41,7 @@ public class CIDSubset implements CIDSet
     /**
      * usedGlyphs contains orginal, new glyph index (glyph index -> char selector)
      */
-    private Map<Integer, Integer> usedGlyphs = new HashMap<Integer, Integer>();
+    private Map<Integer, Integer> usedGlyphs = new LinkedHashMap<Integer, Integer>();
 
     /**
      * usedGlyphsIndex contains new glyph, original index (char selector -> glyph index)

Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/Java2DRendererOption.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/Java2DRendererOption.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/Java2DRendererOption.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/Java2DRendererOption.java Mon Aug 15 14:15:27 2016
@@ -28,6 +28,7 @@ public enum Java2DRendererOption impleme
     RENDERING_MODE("rendering", PCLRenderingMode.class),
     TEXT_RENDERING("text-rendering", Boolean.class),
     DISABLE_PJL("disable-pjl", Boolean.class),
+    OPTIMIZE_RESOURCES("optimize-resources", Boolean.class),
     MODE_COLOR("color", Boolean.class);
 
     private final String name;

Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLDocumentHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLDocumentHandler.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLDocumentHandler.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLDocumentHandler.java Mon Aug 15 14:15:27 2016
@@ -25,16 +25,26 @@ import java.awt.Graphics2D;
 import java.awt.Rectangle;
 import java.awt.RenderingHints;
 import java.awt.image.BufferedImage;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.util.Map;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import org.apache.xmlgraphics.io.TempResourceURIGenerator;
 import org.apache.xmlgraphics.util.UnitConv;
 
 import org.apache.fop.apps.FopFactoryConfig;
 import org.apache.fop.apps.MimeConstants;
 import org.apache.fop.fonts.FontInfo;
+import org.apache.fop.fonts.Typeface;
 import org.apache.fop.render.intermediate.AbstractBinaryWritingIFDocumentHandler;
 import org.apache.fop.render.intermediate.IFContext;
 import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
@@ -44,6 +54,7 @@ import org.apache.fop.render.java2d.Java
 import org.apache.fop.render.java2d.Java2DUtil;
 import org.apache.fop.render.pcl.PCLRendererConfig.PCLRendererConfigParser;
 import org.apache.fop.render.pcl.extensions.PCLElementMapping;
+import org.apache.fop.render.pcl.fonts.PCLSoftFontManager;
 
 /**
  * {@link org.apache.fop.render.intermediate.IFDocumentHandler} implementation
@@ -55,6 +66,10 @@ public class PCLDocumentHandler extends
     /** logging instance */
     private static Log log = LogFactory.getLog(PCLDocumentHandler.class);
 
+    /** the temporary file in case of two-pass processing */
+    private URI tempURI;
+    private static final TempResourceURIGenerator TEMP_URI_GENERATOR = new TempResourceURIGenerator("pcl-optimize");
+
     /** Utility class for handling all sorts of peripheral tasks around PCL generation. */
     protected PCLRenderingUtil pclUtil;
 
@@ -127,7 +142,15 @@ public class PCLDocumentHandler extends
     public void startDocument() throws IFException {
         super.startDocument();
         try {
-            this.gen = new PCLGenerator(this.outputStream, getResolution());
+            final OutputStream out;
+            if (pclUtil.isOptimizeResources()) {
+                tempURI = TEMP_URI_GENERATOR.generate();
+                out = new BufferedOutputStream(getUserAgent().getResourceResolver().getOutputStream(tempURI));
+            } else {
+                out = this.outputStream;
+            }
+
+            this.gen = new PCLGenerator(out, getResolution());
             this.gen.setDitheringQuality(pclUtil.getDitheringQuality());
 
             if (!pclUtil.isPJLDisabled()) {
@@ -161,12 +184,47 @@ public class PCLDocumentHandler extends
             if (!pclUtil.isPJLDisabled()) {
                 gen.universalEndOfLanguage();
             }
+
+            if (pclUtil.isOptimizeResources()) {
+                IOUtils.closeQuietly(gen.getOutputStream());
+                rewritePCLFile();
+            }
         } catch (IOException ioe) {
             throw new IFException("I/O error in endDocument()", ioe);
         }
         super.endDocument();
     }
 
+    private void rewritePCLFile() throws IOException {
+        InputStream in = new BufferedInputStream(getUserAgent().getResourceResolver().getResource(tempURI));
+        long offset = 0;
+        for (Map.Entry<PCLSoftFontManager, Map<Typeface, Long>> fontManagerMapEntry : gen.fontManagerMap.entrySet()) {
+            PCLSoftFontManager softFontManager = fontManagerMapEntry.getKey();
+            for (Map.Entry<Typeface, Long> fontEntry : fontManagerMapEntry.getValue().entrySet()) {
+                ByteArrayOutputStream fontData = softFontManager.makeSoftFont(fontEntry.getKey(), null);
+                long pos = fontEntry.getValue();
+                copy(in, pos - offset);
+                outputStream.write(fontData.toByteArray());
+                offset = pos;
+            }
+        }
+        copy(in, Long.MAX_VALUE);
+        this.outputStream.flush();
+        IOUtils.closeQuietly(in);
+    }
+
+    private void copy(InputStream is, long len) throws IOException {
+        while (len > 0) {
+            int bufsize = (int) Math.min(1024, len);
+            byte[] buf = new byte[bufsize];
+            if (is.read(buf) == -1) {
+                return;
+            }
+            outputStream.write(buf);
+            len -= bufsize;
+        }
+    }
+
     /** {@inheritDoc} */
     public void startPageSequence(String id) throws IFException {
         //nop

Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLGenerator.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLGenerator.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLGenerator.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLGenerator.java Mon Aug 15 14:15:27 2016
@@ -39,13 +39,20 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.text.DecimalFormat;
 import java.text.DecimalFormatSymbols;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Locale;
+import java.util.Map;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.output.ByteArrayOutputStream;
+import org.apache.commons.io.output.CountingOutputStream;
 
 import org.apache.xmlgraphics.util.UnitConv;
 
+import org.apache.fop.fonts.Typeface;
+import org.apache.fop.render.pcl.fonts.PCLFontReader;
+import org.apache.fop.render.pcl.fonts.PCLSoftFontManager;
 import org.apache.fop.util.bitmap.BitmapImageUtil;
 import org.apache.fop.util.bitmap.DitherUtil;
 
@@ -68,7 +75,10 @@ public class PCLGenerator {
     private final DecimalFormat df2 = new DecimalFormat("0.##", symbols);
     private final DecimalFormat df4 = new DecimalFormat("0.####", symbols);
 
-    private final OutputStream out;
+    private final CountingOutputStream out;
+    protected Map<Typeface, PCLFontReader> fontReaderMap = new HashMap<Typeface, PCLFontReader>();
+    protected Map<PCLSoftFontManager, Map<Typeface, Long>> fontManagerMap
+            = new LinkedHashMap<PCLSoftFontManager, Map<Typeface, Long>>();
 
     private boolean currentSourceTransparency = true;
     private boolean currentPatternTransparency = true;
@@ -87,7 +97,7 @@ public class PCLGenerator {
      * @param out the OutputStream to write the PCL stream to
      */
     public PCLGenerator(OutputStream out) {
-        this.out = out;
+        this.out = new CountingOutputStream(out);
     }
 
     /**
@@ -110,6 +120,16 @@ public class PCLGenerator {
         this.maxBitmapResolution = maxResolution;
     }
 
+    public void addFont(PCLSoftFontManager sfManager, Typeface font) {
+        if (!fontManagerMap.containsKey(sfManager)) {
+            fontManagerMap.put(sfManager, new LinkedHashMap<Typeface, Long>());
+        }
+        Map<Typeface, Long> fonts = fontManagerMap.get(sfManager);
+        if (!fonts.containsKey(font)) {
+            fonts.put(font, out.getByteCount());
+        }
+    }
+
     /** @return the OutputStream that this generator writes to */
     public OutputStream getOutputStream() {
         return this.out;

Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLPainter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLPainter.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLPainter.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLPainter.java Mon Aug 15 14:15:27 2016
@@ -85,8 +85,7 @@ public class PCLPainter extends Abstract
 
     private Stack<GraphicContext> graphicContextStack = new Stack<GraphicContext>();
     private GraphicContext graphicContext = new GraphicContext();
-
-    private PCLSoftFontManager sfManager = new PCLSoftFontManager();
+    private PCLSoftFontManager sfManager;
 
     /**
      * Main constructor.
@@ -338,12 +337,20 @@ public class PCLPainter extends Abstract
             } else {
                 // TrueType conversion to a soft font (PCL 5 Technical Reference - Chapter 11)
                 if (!drawAsBitmaps && isTrueType(tf)) {
-                    boolean madeSF = false;
-                    if (sfManager.getSoftFont(tf, text) == null) {
-                        madeSF = true;
-                        ByteArrayOutputStream baos = sfManager.makeSoftFont(tf);
+                    if (sfManager == null) {
+                        sfManager = new PCLSoftFontManager(gen.fontReaderMap);
+                    }
+                    if (getPCLUtil().isOptimizeResources() || sfManager.getSoftFont(tf, text) == null) {
+                        for (char c : text.toCharArray()) {
+                            tf.mapChar(c);
+                        }
+                        ByteArrayOutputStream baos = sfManager.makeSoftFont(tf, text);
                         if (baos != null) {
-                            gen.writeBytes(baos.toByteArray());
+                            if (getPCLUtil().isOptimizeResources()) {
+                                gen.addFont(sfManager, tf);
+                            } else {
+                                gen.writeBytes(baos.toByteArray());
+                            }
                         }
                     }
                     String formattedSize = gen.formatDouble2(state.getFontSize() / 1000.0);

Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLRendererConfig.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLRendererConfig.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLRendererConfig.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLRendererConfig.java Mon Aug 15 14:15:27 2016
@@ -34,6 +34,7 @@ import org.apache.fop.render.RendererCon
 
 import static org.apache.fop.render.pcl.Java2DRendererOption.DISABLE_PJL;
 import static org.apache.fop.render.pcl.Java2DRendererOption.MODE_COLOR;
+import static org.apache.fop.render.pcl.Java2DRendererOption.OPTIMIZE_RESOURCES;
 import static org.apache.fop.render.pcl.Java2DRendererOption.RENDERING_MODE;
 import static org.apache.fop.render.pcl.Java2DRendererOption.TEXT_RENDERING;
 
@@ -71,6 +72,10 @@ public final class PCLRendererConfig imp
         return getParam(MODE_COLOR, Boolean.class);
     }
 
+    public Boolean isOptimizeResources() {
+        return getParam(OPTIMIZE_RESOURCES, Boolean.class);
+    }
+
     private <T> T getParam(Java2DRendererOption option, Class<T> type) {
         assert option.getType().equals(type);
         return type.cast(params.get(option));
@@ -124,6 +129,8 @@ public final class PCLRendererConfig imp
                 }
                 config.setParam(DISABLE_PJL,
                         cfg.getChild(DISABLE_PJL.getName()).getValueAsBoolean(false));
+                config.setParam(OPTIMIZE_RESOURCES,
+                        cfg.getChild(OPTIMIZE_RESOURCES.getName()).getValueAsBoolean(false));
             }
         }
 

Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLRendererConfigurator.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLRendererConfigurator.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLRendererConfigurator.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLRendererConfigurator.java Mon Aug 15 14:15:27 2016
@@ -70,6 +70,9 @@ public class PCLRendererConfigurator ext
         if (config.isColorEnabled() != null) {
             pclUtil.setColorEnabled(config.isColorEnabled());
         }
+        if (config.isOptimizeResources() != null) {
+            pclUtil.setOptimizeResources(config.isOptimizeResources());
+        }
     }
 
     @Override

Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLRenderingUtil.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLRenderingUtil.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLRenderingUtil.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/PCLRenderingUtil.java Mon Aug 15 14:15:27 2016
@@ -51,6 +51,7 @@ public class PCLRenderingUtil {
     private float ditheringQuality = 0.5f;
 
     private boolean useColor;
+    private boolean optimizeResources;
 
     /**
      * Controls whether the generation of PJL commands gets disabled.
@@ -228,4 +229,12 @@ public class PCLRenderingUtil {
         return transPoint;
     }
 
+    public boolean isOptimizeResources() {
+        return optimizeResources;
+    }
+
+    public void setOptimizeResources(boolean b) {
+        optimizeResources = b;
+    }
+
 }

Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLByteWriterUtil.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLByteWriterUtil.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLByteWriterUtil.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLByteWriterUtil.java Mon Aug 15 14:15:27 2016
@@ -23,13 +23,16 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.util.Arrays;
 
-public class PCLByteWriterUtil {
+public final class PCLByteWriterUtil {
 
-    public byte[] padBytes(byte[] in, int length) {
+    private PCLByteWriterUtil() {
+    }
+
+    public static byte[] padBytes(byte[] in, int length) {
         return padBytes(in, length, 0);
     }
 
-    public byte[] padBytes(byte[] in, int length, int value) {
+    public static byte[] padBytes(byte[] in, int length, int value) {
         byte[] out = new byte[length];
         for (int i = 0; i < length; i++) {
             if (i < in.length) {
@@ -41,21 +44,21 @@ public class PCLByteWriterUtil {
         return out;
     }
 
-    public byte[] signedInt(int s) {
+    public static byte[] signedInt(int s) {
         byte b1 = (byte) (s >> 8);
         byte b2 = (byte) s;
         return new byte[]{b1, b2};
     }
 
-    public byte signedByte(int s) {
+    public static byte signedByte(int s) {
         return (byte) s;
     }
 
-    public byte[] unsignedLongInt(int s) {
+    public static byte[] unsignedLongInt(int s) {
         return unsignedLongInt((long) s);
     }
 
-    public byte[] unsignedLongInt(long s) {
+    public static byte[] unsignedLongInt(long s) {
         byte b1 = (byte) ((s >> 24) & 0xff);
         byte b2 = (byte) ((s >> 16) & 0xff);
         byte b3 = (byte) ((s >> 8) & 0xff);
@@ -63,17 +66,17 @@ public class PCLByteWriterUtil {
         return new byte[]{b1, b2, b3, b4};
     }
 
-    public byte[] unsignedInt(int s) {
+    public static byte[] unsignedInt(int s) {
         byte b1 = (byte) ((s >> 8) & 0xff);
         byte b2 = (byte) (s & 0xff);
         return new byte[]{b1, b2};
     }
 
-    public int unsignedByte(int b) {
+    public static int unsignedByte(int b) {
         return (byte) b & 0xFF;
     }
 
-    public int maxPower2(int value) {
+    public static int maxPower2(int value) {
         int test = 2;
         while (test < value) {
             test *= 2;
@@ -81,11 +84,11 @@ public class PCLByteWriterUtil {
         return test;
     }
 
-    public int log(int x, int base) {
+    public static int log(int x, int base) {
         return (int) (Math.log(x) / Math.log(base));
     }
 
-    public byte[] toByteArray(int[] s) {
+    public static byte[] toByteArray(int[] s) {
         byte[] values = new byte[s.length];
         for (int i = 0; i < s.length; i++) {
             values[i] = (byte) s[i];
@@ -93,7 +96,7 @@ public class PCLByteWriterUtil {
         return values;
     }
 
-    public byte[] insertIntoArray(int index, byte[] insertTo, byte[] data) throws IOException {
+    public static byte[] insertIntoArray(int index, byte[] insertTo, byte[] data) throws IOException {
         byte[] preBytes = Arrays.copyOf(insertTo, index);
         byte[] postBytes = Arrays.copyOfRange(insertTo, index, insertTo.length);
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
@@ -103,7 +106,7 @@ public class PCLByteWriterUtil {
         return baos.toByteArray();
     }
 
-    public byte[] updateDataAtLocation(byte[] data, byte[] update, int offset) {
+    public static byte[] updateDataAtLocation(byte[] data, byte[] update, int offset) {
         int count = 0;
         for (int i = offset; i < offset + update.length; i++) {
             data[i] = update[count++];
@@ -116,7 +119,7 @@ public class PCLByteWriterUtil {
      * @param cmd the command (without the ESCAPE character)
      * @throws IOException In case of an I/O error
      */
-    public byte[] writeCommand(String cmd) throws IOException {
+    public static byte[] writeCommand(String cmd) throws IOException {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         baos.write(27); // ESC
         baos.write(cmd.getBytes("US-ASCII"));

Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLCharacterDefinition.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLCharacterDefinition.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLCharacterDefinition.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLCharacterDefinition.java Mon Aug 15 14:15:27 2016
@@ -31,18 +31,15 @@ public class PCLCharacterDefinition {
     private boolean hasContinuation;
     private PCLCharacterFormat charFormat;
     private PCLCharacterClass charClass;
-    private PCLByteWriterUtil pclByteWriter;
     private List<PCLCharacterDefinition> composites;
     private boolean isComposite;
 
     public PCLCharacterDefinition(int charCode, PCLCharacterFormat charFormat,
-            PCLCharacterClass charClass, byte[] glyfData, PCLByteWriterUtil pclByteWriter,
-            boolean isComposite) {
+            PCLCharacterClass charClass, byte[] glyfData, boolean isComposite) {
         this.charCode = charCode;
         this.charFormat = charFormat;
         this.charClass = charClass;
         this.glyfData = glyfData;
-        this.pclByteWriter = pclByteWriter;
         this.isComposite = isComposite;
         // Glyph Data + (Descriptor Size) + (Character Data Size) + (Glyph ID) must
         // be less than 32767 otherwise it will result in a continuation structure.
@@ -52,11 +49,11 @@ public class PCLCharacterDefinition {
     }
 
     public byte[] getCharacterCommand() throws IOException {
-        return pclByteWriter.writeCommand(String.format("*c%dE", (isComposite) ? 65535 : charCode));
+        return PCLByteWriterUtil.writeCommand(String.format("*c%dE", (isComposite) ? 65535 : charCode));
     }
 
     public byte[] getCharacterDefinitionCommand() throws IOException {
-        return pclByteWriter.writeCommand(String.format("(s%dW", 10 + glyfData.length));
+        return PCLByteWriterUtil.writeCommand(String.format("(s%dW", 10 + glyfData.length));
     }
 
     public byte[] getData() throws IOException {
@@ -89,12 +86,12 @@ public class PCLCharacterDefinition {
     }
 
     private void writeCharacterDescriptorHeader(int continuation, ByteArrayOutputStream baos) throws IOException {
-        baos.write(pclByteWriter.unsignedByte(charFormat.getValue()));
+        baos.write(PCLByteWriterUtil.unsignedByte(charFormat.getValue()));
         baos.write(continuation);
-        baos.write(pclByteWriter.unsignedByte(2)); // Descriptor size (from this byte to character data)
-        baos.write(pclByteWriter.unsignedByte(charClass.getValue()));
-        baos.write(pclByteWriter.unsignedInt(glyfData.length + 4));
-        baos.write(pclByteWriter.unsignedInt(charCode));
+        baos.write(PCLByteWriterUtil.unsignedByte(2)); // Descriptor size (from this byte to character data)
+        baos.write(PCLByteWriterUtil.unsignedByte(charClass.getValue()));
+        baos.write(PCLByteWriterUtil.unsignedInt(glyfData.length + 4));
+        baos.write(PCLByteWriterUtil.unsignedInt(charCode));
     }
 
     public void addCompositeGlyph(PCLCharacterDefinition composite) {

Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLCharacterWriter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLCharacterWriter.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLCharacterWriter.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLCharacterWriter.java Mon Aug 15 14:15:27 2016
@@ -27,7 +27,6 @@ import org.apache.fop.fonts.truetype.Ope
 public abstract class PCLCharacterWriter {
 
     protected PCLSoftFont font;
-    protected PCLByteWriterUtil pclByteWriter;
     protected OpenFont openFont;
     protected FontFileReader fontReader;
 
@@ -35,7 +34,6 @@ public abstract class PCLCharacterWriter
         this.font = font;
         openFont = font.getOpenFont();
         fontReader = font.getReader();
-        pclByteWriter = new PCLByteWriterUtil();
     }
 
     public abstract byte[] writeCharacterDefinitions(String text) throws IOException;

Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLFontReader.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLFontReader.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLFontReader.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLFontReader.java Mon Aug 15 14:15:27 2016
@@ -31,12 +31,10 @@ import org.apache.fop.fonts.truetype.Ope
 public abstract class PCLFontReader {
 
     protected Typeface typeface;
-    protected PCLByteWriterUtil pclByteWriter;
     protected CustomFont font;
 
-    public PCLFontReader(Typeface font, PCLByteWriterUtil pclByteWriter) {
+    public PCLFontReader(Typeface font) {
         this.typeface = font;
-        this.pclByteWriter = pclByteWriter;
     }
 
     public void setFont(CustomFont mbFont) {
@@ -81,6 +79,7 @@ public abstract class PCLFontReader {
     public abstract int getMasterUnderlineThickness() throws IOException;
     public abstract int getFontScalingTechnology();
     public abstract int getVariety();
+    public abstract Map<Integer, Integer> scanMtxCharacters() throws IOException;
 
     /** Segmented Font Data **/
     public abstract List<PCLFontSegment> getFontSegments(Map<Character, Integer> mappedGlyphs)

Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLFontReaderFactory.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLFontReaderFactory.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLFontReaderFactory.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLFontReaderFactory.java Mon Aug 15 14:15:27 2016
@@ -31,19 +31,12 @@ import org.apache.fop.render.pcl.fonts.t
 
 public final class PCLFontReaderFactory {
 
-    private PCLByteWriterUtil pclByteWriter;
-
-    private PCLFontReaderFactory(PCLByteWriterUtil pclByteWriter) {
-        this.pclByteWriter = pclByteWriter;
-    }
-
-    public static PCLFontReaderFactory getInstance(PCLByteWriterUtil pclByteWriter) {
-        return new PCLFontReaderFactory(pclByteWriter);
+    private PCLFontReaderFactory() {
     }
 
-    public PCLFontReader createInstance(Typeface font) throws IOException {
+    public static PCLFontReader createInstance(Typeface font) throws IOException {
         if (font.getFontType() == FontType.TRUETYPE || isCIDType2(font)) {
-            return new PCLTTFFontReader(font, pclByteWriter);
+            return new PCLTTFFontReader(font);
         }
         // else if (font instanceof MultiByteFont && ((MultiByteFont) font).isOTFFile()) {
             // Placeholder for future Type 1 / OTF Soft font implementations e.g.
@@ -52,7 +45,7 @@ public final class PCLFontReaderFactory
         return null;
     }
 
-    private boolean isCIDType2(Typeface font) {
+    private static boolean isCIDType2(Typeface font) {
         CustomFontMetricsMapper fontMetrics = (CustomFontMetricsMapper) font;
         CustomFont customFont = (CustomFont) fontMetrics.getRealFont();
 

Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLSoftFontManager.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLSoftFontManager.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLSoftFontManager.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/PCLSoftFontManager.java Mon Aug 15 14:15:27 2016
@@ -21,8 +21,10 @@ package org.apache.fop.render.pcl.fonts;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -32,35 +34,37 @@ import org.apache.fop.fonts.Typeface;
 import org.apache.fop.render.java2d.CustomFontMetricsMapper;
 
 public class PCLSoftFontManager {
-    private ByteArrayOutputStream baos = new ByteArrayOutputStream();
+    private Map<Typeface, PCLFontReader> fontReaderMap;
     private PCLFontReader fontReader;
-    private PCLByteWriterUtil pclByteWriter = new PCLByteWriterUtil();
     private List<PCLSoftFont> fonts = new ArrayList<PCLSoftFont>();
-    private PCLFontReaderFactory fontReaderFactory;
 
     private static final int SOFT_FONT_SIZE = 255;
 
-    public ByteArrayOutputStream makeSoftFont(Typeface font) throws IOException {
+    public PCLSoftFontManager(Map<Typeface, PCLFontReader> fontReaderMap) {
+        this.fontReaderMap = fontReaderMap;
+    }
+
+    public ByteArrayOutputStream makeSoftFont(Typeface font, String text) throws IOException {
         List<Map<Character, Integer>> mappedGlyphs = mapFontGlyphs(font);
-        if (fontReaderFactory == null) {
-            fontReaderFactory = PCLFontReaderFactory.getInstance(pclByteWriter);
+        if (!fontReaderMap.containsKey(font)) {
+            fontReaderMap.put(font, PCLFontReaderFactory.createInstance(font));
         }
-        fontReader = fontReaderFactory.createInstance(font);
-        initialize();
+        fontReader = fontReaderMap.get(font);
         if (mappedGlyphs.isEmpty()) {
             mappedGlyphs.add(new HashMap<Character, Integer>());
         }
         if (fontReader != null) {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            PCLSoftFont softFont = null;
             for (Map<Character, Integer> glyphSet : mappedGlyphs) {
-                PCLSoftFont softFont = new PCLSoftFont(fonts.size() + 1, font,
-                        mappedGlyphs.get(0).size() != 0);
+                softFont = getSoftFont(font, text, mappedGlyphs, softFont);
                 softFont.setMappedChars(glyphSet);
-                assignFontID();
-                writeFontHeader(softFont.getMappedChars());
+                writeFontID(softFont.getFontID(), baos);
+                writeFontHeader(softFont.getMappedChars(), baos);
                 softFont.setCharacterOffsets(fontReader.getCharacterOffsets());
                 softFont.setOpenFont(fontReader.getFontFile());
                 softFont.setReader(fontReader.getFontFileReader());
-                fonts.add(softFont);
+                softFont.setMtxCharIndexes(fontReader.scanMtxCharacters());
             }
             return baos;
         } else {
@@ -68,6 +72,29 @@ public class PCLSoftFontManager {
         }
     }
 
+    private PCLSoftFont getSoftFont(Typeface font, String text, List<Map<Character, Integer>> mappedGlyphs,
+                                    PCLSoftFont last) {
+        if (text == null) {
+            Iterator<PCLSoftFont> fontIterator = fonts.iterator();
+            while (fontIterator.hasNext()) {
+                PCLSoftFont sftFont = fontIterator.next();
+                if (sftFont.getTypeface().equals(font)) {
+                    fontIterator.remove();
+                    return sftFont;
+                }
+            }
+        }
+        for (PCLSoftFont sftFont : fonts) {
+            if (sftFont.getTypeface().equals(font) && sftFont != last
+                    && (sftFont.getCharCount() + countNonMatches(sftFont, text)) < SOFT_FONT_SIZE) {
+                return sftFont;
+            }
+        }
+        PCLSoftFont f = new PCLSoftFont(fonts.size() + 1, font, mappedGlyphs.get(0).size() != 0);
+        fonts.add(f);
+        return f;
+    }
+
     private List<Map<Character, Integer>> mapFontGlyphs(Typeface tf) {
         List<Map<Character, Integer>> mappedGlyphs = new ArrayList<Map<Character, Integer>>();
         if (tf instanceof CustomFontMetricsMapper) {
@@ -101,63 +128,59 @@ public class PCLSoftFontManager {
         return mappedGlyphs;
     }
 
-    private void initialize() {
-        baos.reset();
-    }
-
-    private void assignFontID() throws IOException {
-        baos.write(assignFontID(fonts.size() + 1));
+    private void writeFontID(int fontID, OutputStream os) throws IOException {
+        os.write(assignFontID(fontID));
     }
 
     public byte[] assignFontID(int fontID) throws IOException {
-        return pclByteWriter.writeCommand(String.format("*c%dD", fontID));
+        return PCLByteWriterUtil.writeCommand(String.format("*c%dD", fontID));
     }
 
-    private void writeFontHeader(Map<Character, Integer> mappedGlyphs) throws IOException {
+    private void writeFontHeader(Map<Character, Integer> mappedGlyphs, OutputStream os) throws IOException {
         ByteArrayOutputStream header = new ByteArrayOutputStream();
-        header.write(pclByteWriter.unsignedInt(fontReader.getDescriptorSize()));
-        header.write(pclByteWriter.unsignedByte(fontReader.getHeaderFormat()));
-        header.write(pclByteWriter.unsignedByte(fontReader.getFontType()));
-        header.write(pclByteWriter.unsignedByte(fontReader.getStyleMSB()));
+        header.write(PCLByteWriterUtil.unsignedInt(fontReader.getDescriptorSize()));
+        header.write(PCLByteWriterUtil.unsignedByte(fontReader.getHeaderFormat()));
+        header.write(PCLByteWriterUtil.unsignedByte(fontReader.getFontType()));
+        header.write(PCLByteWriterUtil.unsignedByte(fontReader.getStyleMSB()));
         header.write(0); // Reserved
-        header.write(pclByteWriter.unsignedInt(fontReader.getBaselinePosition()));
-        header.write(pclByteWriter.unsignedInt(fontReader.getCellWidth()));
-        header.write(pclByteWriter.unsignedInt(fontReader.getCellHeight()));
-        header.write(pclByteWriter.unsignedByte(fontReader.getOrientation()));
+        header.write(PCLByteWriterUtil.unsignedInt(fontReader.getBaselinePosition()));
+        header.write(PCLByteWriterUtil.unsignedInt(fontReader.getCellWidth()));
+        header.write(PCLByteWriterUtil.unsignedInt(fontReader.getCellHeight()));
+        header.write(PCLByteWriterUtil.unsignedByte(fontReader.getOrientation()));
         header.write(fontReader.getSpacing());
-        header.write(pclByteWriter.unsignedInt(fontReader.getSymbolSet()));
-        header.write(pclByteWriter.unsignedInt(fontReader.getPitch()));
-        header.write(pclByteWriter.unsignedInt(fontReader.getHeight()));
-        header.write(pclByteWriter.unsignedInt(fontReader.getXHeight()));
-        header.write(pclByteWriter.signedByte(fontReader.getWidthType()));
-        header.write(pclByteWriter.unsignedByte(fontReader.getStyleLSB()));
-        header.write(pclByteWriter.signedByte(fontReader.getStrokeWeight()));
-        header.write(pclByteWriter.unsignedByte(fontReader.getTypefaceLSB()));
-        header.write(pclByteWriter.unsignedByte(fontReader.getTypefaceMSB()));
-        header.write(pclByteWriter.unsignedByte(fontReader.getSerifStyle()));
-        header.write(pclByteWriter.unsignedByte(fontReader.getQuality()));
-        header.write(pclByteWriter.signedByte(fontReader.getPlacement()));
-        header.write(pclByteWriter.signedByte(fontReader.getUnderlinePosition()));
-        header.write(pclByteWriter.unsignedByte(fontReader.getUnderlineThickness()));
-        header.write(pclByteWriter.unsignedInt(fontReader.getTextHeight()));
-        header.write(pclByteWriter.unsignedInt(fontReader.getTextWidth()));
-        header.write(pclByteWriter.unsignedInt(fontReader.getFirstCode()));
-        header.write(pclByteWriter.unsignedInt(fontReader.getLastCode()));
-        header.write(pclByteWriter.unsignedByte(fontReader.getPitchExtended()));
-        header.write(pclByteWriter.unsignedByte(fontReader.getHeightExtended()));
-        header.write(pclByteWriter.unsignedInt(fontReader.getCapHeight()));
-        header.write(pclByteWriter.unsignedLongInt(fontReader.getFontNumber()));
-        header.write(pclByteWriter.padBytes(fontReader.getFontName().getBytes("US-ASCII"), 16, 32));
-        header.write(pclByteWriter.unsignedInt(fontReader.getScaleFactor()));
-        header.write(pclByteWriter.signedInt(fontReader.getMasterUnderlinePosition()));
-        header.write(pclByteWriter.unsignedInt(fontReader.getMasterUnderlineThickness()));
-        header.write(pclByteWriter.unsignedByte(fontReader.getFontScalingTechnology()));
-        header.write(pclByteWriter.unsignedByte(fontReader.getVariety()));
+        header.write(PCLByteWriterUtil.unsignedInt(fontReader.getSymbolSet()));
+        header.write(PCLByteWriterUtil.unsignedInt(fontReader.getPitch()));
+        header.write(PCLByteWriterUtil.unsignedInt(fontReader.getHeight()));
+        header.write(PCLByteWriterUtil.unsignedInt(fontReader.getXHeight()));
+        header.write(PCLByteWriterUtil.signedByte(fontReader.getWidthType()));
+        header.write(PCLByteWriterUtil.unsignedByte(fontReader.getStyleLSB()));
+        header.write(PCLByteWriterUtil.signedByte(fontReader.getStrokeWeight()));
+        header.write(PCLByteWriterUtil.unsignedByte(fontReader.getTypefaceLSB()));
+        header.write(PCLByteWriterUtil.unsignedByte(fontReader.getTypefaceMSB()));
+        header.write(PCLByteWriterUtil.unsignedByte(fontReader.getSerifStyle()));
+        header.write(PCLByteWriterUtil.unsignedByte(fontReader.getQuality()));
+        header.write(PCLByteWriterUtil.signedByte(fontReader.getPlacement()));
+        header.write(PCLByteWriterUtil.signedByte(fontReader.getUnderlinePosition()));
+        header.write(PCLByteWriterUtil.unsignedByte(fontReader.getUnderlineThickness()));
+        header.write(PCLByteWriterUtil.unsignedInt(fontReader.getTextHeight()));
+        header.write(PCLByteWriterUtil.unsignedInt(fontReader.getTextWidth()));
+        header.write(PCLByteWriterUtil.unsignedInt(fontReader.getFirstCode()));
+        header.write(PCLByteWriterUtil.unsignedInt(fontReader.getLastCode()));
+        header.write(PCLByteWriterUtil.unsignedByte(fontReader.getPitchExtended()));
+        header.write(PCLByteWriterUtil.unsignedByte(fontReader.getHeightExtended()));
+        header.write(PCLByteWriterUtil.unsignedInt(fontReader.getCapHeight()));
+        header.write(PCLByteWriterUtil.unsignedLongInt(fontReader.getFontNumber()));
+        header.write(PCLByteWriterUtil.padBytes(fontReader.getFontName().getBytes("US-ASCII"), 16, 32));
+        header.write(PCLByteWriterUtil.unsignedInt(fontReader.getScaleFactor()));
+        header.write(PCLByteWriterUtil.signedInt(fontReader.getMasterUnderlinePosition()));
+        header.write(PCLByteWriterUtil.unsignedInt(fontReader.getMasterUnderlineThickness()));
+        header.write(PCLByteWriterUtil.unsignedByte(fontReader.getFontScalingTechnology()));
+        header.write(PCLByteWriterUtil.unsignedByte(fontReader.getVariety()));
 
         writeSegmentedFontData(header, mappedGlyphs);
 
-        baos.write(getFontHeaderCommand(header.size()));
-        baos.write(header.toByteArray());
+        os.write(getFontHeaderCommand(header.size()));
+        os.write(header.toByteArray());
     }
 
     private void writeSegmentedFontData(ByteArrayOutputStream header,
@@ -178,12 +201,12 @@ public class PCLSoftFontManager {
     }
 
     private byte[] getFontHeaderCommand(int headerSize) throws IOException {
-        return pclByteWriter.writeCommand(String.format(")s%dW", headerSize));
+        return PCLByteWriterUtil.writeCommand(String.format(")s%dW", headerSize));
     }
 
     private void writeFontSegment(ByteArrayOutputStream header, PCLFontSegment segment) throws IOException {
-        header.write(pclByteWriter.unsignedInt(segment.getIdentifier().getValue()));
-        header.write(pclByteWriter.unsignedInt(segment.getData().length));
+        header.write(PCLByteWriterUtil.unsignedInt(segment.getIdentifier().getValue()));
+        header.write(PCLByteWriterUtil.unsignedInt(segment.getData().length));
         header.write(segment.getData());
     }
 

Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFCharacterWriter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFCharacterWriter.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFCharacterWriter.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFCharacterWriter.java Mon Aug 15 14:15:27 2016
@@ -44,7 +44,6 @@ public class PCLTTFCharacterWriter exten
 
     public PCLTTFCharacterWriter(PCLSoftFont softFont) throws IOException {
         super(softFont);
-        softFont.setMtxCharIndexes(scanMtxCharacters());
     }
 
     @Override
@@ -70,25 +69,6 @@ public class PCLTTFCharacterWriter exten
         baos.write(pclChar.getData());
     }
 
-    private Map<Integer, Integer> scanMtxCharacters() throws IOException {
-        Map<Integer, Integer> charMtxOffsets = new HashMap<Integer, Integer>();
-        List<OFMtxEntry> mtx = openFont.getMtx();
-        OFTableName glyfTag = OFTableName.GLYF;
-        if (openFont.seekTab(fontReader, glyfTag, 0)) {
-            for (int i = 1; i < mtx.size(); i++) {
-                OFMtxEntry entry = mtx.get(i);
-                int charCode = 0;
-                if (entry.getUnicodeIndex().size() > 0) {
-                    charCode = (Integer) entry.getUnicodeIndex().get(0);
-                } else {
-                    charCode = entry.getIndex();
-                }
-                charMtxOffsets.put(charCode, i);
-            }
-        }
-        return charMtxOffsets;
-    }
-
     private PCLCharacterDefinition getCharacterDefinition(int unicode) throws IOException {
         if (mtx == null) {
             mtx = openFont.getMtx();
@@ -112,7 +92,7 @@ public class PCLTTFCharacterWriter exten
             PCLCharacterDefinition newChar = new PCLCharacterDefinition(
                     font.getCharCode((char) unicode),
                     PCLCharacterFormat.TrueType,
-                    PCLCharacterClass.TrueType, glyphData, pclByteWriter, false);
+                    PCLCharacterClass.TrueType, glyphData, false);
 
             // Handle composite character definitions
             GlyfTable glyfTable = new GlyfTable(fontReader, mtx.toArray(new OFMtxEntry[mtx.size()]),
@@ -123,7 +103,7 @@ public class PCLTTFCharacterWriter exten
                     byte[] compositeData = getGlyphData(compositeIndex);
                     newChar.addCompositeGlyph(new PCLCharacterDefinition(compositeIndex,
                             PCLCharacterFormat.TrueType,
-                            PCLCharacterClass.TrueType, compositeData, pclByteWriter, true));
+                            PCLCharacterClass.TrueType, compositeData, true));
                 }
             }
 

Modified: xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFFontReader.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFFontReader.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFFontReader.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFFontReader.java Mon Aug 15 14:15:27 2016
@@ -55,6 +55,8 @@ public class PCLTTFFontReader extends PC
     private PCLTTFOS2FontTable os2Table;
     private PCLTTFPOSTFontTable postTable;
     private PCLTTFTableFactory ttfTableFactory;
+    private Map<Integer, int[]> charOffsets;
+    private Map<Integer, Integer> charMtxOffsets;
 
     private static final int HMTX_RESTRICT_SIZE = 50000;
 
@@ -115,8 +117,8 @@ public class PCLTTFFontReader extends PC
     private int scaleFactor = -1;
     private PCLSymbolSet symbolSet = PCLSymbolSet.Bound_Generic;
 
-    public PCLTTFFontReader(Typeface font, PCLByteWriterUtil pclByteWriter) throws IOException {
-        super(font, pclByteWriter);
+    public PCLTTFFontReader(Typeface font) throws IOException {
+        super(font);
         loadFont();
     }
 
@@ -461,7 +463,7 @@ public class PCLTTFFontReader extends PC
             throws IOException {
         List<PCLFontSegment> fontSegments = new ArrayList<PCLFontSegment>();
         fontSegments.add(new PCLFontSegment(SegmentID.CC, getCharacterComplement()));
-        fontSegments.add(new PCLFontSegment(SegmentID.PA, pclByteWriter.toByteArray(os2Table.getPanose())));
+        fontSegments.add(new PCLFontSegment(SegmentID.PA, PCLByteWriterUtil.toByteArray(os2Table.getPanose())));
         fontSegments.add(new PCLFontSegment(SegmentID.GT, getGlobalTrueTypeData(mappedGlyphs)));
         fontSegments.add(new PCLFontSegment(SegmentID.CP, ttfFont.getCopyrightNotice().getBytes("US-ASCII")));
         fontSegments.add(new PCLFontSegment(SegmentID.NULL, new byte[0]));
@@ -484,8 +486,8 @@ public class PCLTTFFontReader extends PC
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         List<TableOffset> tableOffsets = new ArrayList<TableOffset>();
         // Version
-        baos.write(pclByteWriter.unsignedInt(1)); // Major
-        baos.write(pclByteWriter.unsignedInt(0)); // Minor
+        baos.write(PCLByteWriterUtil.unsignedInt(1)); // Major
+        baos.write(PCLByteWriterUtil.unsignedInt(0)); // Minor
         int numTables = 5; // head, hhea, hmtx, maxp and gdir
         // Optional Hint Tables
         OFDirTabEntry headTable = ttfFont.getDirectoryEntry(OFTableName.CVT);
@@ -500,12 +502,12 @@ public class PCLTTFFontReader extends PC
         if (prepTable != null) {
             numTables++;
         }
-        baos.write(pclByteWriter.unsignedInt(numTables)); // numTables
-        int maxPowerNumTables = pclByteWriter.maxPower2(numTables);
+        baos.write(PCLByteWriterUtil.unsignedInt(numTables)); // numTables
+        int maxPowerNumTables = PCLByteWriterUtil.maxPower2(numTables);
         int searchRange = maxPowerNumTables * 16;
-        baos.write(pclByteWriter.unsignedInt(searchRange));
-        baos.write(pclByteWriter.unsignedInt(pclByteWriter.log(maxPowerNumTables, 2))); // Entry Selector
-        baos.write(pclByteWriter.unsignedInt(numTables * 16 - searchRange)); // Range shift
+        baos.write(PCLByteWriterUtil.unsignedInt(searchRange));
+        baos.write(PCLByteWriterUtil.unsignedInt(PCLByteWriterUtil.log(maxPowerNumTables, 2))); // Entry Selector
+        baos.write(PCLByteWriterUtil.unsignedInt(numTables * 16 - searchRange)); // Range shift
 
         // Add default data tables
         writeTrueTypeTable(baos, OFTableName.HEAD, tableOffsets);
@@ -555,20 +557,20 @@ public class PCLTTFFontReader extends PC
         OFDirTabEntry tabEntry = ttfFont.getDirectoryEntry(table);
         if (tabEntry != null) {
             baos.write(tabEntry.getTag());
-            baos.write(pclByteWriter.unsignedLongInt(tabEntry.getChecksum()));
+            baos.write(PCLByteWriterUtil.unsignedLongInt(tabEntry.getChecksum()));
             TableOffset newTableOffset = new TableOffset(tabEntry.getOffset(),
                     tabEntry.getLength(), baos.size());
             tableOffsets.add(newTableOffset);
-            baos.write(pclByteWriter.unsignedLongInt(0)); // Offset to be set later
-            baos.write(pclByteWriter.unsignedLongInt(tabEntry.getLength()));
+            baos.write(PCLByteWriterUtil.unsignedLongInt(0)); // Offset to be set later
+            baos.write(PCLByteWriterUtil.unsignedLongInt(tabEntry.getLength()));
         }
     }
 
     private void writeGDIR(ByteArrayOutputStream baos) throws UnsupportedEncodingException, IOException {
         baos.write("gdir".getBytes("ISO-8859-1"));
-        baos.write(pclByteWriter.unsignedLongInt(0)); // Checksum
-        baos.write(pclByteWriter.unsignedLongInt(0)); // Offset
-        baos.write(pclByteWriter.unsignedLongInt(0)); // Length
+        baos.write(PCLByteWriterUtil.unsignedLongInt(0)); // Checksum
+        baos.write(PCLByteWriterUtil.unsignedLongInt(0)); // Offset
+        baos.write(PCLByteWriterUtil.unsignedLongInt(0)); // Length
     }
 
     private ByteArrayOutputStream copyTables(List<TableOffset> tableOffsets,
@@ -576,7 +578,7 @@ public class PCLTTFFontReader extends PC
             throws IOException {
         Map<Integer, byte[]> offsetValues = new HashMap<Integer, byte[]>();
         for (TableOffset tableOffset : tableOffsets) {
-            offsetValues.put(tableOffset.getNewOffset(), pclByteWriter.unsignedLongInt(baos.size()));
+            offsetValues.put(tableOffset.getNewOffset(), PCLByteWriterUtil.unsignedLongInt(baos.size()));
             if (tableOffset.getOriginOffset() == -1) { // Update the offset in the table directory
                 baos.write(hmtxTable);
             } else {
@@ -604,7 +606,7 @@ public class PCLTTFFontReader extends PC
             throws IOException {
         byte[] softFont = baos.toByteArray();
         for (int offset : offsets.keySet()) {
-            pclByteWriter.updateDataAtLocation(softFont, offsets.get(offset), offset);
+            PCLByteWriterUtil.updateDataAtLocation(softFont, offsets.get(offset), offset);
         }
         baos = new ByteArrayOutputStream();
         baos.write(softFont);
@@ -613,32 +615,34 @@ public class PCLTTFFontReader extends PC
 
     @Override
     public Map<Integer, int[]> getCharacterOffsets() throws IOException {
-        List<OFMtxEntry> mtx = ttfFont.getMtx();
-        OFTableName glyfTag = OFTableName.GLYF;
-        Map<Integer, int[]> charOffsets = new HashMap<Integer, int[]>();
-        OFDirTabEntry tabEntry = ttfFont.getDirectoryEntry(glyfTag);
-        if (ttfFont.seekTab(reader, glyfTag, 0)) {
-            for (int i = 1; i < mtx.size(); i++) {
-                OFMtxEntry entry = mtx.get(i);
-                OFMtxEntry nextEntry;
-                int nextOffset = 0;
-                int charCode = 0;
-                if (entry.getUnicodeIndex().size() > 0) {
-                    charCode = (Integer) entry.getUnicodeIndex().get(0);
-                } else {
-                    charCode = entry.getIndex();
-                }
+        if (charOffsets == null) {
+            List<OFMtxEntry> mtx = ttfFont.getMtx();
+            OFTableName glyfTag = OFTableName.GLYF;
+            charOffsets = new HashMap<Integer, int[]>();
+            OFDirTabEntry tabEntry = ttfFont.getDirectoryEntry(glyfTag);
+            if (ttfFont.seekTab(reader, glyfTag, 0)) {
+                for (int i = 1; i < mtx.size(); i++) {
+                    OFMtxEntry entry = mtx.get(i);
+                    OFMtxEntry nextEntry;
+                    int nextOffset = 0;
+                    int charCode = 0;
+                    if (entry.getUnicodeIndex().size() > 0) {
+                        charCode = (Integer) entry.getUnicodeIndex().get(0);
+                    } else {
+                        charCode = entry.getIndex();
+                    }
+
+                    if (i < mtx.size() - 1) {
+                        nextEntry = mtx.get(i + 1);
+                        nextOffset = (int) nextEntry.getOffset();
+                    } else {
+                        nextOffset = (int) ttfFont.getLastGlyfLocation();
+                    }
+                    int glyphOffset = (int) entry.getOffset();
+                    int glyphLength = nextOffset - glyphOffset;
 
-                if (i < mtx.size() - 1) {
-                    nextEntry = mtx.get(i + 1);
-                    nextOffset = (int) nextEntry.getOffset();
-                } else {
-                    nextOffset = (int) ttfFont.getLastGlyfLocation();
+                    charOffsets.put(charCode, new int[]{(int) tabEntry.getOffset() + glyphOffset, glyphLength});
                 }
-                int glyphOffset = (int) entry.getOffset();
-                int glyphLength = nextOffset - glyphOffset;
-
-                charOffsets.put(charCode, new int[]{(int) tabEntry.getOffset() + glyphOffset, glyphLength});
             }
         }
         return charOffsets;
@@ -660,11 +664,11 @@ public class PCLTTFFontReader extends PC
         if (tabEntry != null) {
             baos.write(tabEntry.getTag());
             // Override the original checksum for the subset version
-            baos.write(pclByteWriter.unsignedLongInt(getCheckSum(hmtxTable, 0, hmtxTable.length)));
+            baos.write(PCLByteWriterUtil.unsignedLongInt(getCheckSum(hmtxTable, 0, hmtxTable.length)));
             TableOffset newTableOffset = new TableOffset(-1, hmtxTable.length, baos.size());
             tableOffsets.add(newTableOffset);
-            baos.write(pclByteWriter.unsignedLongInt(0)); // Offset to be set later
-            baos.write(pclByteWriter.unsignedLongInt(hmtxTable.length));
+            baos.write(PCLByteWriterUtil.unsignedLongInt(0)); // Offset to be set later
+            baos.write(PCLByteWriterUtil.unsignedLongInt(hmtxTable.length));
         }
     }
 
@@ -728,5 +732,26 @@ public class PCLTTFFontReader extends PC
         out[offset] = b1;
         out[offset + 1] = b2;
     }
+
+    public Map<Integer, Integer> scanMtxCharacters() throws IOException {
+        if (charMtxOffsets == null) {
+            charMtxOffsets = new HashMap<Integer, Integer>();
+            List<OFMtxEntry> mtx = ttfFont.getMtx();
+            OFTableName glyfTag = OFTableName.GLYF;
+            if (ttfFont.seekTab(reader, glyfTag, 0)) {
+                for (int i = 1; i < mtx.size(); i++) {
+                    OFMtxEntry entry = mtx.get(i);
+                    int charCode = 0;
+                    if (entry.getUnicodeIndex().size() > 0) {
+                        charCode = (Integer) entry.getUnicodeIndex().get(0);
+                    } else {
+                        charCode = entry.getIndex();
+                    }
+                    charMtxOffsets.put(charCode, i);
+                }
+            }
+        }
+        return charMtxOffsets;
+    }
 }
 

Modified: xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/PCLPainterTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/PCLPainterTestCase.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/PCLPainterTestCase.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/PCLPainterTestCase.java Mon Aug 15 14:15:27 2016
@@ -20,9 +20,13 @@ package org.apache.fop.render.pcl;
 
 import java.awt.Color;
 import java.awt.Dimension;
+import java.awt.FontFormatException;
 import java.awt.Rectangle;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
 
 import javax.xml.transform.stream.StreamResult;
 
@@ -30,8 +34,13 @@ import org.junit.Test;
 
 import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.apps.FopFactory;
+import org.apache.fop.fonts.EmbeddingMode;
+import org.apache.fop.fonts.FontInfo;
+import org.apache.fop.fonts.FontType;
+import org.apache.fop.fonts.MultiByteFont;
 import org.apache.fop.render.intermediate.IFContext;
 import org.apache.fop.render.intermediate.IFException;
+import org.apache.fop.render.java2d.CustomFontMetricsMapper;
 
 import junit.framework.Assert;
 
@@ -57,4 +66,35 @@ public class PCLPainterTestCase {
         Assert.assertTrue(output.toString().contains("*v255a0b0c0I\u001B*v0S\u001B*c0.01h0.01V\u001B*c0P"));
     }
 
+    @Test
+    public void testTruetype() throws IFException, IOException, FontFormatException, URISyntaxException {
+        String optimizeResources = getPCL(true).toString();
+        String notOptimizeResources = getPCL(false).toString();
+        Assert.assertTrue(notOptimizeResources.contains("DejaVu"));
+        Assert.assertFalse(optimizeResources.contains("DejaVu"));
+        Assert.assertEquals(optimizeResources.length(), 935);
+    }
+
+    private ByteArrayOutputStream getPCL(boolean optimizeResources)
+            throws IFException, URISyntaxException, IOException, FontFormatException {
+        Rectangle size = new Rectangle(1, 1);
+        PCLPageDefinition pclPageDef = new PCLPageDefinition("", 0, new Dimension(), size, true);
+        PCLDocumentHandler documentHandler = new PCLDocumentHandler(new IFContext(ua));
+        ByteArrayOutputStream output = new ByteArrayOutputStream();
+        documentHandler.setResult(new StreamResult(output));
+        documentHandler.startDocument();
+        PCLPainter pclPainter = new PCLPainter(documentHandler, pclPageDef);
+        pclPainter.getPCLUtil().setOptimizeResources(optimizeResources);
+        FontInfo fi = new FontInfo();
+        fi.addFontProperties("", "", "", 0);
+        MultiByteFont mbf = new MultiByteFont(ua.getResourceResolver(), EmbeddingMode.AUTO);
+        mbf.setEmbedURI(new URI("test/resources/fonts/ttf/DejaVuLGCSerif.ttf"));
+        mbf.setFontType(FontType.TRUETYPE);
+        fi.addMetrics("", new CustomFontMetricsMapper(mbf));
+        documentHandler.setFontInfo(fi);
+        pclPainter.setFont("", "", 0, "", 0, Color.BLACK);
+        pclPainter.drawText(0, 0, 0, 0, null, "test");
+        return output;
+    }
+
 }

Modified: xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/MockPCLTTFFontReader.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/MockPCLTTFFontReader.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/MockPCLTTFFontReader.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/MockPCLTTFFontReader.java Mon Aug 15 14:15:27 2016
@@ -29,8 +29,8 @@ import org.apache.fop.render.pcl.fonts.t
 
 public class MockPCLTTFFontReader extends PCLTTFFontReader {
 
-    public MockPCLTTFFontReader(Typeface font, PCLByteWriterUtil pclByteWriter) throws IOException {
-        super(font, pclByteWriter);
+    public MockPCLTTFFontReader(Typeface font) throws IOException {
+        super(font);
     }
 
     @Override

Modified: xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/PCLByteWriterUtilTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/PCLByteWriterUtilTestCase.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/PCLByteWriterUtilTestCase.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/PCLByteWriterUtilTestCase.java Mon Aug 15 14:15:27 2016
@@ -20,31 +20,24 @@ package org.apache.fop.render.pcl.fonts;
 
 import java.io.IOException;
 
-import org.junit.Before;
 import org.junit.Test;
 
 import static org.junit.Assert.assertArrayEquals;
 
 public class PCLByteWriterUtilTestCase {
-    private PCLByteWriterUtil byteWriter;
-
-    @Before
-    public void setUp() {
-        byteWriter = new PCLByteWriterUtil();
-    }
 
     @Test
     public void testWriteMethods() throws IOException {
-        byte[] output = byteWriter.writeCommand("(s4X");
+        byte[] output = PCLByteWriterUtil.writeCommand("(s4X");
         // 27 = PCL escape character with rest in ASCII format
         byte[] command = {27, 40, 115, 52, 88};
         assertArrayEquals(command, output);
 
-        byte[] resultB = byteWriter.unsignedLongInt(102494);
+        byte[] resultB = PCLByteWriterUtil.unsignedLongInt(102494);
         byte[] compareB = {0, 1, -112, 94};
         assertArrayEquals(compareB, resultB);
 
-        byte[] resultC = byteWriter.unsignedInt(1024);
+        byte[] resultC = PCLByteWriterUtil.unsignedInt(1024);
         byte[] compareC = {4, 0};
         assertArrayEquals(compareC, resultC);
     }
@@ -53,21 +46,21 @@ public class PCLByteWriterUtilTestCase {
     public void testUtilMethods() throws IOException {
         byte[] anArray = {1, 2, 3, 4, 5, 9, 10};
         byte[] insertArray = {6, 7, 8};
-        byte[] result = byteWriter.insertIntoArray(5, anArray, insertArray);
+        byte[] result = PCLByteWriterUtil.insertIntoArray(5, anArray, insertArray);
         byte[] compareA = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
         assertArrayEquals(compareA, result);
 
         byte[] reverse = {10, 9, 8, 7, 6};
-        byteWriter.updateDataAtLocation(compareA, reverse, 5);
+        PCLByteWriterUtil.updateDataAtLocation(compareA, reverse, 5);
         byte[] compareB = {1, 2, 3, 4, 5, 10, 9, 8, 7, 6};
         assertArrayEquals(compareB, compareA);
 
         byte[] anArrayC = {1, 2, 3, 4, 5};
-        byte[] resultC = byteWriter.padBytes(anArrayC, 10);
+        byte[] resultC = PCLByteWriterUtil.padBytes(anArrayC, 10);
         byte[] compareC = {1, 2, 3, 4, 5, 0, 0, 0, 0, 0};
         assertArrayEquals(compareC, resultC);
 
-        byte[] resultD = byteWriter.padBytes(anArrayC, 10, 1);
+        byte[] resultD = PCLByteWriterUtil.padBytes(anArrayC, 10, 1);
         byte[] compareD = {1, 2, 3, 4, 5, 1, 1, 1, 1, 1};
         assertArrayEquals(compareD, resultD);
     }

Modified: xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/PCLFontReaderFactoryTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/PCLFontReaderFactoryTestCase.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/PCLFontReaderFactoryTestCase.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/PCLFontReaderFactoryTestCase.java Mon Aug 15 14:15:27 2016
@@ -46,7 +46,6 @@ public class PCLFontReaderFactoryTestCas
         // Have to mock the input stream twice otherwise get a Stream is closed exception
         when(((CustomFont) customFont.getRealFont()).getInputStream()).thenReturn(
                 new FileInputStream(new File(TEST_FONT_TTF)));
-        PCLFontReaderFactory fontReaderFactory = PCLFontReaderFactory.getInstance(null);
-        assertTrue(fontReaderFactory.createInstance(customFont) instanceof PCLTTFFontReader);
+        assertTrue(PCLFontReaderFactory.createInstance(customFont) instanceof PCLTTFFontReader);
     }
 }

Modified: xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/PCLTTFFontReaderTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/PCLTTFFontReaderTestCase.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/PCLTTFFontReaderTestCase.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/PCLTTFFontReaderTestCase.java Mon Aug 15 14:15:27 2016
@@ -27,7 +27,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.junit.Before;
 import org.junit.Test;
 
 import static org.junit.Assert.assertArrayEquals;
@@ -44,14 +43,8 @@ import org.apache.fop.render.pcl.fonts.t
 public class PCLTTFFontReaderTestCase {
 
     private CustomFontMetricsMapper customFont = mock(CustomFontMetricsMapper.class);
-    private PCLByteWriterUtil byteWriter;
     private static final String TEST_FONT_A = "./test/resources/fonts/ttf/DejaVuLGCSerif.ttf";
 
-    @Before
-    public void setUp() {
-        byteWriter = new PCLByteWriterUtil();
-    }
-
     @Test
     public void verifyFontAData() throws Exception {
         CustomFont sbFont = mock(CustomFont.class);
@@ -62,7 +55,7 @@ public class PCLTTFFontReaderTestCase {
         when(font.getGIDFromChar('e')).thenReturn(101);
         when(font.getGIDFromChar('l')).thenReturn(108);
         when(font.getGIDFromChar('o')).thenReturn(111);
-        PCLTTFFontReader reader = new MockPCLTTFFontReader(customFont, byteWriter);
+        PCLTTFFontReader reader = new MockPCLTTFFontReader(customFont);
         reader.setFont(font);
         verifyFontData(reader);
         validateOffsets(reader);

Modified: xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFCharacterWriterTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFCharacterWriterTestCase.java?rev=1756387&r1=1756386&r2=1756387&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFCharacterWriterTestCase.java (original)
+++ xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pcl/fonts/truetype/PCLTTFCharacterWriterTestCase.java Mon Aug 15 14:15:27 2016
@@ -46,6 +46,7 @@ public class PCLTTFCharacterWriterTestCa
     public void verifyCharacterDefinition() throws Exception {
         CustomFont sbFont = mock(CustomFont.class);
         when(customFont.getRealFont()).thenReturn(sbFont);
+        when(sbFont.getInputStream()).thenReturn(new FileInputStream(TEST_FONT_A));
         softFont = new PCLSoftFont(1, customFont, false);
         TTFFile openFont = new TTFFile();
         FontFileReader reader = new FontFileReader(new FileInputStream(new File(TEST_FONT_A)));
@@ -53,15 +54,15 @@ public class PCLTTFCharacterWriterTestCa
         openFont.readFont(reader, header);
         softFont.setOpenFont(openFont);
         softFont.setReader(reader);
+        softFont.setMtxCharIndexes(new PCLTTFFontReader(customFont).scanMtxCharacters());
 
         characterWriter = new PCLTTFCharacterWriter(softFont);
         byte[] charDefinition = characterWriter.writeCharacterDefinitions("f");
-        PCLByteWriterUtil pclByteWriter = new PCLByteWriterUtil();
         // Character command
-        byte[] command = pclByteWriter.writeCommand(String.format("*c%dE", 32));
+        byte[] command = PCLByteWriterUtil.writeCommand(String.format("*c%dE", 32));
         assertArrayEquals(getBytes(charDefinition, 0, 6), command);
         // Character definition command
-        byte[] charDefCommand = pclByteWriter.writeCommand(String.format("(s%dW", 210));
+        byte[] charDefCommand = PCLByteWriterUtil.writeCommand(String.format("(s%dW", 210));
         assertArrayEquals(getBytes(charDefinition, 6, 7), charDefCommand);
     }
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.