You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xmlgraphics.apache.org by ss...@apache.org on 2022/10/06 12:37:37 UTC

svn commit: r1904425 - in /xmlgraphics/commons/trunk/src: main/java/org/apache/xmlgraphics/image/loader/impl/ main/java/org/apache/xmlgraphics/image/loader/impl/imageio/ main/java/org/apache/xmlgraphics/image/loader/spi/ test/java/org/apache/xmlgraphic...

Author: ssteiner
Date: Thu Oct  6 12:37:37 2022
New Revision: 1904425

URL: http://svn.apache.org/viewvc?rev=1904425&view=rev
Log:
XGC-132: Fallback to raw png if ImageIO cannot read image

Modified:
    xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryRaw.java
    xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNG.java
    xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/impl/imageio/PreloaderImageIO.java
    xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/spi/ImageImplRegistry.java
    xmlgraphics/commons/trunk/src/test/java/org/apache/xmlgraphics/image/loader/CorruptImagesTestCase.java
    xmlgraphics/commons/trunk/src/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNGTestCase.java

Modified: xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryRaw.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryRaw.java?rev=1904425&r1=1904424&r2=1904425&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryRaw.java (original)
+++ xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderFactoryRaw.java Thu Oct  6 12:37:37 2022
@@ -19,8 +19,18 @@
 
 package org.apache.xmlgraphics.image.loader.impl;
 
+import java.util.Map;
+
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.metadata.IIOMetadataNode;
+
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
 import org.apache.xmlgraphics.image.loader.ImageFlavor;
+import org.apache.xmlgraphics.image.loader.ImageInfo;
 import org.apache.xmlgraphics.image.loader.spi.ImageLoader;
+import org.apache.xmlgraphics.image.loader.util.Penalty;
 import org.apache.xmlgraphics.util.MimeConstants;
 
 /**
@@ -93,4 +103,34 @@ public class ImageLoaderFactoryRaw exten
         return true;
     }
 
+    @Override
+    public boolean isSupported(ImageInfo imageInfo) {
+        if ("image/png".equals(imageInfo.getMimeType())) {
+            Map additionalPenalties = (Map) imageInfo.getCustomObjects().get("additionalPenalties");
+            int penalty = 0;
+            Penalty penaltyObj = ((Penalty)additionalPenalties.get(ImageLoaderRawPNG.class.getName()));
+            if (penaltyObj != null) {
+                penalty = penaltyObj.getValue();
+            }
+            IIOMetadata metadata = (IIOMetadata) imageInfo.getCustomObjects().get(IIOMetadata.class);
+            if (metadata != null) {
+                IIOMetadataNode children = (IIOMetadataNode)metadata.getAsTree("javax_imageio_png_1.0").getChildNodes();
+                NamedNodeMap attr = children.getElementsByTagName("IHDR").item(0).getAttributes();
+                String bitDepth = attr.getNamedItem("bitDepth").getNodeValue();
+                String interlaceMethod = attr.getNamedItem("interlaceMethod").getNodeValue();
+                String colorType = attr.getNamedItem("colorType").getNodeValue();
+                if (!bitDepth.equals("8") || !interlaceMethod.equals("none")
+                        || ((colorType.equals("RGBAlpha") || colorType.equals("GrayAlpha")) && penalty >= 0)) {
+                    return false;
+                }
+                children = (IIOMetadataNode)metadata.getAsTree("javax_imageio_1.0").getChildNodes();
+                Node numChannels = children.getElementsByTagName("NumChannels").item(0);
+                String numChannelsStr = numChannels.getAttributes().getNamedItem("value").getNodeValue();
+                if ("4".equals(numChannelsStr) && "Palette".equals(colorType) && penalty >= 0) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
 }

Modified: xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNG.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNG.java?rev=1904425&r1=1904424&r2=1904425&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNG.java (original)
+++ xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNG.java Thu Oct  6 12:37:37 2022
@@ -74,13 +74,4 @@ public class ImageLoaderRawPNG extends A
         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;
-    }
-
 }

Modified: xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/impl/imageio/PreloaderImageIO.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/impl/imageio/PreloaderImageIO.java?rev=1904425&r1=1904424&r2=1904425&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/impl/imageio/PreloaderImageIO.java (original)
+++ xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/impl/imageio/PreloaderImageIO.java Thu Oct  6 12:37:37 2022
@@ -52,6 +52,7 @@ public class PreloaderImageIO extends Ab
             return null;
         }
         ImageInputStream in = ImageUtil.needImageInputStream(src);
+        long startPos = in.getStreamPosition();
         Iterator iter = ImageIO.getImageReaders(in);
         if (!iter.hasNext()) {
             return null;
@@ -85,15 +86,8 @@ public class PreloaderImageIO extends Ab
         }
 
         if (iiometa == null) {
-            if (firstIOException == null) {
-                throw new ImageException("Could not extract image metadata");
-            } else {
-                throw new ImageException("I/O error while extracting image metadata"
-                        + (firstIOException.getMessage() != null
-                            ? ": " + firstIOException.getMessage()
-                            : ""),
-                        firstIOException);
-            }
+            in.seek(startPos);
+            return null;
         }
 
         //Resolution (first a default, then try to read the metadata)

Modified: xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/spi/ImageImplRegistry.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/spi/ImageImplRegistry.java?rev=1904425&r1=1904424&r2=1904425&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/spi/ImageImplRegistry.java (original)
+++ xmlgraphics/commons/trunk/src/main/java/org/apache/xmlgraphics/image/loader/spi/ImageImplRegistry.java Thu Oct  6 12:37:37 2022
@@ -322,6 +322,7 @@ public class ImageImplRegistry {
     public ImageLoaderFactory[] getImageLoaderFactories(ImageInfo imageInfo, ImageFlavor flavor) {
         String mime = imageInfo.getMimeType();
         Collection matches = new java.util.TreeSet(new ImageLoaderFactoryComparator(flavor));
+        imageInfo.getCustomObjects().put("additionalPenalties", additionalPenalties);
         Map flavorMap = (Map) loaders.get(mime);
         if (flavorMap != null) {
             for (Object i : flavorMap.entrySet()) {

Modified: xmlgraphics/commons/trunk/src/test/java/org/apache/xmlgraphics/image/loader/CorruptImagesTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/test/java/org/apache/xmlgraphics/image/loader/CorruptImagesTestCase.java?rev=1904425&r1=1904424&r2=1904425&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/test/java/org/apache/xmlgraphics/image/loader/CorruptImagesTestCase.java (original)
+++ xmlgraphics/commons/trunk/src/test/java/org/apache/xmlgraphics/image/loader/CorruptImagesTestCase.java Thu Oct  6 12:37:37 2022
@@ -21,8 +21,7 @@ package org.apache.xmlgraphics.image.loa
 
 import org.junit.Test;
 
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
+import static org.junit.Assert.assertEquals;
 
 /**
  * Tests for error behaviour with corrupt images.
@@ -38,13 +37,8 @@ public class CorruptImagesTestCase {
         ImageSessionContext sessionContext = imageContext.newSessionContext();
         ImageManager manager = imageContext.getImageManager();
 
-        try {
-            manager.preloadImage(uri, sessionContext);
-            fail("Expected an ImageException!");
-        } catch (Exception ie) {
-            //Expected exception
-            assertNotNull(ie.getMessage());
-        }
+        ImageInfo imageInfo = manager.preloadImage(uri, sessionContext);
+        assertEquals(imageInfo.getMimeType(), "image/png");
     }
 
 }

Modified: xmlgraphics/commons/trunk/src/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNGTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNGTestCase.java?rev=1904425&r1=1904424&r2=1904425&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNGTestCase.java (original)
+++ xmlgraphics/commons/trunk/src/test/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderRawPNGTestCase.java Thu Oct  6 12:37:37 2022
@@ -48,7 +48,7 @@ public class ImageLoaderRawPNGTestCase {
 
     @Test
     public void testGetUsagePenalty() {
-        assertEquals(1000, ilrpng.getUsagePenalty());
+        assertEquals(0, ilrpng.getUsagePenalty());
     }
 
     @Test



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