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/07 09:59:12 UTC

svn commit: r602032 - in /xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop: image2/ image2/impl/ image2/impl/imageio/ pdf/ render/pdf/

Author: jeremias
Date: Fri Dec  7 00:59:10 2007
New Revision: 602032

URL: http://svn.apache.org/viewvc?rev=602032&view=rev
Log:
Added color space information and an optional ICC color profile to the basic Image interface.
Reimplemented transparency support (for now only for ImageIO loader and PDF output)
ImageIO preloader passes the already loaded metadata to the ImageIO loader through the "custom objects" so it doesn't have to load them again.
PDF library: Corrected the naming of the method indicating the "bits per component" (bits per component != bits per pixel)
PDF library: Added a method which lets a user override values in an XObject's dictionary after the major values have been set (useful not to make the PDFImage interface more complicated).
PDF library: Support for gray transparent colors.
PDF library: Added a convenience class for alpha channel bitmaps (AlphaRasterImage)

Integration of the new image package into the PDFRenderer (currently supports all previous embedding methods except deprecated EPS embedding and CCITT embedding, now supports even more transparency options than before)


Added:
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/AlphaRasterImage.java   (with props)
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/AbstractImageAdapter.java   (with props)
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/ImageRawJPEGAdapter.java   (with props)
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/ImageRenderedAdapter.java   (with props)
Modified:
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/Image.java
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/AbstractImage.java
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageBuffered.java
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageConverterBuffered2Rendered.java
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageConverterG2D2Bitmap.java
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageLoaderRawJPEG.java
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageRendered.java
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/PreloaderPNG.java
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/imageio/ImageIOUtil.java
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/imageio/ImageLoaderImageIO.java
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/BitmapImage.java
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/PDFImage.java
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/PDFImageXObject.java
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/FopPDFImage.java
    xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/PDFRenderer.java

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/Image.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/Image.java?rev=602032&r1=602031&r2=602032&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/Image.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/Image.java Fri Dec  7 00:59:10 2007
@@ -19,6 +19,9 @@
  
 package org.apache.fop.image2;
 
+import java.awt.color.ColorSpace;
+import java.awt.color.ICC_Profile;
+
 /**
  * Represents an instance of an image (bitmap or vector graphic). The image may or may not be loaded
  * into memory. Implementing classes will expose additional methods to access the actual image data.
@@ -48,5 +51,17 @@
      * @return true if the Image is cacheable
      */
     boolean isCacheable();
+ 
+    /**
+     * Returns the ICC color profile if one is associated with the image.
+     * @return the ICC color profile or null if there's no profile
+     */
+    ICC_Profile getICCProfile();
+    
+    /**
+     * Returns the image's color space if the information is available.
+     * @return the color space or null if the color space is unknown or undefined
+     */
+    ColorSpace getColorSpace();
     
 }

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/AbstractImage.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/AbstractImage.java?rev=602032&r1=602031&r2=602032&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/AbstractImage.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/AbstractImage.java Fri Dec  7 00:59:10 2007
@@ -19,6 +19,9 @@
 
 package org.apache.fop.image2.impl;
 
+import java.awt.color.ColorSpace;
+import java.awt.color.ICC_Profile;
+
 import org.apache.fop.image2.Image;
 import org.apache.fop.image2.ImageInfo;
 import org.apache.fop.image2.ImageSize;
@@ -46,6 +49,16 @@
     /** {@inheritDoc} */
     public ImageSize getSize() {
         return getInfo().getSize();
+    }
+
+    /** {@inheritDoc} */
+    public ColorSpace getColorSpace() {
+        return null;
+    }
+
+    /** {@inheritDoc} */
+    public ICC_Profile getICCProfile() {
+        return null;
     }
 
 }

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageBuffered.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageBuffered.java?rev=602032&r1=602031&r2=602032&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageBuffered.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageBuffered.java Fri Dec  7 00:59:10 2007
@@ -19,6 +19,7 @@
 
 package org.apache.fop.image2.impl;
 
+import java.awt.Color;
 import java.awt.image.BufferedImage;
 
 import org.apache.fop.image2.ImageFlavor;
@@ -33,9 +34,10 @@
      * Main constructor.
      * @param info the image info object
      * @param buffered the BufferedImage instance
+     * @param transparentColor the transparent color or null
      */
-    public ImageBuffered(ImageInfo info, BufferedImage buffered) {
-        super(info, buffered);
+    public ImageBuffered(ImageInfo info, BufferedImage buffered, Color transparentColor) {
+        super(info, buffered, transparentColor);
     }
     
     /** {@inheritDoc} */

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageConverterBuffered2Rendered.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageConverterBuffered2Rendered.java?rev=602032&r1=602031&r2=602032&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageConverterBuffered2Rendered.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageConverterBuffered2Rendered.java Fri Dec  7 00:59:10 2007
@@ -34,7 +34,7 @@
     public Image convert(Image src, Map hints) {
         checkSourceFlavor(src);
         ImageBuffered buffered = (ImageBuffered)src;
-        return new ImageRendered(buffered.getInfo(), buffered.getRenderedImage());
+        return new ImageRendered(buffered.getInfo(), buffered.getRenderedImage(), null);
     }
 
     /** {@inheritDoc} */

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageConverterG2D2Bitmap.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageConverterG2D2Bitmap.java?rev=602032&r1=602031&r2=602032&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageConverterG2D2Bitmap.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageConverterG2D2Bitmap.java Fri Dec  7 00:59:10 2007
@@ -62,7 +62,7 @@
         
         BufferedImage bi = paintToBufferedImage(g2dImage, gray, withAlpha, resolution);
         
-        ImageBuffered bufImage = new ImageBuffered(src.getInfo(), bi);
+        ImageBuffered bufImage = new ImageBuffered(src.getInfo(), bi, null);
         return bufImage;
     }
 

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageLoaderRawJPEG.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageLoaderRawJPEG.java?rev=602032&r1=602031&r2=602032&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageLoaderRawJPEG.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageLoaderRawJPEG.java Fri Dec  7 00:59:10 2007
@@ -221,6 +221,7 @@
                 log.warn("An ICC profile is present but it is invalid (" 
                         + iae.getMessage() + "). The color profile will be ignored. (" 
                         + info.getOriginalURI() + ")");
+                return null;
             }
             if (iccProfile.getNumComponents() != colorSpace.getNumComponents()) {
                 log.warn("The number of components of the ICC profile ("

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageRendered.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageRendered.java?rev=602032&r1=602031&r2=602032&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageRendered.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/ImageRendered.java Fri Dec  7 00:59:10 2007
@@ -19,6 +19,10 @@
 
 package org.apache.fop.image2.impl;
 
+import java.awt.Color;
+import java.awt.color.ColorSpace;
+import java.awt.color.ICC_ColorSpace;
+import java.awt.color.ICC_Profile;
 import java.awt.image.RenderedImage;
 
 import org.apache.fop.image2.ImageFlavor;
@@ -30,15 +34,18 @@
 public class ImageRendered extends AbstractImage {
 
     private RenderedImage red;
+    private Color transparentColor;
     
     /**
      * Main constructor.
      * @param info the image info object
      * @param red the RenderedImage instance
+     * @param transparentColor the transparent color or null
      */
-    public ImageRendered(ImageInfo info, RenderedImage red) {
+    public ImageRendered(ImageInfo info, RenderedImage red, Color transparentColor) {
         super(info);
         this.red = red;
+        this.transparentColor = transparentColor;
     }
     
     /** {@inheritDoc} */
@@ -58,4 +65,28 @@
     public RenderedImage getRenderedImage() {
         return this.red;
     }
+
+    /** {@inheritDoc} */
+    public ColorSpace getColorSpace() {
+        return getRenderedImage().getColorModel().getColorSpace();
+    }
+
+    /** {@inheritDoc} */
+    public ICC_Profile getICCProfile() {
+        ColorSpace cs = getColorSpace();
+        if (cs instanceof ICC_ColorSpace) {
+            ICC_ColorSpace icccs = (ICC_ColorSpace)cs;
+            return icccs.getProfile();
+        }
+        return null;
+    }
+    
+    /**
+     * Returns the transparent color if available.
+     * @return the transparent color or null
+     */
+    public Color getTransparentColor() {
+        return this.transparentColor;
+    }
+    
 }

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/PreloaderPNG.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/PreloaderPNG.java?rev=602032&r1=602031&r2=602032&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/PreloaderPNG.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/PreloaderPNG.java Fri Dec  7 00:59:10 2007
@@ -46,6 +46,9 @@
 
     private static final int PNG_SIG_LENGTH = 8;
 
+    /** Key for ImageIO metadata object used in custom objects of the ImageInfo class. */
+    public static final Object IMAGEIO_METADATA = IIOMetadata.class;
+    
     /** {@inheritDoc} 
      * @throws ImageException */
     public ImageInfo preloadImage(String uri, Source src, ImageContext context)
@@ -66,7 +69,7 @@
 
         if (supported) {
             ImageInfo info = new ImageInfo(uri, getMimeType());
-            info.setSize(determineSize(in, context));
+            determineSize(in, info, context);
             return info;
         } else {
             return null;
@@ -78,7 +81,7 @@
         return MimeConstants.MIME_PNG;
     }
 
-    private ImageSize determineSize(ImageInputStream in, ImageContext context)
+    private void determineSize(ImageInputStream in, ImageInfo info, ImageContext context)
                 throws IOException, ImageException {
         in.mark();
         
@@ -102,7 +105,8 @@
         
         in.reset();
         
-        return size;
+        info.getCustomObjects().put(IMAGEIO_METADATA, iiometa);
+        info.setSize(size);
     }
 
 }

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/imageio/ImageIOUtil.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/imageio/ImageIOUtil.java?rev=602032&r1=602031&r2=602032&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/imageio/ImageIOUtil.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/imageio/ImageIOUtil.java Fri Dec  7 00:59:10 2007
@@ -20,6 +20,7 @@
 package org.apache.fop.image2.impl.imageio;
 
 import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.metadata.IIOMetadataFormatImpl;
 import javax.xml.transform.OutputKeys;
 import javax.xml.transform.Result;
 import javax.xml.transform.Source;
@@ -28,12 +29,13 @@
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
-import org.apache.fop.image2.ImageSize;
-import org.apache.fop.util.UnitConv;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
+import org.apache.fop.image2.ImageSize;
+import org.apache.fop.util.UnitConv;
+
 /**
  * Helper and convenience methods for ImageIO.
  */
@@ -46,7 +48,8 @@
      */
     public static void extractResolution(IIOMetadata iiometa, ImageSize size) {
         if (iiometa != null && iiometa.isStandardMetadataFormatSupported()) {
-            Element metanode = (Element)iiometa.getAsTree("javax_imageio_1.0");
+            Element metanode = (Element)iiometa.getAsTree(
+                    IIOMetadataFormatImpl.standardMetadataFormatName);
             Element dim = getChild(metanode, "Dimension");
             if (dim != null) {
                 Element child;
@@ -68,7 +71,13 @@
         }
     }
     
-    private static Element getChild(Element el, String name) {
+    /**
+     * Returns a child element of another element or null if there's no such child.
+     * @param el the parent element
+     * @param name the name of the requested child
+     * @return the child or null if there's no such child
+     */
+    public static Element getChild(Element el, String name) {
         NodeList nodes = el.getElementsByTagName(name);
         if (nodes.getLength() > 0) {
             return (Element)nodes.item(0);

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/imageio/ImageLoaderImageIO.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/imageio/ImageLoaderImageIO.java?rev=602032&r1=602031&r2=602032&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/imageio/ImageLoaderImageIO.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/image2/impl/imageio/ImageLoaderImageIO.java Fri Dec  7 00:59:10 2007
@@ -19,17 +19,25 @@
 
 package org.apache.fop.image2.impl.imageio;
 
+import java.awt.Color;
 import java.awt.image.BufferedImage;
+import java.awt.image.ColorModel;
+import java.awt.image.IndexColorModel;
 import java.io.IOException;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.StringTokenizer;
 
 import javax.imageio.ImageIO;
 import javax.imageio.ImageReadParam;
 import javax.imageio.ImageReader;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.metadata.IIOMetadataFormatImpl;
 import javax.imageio.stream.ImageInputStream;
 import javax.xml.transform.Source;
 
+import org.w3c.dom.Element;
+
 import org.apache.fop.image2.Image;
 import org.apache.fop.image2.ImageException;
 import org.apache.fop.image2.ImageFlavor;
@@ -38,6 +46,7 @@
 import org.apache.fop.image2.impl.AbstractImageLoader;
 import org.apache.fop.image2.impl.ImageBuffered;
 import org.apache.fop.image2.impl.ImageRendered;
+import org.apache.fop.image2.impl.PreloaderPNG;
 import org.apache.fop.image2.util.ImageUtil;
 
 /**
@@ -73,15 +82,58 @@
         if (!iter.hasNext()) {
             throw new ImageException("No ImageIO ImageReader found .");
         }
+
+        IIOMetadata iiometa = (IIOMetadata)info.getCustomObjects().get(
+                PreloaderPNG.IMAGEIO_METADATA);
+        boolean ignoreMetadata = (iiometa != null);
+        
         ImageReader reader = (ImageReader)iter.next();
         ImageReadParam param = reader.getDefaultReadParam();
-        reader.setInput(imgStream, true, true); //Don't need metadata anymore at this stage
-        BufferedImage imageData = reader.read(0, param);
+        reader.setInput(imgStream, true, ignoreMetadata);
+        final int pageIndex = 0; //Always the first page at the moment
+        BufferedImage imageData = reader.read(pageIndex, param);
+        if (iiometa == null) {
+            iiometa = reader.getImageMetadata(pageIndex);
+        }
+        
+        ColorModel cm = imageData.getColorModel();
+
+        Color transparentColor = null;
+        if (cm instanceof IndexColorModel) {
+            //transparent color will be extracted later from the image
+        } else {
+            //ImageIOUtil.dumpMetadataToSystemOut(iiometa);
+            //Retrieve the transparent color from the metadata
+            if (iiometa != null && iiometa.isStandardMetadataFormatSupported()) {
+                Element metanode = (Element)iiometa.getAsTree(
+                        IIOMetadataFormatImpl.standardMetadataFormatName);
+                Element dim = ImageIOUtil.getChild(metanode, "Transparency");
+                if (dim != null) {
+                    Element child;
+                    child = ImageIOUtil.getChild(dim, "TransparentColor");
+                    if (child != null) {
+                        String value = child.getAttribute("value");
+                        if (value == null || value.length() == 0) {
+                            //ignore
+                        } else if (cm.getNumColorComponents() == 1) {
+                            int gray = Integer.parseInt(value);
+                            transparentColor = new Color(gray, gray, gray);
+                        } else {
+                            StringTokenizer st = new StringTokenizer(value);
+                            transparentColor = new Color(
+                                    Integer.parseInt(st.nextToken()),
+                                    Integer.parseInt(st.nextToken()),
+                                    Integer.parseInt(st.nextToken()));
+                        }
+                    }
+                }
+            }
+        }
         
         if (ImageFlavor.BUFFERED_IMAGE.equals(this.targetFlavor)) {
-            return new ImageBuffered(info, imageData);
+            return new ImageBuffered(info, imageData, transparentColor);
         } else {
-            return new ImageRendered(info, imageData);
+            return new ImageRendered(info, imageData, transparentColor);
         }
     }
 

Added: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/AlphaRasterImage.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/AlphaRasterImage.java?rev=602032&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/AlphaRasterImage.java (added)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/AlphaRasterImage.java Fri Dec  7 00:59:10 2007
@@ -0,0 +1,181 @@
+/*
+ * 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.pdf;
+
+import java.awt.image.DataBuffer;
+import java.awt.image.Raster;
+import java.awt.image.RenderedImage;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.apache.xmlgraphics.image.GraphicsUtil;
+
+/**
+ * PDFImage implementation for alpha channel "images".
+ */
+public class AlphaRasterImage implements PDFImage {
+    
+    private int bitsPerComponent;
+    private PDFDeviceColorSpace colorSpace;
+    private Raster alpha;
+    private String key;
+
+    /**
+     * Create a alpha channel image.
+     * Creates a new bitmap image with the given data.
+     *
+     * @param k the key to be used to lookup the image
+     * @param alpha the alpha channel raster
+     */
+    public AlphaRasterImage(String k, Raster alpha) {
+        this.key = k;
+        this.bitsPerComponent = 8;
+        this.colorSpace = new PDFDeviceColorSpace(PDFDeviceColorSpace.DEVICE_GRAY);
+        if (alpha == null) {
+            throw new NullPointerException("Parameter alpha must not be null");
+        }
+        this.alpha = alpha;
+    }
+
+    /**
+     * Create a alpha channel image.
+     * Extracts the alpha channel from the RenderedImage and creates a new bitmap image
+     * with the given data.
+     *
+     * @param k the key to be used to lookup the image
+     * @param image the image (must have an alpha channel)
+     */
+    public AlphaRasterImage(String k, RenderedImage image) {
+        this(k, GraphicsUtil.getAlphaRaster(image));
+    }
+
+    /** {@inheritDoc} */
+    public void setup(PDFDocument doc) {
+        //nop
+    }
+
+    /** {@inheritDoc} */
+    public String getKey() {
+        return key;
+    }
+
+    /** {@inheritDoc} */
+    public int getWidth() {
+        return alpha.getWidth();
+    }
+
+    /** {@inheritDoc} */
+    public int getHeight() {
+        return alpha.getHeight();
+    }
+
+    /** {@inheritDoc} */
+    public PDFDeviceColorSpace getColorSpace() {
+        return colorSpace;
+    }
+
+    /** {@inheritDoc} */
+    public int getBitsPerComponent() {
+        return bitsPerComponent;
+    }
+
+    /** {@inheritDoc} */
+    public boolean isTransparent() {
+        return false;
+    }
+
+    /** {@inheritDoc} */
+    public PDFColor getTransparentColor() {
+        return null;
+    }
+
+    /** {@inheritDoc} */
+    public String getMask() {
+        return null;
+    }
+
+    /** {@inheritDoc} */
+    public String getSoftMask() {
+        return null;
+    }
+    
+    /** {@inheritDoc} */
+    public PDFReference getSoftMaskReference() {
+        return null;
+    }
+
+    /** {@inheritDoc} */
+    public boolean isInverted() {
+        return false;
+    }
+    
+    /** {@inheritDoc} */
+    public void outputContents(OutputStream out) throws IOException {
+        int w = getWidth();
+        int h = getHeight();
+        
+        //Check Raster
+        int nbands = alpha.getNumBands();
+        if (nbands != 1) {
+            throw new UnsupportedOperationException(
+                    "Expected only one band/component for the alpha channel");
+        }
+        int dataType = alpha.getDataBuffer().getDataType();
+        if (dataType != DataBuffer.TYPE_BYTE) {
+            throw new UnsupportedOperationException("Unsupported DataBuffer type: "
+                    + alpha.getDataBuffer().getClass().getName());
+        }
+
+        //...and write the Raster line by line with a reusable buffer
+        byte[] line = new byte[nbands * w];
+        for (int y = 0; y < h; y++) {
+            alpha.getDataElements(0, y, w, 1, line);
+            out.write(line);
+        }
+    }
+    
+    /** {@inheritDoc} */
+    public void populateXObjectDictionary(PDFDictionary dict) {
+        //nop
+    }
+
+    /** {@inheritDoc} */
+    public PDFICCStream getICCStream() {
+        return null;
+    }
+
+    /** {@inheritDoc} */
+    public boolean isPS() {
+        return false;
+    }
+
+    /** {@inheritDoc} */
+    public String getFilterHint() {
+        return PDFFilterList.IMAGE_FILTER;
+    }
+
+    /** {@inheritDoc} */
+    public PDFFilter getPDFFilter() {
+        return null;
+    }
+
+}
+
+

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

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

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/BitmapImage.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/BitmapImage.java?rev=602032&r1=602031&r2=602032&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/BitmapImage.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/BitmapImage.java Fri Dec  7 00:59:10 2007
@@ -30,7 +30,7 @@
 public class BitmapImage implements PDFImage {
     private int height;
     private int width;
-    private int bitsPerPixel;
+    private int bitsPerComponent;
     private PDFDeviceColorSpace colorSpace;
     private byte[] bitmaps;
     private PDFReference maskRef;
@@ -53,7 +53,7 @@
         this.key = k;
         this.height = height;
         this.width = width;
-        this.bitsPerPixel = 8;
+        this.bitsPerComponent = 8;
         this.colorSpace = new PDFDeviceColorSpace(PDFDeviceColorSpace.DEVICE_RGB);
         this.bitmaps = data;
         maskRef = new PDFReference(mask);
@@ -117,13 +117,9 @@
         return colorSpace;
     }
 
-    /**
-     * Get the number of bits per pixel.
-     *
-     * @return the number of bits per pixel
-     */
-    public int getBitsPerPixel() {
-        return bitsPerPixel;
+    /** {@inheritDoc} */
+    public int getBitsPerComponent() {
+        return bitsPerComponent;
     }
 
     /**
@@ -182,13 +178,16 @@
         return false;
     }
     
-    /**
-     * {@inheritDoc}
-     */
+    /** {@inheritDoc} */
     public void outputContents(OutputStream out) throws IOException {
         out.write(bitmaps);
     }
     
+    /** {@inheritDoc} */
+    public void populateXObjectDictionary(PDFDictionary dict) {
+        //nop
+    }
+
     /**
      * Get the ICC stream.
      * @return always returns null since this has no icc color space

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/PDFImage.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/PDFImage.java?rev=602032&r1=602031&r2=602032&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/PDFImage.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/PDFImage.java Fri Dec  7 00:59:10 2007
@@ -69,11 +69,11 @@
     PDFDeviceColorSpace getColorSpace();
 
     /**
-     * Get the bits per pixel for this image.
+     * Get the bits per color component for this image.
      *
-     * @return the bits per pixel
+     * @return the bits per component
      */
-    int getBitsPerPixel();
+    int getBitsPerComponent();
 
     /**
      * Check if this image is a PostScript image.
@@ -132,6 +132,14 @@
      */
     void outputContents(OutputStream out) throws IOException;
 
+    /**
+     * Populates the XObject's dictionary with additional values. The values are added to the
+     * dictionary after all the values obtained from other methods from this interface have
+     * been put into the dictionary. That allows to override certain values. 
+     * @param dict the dictionary to fill
+     */
+    void populateXObjectDictionary(PDFDictionary dict);
+    
     /**
      * Get the ICC stream for this image.
      *

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/PDFImageXObject.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/PDFImageXObject.java?rev=602032&r1=602031&r2=602032&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/PDFImageXObject.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/pdf/PDFImageXObject.java Fri Dec  7 00:59:10 2007
@@ -90,7 +90,7 @@
         put("Subtype", new PDFName("Image"));
         put("Width", new Integer(pdfimage.getWidth()));
         put("Height", new Integer(pdfimage.getHeight()));
-        put("BitsPerComponent", new Integer(pdfimage.getBitsPerPixel()));
+        put("BitsPerComponent", new Integer(pdfimage.getBitsPerComponent()));
 
         PDFICCStream pdfICCStream = pdfimage.getICCStream();
         if (pdfICCStream != null) {
@@ -118,18 +118,25 @@
         if (pdfimage.isTransparent()) {
             PDFColor transp = pdfimage.getTransparentColor();
             PDFArray mask = new PDFArray();
-            mask.add(new Integer(transp.red255()));
-            mask.add(new Integer(transp.red255()));
-            mask.add(new Integer(transp.green255()));
-            mask.add(new Integer(transp.green255()));
-            mask.add(new Integer(transp.blue255()));
-            mask.add(new Integer(transp.blue255()));
+            if (pdfimage.getColorSpace().isGrayColorSpace()) {
+                mask.add(new Integer(transp.red255()));
+                mask.add(new Integer(transp.red255()));
+            } else {
+                mask.add(new Integer(transp.red255()));
+                mask.add(new Integer(transp.red255()));
+                mask.add(new Integer(transp.green255()));
+                mask.add(new Integer(transp.green255()));
+                mask.add(new Integer(transp.blue255()));
+                mask.add(new Integer(transp.blue255()));
+            }
             put("Mask", mask);
         }
         PDFReference ref = pdfimage.getSoftMaskReference();
         if (ref != null) {
             put("SMask", ref);
         }
+        //Important: do this at the end so previous values can be overwritten.
+        pdfimage.populateXObjectDictionary(this);
     }
     
     /** {@inheritDoc} */

Added: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/AbstractImageAdapter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/AbstractImageAdapter.java?rev=602032&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/AbstractImageAdapter.java (added)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/AbstractImageAdapter.java Fri Dec  7 00:59:10 2007
@@ -0,0 +1,199 @@
+/*
+ * 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.color.ColorSpace;
+import java.awt.color.ICC_Profile;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.fop.image2.Image;
+import org.apache.fop.pdf.PDFColor;
+import org.apache.fop.pdf.PDFConformanceException;
+import org.apache.fop.pdf.PDFDeviceColorSpace;
+import org.apache.fop.pdf.PDFDictionary;
+import org.apache.fop.pdf.PDFDocument;
+import org.apache.fop.pdf.PDFICCBasedColorSpace;
+import org.apache.fop.pdf.PDFICCStream;
+import org.apache.fop.pdf.PDFImage;
+import org.apache.fop.pdf.PDFReference;
+import org.apache.fop.util.ColorProfileUtil;
+
+/**
+ * Abstract PDFImage implementation for the PDF renderer.
+ */
+public abstract class AbstractImageAdapter implements PDFImage {
+
+    /** logging instance */
+    private static Log log = LogFactory.getLog(AbstractImageAdapter.class);
+
+    private String key;
+    /** the image */
+    protected Image image;
+ 
+    private PDFICCStream pdfICCStream = null;
+
+    /**
+     * Creates a new PDFImage from an Image instance.
+     * @param image the image
+     * @param key XObject key
+     */
+    public AbstractImageAdapter(Image image, String key) {
+        this.image = image;
+        this.key = key;
+    }
+
+    /** {@inheritDoc} */
+    public String getKey() {
+        // key to look up XObject
+        return this.key;
+    }
+
+    /**
+     * Returns the image's color space.
+     * @return the color space
+     */
+    protected ColorSpace getImageColorSpace() {
+        return image.getColorSpace();
+    }
+    
+    /** {@inheritDoc} */
+    public void setup(PDFDocument doc) {
+
+        ICC_Profile prof = image.getICCProfile();
+        PDFDeviceColorSpace pdfCS = toPDFColorSpace(getImageColorSpace());
+        if (prof != null) {
+            boolean defaultsRGB = ColorProfileUtil.isDefaultsRGB(prof);
+            String desc = ColorProfileUtil.getICCProfileDescription(prof);
+            if (log.isDebugEnabled()) {
+                log.debug("Image returns ICC profile: " + desc + ", default sRGB=" + defaultsRGB);
+            }
+            PDFICCBasedColorSpace cs = doc.getResources().getICCColorSpaceByProfileName(desc);
+            if (!defaultsRGB) {
+                if (cs == null) {
+                    pdfICCStream = doc.getFactory().makePDFICCStream();
+                    pdfICCStream.setColorSpace(prof, pdfCS);
+                    cs = doc.getFactory().makeICCBasedColorSpace(null, null, pdfICCStream);
+                } else {
+                    pdfICCStream = cs.getICCStream();
+                }
+            } else {
+                if (cs == null && "sRGB".equals(desc)) {
+                    //It's the default sRGB profile which we mapped to DefaultRGB in PDFRenderer
+                    cs = doc.getResources().getColorSpace("DefaultRGB");
+                }
+                pdfICCStream = cs.getICCStream();
+            }
+        }
+        if (doc.getProfile().getPDFAMode().isPDFA1LevelB()) {
+            if (pdfCS != null
+                    && pdfCS.getColorSpace() != PDFDeviceColorSpace.DEVICE_RGB 
+                    && pdfCS.getColorSpace() != PDFDeviceColorSpace.DEVICE_GRAY
+                    && prof == null) {
+                //See PDF/A-1, ISO 19005:1:2005(E), 6.2.3.3
+                //FOP is currently restricted to DeviceRGB if PDF/A-1 is active.
+                throw new PDFConformanceException(
+                        "PDF/A-1 does not allow mixing DeviceRGB and DeviceCMYK: " 
+                                + image.getInfo());
+            }
+        }
+    }
+
+    /** {@inheritDoc} */
+    public int getWidth() {
+        return image.getSize().getWidthPx();
+    }
+
+    /** {@inheritDoc} */
+    public int getHeight() {
+        return image.getSize().getHeightPx();
+    }
+
+    /** {@inheritDoc} */
+    public boolean isTransparent() {
+        return false;
+    }
+    
+    /** {@inheritDoc} */
+    public PDFColor getTransparentColor() {
+        return null;
+    }
+    
+    /** {@inheritDoc} */
+    public String getMask() {
+        return null;
+    }
+    
+    /** {@inheritDoc} */
+    public String getSoftMask() {
+        return null;
+    }
+    
+    /** {@inheritDoc} */
+    public PDFReference getSoftMaskReference() {
+        return null;
+    }
+    
+    /** {@inheritDoc} */
+    public boolean isInverted() {
+        return false;
+    }
+    
+    /** {@inheritDoc} */
+    public boolean isPS() {
+        return false;
+    }
+
+    /** {@inheritDoc} */
+    public PDFICCStream getICCStream() {
+        return pdfICCStream;
+    }
+
+    /** {@inheritDoc} */
+    public void populateXObjectDictionary(PDFDictionary dict) {
+        //nop
+    }
+    
+    /**
+     * Converts a ColorSpace object to a PDFColorSpace object.
+     * @param cs ColorSpace instance
+     * @return PDFColorSpace new converted object
+     */
+    public static PDFDeviceColorSpace toPDFColorSpace(ColorSpace cs) {
+        if (cs == null) {
+            return null;
+        }
+
+        PDFDeviceColorSpace pdfCS = new PDFDeviceColorSpace(0);
+        switch (cs.getType()) {
+            case ColorSpace.TYPE_CMYK:
+                pdfCS.setColorSpace(PDFDeviceColorSpace.DEVICE_CMYK);
+            break;
+            case ColorSpace.TYPE_GRAY:
+                pdfCS.setColorSpace(PDFDeviceColorSpace.DEVICE_GRAY);
+                break;
+            default:
+                pdfCS.setColorSpace(PDFDeviceColorSpace.DEVICE_RGB);
+        }
+        return pdfCS;
+    }
+
+}
+

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

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

Modified: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/FopPDFImage.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/FopPDFImage.java?rev=602032&r1=602031&r2=602032&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/FopPDFImage.java (original)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/FopPDFImage.java Fri Dec  7 00:59:10 2007
@@ -25,6 +25,7 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+
 import org.apache.fop.image.EPSImage;
 import org.apache.fop.image.FopImage;
 import org.apache.fop.image.TIFFImage;
@@ -201,10 +202,8 @@
         }
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    public int getBitsPerPixel() {
+    /** {@inheritDoc} */
+    public int getBitsPerComponent() {
         if (isCCF) {
             return fopImage.getBitsPerPixel();
         } else {
@@ -266,9 +265,7 @@
         return pdfFilter;
     }
     
-    /**
-     * {@inheritDoc}
-     */
+    /** {@inheritDoc} */
     public void outputContents(OutputStream out) throws IOException {
         if (isPS) {
             outputPostScriptContents(out);
@@ -327,9 +324,12 @@
         out.write(PDFDocument.encode(post.toString()));
     }
 
-    /**
-     * {@inheritDoc}
-     */
+    /** {@inheritDoc} */
+    public void populateXObjectDictionary(PDFDictionary dict) {
+        //nop
+    }
+
+    /** {@inheritDoc} */
     public PDFICCStream getICCStream() {
         return pdfICCStream;
     }

Added: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/ImageRawJPEGAdapter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/ImageRawJPEGAdapter.java?rev=602032&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/ImageRawJPEGAdapter.java (added)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/ImageRawJPEGAdapter.java Fri Dec  7 00:59:10 2007
@@ -0,0 +1,104 @@
+/*
+ * 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.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.apache.commons.io.IOUtils;
+
+import org.apache.fop.image2.impl.ImageRawJPEG;
+import org.apache.fop.pdf.DCTFilter;
+import org.apache.fop.pdf.PDFDeviceColorSpace;
+import org.apache.fop.pdf.PDFDocument;
+import org.apache.fop.pdf.PDFFilter;
+import org.apache.fop.pdf.PDFFilterList;
+
+/**
+ * PDFImage implementation for the PDF renderer which handles raw JPEG images.
+ */
+public class ImageRawJPEGAdapter extends AbstractImageAdapter {
+
+    private PDFFilter pdfFilter = null;
+
+    /**
+     * Creates a new PDFImage from an Image instance.
+     * @param image the JPEG image
+     * @param key XObject key
+     */
+    public ImageRawJPEGAdapter(ImageRawJPEG image, String key) {
+        super(image, key);
+    }
+
+    /**
+     * Returns the ImageRendered instance for this adapter.
+     * @return the ImageRendered instance
+     */
+    public ImageRawJPEG getImage() {
+        return ((ImageRawJPEG)this.image);
+    }
+    
+    /** {@inheritDoc} */
+    public void setup(PDFDocument doc) {
+        pdfFilter = new DCTFilter();
+        pdfFilter.setApplied(true);
+
+        super.setup(doc);
+    }
+
+    /** {@inheritDoc} */
+    public PDFDeviceColorSpace getColorSpace() {
+        // DeviceGray, DeviceRGB, or DeviceCMYK
+        return toPDFColorSpace(getImageColorSpace());
+    }
+
+    /** {@inheritDoc} */
+    public int getBitsPerComponent() {
+        return 8;
+    }
+
+    /** @return true for CMYK images generated by Adobe Photoshop */
+    public boolean isInverted() {
+        return getImage().isInverted();
+    }
+    
+    /** {@inheritDoc} */
+    public PDFFilter getPDFFilter() {
+        return pdfFilter;
+    }
+    
+    /** {@inheritDoc} */
+    public void outputContents(OutputStream out) throws IOException {
+        InputStream in = getImage().createInputStream();
+        try {
+            IOUtils.copy(in, out);
+        } finally {
+            IOUtils.closeQuietly(in);
+        }
+        //TODO IMPLEMENT ME
+    }
+
+    /** {@inheritDoc} */
+    public String getFilterHint() {
+        return PDFFilterList.JPEG_FILTER;
+    }
+
+}
+

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

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

Added: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/ImageRenderedAdapter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/ImageRenderedAdapter.java?rev=602032&view=auto
==============================================================================
--- xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/ImageRenderedAdapter.java (added)
+++ xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/ImageRenderedAdapter.java Fri Dec  7 00:59:10 2007
@@ -0,0 +1,360 @@
+/*
+ * 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.color.ColorSpace;
+import java.awt.image.ColorModel;
+import java.awt.image.IndexColorModel;
+import java.awt.image.Raster;
+import java.awt.image.RenderedImage;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.zip.Deflater;
+import java.util.zip.DeflaterOutputStream;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.xmlgraphics.image.codec.png.PNGEncodeParam;
+import org.apache.xmlgraphics.image.codec.png.PNGImageEncoder;
+import org.apache.xmlgraphics.ps.ImageEncodingHelper;
+
+import org.apache.fop.image2.impl.ImageRendered;
+import org.apache.fop.pdf.AlphaRasterImage;
+import org.apache.fop.pdf.FlateFilter;
+import org.apache.fop.pdf.PDFArray;
+import org.apache.fop.pdf.PDFColor;
+import org.apache.fop.pdf.PDFDeviceColorSpace;
+import org.apache.fop.pdf.PDFDictionary;
+import org.apache.fop.pdf.PDFDocument;
+import org.apache.fop.pdf.PDFFilter;
+import org.apache.fop.pdf.PDFFilterException;
+import org.apache.fop.pdf.PDFFilterList;
+import org.apache.fop.pdf.PDFName;
+import org.apache.fop.pdf.PDFReference;
+import org.apache.fop.pdf.PDFWritable;
+
+/**
+ * PDFImage implementation for the PDF renderer which handles RenderedImages.
+ */
+public class ImageRenderedAdapter extends AbstractImageAdapter {
+
+    /** logging instance */
+    private static Log log = LogFactory.getLog(ImageRenderedAdapter.class);
+
+    private ImageEncodingHelper encodingHelper;
+    
+    private PDFFilter pdfFilter = null;
+    private String maskRef;
+    private PDFReference softMask;
+    private boolean usePredictors = false;
+
+    /**
+     * Creates a new PDFImage from an Image instance.
+     * @param image the image
+     * @param key XObject key
+     */
+    public ImageRenderedAdapter(ImageRendered image, String key) {
+        super(image, key);
+        this.encodingHelper = new ImageEncodingHelper(image.getRenderedImage());
+    }
+
+    /**
+     * Returns the ImageRendered instance for this adapter.
+     * @return the ImageRendered instance
+     */
+    public ImageRendered getImage() {
+        return ((ImageRendered)this.image);
+    }
+    
+    private ColorModel getEffectiveColorModel() {
+        return encodingHelper.getEncodedColorModel();
+    }
+    
+    /** {@inheritDoc} */
+    protected ColorSpace getImageColorSpace() {
+        return getEffectiveColorModel().getColorSpace();
+    }
+
+    /** {@inheritDoc} */
+    public void setup(PDFDocument doc) {
+        RenderedImage ri = getImage().getRenderedImage();
+        ColorModel cm = getEffectiveColorModel();
+
+        if (usePredictors) {
+            //Experiment hasn't worked, yet, so it's disabled
+            FlateFilter flate;
+            try {
+                flate = new FlateFilter();
+                flate.setApplied(true);
+                flate.setPredictor(FlateFilter.PREDICTION_PNG_OPT);
+                flate.setColors(cm.getNumComponents());
+                flate.setColumns(ri.getWidth());
+                flate.setBitsPerComponent(getBitsPerComponent());
+            } catch (PDFFilterException e) {
+                throw new RuntimeException("Unexpected bug while configuring FlateFilter", e);
+            }
+            this.pdfFilter = flate;
+        }
+
+        super.setup(doc);
+        
+        //Handle transparency mask if applicable
+        ColorModel orgcm = ri.getColorModel(); 
+        if (orgcm.hasAlpha() && orgcm.getTransparency() == ColorModel.TRANSLUCENT) {
+            doc.getProfile().verifyTransparencyAllowed(image.getInfo().getOriginalURI());
+            //TODO Implement code to combine image with background color if transparency is not
+            //allowed (need BufferedImage support for that)
+            
+            AlphaRasterImage alphaImage = new AlphaRasterImage("Mask:" + getKey(), ri);
+            this.softMask = doc.addImage(null, alphaImage).makeReference();
+
+        }
+    }
+
+    /** {@inheritDoc} */
+    public PDFDeviceColorSpace getColorSpace() {
+        // DeviceGray, DeviceRGB, or DeviceCMYK
+        return toPDFColorSpace(getEffectiveColorModel().getColorSpace());
+    }
+
+    /** {@inheritDoc} */
+    public int getBitsPerComponent() {
+        ColorModel cm = getEffectiveColorModel();
+        if (cm instanceof IndexColorModel) {
+            IndexColorModel icm = (IndexColorModel)cm;
+            return icm.getComponentSize(0);
+        } else {
+            return cm.getComponentSize(0);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public boolean isTransparent() {
+        ColorModel cm = getEffectiveColorModel();
+        if (cm instanceof IndexColorModel) {
+            if (cm.getTransparency() == IndexColorModel.TRANSLUCENT) {
+                return true;
+            }
+        }
+        return (getImage().getTransparentColor() != null);
+    }
+    
+    private static Integer getIndexOfFirstTransparentColorInPalette(RenderedImage image) {
+        ColorModel cm = image.getColorModel();
+        if (cm instanceof IndexColorModel) {
+            IndexColorModel icm = (IndexColorModel)cm;
+            //Identify the transparent color in the palette
+            byte[] alphas = new byte[icm.getMapSize()];
+            byte[] reds = new byte[icm.getMapSize()];
+            byte[] greens = new byte[icm.getMapSize()];
+            byte[] blues = new byte[icm.getMapSize()];
+            icm.getAlphas(alphas);
+            icm.getReds(reds);
+            icm.getGreens(greens);
+            icm.getBlues(blues);
+            for (int i = 0;
+                    i < ((IndexColorModel) cm).getMapSize();
+                    i++) {
+                if ((alphas[i] & 0xFF) == 0) {
+                    /*
+                    Color transparentColor = new Color(
+                            (int)(reds[i] & 0xFF),
+                            (int)(greens[i] & 0xFF),
+                            (int)(blues[i] & 0xFF));
+                    */
+                    return new Integer(i);
+                }
+            }
+        }
+        return null;
+    }
+
+    /** {@inheritDoc} */
+    public PDFColor getTransparentColor() {
+        ColorModel cm = getEffectiveColorModel();
+        if (cm instanceof IndexColorModel) {
+            IndexColorModel icm = (IndexColorModel)cm;
+            if (cm.getTransparency() == IndexColorModel.TRANSLUCENT) {
+                int transPixel = icm.getTransparentPixel();
+                return new PDFColor(
+                        icm.getRed(transPixel),
+                        icm.getGreen(transPixel),
+                        icm.getBlue(transPixel));
+            }
+        }
+        return new PDFColor(getImage().getTransparentColor());
+    }
+
+    /** {@inheritDoc} */
+    public String getMask() {
+        return maskRef;
+    }
+
+    /** {@inheritDoc} */
+    public String getSoftMask() {
+        return softMask.toInlinePDFString();
+    }
+
+    /** {@inheritDoc} */
+    public PDFReference getSoftMaskReference() {
+        return softMask;
+    }
+    
+    /** {@inheritDoc} */
+    public PDFFilter getPDFFilter() {
+        return pdfFilter;
+    }
+    
+    /** {@inheritDoc} */
+    public void outputContents(OutputStream out) throws IOException {
+        if (usePredictors) {
+            PNGEncodeParam param = PNGEncodeParam.getDefaultEncodeParam(
+                    getImage().getRenderedImage());
+            EmbeddedPNGEncoder encoder = new EmbeddedPNGEncoder(out, param);
+            encoder.encode(getImage().getRenderedImage());
+        } else {
+            encodingHelper.encode(out);
+        }
+    }
+
+    private static final int MAX_HIVAL = 255;
+    
+    /** {@inheritDoc} */
+    public void populateXObjectDictionary(PDFDictionary dict) {
+        ColorModel cm = getEffectiveColorModel();
+        if (cm instanceof IndexColorModel) {
+            IndexColorModel icm = (IndexColorModel)cm;
+            PDFArray indexed = new PDFArray();
+            indexed.add(new PDFName("Indexed"));
+            
+            if (icm.getColorSpace().getType() != ColorSpace.TYPE_RGB) {
+                log.warn("Indexed color space is not using RGB as base color space."
+                        + " The image may not be handled correctly."
+                        + " Base color space: " + icm.getColorSpace() 
+                        + " Image: " + image.getInfo());
+            }
+            indexed.add(new PDFName(toPDFColorSpace(icm.getColorSpace()).getName()));
+            int c = icm.getMapSize();
+            int hival = c - 1;
+            if (hival > MAX_HIVAL) {
+                throw new UnsupportedOperationException("hival must not go beyond " + MAX_HIVAL);
+            }
+            indexed.add(new Integer(hival));
+            final StringBuffer sb = new StringBuffer("<");
+            int[] palette = new int[c];
+            icm.getRGBs(palette);
+            for (int i = 0; i < c; i++) {
+                if (i > 0) {
+                    sb.append(" ");
+                }
+                //TODO Probably doesn't work for non RGB based color spaces
+                rgb2Hex(palette[i], sb);
+            }
+            sb.append(">");
+            indexed.add(new PDFWritable() {
+                public String toInlinePDFString() {
+                    //Work-around String escaping. Maybe a little hacky.
+                    return sb.toString();
+                }
+            });
+
+            dict.put("ColorSpace", indexed);
+            dict.put("BitsPerComponent", icm.getPixelSize());
+            
+            Integer index = getIndexOfFirstTransparentColorInPalette(getImage().getRenderedImage());
+            if (index != null) {
+                PDFArray mask = new PDFArray();
+                mask.add(index);
+                mask.add(index);
+                dict.put("Mask", mask);
+            }
+        }
+    }
+    
+    private static final char[] HEX = {
+        '0', '1', '2', '3', '4', '5', '6', '7',
+        '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
+    };
+
+    private static void rgb2Hex(int rgb, StringBuffer sb) {
+        for (int i = 5; i >= 0; i--) {
+            int shift = i * 4;
+            int n = (rgb & (15 << shift)) >> shift;
+            sb.append(HEX[n % 16]);
+        }
+    }
+    
+    /** {@inheritDoc} */
+    public String getFilterHint() {
+        if (usePredictors) {
+            return PDFFilterList.PRECOMPRESSED_FILTER;
+        } else {
+            return PDFFilterList.IMAGE_FILTER;
+        }
+    }
+
+    private static class EmbeddedPNGEncoder extends PNGImageEncoder {
+
+        public EmbeddedPNGEncoder(OutputStream output, PNGEncodeParam param) {
+            super(output, param);
+        }
+        
+        public void encode(RenderedImage image) throws IOException {
+            prepareEncoding(image);
+            
+            DeflaterOutputStream dos
+                = new DeflaterOutputStream(getOutputStream(),
+                        new Deflater(Deflater.DEFAULT_COMPRESSION));
+
+            // Future work - don't convert entire image to a Raster It
+            // might seem that you could just call image.getData() but
+            // 'BufferedImage.subImage' doesn't appear to set the Width
+            // and height properly of the Child Raster, so the Raster
+            // you get back here appears larger than it should.
+            // This solves that problem by bounding the raster to the
+            // image's bounds...
+            /*
+            Raster ras = image.getData(new Rectangle(image.getMinX(), 
+                                                     image.getMinY(),
+                                                     image.getWidth(),
+                                                     image.getHeight()));
+            */
+            Raster ras = image.getData();
+
+            boolean skipAlpha = image.getColorModel().hasAlpha();
+            if (skipAlpha) {
+                int numBands = ras.getNumBands() - 1;
+                int[] bandList = new int[numBands];
+                for (int i = 0; i < numBands; i++) {
+                    bandList[i] = i;
+                }
+                ras = ras.createChild(0, 0,
+                                      ras.getWidth(), ras.getHeight(),
+                                      0, 0,
+                                      bandList);
+            }
+
+            encodePass(dos, ras, 0, 0, 1, 1);
+
+            dos.finish();
+        }
+    }
+
+}
+

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

Propchange: xmlgraphics/fop/branches/Temp_ImagePackageRedesign/src/java/org/apache/fop/render/pdf/ImageRenderedAdapter.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=602032&r1=602031&r2=602032&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 Fri Dec  7 00:59:10 2007
@@ -37,7 +37,13 @@
 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;
+import org.apache.xmlgraphics.xmp.schemas.XMPBasicSchema;
+
 import org.apache.fop.apps.FOPException;
 import org.apache.fop.apps.FOUserAgent;
 import org.apache.fop.apps.MimeConstants;
@@ -60,14 +66,23 @@
 import org.apache.fop.area.inline.SpaceArea;
 import org.apache.fop.area.inline.TextArea;
 import org.apache.fop.area.inline.WordArea;
+import org.apache.fop.datatypes.URISpecification;
 import org.apache.fop.fo.Constants;
 import org.apache.fop.fo.extensions.ExtensionAttachment;
 import org.apache.fop.fo.extensions.xmp.XMPMetadata;
 import org.apache.fop.fonts.Font;
 import org.apache.fop.fonts.Typeface;
-import org.apache.fop.image.FopImage;
-import org.apache.fop.image.ImageFactory;
-import org.apache.fop.image.XMLImage;
+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;
 import org.apache.fop.pdf.PDFAnnotList;
@@ -81,6 +96,7 @@
 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;
@@ -100,10 +116,6 @@
 import org.apache.fop.render.RendererContext;
 import org.apache.fop.util.CharUtilities;
 import org.apache.fop.util.ColorProfileUtil;
-import org.apache.xmlgraphics.xmp.Metadata;
-import org.apache.xmlgraphics.xmp.schemas.XMPBasicAdapter;
-import org.apache.xmlgraphics.xmp.schemas.XMPBasicSchema;
-import org.w3c.dom.Document;
 
 /**
  * Renderer that renders areas to PDF.
@@ -1640,9 +1652,7 @@
         }
     }
 
-    /**
-     * {@inheritDoc} 
-     */
+    /** {@inheritDoc} */
     public void renderImage(Image image, Rectangle2D pos) {
         endTextObject();
         String url = image.getURL();
@@ -1655,14 +1665,22 @@
         putImage(url, pos);
     }
     
+    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 url URL of the bitmap
+     * @param uri URL of the bitmap
      * @param pos Position of the bitmap
      */
-    protected void putImage(String url, Rectangle2D pos) {
-        url = ImageFactory.getURL(url);
-        PDFXObject xobject = pdfDoc.getXObject(url);
+    protected void putImage(String uri, Rectangle2D pos) {
+        //TODO No foreign attributes here like for PSRenderer
+        uri = URISpecification.getURL(uri);
+        PDFXObject xobject = pdfDoc.getXObject(uri);
         if (xobject != null) {
             float w = (float) pos.getWidth() / 1000f;
             float h = (float) pos.getHeight() / 1000f;
@@ -1670,15 +1688,80 @@
                        (float)pos.getY() / 1000f, w, h, xobject);
             return;
         }
+        int x = currentIPPosition + (int)Math.round(pos.getX());
+        int y = currentBPPosition + (int)Math.round(pos.getY());
 
-        ImageFactory fact = userAgent.getFactory().getImageFactory();
-        FopImage fopimage = fact.getImage(url, userAgent);
-        if (fopimage == null) {
-            return;
-        }
-        if (!fopimage.load(FopImage.DIMENSIONS)) {
-            return;
+        ImageManager manager = getUserAgent().getFactory().getImageManager();
+        ImageInfo info = null;
+        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);
+                }
+            }
+        } catch (ImageException ie) {
+            log.error("Error while processing image: "
+                    + (info != null ? info.toString() : uri), ie);
+        } catch (IOException ioe) {
+            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
@@ -1743,7 +1826,7 @@
             float h = (float) pos.getHeight() / 1000f;
             placeImage((float) pos.getX() / 1000f,
                        (float) pos.getY() / 1000f, w, h, xobj);
-        }
+        }*/
 
         // output new data
         try {



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