You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by je...@apache.org on 2008/08/07 18:01:32 UTC

svn commit: r683637 - in /xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src: java/org/apache/fop/render/intermediate/ java/org/apache/fop/render/pdf/ sandbox/org/apache/fop/render/svg/

Author: jeremias
Date: Thu Aug  7 09:01:31 2008
New Revision: 683637

URL: http://svn.apache.org/viewvc?rev=683637&view=rev
Log:
Implemented foreign-object support for the new intermediate format.
Note: foreign namespace are only properly processed if there is an ImagePreloader and, where necessary, one or more supporting ImageConverters and/or ImageHandlers.

Modified:
    xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/AbstractIFPainter.java
    xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/IFPainter.java
    xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/IFRenderer.java
    xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/IFSerializer.java
    xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pdf/PDFPainter.java
    xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/sandbox/org/apache/fop/render/svg/AbstractSVGPainter.java

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/AbstractIFPainter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/AbstractIFPainter.java?rev=683637&r1=683636&r2=683637&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/AbstractIFPainter.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/AbstractIFPainter.java Thu Aug  7 09:01:31 2008
@@ -22,15 +22,40 @@
 import java.awt.Dimension;
 import java.awt.Rectangle;
 import java.awt.geom.AffineTransform;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Map;
+
+import javax.xml.transform.dom.DOMSource;
+
+import org.w3c.dom.Document;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.xmlgraphics.image.loader.ImageException;
+import org.apache.xmlgraphics.image.loader.ImageInfo;
+import org.apache.xmlgraphics.image.loader.ImageManager;
+import org.apache.xmlgraphics.image.loader.ImageSessionContext;
+import org.apache.xmlgraphics.image.loader.util.ImageUtil;
 
 import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.events.ResourceEventProducer;
+import org.apache.fop.render.ImageHandler;
 import org.apache.fop.render.ImageHandlerRegistry;
+import org.apache.fop.render.RenderingContext;
 
 /**
  * Abstract base class for IFPainter implementations.
  */
 public abstract class AbstractIFPainter implements IFPainter {
 
+    /** logging instance */
+    private static Log log = LogFactory.getLog(AbstractIFPainter.class);
+
+    /** non-URI that can be used in feedback messages that an image is an instream-object */
+    protected static final String INSTREAM_OBJECT_URI = "(instream-object)";
+
     private FOUserAgent userAgent;
 
     /** Image handler registry */
@@ -77,4 +102,110 @@
         startGroup(combine(transforms));
     }
 
+    /**
+     * Creates a new RenderingContext instance.
+     * @return the new rendering context.
+     */
+    protected abstract RenderingContext createRenderingContext();
+
+    /**
+     * Loads a preloaded image and draws it using a suitable image handler.
+     * @param info the information object of the preloaded image
+     * @param rect the rectangle in which to paint the image
+     * @throws ImageException if there's an error while processing the image
+     * @throws IOException if there's an I/O error while loading the image
+     */
+    protected void drawImageUsingImageHandler(ImageInfo info, Rectangle rect)
+                    throws ImageException, IOException {
+        ImageManager manager = getUserAgent().getFactory().getImageManager();
+        ImageSessionContext sessionContext = getUserAgent().getImageSessionContext();
+
+        //Load and convert the image to a supported format
+        RenderingContext context = createRenderingContext();
+        Map hints = ImageUtil.getDefaultHints(sessionContext);
+        org.apache.xmlgraphics.image.loader.Image img = manager.getImage(
+                    info, imageHandlerRegistry.getSupportedFlavors(context),
+                    hints, sessionContext);
+
+        //First check for a dynamically registered handler
+        ImageHandler handler = imageHandlerRegistry.getHandler(context, img);
+        if (handler == null) {
+            throw new UnsupportedOperationException(
+                    "No ImageHandler available for image: "
+                        + info + " (" + img.getClass().getName() + ")");
+        }
+
+        if (log.isDebugEnabled()) {
+            log.debug("Using ImageHandler: " + handler.getClass().getName());
+        }
+        try {
+            //TODO foreign attributes
+            handler.handleImage(context, img, rect);
+        } catch (IOException ioe) {
+            ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
+                    getUserAgent().getEventBroadcaster());
+            eventProducer.imageWritingError(this, ioe);
+            return;
+        }
+    }
+
+    /**
+     * Default drawing method for handling an image referenced by a URI.
+     * @param uri the image's URI
+     * @param rect the rectangle in which to paint the image
+     */
+    protected void drawImageUsingURI(String uri, Rectangle rect) {
+        ImageManager manager = getUserAgent().getFactory().getImageManager();
+        ImageInfo info = null;
+        try {
+            ImageSessionContext sessionContext = getUserAgent().getImageSessionContext();
+            info = manager.getImageInfo(uri, sessionContext);
+
+            drawImageUsingImageHandler(info, rect);
+        } catch (ImageException ie) {
+            ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
+                    getUserAgent().getEventBroadcaster());
+            eventProducer.imageError(this, (info != null ? info.toString() : uri), ie, null);
+        } catch (FileNotFoundException fe) {
+            ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
+                    getUserAgent().getEventBroadcaster());
+            eventProducer.imageNotFound(this, (info != null ? info.toString() : uri), fe, null);
+        } catch (IOException ioe) {
+            ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
+                    getUserAgent().getEventBroadcaster());
+            eventProducer.imageIOError(this, (info != null ? info.toString() : uri), ioe, null);
+        }
+    }
+
+    /**
+     * Default drawing method for handling a foreign object in the form of a DOM document.
+     * @param doc the DOM document containing the foreign object
+     * @param rect the rectangle in which to paint the image
+     */
+    protected void drawImageUsingDocument(Document doc, Rectangle rect) {
+        ImageManager manager = getUserAgent().getFactory().getImageManager();
+        ImageInfo info = null;
+        try {
+            info = manager.preloadImage(null, new DOMSource(doc));
+
+            drawImageUsingImageHandler(info, rect);
+        } catch (ImageException ie) {
+            ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
+                    getUserAgent().getEventBroadcaster());
+            eventProducer.imageError(this,
+                    (info != null ? info.toString() : INSTREAM_OBJECT_URI), ie, null);
+        } catch (FileNotFoundException fe) {
+            ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
+                    getUserAgent().getEventBroadcaster());
+            eventProducer.imageNotFound(this,
+                    (info != null ? info.toString() : INSTREAM_OBJECT_URI), fe, null);
+        } catch (IOException ioe) {
+            ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
+                    getUserAgent().getEventBroadcaster());
+            eventProducer.imageIOError(this,
+                    (info != null ? info.toString() : INSTREAM_OBJECT_URI), ioe, null);
+        }
+    }
+
+
 }

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/IFPainter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/IFPainter.java?rev=683637&r1=683636&r2=683637&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/IFPainter.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/IFPainter.java Thu Aug  7 09:01:31 2008
@@ -28,6 +28,8 @@
 
 import javax.xml.transform.Result;
 
+import org.w3c.dom.Document;
+
 import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.fonts.FontInfo;
 
@@ -258,9 +260,33 @@
      * @throws IFException if an error occurs while handling this event
      */
     void drawRect(Rectangle rect, Paint fill, Color stroke) throws IFException;
-    void drawImage(String uri, Rectangle rect, Map foreignAttributes) throws IFException; //external images
-    void startImage(Rectangle rect) throws IFException; //followed by a SAX stream (SVG etc.)
-    void endImage() throws IFException;
+
+    /**
+     * Draws an image identified by a URI inside a given rectangle. This is the equivalent to
+     * 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;
+
+    /**
+     * 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;
+    //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
+    //potentially profit if there's an image handler that can efficiently deal with the foreign
+    //object without building a DOM.
+
     //etc. etc.
 
     /**

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/IFRenderer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/IFRenderer.java?rev=683637&r1=683636&r2=683637&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/IFRenderer.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/IFRenderer.java Thu Aug  7 09:01:31 2008
@@ -32,6 +32,8 @@
 
 import javax.xml.transform.stream.StreamResult;
 
+import org.w3c.dom.Document;
+
 import org.xml.sax.SAXException;
 
 import org.apache.batik.parser.AWTTransformProducer;
@@ -57,6 +59,7 @@
 import org.apache.fop.area.RegionViewport;
 import org.apache.fop.area.Trait;
 import org.apache.fop.area.inline.AbstractTextArea;
+import org.apache.fop.area.inline.ForeignObject;
 import org.apache.fop.area.inline.Image;
 import org.apache.fop.area.inline.SpaceArea;
 import org.apache.fop.area.inline.TextArea;
@@ -73,6 +76,10 @@
 import org.apache.fop.render.AbstractPathOrientedRenderer;
 import org.apache.fop.render.Renderer;
 
+/**
+ * This renderer implementation is an adapter to the {@code IFPainter} interface. It is used
+ * to generate content using FOP's intermediate format.
+ */
 public class IFRenderer extends AbstractPathOrientedRenderer {
 
     /** logging instance */
@@ -714,21 +721,41 @@
         }
     }
 
+    /** {@inheritDoc} */
+    public void renderForeignObject(ForeignObject fo, Rectangle2D pos) {
+        endTextObject();
+        Rectangle posInt = new Rectangle(
+                currentIPPosition + (int)pos.getX(),
+                currentBPPosition + (int)pos.getY(),
+                (int)pos.getWidth(),
+                (int)pos.getHeight());
+        Document doc = fo.getDocument();
+        try {
+            painter.drawImage(doc, posInt, fo.getForeignAttributes());
+        } catch (IFException ife) {
+            handleIFException(ife);
+        }
+    }
+
+    /** {@inheritDoc} */
     protected void clip() {
         // TODO Auto-generated method stub
         log.warn("clip() NYI");
     }
 
+    /** {@inheritDoc} */
     protected void clipRect(float x, float y, float width, float height) {
         // TODO Auto-generated method stub
         log.warn("clipRect() NYI");
     }
 
+    /** {@inheritDoc} */
     protected void closePath() {
         // TODO Auto-generated method stub
         log.warn("closePath() NYI");
     }
 
+    /** {@inheritDoc} */
     protected void drawBorderLine(float x1, float y1, float x2, float y2, boolean horz,
             boolean startOrBefore, int style, Color col) {
         // TODO Auto-generated method stub

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/IFSerializer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/IFSerializer.java?rev=683637&r1=683636&r2=683637&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/IFSerializer.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/IFSerializer.java Thu Aug  7 09:01:31 2008
@@ -27,13 +27,17 @@
 import java.util.Iterator;
 import java.util.Map;
 
+import org.w3c.dom.Document;
+
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.AttributesImpl;
 
 import org.apache.xmlgraphics.util.QName;
 import org.apache.xmlgraphics.util.XMLizable;
 
+import org.apache.fop.render.RenderingContext;
 import org.apache.fop.util.ColorUtil;
+import org.apache.fop.util.DOM2SAX;
 
 /**
  * IFPainter implementation that serializes the intermediate format to XML.
@@ -214,7 +218,8 @@
         startViewport(toString(transforms), size, clipRect);
     }
 
-    private void startViewport(String transform, Dimension size, Rectangle clipRect) throws IFException {
+    private void startViewport(String transform, Dimension size, Rectangle clipRect)
+                throws IFException {
         try {
             AttributesImpl atts = new AttributesImpl();
             if (transform != null && transform.length() > 0) {
@@ -272,12 +277,6 @@
     }
 
     /** {@inheritDoc} */
-    public void startImage(Rectangle rect) throws IFException {
-        // TODO Auto-generated method stub
-
-    }
-
-    /** {@inheritDoc} */
     public void drawImage(String uri, Rectangle rect, Map foreignAttributes) throws IFException {
         try {
             AttributesImpl atts = new AttributesImpl();
@@ -300,9 +299,26 @@
     }
 
     /** {@inheritDoc} */
-    public void endImage() throws IFException {
-        // TODO Auto-generated method stub
-
+    public void drawImage(Document doc, Rectangle rect, Map foreignAttributes) throws IFException {
+        try {
+            AttributesImpl atts = new AttributesImpl();
+            atts.addAttribute("", "x", "x", CDATA, Integer.toString(rect.x));
+            atts.addAttribute("", "y", "y", CDATA, Integer.toString(rect.y));
+            atts.addAttribute("", "width", "width", CDATA, Integer.toString(rect.width));
+            atts.addAttribute("", "height", "height", CDATA, 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());
+                }
+            }
+            startElement(EL_IMAGE, atts);
+            new DOM2SAX(handler).writeDocument(doc, true);
+            endElement(EL_IMAGE);
+        } catch (SAXException e) {
+            throw new IFException("SAX error in startGroup()", e);
+        }
     }
 
     /** {@inheritDoc} */
@@ -406,4 +422,9 @@
         }
     }
 
+    /** {@inheritDoc} */
+    protected RenderingContext createRenderingContext() {
+        throw new IllegalStateException("Should never be called!");
+    }
+
 }

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pdf/PDFPainter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pdf/PDFPainter.java?rev=683637&r1=683636&r2=683637&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pdf/PDFPainter.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pdf/PDFPainter.java Thu Aug  7 09:01:31 2008
@@ -24,23 +24,18 @@
 import java.awt.Paint;
 import java.awt.Rectangle;
 import java.awt.geom.AffineTransform;
-import java.io.FileNotFoundException;
 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.xmlgraphics.image.loader.ImageException;
-import org.apache.xmlgraphics.image.loader.ImageInfo;
-import org.apache.xmlgraphics.image.loader.ImageManager;
-import org.apache.xmlgraphics.image.loader.ImageSessionContext;
-import org.apache.xmlgraphics.image.loader.util.ImageUtil;
 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.xmp.XMPMetadata;
 import org.apache.fop.fonts.Font;
 import org.apache.fop.fonts.FontTriplet;
@@ -55,7 +50,7 @@
 import org.apache.fop.pdf.PDFResources;
 import org.apache.fop.pdf.PDFTextUtil;
 import org.apache.fop.pdf.PDFXObject;
-import org.apache.fop.render.ImageHandler;
+import org.apache.fop.render.RenderingContext;
 import org.apache.fop.render.intermediate.AbstractBinaryWritingIFPainter;
 import org.apache.fop.render.intermediate.IFException;
 import org.apache.fop.render.intermediate.IFState;
@@ -295,60 +290,16 @@
             return;
         }
 
-        ImageManager manager = getUserAgent().getFactory().getImageManager();
-        ImageInfo info = null;
-        try {
-            ImageSessionContext sessionContext = getUserAgent().getImageSessionContext();
-            info = manager.getImageInfo(uri, sessionContext);
-
-            PDFRenderingContext pdfContext = new PDFRenderingContext(
-                    getUserAgent(), generator, currentPage, getFontInfo());
+        drawImageUsingURI(uri, rect);
 
-            Map hints = ImageUtil.getDefaultHints(sessionContext);
-            org.apache.xmlgraphics.image.loader.Image img = manager.getImage(
-                        info, imageHandlerRegistry.getSupportedFlavors(pdfContext),
-                        hints, sessionContext);
-
-            //First check for a dynamically registered handler
-            ImageHandler handler = imageHandlerRegistry.getHandler(pdfContext, img);
-            if (handler == null) {
-                throw new UnsupportedOperationException(
-                        "No ImageHandler available for image: "
-                            + info + " (" + img.getClass().getName() + ")");
-            }
-
-            if (log.isDebugEnabled()) {
-                log.debug("Using ImageHandler: " + handler.getClass().getName());
-            }
-            try {
-                //TODO foreign attributes
-                handler.handleImage(pdfContext, img, rect);
-            } catch (IOException ioe) {
-                ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
-                        getUserAgent().getEventBroadcaster());
-                eventProducer.imageWritingError(this, ioe);
-                return;
-            }
-        } catch (ImageException ie) {
-            ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
-                    getUserAgent().getEventBroadcaster());
-            eventProducer.imageError(this, (info != null ? info.toString() : uri), ie, null);
-        } catch (FileNotFoundException fe) {
-            ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
-                    getUserAgent().getEventBroadcaster());
-            eventProducer.imageNotFound(this, (info != null ? info.toString() : uri), fe, null);
-        } catch (IOException ioe) {
-            ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
-                    getUserAgent().getEventBroadcaster());
-            eventProducer.imageIOError(this, (info != null ? info.toString() : uri), ioe, null);
-        }
+        flushPDFDoc();
+    }
 
-        // output new data
-        try {
-            generator.flushPDFDoc();
-        } catch (IOException ioe) {
-            throw new IFException("I/O error flushing the PDF document", ioe);
-        }
+    /** {@inheritDoc} */
+    protected RenderingContext createRenderingContext() {
+        PDFRenderingContext pdfContext = new PDFRenderingContext(
+                getUserAgent(), generator, currentPage, getFontInfo());
+        return pdfContext;
     }
 
     /**
@@ -369,17 +320,20 @@
         generator.restoreGraphicsState();
     }
 
-
     /** {@inheritDoc} */
-    public void startImage(Rectangle rect) throws IFException {
-        // TODO Auto-generated method stub
+    public void drawImage(Document doc, Rectangle rect, Map foreignAttributes) throws IFException {
+        drawImageUsingDocument(doc, rect);
 
+        flushPDFDoc();
     }
 
-    /** {@inheritDoc} */
-    public void endImage() throws IFException {
-        // TODO Auto-generated method stub
-
+    private void flushPDFDoc() throws IFException {
+        // output new data
+        try {
+            generator.flushPDFDoc();
+        } catch (IOException ioe) {
+            throw new IFException("I/O error flushing the PDF document", ioe);
+        }
     }
 
     /** {@inheritDoc} */

Modified: xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/sandbox/org/apache/fop/render/svg/AbstractSVGPainter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/sandbox/org/apache/fop/render/svg/AbstractSVGPainter.java?rev=683637&r1=683636&r2=683637&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/sandbox/org/apache/fop/render/svg/AbstractSVGPainter.java (original)
+++ xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/sandbox/org/apache/fop/render/svg/AbstractSVGPainter.java Thu Aug  7 09:01:31 2008
@@ -28,6 +28,8 @@
 import java.io.IOException;
 import java.util.Map;
 
+import org.w3c.dom.Document;
+
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.AttributesImpl;
 
@@ -38,14 +40,13 @@
 import org.apache.xmlgraphics.image.loader.ImageInfo;
 import org.apache.xmlgraphics.image.loader.ImageManager;
 import org.apache.xmlgraphics.image.loader.ImageSessionContext;
-import org.apache.xmlgraphics.image.loader.util.ImageUtil;
 import org.apache.xmlgraphics.util.MimeConstants;
 import org.apache.xmlgraphics.util.QName;
 import org.apache.xmlgraphics.xmp.Metadata;
 
 import org.apache.fop.events.ResourceEventProducer;
 import org.apache.fop.fo.extensions.ExtensionElementMapping;
-import org.apache.fop.render.ImageHandler;
+import org.apache.fop.render.RenderingContext;
 import org.apache.fop.render.intermediate.AbstractXMLWritingIFPainter;
 import org.apache.fop.render.intermediate.IFConstants;
 import org.apache.fop.render.intermediate.IFException;
@@ -197,14 +198,8 @@
         }
     }
 
-    /** {@inheritDoc} */
-    public void startImage(Rectangle rect) throws IFException {
-        //establish(MODE_NORMAL);
-        // TODO Auto-generated method stub
-
-    }
-
-    private QName CONVERSION_MODE = new QName(ExtensionElementMapping.URI, null, "conversion-mode");
+    private static final QName CONVERSION_MODE
+            = new QName(ExtensionElementMapping.URI, null, "conversion-mode");
 
     /** {@inheritDoc} */
     public void drawImage(String uri, Rectangle rect, Map foreignAttributes) throws IFException {
@@ -216,6 +211,7 @@
             try {
                 ImageSessionContext sessionContext = getUserAgent().getImageSessionContext();
                 info = manager.getImageInfo(uri, sessionContext);
+
                 String mime = info.getMimeType();
                 String conversionMode = (String)foreignAttributes.get(CONVERSION_MODE);
                 if ("reference".equals(conversionMode)
@@ -233,35 +229,7 @@
                     atts.addAttribute("", "height", "height", CDATA, Integer.toString(rect.height));
                     element("image", atts);
                 } else {
-                    //Convert the image
-                    SVGRenderingContext svgContext = new SVGRenderingContext(
-                            getUserAgent(), handler);
-
-                    Map hints = ImageUtil.getDefaultHints(sessionContext);
-                    org.apache.xmlgraphics.image.loader.Image img = manager.getImage(
-                                info, imageHandlerRegistry.getSupportedFlavors(svgContext),
-                                hints, sessionContext);
-
-                    //First check for a dynamically registered handler
-                    ImageHandler handler = imageHandlerRegistry.getHandler(svgContext, img);
-                    if (handler == null) {
-                        throw new UnsupportedOperationException(
-                                "No ImageHandler available for image: "
-                                    + info + " (" + img.getClass().getName() + ")");
-                    }
-
-                    if (log.isDebugEnabled()) {
-                        log.debug("Using ImageHandler: " + handler.getClass().getName());
-                    }
-                    try {
-                        //TODO foreign attributes
-                        handler.handleImage(svgContext, img, rect);
-                    } catch (IOException ioe) {
-                        ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
-                                getUserAgent().getEventBroadcaster());
-                        eventProducer.imageWritingError(this, ioe);
-                        return;
-                    }
+                    drawImageUsingImageHandler(info, rect);
                 }
             } catch (ImageException ie) {
                 ResourceEventProducer eventProducer = ResourceEventProducer.Provider.get(
@@ -282,9 +250,21 @@
     }
 
     /** {@inheritDoc} */
-    public void endImage() throws IFException {
-        // TODO Auto-generated method stub
+    public void drawImage(Document doc, Rectangle rect, Map foreignAttributes) throws IFException {
+        try {
+            establish(MODE_NORMAL);
+
+            drawImageUsingDocument(doc, rect);
+        } catch (SAXException e) {
+            throw new IFException("SAX error in drawImage()", e);
+        }
+    }
 
+    /** {@inheritDoc} */
+    protected RenderingContext createRenderingContext() {
+        SVGRenderingContext svgContext = new SVGRenderingContext(
+                getUserAgent(), handler);
+        return svgContext;
     }
 
     /** {@inheritDoc} */



---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org