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 2007/12/13 13:17:58 UTC

svn commit: r603902 - in /xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java: META-INF/services/ org/apache/fop/render/pdf/

Author: jeremias
Date: Thu Dec 13 04:17:56 2007
New Revision: 603902

URL: http://svn.apache.org/viewvc?rev=603902&view=rev
Log:
Factored out all image handling code in the PDFRenderer into PDFImageHandler classes. The interface was introduced to handle PDF-in-PDF images.
The PDFImageHandler interface changes in a backwards-incompatible way but since the PDF-in-PDF plug-in probably has the only implementation, that's not very problematic. I'll release a new version as soon as the image stuff is merged back into Trunk.

Added:
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/META-INF/services/org.apache.fop.render.pdf.PDFImageHandler
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerGraphics2D.java   (with props)
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawJPEG.java   (with props)
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRenderedImage.java   (with props)
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerXML.java   (with props)
Modified:
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandler.java   (contents, props changed)
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRegistry.java   (contents, props changed)
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFRenderer.java
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFRendererConfigurator.java   (contents, props changed)

Added: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/META-INF/services/org.apache.fop.render.pdf.PDFImageHandler
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/META-INF/services/org.apache.fop.render.pdf.PDFImageHandler?rev=603902&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/META-INF/services/org.apache.fop.render.pdf.PDFImageHandler (added)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/META-INF/services/org.apache.fop.render.pdf.PDFImageHandler Thu Dec 13 04:17:56 2007
@@ -0,0 +1,4 @@
+org.apache.fop.render.pdf.PDFImageHandlerRawJPEG
+org.apache.fop.render.pdf.PDFImageHandlerGraphics2D
+org.apache.fop.render.pdf.PDFImageHandlerRenderedImage
+org.apache.fop.render.pdf.PDFImageHandlerXML
\ No newline at end of file

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandler.java?rev=603902&r1=603901&r2=603902&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandler.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandler.java Thu Dec 13 04:17:56 2007
@@ -19,11 +19,14 @@
 
 package org.apache.fop.render.pdf;
 
+import java.awt.Point;
+import java.awt.Rectangle;
 import java.io.IOException;
 
-import org.apache.fop.image.FopImage;
-import org.apache.fop.pdf.PDFDocument;
+import org.apache.fop.image2.Image;
+import org.apache.fop.image2.ImageFlavor;
 import org.apache.fop.pdf.PDFXObject;
+import org.apache.fop.render.RendererContext;
 
 /**
  * This interface is used for handling all sorts of image type for PDF output.
@@ -31,20 +34,38 @@
 public interface PDFImageHandler {
 
     /**
-     * Returns the MIME type supported by this instance.
-     * @return the MIME type
+     * Returns the priority for this image handler. A lower value means higher priority. This
+     * information is used to build the ordered/prioritized list of supported ImageFlavors for
+     * the PDF renderer. The built-in handlers use priorities between 100 and 999.
+     * @return a positive integer (>0) indicating the priority
      */
-    String getSupportedMimeType();
+    int getPriority();
     
     /**
-     * Generates the PDF objects for the given FopImage instance and returns
-     * the resulting XObject.
+     * Returns the {@link ImageFlavor}s supported by this instance
+     * @return the supported image flavors
+     */
+    ImageFlavor[] getSupportedImageFlavors();
+    
+    /**
+     * Returns the {@link Image} subclass supported by this instance.
+     * @return the Image type
+     */
+    Class getSupportedImageClass();
+    
+    /**
+     * Generates the PDF objects for the given {@link Image} instance. If the handler generates
+     * an XObject, it shall return it or otherwise return null. A generated XObject shall be
+     * placed in the current viewport according to the two parameters "origin" and "pos".
+     * @param context the PDF renderer context
      * @param image the image to be handled
-     * @param uri the URI of the image
-     * @param pdfDoc the target PDF document
-     * @return the generated XObject
+     * @param origin the current position in the current viewport (in millipoints)
+     * @param pos the position and scaling of the image relative to the origin point
+     *                  (in millipoints)
+     * @return the generated XObject or null if no XObject was generated
      * @throws IOException if an I/O error occurs
      */
-    PDFXObject generateImage(FopImage image, String uri, PDFDocument pdfDoc) throws IOException;
+    PDFXObject generateImage(RendererContext context, Image image, 
+            Point origin, Rectangle pos) throws IOException;
     
 }

Propchange: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandler.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerGraphics2D.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerGraphics2D.java?rev=603902&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerGraphics2D.java (added)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerGraphics2D.java Thu Dec 13 04:17:56 2007
@@ -0,0 +1,67 @@
+/*
+ * 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.pdf;
+
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.io.IOException;
+
+import org.apache.fop.image2.Image;
+import org.apache.fop.image2.ImageFlavor;
+import org.apache.fop.image2.impl.ImageGraphics2D;
+import org.apache.fop.pdf.PDFXObject;
+import org.apache.fop.render.RendererContext;
+
+/**
+ * PDFImageHandler implementation which handles Graphics2D images.
+ */
+public class PDFImageHandlerGraphics2D implements PDFImageHandler {
+
+    private static final ImageFlavor[] FLAVORS = new ImageFlavor[] {
+        ImageFlavor.GRAPHICS2D,
+    };
+    
+    /** {@inheritDoc} */
+    public PDFXObject generateImage(RendererContext context, Image image, 
+            Point origin, Rectangle pos)
+            throws IOException {
+        PDFRenderer renderer = (PDFRenderer)context.getRenderer();
+        ImageGraphics2D imageG2D = (ImageGraphics2D)image;
+        renderer.getGraphics2DAdapter().paintImage(imageG2D.getGraphics2DImagePainter(),
+                context, origin.x + pos.x, origin.y + pos.y, pos.width, pos.height);
+        return null;
+    }
+
+    /** {@inheritDoc} */
+    public int getPriority() {
+        return 200;
+    }
+
+    /** {@inheritDoc} */
+    public Class getSupportedImageClass() {
+        return ImageGraphics2D.class;
+    }
+
+    /** {@inheritDoc} */
+    public ImageFlavor[] getSupportedImageFlavors() {
+        return FLAVORS;
+    }
+
+}

Propchange: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerGraphics2D.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerGraphics2D.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawJPEG.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawJPEG.java?rev=603902&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawJPEG.java (added)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawJPEG.java Thu Dec 13 04:17:56 2007
@@ -0,0 +1,82 @@
+/*
+ * 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.pdf;
+
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.io.IOException;
+
+import org.apache.fop.image2.Image;
+import org.apache.fop.image2.ImageFlavor;
+import org.apache.fop.image2.impl.ImageRawJPEG;
+import org.apache.fop.pdf.PDFDocument;
+import org.apache.fop.pdf.PDFImage;
+import org.apache.fop.pdf.PDFResourceContext;
+import org.apache.fop.pdf.PDFXObject;
+import org.apache.fop.render.RendererContext;
+
+/**
+ * PDFImageHandler implementation which handles Graphics2D images.
+ */
+public class PDFImageHandlerRawJPEG implements PDFImageHandler {
+
+    private static final ImageFlavor[] FLAVORS = new ImageFlavor[] {
+        ImageFlavor.RAW_JPEG,
+    };
+    
+    /** {@inheritDoc} */
+    public PDFXObject generateImage(RendererContext context, Image image, 
+            Point origin, Rectangle pos)
+            throws IOException {
+        PDFRenderer renderer = (PDFRenderer)context.getRenderer();
+        ImageRawJPEG jpeg = (ImageRawJPEG)image;
+        PDFDocument pdfDoc = (PDFDocument)context.getProperty(
+                PDFRendererContextConstants.PDF_DOCUMENT);
+        PDFResourceContext resContext = (PDFResourceContext)context.getProperty(
+                PDFRendererContextConstants.PDF_CONTEXT);
+        
+        PDFImage pdfimage = new ImageRawJPEGAdapter(jpeg, image.getInfo().getOriginalURI());
+        PDFXObject xobj = pdfDoc.addImage(resContext, pdfimage);
+
+        float x = (float)pos.getX() / 1000f;
+        float y = (float)pos.getY() / 1000f;
+        float w = (float)pos.getWidth() / 1000f;
+        float h = (float)pos.getHeight() / 1000f;
+        renderer.placeImage(x, y, w, h, xobj);
+        
+        return xobj;
+    }
+
+    /** {@inheritDoc} */
+    public int getPriority() {
+        return 100;
+    }
+
+    /** {@inheritDoc} */
+    public Class getSupportedImageClass() {
+        return ImageRawJPEG.class;
+    }
+
+    /** {@inheritDoc} */
+    public ImageFlavor[] getSupportedImageFlavors() {
+        return FLAVORS;
+    }
+
+}

Propchange: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawJPEG.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawJPEG.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRegistry.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRegistry.java?rev=603902&r1=603901&r2=603902&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRegistry.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRegistry.java Thu Dec 13 04:17:56 2007
@@ -19,13 +19,19 @@
 
 package org.apache.fop.render.pdf;
 
+import java.util.Comparator;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
+import java.util.SortedSet;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.xmlgraphics.util.Service;
 
+import org.apache.fop.image2.Image;
+import org.apache.fop.image2.ImageFlavor;
+
 /**
  * This class holds references to various image handlers used by the PDF renderer. It also
  * supports automatic discovery of additional handlers available through
@@ -36,9 +42,22 @@
     /** the logger */
     private static Log log = LogFactory.getLog(PDFImageHandlerRegistry.class);
     
+    private static final Comparator HANDLER_COMPARATOR = new Comparator() {
+        public int compare(Object o1, Object o2) {
+            PDFImageHandler h1 = (PDFImageHandler)o1;
+            PDFImageHandler h2 = (PDFImageHandler)o2;
+            return h1.getPriority() - h2.getPriority();
+        }
+    };
+
     /** Map containing PDF image handlers for various MIME types */
     private Map handlers = new java.util.HashMap();
     
+    /** Sorted Set of registered handlers */
+    private ImageFlavor[] supportedFlavors = new ImageFlavor[0];
+    private int handlerRegistrations;
+    private int lastSync;
+    
     /**
      * Default constructor.
      */
@@ -75,24 +94,66 @@
      * Add an image handler. The handler itself is inspected to find out what it supports.
      * @param handler the PDFImageHandler instance
      */
-    public void addHandler(PDFImageHandler handler) {
-        String mime = handler.getSupportedMimeType();
-        handlers.put(mime, handler);
+    public synchronized void addHandler(PDFImageHandler handler) {
+        Class imageClass = handler.getSupportedImageClass();
+        this.handlers.put(imageClass, handler);
+        this.handlerRegistrations++;
     }
     
     /**
      * Returns an PDFImageHandler which handles an specific image type given the MIME type
      * of the image.
-     * @param mime the requested MIME type
+     * @param img the Image to be handled
      * @return the PDFImageHandler responsible for handling the image or null if none is available
      */
-    public PDFImageHandler getHandler(String mime) {
-        PDFImageHandler handler;
+    public PDFImageHandler getHandler(Image img) {
+        return getHandler(img.getClass());
+    }
 
-        handler = (PDFImageHandler)handlers.get(mime);
+    /**
+     * Returns an PDFImageHandler which handles an specific image type given the MIME type
+     * of the image.
+     * @param imageClass the Image subclass for which to get a handler
+     * @return the PDFImageHandler responsible for handling the image or null if none is available
+     */
+    protected synchronized PDFImageHandler getHandler(Class imageClass) {
+        PDFImageHandler handler = null;
+        Class cl = imageClass;
+        while (cl != null) {
+            handler = (PDFImageHandler)handlers.get(cl);
+            if (handler != null) {
+                break;
+            }
+            cl = cl.getSuperclass();
+        }
         return handler;
     }
 
+    /**
+     * Returns the ordered array of supported image flavors. 
+     * @return the array of image flavors
+     */
+    public synchronized ImageFlavor[] getSupportedFlavors() {
+        if (this.lastSync != this.handlerRegistrations) {
+            //Sort...
+            SortedSet sorted = new java.util.TreeSet(HANDLER_COMPARATOR);
+            sorted.addAll(this.handlers.values());
+            
+            //...and extract all ImageFlavors into a single array
+            List flavors = new java.util.ArrayList();
+            Iterator iter = sorted.iterator();
+            while (iter.hasNext()) {
+                ImageFlavor[] f = ((PDFImageHandler)iter.next()).getSupportedImageFlavors();
+                for (int i = 0; i < f.length; i++) {
+                    flavors.add(f[i]);
+                }
+            }
+            this.supportedFlavors = (ImageFlavor[])flavors.toArray(new ImageFlavor[flavors.size()]);
+            this.lastSync = this.handlerRegistrations;
+        }
+        return this.supportedFlavors;
+    }
+    
     /**
      * Discovers PDFImageHandler implementations through the classpath and dynamically
      * registers them.

Propchange: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRegistry.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRenderedImage.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRenderedImage.java?rev=603902&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRenderedImage.java (added)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRenderedImage.java Thu Dec 13 04:17:56 2007
@@ -0,0 +1,83 @@
+/*
+ * 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.pdf;
+
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.io.IOException;
+
+import org.apache.fop.image2.Image;
+import org.apache.fop.image2.ImageFlavor;
+import org.apache.fop.image2.impl.ImageRendered;
+import org.apache.fop.pdf.PDFDocument;
+import org.apache.fop.pdf.PDFImage;
+import org.apache.fop.pdf.PDFResourceContext;
+import org.apache.fop.pdf.PDFXObject;
+import org.apache.fop.render.RendererContext;
+
+/**
+ * PDFImageHandler implementation which handles RenderedImage instances.
+ */
+public class PDFImageHandlerRenderedImage implements PDFImageHandler {
+
+    private static final ImageFlavor[] FLAVORS = new ImageFlavor[] {
+        ImageFlavor.BUFFERED_IMAGE,
+        ImageFlavor.RENDERED_IMAGE        
+    };
+    
+    /** {@inheritDoc} */
+    public PDFXObject generateImage(RendererContext context, Image image, 
+            Point origin, Rectangle pos)
+            throws IOException {
+        PDFRenderer renderer = (PDFRenderer)context.getRenderer();
+        ImageRendered imageRend = (ImageRendered)image;
+        PDFDocument pdfDoc = (PDFDocument)context.getProperty(
+                PDFRendererContextConstants.PDF_DOCUMENT);
+        PDFResourceContext resContext = (PDFResourceContext)context.getProperty(
+                PDFRendererContextConstants.PDF_CONTEXT);
+        
+        PDFImage pdfimage = new ImageRenderedAdapter(imageRend, image.getInfo().getOriginalURI());
+        PDFXObject xobj = pdfDoc.addImage(resContext, pdfimage);
+
+        float x = (float)pos.getX() / 1000f;
+        float y = (float)pos.getY() / 1000f;
+        float w = (float)pos.getWidth() / 1000f;
+        float h = (float)pos.getHeight() / 1000f;
+        renderer.placeImage(x, y, w, h, xobj);
+        
+        return xobj;
+    }
+
+    /** {@inheritDoc} */
+    public int getPriority() {
+        return 300;
+    }
+
+    /** {@inheritDoc} */
+    public Class getSupportedImageClass() {
+        return ImageRendered.class;
+    }
+
+    /** {@inheritDoc} */
+    public ImageFlavor[] getSupportedImageFlavors() {
+        return FLAVORS;
+    }
+
+}

Propchange: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRenderedImage.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerRenderedImage.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerXML.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerXML.java?rev=603902&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerXML.java (added)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerXML.java Thu Dec 13 04:17:56 2007
@@ -0,0 +1,73 @@
+/*
+ * 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.pdf;
+
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.io.IOException;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+
+import org.apache.fop.image2.Image;
+import org.apache.fop.image2.ImageFlavor;
+import org.apache.fop.image2.impl.ImageXMLDOM;
+import org.apache.fop.pdf.PDFXObject;
+import org.apache.fop.render.RendererContext;
+
+/**
+ * PDFImageHandler implementation which handles XML-based images.
+ */
+public class PDFImageHandlerXML implements PDFImageHandler {
+
+    private static final ImageFlavor[] FLAVORS = new ImageFlavor[] {
+        ImageFlavor.XML_DOM,
+    };
+    
+    /** {@inheritDoc} */
+    public PDFXObject generateImage(RendererContext context, Image image, 
+            Point origin, Rectangle pos)
+            throws IOException {
+        PDFRenderer renderer = (PDFRenderer)context.getRenderer();
+        ImageXMLDOM imgXML = (ImageXMLDOM)image;
+        Document doc = imgXML.getDocument();
+        String ns = imgXML.getRootNamespace();
+        Map foreignAttributes = (Map)context.getProperty(
+                PDFRendererContextConstants.FOREIGN_ATTRIBUTES);
+        renderer.renderDocument(doc, ns, pos, foreignAttributes);
+        return null;
+    }
+
+    /** {@inheritDoc} */
+    public int getPriority() {
+        return 400;
+    }
+
+    /** {@inheritDoc} */
+    public Class getSupportedImageClass() {
+        return ImageXMLDOM.class;
+    }
+
+    /** {@inheritDoc} */
+    public ImageFlavor[] getSupportedImageFlavors() {
+        return FLAVORS;
+    }
+
+}

Propchange: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerXML.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFImageHandlerXML.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFRenderer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFRenderer.java?rev=603902&r1=603901&r2=603902&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFRenderer.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFRenderer.java Thu Dec 13 04:17:56 2007
@@ -21,6 +21,8 @@
 
 // Java
 import java.awt.Color;
+import java.awt.Point;
+import java.awt.Rectangle;
 import java.awt.color.ColorSpace;
 import java.awt.color.ICC_Profile;
 import java.awt.geom.AffineTransform;
@@ -37,8 +39,6 @@
 import javax.xml.transform.Source;
 import javax.xml.transform.stream.StreamSource;
 
-import org.w3c.dom.Document;
-
 import org.apache.commons.io.IOUtils;
 import org.apache.xmlgraphics.xmp.Metadata;
 import org.apache.xmlgraphics.xmp.schemas.XMPBasicAdapter;
@@ -73,15 +73,9 @@
 import org.apache.fop.fonts.Font;
 import org.apache.fop.fonts.Typeface;
 import org.apache.fop.image2.ImageException;
-import org.apache.fop.image2.ImageFlavor;
 import org.apache.fop.image2.ImageInfo;
 import org.apache.fop.image2.ImageManager;
 import org.apache.fop.image2.ImageSessionContext;
-import org.apache.fop.image2.impl.ImageGraphics2D;
-import org.apache.fop.image2.impl.ImageRawJPEG;
-import org.apache.fop.image2.impl.ImageRawStream;
-import org.apache.fop.image2.impl.ImageRendered;
-import org.apache.fop.image2.impl.ImageXMLDOM;
 import org.apache.fop.image2.util.ImageUtil;
 import org.apache.fop.pdf.PDFAMode;
 import org.apache.fop.pdf.PDFAction;
@@ -96,7 +90,6 @@
 import org.apache.fop.pdf.PDFGoTo;
 import org.apache.fop.pdf.PDFICCBasedColorSpace;
 import org.apache.fop.pdf.PDFICCStream;
-import org.apache.fop.pdf.PDFImage;
 import org.apache.fop.pdf.PDFInfo;
 import org.apache.fop.pdf.PDFLink;
 import org.apache.fop.pdf.PDFMetadata;
@@ -1656,29 +1649,38 @@
     public void renderImage(Image image, Rectangle2D pos) {
         endTextObject();
         String url = image.getURL();
-        putImage(url, pos);
+        putImage(url, pos, image.getForeignAttributes());
     }
 
     /** {@inheritDoc} */
     protected void drawImage(String url, Rectangle2D pos, Map foreignAttributes) {
         endTextObject();
-        putImage(url, pos);
+        putImage(url, pos, foreignAttributes);
     }
     
-    private final ImageFlavor[] supportedFlavors = new ImageFlavor[]
-                                                {ImageFlavor.RAW_JPEG,
-                                                 //ImageUndecodedPNG.UNDECODED_PNG,
-                                                 ImageFlavor.GRAPHICS2D,
-                                                 ImageFlavor.BUFFERED_IMAGE, 
-                                                 ImageFlavor.RENDERED_IMAGE, 
-                                                 ImageFlavor.XML_DOM};
     /**
      * Adds a PDF XObject (a bitmap or form) to the PDF that will later be referenced.
      * @param uri URL of the bitmap
      * @param pos Position of the bitmap
+     * @deprecated Use {@link @putImage(String, Rectangle2D, Map)} instead.
      */
     protected void putImage(String uri, Rectangle2D pos) {
-        //TODO No foreign attributes here like for PSRenderer
+        putImage(uri, pos, null);
+    }
+    
+    /**
+     * Adds a PDF XObject (a bitmap or form) to the PDF that will later be referenced.
+     * @param uri URL of the bitmap
+     * @param pos Position of the bitmap
+     * @param foreignAttributes foreign attributes associated with the image
+     */
+    protected void putImage(String uri, Rectangle2D pos, Map foreignAttributes) {
+        Rectangle posInt = new Rectangle(
+                (int)pos.getX(),
+                (int)pos.getY(),
+                (int)pos.getWidth(),
+                (int)pos.getHeight());
+
         uri = URISpecification.getURL(uri);
         PDFXObject xobject = pdfDoc.getXObject(uri);
         if (xobject != null) {
@@ -1688,6 +1690,7 @@
                        (float)pos.getY() / 1000f, w, h, xobject);
             return;
         }
+        Point origin = new Point(currentIPPosition, currentBPPosition);
         int x = currentIPPosition + (int)Math.round(pos.getX());
         int y = currentBPPosition + (int)Math.round(pos.getY());
 
@@ -1696,54 +1699,33 @@
         try {
             ImageSessionContext sessionContext = getUserAgent().getImageSessionContext();
             info = manager.getImageInfo(uri, sessionContext);
+            
+            
+            
             Map hints = ImageUtil.getDefaultHints(sessionContext);
             int width = (int)pos.getWidth();
             int height = (int)pos.getHeight();
             org.apache.fop.image2.Image img = manager.getImage(
-                        info, supportedFlavors, hints, sessionContext);
-            if (img instanceof ImageGraphics2D) {
-                ImageGraphics2D imageG2D = (ImageGraphics2D)img;
-                RendererContext context = createRendererContext(
-                        x, y, width, height, null);
-                getGraphics2DAdapter().paintImage(imageG2D.getGraphics2DImagePainter(),
-                        context, x, y, width, height);
-            } else if (img instanceof ImageRendered) {
-                ImageRendered imgRend = (ImageRendered)img;
-                PDFImage pdfimage = new ImageRenderedAdapter(imgRend, uri);
-                PDFXObject xobj = pdfDoc.addImage(currentContext, pdfimage);
-
-                float w = (float)pos.getWidth() / 1000f;
-                float h = (float)pos.getHeight() / 1000f;
-                placeImage((float) pos.getX() / 1000,
-                           (float) pos.getY() / 1000, w, h, xobj);
-            } else if (img instanceof ImageXMLDOM) {
-                ImageXMLDOM imgXML = (ImageXMLDOM)img;
-                Document doc = imgXML.getDocument();
-                String ns = imgXML.getRootNamespace();
-                renderDocument(doc, ns, pos, null);
-            } else if (img instanceof ImageRawStream) {
-                final ImageRawStream raw = (ImageRawStream)img;
-                /*if (raw instanceof ImageUndecodedPNG) {
-                    ImageUndecodedPNG png = (ImageUndecodedPNG)raw;
-                    PDFImage pdfimage = new ImageUndecodedPNGAdapter(png, uri);
-                    PDFXObject xobj = pdfDoc.addImage(currentContext, pdfimage);
-
-                    float w = (float)pos.getWidth() / 1000f;
-                    float h = (float)pos.getHeight() / 1000f;
-                    placeImage((float) pos.getX() / 1000,
-                               (float) pos.getY() / 1000, w, h, xobj);
-                } else*/ if (raw instanceof ImageRawJPEG) {
-                    ImageRawJPEG jpeg = (ImageRawJPEG)raw;
-                    PDFImage pdfimage = new ImageRawJPEGAdapter(jpeg, uri);
-                    PDFXObject xobj = pdfDoc.addImage(currentContext, pdfimage);
-
-                    float w = (float)pos.getWidth() / 1000f;
-                    float h = (float)pos.getHeight() / 1000f;
-                    placeImage((float) pos.getX() / 1000,
-                               (float) pos.getY() / 1000, w, h, xobj);
-                } else {
-                    throw new UnsupportedOperationException("Unsupported raw image: " + info);
+                        info, imageHandlerRegistry.getSupportedFlavors(), hints, sessionContext);
+            
+            //First check for a dynamically registered handler
+            PDFImageHandler handler = imageHandlerRegistry.getHandler(img.getClass());
+            if (handler != null) {
+                if (log.isDebugEnabled()) {
+                    log.debug("Using PDFImageHandler: " + handler.getClass().getName());
+                }
+                try {
+                    RendererContext context = createRendererContext(
+                            x, y, width, height, foreignAttributes);
+                    handler.generateImage(context, img, origin, posInt);
+                } catch (IOException ioe) {
+                    log.error("I/O error while handling image: " + info, ioe);
+                    return;
                 }
+            } else {
+                throw new UnsupportedOperationException(
+                        "No PDFImageHandler available for image: "
+                            + info + " (" + img.getClass().getName() + ")");
             }
         } catch (ImageException ie) {
             log.error("Error while processing image: "
@@ -1752,81 +1734,6 @@
             log.error("I/O error while processing image: "
                     + (info != null ? info.toString() : uri), ioe);
         }
-        
-        /*
-        //ImageFactory fact = userAgent.getFactory().getImageFactory();
-        //FopImage fopimage = fact.getImage(url, userAgent);
-        //if (fopimage == null) {
-        //    return;
-        //}
-        //if (!fopimage.load(FopImage.DIMENSIONS)) {
-        //    return;
-        //}
-        String mime = fopimage.getMimeType();
-        
-        //First check for a dynamically registered handler
-        PDFImageHandler handler = imageHandlerRegistry.getHandler(mime);
-        if (handler != null) {
-            PDFXObject xobj;
-            try {
-                xobj = handler.generateImage(fopimage, url, pdfDoc);
-            } catch (IOException ioe) {
-                log.error("I/O error while handling " + mime + " image", ioe);
-                return;
-            }
-            fact.releaseImage(url, userAgent);
-            
-            float w = (float)pos.getWidth() / 1000f;
-            float h = (float)pos.getHeight() / 1000f;
-            placeImage((float) pos.getX() / 1000,
-                       (float) pos.getY() / 1000, w, h, xobj);
-        } else if ("text/xml".equals(mime)) {
-            if (!fopimage.load(FopImage.ORIGINAL_DATA)) {
-                return;
-            }
-            Document doc = ((XMLImage) fopimage).getDocument();
-            String ns = ((XMLImage) fopimage).getNameSpace();
-
-            renderDocument(doc, ns, pos, null);
-        } else if ("image/svg+xml".equals(mime)) {
-            if (!fopimage.load(FopImage.ORIGINAL_DATA)) {
-                return;
-            }
-            Document doc = ((XMLImage) fopimage).getDocument();
-            String ns = ((XMLImage) fopimage).getNameSpace();
-
-            renderDocument(doc, ns, pos, null);
-        } else if ("image/eps".equals(mime)) {
-            FopPDFImage pdfimage = new FopPDFImage(fopimage, url);
-            PDFXObject xobj = pdfDoc.addImage(currentContext, pdfimage);
-            fact.releaseImage(url, userAgent);
-            
-            float w = (float)pos.getWidth() / 1000f;
-            float h = (float)pos.getHeight() / 1000f;
-            placeImage((float) pos.getX() / 1000,
-                       (float) pos.getY() / 1000, w, h, xobj);
-        } else if ("image/jpeg".equals(mime) || "image/tiff".equals(mime)) {
-            FopPDFImage pdfimage = new FopPDFImage(fopimage, url);
-            PDFXObject xobj = pdfDoc.addImage(currentContext, pdfimage);
-            fact.releaseImage(url, userAgent);
-
-            float w = (float)pos.getWidth() / 1000f;
-            float h = (float)pos.getHeight() / 1000f;
-            placeImage((float) pos.getX() / 1000,
-                       (float) pos.getY() / 1000, w, h, xobj);
-        } else {
-            if (!fopimage.load(FopImage.BITMAP)) {
-                return;
-            }
-            FopPDFImage pdfimage = new FopPDFImage(fopimage, url);
-            PDFXObject xobj = pdfDoc.addImage(currentContext, pdfimage);
-            fact.releaseImage(url, userAgent);
-
-            float w = (float) pos.getWidth() / 1000f;
-            float h = (float) pos.getHeight() / 1000f;
-            placeImage((float) pos.getX() / 1000f,
-                       (float) pos.getY() / 1000f, w, h, xobj);
-        }*/
 
         // output new data
         try {
@@ -1844,7 +1751,7 @@
      * @param h height for image
      * @param xobj the image XObject
      */
-    protected void placeImage(float x, float y, float w, float h, PDFXObject xobj) {
+    public void placeImage(float x, float y, float w, float h, PDFXObject xobj) {
         saveGraphicsState();
         currentStream.add(format(w) + " 0 0 "
                           + format(-h) + " "
@@ -1854,10 +1761,7 @@
         restoreGraphicsState();
     }
 
-    /**
-     * {@inheritDoc}
-     *          int, int, int, int, java.util.Map)
-     */
+    /** {@inheritDoc} */
     protected RendererContext createRendererContext(int x, int y, int width, int height, 
             Map foreignAttributes) {
         RendererContext context = super.createRendererContext(

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFRendererConfigurator.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFRendererConfigurator.java?rev=603902&r1=603901&r2=603902&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFRendererConfigurator.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFRendererConfigurator.java Thu Dec 13 04:17:56 2007
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-/* $Id: $ */
+/* $Id$ */
 
 package org.apache.fop.render.pdf;
 

Propchange: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFRendererConfigurator.java
------------------------------------------------------------------------------
    svn:keywords = Id



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