Mercurial > projects > dwt-mac
comparison dwt/internal/image/TIFFModifiedHuffmanCodec.d @ 34:5123b17c98ef
Ported dwt.events.*, dwt.graphics.GC, Region, dwt.internal.image.*
author | Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com> |
---|---|
date | Sun, 14 Sep 2008 01:45:57 +0200 |
parents | e831403a80a9 |
children |
comparison
equal
deleted
inserted
replaced
33:965ac0a77267 | 34:5123b17c98ef |
---|---|
1 /******************************************************************************* | 1 /******************************************************************************* |
2 * Copyright (c) 2000, 2003 IBM Corporation and others. | 2 * Copyright (c) 2000, 2003 IBM Corporation and others. |
3 * All rights reserved. This program and the accompanying materials | 3 * All rights reserved. This program and the accompanying materials |
4 * are made available under the terms of the Eclipse Public License v1.0 | 4 * are made available under the terms of the Eclipse Public License v1.0 |
5 * which accompanies this distribution, and is available at | 5 * which accompanies this distribution, and is available at |
6 * http://www.eclipse.org/legal/epl-v10.html | 6 * http://www.eclipse.org/legal/epl-v10.html |
7 * | 7 * |
8 * Contributors: | 8 * Contributors: |
9 * IBM Corporation - initial API and implementation | 9 * IBM Corporation - initial API and implementation |
10 * Port to the D programming language: | |
11 * Frank Benoit <benoit@tionex.de> | |
10 *******************************************************************************/ | 12 *******************************************************************************/ |
11 module dwt.internal.image; | 13 module dwt.internal.image.TIFFModifiedHuffmanCodec; |
12 | 14 |
13 import dwt.DWT; | 15 import dwt.DWT; |
14 | 16 |
15 /* | 17 /* |
16 * Decoder for | 18 * Decoder for |
17 * - CCITT Group 3 1-Dimensional Modified Huffman run length encoding | 19 * - CCITT Group 3 1-Dimensional Modified Huffman run length encoding |
18 * (TIFF compression type 2) | 20 * (TIFF compression type 2) |
19 * - CCITT T.4 bi-level encoding 1D | 21 * - CCITT T.4 bi-level encoding 1D |
20 * (TIFF compression type 3 option 1D) | 22 * (TIFF compression type 3 option 1D) |
21 */ | 23 */ |
22 final class TIFFModifiedHuffmanCodec { | 24 final class TIFFModifiedHuffmanCodec { |
23 static final short[][][] BLACK_CODE = { | 25 static final short[][][] BLACK_CODE = [ |
24 /* 2 bits */ | 26 /* 2 bits */ |
25 {{2, 3}, {3, 2}}, | 27 [[ cast(short)2, 3], [ cast(short)3, 2]], |
26 /* 3 bits */ | 28 /* 3 bits */ |
27 {{2, 1}, {3, 4}}, | 29 [[ cast(short)2, 1], [ cast(short)3, 4]], |
28 /* 4 bits */ | 30 /* 4 bits */ |
29 {{2, 6}, {3, 5}}, | 31 [[ cast(short)2, 6], [ cast(short)3, 5]], |
30 /* 5 bits */ | 32 /* 5 bits */ |
31 {{3, 7}}, | 33 [[ cast(short)3, 7]], |
32 /* 6 bits */ | 34 /* 6 bits */ |
33 {{4, 9}, {5, 8}}, | 35 [[ cast(short)4, 9], [ cast(short)5, 8]], |
34 /* 7 bits */ | 36 /* 7 bits */ |
35 {{4, 10}, {5, 11}, {7, 12}}, | 37 [[ cast(short)4, 10], [ cast(short)5, 11], [ cast(short)7, 12]], |
36 /* 8 bits */ | 38 /* 8 bits */ |
37 {{4, 13}, {7, 14}}, | 39 [[ cast(short)4, 13], [ cast(short)7, 14]], |
38 /* 9 bits */ | 40 /* 9 bits */ |
39 {{24, 15}}, | 41 [[ cast(short)24, 15]], |
40 /* 10 bits */ | 42 /* 10 bits */ |
41 {{8, 18}, {15, 64}, {23, 16}, {24, 17}, {55, 0}}, | 43 [[ cast(short)8, 18], [ cast(short)15, 64], [ cast(short)23, 16], [ cast(short)24, 17], [ cast(short)55, 0]], |
42 /* 11 bits */ | 44 /* 11 bits */ |
43 {/* EOL */{0, -1}, {8, 1792}, {23, 24}, {24, 25}, {40, 23}, {55, 22}, {103, 19}, | 45 [/* EOL */[ cast(short)0, -1], [ cast(short)8, 1792], [ cast(short)23, 24], [ cast(short)24, 25], [ cast(short)40, 23], [ cast(short)55, 22], [ cast(short)103, 19], |
44 {104, 20}, {108, 21}, {12, 1856}, {13, 1920}}, | 46 [ cast(short)104, 20], [ cast(short)108, 21], [ cast(short)12, 1856], [ cast(short)13, 1920]], |
45 /* 12 bits */ | 47 /* 12 bits */ |
46 {{18, 1984}, {19, 2048}, {20, 2112}, {21, 2176}, {22, 2240}, {23, 2304}, | 48 [[ cast(short)18, 1984], [ cast(short)19, 2048], [ cast(short)20, 2112], [ cast(short)21, 2176], [ cast(short)22, 2240], [ cast(short)23, 2304], |
47 {28, 2368}, {29, 2432}, {30, 2496}, {31, 2560}, {36, 52}, {39, 55}, {40, 56}, | 49 [ cast(short)28, 2368], [ cast(short)29, 2432], [ cast(short)30, 2496], [ cast(short)31, 2560], [ cast(short)36, 52], [ cast(short)39, 55], [ cast(short)40, 56], |
48 {43, 59}, {44, 60}, {51, 320}, {52, 384}, {53, 448}, {55, 53}, {56, 54}, {82, 50}, | 50 [ cast(short)43, 59], [ cast(short)44, 60], [ cast(short)51, 320], [ cast(short)52, 384], [ cast(short)53, 448], [ cast(short)55, 53], [ cast(short)56, 54], [ cast(short)82, 50], |
49 {83, 51}, {84, 44}, {85, 45}, {86, 46}, {87, 47}, {88, 57}, {89, 58}, {90, 61}, | 51 [ cast(short)83, 51], [ cast(short)84, 44], [ cast(short)85, 45], [ cast(short)86, 46], [ cast(short)87, 47], [ cast(short)88, 57], [ cast(short)89, 58], [ cast(short)90, 61], |
50 {91, 256}, {100, 48}, {101, 49}, {102, 62}, {103, 63}, {104, 30}, {105, 31}, | 52 [ cast(short)91, 256], [ cast(short)100, 48], [ cast(short)101, 49], [ cast(short)102, 62], [ cast(short)103, 63], [ cast(short)104, 30], [ cast(short)105, 31], |
51 {106, 32}, {107, 33}, {108, 40}, {109, 41}, {200, 128}, {201, 192}, {202, 26}, | 53 [ cast(short)106, 32], [ cast(short)107, 33], [ cast(short)108, 40], [ cast(short)109, 41], [ cast(short)200, 128], [ cast(short)201, 192], [ cast(short)202, 26], |
52 {203, 27}, {204, 28}, {205, 29}, {210, 34}, {211, 35}, {212, 36}, {213, 37}, | 54 [ cast(short)203, 27], [ cast(short)204, 28], [ cast(short)205, 29], [ cast(short)210, 34], [ cast(short)211, 35], [ cast(short)212, 36], [ cast(short)213, 37], |
53 {214, 38}, {215, 39}, {218, 42}, {219, 43}}, | 55 [ cast(short)214, 38], [ cast(short)215, 39], [ cast(short)218, 42], [ cast(short)219, 43]], |
54 /* 13 bits */ | 56 /* 13 bits */ |
55 {{74, 640}, {75, 704}, {76, 768}, {77, 832}, {82, 1280}, {83, 1344}, {84, 1408}, | 57 [[ cast(short)74, 640], [ cast(short)75, 704], [ cast(short)76, 768], [ cast(short)77, 832], [ cast(short)82, 1280], [ cast(short)83, 1344], [ cast(short)84, 1408], |
56 {85, 1472}, {90, 1536}, {91, 1600}, {100, 1664}, {101, 1728}, {108, 512}, | 58 [ cast(short)85, 1472], [ cast(short)90, 1536], [ cast(short)91, 1600], [ cast(short)100, 1664], [ cast(short)101, 1728], [ cast(short)108, 512], |
57 {109, 576}, {114, 896}, {115, 960}, {116, 1024}, {117, 1088}, {118, 1152}, | 59 [ cast(short)109, 576], [ cast(short)114, 896], [ cast(short)115, 960], [ cast(short)116, 1024], [ cast(short)117, 1088], [ cast(short)118, 1152], |
58 {119, 1216}} | 60 [ cast(short)119, 1216]] |
59 }; | 61 ]; |
60 | 62 |
61 static final short[][][] WHITE_CODE = { | 63 static final short[][][] WHITE_CODE = [ |
62 /* 4 bits */ | 64 /* 4 bits */ |
63 {{7, 2}, {8, 3}, {11, 4}, {12, 5}, {14, 6}, {15, 7}}, | 65 [[ cast(short)7, 2], [ cast(short)8, 3], [ cast(short)11, 4], [ cast(short)12, 5], [ cast(short)14, 6], [ cast(short)15, 7]], |
64 /* 5 bits */ | 66 /* 5 bits */ |
65 {{7, 10}, {8, 11}, {18, 128}, {19, 8}, {20, 9}, {27, 64}}, | 67 [[ cast(short)7, 10], [ cast(short)8, 11], [ cast(short)18, 128], [ cast(short)19, 8], [ cast(short)20, 9], [ cast(short)27, 64]], |
66 /* 6 bits */ | 68 /* 6 bits */ |
67 {{3, 13}, {7, 1}, {8, 12}, {23, 192}, {24, 1664}, {42, 16}, {43, 17}, {52, 14}, | 69 [[ cast(short)3, 13], [ cast(short)7, 1], [ cast(short)8, 12], [ cast(short)23, 192], [ cast(short)24, 1664], [ cast(short)42, 16], [ cast(short)43, 17], [ cast(short)52, 14], |
68 {53, 15}}, | 70 [ cast(short)53, 15]], |
69 /* 7 bits */ | 71 /* 7 bits */ |
70 {{3, 22}, {4, 23}, {8, 20}, {12, 19}, {19, 26}, {23, 21}, {24, 28}, {36, 27}, | 72 [[ cast(short)3, 22], [ cast(short)4, 23], [ cast(short)8, 20], [ cast(short)12, 19], [ cast(short)19, 26], [ cast(short)23, 21], [ cast(short)24, 28], [ cast(short)36, 27], |
71 {39, 18}, {40, 24}, {43, 25}, {55, 256}}, | 73 [ cast(short)39, 18], [ cast(short)40, 24], [ cast(short)43, 25], [ cast(short)55, 256]], |
72 /* 8 bits */ | 74 /* 8 bits */ |
73 {{2, 29}, {3, 30}, {4, 45}, {5, 46}, {10, 47}, {11, 48}, {18, 33}, {19, 34}, | 75 [[ cast(short)2, 29], [ cast(short)3, 30], [ cast(short)4, 45], [ cast(short)5, 46], [ cast(short)10, 47], [ cast(short)11, 48], [ cast(short)18, 33], [ cast(short)19, 34], |
74 {20, 35}, {21, 36}, {22, 37}, {23, 38}, {26, 31}, {27, 32}, {36, 53}, {37, 54}, | 76 [ cast(short)20, 35], [ cast(short)21, 36], [ cast(short)22, 37], [ cast(short)23, 38], [ cast(short)26, 31], [ cast(short)27, 32], [ cast(short)36, 53], [ cast(short)37, 54], |
75 {40, 39}, {41, 40}, {42, 41}, {43, 42}, {44, 43}, {45, 44}, {50, 61}, {51, 62}, | 77 [ cast(short)40, 39], [ cast(short)41, 40], [ cast(short)42, 41], [ cast(short)43, 42], [ cast(short)44, 43], [ cast(short)45, 44], [ cast(short)50, 61], [ cast(short)51, 62], |
76 {52, 63}, {53, 0}, {54, 320}, {55, 384}, {74, 59}, {75, 60}, {82, 49}, {83, 50}, | 78 [ cast(short)52, 63], [ cast(short)53, 0], [ cast(short)54, 320], [ cast(short)55, 384], [ cast(short)74, 59], [ cast(short)75, 60], [ cast(short)82, 49], [ cast(short)83, 50], |
77 {84, 51}, {85, 52}, {88, 55}, {89, 56}, {90, 57}, {91, 58}, {100, 448}, | 79 [ cast(short)84, 51], [ cast(short)85, 52], [ cast(short)88, 55], [ cast(short)89, 56], [ cast(short)90, 57], [ cast(short)91, 58], [ cast(short)100, 448], |
78 {101, 512}, {103, 640}, {104, 576}}, | 80 [ cast(short)101, 512], [ cast(short)103, 640], [ cast(short)104, 576]], |
79 /* 9 bits */ | 81 /* 9 bits */ |
80 {{152, 1472}, {153, 1536}, {154, 1600}, {155, 1728}, {204, 704}, {205, 768}, | 82 [[ cast(short)152, 1472], [ cast(short)153, 1536], [ cast(short)154, 1600], [ cast(short)155, 1728], [ cast(short)204, 704], [ cast(short)205, 768], |
81 {210, 832}, {211, 896}, {212, 960}, {213, 1024}, {214, 1088}, {215, 1152}, | 83 [ cast(short)210, 832], [ cast(short)211, 896], [ cast(short)212, 960], [ cast(short)213, 1024], [ cast(short)214, 1088], [ cast(short)215, 1152], |
82 {216, 1216}, {217, 1280}, {218, 1344}, {219, 1408}}, | 84 [ cast(short)216, 1216], [ cast(short)217, 1280], [ cast(short)218, 1344], [ cast(short)219, 1408]], |
83 /* 10 bits */ | 85 /* 10 bits */ |
84 {}, | 86 [], |
85 /* 11 bits */ | 87 /* 11 bits */ |
86 {{8, 1792}, {12, 1856}, {13, 1920}}, | 88 [[ cast(short)8, 1792], [ cast(short)12, 1856], [ cast(short)13, 1920]], |
87 /* 12 bits */ | 89 /* 12 bits */ |
88 {/* EOL */{1, -1}, {18, 1984}, {19, 2048}, {20, 2112}, {21, 2176}, {22, 2240}, {23, 2304}, | 90 [/* EOL */[ cast(short)1, -1], [ cast(short)18, 1984], [ cast(short)19, 2048], [ cast(short)20, 2112], [ cast(short)21, 2176], [ cast(short)22, 2240], [ cast(short)23, 2304], |
89 {28, 2368}, {29, 2432}, {30, 2496}, {31, 2560}} | 91 [ cast(short)28, 2368], [ cast(short)29, 2432], [ cast(short)30, 2496], [ cast(short)31, 2560]] |
90 }; | 92 ]; |
91 | 93 |
92 static final int BLACK_MIN_BITS = 2; | 94 static final int BLACK_MIN_BITS = 2; |
93 static final int WHITE_MIN_BITS = 4; | 95 static final int WHITE_MIN_BITS = 4; |
94 | 96 |
95 bool isWhite; | 97 bool isWhite; |
96 int whiteValue = 0; | 98 int whiteValue = 0; |
118 while (cnt < nRows && decodeRow()) { | 120 while (cnt < nRows && decodeRow()) { |
119 cnt++; | 121 cnt++; |
120 /* byte aligned */ | 122 /* byte aligned */ |
121 if (bitOffsetDest > 0) { | 123 if (bitOffsetDest > 0) { |
122 byteOffsetDest++; | 124 byteOffsetDest++; |
123 bitOffsetDest = 0; | 125 bitOffsetDest = 0; |
124 } | 126 } |
125 } | 127 } |
126 return byteOffsetDest - offsetDest; | 128 return byteOffsetDest - offsetDest; |
127 } | 129 } |
128 | 130 |
164 } | 166 } |
165 } | 167 } |
166 if (found) break; | 168 if (found) break; |
167 code = code << 1 | getNextBit(); | 169 code = code << 1 | getNextBit(); |
168 } | 170 } |
169 if (!found) DWT.error(DWT.ERROR_INVALID_IMAGE); | 171 if (!found) DWT.error(DWT.ERROR_INVALID_IMAGE); |
170 } | 172 } |
171 } | 173 } |
172 | 174 |
173 int getNextBit() { | 175 int getNextBit() { |
174 int value = (src[byteOffsetSrc] >>> (7 - bitOffsetSrc)) & 0x1; | 176 int value = (src[byteOffsetSrc] >>> (7 - bitOffsetSrc)) & 0x1; |
193 while (bitOffsetDest > 0 && bitOffsetDest <= 7 && n > 0) { | 195 while (bitOffsetDest > 0 && bitOffsetDest <= 7 && n > 0) { |
194 dest[byteOffsetDest] = value is 1 ? | 196 dest[byteOffsetDest] = value is 1 ? |
195 cast(byte)(dest[byteOffsetDest] | (1 << (7 - bitOffsetDest))) : | 197 cast(byte)(dest[byteOffsetDest] | (1 << (7 - bitOffsetDest))) : |
196 cast(byte)(dest[byteOffsetDest] & ~(1 << (7 - bitOffsetDest))); | 198 cast(byte)(dest[byteOffsetDest] & ~(1 << (7 - bitOffsetDest))); |
197 n--; | 199 n--; |
198 bitOffsetDest++; | 200 bitOffsetDest++; |
199 } | 201 } |
200 if (bitOffsetDest is 8) { | 202 if (bitOffsetDest is 8) { |
201 byteOffsetDest++; | 203 byteOffsetDest++; |
202 bitOffsetDest = 0; | 204 bitOffsetDest = 0; |
203 } | 205 } |
208 while (n > 0) { | 210 while (n > 0) { |
209 dest[byteOffsetDest] = value is 1 ? | 211 dest[byteOffsetDest] = value is 1 ? |
210 cast(byte)(dest[byteOffsetDest] | (1 << (7 - bitOffsetDest))) : | 212 cast(byte)(dest[byteOffsetDest] | (1 << (7 - bitOffsetDest))) : |
211 cast(byte)(dest[byteOffsetDest] & ~(1 << (7 - bitOffsetDest))); | 213 cast(byte)(dest[byteOffsetDest] & ~(1 << (7 - bitOffsetDest))); |
212 n--; | 214 n--; |
213 bitOffsetDest++; | 215 bitOffsetDest++; |
214 } | 216 } |
215 } | 217 } |
216 | 218 |
217 } | 219 } |