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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
152
17f8449522fd overloads second walkthrough
Frank Benoit <benoit@tionex.de>
parents: 131
diff changeset
1 /*******************************************************************************
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2 * Copyright (c) 2000, 2006 IBM Corporation and others.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
3 * All rights reserved. This program and the accompanying materials
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
4 * are made available under the terms of the Eclipse Public License v1.0
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
5 * which accompanies this distribution, and is available at
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
6 * http://www.eclipse.org/legal/epl-v10.html
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
7 *
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
8 * Contributors:
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
9 * IBM Corporation - initial API and implementation
108
0f12f6bb9739 author notice
Frank Benoit <benoit@tionex.de>
parents: 71
diff changeset
10 * Port to the D programming language:
0f12f6bb9739 author notice
Frank Benoit <benoit@tionex.de>
parents: 71
diff changeset
11 * Frank Benoit <benoit@tionex.de>
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
12 *******************************************************************************/
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
13 module dwt.internal.image.PngPlteChunk;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
14
238
380bad9f6852 reverted char[] to String
Frank Benoit <benoit@tionex.de>
parents: 152
diff changeset
15 import dwt.dwthelper.utils;
380bad9f6852 reverted char[] to String
Frank Benoit <benoit@tionex.de>
parents: 152
diff changeset
16
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17
71
295b29fc7d13 Renamed SWT to DWT
Frank Benoit <benoit@tionex.de>
parents: 59
diff changeset
18 import dwt.DWT;
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19 import dwt.graphics.PaletteData;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 import dwt.graphics.RGB;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 import dwt.internal.image.PngChunk;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 import dwt.internal.image.PngFileReadState;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23 import dwt.internal.image.PngIhdrChunk;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
25 import tango.text.convert.Format;
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27 class PngPlteChunk : PngChunk {
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
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
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
30
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
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
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
37 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
38
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
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
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
42 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
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
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
46 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
47
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
48 /**
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
49 * Get the number of colors in this palette.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
50 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
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
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
55 /**
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
56 * Get a PaletteData object representing the colors
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57 * stored in this PLTE chunk.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 * The result should be cached as the PLTE chunk
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
59 * does not store the palette data created.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
60 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
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
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
73 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
74
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
75 /**
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76 * Set the data of a PLTE chunk to the colors
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
77 * stored in the specified PaletteData object.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
78 */
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
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
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
87 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
88
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
89 /**
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
90 * Answer whether the chunk is a valid PLTE chunk.
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
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
295b29fc7d13 Renamed SWT to DWT
Frank Benoit <benoit@tionex.de>
parents: 59
diff changeset
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
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
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
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
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
295b29fc7d13 Renamed SWT to DWT
Frank Benoit <benoit@tionex.de>
parents: 59
diff changeset
111 // if (!headerChunk.getCanHavePalette()) DWT.error(DWT.ERROR_INVALID_IMAGE);
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
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
ce446666f5a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 238
diff changeset
115 if (getLength() % 3 !is 0) DWT.error(DWT.ERROR_INVALID_IMAGE);
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
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
295b29fc7d13 Renamed SWT to DWT
Frank Benoit <benoit@tionex.de>
parents: 59
diff changeset
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
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
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
295b29fc7d13 Renamed SWT to DWT
Frank Benoit <benoit@tionex.de>
parents: 59
diff changeset
125 if (256 < paletteSize) DWT.error(DWT.ERROR_INVALID_IMAGE);
14
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
126 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
127
238
380bad9f6852 reverted char[] to String
Frank Benoit <benoit@tionex.de>
parents: 152
diff changeset
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
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
130 }
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
131
7b1ca4eb5763 file format png
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132 }