JDK-4809676 : PNGDecoder does not handle indexed images with less than 8 bits per pixel
  • Type: Bug
  • Component: client-libs
  • Sub-Component: 2d
  • Affected Version:
    1.3.0,1.3.1,1.4.0,1.4.1,1.4.1_01,1.4.2 1.3.0,1.3.1,1.4.0,1.4.1,1.4.1_01,1.4.2
  • Priority: P4
  • Status: Resolved
  • Resolution: Fixed
  • OS:
    generic,linux,solaris_7,solaris_8,windows_nt,windows_2000,windows_xp generic,linux,solaris_7,solaris_8,windows_nt,windows_2000,windows_xp
  • CPU: generic,x86,sparc
  • Submitted: 2003-01-29
  • Updated: 2003-04-21
  • Resolved: 2003-04-21
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
Other
5.0 tigerFixed
Related Reports
Duplicate :  
Duplicate :  
Relates :  
Description

Name: jk109818			Date: 01/28/2003


FULL PRODUCT VERSION :
java version "1.4.0_01"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0_01-b03)
Java HotSpot(TM) Client VM (build 1.4.0_01-b03, mixed mode)

FULL OPERATING SYSTEM VERSION :
Microsoft Windows 2000 [Version 5.00.2195]

A DESCRIPTION OF THE PROBLEM :
The current PNG decoder processes images with 4bpp
incorrectly. Actually I found this problem when using J2ME
PBP 1.0, and also found the same problem occurring in J2SE
1.4.1_01. So I'll describe the problem based on the source
code that comes with J2ME PBP 1.0.

In the source code of sun.awt.image.PNGImageDecoder, please
see 436 line. Near the end of the line, ... &7 is present.
Actually 7 should have been 15. Otherwise, some PNG images
with bitdepth 4 won't be decoded correctly. Showing
incorrect colors.

case 4:
  bPixels[col+rowOffset] = (byte)((rowByteBuffer[spos>>1]>>
((1-(spos&1))*4))&7); // --> Replace &7 to &15
  spos++;
  break;


STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Please execute the class the source of which is included
below. Then an image file named 'a.png' will be created in
the directory where you run the class.

Try to display the image on screen using some appropriate
code. You may use FileChooserDemo included in J2SDK with
preview on.

EXPECTED VERSUS ACTUAL BEHAVIOR :
The arrow is yellow, and there are some very dark grey
shadow around it. But when seen with Java, the shadow
becomes yellow.


REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
import java.io.*;

public class ImageWriter {

    public static byte[] data = {
(byte) 0x89, (byte) 0x50, (byte) 0x4e, (byte) 0x47, (byte) 0xd, (byte) 0xa,
(byte) 0x1a, (byte) 0xa, (byte) 0x0,
(byte) 0x0, (byte) 0x0, (byte) 0xd, (byte) 0x49, (byte) 0x48, (byte) 0x44,
(byte) 0x52, (byte) 0x0,
(byte) 0x0, (byte) 0x0, (byte) 0x33, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte)
0x36, (byte) 0x4,
(byte) 0x3, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x98, (byte) 0x42,
(byte) 0xbc, (byte) 0xaa,
(byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x3, (byte) 0x73, (byte) 0x42,
(byte) 0x49, (byte) 0x54,
(byte) 0x8, (byte) 0x8, (byte) 0x8, (byte) 0xdb, (byte) 0xe1, (byte) 0x4f,
(byte) 0xe0, (byte) 0x0,
(byte) 0x0, (byte) 0x0, (byte) 0x2a, (byte) 0x50, (byte) 0x4c, (byte) 0x54,
(byte) 0x45, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xdf, (byte) 0x0, (byte) 0xbf,
(byte) 0xdf, (byte) 0x0,
(byte) 0xbf, (byte) 0xbf, (byte) 0x0, (byte) 0xbf, (byte) 0x9f, (byte) 0x0,
(byte) 0x7f, (byte) 0x9f,
(byte) 0x0, (byte) 0x7f, (byte) 0x7f, (byte) 0x0, (byte) 0x7f, (byte) 0x5f,
(byte) 0x0, (byte) 0x55,
(byte) 0x55, (byte) 0x55, (byte) 0x3f, (byte) 0x5f, (byte) 0x0, (byte) 0x3f,
(byte) 0x3f, (byte) 0x0,
(byte) 0x2a, (byte) 0x2a, (byte) 0x2a, (byte) 0x0, (byte) 0x1f, (byte) 0x0,
(byte) 0x0, (byte) 0x0,
(byte) 0x0, (byte) 0x1b, (byte) 0xdb, (byte) 0x78, (byte) 0x80, (byte) 0x0,
(byte) 0x0, (byte) 0x0,
(byte) 0xe, (byte) 0x74, (byte) 0x52, (byte) 0x4e, (byte) 0x53, (byte) 0x0,
(byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0x57, (byte) 0x4a, (byte) 0xdb,
(byte) 0x14, (byte) 0x0,
(byte) 0x0, (byte) 0x0, (byte) 0x9, (byte) 0x70, (byte) 0x48, (byte) 0x59,
(byte) 0x73, (byte) 0x0,
(byte) 0x0, (byte) 0xa, (byte) 0xf0, (byte) 0x0, (byte) 0x0, (byte) 0xa, (byte)
0xf0, (byte) 0x1,
(byte) 0x42, (byte) 0xac, (byte) 0x34, (byte) 0x98, (byte) 0x0, (byte) 0x0,
(byte) 0x0, (byte) 0x16,
(byte) 0x74, (byte) 0x45, (byte) 0x58, (byte) 0x74, (byte) 0x43, (byte) 0x72,
(byte) 0x65, (byte) 0x61,
(byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x20, (byte) 0x54,
(byte) 0x69, (byte) 0x6d,
(byte) 0x65, (byte) 0x0, (byte) 0x30, (byte) 0x33, (byte) 0x2f, (byte) 0x30,
(byte) 0x37, (byte) 0x2f,
(byte) 0x30, (byte) 0x31, (byte) 0xc5, (byte) 0xe5, (byte) 0xf5, (byte) 0xd2,
(byte) 0x0, (byte) 0x0,
(byte) 0x0, (byte) 0x21, (byte) 0x74, (byte) 0x45, (byte) 0x58, (byte) 0x74,
(byte) 0x53, (byte) 0x6f,
(byte) 0x66, (byte) 0x74, (byte) 0x77, (byte) 0x61, (byte) 0x72, (byte) 0x65,
(byte) 0x0, (byte) 0x4d,
(byte) 0x61, (byte) 0x63, (byte) 0x72, (byte) 0x6f, (byte) 0x6d, (byte) 0x65,
(byte) 0x64, (byte) 0x69,
(byte) 0x61, (byte) 0x20, (byte) 0x46, (byte) 0x69, (byte) 0x72, (byte) 0x65,
(byte) 0x77, (byte) 0x6f,
(byte) 0x72, (byte) 0x6b, (byte) 0x73, (byte) 0x20, (byte) 0x33, (byte) 0x2e,
(byte) 0x30, (byte) 0xef,
(byte) 0x69, (byte) 0x31, (byte) 0xf0, (byte) 0x0, (byte) 0x0, (byte) 0x1,
(byte) 0xb3, (byte) 0x49,
(byte) 0x44, (byte) 0x41, (byte) 0x54, (byte) 0x78, (byte) 0x9c, (byte) 0xcd,
(byte) 0xd3, (byte) 0xcd,
(byte) 0x4a, (byte) 0xc3, (byte) 0x40, (byte) 0x10, (byte) 0x7, (byte) 0xf0,
(byte) 0x5e, (byte) 0x94,
(byte) 0x42, (byte) 0x4e, (byte) 0x43, (byte) 0x14, (byte) 0xbc, (byte) 0x1a,
(byte) 0xf1, (byte) 0x1,
(byte) 0xca, (byte) 0x34, (byte) 0x45, (byte) 0xf4, (byte) 0x24, (byte) 0x86,
(byte) 0xa0, (byte) 0xc7,
(byte) 0xa2, (byte) 0xed, (byte) 0xc5, (byte) 0x4b, (byte) 0xad, (byte) 0xb8,
(byte) 0x45, (byte) 0x7b,
(byte) 0xb7, (byte) 0xf8, (byte) 0x71, (byte) 0xa8, (byte) 0xf4, (byte) 0xe8,
(byte) 0x1b, (byte) 0xf8,
(byte) 0x71, (byte) 0x15, (byte) 0x31, (byte) 0xd, (byte) 0x14, (byte) 0xac,
(byte) 0xa5, (byte) 0x65,
(byte) 0xf0, (byte) 0x2c, (byte) 0x68, (byte) 0x7d, (byte) 0x1, (byte) 0x6b,
(byte) 0xde, (byte) 0xc5,
(byte) 0xec, (byte) 0x6e, (byte) 0xd2, (byte) 0x24, (byte) 0x3a, (byte) 0xbd,
(byte) 0xbb, (byte) 0xa7,
(byte) 0x2c, (byte) 0x3f, (byte) 0xe6, (byte) 0xbf, (byte) 0xbb, (byte) 0xb3,
(byte) 0x9b, (byte) 0x5c,
(byte) 0xee, (byte) 0xff, (byte) 0x8d, (byte) 0x72, (byte) 0x6d, (byte) 0x96,
(byte) 0xe4, (byte) 0x61,
(byte) 0x69, (byte) 0x16, (byte) 0x3d, (byte) 0x83, (byte) 0x49, (byte) 0xc4,
(byte) 0xd3, (byte) 0x1,
(byte) 0x40, (byte) 0x8d, (byte) 0xa7, (byte) 0xfc, (byte) 0x32, (byte) 0xc0,
(byte) 0x1a, (byte) 0xf5,
(byte) 0x38, (byte) 0x7a, (byte) 0x1, (byte) 0xb0, (byte) 0x56, (byte) 0xf9,
(byte) 0xc4, (byte) 0x2b,
(byte) 0x0, (byte) 0x13, (byte) 0x2f, (byte) 0xb8, (byte) 0x32, (byte) 0xa3,
(byte) 0x0, (byte) 0x88,
(byte) 0xb8, (byte) 0xce, (byte) 0xd1, (byte) 0x3c, (byte) 0x60, (byte) 0xd1,
(byte) 0x71, (byte) 0x5c,
(byte) 0x2e, (byte) 0xb1, (byte) 0xbe, (byte) 0xe2, (byte) 0x8, (byte) 0x21,
(byte) 0x8e, (byte) 0xb8,
(byte) 0xc4, (byte) 0x5d, (byte) 0x5b, (byte) 0xb4, (byte) 0x5a, (byte) 0x2d,
(byte) 0xd1, (byte) 0x64,
(byte) 0x68, (byte) 0x70, (byte) 0xf3, (byte) 0x34, (byte) 0x1e, (byte) 0x8f,
(byte) 0xdf, (byte) 0x3d,
(byte) 0x26, (byte) 0x90, (byte) 0x28, (byte) 0x50, (byte) 0xe3, (byte) 0xf1,
(byte) 0xb7, (byte) 0xd,
(byte) 0x7b, (byte) 0x31, (byte) 0x61, (byte) 0x33, (byte) 0x9b, (byte) 0x68,
(byte) 0x60, (byte) 0x3b,
(byte) 0x26, (byte) 0x58, (byte) 0x6c, (byte) 0x67, (byte) 0xb7, (byte) 0x7,
(byte) 0xd7, (byte) 0xa4,
(byte) 0x8d, (byte) 0x0, (byte) 0x4a, (byte) 0xe9, (byte) 0xb2, (byte) 0xe,
(byte) 0x98, (byte) 0x92,
(byte) 0xd4, (byte) 0x0, (byte) 0x80, (byte) 0xed, (byte) 0x44, (byte) 0xe6,
(byte) 0xc2, (byte) 0x16,
(byte) 0xdd, (byte) 0xa6, (byte) 0xc8, (byte) 0x6c, (byte) 0xc6, (byte) 0x92,
(byte) 0x2f, (byte) 0x84,
(byte) 0x33, (byte) 0x2f, (byte) 0xa6, (byte) 0xb0, (byte) 0xff, (byte) 0xb0,
(byte) 0x70, (byte) 0x1d,
(byte) 0x6d, (byte) 0xa1, (byte) 0x1c, (byte) 0x4e, (byte) 0x6c, (byte) 0x2f,
(byte) 0xea, (byte) 0x90,
(byte) 0xb1, (byte) 0xc, (byte) 0x96, (byte) 0x85, (byte) 0x25, (byte) 0x52,
(byte) 0x27, (byte) 0xaf,
(byte) 0xcb, (byte) 0x8, (byte) 0xdb, (byte) 0x4f, (byte) 0xc8, (byte) 0x44,
(byte) 0xc7, (byte) 0xd1,
(byte) 0x27, (byte) 0x97, (byte) 0x84, (byte) 0xa5, (byte) 0x14, (byte) 0xa1,
(byte) 0x2b, (byte) 0x8e,
(byte) 0x75, (byte) 0xd5, (byte) 0x30, (byte) 0xbc, (byte) 0xb, (byte) 0x74,
(byte) 0xfd, (byte) 0x49,
(byte) 0x44, (byte) 0xd6, (byte) 0x8a, (byte) 0x2b, (byte) 0xce, (byte) 0x3c,
(byte) 0x4d, (byte) 0x34,
(byte) 0xd8, (byte) 0xca, (byte) 0x92, (byte) 0x38, (byte) 0xeb, (byte) 0x6,
(byte) 0x13, (byte) 0x4d,
(byte) 0xf4, (byte) 0xb0, (byte) 0xe7, (byte) 0xa4, (byte) 0xc8, (byte) 0x6e,
(byte) 0x74, (byte) 0x83,
(byte) 0x29, (byte) 0x7d, (byte) 0x9f, (byte) 0x56, (byte) 0xaa, (byte) 0x53,
(byte) 0xc2, (byte) 0xea,
(byte) 0x79, (byte) 0x90, (byte) 0x50, (byte) 0xf0, (byte) 0x25, (byte) 0xc4,
(byte) 0x94, (byte) 0x8a,
(byte) 0xd, (byte) 0x5f, (byte) 0xf6, (byte) 0x2b, (byte) 0xa2, (byte) 0xd7,
(byte) 0xe0, (byte) 0x2d,
(byte) 0xa1, (byte) 0xca, (byte) 0xa5, (byte) 0x6a, (byte) 0xa5, (byte) 0x9a,
(byte) 0x19, (byte) 0xb2,
(byte) 0xaf, (byte) 0xf, (byte) 0x53, (byte) 0x1a, (byte) 0x7d, (byte) 0x2a,
(byte) 0xd1, (byte) 0x97,
(byte) 0xad, (byte) 0x7b, (byte) 0x1e, (byte) 0x9f, (byte) 0x8b, (byte) 0xd4,
(byte) 0x4a, (byte) 0x11,
(byte) 0xa9, (byte) 0xc8, (byte) 0x84, (byte) 0x5e, (byte) 0xe3, (byte) 0x95,
(byte) 0xa2, (byte) 0x48,
(byte) 0x39, (byte) 0xfe, (byte) 0x7c, (byte) 0x27, (byte) 0xf3, (byte) 0x5c,
(byte) 0x14, (byte) 0x91,
(byte) 0x16, (byte) 0x45, (byte) 0x9b, (byte) 0xa0, (byte) 0xc6, (byte) 0x6,
(byte) 0x11, (byte) 0x65,
(byte) 0xde, (byte) 0x5b, (byte) 0x68, (byte) 0x65, (byte) 0x25, (byte) 0xe6,
(byte) 0x7e, (byte) 0xb6,
(byte) 0x48, (byte) 0x59, (byte) 0x47, (byte) 0x89, (byte) 0xed, (byte) 0xd1,
(byte) 0xdf, (byte) 0x37,
(byte) 0x2a, (byte) 0xef, (byte) 0x1a, (byte) 0x8a, (byte) 0x3b, (byte) 0xbf,
(byte) 0x6b, (byte) 0xd4,
(byte) 0xf2, (byte) 0xf5, (byte) 0xf0, (byte) 0x76, (byte) 0xab, (byte) 0x77,
(byte) 0x1f, (byte) 0x1c,
(byte) 0xf5, (byte) 0x11, (byte) 0xed, (byte) 0xc6, (byte) 0x67, (byte) 0xc0,
(byte) 0xd1, (byte) 0x8,
(byte) 0xb1, (byte) 0x7a, (byte) 0x12, (byte) 0xb0, (byte) 0x44, (byte) 0x87,
(byte) 0x45, (byte) 0xe1,
(byte) 0xcb, (byte) 0x1e, (byte) 0x31, (byte) 0xd4, (byte) 0x77, (byte) 0xc2,
(byte) 0xbc, (byte) 0x9,
(byte) 0xf3, (byte) 0x13, (byte) 0x19, (byte) 0x34, (byte) 0xd2, (byte) 0x79,
(byte) 0xcc, (byte) 0x1f,
(byte) 0x4b, (byte) 0x24, (byte) 0xee, (byte) 0xd9, (byte) 0xa5, (byte) 0x24,
(byte) 0xd, (byte) 0xf8,
(byte) 0xbc, (byte) 0xe8, (byte) 0x4a, (byte) 0xd9, (byte) 0x3c, (byte) 0xf5,
(byte) 0x48, (byte) 0xb8,
(byte) 0xfd, (byte) 0x69, (byte) 0xa2, (byte) 0x19, (byte) 0x45, (byte) 0xfa,
(byte) 0xd6, (byte) 0x12,
(byte) 0xfa, (byte) 0x1, (byte) 0xeb, (byte) 0xdc, (byte) 0x37, (byte) 0x13,
(byte) 0xe3, (byte) 0x93,
(byte) 0x67, (byte) 0xb7, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0,
(byte) 0x49, (byte) 0x45,
(byte) 0x4e, (byte) 0x44, (byte) 0xae, (byte) 0x42, (byte) 0x60, (byte) 0x82
    };

    public static void main(String[] args) throws IOException {
        FileOutputStream out = new FileOutputStream("a.png");
        out.write(data);
        out.close();
    }
}

---------- END SOURCE ----------
(Review ID: 179425) 
======================================================================

Comments
CONVERTED DATA BugTraq+ Release Management Values COMMIT TO FIX: tiger FIXED IN: tiger INTEGRATED IN: tiger tiger-b05
21-08-2004

EVALUATION See test cases in 4826548, 4830492. ###@###.### 2003-03-11
11-03-2003