1:
37:
38: package ;
39:
40: import ;
41: import ;
42:
43:
46: public class PNGPalette extends PNGChunk
47: {
48: private int[] red,green,blue;
49:
50: protected PNGPalette( int type, byte[] data, int crc ) throws PNGException
51: {
52: super( type, data, crc );
53: double l = data.length;
54: l /= 3.0;
55:
56: if( l - Math.floor(l) != 0.0 )
57: throw new PNGException("Invalid size of palette chunk.");
58: int nEntries = (int)l;
59:
60: red = new int[ nEntries ];
61: green = new int[ nEntries ];
62: blue = new int[ nEntries ];
63: for( int i = 0; i < nEntries; i++ )
64: {
65: red[i] = (data[ i * 3 ] & 0xFF);
66: green[i] = (data[ i * 3 + 1 ] & 0xFF);
67: blue[i] = (data[ i * 3 + 2] & 0xFF);
68: }
69: }
70:
71: public PNGPalette( IndexColorModel cm )
72: {
73: super( TYPE_PALETTE );
74: int n = cm.getMapSize();
75: data = new byte[ n * 3 ];
76: red = new int[ n ];
77: green = new int[ n ];
78: blue = new int[ n ];
79: for(int i = 0; i < n; i++ )
80: {
81: red[i] = data[i * 3] = (byte)cm.getRed(i);
82: green[i] = data[i * 3 + 1] = (byte)cm.getGreen(i);
83: blue[i] = data[i * 3 + 2] = (byte)cm.getBlue(i);
84: }
85: }
86:
87: public IndexColorModel getPalette( ColorSpace cs )
88: {
89: int nc = red.length;
90: byte[] r = new byte[nc];
91: byte[] g = new byte[nc];
92: byte[] b = new byte[nc];
93:
94: if( cs == null )
95: {
96: for(int i = 0; i < nc; i ++ )
97: {
98: r[i] = (byte)red[i];
99: g[i] = (byte)green[i];
100: b[i] = (byte)blue[i];
101: }
102: }
103: else
104: {
105: for(int i = 0; i < nc; i ++ )
106: {
107: float[] in = new float[3];
108: in[0] = (((float)red[i]) / 255f);
109: in[1] = (((float)green[i]) / 255f);
110: in[2] = (((float)blue[i]) / 255f);
111: float[] out = cs.toRGB( in );
112: r[i] = (byte)( Math.round(out[0] * 255.0) );
113: g[i] = (byte)( Math.round(out[1] * 255.0) );
114: b[i] = (byte)( Math.round(out[2] * 255.0) );
115: }
116: }
117: return new IndexColorModel(8, nc, r, g, b);
118: }
119:
120: public String toString()
121: {
122: String s = "PNG Palette:\n";
123: for( int i = 0; i < red.length; i++)
124: s = s + "Index " + i + ": ["+ red[i] +", "+green[i]+", "+blue[i]+"]\n";
125: return s;
126: }
127: }