You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xmlgraphics.apache.org by ma...@apache.org on 2009/07/27 13:09:23 UTC

svn commit: r798100 - /xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/imageio/ImageLoaderImageIO.java

Author: maxberger
Date: Mon Jul 27 11:09:22 2009
New Revision: 798100

URL: http://svn.apache.org/viewvc?rev=798100&view=rev
Log:
Add tests for providers known not to apply the ICC Profile

Modified:
    xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/imageio/ImageLoaderImageIO.java

Modified: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/imageio/ImageLoaderImageIO.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/imageio/ImageLoaderImageIO.java?rev=798100&r1=798099&r2=798100&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/imageio/ImageLoaderImageIO.java (original)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/imageio/ImageLoaderImageIO.java Mon Jul 27 11:09:22 2009
@@ -28,8 +28,11 @@
 import java.awt.image.RenderedImage;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.util.HashSet;
 import java.util.Iterator;
+import java.util.Locale;
 import java.util.Map;
+import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.zip.DataFormatException;
 import java.util.zip.Inflater;
@@ -38,10 +41,10 @@
 import javax.imageio.ImageIO;
 import javax.imageio.ImageReadParam;
 import javax.imageio.ImageReader;
-import javax.imageio.ImageTypeSpecifier;
 import javax.imageio.metadata.IIOMetadata;
 import javax.imageio.metadata.IIOMetadataFormatImpl;
 import javax.imageio.metadata.IIOMetadataNode;
+import javax.imageio.spi.IIOServiceProvider;
 import javax.imageio.stream.ImageInputStream;
 import javax.xml.transform.Source;
 
@@ -72,6 +75,8 @@
     
     private static final String JPEG_METADATA_NODE = "javax_imageio_jpeg_image_1.0";
 
+    private static final Set providersIgnoringICC = new HashSet();
+    
     /**
      * Main constructor.
      * @param targetFlavor the target flavor
@@ -98,6 +103,7 @@
         IIOMetadata iiometa = (IIOMetadata)info.getCustomObjects().get(
                 ImageIOUtil.IMAGEIO_METADATA);
         boolean ignoreMetadata = (iiometa != null);
+        boolean providerIgnoresICC = false;
 
         Source src = session.needSource(info.getOriginalURI());
         ImageInputStream imgStream = ImageUtil.needImageInputStream(src);
@@ -123,6 +129,8 @@
                         if (iiometa == null) {
                             iiometa = reader.getImageMetadata(pageIndex);
                         }
+                        providerIgnoresICC = checkProviderIgnoresICC(reader
+                                .getOriginatingProvider());
                         break; //Quit early, we have the image
                     } catch (IndexOutOfBoundsException indexe) {
                         throw new ImageException("Page does not exist. Invalid image index: "
@@ -197,7 +205,9 @@
                         }
                     }
                 }
-                iccProf = tryToExctractICCProfile(iiometa);
+                if (providerIgnoresICC) {
+                    iccProf = tryToExctractICCProfile(iiometa);
+                }
             }
         }
 
@@ -209,6 +219,27 @@
     }
 
     /**
+     * Checks if the provider ignores the ICC color profile. This method will
+     * assume providers work correctly, and return false if the provider is
+     * unknown. This ensures backward-compatibility.
+     * 
+     * @param provider
+     *            the ImageIO Provider
+     * @return true if we know the provider to be broken and ignore ICC
+     *         profiles.
+     */
+    private boolean checkProviderIgnoresICC(IIOServiceProvider provider) {
+        // TODO: This information could be cached.
+        StringBuffer b = new StringBuffer(provider.getDescription(Locale.ENGLISH));
+        b.append('/').append(provider.getVendorName());
+        b.append('/').append(provider.getVersion());
+        if (log.isDebugEnabled()) {
+            log.debug("Image Provider: " + b.toString());
+        }
+        return ImageLoaderImageIO.providersIgnoringICC.contains(b.toString());
+    }
+
+    /**
      * Extract ICC Profile from ImageIO Metadata. This method currently only
      * supports PNG and JPEG metadata.
      * 
@@ -313,5 +344,18 @@
         return bi;
     }
 
-
+    static {
+        // TODO: This list could be kept in a resource file.
+        providersIgnoringICC
+                .add("Java Advanced Imaging Image I/O Tools natively-accelerated PNG Image Reader/"
+                        + "Sun Microsystems, Inc./" + "1.1");
+        providersIgnoringICC
+                .add("Java Advanced Imaging Image I/O Tools natively-accelerated JPEG Image Reader/"
+                        + "Sun Microsystems, Inc./" + "1.1");
+
+        providersIgnoringICC
+                .add("Standard PNG image reader/Sun Microsystems, Inc./1.0");
+        providersIgnoringICC
+                .add("Standard JPEG Image Reader/Sun Microsystems, Inc./0.5");
+    }
 }



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