comparison org.eclipse.swt.win32.win32.x86/src/org/eclipse/swt/internal/image/PngTrnsChunk.d @ 0:6dd524f61e62

add dwt win and basic java stuff
author Frank Benoit <benoit@tionex.de>
date Mon, 02 Mar 2009 14:44:16 +0100
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:6dd524f61e62
1 /*******************************************************************************
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
10 * Port to the D programming language:
11 * Frank Benoit <benoit@tionex.de>
12 *******************************************************************************/
13 module org.eclipse.swt.internal.image.PngTrnsChunk;
14
15 import org.eclipse.swt.SWT;
16 import org.eclipse.swt.graphics.PaletteData;
17 import org.eclipse.swt.graphics.RGB;
18 import org.eclipse.swt.internal.image.PngChunk;
19 import org.eclipse.swt.internal.image.PNGFileFormat;
20 import org.eclipse.swt.internal.image.PngFileReadState;
21 import org.eclipse.swt.internal.image.PngIhdrChunk;
22 import org.eclipse.swt.internal.image.PngPlteChunk;
23
24 public class PngTrnsChunk : PngChunk {
25
26 alias PngChunk.validate validate;
27
28 static const int TRANSPARENCY_TYPE_PIXEL = 0;
29 static const int TRANSPARENCY_TYPE_ALPHAS = 1;
30 static const int RGB_DATA_LENGTH = 6;
31
32 this(RGB rgb) {
33 super(RGB_DATA_LENGTH);
34 setType(TYPE_tRNS);
35 setInt16(DATA_OFFSET, rgb.red);
36 setInt16(DATA_OFFSET + 2, rgb.green);
37 setInt16(DATA_OFFSET + 4, rgb.blue);
38 setCRC(computeCRC());
39 }
40
41 this(byte[] reference){
42 super(reference);
43 }
44
45 override int getChunkType() {
46 return CHUNK_tRNS;
47 }
48
49 void validateLength(PngIhdrChunk header, PngPlteChunk paletteChunk) {
50 bool valid;
51 switch (header.getColorType()) {
52 case PngIhdrChunk.COLOR_TYPE_RGB:
53 // Three 2-byte values (RGB)
54 valid = getLength() is 6;
55 break;
56 case PngIhdrChunk.COLOR_TYPE_PALETTE:
57 // Three 2-byte values (RGB)
58 valid = getLength() <= paletteChunk.getLength();
59 break;
60 case PngIhdrChunk.COLOR_TYPE_GRAYSCALE:
61 // One 2-byte value
62 valid = getLength() is 2;
63 break;
64 // Cannot use both Alpha and tRNS
65 case PngIhdrChunk.COLOR_TYPE_RGB_WITH_ALPHA:
66 case PngIhdrChunk.COLOR_TYPE_GRAYSCALE_WITH_ALPHA:
67 default:
68 valid = false;
69 }
70 if (!valid) {
71 SWT.error(SWT.ERROR_INVALID_IMAGE);
72 }
73 }
74
75 /**
76 * Answer whether the chunk is a valid tRNS chunk.
77 */
78 void validate(PngFileReadState readState, PngIhdrChunk headerChunk, PngPlteChunk paletteChunk) {
79 if (!readState.readIHDR
80 || (headerChunk.getMustHavePalette() && !readState.readPLTE)
81 || readState.readIDAT
82 || readState.readIEND)
83 {
84 SWT.error(SWT.ERROR_INVALID_IMAGE);
85 } else {
86 readState.readTRNS = true;
87 }
88
89 validateLength(headerChunk, paletteChunk);
90
91 super.validate(readState, headerChunk);
92 }
93
94
95 int getTransparencyType(PngIhdrChunk header) {
96 if (header.getColorType() is PngIhdrChunk.COLOR_TYPE_PALETTE) {
97 return TRANSPARENCY_TYPE_ALPHAS;
98 }
99 return TRANSPARENCY_TYPE_PIXEL;
100 }
101
102 /**
103 * Answer the transparent pixel RGB value.
104 * This is not valid for palette color types.
105 * This is not valid for alpha color types.
106 * This will convert a grayscale value into
107 * a palette index.
108 * It will compress a 6 byte RGB into a 3 byte
109 * RGB.
110 */
111 int getSwtTransparentPixel(PngIhdrChunk header) {
112 switch (header.getColorType()) {
113 case PngIhdrChunk.COLOR_TYPE_GRAYSCALE:
114 int gray = ((reference[DATA_OFFSET] & 0xFF) << 8)
115 + (reference[DATA_OFFSET + 1] & 0xFF);
116 if (header.getBitDepth() > 8) {
117 return PNGFileFormat.compress16BitDepthTo8BitDepth(gray);
118 }
119 return gray & 0xFF;
120 case PngIhdrChunk.COLOR_TYPE_RGB:
121 int red = ((reference[DATA_OFFSET] & 0xFF) << 8)
122 | (reference[DATA_OFFSET + 1] & 0xFF);
123 int green = ((reference[DATA_OFFSET + 2] & 0xFF) << 8)
124 | (reference[DATA_OFFSET + 3] & 0xFF);
125 int blue = ((reference[DATA_OFFSET + 4] & 0xFF) << 8)
126 | (reference[DATA_OFFSET + 5] & 0xFF);
127 if (header.getBitDepth() > 8) {
128 red = PNGFileFormat.compress16BitDepthTo8BitDepth(red);
129 green = PNGFileFormat.compress16BitDepthTo8BitDepth(green);
130 blue = PNGFileFormat.compress16BitDepthTo8BitDepth(blue);
131 }
132 return (red << 16) | (green << 8) | blue;
133 default:
134 SWT.error(SWT.ERROR_INVALID_IMAGE);
135 return -1;
136 }
137 }
138
139 /**
140 * Answer an array of Alpha values that correspond to the
141 * colors in the palette.
142 * This is only valid for the COLOR_TYPE_PALETTE color type.
143 */
144 byte[] getAlphaValues(PngIhdrChunk header, PngPlteChunk paletteChunk) {
145 if (header.getColorType() !is PngIhdrChunk.COLOR_TYPE_PALETTE) {
146 SWT.error(SWT.ERROR_INVALID_IMAGE);
147 }
148 byte[] alphas = new byte[paletteChunk.getPaletteSize()];
149 int dataLength = getLength();
150 int i = 0;
151 for (i = 0; i < dataLength; i++) {
152 alphas[i] = reference[DATA_OFFSET + i];
153 }
154 /**
155 * Any palette entries which do not have a corresponding
156 * alpha value in the tRNS chunk are spec'd to have an
157 * alpha of 255.
158 */
159 for (int j = i; j < alphas.length; j++) {
160 alphas[j] = cast(byte) 255;
161 }
162 return alphas;
163 }
164 }