]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Introduced IFContext to provide access to foreign attributes (as discussed on fop...
authorJeremias Maerki <jeremias@apache.org>
Fri, 2 Jan 2009 14:29:30 +0000 (14:29 +0000)
committerJeremias Maerki <jeremias@apache.org>
Fri, 2 Jan 2009 14:29:30 +0000 (14:29 +0000)
Removed the foreign attributes map from the drawImage methods as a consequence.
Added support for foreign attributes on the page (PCL's paper-source and duplex-mode extensions).
Fixed a couple of bugs parsing the document navigation elements.
Build-time test suite now runs through.

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign@730740 13f79535-47bb-0310-9956-ffa450edef68

32 files changed:
src/java/org/apache/fop/render/RendererFactory.java
src/java/org/apache/fop/render/bitmap/TIFFDocumentHandler.java
src/java/org/apache/fop/render/bitmap/TIFFDocumentHandlerMaker.java
src/java/org/apache/fop/render/intermediate/AbstractIFDocumentHandler.java
src/java/org/apache/fop/render/intermediate/AbstractIFPainter.java
src/java/org/apache/fop/render/intermediate/IFContext.java [new file with mode: 0644]
src/java/org/apache/fop/render/intermediate/IFDocumentHandler.java
src/java/org/apache/fop/render/intermediate/IFPainter.java
src/java/org/apache/fop/render/intermediate/IFParser.java
src/java/org/apache/fop/render/intermediate/IFRenderer.java
src/java/org/apache/fop/render/intermediate/IFSerializer.java
src/java/org/apache/fop/render/intermediate/extensions/DocumentNavigationHandler.java
src/java/org/apache/fop/render/java2d/Java2DPainter.java
src/java/org/apache/fop/render/pcl/PCLDocumentHandler.java
src/java/org/apache/fop/render/pcl/PCLDocumentHandlerMaker.java
src/java/org/apache/fop/render/pcl/PCLPainter.java
src/java/org/apache/fop/render/pcl/PCLRenderer.java
src/java/org/apache/fop/render/pcl/extensions/PCLElementMapping.java
src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java
src/java/org/apache/fop/render/pdf/PDFDocumentHandlerMaker.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/PSDocumentHandlerMaker.java
src/java/org/apache/fop/render/ps/PSPainter.java
src/sandbox/org/apache/fop/render/svg/SVGDocumentHandlerMaker.java
src/sandbox/org/apache/fop/render/svg/SVGPainter.java
src/sandbox/org/apache/fop/render/svg/SVGPrintDocumentHandlerMaker.java
test/java/org/apache/fop/intermediate/IFParserTestCase.java
test/java/org/apache/fop/intermediate/IFTester.java
test/java/org/apache/fop/render/ps/ImageHandlingTestCase.java
test/java/org/apache/fop/render/ps/ResourceOptimizationTestCase.java
test/layoutengine/standard-testcases/pcl-extension_1.xml [new file with mode: 0644]

index 19cf76931a4dffa966c47dcf47b36c3035f7a776..2b26e488153f5514974f6c80a6bb6926e1c1da93 100644 (file)
@@ -262,7 +262,7 @@ public class RendererFactory {
 
     private Renderer createRendererForDocumentHandler(IFDocumentHandler documentHandler) {
         IFRenderer rend = new IFRenderer();
-        rend.setUserAgent(documentHandler.getUserAgent());
+        rend.setUserAgent(documentHandler.getContext().getUserAgent());
         rend.setDocumentHandler(documentHandler);
         return rend;
     }
index cdc350c9e4295bef7553773ab3896e17f2270469..a7f0a185f3e4147a17d49c6ae1c923201dc1bf3a 100644 (file)
@@ -32,11 +32,11 @@ import org.apache.xmlgraphics.image.writer.ImageWriter;
 import org.apache.xmlgraphics.image.writer.ImageWriterRegistry;
 import org.apache.xmlgraphics.image.writer.MultiImageWriter;
 
-import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.apps.FopFactoryConfigurator;
 import org.apache.fop.apps.MimeConstants;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.render.intermediate.AbstractBinaryWritingIFDocumentHandler;
+import org.apache.fop.render.intermediate.IFContext;
 import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
 import org.apache.fop.render.intermediate.IFException;
 import org.apache.fop.render.intermediate.IFPainter;
@@ -80,11 +80,11 @@ public class TIFFDocumentHandler extends AbstractBinaryWritingIFDocumentHandler
     }
 
     /** {@inheritDoc} */
-    public void setUserAgent(FOUserAgent ua) {
-        super.setUserAgent(ua);
+    public void setContext(IFContext context) {
+        super.setContext(context);
 
         //Set target resolution
-        int dpi = Math.round(ua.getTargetResolution());
+        int dpi = Math.round(context.getUserAgent().getTargetResolution());
         getSettings().getWriterParams().setResolution(dpi);
     }
 
@@ -213,7 +213,7 @@ public class TIFFDocumentHandler extends AbstractBinaryWritingIFDocumentHandler
                 RenderingHints.VALUE_STROKE_PURE);
         graphics2D.scale(scale / 1000f, scale / 1000f);
 
-        return new Java2DPainter(graphics2D, getUserAgent(), getFontInfo());
+        return new Java2DPainter(graphics2D, getContext(), getFontInfo());
     }
 
     /**
index dd1cb10becf8983678032869c2b7eea7a959b08c..230ff49a33c3dfe3b1dd548b783946a2f70dde98 100644 (file)
@@ -22,6 +22,7 @@ package org.apache.fop.render.bitmap;
 import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.apps.MimeConstants;
 import org.apache.fop.render.intermediate.AbstractIFDocumentHandlerMaker;
+import org.apache.fop.render.intermediate.IFContext;
 import org.apache.fop.render.intermediate.IFDocumentHandler;
 import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
 
@@ -36,7 +37,7 @@ public class TIFFDocumentHandlerMaker extends AbstractIFDocumentHandlerMaker {
     /** {@inheritDoc} */
     public IFDocumentHandler makeIFDocumentHandler(FOUserAgent ua) {
         TIFFDocumentHandler handler = new TIFFDocumentHandler();
-        handler.setUserAgent(ua);
+        handler.setContext(new IFContext(ua));
         return handler;
     }
 
index a7b2757a860774d0ffb9056d9c6d1982310b0444..2fb071e185b8892d1e1128c207a02e585545542e 100644 (file)
@@ -32,7 +32,7 @@ public abstract class AbstractIFDocumentHandler implements IFDocumentHandler {
     /** logging instance */
     private static Log log = LogFactory.getLog(AbstractIFDocumentHandler.class);
 
-    private FOUserAgent userAgent;
+    private IFContext ifContext;
 
     /**
      * Default constructor.
@@ -41,16 +41,21 @@ public abstract class AbstractIFDocumentHandler implements IFDocumentHandler {
     }
 
     /** {@inheritDoc} */
-    public void setUserAgent(FOUserAgent ua) {
-        if (this.userAgent != null) {
-            throw new IllegalStateException("The user agent was already set");
-        }
-        this.userAgent = ua;
+    public void setContext(IFContext context) {
+        this.ifContext = context;
     }
 
     /** {@inheritDoc} */
+    public IFContext getContext() {
+        return this.ifContext;
+    }
+
+    /**
+     * Returns the associated user agent.
+     * @return the user agent
+     */
     public FOUserAgent getUserAgent() {
-        return this.userAgent;
+        return getContext().getUserAgent();
     }
 
     /** {@inheritDoc} */
index ea74a37c840dad5c2bee50a55cdf26a0597893c7..3fe7395f319d09e9093b36e9a09e4bcd688dbb09 100644 (file)
@@ -72,11 +72,19 @@ public abstract class AbstractIFPainter implements IFPainter {
     public AbstractIFPainter() {
     }
 
+    /**
+     * Returns the intermediate format context object.
+     * @return the context object
+     */
+    protected abstract IFContext getContext();
+
     /**
      * Returns the user agent.
      * @return the user agent
      */
-    protected abstract FOUserAgent getUserAgent();
+    protected FOUserAgent getUserAgent() {
+        return getContext().getUserAgent();
+    }
 
     /**
      * Returns the FOP factory.
diff --git a/src/java/org/apache/fop/render/intermediate/IFContext.java b/src/java/org/apache/fop/render/intermediate/IFContext.java
new file mode 100644 (file)
index 0000000..b05db13
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * 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.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.intermediate;
+
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.xmlgraphics.util.QName;
+
+import org.apache.fop.apps.FOUserAgent;
+
+/**
+ * This class provides a context object that is valid for a single processing run to create
+ * an output file using the intermediate format. It allows access to the user agent and other
+ * context information, such as foreign attributes for certain elements in the intermediate
+ * format.
+ * <p>
+ * Foreign attributes are usually specific to a particular output format implementation. Most
+ * implementations will just ignore all foreign attributes for most elements. That's why the
+ * main IF interfaces are not burdened with this.
+ */
+public class IFContext {
+
+    private FOUserAgent userAgent;
+
+    /** foreign attributes: Map<QName, Object> */
+    private Map foreignAttributes = Collections.EMPTY_MAP;
+
+    /**
+     * Main constructor.
+     * @param ua the user agent
+     */
+    public IFContext(FOUserAgent ua) {
+        setUserAgent(ua);
+    }
+
+    /**
+     * Set the user agent.
+     * @param ua the user agent
+     */
+    public void setUserAgent(FOUserAgent ua) {
+        if (this.userAgent != null) {
+            throw new IllegalStateException("The user agent was already set");
+        }
+        this.userAgent = ua;
+    }
+
+    /**
+     * Returns the associated user agent.
+     * @return the user agent
+     */
+    public FOUserAgent getUserAgent() {
+        return this.userAgent;
+    }
+
+    /**
+     * Returns the currently applicable foreign attributes.
+     * @return a Map<QName, Object>
+     */
+    public Map getForeignAttributes() {
+        return this.foreignAttributes;
+    }
+
+    /**
+     * Returns a foreign attribute.
+     * @param qName the qualified name of the foreign attribute
+     * @return the value of the foreign attribute or null if the attribute isn't specified
+     */
+    public Object getForeignAttribute(QName qName) {
+        return this.foreignAttributes.get(qName);
+    }
+
+    /**
+     * Sets the currently applicable foreign attributes.
+     * @param foreignAttributes a Map<QName, Object> or null to reset
+     */
+    public void setForeignAttributes(Map foreignAttributes) {
+        if (foreignAttributes != null) {
+            this.foreignAttributes = foreignAttributes;
+        } else {
+            //Make sure there is always at least an empty map so we don't have to check
+            //in the implementation code
+            this.foreignAttributes = Collections.EMPTY_MAP;
+        }
+    }
+
+    /**
+     * Resets the foreign attributes to "no foreign attributes".
+     */
+    public void resetForeignAttributes() {
+        setForeignAttributes(null);
+    }
+
+}
index ea07deee64e9edf3184b745b1e9c30ef4ca29669..bfd31b5e2b32d553b20962db064d25ea0f97c86f 100644 (file)
@@ -23,7 +23,6 @@ import java.awt.Dimension;
 
 import javax.xml.transform.Result;
 
-import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.fonts.FontInfo;
 
 /**
@@ -76,16 +75,16 @@ import org.apache.fop.fonts.FontInfo;
 public interface IFDocumentHandler {
 
     /**
-     * Set the user agent.
-     * @param userAgent  The user agent
+     * Sets the intermediate format context object.
+     * @param context the context object
      */
-    void setUserAgent(FOUserAgent userAgent);
+    void setContext(IFContext context);
 
     /**
-     * Returns the associated user agent.
-     * @return the user agent
+     * Returns the associated intermediate format context object.
+     * @return the context object
      */
-    FOUserAgent getUserAgent();
+    IFContext getContext();
 
     /**
      * Sets the JAXP Result object to receive the generated content.
index 2c704db8bce3972a683cc11fa516973844803b4b..d60cd24d227ca48b425aa08c689f18feba1e9b45 100644 (file)
@@ -25,7 +25,6 @@ import java.awt.Paint;
 import java.awt.Point;
 import java.awt.Rectangle;
 import java.awt.geom.AffineTransform;
-import java.util.Map;
 
 import org.w3c.dom.Document;
 
@@ -164,21 +163,18 @@ public interface IFPainter {
      * an fo:external-graphic in XSL-FO.
      * @param uri the image's URI
      * @param rect the rectangle in which the image shall be painted
-     * @param foreignAttributes a optional Map with foreign attributes (Map<QName,String>)
      * @throws IFException if an error occurs while handling this event
      */
-    void drawImage(String uri, Rectangle rect, Map foreignAttributes) throws IFException;
+    void drawImage(String uri, Rectangle rect) throws IFException;
 
     /**
      * Draws an image (represented by a DOM document) inside a given rectangle. This is the
      * equivalent to an fo:instream-foreign-object in XSL-FO.
      * @param doc the DOM document containing the foreign object
      * @param rect the rectangle in which the image shall be painted
-     * @param foreignAttributes a optional Map with foreign attributes (Map<QName,String>)
      * @throws IFException if an error occurs while handling this event
      */
-    void drawImage(Document doc, Rectangle rect, Map foreignAttributes)
-                throws IFException;
+    void drawImage(Document doc, Rectangle rect) throws IFException;
     //Note: For now, all foreign objects are handled as DOM documents. At the moment, all known
     //implementations use a DOM anyway, so optimizing this to work with SAX wouldn't result in
     //any performance benefits. The IFRenderer itself has a DOM anyway. Only the IFParser could
index 6d037b0cfe1116d6bb9028081c26d8fbf0b87068..c5c88ca783281151ff4d56f25174f11fadd57734 100644 (file)
@@ -151,6 +151,13 @@ public class IFParser implements IFConstants {
             elementHandlers.put(EL_IMAGE, new ImageHandler());
         }
 
+        private void establishForeignAttributes(Map foreignAttributes) {
+            documentHandler.getContext().setForeignAttributes(foreignAttributes);
+        }
+
+        private void resetForeignAttributes() {
+            documentHandler.getContext().resetForeignAttributes();
+        }
 
         /** {@inheritDoc} */
         public void startElement(String uri, String localName, String qName, Attributes attributes)
@@ -348,7 +355,11 @@ public class IFParser implements IFConstants {
                 String pageMasterName = attributes.getValue("page-master-name");
                 int width = Integer.parseInt(attributes.getValue("width"));
                 int height = Integer.parseInt(attributes.getValue("height"));
-                documentHandler.startPage(index, name, pageMasterName, new Dimension(width, height));
+                Map foreignAttributes = getForeignAttributes(lastAttributes);
+                establishForeignAttributes(foreignAttributes);
+                documentHandler.startPage(index, name, pageMasterName,
+                        new Dimension(width, height));
+                resetForeignAttributes();
             }
 
             public void endElement() throws IFException {
@@ -547,9 +558,10 @@ public class IFParser implements IFConstants {
                 int width = Integer.parseInt(lastAttributes.getValue("width"));
                 int height = Integer.parseInt(lastAttributes.getValue("height"));
                 Map foreignAttributes = getForeignAttributes(lastAttributes);
+                establishForeignAttributes(foreignAttributes);
                 if (foreignObject != null) {
                     painter.drawImage(foreignObject,
-                            new Rectangle(x, y, width, height), foreignAttributes);
+                            new Rectangle(x, y, width, height));
                     foreignObject = null;
                 } else {
                     String uri = lastAttributes.getValue(
@@ -557,8 +569,9 @@ public class IFParser implements IFConstants {
                     if (uri == null) {
                         throw new IFException("xlink:href is missing on image", null);
                     }
-                    painter.drawImage(uri, new Rectangle(x, y, width, height), foreignAttributes);
+                    painter.drawImage(uri, new Rectangle(x, y, width, height));
                 }
+                resetForeignAttributes();
                 inForeignObject = false;
             }
 
index 50ef524b3def13d8a2ed114e6edaa2b2bf1a0483..6ff96d18ea7ebf7dae6b87c1c95a09f546c2507a 100644 (file)
@@ -229,7 +229,7 @@ public class IFRenderer extends AbstractPathOrientedRenderer {
      */
     protected IFDocumentHandler createDefaultDocumentHandler() {
         IFSerializer serializer = new IFSerializer();
-        serializer.setUserAgent(getUserAgent());
+        serializer.setContext(new IFContext(getUserAgent()));
         return serializer;
     }
 
@@ -554,8 +554,11 @@ public class IFRenderer extends AbstractPathOrientedRenderer {
             Dimension dim = new Dimension(
                     (int)Math.ceil(viewArea.getWidth()),
                     (int)Math.ceil(viewArea.getHeight()));
+
+            establishForeignAttributes(page.getForeignAttributes());
             documentHandler.startPage(page.getPageIndex(), page.getPageNumberString(),
                     page.getSimplePageMasterName(), dim);
+            resetForeignAttributes();
             documentHandler.startPageHeader();
 
             //Add page attachments to page header
@@ -584,12 +587,22 @@ public class IFRenderer extends AbstractPathOrientedRenderer {
             }
             documentHandler.endPageTrailer();
 
+            establishForeignAttributes(page.getForeignAttributes());
             documentHandler.endPage();
+            resetForeignAttributes();
         } catch (IFException e) {
             handleIFException(e);
         }
     }
 
+    private void establishForeignAttributes(Map foreignAttributes) {
+        documentHandler.getContext().setForeignAttributes(foreignAttributes);
+    }
+
+    private void resetForeignAttributes() {
+        documentHandler.getContext().resetForeignAttributes();
+    }
+
     /** {@inheritDoc} */
     protected void saveGraphicsState() {
         graphicContextStack.push(graphicContext);
@@ -1108,7 +1121,9 @@ public class IFRenderer extends AbstractPathOrientedRenderer {
                 (int)pos.getHeight());
         uri = URISpecification.getURL(uri);
         try {
-            painter.drawImage(uri, posInt, foreignAttributes);
+            establishForeignAttributes(foreignAttributes);
+            painter.drawImage(uri, posInt);
+            resetForeignAttributes();
         } catch (IFException ife) {
             handleIFException(ife);
         }
@@ -1124,7 +1139,9 @@ public class IFRenderer extends AbstractPathOrientedRenderer {
                 (int)pos.getHeight());
         Document doc = fo.getDocument();
         try {
-            painter.drawImage(doc, posInt, fo.getForeignAttributes());
+            establishForeignAttributes(fo.getForeignAttributes());
+            painter.drawImage(doc, posInt);
+            resetForeignAttributes();
         } catch (IFException ife) {
             handleIFException(ife);
         }
index 1cc0e98d677b2627d1747daf1df38028a2a79075..03f96c2887087ca99c1be5f18b929623bc7ab99e 100644 (file)
@@ -229,6 +229,7 @@ public class IFSerializer extends AbstractXMLWritingIFDocumentHandler
             addAttribute(atts, "page-master-name", pageMasterName);
             addAttribute(atts, "width", Integer.toString(size.width));
             addAttribute(atts, "height", Integer.toString(size.height));
+            addForeignAttributes(atts);
             handler.startElement(EL_PAGE, atts);
         } catch (SAXException e) {
             throw new IFException("SAX error in startPage()", e);
@@ -278,7 +279,6 @@ public class IFSerializer extends AbstractXMLWritingIFDocumentHandler
     public void startPageTrailer() throws IFException {
         try {
             handler.startElement(EL_PAGE_TRAILER);
-            commitNavigation();
         } catch (SAXException e) {
             throw new IFException("SAX error in startPageTrailer()", e);
         }
@@ -287,6 +287,7 @@ public class IFSerializer extends AbstractXMLWritingIFDocumentHandler
     /** {@inheritDoc} */
     public void endPageTrailer() throws IFException {
         try {
+            commitNavigation();
             handler.endElement(EL_PAGE_TRAILER);
         } catch (SAXException e) {
             throw new IFException("SAX error in endPageTrailer()", e);
@@ -375,7 +376,7 @@ public class IFSerializer extends AbstractXMLWritingIFDocumentHandler
     }
 
     /** {@inheritDoc} */
-    public void drawImage(String uri, Rectangle rect, Map foreignAttributes) throws IFException {
+    public void drawImage(String uri, Rectangle rect) throws IFException {
         try {
             AttributesImpl atts = new AttributesImpl();
             addAttribute(atts, XLINK_HREF, uri);
@@ -383,34 +384,33 @@ public class IFSerializer extends AbstractXMLWritingIFDocumentHandler
             addAttribute(atts, "y", Integer.toString(rect.y));
             addAttribute(atts, "width", Integer.toString(rect.width));
             addAttribute(atts, "height", Integer.toString(rect.height));
-            if (foreignAttributes != null) {
-                Iterator iter = foreignAttributes.entrySet().iterator();
-                while (iter.hasNext()) {
-                    Map.Entry entry = (Map.Entry)iter.next();
-                    addAttribute(atts, (QName)entry.getKey(), entry.getValue().toString());
-                }
-            }
+            addForeignAttributes(atts);
             handler.element(EL_IMAGE, atts);
         } catch (SAXException e) {
             throw new IFException("SAX error in startGroup()", e);
         }
     }
 
+    private void addForeignAttributes(AttributesImpl atts) {
+        Map foreignAttributes = getContext().getForeignAttributes();
+        if (!foreignAttributes.isEmpty()) {
+            Iterator iter = foreignAttributes.entrySet().iterator();
+            while (iter.hasNext()) {
+                Map.Entry entry = (Map.Entry)iter.next();
+                addAttribute(atts, (QName)entry.getKey(), entry.getValue().toString());
+            }
+        }
+    }
+
     /** {@inheritDoc} */
-    public void drawImage(Document doc, Rectangle rect, Map foreignAttributes) throws IFException {
+    public void drawImage(Document doc, Rectangle rect) throws IFException {
         try {
             AttributesImpl atts = new AttributesImpl();
             addAttribute(atts, "x", Integer.toString(rect.x));
             addAttribute(atts, "y", Integer.toString(rect.y));
             addAttribute(atts, "width", Integer.toString(rect.width));
             addAttribute(atts, "height", Integer.toString(rect.height));
-            if (foreignAttributes != null) {
-                Iterator iter = foreignAttributes.entrySet().iterator();
-                while (iter.hasNext()) {
-                    Map.Entry entry = (Map.Entry)iter.next();
-                    addAttribute(atts, (QName)entry.getKey(), entry.getValue().toString());
-                }
-            }
+            addForeignAttributes(atts);
             handler.startElement(EL_IMAGE, atts);
             new DOM2SAX(handler).writeDocument(doc, true);
             handler.endElement(EL_IMAGE);
@@ -499,7 +499,7 @@ public class IFSerializer extends AbstractXMLWritingIFDocumentHandler
             addAttribute(atts, "x2", Integer.toString(end.x));
             addAttribute(atts, "y2", Integer.toString(end.y));
             addAttribute(atts, "stroke-width", Integer.toString(width));
-            addAttribute(atts, "color", Integer.toString(width));
+            addAttribute(atts, "color", ColorUtil.colorToString(color));
             addAttribute(atts, "style", style.getName());
             handler.element(EL_LINE, atts);
         } catch (SAXException e) {
@@ -698,9 +698,8 @@ public class IFSerializer extends AbstractXMLWritingIFDocumentHandler
     public void addResolvedAction(AbstractAction action) throws IFException {
         assert action.isComplete();
         assert action.hasID();
-        AbstractAction noted = (AbstractAction)incompleteActions.get(action.getID());
+        AbstractAction noted = (AbstractAction)incompleteActions.remove(action.getID());
         if (noted != null) {
-            incompleteActions.remove(action.getID());
             completeActions.add(action);
         } else {
             //ignore as it was already complete when it was first used.
index 3351740e212ad108ac74a0602fc6ba7afac9762a..8516277c58805a0037729fcdd010e0f870d6e324 100644 (file)
@@ -99,17 +99,27 @@ public class DocumentNavigationHandler extends DefaultHandler
                 Link link = new Link(null, targetRect);
                 objectStack.push(link);
             } else if (GOTO_XY.getLocalName().equals(localName)) {
-                String id = attributes.getValue("id");
-                int pageIndex = XMLUtil.getAttributeAsInt(attributes, "page-index");
-                int x = XMLUtil.getAttributeAsInt(attributes, "x");
-                int y = XMLUtil.getAttributeAsInt(attributes, "y");
-                GoToXYAction action = new GoToXYAction(id, pageIndex, new Point(x, y));
+                String idref = attributes.getValue("idref");
+                GoToXYAction action;
+                if (idref != null) {
+                    action = new GoToXYAction(idref);
+                } else {
+                    String id = attributes.getValue("id");
+                    int pageIndex = XMLUtil.getAttributeAsInt(attributes, "page-index");
+                    int x = XMLUtil.getAttributeAsInt(attributes, "x");
+                    int y = XMLUtil.getAttributeAsInt(attributes, "y");
+                    action = new GoToXYAction(id, pageIndex, new Point(x, y));
+                }
                 objectStack.push(action);
             } else if (GOTO_URI.getLocalName().equals(localName)) {
+                String id = attributes.getValue("id");
                 String gotoURI = attributes.getValue("uri");
                 String showDestination = attributes.getValue("show-destination");
                 boolean newWindow = "new".equals(showDestination);
                 URIAction action = new URIAction(gotoURI, newWindow);
+                if (id != null) {
+                    action.setID(id);
+                }
                 objectStack.push(action);
             } else {
                 throw new SAXException(
index 34fbb3384807958fa296def38b816bc3b43e621e..a3b7bb86ea7845ad08cb4572d315525ce6d3908b 100644 (file)
@@ -29,7 +29,6 @@ import java.awt.font.GlyphVector;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.Point2D;
 import java.io.IOException;
-import java.util.Map;
 import java.util.Stack;
 
 import org.w3c.dom.Document;
@@ -37,12 +36,12 @@ import org.w3c.dom.Document;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.fonts.Font;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.FontTriplet;
 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.traits.BorderProps;
@@ -56,8 +55,8 @@ public class Java2DPainter extends AbstractIFPainter {
     /** logging instance */
     private static Log log = LogFactory.getLog(Java2DPainter.class);
 
-    /** the FO user agent */
-    protected FOUserAgent userAgent;
+    /** the IF context */
+    protected IFContext ifContext;
 
     /** The font information */
     protected FontInfo fontInfo;
@@ -71,23 +70,23 @@ public class Java2DPainter extends AbstractIFPainter {
     /**
      * Main constructor.
      * @param g2d the target Graphics2D instance
-     * @param userAgent the user agent
+     * @param context the IF context
      * @param fontInfo the font information
      */
-    public Java2DPainter(Graphics2D g2d, FOUserAgent userAgent, FontInfo fontInfo) {
-        this(g2d, userAgent, fontInfo, null);
+    public Java2DPainter(Graphics2D g2d, IFContext context, FontInfo fontInfo) {
+        this(g2d, context, fontInfo, null);
     }
 
     /**
      * Special constructor for embedded use (when another painter uses Java2DPainter
      * to convert part of a document into a bitmap, for example).
      * @param g2d the target Graphics2D instance
-     * @param userAgent the user agent
+     * @param context the IF context
      * @param fontInfo the font information
      */
-    public Java2DPainter(Graphics2D g2d, FOUserAgent userAgent, FontInfo fontInfo, IFState state) {
+    public Java2DPainter(Graphics2D g2d, IFContext context, FontInfo fontInfo, IFState state) {
         super();
-        this.userAgent = userAgent;
+        this.ifContext = context;
         if (state != null) {
             this.state = state.push();
         } else {
@@ -99,8 +98,8 @@ public class Java2DPainter extends AbstractIFPainter {
     }
 
     /** {@inheritDoc} */
-    public FOUserAgent getUserAgent() {
-        return this.userAgent;
+    public IFContext getContext() {
+        return this.ifContext;
     }
 
     /**
@@ -155,7 +154,7 @@ public class Java2DPainter extends AbstractIFPainter {
     }
 
     /** {@inheritDoc} */
-    public void drawImage(String uri, Rectangle rect, Map foreignAttributes) throws IFException {
+    public void drawImage(String uri, Rectangle rect) throws IFException {
         drawImageUsingURI(uri, rect);
     }
 
@@ -167,7 +166,7 @@ public class Java2DPainter extends AbstractIFPainter {
     }
 
     /** {@inheritDoc} */
-    public void drawImage(Document doc, Rectangle rect, Map foreignAttributes) throws IFException {
+    public void drawImage(Document doc, Rectangle rect) throws IFException {
         drawImageUsingDocument(doc, rect);
     }
 
index 3e9201da4e9faae072dca64fdd206513cca20a4f..d7011f1120ee00db61ae342018d2430e3eecd30f 100644 (file)
@@ -32,14 +32,15 @@ import org.apache.commons.logging.LogFactory;
 
 import org.apache.xmlgraphics.util.UnitConv;
 
-import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.apps.FopFactoryConfigurator;
 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.IFDocumentHandlerConfigurator;
 import org.apache.fop.render.intermediate.IFException;
 import org.apache.fop.render.intermediate.IFPainter;
 import org.apache.fop.render.java2d.Java2DPainter;
+import org.apache.fop.render.pcl.extensions.PCLElementMapping;
 
 /**
  * {@code IFDocumentHandler} implementation that produces PCL 5.
@@ -84,9 +85,9 @@ public class PCLDocumentHandler extends AbstractBinaryWritingIFDocumentHandler
     }
 
     /** {@inheritDoc} */
-    public void setUserAgent(FOUserAgent ua) {
-        super.setUserAgent(ua);
-        this.pclUtil = new PCLRenderingUtil(ua);
+    public void setContext(IFContext context) {
+        super.setContext(context);
+        this.pclUtil = new PCLRenderingUtil(context.getUserAgent());
     }
 
     /** {@inheritDoc} */
@@ -173,24 +174,23 @@ public class PCLDocumentHandler extends AbstractBinaryWritingIFDocumentHandler
     }
 
     /** {@inheritDoc} */
-    public void startPage(int index, String name, String pageMasterName, Dimension size) throws IFException {
+    public void startPage(int index, String name, String pageMasterName, Dimension size)
+            throws IFException {
 
         try {
-            //TODO Add support for paper-source and duplex-mode
-            /*
             //Paper source
-            String paperSource = page.getForeignAttributeValue(
-                    new QName(PCLElementMapping.NAMESPACE, null, "paper-source"));
+            Object paperSource = getContext().getForeignAttribute(
+                    PCLElementMapping.PCL_PAPER_SOURCE);
             if (paperSource != null) {
-                gen.selectPaperSource(Integer.parseInt(paperSource));
+                gen.selectPaperSource(Integer.parseInt(paperSource.toString()));
             }
 
             // Is Page duplex?
-            String pageDuplex = page.getForeignAttributeValue(
-                    new QName(PCLElementMapping.NAMESPACE, null, "duplex-mode"));
+            Object pageDuplex = getContext().getForeignAttribute(
+                    PCLElementMapping.PCL_DUPLEX_MODE);
             if (pageDuplex != null) {
-                gen.selectDuplexMode(Integer.parseInt(pageDuplex));
-            }*/
+                gen.selectDuplexMode(Integer.parseInt(pageDuplex.toString()));
+            }
 
             //Page size
             final long pagewidth = size.width;
@@ -240,7 +240,7 @@ public class PCLDocumentHandler extends AbstractBinaryWritingIFDocumentHandler
         graphics2D.scale(scale / 1000f, scale / 1000f);
         graphics2D.translate(-printArea.x, -printArea.y);
 
-        return new Java2DPainter(graphics2D, getUserAgent(), getFontInfo());
+        return new Java2DPainter(graphics2D, getContext(), getFontInfo());
     }
 
     private BufferedImage createBufferedImage(int bitmapWidth, int bitmapHeight) {
index 4a937d7b1e00fcc61cd03f09952b61647fd9c909..62c2a4e779051c9c8d92c0bb6e3be5f7cb821e8c 100644 (file)
@@ -22,6 +22,7 @@ package org.apache.fop.render.pcl;
 import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.apps.MimeConstants;
 import org.apache.fop.render.intermediate.AbstractIFDocumentHandlerMaker;
+import org.apache.fop.render.intermediate.IFContext;
 import org.apache.fop.render.intermediate.IFDocumentHandler;
 import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
 
@@ -36,7 +37,7 @@ public class PCLDocumentHandlerMaker extends AbstractIFDocumentHandlerMaker {
     /** {@inheritDoc} */
     public IFDocumentHandler makeIFDocumentHandler(FOUserAgent ua) {
         PCLDocumentHandler handler = new PCLDocumentHandler();
-        handler.setUserAgent(ua);
+        handler.setContext(new IFContext(ua));
         return handler;
     }
 
index 784aca941e9eb0270ca839b429181c82d27af234..28e8224a8cd69816662185c2f164fa7400f18795 100644 (file)
@@ -45,11 +45,11 @@ import org.apache.xmlgraphics.image.loader.impl.ImageGraphics2D;
 import org.apache.xmlgraphics.java2d.GraphicContext;
 import org.apache.xmlgraphics.java2d.Graphics2DImagePainter;
 
-import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.fonts.Font;
 import org.apache.fop.fonts.FontTriplet;
 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.java2d.FontMetricsMapper;
@@ -83,6 +83,7 @@ public class PCLPainter extends AbstractIFPainter implements PCLConstants {
     /**
      * Main constructor.
      * @param parent the parent document handler
+     * @param pageDefinition the page definition describing the page to be rendered
      */
     public PCLPainter(PCLDocumentHandler parent, PCLPageDefinition pageDefinition) {
         this.parent = parent;
@@ -92,8 +93,8 @@ public class PCLPainter extends AbstractIFPainter implements PCLConstants {
     }
 
     /** {@inheritDoc} */
-    public FOUserAgent getUserAgent() {
-        return this.parent.getUserAgent();
+    public IFContext getContext() {
+        return this.parent.getContext();
     }
 
     PCLRenderingUtil getPCLUtil() {
@@ -152,8 +153,8 @@ public class PCLPainter extends AbstractIFPainter implements PCLConstants {
     }
 
     /** {@inheritDoc} */
-    public void drawImage(String uri, Rectangle rect, Map foreignAttributes) throws IFException {
-        drawImageUsingURI(uri, rect/*, foreignAttributes*/);
+    public void drawImage(String uri, Rectangle rect) throws IFException {
+        drawImageUsingURI(uri, rect);
     }
 
     /** {@inheritDoc} */
@@ -174,7 +175,7 @@ public class PCLPainter extends AbstractIFPainter implements PCLConstants {
     }
 
     /** {@inheritDoc} */
-    public void drawImage(Document doc, Rectangle rect, Map foreignAttributes) throws IFException {
+    public void drawImage(Document doc, Rectangle rect) throws IFException {
         drawImageUsingDocument(doc, rect);
     }
 
@@ -225,7 +226,7 @@ public class PCLPainter extends AbstractIFPainter implements PCLConstants {
                     g2d.translate(-rect.x, -rect.y);
 
                     Java2DPainter painter = new Java2DPainter(g2d,
-                            getUserAgent(), parent.getFontInfo(), state);
+                            getContext(), parent.getFontInfo(), state);
                     try {
                         painter.drawBorderRect(rect, before, after, start, end);
                     } catch (IFException e) {
@@ -260,7 +261,7 @@ public class PCLPainter extends AbstractIFPainter implements PCLConstants {
                 g2d.translate(-boundingBox.x, -boundingBox.y);
 
                 Java2DPainter painter = new Java2DPainter(g2d,
-                        getUserAgent(), parent.getFontInfo(), state);
+                        getContext(), parent.getFontInfo(), state);
                 try {
                     painter.drawLine(start, end, width, color, style);
                 } catch (IFException e) {
@@ -458,7 +459,7 @@ public class PCLPainter extends AbstractIFPainter implements PCLConstants {
                     g2d.draw(rect);
                 }
                 Java2DPainter painter = new Java2DPainter(g2d,
-                        getUserAgent(), parent.getFontInfo(), state);
+                        getContext(), parent.getFontInfo(), state);
                 try {
                     painter.drawText(x, y, dx, dy, text);
                 } catch (IFException e) {
index b492f1b0795eb8ad7eea831fd63daf1b960b9089..eaccc523f644614ddda8394396e5ee36259c4896 100644 (file)
@@ -56,7 +56,6 @@ import org.apache.xmlgraphics.image.loader.impl.ImageXMLDOM;
 import org.apache.xmlgraphics.image.loader.util.ImageUtil;
 import org.apache.xmlgraphics.java2d.GraphicContext;
 import org.apache.xmlgraphics.java2d.Graphics2DImagePainter;
-import org.apache.xmlgraphics.util.QName;
 import org.apache.xmlgraphics.util.UnitConv;
 
 import org.apache.fop.apps.FOPException;
@@ -284,15 +283,13 @@ public class PCLRenderer extends PrintRenderer implements PCLConstants {
         saveGraphicsState();
 
         //Paper source
-        String paperSource = page.getForeignAttributeValue(
-                new QName(PCLElementMapping.NAMESPACE, null, "paper-source"));
+        String paperSource = page.getForeignAttributeValue(PCLElementMapping.PCL_PAPER_SOURCE);
         if (paperSource != null) {
             gen.selectPaperSource(Integer.parseInt(paperSource));
         }
 
         // Is Page duplex?
-        String pageDuplex = page.getForeignAttributeValue(
-                new QName(PCLElementMapping.NAMESPACE, null, "duplex-mode"));
+        String pageDuplex = page.getForeignAttributeValue(PCLElementMapping.PCL_DUPLEX_MODE);
         if (pageDuplex != null) {
             gen.selectDuplexMode(Integer.parseInt(pageDuplex));
         }
@@ -534,7 +531,7 @@ public class PCLRenderer extends PrintRenderer implements PCLConstants {
                     public Dimension getImageSize() {
                         return paintRect.getSize();
                     }
-                    
+
                 };
                 g2a.paintImage(painter, rc,
                         paintRect.x, paintRect.y, paintRect.width, paintRect.height);
index 1c540718bbb1a9418368f1444244a2923cecf5cd..53931f671a409b9e7c2b9e4269958ffb3df9f062 100644 (file)
@@ -21,6 +21,8 @@ package org.apache.fop.render.pcl.extensions;
 
 import java.util.HashMap;
 
+import org.apache.xmlgraphics.util.QName;
+
 import org.apache.fop.fo.ElementMapping;
 
 /**
@@ -34,6 +36,14 @@ public class PCLElementMapping extends ElementMapping {
     /** The usual namespace prefix used for PCL extensions */
     public static final String NAMESPACE_PREFIX = "pcl";
 
+    /** The extension attribute for the PCL paper source */
+    public static final QName PCL_PAPER_SOURCE
+        = new QName(PCLElementMapping.NAMESPACE, null, "paper-source");
+
+    /** The extension attribute for the PCL duplex mode */
+    public static final QName PCL_DUPLEX_MODE
+        = new QName(PCLElementMapping.NAMESPACE, null, "duplex-mode");
+
     /** Main constructor */
     public PCLElementMapping() {
         this.namespaceURI = NAMESPACE;
index 32ab2fa7a53f8b072735339be4d15287a2346fa4..901dc4473fe9cf1826d4e82743c31cbb8d7af07f 100644 (file)
@@ -29,7 +29,6 @@ import org.apache.commons.logging.LogFactory;
 
 import org.apache.xmlgraphics.xmp.Metadata;
 
-import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.apps.MimeConstants;
 import org.apache.fop.fo.extensions.xmp.XMPMetadata;
 import org.apache.fop.pdf.PDFAnnotList;
@@ -39,6 +38,7 @@ import org.apache.fop.pdf.PDFReference;
 import org.apache.fop.pdf.PDFResourceContext;
 import org.apache.fop.pdf.PDFResources;
 import org.apache.fop.render.intermediate.AbstractBinaryWritingIFDocumentHandler;
+import org.apache.fop.render.intermediate.IFContext;
 import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
 import org.apache.fop.render.intermediate.IFDocumentNavigationHandler;
 import org.apache.fop.render.intermediate.IFException;
@@ -99,9 +99,9 @@ public class PDFDocumentHandler extends AbstractBinaryWritingIFDocumentHandler {
     }
 
     /** {@inheritDoc} */
-    public void setUserAgent(FOUserAgent ua) {
-        super.setUserAgent(ua);
-        this.pdfUtil = new PDFRenderingUtil(ua);
+    public void setContext(IFContext context) {
+        super.setContext(context);
+        this.pdfUtil = new PDFRenderingUtil(context.getUserAgent());
     }
 
     /** {@inheritDoc} */
index 88ae60d2c9b1a1a3ce09ded9ae9ae0fba7dba8a0..fa0a49ee74724feb50f45982156b093736fa7a9d 100644 (file)
@@ -22,6 +22,7 @@ package org.apache.fop.render.pdf;
 import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.apps.MimeConstants;
 import org.apache.fop.render.intermediate.AbstractIFDocumentHandlerMaker;
+import org.apache.fop.render.intermediate.IFContext;
 import org.apache.fop.render.intermediate.IFDocumentHandler;
 import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
 
@@ -36,7 +37,7 @@ public class PDFDocumentHandlerMaker extends AbstractIFDocumentHandlerMaker {
     /** {@inheritDoc} */
     public IFDocumentHandler makeIFDocumentHandler(FOUserAgent ua) {
         PDFDocumentHandler handler = new PDFDocumentHandler();
-        handler.setUserAgent(ua);
+        handler.setContext(new IFContext(ua));
         return handler;
     }
 
index 278089d265d5695f3e68d0e555a06410b7fa9c45..6386b8df6b77f2983a967b2aeba37ce2f5fea640 100644 (file)
@@ -26,14 +26,12 @@ import java.awt.Point;
 import java.awt.Rectangle;
 import java.awt.geom.AffineTransform;
 import java.io.IOException;
-import java.util.Map;
 
 import org.w3c.dom.Document;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.fonts.Font;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.FontTriplet;
@@ -46,6 +44,7 @@ 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.traits.BorderProps;
@@ -80,8 +79,8 @@ public class PDFPainter extends AbstractIFPainter {
     }
 
     /** {@inheritDoc} */
-    protected FOUserAgent getUserAgent() {
-        return this.documentHandler.getUserAgent();
+    protected IFContext getContext() {
+        return this.documentHandler.getContext();
     }
 
     PDFRenderingUtil getPDFUtil() {
@@ -123,7 +122,7 @@ public class PDFPainter extends AbstractIFPainter {
     }
 
     /** {@inheritDoc} */
-    public void drawImage(String uri, Rectangle rect, Map foreignAttributes) throws IFException {
+    public void drawImage(String uri, Rectangle rect) throws IFException {
         PDFXObject xobject = getPDFDoc().getXObject(uri);
         if (xobject != null) {
             placeImage(rect, xobject);
@@ -161,7 +160,7 @@ public class PDFPainter extends AbstractIFPainter {
     }
 
     /** {@inheritDoc} */
-    public void drawImage(Document doc, Rectangle rect, Map foreignAttributes) throws IFException {
+    public void drawImage(Document doc, Rectangle rect) throws IFException {
         drawImageUsingDocument(doc, rect);
 
         flushPDFDoc();
index 543a3e90d2ee21e90e3da971630e946e5e34f2b7..7f86017c1cb2b6e6fcb2d9feb21aacfbb9114eda 100644 (file)
@@ -49,11 +49,11 @@ import org.apache.xmlgraphics.ps.dsc.ResourceTracker;
 import org.apache.xmlgraphics.ps.dsc.events.DSCCommentBoundingBox;
 import org.apache.xmlgraphics.ps.dsc.events.DSCCommentHiResBoundingBox;
 
-import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.apps.MimeConstants;
 import org.apache.fop.fonts.LazyFont;
 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;
 import org.apache.fop.render.intermediate.IFException;
 import org.apache.fop.render.intermediate.IFPainter;
@@ -122,9 +122,9 @@ public class PSDocumentHandler extends AbstractBinaryWritingIFDocumentHandler {
     }
 
     /** {@inheritDoc} */
-    public void setUserAgent(FOUserAgent ua) {
-        super.setUserAgent(ua);
-        this.psUtil = new PSRenderingUtil(ua);
+    public void setContext(IFContext context) {
+        super.setContext(context);
+        this.psUtil = new PSRenderingUtil(context.getUserAgent());
     }
 
     /** {@inheritDoc} */
index 635cd072004f98ccafcd0d77d0aad7dacc7811ba..e105ac8360b388c8f57287ec55158ad3a53c8250 100644 (file)
@@ -22,6 +22,7 @@ package org.apache.fop.render.ps;
 import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.apps.MimeConstants;
 import org.apache.fop.render.intermediate.AbstractIFDocumentHandlerMaker;
+import org.apache.fop.render.intermediate.IFContext;
 import org.apache.fop.render.intermediate.IFDocumentHandler;
 import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
 
@@ -37,7 +38,7 @@ public class PSDocumentHandlerMaker extends AbstractIFDocumentHandlerMaker {
     /** {@inheritDoc} */
     public IFDocumentHandler makeIFDocumentHandler(FOUserAgent ua) {
         PSDocumentHandler handler = new PSDocumentHandler();
-        handler.setUserAgent(ua);
+        handler.setContext(new IFContext(ua));
         return handler;
     }
 
index a55d20739e33cbd52eb0efca4d93c92f9cc9cee0..02fb7292cac0d560d0b9c6f3a92225d3c4450549 100644 (file)
@@ -40,7 +40,6 @@ import org.apache.xmlgraphics.image.loader.ImageSessionContext;
 import org.apache.xmlgraphics.ps.PSGenerator;
 import org.apache.xmlgraphics.ps.PSResource;
 
-import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.fonts.Font;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.FontTriplet;
@@ -49,6 +48,7 @@ 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.traits.BorderProps;
@@ -80,8 +80,8 @@ public class PSPainter extends AbstractIFPainter {
     }
 
     /** {@inheritDoc} */
-    protected FOUserAgent getUserAgent() {
-        return this.documentHandler.getUserAgent();
+    protected IFContext getContext() {
+        return this.documentHandler.getContext();
     }
 
     PSRenderingUtil getPSUtil() {
@@ -176,7 +176,7 @@ public class PSPainter extends AbstractIFPainter {
     }
 
     /** {@inheritDoc} */
-    public void drawImage(String uri, Rectangle rect, Map foreignAttributes) throws IFException {
+    public void drawImage(String uri, Rectangle rect) throws IFException {
         try {
             endTextObject();
         } catch (IOException ioe) {
@@ -186,7 +186,7 @@ public class PSPainter extends AbstractIFPainter {
     }
 
     /** {@inheritDoc} */
-    public void drawImage(Document doc, Rectangle rect, Map foreignAttributes) throws IFException {
+    public void drawImage(Document doc, Rectangle rect) throws IFException {
         try {
             endTextObject();
         } catch (IOException ioe) {
index 0296135fdebd13378e2c7c9cccb881d12a0a2df7..c24a5af6104a8f2929f2f41973897e70ac73a5ff 100644 (file)
@@ -21,6 +21,7 @@ package org.apache.fop.render.svg;
 
 import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.render.intermediate.AbstractIFDocumentHandlerMaker;
+import org.apache.fop.render.intermediate.IFContext;
 import org.apache.fop.render.intermediate.IFDocumentHandler;
 import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
 
@@ -34,7 +35,7 @@ public class SVGDocumentHandlerMaker extends AbstractIFDocumentHandlerMaker {
     /** {@inheritDoc} */
     public IFDocumentHandler makeIFDocumentHandler(FOUserAgent ua) {
         SVGDocumentHandler handler = new SVGDocumentHandler();
-        handler.setUserAgent(ua);
+        handler.setContext(new IFContext(ua));
         return handler;
     }
 
index df67971b8c5ea4fd3cd2f1f556c902f140e8446e..e1626e6f9b6c21e7ac2bbaee19be8efcbef96823 100644 (file)
@@ -44,13 +44,13 @@ import org.apache.xmlgraphics.image.loader.ImageSessionContext;
 import org.apache.xmlgraphics.util.QName;
 import org.apache.xmlgraphics.xmp.Metadata;
 
-import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.apps.MimeConstants;
 import org.apache.fop.events.ResourceEventProducer;
 import org.apache.fop.fo.extensions.ExtensionElementMapping;
 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;
@@ -93,8 +93,8 @@ public class SVGPainter extends AbstractIFPainter implements SVGConstants {
     }
 
     /** {@inheritDoc} */
-    protected FOUserAgent getUserAgent() {
-        return parent.getUserAgent();
+    protected IFContext getContext() {
+        return parent.getContext();
     }
 
     /** {@inheritDoc} */
@@ -197,7 +197,7 @@ public class SVGPainter extends AbstractIFPainter implements SVGConstants {
             = new QName(ExtensionElementMapping.URI, null, "conversion-mode");
 
     /** {@inheritDoc} */
-    public void drawImage(String uri, Rectangle rect, Map foreignAttributes) throws IFException {
+    public void drawImage(String uri, Rectangle rect) throws IFException {
         try {
             establish(MODE_NORMAL);
 
@@ -208,6 +208,7 @@ public class SVGPainter extends AbstractIFPainter implements SVGConstants {
                 info = manager.getImageInfo(uri, sessionContext);
 
                 String mime = info.getMimeType();
+                Map foreignAttributes = getContext().getForeignAttributes();
                 String conversionMode = (String)foreignAttributes.get(CONVERSION_MODE);
                 if ("reference".equals(conversionMode)
                         && (MimeConstants.MIME_GIF.equals(mime)
@@ -245,7 +246,7 @@ public class SVGPainter extends AbstractIFPainter implements SVGConstants {
     }
 
     /** {@inheritDoc} */
-    public void drawImage(Document doc, Rectangle rect, Map foreignAttributes) throws IFException {
+    public void drawImage(Document doc, Rectangle rect) throws IFException {
         try {
             establish(MODE_NORMAL);
 
index 61993da139c0828ad9f87e064fbb160c761b73a3..8da7032aaad7892e15db96bcd3e01f72b3d3c235 100644 (file)
@@ -21,6 +21,7 @@ package org.apache.fop.render.svg;
 
 import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.render.intermediate.AbstractIFDocumentHandlerMaker;
+import org.apache.fop.render.intermediate.IFContext;
 import org.apache.fop.render.intermediate.IFDocumentHandler;
 import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
 
@@ -34,7 +35,7 @@ public class SVGPrintDocumentHandlerMaker extends AbstractIFDocumentHandlerMaker
     /** {@inheritDoc} */
     public IFDocumentHandler makeIFDocumentHandler(FOUserAgent ua) {
         SVGPrintDocumentHandler handler = new SVGPrintDocumentHandler();
-        handler.setUserAgent(ua);
+        handler.setContext(new IFContext(ua));
         return handler;
     }
 
index b61c252d7af5fb6d8fbed639468dfad66a1d27eb..76d72c8040e18678e477b233553676f2a20c6dce 100644 (file)
@@ -36,6 +36,7 @@ import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.apps.Fop;
 import org.apache.fop.apps.MimeConstants;
 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.IFParser;
 import org.apache.fop.render.intermediate.IFRenderer;
@@ -87,7 +88,7 @@ public class IFParserTestCase extends AbstractIntermediateTestCase {
 
         //Setup painter
         IFSerializer serializer = new IFSerializer();
-        serializer.setUserAgent(userAgent);
+        serializer.setContext(new IFContext(userAgent));
         serializer.mimicDocumentHandler(targetHandler);
         serializer.setResult(domResult);
 
@@ -125,7 +126,7 @@ public class IFParserTestCase extends AbstractIntermediateTestCase {
         FOUserAgent userAgent = createUserAgent();
 
         IFSerializer serializer = new IFSerializer();
-        serializer.setUserAgent(userAgent);
+        serializer.setContext(new IFContext(userAgent));
         DOMResult domResult = new DOMResult();
         serializer.setResult(domResult);
 
index 7f64ad489350db6531f5d3b2ddb6e07ba2f061b1..a3291a37339eae8ed4e4dcffb04103da94b795c9 100644 (file)
@@ -51,6 +51,7 @@ import org.apache.fop.area.RenderPagesModel;
 import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.layoutengine.EvalCheck;
 import org.apache.fop.layoutengine.TrueCheck;
+import org.apache.fop.render.intermediate.IFContext;
 import org.apache.fop.render.intermediate.IFRenderer;
 import org.apache.fop.render.intermediate.IFSerializer;
 import org.apache.fop.util.DelegatingContentHandler;
@@ -113,7 +114,7 @@ public class IFTester {
             ifRenderer.setUserAgent(ua);
 
             IFSerializer serializer = new IFSerializer();
-            serializer.setUserAgent(ua);
+            serializer.setContext(new IFContext(ua));
             DOMResult result = new DOMResult();
             serializer.setResult(result);
             ifRenderer.setDocumentHandler(serializer);
index 51c4dc301cc29fda7175bd5bc64b18e5f668fb44..7f0462a75e001d3b7c0a6614d246a81b50f04d93 100644 (file)
@@ -35,6 +35,7 @@ import org.apache.xmlgraphics.ps.dsc.events.DSCCommentTitle;
 import org.apache.xmlgraphics.ps.dsc.events.DSCEvent;
 
 import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.render.intermediate.IFContext;
 
 /**
  * Tests the image handling in PostScript output.
@@ -90,7 +91,7 @@ public class ImageHandlingTestCase extends AbstractPostScriptTestCase {
     private void innerTestJPEGImageWithIF(int level) throws Exception {
         FOUserAgent ua = fopFactory.newFOUserAgent();
         PSDocumentHandler handler = new PSDocumentHandler();
-        handler.setUserAgent(ua);
+        handler.setContext(new IFContext(ua));
         PSRenderingUtil psUtil = handler.getPSUtil();
         psUtil.setLanguageLevel(level);
         psUtil.setOptimizeResources(true);
index ace96e85dbbdfe00169e5775acc4a1e261794cf7..e5b9a4d27c075d013ad9ece7a14377f3d40d6991 100644 (file)
@@ -45,6 +45,7 @@ import org.apache.xmlgraphics.ps.dsc.events.DSCCommentPage;
 import org.apache.xmlgraphics.ps.dsc.events.DSCCommentPages;
 
 import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.render.intermediate.IFContext;
 
 /**
  * Tests the PostScript resource optimization (selective de-duplication of
@@ -77,7 +78,7 @@ public class ResourceOptimizationTestCase extends AbstractPostScriptTestCase {
     public void testResourceOptimizationWithIF() throws Exception {
         FOUserAgent ua = fopFactory.newFOUserAgent();
         PSDocumentHandler handler = new PSDocumentHandler();
-        handler.setUserAgent(ua);
+        handler.setContext(new IFContext(ua));
         // This is the important part: we're enabling resource optimization
         handler.getPSUtil().setOptimizeResources(true);
         ua.setDocumentHandlerOverride(handler);
diff --git a/test/layoutengine/standard-testcases/pcl-extension_1.xml b/test/layoutengine/standard-testcases/pcl-extension_1.xml
new file mode 100644 (file)
index 0000000..f75f1f6
--- /dev/null
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<!-- $Id$ -->
+<testcase>
+  <info>
+    <p>
+      This test checks the PostScript extension for custom setup code. The extension attachments need to show
+      up in the area tree XML so the AreaTreeParser can fully restore the area tree.
+    </p>
+  </info>
+  <fo>
+    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"
+        xmlns:pcl="http://xmlgraphics.apache.org/fop/extensions/pcl">
+      <fo:layout-master-set>
+        <fo:simple-page-master master-name="first"
+              page-width="148mm" page-height="210mm" margin="20mm"
+              pcl:paper-source="2" pcl:duplex-mode="1">
+          <fo:region-body/>
+        </fo:simple-page-master>
+        <fo:simple-page-master master-name="second"
+          page-width="148mm" page-height="210mm" margin="20mm"
+          pcl:paper-source="1">
+          <fo:region-body/>
+        </fo:simple-page-master>
+        <fo:page-sequence-master master-name="complex">
+          <fo:repeatable-page-master-reference master-reference="first" maximum-repeats="1"/>
+          <fo:repeatable-page-master-reference master-reference="second"/>
+        </fo:page-sequence-master>
+      </fo:layout-master-set>
+      <fo:page-sequence master-reference="complex">
+        <fo:flow flow-name="xsl-region-body">
+          <fo:block>Text on page <fo:page-number/>.</fo:block>
+          <fo:block break-before="page">Text on page <fo:page-number/>.</fo:block>
+        </fo:flow>
+      </fo:page-sequence>
+    </fo:root>
+  </fo>
+  <checks xmlns:pcl="http://xmlgraphics.apache.org/fop/extensions/pcl">
+    <eval expected="2" xpath="//pageViewport[@nr=1]/@pcl:paper-source"/>
+    <eval expected="1" xpath="//pageViewport[@nr=1]/@pcl:duplex-mode"/>
+
+    <eval expected="1" xpath="//pageViewport[@nr=2]/@pcl:paper-source"/>
+    <true xpath="not(boolean(//pageViewport[@nr=2]/@pcl:duplex-mode))"/>
+  </checks>
+  <if-checks  xmlns:if="http://xmlgraphics.apache.org/fop/intermediate" xmlns:pcl="http://xmlgraphics.apache.org/fop/extensions/pcl">
+    <eval expected="2" xpath="//if:page[@index=0]/@pcl:paper-source"/>
+    <eval expected="1" xpath="//if:page[@index=0]/@pcl:duplex-mode"/>
+    
+    <eval expected="1" xpath="//if:page[@index=1]/@pcl:paper-source"/>
+    <true xpath="not(boolean(//if:page[@index=1]/@pcl:duplex-mode))"/>
+  </if-checks>
+</testcase>