annotate org.eclipse.swt.gtk.linux.x86/src/org/eclipse/swt/internal/image/PngLzBlockReader.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 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.PngLzBlockReader;
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 org.eclipse.swt.internal.image.PngDecodingDataStream;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
16 import org.eclipse.swt.internal.image.PngHuffmanTables;
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 public class PngLzBlockReader {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19 bool isLastBlock;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 byte compressionType;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 int uncompressedBytesRemaining;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 PngDecodingDataStream stream;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23 PngHuffmanTables huffmanTables;
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 byte[] window;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 int windowIndex;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27 int copyIndex;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
28 int copyBytesRemaining;
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 static const int UNCOMPRESSED = 0;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31 static const int COMPRESSED_FIXED = 1;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
32 static const int COMPRESSED_DYNAMIC = 2;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
33
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34 static const int END_OF_COMPRESSED_BLOCK = 256;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35 static const int FIRST_LENGTH_CODE = 257;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36 static const int LAST_LENGTH_CODE = 285;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
37 static const int FIRST_DISTANCE_CODE = 1;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
38 static const int LAST_DISTANCE_CODE = 29;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
39 static const int FIRST_CODE_LENGTH_CODE = 4;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
40 static const int LAST_CODE_LENGTH_CODE = 19;
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 static const int[] lengthBases = [
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
43 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27,
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
44 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258
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 static const int[] extraLengthBits = [
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
47 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
48 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0,
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 static const int[] distanceBases = [
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
51 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129,
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
52 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097,
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 6145, 8193, 12289, 16385, 24577,
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 static const int[] extraDistanceBits = [
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
56 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13,
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 ];
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
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
61 this(PngDecodingDataStream stream) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
62 this.stream = stream;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
63 isLastBlock = false;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
64 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
66 void setWindowSize(int windowSize) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
67 window = new byte[windowSize];
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
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
70 void readNextBlockHeader() {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
71 isLastBlock = stream.getNextIdatBit() !is 0;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
72 compressionType = cast(byte)(stream.getNextIdatBits(2) & 0xFF);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
73 if (compressionType > 2) stream.error();
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 if (compressionType is UNCOMPRESSED) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76 byte b1 = stream.getNextIdatByte();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
77 byte b2 = stream.getNextIdatByte();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
78 byte b3 = stream.getNextIdatByte();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
79 byte b4 = stream.getNextIdatByte();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
80 if (b1 !is ~b3 || b2 !is ~b4) stream.error();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
81 uncompressedBytesRemaining = (b1 & 0xFF) | ((b2 & 0xFF) << 8);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
82 } else if (compressionType is COMPRESSED_DYNAMIC) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
83 huffmanTables = PngHuffmanTables.getDynamicTables(stream);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
84 } else {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
85 huffmanTables = PngHuffmanTables.getFixedTables();
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 byte getNextByte() {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
90 if (compressionType is UNCOMPRESSED) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
91 if (uncompressedBytesRemaining is 0) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
92 readNextBlockHeader();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
93 return getNextByte();
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 uncompressedBytesRemaining--;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
96 return stream.getNextIdatByte();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
97 } else {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
98 byte value = getNextCompressedByte();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
99 if (value is END_OF_COMPRESSED_BLOCK) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
100 if (isLastBlock) stream.error();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
101 readNextBlockHeader();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
102 return getNextByte();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103 } else {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
104 return value;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
105 }
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 }
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 private void assertBlockAtEnd() {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
110 if (compressionType is UNCOMPRESSED) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
111 if (uncompressedBytesRemaining > 0) stream.error();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
112 } else if (copyBytesRemaining > 0 ||
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
113 (huffmanTables.getNextLiteralValue(stream) !is END_OF_COMPRESSED_BLOCK))
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 stream.error();
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 }
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
118 void assertCompressedDataAtEnd() {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
119 assertBlockAtEnd();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
120 while (!isLastBlock) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
121 readNextBlockHeader();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
122 assertBlockAtEnd();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
123 }
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
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
126 private byte getNextCompressedByte() {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
127 if (copyBytesRemaining > 0) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
128 byte value = window[copyIndex];
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
129 window[windowIndex] = value;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
130 copyBytesRemaining--;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
131
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132 copyIndex++;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
133 windowIndex++;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
134 if (copyIndex is window.length) copyIndex = 0;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
135 if (windowIndex is window.length) windowIndex = 0;
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 return value;
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
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
140 int value = huffmanTables.getNextLiteralValue(stream);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
141 if (value < END_OF_COMPRESSED_BLOCK) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
142 window[windowIndex] = cast(byte) (value & 0xFF);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
143 windowIndex++;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
144 if (windowIndex >= window.length) windowIndex = 0;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
145 return cast(byte) (value & 0xFF);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
146 } else if (value is END_OF_COMPRESSED_BLOCK) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
147 readNextBlockHeader();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
148 return getNextByte();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
149 } else if (value <= LAST_LENGTH_CODE) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
150 int extraBits = extraLengthBits[value - FIRST_LENGTH_CODE];
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151 int length = lengthBases[value - FIRST_LENGTH_CODE];
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152 if (extraBits > 0) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
153 length += stream.getNextIdatBits(extraBits);
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
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156 value = huffmanTables.getNextDistanceValue(stream);
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
157 if (value > LAST_DISTANCE_CODE) stream.error();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
158 extraBits = extraDistanceBits[value];
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
159 int distance = distanceBases[value];
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
160 if (extraBits > 0) {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
161 distance += stream.getNextIdatBits(extraBits);
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
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
164 copyIndex = windowIndex - distance;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
165 if (copyIndex < 0) copyIndex += window.length;
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 copyBytesRemaining = length;
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168 return getNextCompressedByte();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169 } else {
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170 stream.error();
f713da8bc051 Added SWT Linux GTK
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
171 return 0;
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 }
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 }