annotate org.eclipse.swt.gtk.linux.x86/src/org/eclipse/swt/internal/image/PngPlteChunk.d @ 26:f589fc20a5f9

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