]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Changed the exception message when internal font key == null, also some clean up...
authorMehdi Houshmand <mehdi@apache.org>
Mon, 2 Jul 2012 10:13:54 +0000 (10:13 +0000)
committerMehdi Houshmand <mehdi@apache.org>
Mon, 2 Jul 2012 10:13:54 +0000 (10:13 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1356161 13f79535-47bb-0310-9956-ffa450edef68

16 files changed:
src/java/org/apache/fop/fonts/FontTriplet.java
src/java/org/apache/fop/render/PrintRenderer.java
src/java/org/apache/fop/render/afp/AFPDocumentHandler.java
src/java/org/apache/fop/render/afp/AFPPainter.java
src/java/org/apache/fop/render/intermediate/AbstractIFPainter.java
src/java/org/apache/fop/render/intermediate/IFException.java
src/java/org/apache/fop/render/java2d/Java2DDocumentHandler.java [new file with mode: 0644]
src/java/org/apache/fop/render/java2d/Java2DPainter.java
src/java/org/apache/fop/render/pcl/PCLPainter.java
src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java
src/java/org/apache/fop/render/pdf/PDFDocumentNavigationHandler.java
src/java/org/apache/fop/render/pdf/PDFPainter.java
src/java/org/apache/fop/render/ps/PSDocumentHandler.java
src/java/org/apache/fop/render/ps/PSPainter.java
src/sandbox/org/apache/fop/render/svg/SVGPainter.java
test/java/org/apache/fop/render/intermediate/AbstractIFPainterTestCase.java [new file with mode: 0644]

index c1463446016e761fb77fc0eb9a6d9d6b81b47908..fd2a47a163cfa81c56e9a79beee274abb7ad6c26 100644 (file)
@@ -27,6 +27,8 @@ import java.io.Serializable;
  */
 public class FontTriplet implements Comparable<FontTriplet>, Serializable {
 
+    public static final FontTriplet DEFAULT_FONT_TRIPLET = new FontTriplet("any", Font.STYLE_NORMAL, Font.WEIGHT_NORMAL);
+
     /** serial version UID */
     private static final long serialVersionUID = 1168991106658033508L;
 
@@ -143,6 +145,5 @@ public class FontTriplet implements Comparable<FontTriplet>, Serializable {
          */
         boolean matches(FontTriplet triplet);
     }
-
 }
 
index 96a62cb11666b9ab72cec6295facf470b5b4f21d..2017dbd8808dfdb2563db125a7da54cc9c03203c 100644 (file)
@@ -107,7 +107,7 @@ public abstract class PrintRenderer extends AbstractRenderer {
         String key = fontInfo.getInternalFontKey(triplet);
         if (key == null) {
             //Find a default fallback font as last resort
-            triplet = new FontTriplet("any", Font.STYLE_NORMAL, Font.WEIGHT_NORMAL);
+            triplet = FontTriplet.DEFAULT_FONT_TRIPLET;
             key = fontInfo.getInternalFontKey(triplet);
         }
         return key;
index 2ae95dd4c91e090e53ff168fc5166c31d32a961a..76de3f7040574d0dfd6e3c22502e34de1f56edd4 100644 (file)
@@ -58,8 +58,8 @@ import org.apache.fop.render.intermediate.IFException;
 import org.apache.fop.render.intermediate.IFPainter;
 
 /**
- * {@link org.apache.fop.render.intermediate.IFDocumentHandler} implementation that
- * produces AFP (MO:DCA).
+ * {@link org.apache.fop.render.intermediate.IFDocumentHandler} implementation that produces AFP
+ * (MO:DCA).
  */
 public class AFPDocumentHandler extends AbstractBinaryWritingIFDocumentHandler
             implements AFPCustomizable {
index 8b2f3155514b04d29bc691ac6618d9fa826015ed..592b47eaa133dbd20fe51d5a0f40c207fdc3ae59 100644 (file)
@@ -36,6 +36,7 @@ import org.apache.xmlgraphics.image.loader.ImageProcessingHints;
 import org.apache.xmlgraphics.image.loader.ImageSessionContext;
 
 import org.apache.fop.afp.AFPBorderPainter;
+import org.apache.fop.afp.AFPEventProducer;
 import org.apache.fop.afp.AFPPaintingState;
 import org.apache.fop.afp.AFPUnitConverter;
 import org.apache.fop.afp.AbstractAFPPainter;
@@ -53,13 +54,11 @@ import org.apache.fop.afp.ptoca.PtocaProducer;
 import org.apache.fop.afp.util.DefaultFOPResourceAccessor;
 import org.apache.fop.afp.util.ResourceAccessor;
 import org.apache.fop.fonts.Font;
-import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.FontTriplet;
 import org.apache.fop.fonts.Typeface;
 import org.apache.fop.render.RenderingContext;
 import org.apache.fop.render.intermediate.AbstractIFPainter;
 import org.apache.fop.render.intermediate.BorderPainter;
-import org.apache.fop.render.intermediate.IFContext;
 import org.apache.fop.render.intermediate.IFException;
 import org.apache.fop.render.intermediate.IFState;
 import org.apache.fop.render.intermediate.IFUtil;
@@ -70,7 +69,7 @@ import org.apache.fop.util.CharUtilities;
 /**
  * IFPainter implementation that produces AFP (MO:DCA).
  */
-public class AFPPainter extends AbstractIFPainter {
+public class AFPPainter extends AbstractIFPainter<AFPDocumentHandler> {
 
     //** logging instance */
     //private static Log log = LogFactory.getLog(AFPPainter.class);
@@ -78,8 +77,6 @@ public class AFPPainter extends AbstractIFPainter {
     private static final int X = 0;
     private static final int Y = 1;
 
-    private final AFPDocumentHandler documentHandler;
-
     /** the border painter */
     private final AFPBorderPainterAdapter borderPainter;
     /** the rectangle painter */
@@ -88,36 +85,38 @@ public class AFPPainter extends AbstractIFPainter {
     /** unit converter */
     private final AFPUnitConverter unitConv;
 
+    private final AFPEventProducer eventProducer;
+
     /**
      * Default constructor.
      * @param documentHandler the parent document handler
      */
     public AFPPainter(AFPDocumentHandler documentHandler) {
-        super();
-        this.documentHandler = documentHandler;
+        super(documentHandler);
         this.state = IFState.create();
         this.borderPainter = new AFPBorderPainterAdapter(
                 new AFPBorderPainter(getPaintingState(), getDataStream()));
         this.rectanglePainter = documentHandler.createRectanglePainter();
         this.unitConv = getPaintingState().getUnitConverter();
+        this.eventProducer = AFPEventProducer.Provider.get(getUserAgent().getEventBroadcaster());
     }
 
-    /** {@inheritDoc} */
-    @Override
-    protected IFContext getContext() {
-        return this.documentHandler.getContext();
-    }
-
-    FontInfo getFontInfo() {
-        return this.documentHandler.getFontInfo();
+    private AFPPaintingState getPaintingState() {
+        return getDocumentHandler().getPaintingState();
     }
 
-    AFPPaintingState getPaintingState() {
-        return this.documentHandler.getPaintingState();
+    private DataStream getDataStream() {
+        return getDocumentHandler().getDataStream();
     }
 
-    DataStream getDataStream() {
-        return this.documentHandler.getDataStream();
+    @Override
+    public String getFontKey(FontTriplet triplet) throws IFException {
+        try {
+            return super.getFontKey(triplet);
+        } catch (IFException e) {
+            eventProducer.invalidConfiguration(null, e);
+            return super.getFontKey(FontTriplet.DEFAULT_FONT_TRIPLET);
+        }
     }
 
     /** {@inheritDoc} */
@@ -183,7 +182,7 @@ public class AFPPainter extends AbstractIFPainter {
     protected RenderingContext createRenderingContext() {
         AFPRenderingContext psContext = new AFPRenderingContext(
                 getUserAgent(),
-                documentHandler.getResourceManager(),
+                getDocumentHandler().getResourceManager(),
                 getPaintingState(),
                 getFontInfo(),
                 getContext().getForeignAttributes());
@@ -192,7 +191,7 @@ public class AFPPainter extends AbstractIFPainter {
 
     /** {@inheritDoc} */
     public void drawImage(String uri, Rectangle rect) throws IFException {
-        PageSegmentDescriptor pageSegment = documentHandler.getPageSegmentNameFor(uri);
+        PageSegmentDescriptor pageSegment = getDocumentHandler().getPageSegmentNameFor(uri);
 
         if (pageSegment != null) {
             float[] srcPts = {rect.x, rect.y};
@@ -206,10 +205,10 @@ public class AFPPainter extends AbstractIFPainter {
             //Do we need to embed an external page segment?
             if (pageSegment.getURI() != null) {
                 ResourceAccessor accessor = new DefaultFOPResourceAccessor (
-                        documentHandler.getUserAgent(), null, null);
+                        getUserAgent(), null, null);
                 try {
                     URI resourceUri = new URI(pageSegment.getURI());
-                    documentHandler.getResourceManager().createIncludedResourceFromExternal(
+                    getDocumentHandler().getResourceManager().createIncludedResourceFromExternal(
                             pageSegment.getName(), resourceUri, accessor);
 
                 } catch (URISyntaxException urie) {
@@ -365,14 +364,10 @@ public class AFPPainter extends AbstractIFPainter {
         FontTriplet triplet = new FontTriplet(
                 state.getFontFamily(), state.getFontStyle(), state.getFontWeight());
         //TODO Ignored: state.getFontVariant()
-        String fontKey = getFontInfo().getInternalFontKey(triplet);
-        if (fontKey == null) {
-            triplet = new FontTriplet("any", Font.STYLE_NORMAL, Font.WEIGHT_NORMAL);
-            fontKey = getFontInfo().getInternalFontKey(triplet);
-        }
+        String fontKey = getFontKey(triplet);
 
         // register font as necessary
-        Map<String, Typeface> fontMetricMap = documentHandler.getFontInfo().getFonts();
+        Map<String, Typeface> fontMetricMap = getFontInfo().getFonts();
         final AFPFont afpFont = (AFPFont)fontMetricMap.get(fontKey);
         final Font font = getFontInfo().getFontInstance(triplet, fontSize);
         AFPPageFonts pageFonts = getPaintingState().getPageFonts();
@@ -386,7 +381,7 @@ public class AFPPainter extends AbstractIFPainter {
 
         if (afpFont.isEmbeddable()) {
             try {
-                documentHandler.getResourceManager().embedFont(afpFont, charSet);
+                getDocumentHandler().getResourceManager().embedFont(afpFont, charSet);
             } catch (IOException ioe) {
                 throw new IFException("Error while embedding font resources", ioe);
             }
index c696e552d7e1c004b3116a6fe62ae4cdcdf63579..327eca14ed94d336f650a8b512233a8ae1e5a33b 100644 (file)
@@ -47,6 +47,8 @@ import org.apache.fop.ResourceEventProducer;
 import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.apps.FopFactory;
 import org.apache.fop.fo.Constants;
+import org.apache.fop.fonts.FontInfo;
+import org.apache.fop.fonts.FontTriplet;
 import org.apache.fop.render.ImageHandler;
 import org.apache.fop.render.ImageHandlerRegistry;
 import org.apache.fop.render.ImageHandlerUtil;
@@ -57,7 +59,7 @@ import org.apache.fop.traits.RuleStyle;
 /**
  * Abstract base class for IFPainter implementations.
  */
-public abstract class AbstractIFPainter implements IFPainter {
+public abstract class AbstractIFPainter<T extends IFDocumentHandler> implements IFPainter {
 
     /** logging instance */
     private static Log log = LogFactory.getLog(AbstractIFPainter.class);
@@ -68,18 +70,39 @@ public abstract class AbstractIFPainter implements IFPainter {
     /** Holds the intermediate format state */
     protected IFState state;
 
+    private final T documentHandler;
 
     /**
      * Default constructor.
      */
-    public AbstractIFPainter() {
+    public AbstractIFPainter(T documentHandler) {
+        this.documentHandler = documentHandler;
+    }
+
+    protected String getFontKey(FontTriplet triplet) throws IFException {
+        String key = getFontInfo().getInternalFontKey(triplet);
+        if (key == null) {
+            throw new IFException("The font triplet is not available: \"" + triplet + "\" "
+                    + "for the MIME type: \"" + documentHandler.getMimeType() + "\"");
+        }
+        return key;
     }
 
     /**
      * Returns the intermediate format context object.
      * @return the context object
      */
-    protected abstract IFContext getContext();
+    protected IFContext getContext() {
+        return documentHandler.getContext();
+    }
+
+    protected FontInfo getFontInfo() {
+        return documentHandler.getFontInfo();
+    }
+
+    protected T getDocumentHandler() {
+        return documentHandler;
+    }
 
     /**
      * Returns the user agent.
index 52c6507651c737e668f12aae3c570e697d524976..5f35c3e3a74a3516dbc197754e541acf77783c6d 100644 (file)
@@ -27,20 +27,27 @@ public class IFException extends Exception {
     private static final long serialVersionUID = 0L;
 
     /**
-     * Constructs a new exception with the specified detail message and
-     * cause.  <p>Note that the detail message associated with
-     * <code>cause</code> is <i>not</i> automatically incorporated in
+     * Constructs a new exception with the specified detail message and cause.  <p>Note that the
+     * detail message associated with <code>cause</code> is <i>not</i> automatically incorporated in
      * this exception's detail message.
      *
-     * @param  message the detail message (which is saved for later retrieval
-     *         by the {@link #getMessage()} method).
-     * @param  cause the cause (which is saved for later retrieval by the
-     *         {@link #getCause()} method).  (A <code>null</code> value is
-     *         permitted, and indicates that the cause is nonexistent or
-     *         unknown.)
+     * @param  message the detail message (which is saved for later retrieval by the
+     * {@link #getMessage()} method).
+     * @param  cause the cause (which is saved for later retrieval by the {@link #getCause()}
+     * method).  (A <code>null</code> value is permitted, and indicates that the cause is
+     * nonexistent or unknown.)
      */
     public IFException(String message, Exception cause) {
         super(message, cause);
     }
 
+    /**
+     * Constructs a new exception with the specified detail message.
+     *
+     * @param  message the detail message (which is saved for later retrieval by the
+     * {@link #getMessage()} method).
+     */
+    public IFException(String message) {
+        super(message);
+    }
 }
diff --git a/src/java/org/apache/fop/render/java2d/Java2DDocumentHandler.java b/src/java/org/apache/fop/render/java2d/Java2DDocumentHandler.java
new file mode 100644 (file)
index 0000000..87003f0
--- /dev/null
@@ -0,0 +1,156 @@
+/*
+ * 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.java2d;
+
+import java.awt.Dimension;
+import java.util.Locale;
+
+import javax.xml.transform.Result;
+
+import org.apache.fop.accessibility.StructureTreeEventHandler;
+import org.apache.fop.fonts.FontInfo;
+import org.apache.fop.render.intermediate.IFContext;
+import org.apache.fop.render.intermediate.IFDocumentHandler;
+import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
+import org.apache.fop.render.intermediate.IFDocumentNavigationHandler;
+import org.apache.fop.render.intermediate.IFException;
+import org.apache.fop.render.intermediate.IFPainter;
+
+/**
+ * {@link org.apache.fop.render.intermediate.IFDocumentHandler} implementation that produces
+ * Graphics2D instance.
+ */
+public class Java2DDocumentHandler implements IFDocumentHandler {
+
+    public void setContext(IFContext context) {
+        throw new UnsupportedOperationException();
+    }
+
+    public IFContext getContext() {
+        throw new UnsupportedOperationException();
+    }
+
+    public void setResult(Result result) throws IFException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void setFontInfo(FontInfo fontInfo) {
+        throw new UnsupportedOperationException();
+    }
+
+    public FontInfo getFontInfo() {
+        throw new UnsupportedOperationException();
+    }
+
+    public void setDefaultFontInfo(FontInfo fontInfo) {
+        throw new UnsupportedOperationException();
+    }
+
+    public IFDocumentHandlerConfigurator getConfigurator() {
+        throw new UnsupportedOperationException();
+    }
+
+    public StructureTreeEventHandler getStructureTreeEventHandler() {
+        throw new UnsupportedOperationException();
+    }
+
+    public IFDocumentNavigationHandler getDocumentNavigationHandler() {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean supportsPagesOutOfOrder() {
+        throw new UnsupportedOperationException();
+    }
+
+    public String getMimeType() {
+        throw new UnsupportedOperationException();
+    }
+
+    public void startDocument() throws IFException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void endDocument() throws IFException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void setDocumentLocale(Locale locale) {
+        throw new UnsupportedOperationException();
+    }
+
+    public void startDocumentHeader() throws IFException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void endDocumentHeader() throws IFException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void startDocumentTrailer() throws IFException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void endDocumentTrailer() throws IFException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void startPageSequence(String id) throws IFException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void endPageSequence() throws IFException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void startPage(int index, String name, String pageMasterName, Dimension size)
+            throws IFException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void endPage() throws IFException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void startPageHeader() throws IFException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void endPageHeader() throws IFException {
+        throw new UnsupportedOperationException();
+    }
+
+    public IFPainter startPageContent() throws IFException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void endPageContent() throws IFException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void startPageTrailer() throws IFException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void endPageTrailer() throws IFException {
+        throw new UnsupportedOperationException();
+    }
+
+    public void handleExtensionObject(Object extension) throws IFException {
+        throw new UnsupportedOperationException();
+    }
+}
index 575242d3897aec6a48170607515b2a2d7b5eb8eb..89031787a43ab77c73f0341330ffd4bb091fdd19 100644 (file)
@@ -47,10 +47,10 @@ import org.apache.fop.traits.RuleStyle;
 import org.apache.fop.util.CharUtilities;
 
 /**
- * {@link org.apache.fop.render.intermediate.IFPainter} implementation
- * that paints on a Graphics2D instance.
+ * {@link org.apache.fop.render.intermediate.IFPainter} implementation that paints on a Graphics2D
+ * instance.
  */
-public class Java2DPainter extends AbstractIFPainter {
+public class Java2DPainter extends AbstractIFPainter<Java2DDocumentHandler> {
 
     /** the IF context */
     protected IFContext ifContext;
@@ -62,7 +62,7 @@ public class Java2DPainter extends AbstractIFPainter {
 
     /** The current state, holds a Graphics2D and its context */
     protected Java2DGraphicsState g2dState;
-    private Stack g2dStateStack = new Stack();
+    private Stack<Java2DGraphicsState> g2dStateStack = new Stack<Java2DGraphicsState>();
 
     /**
      * Main constructor.
@@ -83,7 +83,7 @@ public class Java2DPainter extends AbstractIFPainter {
      * @param state the IF state object
      */
     public Java2DPainter(Graphics2D g2d, IFContext context, FontInfo fontInfo, IFState state) {
-        super();
+        super(new Java2DDocumentHandler());
         this.ifContext = context;
         if (state != null) {
             this.state = state.push();
@@ -256,7 +256,7 @@ public class Java2DPainter extends AbstractIFPainter {
     /** Restores the last graphics state from the stack. */
     protected void restoreGraphicsState() {
         g2dState.dispose();
-        g2dState = (Java2DGraphicsState)g2dStateStack.pop();
+        g2dState = g2dStateStack.pop();
     }
 
     private void concatenateTransformationMatrix(AffineTransform transform) throws IOException {
index 0d630826c38ddc012b8d8540a8ddead0bbddc0ce..f0d87d542fa5b8370e0da88883753184b635bf6a 100644 (file)
@@ -47,7 +47,6 @@ import org.apache.fop.fonts.FontTriplet;
 import org.apache.fop.render.ImageHandlerUtil;
 import org.apache.fop.render.RenderingContext;
 import org.apache.fop.render.intermediate.AbstractIFPainter;
-import org.apache.fop.render.intermediate.IFContext;
 import org.apache.fop.render.intermediate.IFException;
 import org.apache.fop.render.intermediate.IFState;
 import org.apache.fop.render.intermediate.IFUtil;
@@ -58,15 +57,12 @@ import org.apache.fop.traits.RuleStyle;
 import org.apache.fop.util.CharUtilities;
 
 /**
- * {@link org.apache.fop.render.intermediate.IFPainter} implementation
- * that produces PCL 5.
+ * {@link org.apache.fop.render.intermediate.IFPainter} implementation that produces PCL 5.
  */
-public class PCLPainter extends AbstractIFPainter implements PCLConstants {
+public class PCLPainter extends AbstractIFPainter<PCLDocumentHandler> implements PCLConstants {
 
     private static final boolean DEBUG = false;
 
-    private PCLDocumentHandler parent;
-
     /** The PCL generator */
     private PCLGenerator gen;
 
@@ -74,7 +70,7 @@ public class PCLPainter extends AbstractIFPainter implements PCLConstants {
     private int currentPrintDirection = 0;
     //private GeneralPath currentPath = null;
 
-    private Stack graphicContextStack = new Stack();
+    private Stack<GraphicContext> graphicContextStack = new Stack<GraphicContext>();
     private GraphicContext graphicContext = new GraphicContext();
 
     /**
@@ -83,24 +79,19 @@ public class PCLPainter extends AbstractIFPainter implements PCLConstants {
      * @param pageDefinition the page definition describing the page to be rendered
      */
     public PCLPainter(PCLDocumentHandler parent, PCLPageDefinition pageDefinition) {
-        this.parent = parent;
+        super(parent);
         this.gen = parent.getPCLGenerator();
         this.state = IFState.create();
         this.currentPageDefinition = pageDefinition;
     }
 
-    /** {@inheritDoc} */
-    public IFContext getContext() {
-        return this.parent.getContext();
-    }
-
     PCLRenderingUtil getPCLUtil() {
-        return this.parent.getPCLUtil();
+        return getDocumentHandler().getPCLUtil();
     }
 
     /** @return the target resolution */
     protected int getResolution() {
-        int resolution = (int)Math.round(getUserAgent().getTargetResolution());
+        int resolution = Math.round(getUserAgent().getTargetResolution());
         if (resolution <= 300) {
             return 300;
         } else {
@@ -223,7 +214,7 @@ public class PCLPainter extends AbstractIFPainter implements PCLConstants {
                     g2d.translate(-rect.x, -rect.y);
 
                     Java2DPainter painter = new Java2DPainter(g2d,
-                            getContext(), parent.getFontInfo(), state);
+                            getContext(), getFontInfo(), state);
                     try {
                         painter.drawBorderRect(rect, top, bottom, left, right);
                     } catch (IFException e) {
@@ -258,7 +249,7 @@ public class PCLPainter extends AbstractIFPainter implements PCLConstants {
                 g2d.translate(-boundingBox.x, -boundingBox.y);
 
                 Java2DPainter painter = new Java2DPainter(g2d,
-                        getContext(), parent.getFontInfo(), state);
+                        getContext(), getFontInfo(), state);
                 try {
                     painter.drawLine(start, end, width, color, style);
                 } catch (IFException e) {
@@ -315,9 +306,8 @@ public class PCLPainter extends AbstractIFPainter implements PCLConstants {
                     state.getFontFamily(), state.getFontStyle(), state.getFontWeight());
             //TODO Ignored: state.getFontVariant()
             //TODO Opportunity for font caching if font state is more heavily used
-            String fontKey = parent.getFontInfo().getInternalFontKey(triplet);
-            boolean pclFont = getPCLUtil().isAllTextAsBitmaps()
-                        ? false
+            String fontKey = getFontKey(triplet);
+            boolean pclFont = getPCLUtil().isAllTextAsBitmaps() ? false
                         : HardcodedFonts.setFont(gen, fontKey, state.getFontSize(), text);
             if (pclFont) {
                 drawTextNative(x, y, letterSpacing, wordSpacing, dp, text, triplet);
@@ -346,7 +336,7 @@ public class PCLPainter extends AbstractIFPainter implements PCLConstants {
         setCursorPos(x, y);
 
         float fontSize = state.getFontSize() / 1000f;
-        Font font = parent.getFontInfo().getFontInstance(triplet, state.getFontSize());
+        Font font = getFontInfo().getFontInstance(triplet, state.getFontSize());
         int l = text.length();
         int[] dx = IFUtil.convertDPToDX ( dp );
         int dxl = (dx != null ? dx.length : 0);
@@ -438,10 +428,10 @@ public class PCLPainter extends AbstractIFPainter implements PCLConstants {
             final int letterSpacing, final int wordSpacing, final int[][] dp,
             final String text, FontTriplet triplet) throws IFException {
         //Use Java2D to paint different fonts via bitmap
-        final Font font = parent.getFontInfo().getFontInstance(triplet, state.getFontSize());
+        final Font font = getFontInfo().getFontInstance(triplet, state.getFontSize());
 
         //for cursive fonts, so the text isn't clipped
-        final FontMetricsMapper mapper = (FontMetricsMapper)parent.getFontInfo().getMetricsFor(
+        final FontMetricsMapper mapper = (FontMetricsMapper) getFontInfo().getMetricsFor(
                 font.getFontName());
         final int maxAscent = mapper.getMaxAscent(font.getFontSize()) / 1000;
         final int ascent = mapper.getAscender(font.getFontSize()) / 1000;
@@ -470,8 +460,7 @@ public class PCLPainter extends AbstractIFPainter implements PCLConstants {
                     rect = new Rectangle(x, y, 1000, -descent);
                     g2d.draw(rect);
                 }
-                Java2DPainter painter = new Java2DPainter(g2d,
-                        getContext(), parent.getFontInfo(), state);
+                Java2DPainter painter = new Java2DPainter(g2d, getContext(), getFontInfo(), state);
                 try {
                     painter.drawText(x, y, letterSpacing, wordSpacing, dp, text);
                 } catch (IFException e) {
@@ -496,7 +485,7 @@ public class PCLPainter extends AbstractIFPainter implements PCLConstants {
 
     /** Restores the last graphics state from the stack. */
     private void restoreGraphicsState() {
-        graphicContext = (GraphicContext)graphicContextStack.pop();
+        graphicContext = graphicContextStack.pop();
     }
 
     private void concatenateTransformationMatrix(AffineTransform transform) throws IOException {
index 5be8c3001478dfe632b20e5e293d704ff5d79e5a..c56bce218550a75b629cdee9ab49fdf49ecb7acf 100644 (file)
@@ -40,7 +40,6 @@ import org.apache.fop.fo.extensions.xmp.XMPMetadata;
 import org.apache.fop.pdf.PDFAnnotList;
 import org.apache.fop.pdf.PDFDocument;
 import org.apache.fop.pdf.PDFPage;
-import org.apache.fop.pdf.PDFResourceContext;
 import org.apache.fop.pdf.PDFResources;
 import org.apache.fop.render.extensions.prepress.PageBoundaries;
 import org.apache.fop.render.extensions.prepress.PageScale;
@@ -67,31 +66,28 @@ public class PDFDocumentHandler extends AbstractBinaryWritingIFDocumentHandler {
     private PDFStructureTreeBuilder structureTreeBuilder;
 
     /** the PDF Document being created */
-    protected PDFDocument pdfDoc;
+    private PDFDocument pdfDoc;
 
     /**
      * Utility class which enables all sorts of features that are not directly connected to the
      * normal rendering process.
      */
-    protected PDFRenderingUtil pdfUtil;
+    private PDFRenderingUtil pdfUtil;
 
     /** the /Resources object of the PDF document being created */
-    protected PDFResources pdfResources;
+    private PDFResources pdfResources;
 
     /** The current content generator */
-    protected PDFContentGenerator generator;
-
-    /** the current annotation list to add annotations to */
-    protected PDFResourceContext currentContext;
+    private PDFContentGenerator generator;
 
     /** the current page to add annotations to */
-    protected PDFPage currentPage;
+    private PDFPage currentPage;
 
     /** the current page's PDF reference */
-    protected PageReference currentPageRef;
+    private PageReference currentPageRef;
 
     /** Used for bookmarks/outlines. */
-    protected Map<Integer, PageReference> pageReferences = new HashMap<Integer, PageReference>();
+    private Map<Integer, PageReference> pageReferences = new HashMap<Integer, PageReference>();
 
     private final PDFDocumentNavigationHandler documentNavigationHandler
             = new PDFDocumentNavigationHandler(this);
@@ -136,6 +132,22 @@ public class PDFDocumentHandler extends AbstractBinaryWritingIFDocumentHandler {
         return logicalStructureHandler;
     }
 
+    PDFDocument getPDFDocument() {
+        return pdfDoc;
+    }
+
+    PDFPage getCurrentPage() {
+        return currentPage;
+    }
+
+    PageReference getCurrentPageRef() {
+        return currentPageRef;
+    }
+
+    PDFContentGenerator getGenerator() {
+        return generator;
+    }
+
     /** {@inheritDoc} */
     public void startDocument() throws IFException {
         super.startDocument();
@@ -174,7 +186,6 @@ public class PDFDocumentHandler extends AbstractBinaryWritingIFDocumentHandler {
 
             pdfResources = null;
             this.generator = null;
-            currentContext = null;
             currentPage = null;
         } catch (IOException ioe) {
             throw new IFException("I/O error in endDocument()", ioe);
index af49fea4ccf68a59268a215b90f28512383bcbc4..1ef6377266a196d1294f8c96039a2904ee2c2d1d 100644 (file)
@@ -63,7 +63,7 @@ public class PDFDocumentNavigationHandler implements IFDocumentNavigationHandler
     }
 
     PDFDocument getPDFDoc() {
-        return this.documentHandler.pdfDoc;
+        return this.documentHandler.getPDFDocument();
     }
 
     /** {@inheritDoc} */
@@ -100,7 +100,7 @@ public class PDFDocumentNavigationHandler implements IFDocumentNavigationHandler
     /** {@inheritDoc} */
     public void renderLink(Link link) throws IFException {
         Rectangle targetRect = link.getTargetRect();
-        int pageHeight = documentHandler.currentPageRef.getPageDimension().height;
+        int pageHeight = documentHandler.getCurrentPageRef().getPageDimension().height;
         Rectangle2D targetRect2D = new Rectangle2D.Double(
                 targetRect.getMinX() / 1000.0,
                 (pageHeight - targetRect.getMinY() - targetRect.getHeight()) / 1000.0,
@@ -116,7 +116,7 @@ public class PDFDocumentNavigationHandler implements IFDocumentNavigationHandler
             if (documentHandler.getUserAgent().isAccessibilityEnabled() && structure != null) {
                 documentHandler.getLogicalStructureHandler().addLinkContentItem(pdfLink, structure);
             }
-            documentHandler.currentPage.addAnnotation(pdfLink);
+            documentHandler.getCurrentPage().addAnnotation(pdfLink);
         }
     }
 
index 4928e7251b82119fb78422571afe8ef55e2f7335..0160ffc1c5f3d79b8a8c412f55537f1f3b7e9532 100644 (file)
@@ -30,19 +30,16 @@ import java.io.IOException;
 import org.w3c.dom.Document;
 
 import org.apache.fop.fonts.Font;
-import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.FontTriplet;
 import org.apache.fop.fonts.LazyFont;
 import org.apache.fop.fonts.SingleByteFont;
 import org.apache.fop.fonts.Typeface;
-import org.apache.fop.pdf.PDFDocument;
 import org.apache.fop.pdf.PDFNumber;
 import org.apache.fop.pdf.PDFStructElem;
 import org.apache.fop.pdf.PDFTextUtil;
 import org.apache.fop.pdf.PDFXObject;
 import org.apache.fop.render.RenderingContext;
 import org.apache.fop.render.intermediate.AbstractIFPainter;
-import org.apache.fop.render.intermediate.IFContext;
 import org.apache.fop.render.intermediate.IFException;
 import org.apache.fop.render.intermediate.IFState;
 import org.apache.fop.render.intermediate.IFUtil;
@@ -55,9 +52,7 @@ import org.apache.fop.util.CharUtilities;
 /**
  * IFPainter implementation that produces PDF.
  */
-public class PDFPainter extends AbstractIFPainter {
-
-    private final PDFDocumentHandler documentHandler;
+public class PDFPainter extends AbstractIFPainter<PDFDocumentHandler> {
 
     /** The current content generator */
     protected PDFContentGenerator generator;
@@ -77,33 +72,14 @@ public class PDFPainter extends AbstractIFPainter {
      */
     public PDFPainter(PDFDocumentHandler documentHandler,
             PDFLogicalStructureHandler logicalStructureHandler) {
-        super();
-        this.documentHandler = documentHandler;
+        super(documentHandler);
         this.logicalStructureHandler = logicalStructureHandler;
-        this.generator = documentHandler.generator;
+        this.generator = documentHandler.getGenerator();
         this.borderPainter = new PDFBorderPainter(this.generator);
         this.state = IFState.create();
         accessEnabled = this.getUserAgent().isAccessibilityEnabled();
     }
 
-    /** {@inheritDoc} */
-    @Override
-    protected IFContext getContext() {
-        return this.documentHandler.getContext();
-    }
-
-    PDFRenderingUtil getPDFUtil() {
-        return this.documentHandler.pdfUtil;
-    }
-
-    PDFDocument getPDFDoc() {
-        return this.documentHandler.pdfDoc;
-    }
-
-    FontInfo getFontInfo() {
-        return this.documentHandler.getFontInfo();
-    }
-
     /** {@inheritDoc} */
     public void startViewport(AffineTransform transform, Dimension size, Rectangle clipRect)
             throws IFException {
@@ -133,7 +109,7 @@ public class PDFPainter extends AbstractIFPainter {
     /** {@inheritDoc} */
     public void drawImage(String uri, Rectangle rect)
             throws IFException {
-        PDFXObject xobject = getPDFDoc().getXObject(uri);
+        PDFXObject xobject = getDocumentHandler().getPDFDocument().getXObject(uri);
         if (xobject != null) {
             if (accessEnabled) {
                 PDFStructElem structElem = (PDFStructElem) getContext().getStructureTreeElement();
@@ -160,7 +136,7 @@ public class PDFPainter extends AbstractIFPainter {
     @Override
     protected RenderingContext createRenderingContext() {
         PDFRenderingContext pdfContext = new PDFRenderingContext(
-                getUserAgent(), generator, this.documentHandler.currentPage, getFontInfo());
+                getUserAgent(), generator, getDocumentHandler().getCurrentPage(), getFontInfo());
         pdfContext.setMarkedContentInfo(imageMCI);
         return pdfContext;
     }
@@ -321,12 +297,11 @@ public class PDFPainter extends AbstractIFPainter {
         }
     }
 
-    private void drawTextWithDX ( int x, int y, String text, FontTriplet triplet,
-                                  int letterSpacing, int wordSpacing, int[] dx ) {
-
+    private void drawTextWithDX(int x, int y, String text, FontTriplet triplet,
+            int letterSpacing, int wordSpacing, int[] dx) throws IFException {
         //TODO Ignored: state.getFontVariant()
         //TODO Opportunity for font caching if font state is more heavily used
-        String fontKey = getFontInfo().getInternalFontKey(triplet);
+        String fontKey = getFontKey(triplet);
         int sizeMillipoints = state.getFontSize();
         float fontSize = sizeMillipoints / 1000f;
 
index 0fe5648271e53ef3247fb19244561ed37b00997c..bf2d95c1d0ef27e49a0995fd35315162a156fb7d 100644 (file)
@@ -54,6 +54,7 @@ import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.apps.MimeConstants;
 import org.apache.fop.render.intermediate.AbstractBinaryWritingIFDocumentHandler;
 import org.apache.fop.render.intermediate.IFContext;
+import org.apache.fop.render.intermediate.IFDocumentHandler;
 import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
 import org.apache.fop.render.intermediate.IFException;
 import org.apache.fop.render.intermediate.IFPainter;
@@ -76,10 +77,10 @@ public class PSDocumentHandler extends AbstractBinaryWritingIFDocumentHandler {
      * Utility class which enables all sorts of features that are not directly connected to the
      * normal rendering process.
      */
-    protected PSRenderingUtil psUtil;
+    private PSRenderingUtil psUtil;
 
     /** The PostScript generator used to output the PostScript */
-    protected PSGenerator gen;
+    PSGenerator gen;
 
     /** the temporary file in case of two-pass processing */
     private File tempFile;
@@ -126,6 +127,10 @@ public class PSDocumentHandler extends AbstractBinaryWritingIFDocumentHandler {
         return MimeConstants.MIME_POSTSCRIPT;
     }
 
+    PSGenerator getGenerator() {
+        return gen;
+    }
+
     /** {@inheritDoc} */
     public void setContext(IFContext context) {
         super.setContext(context);
index c2288019ac47db0fb476d5380354f39a9abc1464..63e947e55f5a1d9d4c93eac771fea75cded316c9 100644 (file)
@@ -41,7 +41,6 @@ import org.apache.xmlgraphics.ps.PSGenerator;
 import org.apache.xmlgraphics.ps.PSResource;
 
 import org.apache.fop.fonts.Font;
-import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.FontTriplet;
 import org.apache.fop.fonts.LazyFont;
 import org.apache.fop.fonts.MultiByteFont;
@@ -49,7 +48,6 @@ import org.apache.fop.fonts.SingleByteFont;
 import org.apache.fop.fonts.Typeface;
 import org.apache.fop.render.RenderingContext;
 import org.apache.fop.render.intermediate.AbstractIFPainter;
-import org.apache.fop.render.intermediate.IFContext;
 import org.apache.fop.render.intermediate.IFException;
 import org.apache.fop.render.intermediate.IFState;
 import org.apache.fop.render.intermediate.IFUtil;
@@ -61,12 +59,11 @@ import org.apache.fop.util.HexEncoder;
 /**
  * IFPainter implementation that produces PostScript.
  */
-public class PSPainter extends AbstractIFPainter {
+public class PSPainter extends AbstractIFPainter<PSDocumentHandler> {
 
     /** logging instance */
     private static Log log = LogFactory.getLog(PSPainter.class);
 
-    private PSDocumentHandler documentHandler;
     private PSBorderPainter borderPainter;
 
     private boolean inTextMode = false;
@@ -80,27 +77,13 @@ public class PSPainter extends AbstractIFPainter {
     }
 
     protected PSPainter(PSDocumentHandler documentHandler, IFState state) {
-        super();
-        this.documentHandler = documentHandler;
-        this.borderPainter = new PSBorderPainter(documentHandler.gen);
+        super(documentHandler);
+        this.borderPainter = new PSBorderPainter(getGenerator());
         this.state = state;
     }
 
-    /** {@inheritDoc} */
-    protected IFContext getContext() {
-        return this.documentHandler.getContext();
-    }
-
-    PSRenderingUtil getPSUtil() {
-        return this.documentHandler.psUtil;
-    }
-
-    FontInfo getFontInfo() {
-        return this.documentHandler.getFontInfo();
-    }
-
     private PSGenerator getGenerator() {
-        return this.documentHandler.gen;
+        return getDocumentHandler().getGenerator();
     }
 
     /** {@inheritDoc} */
@@ -168,7 +151,7 @@ public class PSPainter extends AbstractIFPainter {
     /** {@inheritDoc} */
     protected void drawImageUsingImageHandler(ImageInfo info, Rectangle rect)
             throws ImageException, IOException {
-        if (!getPSUtil().isOptimizeResources()
+        if (!getDocumentHandler().getPSUtil().isOptimizeResources()
                 || PSImageUtils.isImageInlined(info,
                         (PSRenderingContext)createRenderingContext())) {
             super.drawImageUsingImageHandler(info, rect);
@@ -177,7 +160,7 @@ public class PSPainter extends AbstractIFPainter {
                 log.debug("Image " + info + " is embedded as a form later");
             }
             //Don't load image at this time, just put a form placeholder in the stream
-            PSResource form = documentHandler.getFormForImage(info.getOriginalURI());
+            PSResource form = getDocumentHandler().getFormForImage(info.getOriginalURI());
             PSImageUtils.drawForm(form, info, rect, getGenerator());
         }
     }
@@ -246,7 +229,7 @@ public class PSPainter extends AbstractIFPainter {
         if (top != null || bottom != null || left != null || right != null) {
             try {
                 endTextObject();
-                if (getPSUtil().getRenderingMode() == PSRenderingMode.SIZE
+                if (getDocumentHandler().getPSUtil().getRenderingMode() == PSRenderingMode.SIZE
                     && hasOnlySolidBorders(top, bottom, left, right)) {
                     super.drawBorderRect(rect, top, bottom, left, right);
                 } else {
@@ -273,7 +256,7 @@ public class PSPainter extends AbstractIFPainter {
         if (fontName == null) {
             throw new NullPointerException("fontName must not be null");
         }
-        Typeface tf = (Typeface)getFontInfo().getFonts().get(fontName);
+        Typeface tf = getFontInfo().getFonts().get(fontName);
         if (tf instanceof LazyFont) {
             tf = ((LazyFont)tf).getRealFont();
         }
@@ -363,10 +346,7 @@ public class PSPainter extends AbstractIFPainter {
                     state.getFontFamily(), state.getFontStyle(), state.getFontWeight());
             //TODO Ignored: state.getFontVariant()
             //TODO Opportunity for font caching if font state is more heavily used
-            String fontKey = getFontInfo().getInternalFontKey(triplet);
-            if (fontKey == null) {
-                throw new IFException("Font not available: " + triplet, null);
-            }
+            String fontKey = getFontKey(triplet);
             int sizeMillipoints = state.getFontSize();
 
             // This assumes that *all* CIDFonts use a /ToUnicode mapping
@@ -529,10 +509,9 @@ public class PSPainter extends AbstractIFPainter {
     }
 
     private void useFont(String key, int size) throws IOException {
-        PSFontResource res = this.documentHandler.getPSResourceForFontKey(key);
+        PSFontResource res = getDocumentHandler().getPSResourceForFontKey(key);
         PSGenerator generator = getGenerator();
         generator.useFont("/" + res.getName(), size / 1000f);
         res.notifyResourceUsageOnPage(generator.getResourceTracker());
     }
-
 }
index 3eba51097b628b13532c58b2b5ec3e58fe65be2e..8eaf9db01f336e0379d797f1c2933ceaa03d87fa 100644 (file)
@@ -30,7 +30,6 @@ import java.io.IOException;
 import java.util.Map;
 
 import org.w3c.dom.Document;
-
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.AttributesImpl;
 
@@ -46,7 +45,6 @@ import org.apache.fop.render.ImageHandlerUtil;
 import org.apache.fop.render.RenderingContext;
 import org.apache.fop.render.intermediate.AbstractIFPainter;
 import org.apache.fop.render.intermediate.IFConstants;
-import org.apache.fop.render.intermediate.IFContext;
 import org.apache.fop.render.intermediate.IFException;
 import org.apache.fop.render.intermediate.IFState;
 import org.apache.fop.render.intermediate.IFUtil;
@@ -60,12 +58,11 @@ import org.apache.fop.util.XMLUtil;
 /**
  * IFPainter implementation that writes SVG.
  */
-public class SVGPainter extends AbstractIFPainter implements SVGConstants {
-
-    private AbstractSVGDocumentHandler parent;
+public class SVGPainter extends AbstractIFPainter<AbstractSVGDocumentHandler>
+        implements SVGConstants {
 
     /** The SAX content handler that receives the generated XML events. */
-    protected GenerationHelperContentHandler handler;
+    private GenerationHelperContentHandler handler;
 
     private static final int MODE_NORMAL = 0;
     private static final int MODE_TEXT = 1;
@@ -79,17 +76,11 @@ public class SVGPainter extends AbstractIFPainter implements SVGConstants {
      */
     public SVGPainter(AbstractSVGDocumentHandler parent,
             GenerationHelperContentHandler contentHandler) {
-        super();
-        this.parent = parent;
+        super(parent);
         this.handler = contentHandler;
         this.state = IFState.create();
     }
 
-    /** {@inheritDoc} */
-    protected IFContext getContext() {
-        return parent.getContext();
-    }
-
     /** {@inheritDoc} */
     public void startViewport(AffineTransform transform, Dimension size, Rectangle clipRect)
             throws IFException {
diff --git a/test/java/org/apache/fop/render/intermediate/AbstractIFPainterTestCase.java b/test/java/org/apache/fop/render/intermediate/AbstractIFPainterTestCase.java
new file mode 100644 (file)
index 0000000..ebe7f17
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * 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.intermediate;
+
+import java.awt.Dimension;
+import java.awt.Paint;
+import java.awt.Rectangle;
+import java.awt.geom.AffineTransform;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.w3c.dom.Document;
+
+import org.apache.fop.fonts.FontInfo;
+import org.apache.fop.fonts.FontTriplet;
+import org.apache.fop.render.RenderingContext;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class AbstractIFPainterTestCase {
+
+    private AbstractIFPainter<?> sut;
+    private IFDocumentHandler handler;
+
+    @Before
+    public void setUp() {
+        handler = mock(IFDocumentHandler.class);
+        sut = new AbstractIFPainter<IFDocumentHandler>(handler) {
+            public void startViewport(AffineTransform transform, Dimension size, Rectangle clipRect)
+                    throws IFException {
+            }
+
+            public void endViewport() throws IFException {
+            }
+
+            public void startGroup(AffineTransform transform) throws IFException {
+            }
+
+            public void endGroup() throws IFException {
+            }
+
+            public void clipRect(Rectangle rect) throws IFException {
+            }
+
+            public void fillRect(Rectangle rect, Paint fill) throws IFException {
+            }
+
+            public void drawImage(String uri, Rectangle rect) throws IFException {
+            }
+
+            public void drawImage(Document doc, Rectangle rect) throws IFException {
+            }
+
+            @Override
+            protected RenderingContext createRenderingContext() {
+                return null;
+            }
+
+            public void drawText(int x, int y, int letterSpacing, int wordSpacing, int[][] dp,
+                    String text) throws IFException {
+            }
+        };
+        FontInfo fontInfo = mock(FontInfo.class);
+        when(handler.getFontInfo()).thenReturn(fontInfo);
+    }
+
+    @Test
+    public void testGetFontKey() throws IFException {
+        String expected = "the expected string";
+        FontTriplet triplet = mock(FontTriplet.class);
+        FontInfo fontInfo = handler.getFontInfo();
+        when(fontInfo.getInternalFontKey(triplet)).thenReturn(expected);
+        assertEquals(expected, sut.getFontKey(triplet));
+    }
+
+    @Test(expected = IFException.class)
+    public void testGetFontKeyMissingFont() throws IFException {
+        FontTriplet triplet = mock(FontTriplet.class);
+        when(handler.getFontInfo().getInternalFontKey(triplet)).thenReturn(null);
+        sut.getFontKey(triplet);
+    }
+}