annotate org.eclipse.swt.gtk.linux.x86/src/org/eclipse/swt/internal/image/PngEncoder.d @ 120:536e43f63c81

Comprehensive update for Win32/Linux32 dmd-2.053/dmd-1.068+Tango-r5661 ===D2=== * added [Try]Immutable/Const/Shared templates to work with differenses in D1/D2 instead of version statements used these templates to work with strict type storage rules of dmd-2.053 * com.ibm.icu now also compilable with D2, but not tested yet * small fixes Snippet288 - shared data is in TLS ===Phobos=== * fixed critical bugs in Phobos implemention completely incorrect segfault prone fromStringz (Linux's port ruthless killer) terrible, incorrect StringBuffer realization (StyledText killer) * fixed small bugs as well Snippet72 - misprint in the snippet * implemented missed functionality for Phobos ByteArrayOutputStream implemented (image loading available) formatting correctly works for all DWT's cases As a result, folowing snippets now works with Phobos (Snippet### - what is fixed): Snippet24, 42, 111, 115, 130, 235, 276 - bad string formatting Snippet48, 282 - crash on image loading Snippet163, 189, 211, 213, 217, 218, 222 - crash on copy/cut in StyledText Snippet244 - hang-up ===Tango=== * few changes for the latest Tango trunc-r5661 * few small performance improvments ===General=== * implMissing-s for only one version changed to implMissingInTango/InPhobos * incorrect calls to Format in toString-s fixed * fixed loading \uXXXX characters in ResourceBundle * added good UTF-8 support for StyledText, TextLayout (Win32) and friends UTF functions revised and tested. It is now in java.nonstandard.*Utf modules StyledText and TextLayout (Win32) modules revised for UTF-8 support * removed small diferences in most identical files in *.swt.* folders *.swt.internal.image, *.swt.events and *.swt.custom are identical in Win32/Linux32 now 179 of 576 (~31%) files in *.swt.* folders are fully identical * Win32: snippets now have right subsystem, pretty icons and native system style controls * small fixes in snippets Snippet44 - it's not Snippet44 Snippet212 - functions work with different images and offsets arrays Win32: Snippet282 - crash on close if the button has an image Snippet293 - setGrayed is commented and others Win32: As a result, folowing snippets now works Snippet68 - color doesn't change Snippet163, 189, 211, 213, 217, 218, 222 - UTF-8 issues (see above) Snippet193 - no tabel headers
author Denis Shelomovskij <verylonglogin.reg@gmail.com>
date Sat, 09 Jul 2011 15:50:20 +0300
parents ddbfe84d86df
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, 2007 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.PngEncoder;
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 import org.eclipse.swt.internal.image.LEDataOutputStream;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
18 import org.eclipse.swt.internal.image.PngDeflater;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19 import java.io.ByteArrayOutputStream;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 import java.io.OutputStream;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 import org.eclipse.swt.SWT;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 import org.eclipse.swt.graphics.ImageData;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23 import org.eclipse.swt.graphics.ImageLoader;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24 import org.eclipse.swt.graphics.RGB;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
25 import org.eclipse.swt.internal.Compatibility;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 import org.eclipse.swt.internal.image.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
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
29 final class PngEncoder {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
30
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31 static const byte SIGNATURE[] = [cast(byte) '\211', cast(byte) 'P', cast(byte) 'N', cast(byte) 'G', cast(byte) '\r', cast(byte) '\n', cast(byte) '\032', cast(byte) '\n'];
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
32 static const byte TAG_IHDR[] = [cast(byte) 'I', cast(byte) 'H', cast(byte) 'D', cast(byte) 'R'];
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
33 static const byte TAG_PLTE[] = [cast(byte) 'P', cast(byte) 'L', cast(byte) 'T', cast(byte) 'E'];
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34 static const byte TAG_TRNS[] = [cast(byte) 't', cast(byte) 'R', cast(byte) 'N', cast(byte) 'S'];
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35 static const byte TAG_IDAT[] = [cast(byte) 'I', cast(byte) 'D', cast(byte) 'A', cast(byte) 'T'];
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36 static const byte TAG_IEND[] = [cast(byte) 'I', cast(byte) 'E', cast(byte) 'N', cast(byte) 'D'];
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 ByteArrayOutputStream bytes;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
39 PngChunk chunk;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
40
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
41 ImageLoader loader;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
42 ImageData data;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
43 int transparencyType;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
44
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
45 int width, height, bitDepth, colorType;
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 int compressionMethod = 0;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
48 int filterMethod = 0;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
49 int interlaceMethod = 0;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
50
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
51 public this(ImageLoader loader) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
52 this.bytes = new ByteArrayOutputStream(1024);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 this.loader = loader;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54 this.data = loader.data[0];
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
55 this.transparencyType = data.getTransparencyType();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
56
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57 this.width = data.width;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 this.height = data.height;
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 this.bitDepth = 8;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
61
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
62 this.colorType = 2;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
63
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
64 if (data.palette.isDirect) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65 if (transparencyType is SWT.TRANSPARENCY_ALPHA) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
66 this.colorType = 6;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
67 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
68 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
69 else {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
70 this.colorType = 3;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
71 }
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 if (!(colorType is 2 || colorType is 3 || colorType is 6)) SWT.error(SWT.ERROR_INVALID_IMAGE);
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 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
77 void writeShort(ByteArrayOutputStream baos, int theShort) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
78
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
79 byte byte1 = cast(byte) ((theShort >> 8) & 0xff);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
80 byte byte2 = cast(byte) (theShort & 0xff);
120
536e43f63c81 Comprehensive update for Win32/Linux32 dmd-2.053/dmd-1.068+Tango-r5661
Denis Shelomovskij <verylonglogin.reg@gmail.com>
parents: 48
diff changeset
81 byte[2] temp = [byte1, byte2];
25
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
82 baos.write(temp, 0, 2);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
83
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
84 }
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 void writeInt(ByteArrayOutputStream baos, int theInt) {
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 byte byte1 = cast(byte) ((theInt >> 24) & 0xff);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
89 byte byte2 = cast(byte) ((theInt >> 16) & 0xff);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
90 byte byte3 = cast(byte) ((theInt >> 8) & 0xff);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
91 byte byte4 = cast(byte) (theInt & 0xff);
120
536e43f63c81 Comprehensive update for Win32/Linux32 dmd-2.053/dmd-1.068+Tango-r5661
Denis Shelomovskij <verylonglogin.reg@gmail.com>
parents: 48
diff changeset
92 byte[4] temp = [byte1, byte2, byte3, byte4];
25
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
93 baos.write(temp, 0, 4);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
94
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
95 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
96
120
536e43f63c81 Comprehensive update for Win32/Linux32 dmd-2.053/dmd-1.068+Tango-r5661
Denis Shelomovskij <verylonglogin.reg@gmail.com>
parents: 48
diff changeset
97 void writeChunk(in byte[] tag, in byte[] buffer) {
25
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
98
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
99 int bufferLength = (buffer !is null) ? buffer.length : 0;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
100
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
101 chunk = new PngChunk(bufferLength);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
102
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103 writeInt(bytes, bufferLength);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
104 bytes.write(tag, 0, 4);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
105 chunk.setType(tag);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
106 if (bufferLength !is 0) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
107 bytes.write(buffer, 0, bufferLength);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
108 chunk.setData(buffer);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
109 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
110 else {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
111 chunk.setCRC(chunk.computeCRC());
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
112 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
113 writeInt(bytes, chunk.getCRC());
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
114
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
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
117 void writeSignature() {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
118
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
119 bytes.write(SIGNATURE, 0, 8);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
120
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 void writeHeader() {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
124
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
125 ByteArrayOutputStream baos = new ByteArrayOutputStream(13);
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 writeInt(baos, width);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
128 writeInt(baos, height);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
129 baos.write(bitDepth);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
130 baos.write(colorType);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
131 baos.write(compressionMethod);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132 baos.write(filterMethod);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
133 baos.write(interlaceMethod);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
134
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
135 writeChunk(TAG_IHDR, baos.toByteArray());
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
136
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
137 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
138
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
139 void writePalette() {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
140
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
141 RGB[] RGBs = data.palette.getRGBs();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
142
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
143 if (RGBs.length > 256) SWT.error(SWT.ERROR_INVALID_IMAGE);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
144
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
145 ByteArrayOutputStream baos = new ByteArrayOutputStream(RGBs.length);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
146
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
147 for (int i = 0; i < RGBs.length; i++) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
148
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
149 baos.write(cast(byte) RGBs[i].red);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
150 baos.write(cast(byte) RGBs[i].green);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151 baos.write(cast(byte) RGBs[i].blue);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
153 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
154
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
155 writeChunk(TAG_PLTE, baos.toByteArray());
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
157 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
158
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
159 void writeTransparency() {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
160
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
161 ByteArrayOutputStream baos = new ByteArrayOutputStream();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
162
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
163 switch (transparencyType) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
164
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
165 case SWT.TRANSPARENCY_ALPHA:
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
166
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
167 int pixelValue, alphaValue;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169 byte[] alphas = new byte[data.palette.getRGBs().length];
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
171 for (int y = 0; y < height; y++) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
172
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
173 for (int x = 0; x < width; x++) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
174
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
175 pixelValue = data.getPixel(x, y);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
176 alphaValue = data.getAlpha(x, y);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
177
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
178 alphas[pixelValue] = cast(byte) alphaValue;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
179
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
180 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
181
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
182 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
183
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 baos.write(alphas, 0, alphas.length);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
185
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
186 break;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
187
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
188 case SWT.TRANSPARENCY_PIXEL:
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
189
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
190 int pixel = data.transparentPixel;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
191
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
192 if (colorType is 2) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
193
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
194 int redMask = data.palette.redMask;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
195 int redShift = data.palette.redShift;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
196 int greenMask = data.palette.greenMask;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
197 int greenShift = data.palette.greenShift;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
198 int blueShift = data.palette.blueShift;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
199 int blueMask = data.palette.blueMask;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
200
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
201 int r = pixel & redMask;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
202 r = (redShift < 0) ? r >>> -redShift : r << redShift;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
203 int g = pixel & greenMask;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
204 g = (greenShift < 0) ? g >>> -greenShift : g << greenShift;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
205 int b = pixel & blueMask;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
206 b = (blueShift < 0) ? b >>> -blueShift : b << blueShift;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
207
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
208 writeShort(baos, r);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
209 writeShort(baos, g);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
210 writeShort(baos, b);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
211
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
212 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
213
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
214 if (colorType is 3) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
215
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
216 byte[] padding = new byte[pixel + 1];
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
217
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
218 for (int i = 0; i < pixel; i++) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
219
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
220 padding[i] = cast(byte) 255;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
221
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
222 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
223
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
224 padding[pixel] = cast(byte) 0;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
225
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
226 baos.write(padding, 0, padding.length);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
227
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
228 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
229
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
230 break;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
231 default:
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
232
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
233 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
234
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
235 writeChunk(TAG_TRNS, baos.toByteArray());
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
236
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
237 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
238
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
239 void writeImageData() {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
240
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
241 ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
242 OutputStream os = Compatibility.newDeflaterOutputStream(baos);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
243 if (os is null) os = baos;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
244
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
245 if (colorType is 3) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
246
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
247 byte[] lineData = new byte[width];
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
248
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
249 for (int y = 0; y < height; y++) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
250
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
251 int filter = 0;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
252 os.write(filter);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
253
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
254 data.getPixels(0, y, width, lineData, 0);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
255
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
256 for (int x = 0; x < lineData.length; x++) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
257
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
258 os.write(lineData[x]);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
259
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
260 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
261
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
262 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
263
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
264 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
265
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
266 else {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
267
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
268 int[] lineData = new int[width];
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
269 byte[] alphaData = null;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
270 if (colorType is 6) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
271 alphaData = new byte[width];
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
272 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
273
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
274 int redMask = data.palette.redMask;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
275 int redShift = data.palette.redShift;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
276 int greenMask = data.palette.greenMask;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
277 int greenShift = data.palette.greenShift;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
278 int blueShift = data.palette.blueShift;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
279 int blueMask = data.palette.blueMask;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
280
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
281 for (int y = 0; y < height; y++) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
282
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
283 int filter = 0;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
284 os.write(filter);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
285
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
286 data.getPixels(0, y, width, lineData, 0);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
287
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
288 if (colorType is 6) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
289 data.getAlphas(0, y, width, alphaData, 0);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
290 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
291
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
292 for (int x = 0; x < lineData.length; x++) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
293
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
294 int pixel = lineData[x];
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
295
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
296 int r = pixel & redMask;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
297 r = (redShift < 0) ? r >>> -redShift : r << redShift;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
298 int g = pixel & greenMask;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
299 g = (greenShift < 0) ? g >>> -greenShift : g << greenShift;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
300 int b = pixel & blueMask;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
301 b = (blueShift < 0) ? b >>> -blueShift : b << blueShift;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
302
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
303 os.write(r);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
304 os.write(g);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
305 os.write(b);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
306
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
307 if (colorType is 6) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
308 os.write(alphaData[x]);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
309 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
310
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
311 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
312
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
313 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
314
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
315 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
316
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
317 os.flush();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
318 os.close();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
319
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
320 byte[] compressed = baos.toByteArray();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
321 if (os is baos) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
322 PngDeflater deflater = new PngDeflater();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
323 compressed = deflater.deflate(compressed);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
324 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
325
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
326 writeChunk(TAG_IDAT, compressed);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
327
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
328 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
329
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
330 void writeEnd() {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
331
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
332 writeChunk(TAG_IEND, null);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
333
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
334 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
335
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
336 public void encode(LEDataOutputStream outputStream) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
337
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
338 try {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
339
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
340 writeSignature();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
341 writeHeader();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
342
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
343 if (colorType is 3) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
344 writePalette();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
345 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
346
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
347 bool transparencyAlpha = (transparencyType is SWT.TRANSPARENCY_ALPHA);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
348 bool transparencyPixel = (transparencyType is SWT.TRANSPARENCY_PIXEL);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
349 bool type2Transparency = (colorType is 2 && transparencyPixel);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
350 bool type3Transparency = (colorType is 3 && (transparencyAlpha || transparencyPixel));
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
351
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
352 if (type2Transparency || type3Transparency) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
353 writeTransparency();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
354 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
355
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
356 writeImageData();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
357 writeEnd();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
358
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
359 outputStream.write(bytes.toByteArray());
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
360
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
361 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
362
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
363 catch (IOException e) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
364
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
365 SWT.error(SWT.ERROR_IO, e);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
366
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
367 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
368
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
369 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
370
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
371 }