Sorry, sent the last mail prematurely by accident,
Here is a patch for the bug:

--- PNGImageEncoder.java        2003-11-11 08:37:21.000000000 +0100
+++ org/apache/batik/ext/awt/image/codec/PNGImageEncoder.java   2003-11-11
15:21:52.000000000 +0100
@@ -296,6 +296,7 @@
     private int colorType;
 
     private int bpp; // bytes per pixel, rounded up
+    private int upShift[]; // channel left-shifts
 
     private boolean skipAlpha = false;
     private boolean compressGray = false;
@@ -421,7 +422,8 @@
                 for (int s = xOffset; s < numSamples; s += xSkip) {
                     for (int b = 0; b < numBands; b++) {
                         currRow[count++] =
-                            (byte)clamp(samples[s + b] >> bitShift,
maxValue);
+                           (byte)clamp((samples[s + b] << upShift[b]) >> bitShift,
+                                       maxValue);
                     }
                 }
                 break;
@@ -429,7 +431,7 @@
             case 16:
                 for (int s = xOffset; s < numSamples; s += xSkip) {
                     for (int b = 0; b < numBands; b++) {
-                        int val = clamp(samples[s + b] >> bitShift,
maxValue);
+                        int val = clamp((samples[s + b] << upShift[b])
>> bitShift, maxValue);
                         currRow[count++] = (byte)(val >> 8);
                         currRow[count++] = (byte)(val & 0xff);
                     }
@@ -850,6 +852,7 @@
         SampleModel sampleModel = image.getSampleModel();
 
         int[] sampleSize = sampleModel.getSampleSize();
+       this.upShift = new int[sampleSize.length];
 
         // Set bitDepth to a sentinel value
         this.bitDepth = -1;
@@ -872,12 +875,6 @@
             // Get bit depth from channel 0 of the image
 
             this.bitDepth = sampleSize[0];
-            // Ensure all channels have the same bit depth
-            for (int i = 1; i < sampleSize.length; i++) {
-                if (sampleSize[i] != bitDepth) {
-                    throw new RuntimeException();
-                }
-            }
 
             // Round bit depth up to a power of 2
             if (bitDepth > 2 && bitDepth < 4) {
@@ -889,6 +886,17 @@
             } else if (bitDepth > 16) {
                 throw new RuntimeException();
             }
+
+            // Ensure all channels have the same bit depth if 1,2,4
bits,
+           // set the left-shifts corresponding to the rounded-up bit depths 
+            for (int i = 0; i < sampleSize.length; i++) {
+               if(sampleSize[i] != sampleSize[0] && bitDepth < 8)
+                   throw new RuntimeException();
+                else if (bitDepth-sampleSize[i] < 0)
+                   throw new RuntimeException();
+               else upShift[i] = (bitDepth-sampleSize[i]);
+            }
+           
         }
 
         this.numBands = sampleModel.getNumBands();



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to