You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xmlgraphics.apache.org by ga...@apache.org on 2012/06/15 04:29:41 UTC

svn commit: r1350450 - in /xmlgraphics/commons/trunk: ./ src/java/org/apache/xmlgraphics/image/codec/png/ src/java/org/apache/xmlgraphics/image/loader/impl/ src/java/org/apache/xmlgraphics/ps/ src/resources/META-INF/services/ test/images/ test/java/org...

Author: gadams
Date: Fri Jun 15 02:29:40 2012
New Revision: 1350450

URL: http://svn.apache.org/viewvc?rev=1350450&view=rev
Log:
Bugzilla #53408: Add two PNG image loaders, one using internal XGC PNG code, the other using an externally supplied IDAT chunk (for raw decoding). Submitted by Luis Bernardo, Matthias Reischenbacher.

Added:
    xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/codec/png/PNGChunk.java
    xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryPNG.java
    xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderPNG.java
    xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNG.java
    xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageRawPNG.java
    xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/PNGConstants.java
    xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/PNGFile.java
    xmlgraphics/commons/trunk/test/images/basi2c08.png
    xmlgraphics/commons/trunk/test/images/basn0g08.png
    xmlgraphics/commons/trunk/test/images/basn2c08.png
    xmlgraphics/commons/trunk/test/images/basn3p08.png
    xmlgraphics/commons/trunk/test/images/basn4a08.png
    xmlgraphics/commons/trunk/test/images/basn6a08.png
    xmlgraphics/commons/trunk/test/images/f00n2c08.png
    xmlgraphics/commons/trunk/test/images/f04n2c08.png
    xmlgraphics/commons/trunk/test/images/pp0n6a08.png
    xmlgraphics/commons/trunk/test/images/tbbn3p08.png
    xmlgraphics/commons/trunk/test/images/tbrn2c08.png
    xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryPNGTestCase.java
    xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderPNGTestCase.java
    xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNGTestCase.java
    xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/PNGFileTestCase.java
Modified:
    xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/codec/png/PNGImageDecoder.java
    xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryRaw.java
    xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/PSImageUtils.java
    xmlgraphics/commons/trunk/src/resources/META-INF/services/org.apache.xmlgraphics.image.loader.spi.ImageLoaderFactory
    xmlgraphics/commons/trunk/status.xml
    xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/ImageLoaderTestCase.java
    xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/java2d/ps/PSGraphics2DTestCase.java

Added: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/codec/png/PNGChunk.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/codec/png/PNGChunk.java?rev=1350450&view=auto
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/codec/png/PNGChunk.java (added)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/codec/png/PNGChunk.java Fri Jun 15 02:29:40 2012
@@ -0,0 +1,184 @@
+/*
+ * 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.xmlgraphics.image.codec.png;
+
+import java.io.DataInputStream;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class PNGChunk {
+    int length;
+    int type;
+    byte[] data;
+    int crc;
+
+    String typeString;
+
+    /** logger */
+    protected static Log log = LogFactory.getLog(PNGChunk.class);
+
+    /**
+     * See http://en.wikipedia.org/wiki/Portable_Network_Graphics for a light explanation;
+     * See http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html for the spec.
+     */
+    public enum ChunkType {
+        IHDR, // IHDR must be the first chunk
+        PLTE, // PLTE contains the palette
+        IDAT, // IDAT contains the image, which may be split among multiple IDAT chunks
+        IEND, // IEND marks the image end
+        bKGD, // bKGD gives the default background color
+        cHRM, // cHRM gives the chromaticity coordinates
+        gAMA, // gAMA specifies gamma
+        hIST, // hIST can store the histogram
+        iCCP, // iCCP is an ICC color profile
+        iTXt, // iTXt contains UTF-8 text
+        pHYs, // pHYs holds the intended pixel size
+        sBIT, // sBIT (significant bits) indicates the color-accuracy
+        sPLT, // sPLT suggests a palette to use
+        sRGB, // sRGB indicates that the standard sRGB color space is used
+        sTER, // sTER stereo-image indicator chunk for stereoscopic images
+        tEXt, // tEXt can store text that can be represented in ISO/IEC 8859-1
+        tIME, // tIME stores the time that the image was last changed
+        tRNS, // tRNS contains transparency information
+        zTXt; // zTXt contains compressed text with the same limits as tEXt
+    }
+
+    public PNGChunk(int length, int type, byte[] data, int crc) {
+        this.length = length;
+        this.type = type;
+        this.data = data;
+        this.crc = crc;
+        this.typeString = typeIntToString(this.type);
+    }
+
+    public int getLength() {
+        return length;
+    }
+
+    public int getType() {
+        return type;
+    }
+
+    public String getTypeString() {
+        return typeString;
+    }
+
+    public byte[] getData() {
+        return data;
+    }
+
+    public byte getByte(int offset) {
+        return data[offset];
+    }
+
+    public int getInt1(int offset) {
+        return data[offset] & 0xff;
+    }
+
+    public int getInt2(int offset) {
+        return ((data[offset] & 0xff) << 8) | (data[offset + 1] & 0xff);
+    }
+
+    public int getInt4(int offset) {
+        return ((data[offset] & 0xff) << 24) | ((data[offset + 1] & 0xff) << 16)
+                | ((data[offset + 2] & 0xff) << 8) | (data[offset + 3] & 0xff);
+    }
+
+    public String getString4(int offset) {
+        return "" + (char) data[offset] + (char) data[offset + 1] + (char) data[offset + 2]
+                + (char) data[offset + 3];
+    }
+
+    public boolean isType(String typeName) {
+        return typeString.equals(typeName);
+    }
+
+    /**
+     * Reads the next chunk from the input stream.
+     * @param distream the input stream
+     * @return the chunk
+     */
+    public static PNGChunk readChunk(DataInputStream distream) {
+        try {
+            int length = distream.readInt();
+            int type = distream.readInt();
+            byte[] data = new byte[length];
+            distream.readFully(data);
+            int crc = distream.readInt();
+
+            return new PNGChunk(length, type, data, crc);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * Returns the PNG chunk type, a four letter case sensitive ASCII type/name.
+     * @param distream the input stream
+     * @return a four letter case sensitive ASCII type/name
+     */
+    public static String getChunkType(DataInputStream distream) {
+        try {
+            distream.mark(8);
+            /* int length = */distream.readInt();
+            int type = distream.readInt();
+            distream.reset();
+
+            return typeIntToString(type);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    private static String typeIntToString(int type) {
+        String typeString = "";
+        typeString += (char) (type >> 24);
+        typeString += (char) ((type >> 16) & 0xff);
+        typeString += (char) ((type >> 8) & 0xff);
+        typeString += (char) (type & 0xff);
+        return typeString;
+    }
+
+    /**
+     * Skips the next chunk from the input stream.
+     * @param distream the input stream
+     * @return true if skipping successful, false otherwise
+     */
+    public static boolean skipChunk(DataInputStream distream) {
+        try {
+            int length = distream.readInt();
+            int type = distream.readInt();
+            // is this really faster than reading?
+            int skipped = distream.skipBytes(length);
+            int crc = distream.readInt();
+            if (skipped != length) {
+                log.warn("Incorrect number of bytes skipped.");
+                return false;
+            }
+            return true;
+        } catch (Exception e) {
+            log.warn(e.getMessage());
+            return false;
+        }
+    }
+}

Modified: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/codec/png/PNGImageDecoder.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/codec/png/PNGImageDecoder.java?rev=1350450&r1=1350449&r2=1350450&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/codec/png/PNGImageDecoder.java (original)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/codec/png/PNGImageDecoder.java Fri Jun 15 02:29:40 2012
@@ -51,6 +51,7 @@ import java.util.zip.InflaterInputStream
 import org.apache.xmlgraphics.image.codec.util.ImageDecoderImpl;
 import org.apache.xmlgraphics.image.codec.util.PropertyUtil;
 import org.apache.xmlgraphics.image.codec.util.SimpleRenderedImage;
+import org.apache.xmlgraphics.image.loader.impl.PNGConstants;
 
 // CSOFF: ConstantName
 // CSOFF: InnerAssignment
@@ -80,101 +81,19 @@ public class PNGImageDecoder extends Ima
     }
 }
 
-class PNGChunk {
-    int length;
-    int type;
-    byte[] data;
-    int crc;
-
-    final String typeString;
-
-    PNGChunk(int length, int type, byte[] data, int crc) {
-        this.length = length;
-        this.type = type;
-        this.data = data;
-        this.crc = crc;
-
-        typeString = ""
-                     + (char)((type >>> 24) & 0xff)
-                     + (char)((type >>> 16) & 0xff)
-                     + (char)((type >>>  8) & 0xff)
-                     + (char)((type       ) & 0xff);
-    }
-
-    public int getLength() {
-        return length;
-    }
-
-    public int getType() {
-        return type;
-    }
-
-    public String getTypeString() {
-        return typeString;
-    }
-
-    public byte[] getData() {
-        return data;
-    }
-
-    public byte getByte(int offset) {
-        return data[offset];
-    }
-
-    public int getInt1(int offset) {
-        return data[offset] & 0xff;
-    }
-
-    public int getInt2(int offset) {
-        return ((data[offset] & 0xff) << 8) |
-            (data[offset + 1] & 0xff);
-    }
-
-    public int getInt4(int offset) {
-        return ((data[offset] & 0xff) << 24) |
-            ((data[offset + 1] & 0xff) << 16) |
-            ((data[offset + 2] & 0xff) << 8) |
-            (data[offset + 3] & 0xff);
-    }
-
-    public String getString4(int offset) {
-        return  ""
-            + (char)data[offset]
-            + (char)data[offset + 1]
-            + (char)data[offset + 2]
-            + (char)data[offset + 3];
-    }
-
-    public boolean isType(String typeName) {
-        return typeString.equals(typeName);
-    }
-}
-
 /**
  * TO DO:
  *
  * zTXt chunks
  *
  */
-class PNGImage extends SimpleRenderedImage {
-
-    public static final int PNG_COLOR_GRAY = 0;
-    public static final int PNG_COLOR_RGB = 2;
-    public static final int PNG_COLOR_PALETTE = 3;
-    public static final int PNG_COLOR_GRAY_ALPHA = 4;
-    public static final int PNG_COLOR_RGB_ALPHA = 6;
+class PNGImage extends SimpleRenderedImage implements PNGConstants {
 
     private static final String[] colorTypeNames = {
         "Grayscale", "Error", "Truecolor", "Index",
         "Grayscale with alpha", "Error", "Truecolor with alpha"
     };
 
-    public static final int PNG_FILTER_NONE = 0;
-    public static final int PNG_FILTER_SUB = 1;
-    public static final int PNG_FILTER_UP = 2;
-    public static final int PNG_FILTER_AVERAGE = 3;
-    public static final int PNG_FILTER_PAETH = 4;
-
     private int[][] bandOffsets = {
         null,
         { 0 }, // G
@@ -304,7 +223,7 @@ class PNGImage extends SimpleRenderedIma
     private static final int POST_ADD_GRAY_TRANS_EXP =
         POST_ADD_GRAY_TRANS | POST_EXP_MASK;
 
-    private List streamVec = new ArrayList();
+    private List<InputStream> streamVec = new ArrayList<InputStream>();
     private DataInputStream dataStream;
 
     private int bytesPerPixel; // number of bytes per input pixel
@@ -399,7 +318,7 @@ class PNGImage extends SimpleRenderedIma
 
         try {
             long magic = distream.readLong();
-            if (magic != 0x89504e470d0a1a0aL) {
+            if (magic != PNG_SIGNATURE) {
                 String msg = PropertyUtil.getString("PNGImageDecoder0");
                 throw new RuntimeException(msg);
             }
@@ -413,58 +332,58 @@ class PNGImage extends SimpleRenderedIma
             try {
                 PNGChunk chunk;
 
-                String chunkType = getChunkType(distream);
-                if (chunkType.equals("IHDR")) {
-                    chunk = readChunk(distream);
+                String chunkType = PNGChunk.getChunkType(distream);
+                if (chunkType.equals(PNGChunk.ChunkType.IHDR.name())) {
+                    chunk = PNGChunk.readChunk(distream);
                     parse_IHDR_chunk(chunk);
-                } else if (chunkType.equals("PLTE")) {
-                    chunk = readChunk(distream);
+                } else if (chunkType.equals(PNGChunk.ChunkType.PLTE.name())) {
+                    chunk = PNGChunk.readChunk(distream);
                     parse_PLTE_chunk(chunk);
-                } else if (chunkType.equals("IDAT")) {
-                    chunk = readChunk(distream);
+                } else if (chunkType.equals(PNGChunk.ChunkType.IDAT.name())) {
+                    chunk = PNGChunk.readChunk(distream);
                     streamVec.add(new ByteArrayInputStream(chunk.getData()));
-                } else if (chunkType.equals("IEND")) {
-                    chunk = readChunk(distream);
+                } else if (chunkType.equals(PNGChunk.ChunkType.IEND.name())) {
+                    chunk = PNGChunk.readChunk(distream);
                     parse_IEND_chunk(chunk);
                     break; // fall through to the bottom
-                } else if (chunkType.equals("bKGD")) {
-                    chunk = readChunk(distream);
+                } else if (chunkType.equals(PNGChunk.ChunkType.bKGD.name())) {
+                    chunk = PNGChunk.readChunk(distream);
                     parse_bKGD_chunk(chunk);
-                } else if (chunkType.equals("cHRM")) {
-                    chunk = readChunk(distream);
+                } else if (chunkType.equals(PNGChunk.ChunkType.cHRM.name())) {
+                    chunk = PNGChunk.readChunk(distream);
                     parse_cHRM_chunk(chunk);
-                } else if (chunkType.equals("gAMA")) {
-                    chunk = readChunk(distream);
+                } else if (chunkType.equals(PNGChunk.ChunkType.gAMA.name())) {
+                    chunk = PNGChunk.readChunk(distream);
                     parse_gAMA_chunk(chunk);
-                } else if (chunkType.equals("hIST")) {
-                    chunk = readChunk(distream);
+                } else if (chunkType.equals(PNGChunk.ChunkType.hIST.name())) {
+                    chunk = PNGChunk.readChunk(distream);
                     parse_hIST_chunk(chunk);
-                } else if (chunkType.equals("iCCP")) {
-                    chunk = readChunk(distream);
+                } else if (chunkType.equals(PNGChunk.ChunkType.iCCP.name())) {
+                    chunk = PNGChunk.readChunk(distream);
                     parse_iCCP_chunk(chunk);
-                } else if (chunkType.equals("pHYs")) {
-                    chunk = readChunk(distream);
+                } else if (chunkType.equals(PNGChunk.ChunkType.pHYs.name())) {
+                    chunk = PNGChunk.readChunk(distream);
                     parse_pHYs_chunk(chunk);
-                } else if (chunkType.equals("sBIT")) {
-                    chunk = readChunk(distream);
+                } else if (chunkType.equals(PNGChunk.ChunkType.sBIT.name())) {
+                    chunk = PNGChunk.readChunk(distream);
                     parse_sBIT_chunk(chunk);
-                } else if (chunkType.equals("sRGB")) {
-                    chunk = readChunk(distream);
+                } else if (chunkType.equals(PNGChunk.ChunkType.sRGB.name())) {
+                    chunk = PNGChunk.readChunk(distream);
                     parse_sRGB_chunk(chunk);
-                } else if (chunkType.equals("tEXt")) {
-                    chunk = readChunk(distream);
+                } else if (chunkType.equals(PNGChunk.ChunkType.tEXt.name())) {
+                    chunk = PNGChunk.readChunk(distream);
                     parse_tEXt_chunk(chunk);
-                } else if (chunkType.equals("tIME")) {
-                    chunk = readChunk(distream);
+                } else if (chunkType.equals(PNGChunk.ChunkType.tIME.name())) {
+                    chunk = PNGChunk.readChunk(distream);
                     parse_tIME_chunk(chunk);
-                } else if (chunkType.equals("tRNS")) {
-                    chunk = readChunk(distream);
+                } else if (chunkType.equals(PNGChunk.ChunkType.tRNS.name())) {
+                    chunk = PNGChunk.readChunk(distream);
                     parse_tRNS_chunk(chunk);
-                } else if (chunkType.equals("zTXt")) {
-                    chunk = readChunk(distream);
+                } else if (chunkType.equals(PNGChunk.ChunkType.zTXt.name())) {
+                    chunk = PNGChunk.readChunk(distream);
                     parse_zTXt_chunk(chunk);
                 } else {
-                    chunk = readChunk(distream);
+                    chunk = PNGChunk.readChunk(distream);
                     // Output the chunk data in raw form
 
                     String type = chunk.getTypeString();
@@ -498,40 +417,6 @@ class PNGImage extends SimpleRenderedIma
         }
     }
 
-    private static String getChunkType(DataInputStream distream) {
-        try {
-            distream.mark(8);
-            /* int length = */ distream.readInt();
-            int type      =    distream.readInt();
-            distream.reset();
-
-            String typeString = "";        // todo simplify this
-            typeString += (char)(type >> 24);
-            typeString += (char)((type >> 16) & 0xff);
-            typeString += (char)((type >> 8) & 0xff);
-            typeString += (char)(type & 0xff);
-            return typeString;
-        } catch (Exception e) {
-            e.printStackTrace();
-            return null;
-        }
-    }
-
-    private static PNGChunk readChunk(DataInputStream distream) {
-        try {
-            int length = distream.readInt();
-            int type = distream.readInt();
-            byte[] data = new byte[length];
-            distream.readFully(data);
-            int crc = distream.readInt();
-
-            return new PNGChunk(length, type, data, crc);
-        } catch (Exception e) {
-            e.printStackTrace();
-            return null;
-        }
-    }
-
     private void parse_IHDR_chunk(PNGChunk chunk) {
         tileWidth = width = chunk.getInt4(0);
         tileHeight = height = chunk.getInt4(4);

Added: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryPNG.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryPNG.java?rev=1350450&view=auto
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryPNG.java (added)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryPNG.java Fri Jun 15 02:29:40 2012
@@ -0,0 +1,59 @@
+/*
+ * 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.xmlgraphics.image.loader.impl;
+
+import org.apache.xmlgraphics.image.loader.ImageFlavor;
+import org.apache.xmlgraphics.image.loader.spi.ImageLoader;
+import org.apache.xmlgraphics.util.MimeConstants;
+
+public class ImageLoaderFactoryPNG extends AbstractImageLoaderFactory {
+
+    private static final String[] MIMES = new String[] {MimeConstants.MIME_PNG};
+
+    private static final ImageFlavor[] FLAVORS = new ImageFlavor[] {ImageFlavor.RENDERED_IMAGE};
+
+    public ImageLoaderFactoryPNG() {
+        //
+    }
+
+    /** {@inheritDoc} */
+    public String[] getSupportedMIMETypes() {
+        return MIMES;
+    }
+
+    /** {@inheritDoc} */
+    public ImageFlavor[] getSupportedFlavors(String mime) {
+        if (MimeConstants.MIME_PNG.equals(mime)) {
+            return FLAVORS;
+        }
+        throw new IllegalArgumentException("Unsupported MIME type: " + mime);
+    }
+
+    /** {@inheritDoc} */
+    public ImageLoader newImageLoader(ImageFlavor targetFlavor) {
+        return new ImageLoaderPNG();
+    }
+
+    /** {@inheritDoc} */
+    public boolean isAvailable() {
+        return true;
+    }
+
+}

Modified: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryRaw.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryRaw.java?rev=1350450&r1=1350449&r2=1350450&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryRaw.java (original)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryRaw.java Fri Jun 15 02:29:40 2012
@@ -81,6 +81,8 @@ public class ImageLoaderFactoryRaw exten
     public ImageLoader newImageLoader(ImageFlavor targetFlavor) {
         if (targetFlavor.equals(ImageFlavor.RAW_JPEG)) {
             return new ImageLoaderRawJPEG();
+        } else if (targetFlavor.equals(ImageFlavor.RAW_PNG)) {
+            return new ImageLoaderRawPNG();
         } else {
             return new ImageLoaderRaw(targetFlavor);
         }

Added: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderPNG.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderPNG.java?rev=1350450&view=auto
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderPNG.java (added)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderPNG.java Fri Jun 15 02:29:40 2012
@@ -0,0 +1,75 @@
+/*
+ * 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.xmlgraphics.image.loader.impl;
+
+import java.awt.image.RenderedImage;
+import java.io.IOException;
+import java.util.Map;
+
+import javax.imageio.stream.ImageInputStream;
+import javax.xml.transform.Source;
+
+import org.apache.xmlgraphics.image.codec.png.PNGDecodeParam;
+import org.apache.xmlgraphics.image.codec.png.PNGImageDecoder;
+import org.apache.xmlgraphics.image.codec.util.ImageInputStreamSeekableStreamAdapter;
+import org.apache.xmlgraphics.image.codec.util.SeekableStream;
+import org.apache.xmlgraphics.image.loader.Image;
+import org.apache.xmlgraphics.image.loader.ImageException;
+import org.apache.xmlgraphics.image.loader.ImageFlavor;
+import org.apache.xmlgraphics.image.loader.ImageInfo;
+import org.apache.xmlgraphics.image.loader.ImageSessionContext;
+import org.apache.xmlgraphics.image.loader.util.ImageUtil;
+
+public class ImageLoaderPNG extends AbstractImageLoader {
+
+    public ImageLoaderPNG() {
+        //
+    }
+
+    /** {@inheritDoc} */
+    public Image loadImage(ImageInfo info, Map hints, ImageSessionContext session) throws ImageException,
+            IOException {
+
+        Source src = session.needSource(info.getOriginalURI());
+        ImageInputStream imgStream = ImageUtil.needImageInputStream(src);
+
+        SeekableStream seekStream = new ImageInputStreamSeekableStreamAdapter(imgStream);
+
+        PNGImageDecoder decoder = new PNGImageDecoder(seekStream, new PNGDecodeParam());
+        RenderedImage image = decoder.decodeAsRenderedImage();
+
+        // need transparency here?
+        return new ImageRendered(info, image, null);
+    }
+
+    /** {@inheritDoc} */
+    public ImageFlavor getTargetFlavor() {
+        return ImageFlavor.RENDERED_IMAGE;
+    }
+
+    /** {@inheritDoc} */
+    public int getUsagePenalty() {
+        // since this image loader does not provide any benefits over the default sun.imageio one we add
+        // some penalty to it so that it is not chosen by default; instead users need to give it a negative
+        // penalty in fop.xconf so that it is used; this image loader is mostly for testing purposes for now.
+        return 1000;
+    }
+
+}

Added: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNG.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNG.java?rev=1350450&view=auto
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNG.java (added)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNG.java Fri Jun 15 02:29:40 2012
@@ -0,0 +1,85 @@
+/*
+ * 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$ */
+
+// Original author: Matthias Reichenbacher
+
+package org.apache.xmlgraphics.image.loader.impl;
+
+import java.io.IOException;
+import java.util.Map;
+
+import javax.imageio.stream.ImageInputStream;
+import javax.xml.transform.Source;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.xmlgraphics.image.codec.util.ImageInputStreamSeekableStreamAdapter;
+import org.apache.xmlgraphics.image.codec.util.SeekableStream;
+import org.apache.xmlgraphics.image.loader.Image;
+import org.apache.xmlgraphics.image.loader.ImageException;
+import org.apache.xmlgraphics.image.loader.ImageFlavor;
+import org.apache.xmlgraphics.image.loader.ImageInfo;
+import org.apache.xmlgraphics.image.loader.ImageSessionContext;
+import org.apache.xmlgraphics.image.loader.util.ImageUtil;
+import org.apache.xmlgraphics.util.MimeConstants;
+
+public class ImageLoaderRawPNG extends AbstractImageLoader {
+
+    /** logger */
+    protected static Log log = LogFactory.getLog(ImageLoaderRawPNG.class);
+
+    /**
+     * Main constructor.
+     */
+    public ImageLoaderRawPNG() {
+    }
+
+    /** {@inheritDoc} */
+    public ImageFlavor getTargetFlavor() {
+        return ImageFlavor.RAW_PNG;
+    }
+
+    /** {@inheritDoc} */
+    public Image loadImage(ImageInfo info, Map hints, ImageSessionContext session) throws ImageException,
+            IOException {
+        if (!MimeConstants.MIME_PNG.equals(info.getMimeType())) {
+            throw new IllegalArgumentException("ImageInfo must be from a image with MIME type: "
+                    + MimeConstants.MIME_PNG);
+        }
+
+        Source src = session.needSource(info.getOriginalURI());
+        ImageInputStream in = ImageUtil.needImageInputStream(src);
+        // Remove streams as we do things with them at some later time.
+        ImageUtil.removeStreams(src);
+        SeekableStream seekStream = new ImageInputStreamSeekableStreamAdapter(in);
+        PNGFile im = new PNGFile(seekStream);
+        ImageRawPNG irpng = im.getImageRawPNG(info);
+        return irpng;
+    }
+
+    /** {@inheritDoc} */
+    public int getUsagePenalty() {
+        // since this image loader does not handle all kinds of PNG images then we add some penalty to it
+        // so that it is not chosen by default; instead, users need to give it a negative penalty in
+        // fop.xconf so that it is used
+        return 1000;
+    }
+
+}

Added: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageRawPNG.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageRawPNG.java?rev=1350450&view=auto
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageRawPNG.java (added)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageRawPNG.java Fri Jun 15 02:29:40 2012
@@ -0,0 +1,144 @@
+/*
+ * 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$ */
+
+// Original author: Matthias Reichenbacher
+
+package org.apache.xmlgraphics.image.loader.impl;
+
+import java.awt.Color;
+import java.awt.color.ColorSpace;
+import java.awt.color.ICC_Profile;
+import java.awt.image.ColorModel;
+import java.io.InputStream;
+
+import org.apache.xmlgraphics.image.loader.ImageFlavor;
+import org.apache.xmlgraphics.image.loader.ImageInfo;
+
+public class ImageRawPNG extends ImageRawStream {
+
+    private ColorModel cm;
+    private ICC_Profile iccProfile;
+    private int bitDepth;
+    private boolean isTransparent;
+    private int grayTransparentAlpha;
+    private int redTransparentAlpha;
+    private int greenTransparentAlpha;
+    private int blueTransparentAlpha;
+
+    /**
+     * Main constructor.
+     * @param info the image info object
+     * @param in the ImageInputStream with the raw content
+     * @param colorSpace the color space
+     * @param iccProfile an ICC color profile or null if no profile is associated
+     */
+    public ImageRawPNG(ImageInfo info, InputStream in, ColorModel cm, int bitDepth, ICC_Profile iccProfile) {
+        super(info, ImageFlavor.RAW_PNG, in);
+        this.iccProfile = iccProfile;
+        this.cm = cm;
+        this.bitDepth = bitDepth;
+    }
+
+    /**
+     * The bit depth of each color channel.
+     * @return the bit depth of one channel (same for all)
+     */
+    public int getBitDepth() {
+        return bitDepth;
+    }
+
+    /**
+     * Returns the ICC color profile if one is associated with the PNG image.
+     * @return the ICC color profile or null if there's no profile
+     */
+    public ICC_Profile getICCProfile() {
+        return this.iccProfile;
+    }
+
+    /**
+     * Returns the image's color model.
+     * @return the color model
+     */
+    public ColorModel getColorModel() {
+        return this.cm;
+    }
+
+    /**
+     * Returns the image's color space.
+     * @return the color space
+     */
+    public ColorSpace getColorSpace() {
+        return this.cm.getColorSpace();
+    }
+
+    /**
+     * Sets the gray transparent pixel value.
+     * @param gray the transparent pixel gray value (0...255)
+     */
+    protected void setGrayTransparentAlpha(int gray) {
+        this.isTransparent = true;
+        this.grayTransparentAlpha = gray;
+    }
+
+    /**
+     * Sets the RGB transparent pixel values.
+     * @param red the transparent pixel red value (0...255)
+     * @param green the transparent pixel green value (0...255)
+     * @param blue the transparent pixel blue value (0...255)
+     */
+    protected void setRGBTransparentAlpha(int red, int green, int blue) {
+        this.isTransparent = true;
+        this.redTransparentAlpha = red;
+        this.greenTransparentAlpha = green;
+        this.blueTransparentAlpha = blue;
+    }
+
+    /**
+     * Used to flag image as transparent when the image is of pallete type.
+     */
+    protected void setTransparent() {
+        this.isTransparent = true;
+    }
+
+    /**
+     * Whether the image is transparent (meaning there is a transparent pixel)
+     * @return true if transparent pixel exists
+     */
+    public boolean isTransparent() {
+        return this.isTransparent;
+    }
+
+    /**
+     * The color of the transparent pixel.
+     * @return the color of the transparent pixel.
+     */
+    public Color getTransparentColor() {
+        Color color = null;
+        if (!this.isTransparent) {
+            return color;
+        }
+        if (cm.getNumColorComponents() == 3) {
+            color = new Color(this.redTransparentAlpha, this.greenTransparentAlpha, this.blueTransparentAlpha);
+        } else {
+            color = new Color(this.grayTransparentAlpha, 0, 0);
+        }
+        return color;
+    }
+
+}

Added: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/PNGConstants.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/PNGConstants.java?rev=1350450&view=auto
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/PNGConstants.java (added)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/PNGConstants.java Fri Jun 15 02:29:40 2012
@@ -0,0 +1,47 @@
+/*
+ * 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.xmlgraphics.image.loader.impl;
+
+public interface PNGConstants {
+
+    /*
+     * First 8 bytes of any PNG file.
+     */
+    long PNG_SIGNATURE = 0x89504e470d0a1a0aL;
+
+    /*
+     * Color types.
+     */
+    int PNG_COLOR_GRAY = 0;
+    int PNG_COLOR_RGB = 2;
+    int PNG_COLOR_PALETTE = 3;
+    int PNG_COLOR_GRAY_ALPHA = 4;
+    int PNG_COLOR_RGB_ALPHA = 6;
+
+    /*
+     * Filter types.
+     */
+    int PNG_FILTER_NONE = 0;
+    int PNG_FILTER_SUB = 1;
+    int PNG_FILTER_UP = 2;
+    int PNG_FILTER_AVERAGE = 3;
+    int PNG_FILTER_PAETH = 4;
+
+}

Added: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/PNGFile.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/PNGFile.java?rev=1350450&view=auto
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/PNGFile.java (added)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/PNGFile.java Fri Jun 15 02:29:40 2012
@@ -0,0 +1,238 @@
+/*
+ * 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.xmlgraphics.image.loader.impl;
+
+import java.awt.color.ColorSpace;
+import java.awt.color.ICC_Profile;
+import java.awt.image.ColorModel;
+import java.awt.image.ComponentColorModel;
+import java.awt.image.DataBuffer;
+import java.awt.image.IndexColorModel;
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.SequenceInputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.xmlgraphics.image.codec.png.PNGChunk;
+import org.apache.xmlgraphics.image.codec.util.PropertyUtil;
+import org.apache.xmlgraphics.image.loader.ImageException;
+import org.apache.xmlgraphics.image.loader.ImageInfo;
+
+// CSOFF: MethodName
+
+/**
+ * Provides methods useful for processing PNG files.
+ */
+class PNGFile implements PNGConstants {
+
+    private ColorModel colorModel;
+    private ICC_Profile iccProfile;
+    private int bitDepth;
+    private int colorType;
+    private boolean isTransparent;
+    private int grayTransparentAlpha;
+    private int redTransparentAlpha;
+    private int greenTransparentAlpha;
+    private int blueTransparentAlpha;
+    private List<InputStream> streamVec = new ArrayList<InputStream>();
+    private int paletteEntries;
+    private byte[] redPalette;
+    private byte[] greenPalette;
+    private byte[] bluePalette;
+    private byte[] alphaPalette;
+    private boolean hasPalette;
+    private boolean hasAlphaPalette = false;
+
+    public PNGFile(InputStream stream) throws IOException, ImageException {
+        if (!stream.markSupported()) {
+            stream = new BufferedInputStream(stream);
+        }
+        DataInputStream distream = new DataInputStream(stream);
+        long magic = distream.readLong();
+        if (magic != PNG_SIGNATURE) {
+            String msg = PropertyUtil.getString("PNGImageDecoder0");
+            throw new ImageException(msg);
+        }
+        // only some chunks are worth parsing in the current implementation
+        do {
+            try {
+                PNGChunk chunk;
+                String chunkType = PNGChunk.getChunkType(distream);
+                if (chunkType.equals(PNGChunk.ChunkType.IHDR.name())) {
+                    chunk = PNGChunk.readChunk(distream);
+                    parse_IHDR_chunk(chunk);
+                } else if (chunkType.equals(PNGChunk.ChunkType.PLTE.name())) {
+                    chunk = PNGChunk.readChunk(distream);
+                    parse_PLTE_chunk(chunk);
+                } else if (chunkType.equals(PNGChunk.ChunkType.IDAT.name())) {
+                    chunk = PNGChunk.readChunk(distream);
+                    streamVec.add(new ByteArrayInputStream(chunk.getData()));
+                } else if (chunkType.equals(PNGChunk.ChunkType.IEND.name())) {
+                    // chunk = PNGChunk.readChunk(distream);
+                    PNGChunk.skipChunk(distream);
+                    break; // fall through to the bottom
+                } else if (chunkType.equals(PNGChunk.ChunkType.tRNS.name())) {
+                    chunk = PNGChunk.readChunk(distream);
+                    parse_tRNS_chunk(chunk);
+                } else {
+                    // chunk = PNGChunk.readChunk(distream);
+                    PNGChunk.skipChunk(distream);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                String msg = PropertyUtil.getString("PNGImageDecoder2");
+                throw new RuntimeException(msg);
+            }
+        } while (true);
+    }
+
+    public ImageRawPNG getImageRawPNG(ImageInfo info) throws ImageException {
+        InputStream seqStream = new SequenceInputStream(Collections.enumeration(streamVec));
+        switch (colorType) {
+        case PNG_COLOR_GRAY:
+            if (hasPalette) {
+                throw new ImageException("Corrupt PNG: color palette is not allowed!");
+            }
+            colorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), false, false,
+                    ColorModel.OPAQUE, DataBuffer.TYPE_BYTE);
+            break;
+        case PNG_COLOR_RGB:
+            // actually a check of the sRGB chunk would be necessary to confirm if it's really sRGB
+            colorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), false, false,
+                    ColorModel.OPAQUE, DataBuffer.TYPE_BYTE);
+            break;
+        case PNG_COLOR_PALETTE:
+            if (hasAlphaPalette) {
+                colorModel = new IndexColorModel(bitDepth, paletteEntries, redPalette, greenPalette,
+                        bluePalette, alphaPalette);
+            } else {
+                colorModel = new IndexColorModel(bitDepth, paletteEntries, redPalette, greenPalette,
+                        bluePalette);
+            }
+            break;
+        case PNG_COLOR_GRAY_ALPHA:
+            if (hasPalette) {
+                throw new ImageException("Corrupt PNG: color palette is not allowed!");
+            }
+            colorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), true, false,
+                    ColorModel.TRANSLUCENT, DataBuffer.TYPE_BYTE);
+            break;
+        case PNG_COLOR_RGB_ALPHA:
+            // actually a check of the sRGB chunk would be necessary to confirm if it's really sRGB
+            colorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), true, false,
+                    ColorModel.TRANSLUCENT, DataBuffer.TYPE_BYTE);
+            break;
+        default:
+            throw new ImageException("Unsupported color type: " + colorType);
+        }
+        // the iccProfile is still null for now
+        ImageRawPNG rawImage = new ImageRawPNG(info, seqStream, colorModel, bitDepth, iccProfile);
+        if (isTransparent) {
+            if (colorType == PNG_COLOR_GRAY) {
+                rawImage.setGrayTransparentAlpha(grayTransparentAlpha);
+            } else if (colorType == PNG_COLOR_RGB) {
+                rawImage.setRGBTransparentAlpha(redTransparentAlpha, greenTransparentAlpha,
+                        blueTransparentAlpha);
+            } else if (colorType == PNG_COLOR_PALETTE) {
+                rawImage.setTransparent();
+            } else {
+                //
+            }
+        }
+        return rawImage;
+    }
+
+    private void parse_IHDR_chunk(PNGChunk chunk) {
+        int width = chunk.getInt4(0);
+        int height = chunk.getInt4(4);
+        bitDepth = chunk.getInt1(8);
+        if (bitDepth != 8) {
+            // this is a limitation of the current implementation
+            throw new RuntimeException("Unsupported bit depth: " + bitDepth);
+        }
+        colorType = chunk.getInt1(9);
+        int compressionMethod = chunk.getInt1(10);
+        if (compressionMethod != 0) {
+            throw new RuntimeException("Unsupported PNG compression method: " + compressionMethod);
+        }
+        int filterMethod = chunk.getInt1(11);
+        if (filterMethod != 0) {
+            throw new RuntimeException("Unsupported PNG filter method: " + filterMethod);
+        }
+        int interlaceMethod = chunk.getInt1(12);
+        if (interlaceMethod != 0) {
+            // this is a limitation of the current implementation
+            throw new RuntimeException("Unsupported PNG interlace method: " + interlaceMethod);
+        }
+    }
+
+    private void parse_PLTE_chunk(PNGChunk chunk) {
+        paletteEntries = chunk.getLength() / 3;
+        redPalette = new byte[paletteEntries];
+        greenPalette = new byte[paletteEntries];
+        bluePalette = new byte[paletteEntries];
+        hasPalette = true;
+
+        int pltIndex = 0;
+        for (int i = 0; i < paletteEntries; i++) {
+            redPalette[i] = chunk.getByte(pltIndex++);
+            greenPalette[i] = chunk.getByte(pltIndex++);
+            bluePalette[i] = chunk.getByte(pltIndex++);
+        }
+    }
+
+    private void parse_tRNS_chunk(PNGChunk chunk) {
+        if (colorType == PNG_COLOR_PALETTE) {
+            int entries = chunk.getLength();
+            if (entries > paletteEntries) {
+                // Error -- mustn't have more alpha than RGB palette entries
+                String msg = PropertyUtil.getString("PNGImageDecoder14");
+                throw new RuntimeException(msg);
+            }
+            // Load beginning of palette from the chunk
+            alphaPalette = new byte[paletteEntries];
+            for (int i = 0; i < entries; i++) {
+                alphaPalette[i] = chunk.getByte(i);
+            }
+            // Fill rest of palette with 255
+            for (int i = entries; i < paletteEntries; i++) {
+                alphaPalette[i] = (byte) 255;
+            }
+            hasAlphaPalette = true;
+        } else if (colorType == PNG_COLOR_GRAY) {
+            grayTransparentAlpha = chunk.getInt2(0);
+        } else if (colorType == PNG_COLOR_RGB) {
+            redTransparentAlpha = chunk.getInt2(0);
+            greenTransparentAlpha = chunk.getInt2(2);
+            blueTransparentAlpha = chunk.getInt2(4);
+        } else if (colorType == PNG_COLOR_GRAY_ALPHA || colorType == PNG_COLOR_RGB_ALPHA) {
+            // Error -- GA or RGBA image can't have a tRNS chunk.
+            String msg = PropertyUtil.getString("PNGImageDecoder15");
+            throw new RuntimeException(msg);
+        }
+        isTransparent = true;
+    }
+
+}

Modified: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/PSImageUtils.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/PSImageUtils.java?rev=1350450&r1=1350449&r2=1350450&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/PSImageUtils.java (original)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/PSImageUtils.java Fri Jun 15 02:29:40 2012
@@ -143,25 +143,23 @@ public class PSImageUtils {
 
     /**
      * Writes a bitmap image to the PostScript stream.
-     * @param img the bitmap image as a byte array
+     * @param encoder the image encoder
+     * @param imgDim the dimensions of the image
+     * @param imgDescription the name of the image
      * @param targetRect the target rectangle to place the image in
+     * @param colorModel the color model of the image
      * @param gen the PostScript generator
      * @throws IOException In case of an I/O exception
      */
-    private static void writeImage(RenderedImage img,
-            Rectangle2D targetRect, PSGenerator gen) throws IOException {
-        ImageEncoder encoder = ImageEncodingHelper.createRenderedImageEncoder(img);
-        String imgDescription = img.getClass().getName();
+    public static void writeImage(ImageEncoder encoder, Dimension imgDim, String imgDescription,
+            Rectangle2D targetRect, ColorModel colorModel, PSGenerator gen)
+            throws IOException {
 
         gen.saveGraphicsState();
         translateAndScale(gen, null, targetRect);
-
         gen.commentln("%AXGBeginBitmap: " + imgDescription);
-
         gen.writeln("{{");
-        // Template: (RawData is used for the EOF signal only)
-        // gen.write("/RawData currentfile <first filter> filter def");
-        // gen.write("/Data RawData <second filter> <third filter> [...] def");
+
         String implicitFilter = encoder.getImplicitFilter();
         if (implicitFilter != null) {
             gen.writeln("/RawData currentfile /ASCII85Decode filter def");
@@ -175,11 +173,15 @@ public class PSImageUtils {
                 gen.writeln("/Data RawData /RunLengthDecode filter def");
             }
         }
+
         PSDictionary imageDict = new PSDictionary();
         imageDict.put("/DataSource", "Data");
-        writeImageCommand(img, imageDict, gen);
 
-        /* the following two lines could be enabled if something still goes wrong
+        populateImageDictionary(imgDim, colorModel, imageDict);
+        writeImageCommand(imageDict, colorModel, gen);
+
+        /*
+         * the following two lines could be enabled if something still goes wrong
          * gen.write("Data closefile");
          * gen.write("RawData flushfile");
          */
@@ -189,43 +191,40 @@ public class PSImageUtils {
 
         compressAndWriteBitmap(encoder, gen);
 
-        gen.writeln("");
+        gen.newLine();
         gen.commentln("%AXGEndBitmap");
         gen.restoreGraphicsState();
     }
 
-    private static ColorModel populateImageDictionary(
-                ImageEncodingHelper helper, PSDictionary imageDict) {
-        RenderedImage img = helper.getImage();
-        String w = Integer.toString(img.getWidth());
-        String h = Integer.toString(img.getHeight());
+    private static ColorModel populateImageDictionary(Dimension imgDim, ColorModel colorModel,
+            PSDictionary imageDict) {
+        String w = Integer.toString(imgDim.width);
+        String h = Integer.toString(imgDim.height);
         imageDict.put("/ImageType", "1");
         imageDict.put("/Width", w);
         imageDict.put("/Height", h);
 
-        ColorModel cm = helper.getEncodedColorModel();
-
         boolean invertColors = false;
-        String decodeArray = getDecodeArray(cm.getNumComponents(), invertColors);
-        int bitsPerComp = cm.getComponentSize(0);
+        String decodeArray = getDecodeArray(colorModel.getNumColorComponents(), invertColors);
+        int bitsPerComp = colorModel.getComponentSize(0);
 
         // Setup scanning for left-to-right and top-to-bottom
         imageDict.put("/ImageMatrix", "[" + w + " 0 0 " + h + " 0 0]");
 
-        if ((cm instanceof IndexColorModel)) {
-            IndexColorModel im = (IndexColorModel)cm;
-            int c = im.getMapSize();
+        if ((colorModel instanceof IndexColorModel)) {
+            IndexColorModel indexColorModel = (IndexColorModel) colorModel;
+            int c = indexColorModel.getMapSize();
             int hival = c - 1;
             if (hival > 4095) {
                 throw new UnsupportedOperationException("hival must not go beyond 4095");
             }
-            bitsPerComp = im.getPixelSize();
-            int ceiling = ((int)Math.pow(2, bitsPerComp)) - 1;
+            bitsPerComp = indexColorModel.getPixelSize();
+            int ceiling = ((int) Math.pow(2, bitsPerComp)) - 1;
             decodeArray = "[0 " + ceiling + "]";
         }
         imageDict.put("/BitsPerComponent", Integer.toString(bitsPerComp));
         imageDict.put("/Decode", decodeArray);
-        return cm;
+        return colorModel;
     }
 
     private static String getDecodeArray(int numComponents, boolean invertColors) {
@@ -288,8 +287,9 @@ public class PSImageUtils {
             PSDictionary imageDict, PSGenerator gen) throws IOException {
         ImageEncodingHelper helper = new ImageEncodingHelper(img, true);
         ColorModel cm = helper.getEncodedColorModel();
-        populateImageDictionary(helper, imageDict);
+        Dimension imgDim = new Dimension(img.getWidth(), img.getHeight());
 
+        populateImageDictionary(imgDim, cm, imageDict);
         writeImageCommand(imageDict, cm, gen);
     }
 
@@ -345,7 +345,13 @@ public class PSImageUtils {
                 float x, float y, float w, float h, PSGenerator gen)
                     throws IOException {
         Rectangle2D targetRect = new Rectangle2D.Double(x, y, w, h);
-        writeImage(img, targetRect, gen);
+        ImageEncoder encoder = ImageEncodingHelper.createRenderedImageEncoder(img);
+        Dimension imgDim = new Dimension(img.getWidth(), img.getHeight());
+        String imgDescription = img.getClass().getName();
+        ImageEncodingHelper helper = new ImageEncodingHelper(img);
+        ColorModel cm = helper.getEncodedColorModel();
+
+        writeImage(encoder, imgDim, imgDescription, targetRect, cm, gen);
     }
 
     /**

Modified: xmlgraphics/commons/trunk/src/resources/META-INF/services/org.apache.xmlgraphics.image.loader.spi.ImageLoaderFactory
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/resources/META-INF/services/org.apache.xmlgraphics.image.loader.spi.ImageLoaderFactory?rev=1350450&r1=1350449&r2=1350450&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/resources/META-INF/services/org.apache.xmlgraphics.image.loader.spi.ImageLoaderFactory (original)
+++ xmlgraphics/commons/trunk/src/resources/META-INF/services/org.apache.xmlgraphics.image.loader.spi.ImageLoaderFactory Fri Jun 15 02:29:40 2012
@@ -2,4 +2,5 @@ org.apache.xmlgraphics.image.loader.impl
 org.apache.xmlgraphics.image.loader.impl.ImageLoaderFactoryRaw
 org.apache.xmlgraphics.image.loader.impl.ImageLoaderFactoryRawCCITTFax
 org.apache.xmlgraphics.image.loader.impl.ImageLoaderFactoryEPS
-org.apache.xmlgraphics.image.loader.impl.ImageLoaderFactoryInternalTIFF
\ No newline at end of file
+org.apache.xmlgraphics.image.loader.impl.ImageLoaderFactoryInternalTIFF
+org.apache.xmlgraphics.image.loader.impl.ImageLoaderFactoryPNG
\ No newline at end of file

Modified: xmlgraphics/commons/trunk/status.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/status.xml?rev=1350450&r1=1350449&r2=1350450&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/status.xml (original)
+++ xmlgraphics/commons/trunk/status.xml Fri Jun 15 02:29:40 2012
@@ -41,6 +41,9 @@
   </contexts>
   <changes>
     <release version="Trunk" date="n/a">
+      <action context="Code" dev="GA" type="fix" fixes-bug="53408" due-to="Luis Bernardo, Matthias Reischenbacher">
+        Add two PNG image loaders, one using internal XGC PNG code, the other using an externally supplied IDAT chunk (for raw decoding).
+      </action>
       <action context="Code" dev="GA" type="update" fixes-bug="53327" due-to="Julien Aymé">
         Fix corner cases involving long/double conversion and rounding error in double division when rounding 5E-N for certain N.
       </action>

Added: xmlgraphics/commons/trunk/test/images/basi2c08.png
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/images/basi2c08.png?rev=1350450&view=auto
==============================================================================
Files xmlgraphics/commons/trunk/test/images/basi2c08.png (added) and xmlgraphics/commons/trunk/test/images/basi2c08.png Fri Jun 15 02:29:40 2012 differ

Added: xmlgraphics/commons/trunk/test/images/basn0g08.png
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/images/basn0g08.png?rev=1350450&view=auto
==============================================================================
Files xmlgraphics/commons/trunk/test/images/basn0g08.png (added) and xmlgraphics/commons/trunk/test/images/basn0g08.png Fri Jun 15 02:29:40 2012 differ

Added: xmlgraphics/commons/trunk/test/images/basn2c08.png
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/images/basn2c08.png?rev=1350450&view=auto
==============================================================================
Files xmlgraphics/commons/trunk/test/images/basn2c08.png (added) and xmlgraphics/commons/trunk/test/images/basn2c08.png Fri Jun 15 02:29:40 2012 differ

Added: xmlgraphics/commons/trunk/test/images/basn3p08.png
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/images/basn3p08.png?rev=1350450&view=auto
==============================================================================
Files xmlgraphics/commons/trunk/test/images/basn3p08.png (added) and xmlgraphics/commons/trunk/test/images/basn3p08.png Fri Jun 15 02:29:40 2012 differ

Added: xmlgraphics/commons/trunk/test/images/basn4a08.png
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/images/basn4a08.png?rev=1350450&view=auto
==============================================================================
Files xmlgraphics/commons/trunk/test/images/basn4a08.png (added) and xmlgraphics/commons/trunk/test/images/basn4a08.png Fri Jun 15 02:29:40 2012 differ

Added: xmlgraphics/commons/trunk/test/images/basn6a08.png
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/images/basn6a08.png?rev=1350450&view=auto
==============================================================================
Files xmlgraphics/commons/trunk/test/images/basn6a08.png (added) and xmlgraphics/commons/trunk/test/images/basn6a08.png Fri Jun 15 02:29:40 2012 differ

Added: xmlgraphics/commons/trunk/test/images/f00n2c08.png
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/images/f00n2c08.png?rev=1350450&view=auto
==============================================================================
Files xmlgraphics/commons/trunk/test/images/f00n2c08.png (added) and xmlgraphics/commons/trunk/test/images/f00n2c08.png Fri Jun 15 02:29:40 2012 differ

Added: xmlgraphics/commons/trunk/test/images/f04n2c08.png
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/images/f04n2c08.png?rev=1350450&view=auto
==============================================================================
Files xmlgraphics/commons/trunk/test/images/f04n2c08.png (added) and xmlgraphics/commons/trunk/test/images/f04n2c08.png Fri Jun 15 02:29:40 2012 differ

Added: xmlgraphics/commons/trunk/test/images/pp0n6a08.png
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/images/pp0n6a08.png?rev=1350450&view=auto
==============================================================================
Files xmlgraphics/commons/trunk/test/images/pp0n6a08.png (added) and xmlgraphics/commons/trunk/test/images/pp0n6a08.png Fri Jun 15 02:29:40 2012 differ

Added: xmlgraphics/commons/trunk/test/images/tbbn3p08.png
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/images/tbbn3p08.png?rev=1350450&view=auto
==============================================================================
Files xmlgraphics/commons/trunk/test/images/tbbn3p08.png (added) and xmlgraphics/commons/trunk/test/images/tbbn3p08.png Fri Jun 15 02:29:40 2012 differ

Added: xmlgraphics/commons/trunk/test/images/tbrn2c08.png
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/images/tbrn2c08.png?rev=1350450&view=auto
==============================================================================
Files xmlgraphics/commons/trunk/test/images/tbrn2c08.png (added) and xmlgraphics/commons/trunk/test/images/tbrn2c08.png Fri Jun 15 02:29:40 2012 differ

Modified: xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/ImageLoaderTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/ImageLoaderTestCase.java?rev=1350450&r1=1350449&r2=1350450&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/ImageLoaderTestCase.java (original)
+++ xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/ImageLoaderTestCase.java Fri Jun 15 02:29:40 2012
@@ -34,6 +34,9 @@ import javax.xml.transform.stream.Stream
 import junit.framework.TestCase;
 
 import org.apache.commons.io.IOUtils;
+
+import org.apache.xmlgraphics.image.loader.impl.ImageLoaderPNG;
+import org.apache.xmlgraphics.image.loader.impl.ImageLoaderRawPNG;
 import org.apache.xmlgraphics.image.loader.impl.ImageRawStream;
 import org.apache.xmlgraphics.image.loader.impl.ImageRendered;
 import org.apache.xmlgraphics.image.loader.spi.ImageImplRegistry;
@@ -186,11 +189,15 @@ public class ImageLoaderTestCase extends
             String mime, ImageFlavor rawFlavor) throws Exception {
         ImageLoaderFactory ilfs[] = ImageImplRegistry.getDefaultInstance()
                 .getImageLoaderFactories(mime);
-        if (ilfs != null)
+        if (ilfs != null) {
             for (int i = 0; i < ilfs.length; i++) {
                 ImageLoaderFactory ilf = ilfs[i];
                 try {
                     final ImageLoader il = ilf.newImageLoader(rawFlavor);
+                    if (il instanceof ImageLoaderRawPNG || il instanceof ImageLoaderPNG) {
+                        // temporary measure until ImageLoaderRawPNG and ImageLoader PNG handle ICC profiles
+                        continue;
+                    }
                     final ImageInfo im = new ImageInfo(uri, mime);
                     final Image img = il.loadImage(im, isc);
                     final ICC_Profile icc = img.getICCProfile();
@@ -203,8 +210,7 @@ public class ImageLoaderTestCase extends
                     // Ignore. This imageLoader does not support RAW
                 }
                 try {
-                    final ImageLoader il = ilf
-                            .newImageLoader(ImageFlavor.BUFFERED_IMAGE);
+                    final ImageLoader il = ilf.newImageLoader(ImageFlavor.BUFFERED_IMAGE);
                     final ImageInfo im = new ImageInfo(uri, mime);
                     final Image img = il.loadImage(im, isc);
                     final ICC_Profile icc = img.getICCProfile();
@@ -213,6 +219,7 @@ public class ImageLoaderTestCase extends
                     // Ignore. This imageLoader does not support Buffered.
                 }
             }
+        }
     }
 
     public void testBrokenIccPng() throws Exception {

Added: xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryPNGTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryPNGTestCase.java?rev=1350450&view=auto
==============================================================================
--- xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryPNGTestCase.java (added)
+++ xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryPNGTestCase.java Fri Jun 15 02:29:40 2012
@@ -0,0 +1,64 @@
+/*
+ * 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.xmlgraphics.image.loader.impl;
+
+import org.junit.Test;
+
+import org.apache.xmlgraphics.image.loader.ImageFlavor;
+import org.apache.xmlgraphics.image.loader.spi.ImageLoader;
+import org.apache.xmlgraphics.util.MimeConstants;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+public class ImageLoaderFactoryPNGTestCase {
+
+    private ImageLoaderFactoryPNG ilfpng = new ImageLoaderFactoryPNG();
+
+    @Test
+    public void testGetSupportedMIMETypes() {
+        assertArrayEquals(new String[] {MimeConstants.MIME_PNG}, ilfpng.getSupportedMIMETypes());
+    }
+
+    @Test
+    public void testGetSupportedFlavors() {
+        assertArrayEquals(new ImageFlavor[] {ImageFlavor.RENDERED_IMAGE},
+                ilfpng.getSupportedFlavors(MimeConstants.MIME_PNG));
+        try {
+            ilfpng.getSupportedFlavors(MimeConstants.MIME_JPEG);
+            fail("An exception should have been thrown above....");
+        } catch (IllegalArgumentException e) {
+            // do nothing; this is expected
+        }
+    }
+
+    @Test
+    public void testNewImageLoader() {
+        ImageLoader il = ilfpng.newImageLoader(ImageFlavor.RENDERED_IMAGE);
+        assertTrue(il instanceof ImageLoaderPNG);
+    }
+
+    @Test
+    public void testIsAvailable() {
+        assertTrue(ilfpng.isAvailable());
+    }
+
+}

Added: xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderPNGTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderPNGTestCase.java?rev=1350450&view=auto
==============================================================================
--- xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderPNGTestCase.java (added)
+++ xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderPNGTestCase.java Fri Jun 15 02:29:40 2012
@@ -0,0 +1,62 @@
+/*
+ * 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.xmlgraphics.image.loader.impl;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+import org.apache.xmlgraphics.image.loader.Image;
+import org.apache.xmlgraphics.image.loader.ImageContext;
+import org.apache.xmlgraphics.image.loader.ImageException;
+import org.apache.xmlgraphics.image.loader.ImageFlavor;
+import org.apache.xmlgraphics.image.loader.ImageInfo;
+import org.apache.xmlgraphics.image.loader.ImageSessionContext;
+import org.apache.xmlgraphics.image.loader.MockImageContext;
+import org.apache.xmlgraphics.image.loader.MockImageSessionContext;
+import org.apache.xmlgraphics.util.MimeConstants;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ImageLoaderPNGTestCase {
+
+    private ImageLoaderPNG ilpng = new ImageLoaderPNG();
+
+    @Test
+    public void testGetUsagePenalty() {
+        assertEquals(1000, ilpng.getUsagePenalty());
+    }
+
+    @Test
+    public void testLoadImageImageInfoMapImageSessionContext() throws ImageException, IOException {
+        ImageContext context = MockImageContext.newSafeInstance();
+        ImageSessionContext session = new MockImageSessionContext(context);
+        ImageInfo info = new ImageInfo("basn2c08.png", MimeConstants.MIME_PNG);
+        Image im = ilpng.loadImage(info, null, session);
+        assertTrue(im instanceof ImageRendered);
+    }
+
+    @Test
+    public void testGetTargetFlavor() {
+        assertEquals(ImageFlavor.RENDERED_IMAGE, ilpng.getTargetFlavor());
+    }
+
+}

Added: xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNGTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNGTestCase.java?rev=1350450&view=auto
==============================================================================
--- xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNGTestCase.java (added)
+++ xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNGTestCase.java Fri Jun 15 02:29:40 2012
@@ -0,0 +1,76 @@
+/*
+ * 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.xmlgraphics.image.loader.impl;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+import org.apache.xmlgraphics.image.loader.Image;
+import org.apache.xmlgraphics.image.loader.ImageContext;
+import org.apache.xmlgraphics.image.loader.ImageException;
+import org.apache.xmlgraphics.image.loader.ImageFlavor;
+import org.apache.xmlgraphics.image.loader.ImageInfo;
+import org.apache.xmlgraphics.image.loader.ImageSessionContext;
+import org.apache.xmlgraphics.image.loader.MockImageContext;
+import org.apache.xmlgraphics.image.loader.MockImageSessionContext;
+import org.apache.xmlgraphics.util.MimeConstants;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+public class ImageLoaderRawPNGTestCase {
+
+    private ImageLoaderRawPNG ilrpng = new ImageLoaderRawPNG();
+
+    @Test
+    public void testGetUsagePenalty() {
+        assertEquals(1000, ilrpng.getUsagePenalty());
+    }
+
+    @Test
+    public void testLoadImageBadMime() throws ImageException, IOException {
+        ImageContext context = MockImageContext.newSafeInstance();
+        ImageSessionContext session = new MockImageSessionContext(context);
+        ImageInfo info = new ImageInfo("basn2c08.png", MimeConstants.MIME_JPEG);
+        try {
+            ImageRawPNG irpng = (ImageRawPNG) ilrpng.loadImage(info, null, session);
+            fail("An exception should have been thrown above");
+        } catch (IllegalArgumentException e) {
+            // do nothing; this was expected
+        }
+    }
+
+    @Test
+    public void testGetTargetFlavor() {
+        assertEquals(ImageFlavor.RAW_PNG, ilrpng.getTargetFlavor());
+    }
+
+    @Test
+    public void testLoadImageGoodMime() throws ImageException, IOException {
+        ImageContext context = MockImageContext.newSafeInstance();
+        ImageSessionContext session = new MockImageSessionContext(context);
+        ImageInfo info = new ImageInfo("basn2c08.png", MimeConstants.MIME_PNG);
+        Image im = ilrpng.loadImage(info, null, session);
+        assertTrue(im instanceof ImageRawPNG);
+    }
+
+}

Added: xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/PNGFileTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/PNGFileTestCase.java?rev=1350450&view=auto
==============================================================================
--- xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/PNGFileTestCase.java (added)
+++ xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/image/loader/impl/PNGFileTestCase.java Fri Jun 15 02:29:40 2012
@@ -0,0 +1,119 @@
+/*
+ * 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.xmlgraphics.image.loader.impl;
+
+import java.awt.image.ColorModel;
+import java.awt.image.ComponentColorModel;
+import java.awt.image.IndexColorModel;
+import java.io.IOException;
+
+import org.junit.Test;
+
+import org.apache.xmlgraphics.image.loader.ImageContext;
+import org.apache.xmlgraphics.image.loader.ImageException;
+import org.apache.xmlgraphics.image.loader.ImageInfo;
+import org.apache.xmlgraphics.image.loader.ImageSessionContext;
+import org.apache.xmlgraphics.image.loader.MockImageContext;
+import org.apache.xmlgraphics.image.loader.MockImageSessionContext;
+import org.apache.xmlgraphics.util.MimeConstants;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+public class PNGFileTestCase implements PNGConstants {
+
+    @Test
+    public void testColorTypeTwoPNG() throws ImageException, IOException {
+        testColorTypePNG("basn2c08.png", PNG_COLOR_RGB);
+    }
+
+    @Test
+    public void testColorTypeZeroPNG() throws ImageException, IOException {
+        testColorTypePNG("basn0g08.png", PNG_COLOR_GRAY);
+    }
+
+    @Test
+    public void testColorTypeSixPNG() throws ImageException, IOException {
+        testColorTypePNG("basn6a08.png", PNG_COLOR_RGB_ALPHA);
+    }
+
+    @Test
+    public void testColorTypeThreePNG() throws ImageException, IOException {
+        testColorTypePNG("basn3p08.png", PNG_COLOR_PALETTE);
+    }
+
+    @Test
+    public void testColorTypeFourPNG() throws ImageException, IOException {
+        testColorTypePNG("basn4a08.png", PNG_COLOR_GRAY_ALPHA);
+    }
+
+    @Test
+    public void testTransparentPNG() throws ImageException, IOException {
+        testColorTypePNG("tbbn3p08.png", PNG_COLOR_PALETTE, true);
+        testColorTypePNG("tbrn2c08.png", PNG_COLOR_RGB, true);
+    }
+
+    @Test
+    public void testCorruptPNG() {
+        ImageContext context = MockImageContext.newSafeInstance();
+        ImageSessionContext session = new MockImageSessionContext(context);
+        ImageInfo info = new ImageInfo("corrupt-image.png", MimeConstants.MIME_PNG);
+        ImageLoaderRawPNG ilrpng = new ImageLoaderRawPNG();
+        try {
+            ImageRawPNG irpng = (ImageRawPNG) ilrpng.loadImage(info, null, session);
+            fail("An exception should have been thrown above");
+        } catch (Exception e) {
+            // do nothing; this was expected
+        }
+    }
+
+    private void testColorTypePNG(String imageName, int colorType) throws ImageException, IOException {
+        testColorTypePNG(imageName, colorType, false);
+    }
+
+    private void testColorTypePNG(String imageName, int colorType, boolean isTransparent)
+            throws ImageException, IOException {
+        ImageContext context = MockImageContext.newSafeInstance();
+        ImageSessionContext session = new MockImageSessionContext(context);
+        ImageInfo info = new ImageInfo(imageName, MimeConstants.MIME_PNG);
+        ImageLoaderRawPNG ilrpng = new ImageLoaderRawPNG();
+        ImageRawPNG irpng = (ImageRawPNG) ilrpng.loadImage(info, null, session);
+        ColorModel cm = irpng.getColorModel();
+        if (colorType == PNG_COLOR_PALETTE) {
+            assertTrue(cm instanceof IndexColorModel);
+        } else {
+            assertTrue(cm instanceof ComponentColorModel);
+            int numComponents = 3;
+            if (colorType == PNG_COLOR_GRAY) {
+                numComponents = 1;
+            } else if (colorType == PNG_COLOR_GRAY_ALPHA) {
+                numComponents = 2;
+            } else if (colorType == PNG_COLOR_RGB_ALPHA) {
+                numComponents = 4;
+            }
+            assertEquals(numComponents, cm.getNumComponents());
+        }
+        if (isTransparent) {
+            assertTrue(irpng.isTransparent());
+        }
+    }
+
+}

Modified: xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/java2d/ps/PSGraphics2DTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/java2d/ps/PSGraphics2DTestCase.java?rev=1350450&r1=1350449&r2=1350450&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/java2d/ps/PSGraphics2DTestCase.java (original)
+++ xmlgraphics/commons/trunk/test/java/org/apache/xmlgraphics/java2d/ps/PSGraphics2DTestCase.java Fri Jun 15 02:29:40 2012
@@ -1,6 +1,5 @@
 /*
  * 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



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