You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by da...@apache.org on 2013/02/01 06:48:54 UTC

svn commit: r1441320 - in /commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png: PngWriter.java transparencyfilters/TransparencyFilterIndexedColor.java

Author: damjan
Date: Fri Feb  1 05:48:54 2013
New Revision: 1441320

URL: http://svn.apache.org/viewvc?rev=1441320&view=rev
Log:
Fix writing transparent color-index PNGs.


Modified:
    commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/PngWriter.java
    commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/transparencyfilters/TransparencyFilterIndexedColor.java

Modified: commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/PngWriter.java
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/PngWriter.java?rev=1441320&r1=1441319&r2=1441320&view=diff
==============================================================================
--- commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/PngWriter.java (original)
+++ commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/PngWriter.java Fri Feb  1 05:48:54 2013
@@ -30,6 +30,7 @@ import org.apache.commons.imaging.PixelD
 import org.apache.commons.imaging.common.ZLibUtils;
 import org.apache.commons.imaging.palette.Palette;
 import org.apache.commons.imaging.palette.PaletteFactory;
+import org.apache.commons.imaging.palette.SimplePalette;
 import org.apache.commons.imaging.util.Debug;
 import org.apache.commons.imaging.util.ParamMap;
 import org.apache.commons.imaging.util.UnicodeUtils;
@@ -342,6 +343,42 @@ public class PngWriter implements PngCon
         return result;
     }
 
+    /// Wraps a palette by adding a single transparent entry at index 0.
+    private static class TransparentPalette extends Palette {
+        private final Palette palette;
+        
+        TransparentPalette(Palette palette) {
+            this.palette = palette;
+        }
+        
+        @Override
+        public int getEntry(int index) {
+            if (index == 0) {
+                return 0x00000000;
+            } else {
+                return palette.getEntry(index - 1);
+            }
+        }
+        
+        @Override
+        public int length() {
+            return 1 + palette.length();
+        }
+        
+        @Override
+        public int getPaletteIndex(int rgb) throws ImageWriteException {
+            if (rgb == 0x00000000) {
+                return 0;
+            } else {
+                int index = palette.getPaletteIndex(rgb);
+                if (index >= 0) {
+                    return 1 + index;
+                } else {
+                    return index;
+                }
+            }
+        }
+    }
     /*
      between two chunk types indicates alternatives.
      Table 5.3 - Chunk ordering rules
@@ -489,13 +526,20 @@ public class PngWriter implements PngCon
 
             final int max_colors = hasAlpha ? 255 : 256;
 
-            palette = new PaletteFactory().makeQuantizedRgbPalette(src, max_colors);
+            PaletteFactory paletteFactory = new PaletteFactory();
+            palette = paletteFactory.makeQuantizedRgbPalette(src, max_colors);
             // Palette palette2 = new PaletteFactory().makePaletteSimple(src,
             // max_colors);
 
             // palette.dump();
 
-            writeChunkPLTE(os, palette);
+            if (hasAlpha) {
+                palette = new TransparentPalette(palette);
+                writeChunkPLTE(os, palette);                
+                writeChunkTRNS(os, new SimplePalette(new int[] { 0x00000000 }));
+            } else {
+                writeChunkPLTE(os, palette);
+            }
         }
 
         final Object pixelDensityObj = params.get(PARAM_KEY_PIXEL_DENSITY);
@@ -559,8 +603,12 @@ public class PngWriter implements PngCon
                         final int argb = row[x];
 
                         if (palette != null) {
-                            final int index = palette.getPaletteIndex(argb);
-                            baos.write(0xff & index);
+                            if (hasAlpha && (argb >>> 24) == 0x00) {
+                                baos.write(0);
+                            } else {
+                                final int index = palette.getPaletteIndex(argb);
+                                baos.write(0xff & index);
+                            }
                         } else {
                             final int alpha = 0xff & (argb >> 24);
                             final int red = 0xff & (argb >> 16);

Modified: commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/transparencyfilters/TransparencyFilterIndexedColor.java
URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/transparencyfilters/TransparencyFilterIndexedColor.java?rev=1441320&r1=1441319&r2=1441320&view=diff
==============================================================================
--- commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/transparencyfilters/TransparencyFilterIndexedColor.java (original)
+++ commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/png/transparencyfilters/TransparencyFilterIndexedColor.java Fri Feb  1 05:48:54 2013
@@ -26,8 +26,6 @@ public class TransparencyFilterIndexedCo
         super(bytes);
     }
 
-    int count = 0;
-
     @Override
     public int filter(final int rgb, final int index) throws ImageReadException,
             IOException {
@@ -44,9 +42,6 @@ public class TransparencyFilterIndexedCo
         final int alpha = bytes[index];
         final int result = ((0xff & alpha) << 24) | (0x00ffffff & rgb);
 
-        if ((count < 100) && (index > 0)) {
-            count++;
-        }
         return result;
     }
 }