Mercurial > projects > dwt-linux
annotate dwt/internal/image/PngPlteChunk.d @ 240:ce446666f5a2
Update to SWT 3.4M7
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Mon, 12 May 2008 19:13:01 +0200 |
parents | 380bad9f6852 |
children | c0d810de7093 |
rev | line source |
---|---|
152
17f8449522fd
overloads second walkthrough
Frank Benoit <benoit@tionex.de>
parents:
131
diff
changeset
|
1 /******************************************************************************* |
14 | 2 * Copyright (c) 2000, 2006 IBM Corporation and others. |
3 * All rights reserved. This program and the accompanying materials | |
4 * are made available under the terms of the Eclipse Public License v1.0 | |
5 * which accompanies this distribution, and is available at | |
6 * http://www.eclipse.org/legal/epl-v10.html | |
7 * | |
8 * Contributors: | |
9 * IBM Corporation - initial API and implementation | |
108 | 10 * Port to the D programming language: |
11 * Frank Benoit <benoit@tionex.de> | |
14 | 12 *******************************************************************************/ |
13 module dwt.internal.image.PngPlteChunk; | |
14 | |
238 | 15 import dwt.dwthelper.utils; |
16 | |
14 | 17 |
71 | 18 import dwt.DWT; |
14 | 19 import dwt.graphics.PaletteData; |
20 import dwt.graphics.RGB; | |
21 import dwt.internal.image.PngChunk; | |
22 import dwt.internal.image.PngFileReadState; | |
23 import dwt.internal.image.PngIhdrChunk; | |
24 | |
25 import tango.text.convert.Format; | |
26 | |
27 class PngPlteChunk : PngChunk { | |
28 | |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
29 int paletteSize; |
14 | 30 |
31 this(PaletteData palette) { | |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
32 super(palette.getRGBs().length * 3); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
33 paletteSize = length / 3; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
34 setType(TYPE_PLTE); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
35 setPaletteData(palette); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
36 setCRC(computeCRC()); |
14 | 37 } |
38 | |
39 this(byte[] reference){ | |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
40 super(reference); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
41 paletteSize = length / 3; |
14 | 42 } |
43 | |
152
17f8449522fd
overloads second walkthrough
Frank Benoit <benoit@tionex.de>
parents:
131
diff
changeset
|
44 override int getChunkType() { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
45 return CHUNK_PLTE; |
14 | 46 } |
47 | |
48 /** | |
49 * Get the number of colors in this palette. | |
50 */ | |
51 int getPaletteSize() { | |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
52 return paletteSize; |
14 | 53 } |
54 | |
55 /** | |
56 * Get a PaletteData object representing the colors | |
57 * stored in this PLTE chunk. | |
58 * The result should be cached as the PLTE chunk | |
59 * does not store the palette data created. | |
60 */ | |
61 PaletteData getPaletteData() { | |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
62 RGB[] rgbs = new RGB[paletteSize]; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
63 // int start = DATA_OFFSET; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
64 // int end = DATA_OFFSET + length; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
65 for (int i = 0; i < rgbs.length; i++) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
66 int offset = DATA_OFFSET + (i * 3); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
67 int red = reference[offset] & 0xFF; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
68 int green = reference[offset + 1] & 0xFF; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
69 int blue = reference[offset + 2] & 0xFF; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
70 rgbs[i] = new RGB(red, green, blue); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
71 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
72 return new PaletteData(rgbs); |
14 | 73 } |
74 | |
75 /** | |
76 * Set the data of a PLTE chunk to the colors | |
77 * stored in the specified PaletteData object. | |
78 */ | |
79 void setPaletteData(PaletteData palette) { | |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
80 RGB[] rgbs = palette.getRGBs(); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
81 for (int i = 0; i < rgbs.length; i++) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
82 int offset = DATA_OFFSET + (i * 3); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
83 reference[offset] = cast(byte) rgbs[i].red; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
84 reference[offset + 1] = cast(byte) rgbs[i].green; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
85 reference[offset + 2] = cast(byte) rgbs[i].blue; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
86 } |
14 | 87 } |
88 | |
89 /** | |
90 * Answer whether the chunk is a valid PLTE chunk. | |
91 */ | |
152
17f8449522fd
overloads second walkthrough
Frank Benoit <benoit@tionex.de>
parents:
131
diff
changeset
|
92 override void validate(PngFileReadState readState, PngIhdrChunk headerChunk) { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
93 // A PLTE chunk is invalid if no IHDR has been read or if any PLTE, |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
94 // IDAT, or IEND chunk has been read. |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
95 if (!readState.readIHDR |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
96 || readState.readPLTE |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
97 || readState.readTRNS |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
98 || readState.readIDAT |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
99 || readState.readIEND) |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
100 { |
71 | 101 DWT.error(DWT.ERROR_INVALID_IMAGE); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
102 } else { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
103 readState.readPLTE = true; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
104 } |
14 | 105 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
106 super.validate(readState, headerChunk); |
14 | 107 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
108 // Palettes cannot be included in grayscale images. |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
109 // |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
110 // Note: just ignore the palette. |
71 | 111 // if (!headerChunk.getCanHavePalette()) DWT.error(DWT.ERROR_INVALID_IMAGE); |
14 | 112 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
113 // Palette chunks' data fields must be event multiples |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
114 // of 3. Each 3-byte group represents an RGB value. |
240 | 115 if (getLength() % 3 !is 0) DWT.error(DWT.ERROR_INVALID_IMAGE); |
14 | 116 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
117 // Palettes cannot have more entries than 2^bitDepth |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
118 // where bitDepth is the bit depth of the image given |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
119 // in the IHDR chunk. |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
120 if (1 << headerChunk.getBitDepth() < paletteSize) { |
71 | 121 DWT.error(DWT.ERROR_INVALID_IMAGE); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
122 } |
14 | 123 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
124 // Palettes cannot have more than 256 entries. |
71 | 125 if (256 < paletteSize) DWT.error(DWT.ERROR_INVALID_IMAGE); |
14 | 126 } |
127 | |
238 | 128 override String contributeToString() { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
14
diff
changeset
|
129 return Format("\n\tPalette size:{}", paletteSize ); |
14 | 130 } |
131 | |
132 } |