1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_filter.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski #include "ccidecom.hxx"
28*b1cdbd2cSJim Jagielski
29*b1cdbd2cSJim Jagielski //=============================== Huffman-Tabellen ========================
30*b1cdbd2cSJim Jagielski
31*b1cdbd2cSJim Jagielski //---------------------------- White-Run ------------------------------
32*b1cdbd2cSJim Jagielski
33*b1cdbd2cSJim Jagielski #define CCIWhiteTableSize 105
34*b1cdbd2cSJim Jagielski
35*b1cdbd2cSJim Jagielski const CCIHuffmanTableEntry CCIWhiteTable[CCIWhiteTableSize]={
36*b1cdbd2cSJim Jagielski { 0, 0x0035, 8 },
37*b1cdbd2cSJim Jagielski { 1, 0x0007, 6 },
38*b1cdbd2cSJim Jagielski { 2, 0x0007, 4 },
39*b1cdbd2cSJim Jagielski { 3, 0x0008, 4 },
40*b1cdbd2cSJim Jagielski { 4, 0x000b, 4 },
41*b1cdbd2cSJim Jagielski { 5, 0x000c, 4 },
42*b1cdbd2cSJim Jagielski { 6, 0x000e, 4 },
43*b1cdbd2cSJim Jagielski { 7, 0x000f, 4 },
44*b1cdbd2cSJim Jagielski { 8, 0x0013, 5 },
45*b1cdbd2cSJim Jagielski { 9, 0x0014, 5 },
46*b1cdbd2cSJim Jagielski { 10, 0x0007, 5 },
47*b1cdbd2cSJim Jagielski { 11, 0x0008, 5 },
48*b1cdbd2cSJim Jagielski { 12, 0x0008, 6 },
49*b1cdbd2cSJim Jagielski { 13, 0x0003, 6 },
50*b1cdbd2cSJim Jagielski { 14, 0x0034, 6 },
51*b1cdbd2cSJim Jagielski { 15, 0x0035, 6 },
52*b1cdbd2cSJim Jagielski { 16, 0x002a, 6 },
53*b1cdbd2cSJim Jagielski { 17, 0x002b, 6 },
54*b1cdbd2cSJim Jagielski { 18, 0x0027, 7 },
55*b1cdbd2cSJim Jagielski { 19, 0x000c, 7 },
56*b1cdbd2cSJim Jagielski { 20, 0x0008, 7 },
57*b1cdbd2cSJim Jagielski { 21, 0x0017, 7 },
58*b1cdbd2cSJim Jagielski { 22, 0x0003, 7 },
59*b1cdbd2cSJim Jagielski { 23, 0x0004, 7 },
60*b1cdbd2cSJim Jagielski { 24, 0x0028, 7 },
61*b1cdbd2cSJim Jagielski { 25, 0x002b, 7 },
62*b1cdbd2cSJim Jagielski { 26, 0x0013, 7 },
63*b1cdbd2cSJim Jagielski { 27, 0x0024, 7 },
64*b1cdbd2cSJim Jagielski { 28, 0x0018, 7 },
65*b1cdbd2cSJim Jagielski { 29, 0x0002, 8 },
66*b1cdbd2cSJim Jagielski { 30, 0x0003, 8 },
67*b1cdbd2cSJim Jagielski { 31, 0x001a, 8 },
68*b1cdbd2cSJim Jagielski { 32, 0x001b, 8 },
69*b1cdbd2cSJim Jagielski { 33, 0x0012, 8 },
70*b1cdbd2cSJim Jagielski { 34, 0x0013, 8 },
71*b1cdbd2cSJim Jagielski { 35, 0x0014, 8 },
72*b1cdbd2cSJim Jagielski { 36, 0x0015, 8 },
73*b1cdbd2cSJim Jagielski { 37, 0x0016, 8 },
74*b1cdbd2cSJim Jagielski { 38, 0x0017, 8 },
75*b1cdbd2cSJim Jagielski { 39, 0x0028, 8 },
76*b1cdbd2cSJim Jagielski { 40, 0x0029, 8 },
77*b1cdbd2cSJim Jagielski { 41, 0x002a, 8 },
78*b1cdbd2cSJim Jagielski { 42, 0x002b, 8 },
79*b1cdbd2cSJim Jagielski { 43, 0x002c, 8 },
80*b1cdbd2cSJim Jagielski { 44, 0x002d, 8 },
81*b1cdbd2cSJim Jagielski { 45, 0x0004, 8 },
82*b1cdbd2cSJim Jagielski { 46, 0x0005, 8 },
83*b1cdbd2cSJim Jagielski { 47, 0x000a, 8 },
84*b1cdbd2cSJim Jagielski { 48, 0x000b, 8 },
85*b1cdbd2cSJim Jagielski { 49, 0x0052, 8 },
86*b1cdbd2cSJim Jagielski { 50, 0x0053, 8 },
87*b1cdbd2cSJim Jagielski { 51, 0x0054, 8 },
88*b1cdbd2cSJim Jagielski { 52, 0x0055, 8 },
89*b1cdbd2cSJim Jagielski { 53, 0x0024, 8 },
90*b1cdbd2cSJim Jagielski { 54, 0x0025, 8 },
91*b1cdbd2cSJim Jagielski { 55, 0x0058, 8 },
92*b1cdbd2cSJim Jagielski { 56, 0x0059, 8 },
93*b1cdbd2cSJim Jagielski { 57, 0x005a, 8 },
94*b1cdbd2cSJim Jagielski { 58, 0x005b, 8 },
95*b1cdbd2cSJim Jagielski { 59, 0x004a, 8 },
96*b1cdbd2cSJim Jagielski { 60, 0x004b, 8 },
97*b1cdbd2cSJim Jagielski { 61, 0x0032, 8 },
98*b1cdbd2cSJim Jagielski { 62, 0x0033, 8 },
99*b1cdbd2cSJim Jagielski { 63, 0x0034, 8 },
100*b1cdbd2cSJim Jagielski { 64, 0x001b, 5 },
101*b1cdbd2cSJim Jagielski { 128, 0x0012, 5 },
102*b1cdbd2cSJim Jagielski { 192, 0x0017, 6 },
103*b1cdbd2cSJim Jagielski { 256, 0x0037, 7 },
104*b1cdbd2cSJim Jagielski { 320, 0x0036, 8 },
105*b1cdbd2cSJim Jagielski { 384, 0x0037, 8 },
106*b1cdbd2cSJim Jagielski { 448, 0x0064, 8 },
107*b1cdbd2cSJim Jagielski { 512, 0x0065, 8 },
108*b1cdbd2cSJim Jagielski { 576, 0x0068, 8 },
109*b1cdbd2cSJim Jagielski { 640, 0x0067, 8 },
110*b1cdbd2cSJim Jagielski { 704, 0x00cc, 9 },
111*b1cdbd2cSJim Jagielski { 768, 0x00cd, 9 },
112*b1cdbd2cSJim Jagielski { 832, 0x00d2, 9 },
113*b1cdbd2cSJim Jagielski { 896, 0x00d3, 9 },
114*b1cdbd2cSJim Jagielski { 960, 0x00d4, 9 },
115*b1cdbd2cSJim Jagielski { 1024, 0x00d5, 9 },
116*b1cdbd2cSJim Jagielski { 1088, 0x00d6, 9 },
117*b1cdbd2cSJim Jagielski { 1152, 0x00d7, 9 },
118*b1cdbd2cSJim Jagielski { 1216, 0x00d8, 9 },
119*b1cdbd2cSJim Jagielski { 1280, 0x00d9, 9 },
120*b1cdbd2cSJim Jagielski { 1344, 0x00da, 9 },
121*b1cdbd2cSJim Jagielski { 1408, 0x00db, 9 },
122*b1cdbd2cSJim Jagielski { 1472, 0x0098, 9 },
123*b1cdbd2cSJim Jagielski { 1536, 0x0099, 9 },
124*b1cdbd2cSJim Jagielski { 1600, 0x009a, 9 },
125*b1cdbd2cSJim Jagielski { 1664, 0x0018, 6 },
126*b1cdbd2cSJim Jagielski { 1728, 0x009b, 9 },
127*b1cdbd2cSJim Jagielski { 1792, 0x0008, 11 },
128*b1cdbd2cSJim Jagielski { 1856, 0x000c, 11 },
129*b1cdbd2cSJim Jagielski { 1920, 0x000d, 11 },
130*b1cdbd2cSJim Jagielski { 1984, 0x0012, 12 },
131*b1cdbd2cSJim Jagielski { 2048, 0x0013, 12 },
132*b1cdbd2cSJim Jagielski { 2112, 0x0014, 12 },
133*b1cdbd2cSJim Jagielski { 2176, 0x0015, 12 },
134*b1cdbd2cSJim Jagielski { 2240, 0x0016, 12 },
135*b1cdbd2cSJim Jagielski { 2304, 0x0017, 12 },
136*b1cdbd2cSJim Jagielski { 2368, 0x001c, 12 },
137*b1cdbd2cSJim Jagielski { 2432, 0x001d, 12 },
138*b1cdbd2cSJim Jagielski { 2496, 0x001e, 12 },
139*b1cdbd2cSJim Jagielski { 2560, 0x001f, 12 },
140*b1cdbd2cSJim Jagielski { 9999, 0x0001, 12 } // EOL
141*b1cdbd2cSJim Jagielski };
142*b1cdbd2cSJim Jagielski
143*b1cdbd2cSJim Jagielski //---------------------------- Black-Run ------------------------------
144*b1cdbd2cSJim Jagielski
145*b1cdbd2cSJim Jagielski #define CCIBlackTableSize 105
146*b1cdbd2cSJim Jagielski
147*b1cdbd2cSJim Jagielski const CCIHuffmanTableEntry CCIBlackTable[CCIBlackTableSize]={
148*b1cdbd2cSJim Jagielski { 0, 0x0037, 10 },
149*b1cdbd2cSJim Jagielski { 1, 0x0002, 3 },
150*b1cdbd2cSJim Jagielski { 2, 0x0003, 2 },
151*b1cdbd2cSJim Jagielski { 3, 0x0002, 2 },
152*b1cdbd2cSJim Jagielski { 4, 0x0003, 3 },
153*b1cdbd2cSJim Jagielski { 5, 0x0003, 4 },
154*b1cdbd2cSJim Jagielski { 6, 0x0002, 4 },
155*b1cdbd2cSJim Jagielski { 7, 0x0003, 5 },
156*b1cdbd2cSJim Jagielski { 8, 0x0005, 6 },
157*b1cdbd2cSJim Jagielski { 9, 0x0004, 6 },
158*b1cdbd2cSJim Jagielski { 10, 0x0004, 7 },
159*b1cdbd2cSJim Jagielski { 11, 0x0005, 7 },
160*b1cdbd2cSJim Jagielski { 12, 0x0007, 7 },
161*b1cdbd2cSJim Jagielski { 13, 0x0004, 8 },
162*b1cdbd2cSJim Jagielski { 14, 0x0007, 8 },
163*b1cdbd2cSJim Jagielski { 15, 0x0018, 9 },
164*b1cdbd2cSJim Jagielski { 16, 0x0017, 10 },
165*b1cdbd2cSJim Jagielski { 17, 0x0018, 10 },
166*b1cdbd2cSJim Jagielski { 18, 0x0008, 10 },
167*b1cdbd2cSJim Jagielski { 19, 0x0067, 11 },
168*b1cdbd2cSJim Jagielski { 20, 0x0068, 11 },
169*b1cdbd2cSJim Jagielski { 21, 0x006c, 11 },
170*b1cdbd2cSJim Jagielski { 22, 0x0037, 11 },
171*b1cdbd2cSJim Jagielski { 23, 0x0028, 11 },
172*b1cdbd2cSJim Jagielski { 24, 0x0017, 11 },
173*b1cdbd2cSJim Jagielski { 25, 0x0018, 11 },
174*b1cdbd2cSJim Jagielski { 26, 0x00ca, 12 },
175*b1cdbd2cSJim Jagielski { 27, 0x00cb, 12 },
176*b1cdbd2cSJim Jagielski { 28, 0x00cc, 12 },
177*b1cdbd2cSJim Jagielski { 29, 0x00cd, 12 },
178*b1cdbd2cSJim Jagielski { 30, 0x0068, 12 },
179*b1cdbd2cSJim Jagielski { 31, 0x0069, 12 },
180*b1cdbd2cSJim Jagielski { 32, 0x006a, 12 },
181*b1cdbd2cSJim Jagielski { 33, 0x006b, 12 },
182*b1cdbd2cSJim Jagielski { 34, 0x00d2, 12 },
183*b1cdbd2cSJim Jagielski { 35, 0x00d3, 12 },
184*b1cdbd2cSJim Jagielski { 36, 0x00d4, 12 },
185*b1cdbd2cSJim Jagielski { 37, 0x00d5, 12 },
186*b1cdbd2cSJim Jagielski { 38, 0x00d6, 12 },
187*b1cdbd2cSJim Jagielski { 39, 0x00d7, 12 },
188*b1cdbd2cSJim Jagielski { 40, 0x006c, 12 },
189*b1cdbd2cSJim Jagielski { 41, 0x006d, 12 },
190*b1cdbd2cSJim Jagielski { 42, 0x00da, 12 },
191*b1cdbd2cSJim Jagielski { 43, 0x00db, 12 },
192*b1cdbd2cSJim Jagielski { 44, 0x0054, 12 },
193*b1cdbd2cSJim Jagielski { 45, 0x0055, 12 },
194*b1cdbd2cSJim Jagielski { 46, 0x0056, 12 },
195*b1cdbd2cSJim Jagielski { 47, 0x0057, 12 },
196*b1cdbd2cSJim Jagielski { 48, 0x0064, 12 },
197*b1cdbd2cSJim Jagielski { 49, 0x0065, 12 },
198*b1cdbd2cSJim Jagielski { 50, 0x0052, 12 },
199*b1cdbd2cSJim Jagielski { 51, 0x0053, 12 },
200*b1cdbd2cSJim Jagielski { 52, 0x0024, 12 },
201*b1cdbd2cSJim Jagielski { 53, 0x0037, 12 },
202*b1cdbd2cSJim Jagielski { 54, 0x0038, 12 },
203*b1cdbd2cSJim Jagielski { 55, 0x0027, 12 },
204*b1cdbd2cSJim Jagielski { 56, 0x0028, 12 },
205*b1cdbd2cSJim Jagielski { 57, 0x0058, 12 },
206*b1cdbd2cSJim Jagielski { 58, 0x0059, 12 },
207*b1cdbd2cSJim Jagielski { 59, 0x002b, 12 },
208*b1cdbd2cSJim Jagielski { 60, 0x002c, 12 },
209*b1cdbd2cSJim Jagielski { 61, 0x005a, 12 },
210*b1cdbd2cSJim Jagielski { 62, 0x0066, 12 },
211*b1cdbd2cSJim Jagielski { 63, 0x0067, 12 },
212*b1cdbd2cSJim Jagielski { 64, 0x000f, 10 },
213*b1cdbd2cSJim Jagielski { 128, 0x00c8, 12 },
214*b1cdbd2cSJim Jagielski { 192, 0x00c9, 12 },
215*b1cdbd2cSJim Jagielski { 256, 0x005b, 12 },
216*b1cdbd2cSJim Jagielski { 320, 0x0033, 12 },
217*b1cdbd2cSJim Jagielski { 384, 0x0034, 12 },
218*b1cdbd2cSJim Jagielski { 448, 0x0035, 12 },
219*b1cdbd2cSJim Jagielski { 512, 0x006c, 13 },
220*b1cdbd2cSJim Jagielski { 576, 0x006d, 13 },
221*b1cdbd2cSJim Jagielski { 640, 0x004a, 13 },
222*b1cdbd2cSJim Jagielski { 704, 0x004b, 13 },
223*b1cdbd2cSJim Jagielski { 768, 0x004c, 13 },
224*b1cdbd2cSJim Jagielski { 832, 0x004d, 13 },
225*b1cdbd2cSJim Jagielski { 896, 0x0072, 13 },
226*b1cdbd2cSJim Jagielski { 960, 0x0073, 13 },
227*b1cdbd2cSJim Jagielski { 1024, 0x0074, 13 },
228*b1cdbd2cSJim Jagielski { 1088, 0x0075, 13 },
229*b1cdbd2cSJim Jagielski { 1152, 0x0076, 13 },
230*b1cdbd2cSJim Jagielski { 1216, 0x0077, 13 },
231*b1cdbd2cSJim Jagielski { 1280, 0x0052, 13 },
232*b1cdbd2cSJim Jagielski { 1344, 0x0053, 13 },
233*b1cdbd2cSJim Jagielski { 1408, 0x0054, 13 },
234*b1cdbd2cSJim Jagielski { 1472, 0x0055, 13 },
235*b1cdbd2cSJim Jagielski { 1536, 0x005a, 13 },
236*b1cdbd2cSJim Jagielski { 1600, 0x005b, 13 },
237*b1cdbd2cSJim Jagielski { 1664, 0x0064, 13 },
238*b1cdbd2cSJim Jagielski { 1728, 0x0065, 13 },
239*b1cdbd2cSJim Jagielski { 1792, 0x0008, 11 },
240*b1cdbd2cSJim Jagielski { 1856, 0x000c, 11 },
241*b1cdbd2cSJim Jagielski { 1920, 0x000d, 11 },
242*b1cdbd2cSJim Jagielski { 1984, 0x0012, 12 },
243*b1cdbd2cSJim Jagielski { 2048, 0x0013, 12 },
244*b1cdbd2cSJim Jagielski { 2112, 0x0014, 12 },
245*b1cdbd2cSJim Jagielski { 2176, 0x0015, 12 },
246*b1cdbd2cSJim Jagielski { 2240, 0x0016, 12 },
247*b1cdbd2cSJim Jagielski { 2304, 0x0017, 12 },
248*b1cdbd2cSJim Jagielski { 2368, 0x001c, 12 },
249*b1cdbd2cSJim Jagielski { 2432, 0x001d, 12 },
250*b1cdbd2cSJim Jagielski { 2496, 0x001e, 12 },
251*b1cdbd2cSJim Jagielski { 2560, 0x001f, 12 },
252*b1cdbd2cSJim Jagielski { 9999, 0x0001, 12 } // EOL
253*b1cdbd2cSJim Jagielski };
254*b1cdbd2cSJim Jagielski
255*b1cdbd2cSJim Jagielski
256*b1cdbd2cSJim Jagielski //---------------------------- 2D-Mode --------------------------------
257*b1cdbd2cSJim Jagielski
258*b1cdbd2cSJim Jagielski #define CCI2DMODE_UNCOMP 0
259*b1cdbd2cSJim Jagielski #define CCI2DMODE_PASS 1
260*b1cdbd2cSJim Jagielski #define CCI2DMODE_HORZ 2
261*b1cdbd2cSJim Jagielski #define CCI2DMODE_VERT_L3 3
262*b1cdbd2cSJim Jagielski #define CCI2DMODE_VERT_L2 4
263*b1cdbd2cSJim Jagielski #define CCI2DMODE_VERT_L1 5
264*b1cdbd2cSJim Jagielski #define CCI2DMODE_VERT_0 6
265*b1cdbd2cSJim Jagielski #define CCI2DMODE_VERT_R1 7
266*b1cdbd2cSJim Jagielski #define CCI2DMODE_VERT_R2 8
267*b1cdbd2cSJim Jagielski #define CCI2DMODE_VERT_R3 9
268*b1cdbd2cSJim Jagielski
269*b1cdbd2cSJim Jagielski #define CCI2DModeTableSize 10
270*b1cdbd2cSJim Jagielski
271*b1cdbd2cSJim Jagielski const CCIHuffmanTableEntry CCI2DModeTable[CCI2DModeTableSize]={
272*b1cdbd2cSJim Jagielski { CCI2DMODE_UNCOMP , 0x000f, 10 },
273*b1cdbd2cSJim Jagielski { CCI2DMODE_PASS , 0x0001, 4 },
274*b1cdbd2cSJim Jagielski { CCI2DMODE_HORZ , 0x0001, 3 },
275*b1cdbd2cSJim Jagielski { CCI2DMODE_VERT_L3, 0x0002, 7 },
276*b1cdbd2cSJim Jagielski { CCI2DMODE_VERT_L2, 0x0002, 6 },
277*b1cdbd2cSJim Jagielski { CCI2DMODE_VERT_L1, 0x0002, 3 },
278*b1cdbd2cSJim Jagielski { CCI2DMODE_VERT_0 , 0x0001, 1 },
279*b1cdbd2cSJim Jagielski { CCI2DMODE_VERT_R1, 0x0003, 3 },
280*b1cdbd2cSJim Jagielski { CCI2DMODE_VERT_R2, 0x0003, 6 },
281*b1cdbd2cSJim Jagielski { CCI2DMODE_VERT_R3, 0x0003, 7 }
282*b1cdbd2cSJim Jagielski };
283*b1cdbd2cSJim Jagielski
284*b1cdbd2cSJim Jagielski
285*b1cdbd2cSJim Jagielski //-------------------------- 2D-Uncompressed-Mode ----------------------
286*b1cdbd2cSJim Jagielski
287*b1cdbd2cSJim Jagielski #define CCIUNCOMP_0White_1Black 0
288*b1cdbd2cSJim Jagielski #define CCIUNCOMP_1White_1Black 1
289*b1cdbd2cSJim Jagielski #define CCIUNCOMP_2White_1Black 2
290*b1cdbd2cSJim Jagielski #define CCIUNCOMP_3White_1Black 3
291*b1cdbd2cSJim Jagielski #define CCIUNCOMP_4White_1Black 4
292*b1cdbd2cSJim Jagielski #define CCIUNCOMP_5White 5
293*b1cdbd2cSJim Jagielski #define CCIUNCOMP_0White_End 6
294*b1cdbd2cSJim Jagielski #define CCIUNCOMP_1White_End 7
295*b1cdbd2cSJim Jagielski #define CCIUNCOMP_2White_End 8
296*b1cdbd2cSJim Jagielski #define CCIUNCOMP_3White_End 9
297*b1cdbd2cSJim Jagielski #define CCIUNCOMP_4White_End 10
298*b1cdbd2cSJim Jagielski
299*b1cdbd2cSJim Jagielski #define CCIUncompTableSize 11
300*b1cdbd2cSJim Jagielski
301*b1cdbd2cSJim Jagielski const CCIHuffmanTableEntry CCIUncompTable[CCIUncompTableSize]={
302*b1cdbd2cSJim Jagielski { CCIUNCOMP_0White_1Black, 0x0001, 1 },
303*b1cdbd2cSJim Jagielski { CCIUNCOMP_1White_1Black, 0x0001, 2 },
304*b1cdbd2cSJim Jagielski { CCIUNCOMP_2White_1Black, 0x0001, 3 },
305*b1cdbd2cSJim Jagielski { CCIUNCOMP_3White_1Black, 0x0001, 4 },
306*b1cdbd2cSJim Jagielski { CCIUNCOMP_4White_1Black, 0x0001, 5 },
307*b1cdbd2cSJim Jagielski { CCIUNCOMP_5White , 0x0001, 6 },
308*b1cdbd2cSJim Jagielski { CCIUNCOMP_0White_End , 0x0001, 7 },
309*b1cdbd2cSJim Jagielski { CCIUNCOMP_1White_End , 0x0001, 8 },
310*b1cdbd2cSJim Jagielski { CCIUNCOMP_2White_End , 0x0001, 9 },
311*b1cdbd2cSJim Jagielski { CCIUNCOMP_3White_End , 0x0001, 10 },
312*b1cdbd2cSJim Jagielski { CCIUNCOMP_4White_End , 0x0001, 11 }
313*b1cdbd2cSJim Jagielski };
314*b1cdbd2cSJim Jagielski
315*b1cdbd2cSJim Jagielski
316*b1cdbd2cSJim Jagielski //================== Sicherheitskopie der Huffman-Tabellen ================
317*b1cdbd2cSJim Jagielski // Um sicher zugehen, dass die Huffman-Tabellen keine Fehler enthalten,
318*b1cdbd2cSJim Jagielski // wurden sie zweimal von unterschiedlichen Quellen eingegeben (Uff) und
319*b1cdbd2cSJim Jagielski // verglichen.
320*b1cdbd2cSJim Jagielski // Da sich aber im Laufe der Pflege des Source-Codes mal ein Fehler
321*b1cdbd2cSJim Jagielski // einschleichen koennte (z.B. versehentlicher druck einer Taste im Editor)
322*b1cdbd2cSJim Jagielski // werden die Tablellen hier weiterhin zweimal aufgefuehrt und zur Laufzeit
323*b1cdbd2cSJim Jagielski // verglichen. (Wenn der Vergleich fehlschlaegt, liefert CCIDecompressor
324*b1cdbd2cSJim Jagielski // immer einen Fehler). Das Ganze mag etwas wahnsinnig erscheinen, aber ein Fehler
325*b1cdbd2cSJim Jagielski // in den Tabellen waere sonst sehr sehr schwer zu erkennen, zumal es
326*b1cdbd2cSJim Jagielski // unwahrscheinlich ist, dass eine oder mehere Beispieldateien alle Codes
327*b1cdbd2cSJim Jagielski // durchlaufen.
328*b1cdbd2cSJim Jagielski
329*b1cdbd2cSJim Jagielski const CCIHuffmanTableEntry CCIWhiteTableSave[CCIWhiteTableSize]={
330*b1cdbd2cSJim Jagielski { 0, 0x0035, 8 },
331*b1cdbd2cSJim Jagielski { 1, 0x0007, 6 },
332*b1cdbd2cSJim Jagielski { 2, 0x0007, 4 },
333*b1cdbd2cSJim Jagielski { 3, 0x0008, 4 },
334*b1cdbd2cSJim Jagielski { 4, 0x000b, 4 },
335*b1cdbd2cSJim Jagielski { 5, 0x000c, 4 },
336*b1cdbd2cSJim Jagielski { 6, 0x000e, 4 },
337*b1cdbd2cSJim Jagielski { 7, 0x000f, 4 },
338*b1cdbd2cSJim Jagielski { 8, 0x0013, 5 },
339*b1cdbd2cSJim Jagielski { 9, 0x0014, 5 },
340*b1cdbd2cSJim Jagielski { 10, 0x0007, 5 },
341*b1cdbd2cSJim Jagielski { 11, 0x0008, 5 },
342*b1cdbd2cSJim Jagielski { 12, 0x0008, 6 },
343*b1cdbd2cSJim Jagielski { 13, 0x0003, 6 },
344*b1cdbd2cSJim Jagielski { 14, 0x0034, 6 },
345*b1cdbd2cSJim Jagielski { 15, 0x0035, 6 },
346*b1cdbd2cSJim Jagielski { 16, 0x002a, 6 },
347*b1cdbd2cSJim Jagielski { 17, 0x002b, 6 },
348*b1cdbd2cSJim Jagielski { 18, 0x0027, 7 },
349*b1cdbd2cSJim Jagielski { 19, 0x000c, 7 },
350*b1cdbd2cSJim Jagielski { 20, 0x0008, 7 },
351*b1cdbd2cSJim Jagielski { 21, 0x0017, 7 },
352*b1cdbd2cSJim Jagielski { 22, 0x0003, 7 },
353*b1cdbd2cSJim Jagielski { 23, 0x0004, 7 },
354*b1cdbd2cSJim Jagielski { 24, 0x0028, 7 },
355*b1cdbd2cSJim Jagielski { 25, 0x002b, 7 },
356*b1cdbd2cSJim Jagielski { 26, 0x0013, 7 },
357*b1cdbd2cSJim Jagielski { 27, 0x0024, 7 },
358*b1cdbd2cSJim Jagielski { 28, 0x0018, 7 },
359*b1cdbd2cSJim Jagielski { 29, 0x0002, 8 },
360*b1cdbd2cSJim Jagielski { 30, 0x0003, 8 },
361*b1cdbd2cSJim Jagielski { 31, 0x001a, 8 },
362*b1cdbd2cSJim Jagielski { 32, 0x001b, 8 },
363*b1cdbd2cSJim Jagielski { 33, 0x0012, 8 },
364*b1cdbd2cSJim Jagielski { 34, 0x0013, 8 },
365*b1cdbd2cSJim Jagielski { 35, 0x0014, 8 },
366*b1cdbd2cSJim Jagielski { 36, 0x0015, 8 },
367*b1cdbd2cSJim Jagielski { 37, 0x0016, 8 },
368*b1cdbd2cSJim Jagielski { 38, 0x0017, 8 },
369*b1cdbd2cSJim Jagielski { 39, 0x0028, 8 },
370*b1cdbd2cSJim Jagielski { 40, 0x0029, 8 },
371*b1cdbd2cSJim Jagielski { 41, 0x002a, 8 },
372*b1cdbd2cSJim Jagielski { 42, 0x002b, 8 },
373*b1cdbd2cSJim Jagielski { 43, 0x002c, 8 },
374*b1cdbd2cSJim Jagielski { 44, 0x002d, 8 },
375*b1cdbd2cSJim Jagielski { 45, 0x0004, 8 },
376*b1cdbd2cSJim Jagielski { 46, 0x0005, 8 },
377*b1cdbd2cSJim Jagielski { 47, 0x000a, 8 },
378*b1cdbd2cSJim Jagielski { 48, 0x000b, 8 },
379*b1cdbd2cSJim Jagielski { 49, 0x0052, 8 },
380*b1cdbd2cSJim Jagielski { 50, 0x0053, 8 },
381*b1cdbd2cSJim Jagielski { 51, 0x0054, 8 },
382*b1cdbd2cSJim Jagielski { 52, 0x0055, 8 },
383*b1cdbd2cSJim Jagielski { 53, 0x0024, 8 },
384*b1cdbd2cSJim Jagielski { 54, 0x0025, 8 },
385*b1cdbd2cSJim Jagielski { 55, 0x0058, 8 },
386*b1cdbd2cSJim Jagielski { 56, 0x0059, 8 },
387*b1cdbd2cSJim Jagielski { 57, 0x005a, 8 },
388*b1cdbd2cSJim Jagielski { 58, 0x005b, 8 },
389*b1cdbd2cSJim Jagielski { 59, 0x004a, 8 },
390*b1cdbd2cSJim Jagielski { 60, 0x004b, 8 },
391*b1cdbd2cSJim Jagielski { 61, 0x0032, 8 },
392*b1cdbd2cSJim Jagielski { 62, 0x0033, 8 },
393*b1cdbd2cSJim Jagielski { 63, 0x0034, 8 },
394*b1cdbd2cSJim Jagielski { 64, 0x001b, 5 },
395*b1cdbd2cSJim Jagielski { 128, 0x0012, 5 },
396*b1cdbd2cSJim Jagielski { 192, 0x0017, 6 },
397*b1cdbd2cSJim Jagielski { 256, 0x0037, 7 },
398*b1cdbd2cSJim Jagielski { 320, 0x0036, 8 },
399*b1cdbd2cSJim Jagielski { 384, 0x0037, 8 },
400*b1cdbd2cSJim Jagielski { 448, 0x0064, 8 },
401*b1cdbd2cSJim Jagielski { 512, 0x0065, 8 },
402*b1cdbd2cSJim Jagielski { 576, 0x0068, 8 },
403*b1cdbd2cSJim Jagielski { 640, 0x0067, 8 },
404*b1cdbd2cSJim Jagielski { 704, 0x00cc, 9 },
405*b1cdbd2cSJim Jagielski { 768, 0x00cd, 9 },
406*b1cdbd2cSJim Jagielski { 832, 0x00d2, 9 },
407*b1cdbd2cSJim Jagielski { 896, 0x00d3, 9 },
408*b1cdbd2cSJim Jagielski { 960, 0x00d4, 9 },
409*b1cdbd2cSJim Jagielski { 1024, 0x00d5, 9 },
410*b1cdbd2cSJim Jagielski { 1088, 0x00d6, 9 },
411*b1cdbd2cSJim Jagielski { 1152, 0x00d7, 9 },
412*b1cdbd2cSJim Jagielski { 1216, 0x00d8, 9 },
413*b1cdbd2cSJim Jagielski { 1280, 0x00d9, 9 },
414*b1cdbd2cSJim Jagielski { 1344, 0x00da, 9 },
415*b1cdbd2cSJim Jagielski { 1408, 0x00db, 9 },
416*b1cdbd2cSJim Jagielski { 1472, 0x0098, 9 },
417*b1cdbd2cSJim Jagielski { 1536, 0x0099, 9 },
418*b1cdbd2cSJim Jagielski { 1600, 0x009a, 9 },
419*b1cdbd2cSJim Jagielski { 1664, 0x0018, 6 },
420*b1cdbd2cSJim Jagielski { 1728, 0x009b, 9 },
421*b1cdbd2cSJim Jagielski { 1792, 0x0008, 11 },
422*b1cdbd2cSJim Jagielski { 1856, 0x000c, 11 },
423*b1cdbd2cSJim Jagielski { 1920, 0x000d, 11 },
424*b1cdbd2cSJim Jagielski { 1984, 0x0012, 12 },
425*b1cdbd2cSJim Jagielski { 2048, 0x0013, 12 },
426*b1cdbd2cSJim Jagielski { 2112, 0x0014, 12 },
427*b1cdbd2cSJim Jagielski { 2176, 0x0015, 12 },
428*b1cdbd2cSJim Jagielski { 2240, 0x0016, 12 },
429*b1cdbd2cSJim Jagielski { 2304, 0x0017, 12 },
430*b1cdbd2cSJim Jagielski { 2368, 0x001c, 12 },
431*b1cdbd2cSJim Jagielski { 2432, 0x001d, 12 },
432*b1cdbd2cSJim Jagielski { 2496, 0x001e, 12 },
433*b1cdbd2cSJim Jagielski { 2560, 0x001f, 12 },
434*b1cdbd2cSJim Jagielski { 9999, 0x0001, 12 } // EOL
435*b1cdbd2cSJim Jagielski };
436*b1cdbd2cSJim Jagielski
437*b1cdbd2cSJim Jagielski const CCIHuffmanTableEntry CCIBlackTableSave[CCIBlackTableSize]={
438*b1cdbd2cSJim Jagielski { 0, 0x0037, 10 },
439*b1cdbd2cSJim Jagielski { 1, 0x0002, 3 },
440*b1cdbd2cSJim Jagielski { 2, 0x0003, 2 },
441*b1cdbd2cSJim Jagielski { 3, 0x0002, 2 },
442*b1cdbd2cSJim Jagielski { 4, 0x0003, 3 },
443*b1cdbd2cSJim Jagielski { 5, 0x0003, 4 },
444*b1cdbd2cSJim Jagielski { 6, 0x0002, 4 },
445*b1cdbd2cSJim Jagielski { 7, 0x0003, 5 },
446*b1cdbd2cSJim Jagielski { 8, 0x0005, 6 },
447*b1cdbd2cSJim Jagielski { 9, 0x0004, 6 },
448*b1cdbd2cSJim Jagielski { 10, 0x0004, 7 },
449*b1cdbd2cSJim Jagielski { 11, 0x0005, 7 },
450*b1cdbd2cSJim Jagielski { 12, 0x0007, 7 },
451*b1cdbd2cSJim Jagielski { 13, 0x0004, 8 },
452*b1cdbd2cSJim Jagielski { 14, 0x0007, 8 },
453*b1cdbd2cSJim Jagielski { 15, 0x0018, 9 },
454*b1cdbd2cSJim Jagielski { 16, 0x0017, 10 },
455*b1cdbd2cSJim Jagielski { 17, 0x0018, 10 },
456*b1cdbd2cSJim Jagielski { 18, 0x0008, 10 },
457*b1cdbd2cSJim Jagielski { 19, 0x0067, 11 },
458*b1cdbd2cSJim Jagielski { 20, 0x0068, 11 },
459*b1cdbd2cSJim Jagielski { 21, 0x006c, 11 },
460*b1cdbd2cSJim Jagielski { 22, 0x0037, 11 },
461*b1cdbd2cSJim Jagielski { 23, 0x0028, 11 },
462*b1cdbd2cSJim Jagielski { 24, 0x0017, 11 },
463*b1cdbd2cSJim Jagielski { 25, 0x0018, 11 },
464*b1cdbd2cSJim Jagielski { 26, 0x00ca, 12 },
465*b1cdbd2cSJim Jagielski { 27, 0x00cb, 12 },
466*b1cdbd2cSJim Jagielski { 28, 0x00cc, 12 },
467*b1cdbd2cSJim Jagielski { 29, 0x00cd, 12 },
468*b1cdbd2cSJim Jagielski { 30, 0x0068, 12 },
469*b1cdbd2cSJim Jagielski { 31, 0x0069, 12 },
470*b1cdbd2cSJim Jagielski { 32, 0x006a, 12 },
471*b1cdbd2cSJim Jagielski { 33, 0x006b, 12 },
472*b1cdbd2cSJim Jagielski { 34, 0x00d2, 12 },
473*b1cdbd2cSJim Jagielski { 35, 0x00d3, 12 },
474*b1cdbd2cSJim Jagielski { 36, 0x00d4, 12 },
475*b1cdbd2cSJim Jagielski { 37, 0x00d5, 12 },
476*b1cdbd2cSJim Jagielski { 38, 0x00d6, 12 },
477*b1cdbd2cSJim Jagielski { 39, 0x00d7, 12 },
478*b1cdbd2cSJim Jagielski { 40, 0x006c, 12 },
479*b1cdbd2cSJim Jagielski { 41, 0x006d, 12 },
480*b1cdbd2cSJim Jagielski { 42, 0x00da, 12 },
481*b1cdbd2cSJim Jagielski { 43, 0x00db, 12 },
482*b1cdbd2cSJim Jagielski { 44, 0x0054, 12 },
483*b1cdbd2cSJim Jagielski { 45, 0x0055, 12 },
484*b1cdbd2cSJim Jagielski { 46, 0x0056, 12 },
485*b1cdbd2cSJim Jagielski { 47, 0x0057, 12 },
486*b1cdbd2cSJim Jagielski { 48, 0x0064, 12 },
487*b1cdbd2cSJim Jagielski { 49, 0x0065, 12 },
488*b1cdbd2cSJim Jagielski { 50, 0x0052, 12 },
489*b1cdbd2cSJim Jagielski { 51, 0x0053, 12 },
490*b1cdbd2cSJim Jagielski { 52, 0x0024, 12 },
491*b1cdbd2cSJim Jagielski { 53, 0x0037, 12 },
492*b1cdbd2cSJim Jagielski { 54, 0x0038, 12 },
493*b1cdbd2cSJim Jagielski { 55, 0x0027, 12 },
494*b1cdbd2cSJim Jagielski { 56, 0x0028, 12 },
495*b1cdbd2cSJim Jagielski { 57, 0x0058, 12 },
496*b1cdbd2cSJim Jagielski { 58, 0x0059, 12 },
497*b1cdbd2cSJim Jagielski { 59, 0x002b, 12 },
498*b1cdbd2cSJim Jagielski { 60, 0x002c, 12 },
499*b1cdbd2cSJim Jagielski { 61, 0x005a, 12 },
500*b1cdbd2cSJim Jagielski { 62, 0x0066, 12 },
501*b1cdbd2cSJim Jagielski { 63, 0x0067, 12 },
502*b1cdbd2cSJim Jagielski { 64, 0x000f, 10 },
503*b1cdbd2cSJim Jagielski { 128, 0x00c8, 12 },
504*b1cdbd2cSJim Jagielski { 192, 0x00c9, 12 },
505*b1cdbd2cSJim Jagielski { 256, 0x005b, 12 },
506*b1cdbd2cSJim Jagielski { 320, 0x0033, 12 },
507*b1cdbd2cSJim Jagielski { 384, 0x0034, 12 },
508*b1cdbd2cSJim Jagielski { 448, 0x0035, 12 },
509*b1cdbd2cSJim Jagielski { 512, 0x006c, 13 },
510*b1cdbd2cSJim Jagielski { 576, 0x006d, 13 },
511*b1cdbd2cSJim Jagielski { 640, 0x004a, 13 },
512*b1cdbd2cSJim Jagielski { 704, 0x004b, 13 },
513*b1cdbd2cSJim Jagielski { 768, 0x004c, 13 },
514*b1cdbd2cSJim Jagielski { 832, 0x004d, 13 },
515*b1cdbd2cSJim Jagielski { 896, 0x0072, 13 },
516*b1cdbd2cSJim Jagielski { 960, 0x0073, 13 },
517*b1cdbd2cSJim Jagielski { 1024, 0x0074, 13 },
518*b1cdbd2cSJim Jagielski { 1088, 0x0075, 13 },
519*b1cdbd2cSJim Jagielski { 1152, 0x0076, 13 },
520*b1cdbd2cSJim Jagielski { 1216, 0x0077, 13 },
521*b1cdbd2cSJim Jagielski { 1280, 0x0052, 13 },
522*b1cdbd2cSJim Jagielski { 1344, 0x0053, 13 },
523*b1cdbd2cSJim Jagielski { 1408, 0x0054, 13 },
524*b1cdbd2cSJim Jagielski { 1472, 0x0055, 13 },
525*b1cdbd2cSJim Jagielski { 1536, 0x005a, 13 },
526*b1cdbd2cSJim Jagielski { 1600, 0x005b, 13 },
527*b1cdbd2cSJim Jagielski { 1664, 0x0064, 13 },
528*b1cdbd2cSJim Jagielski { 1728, 0x0065, 13 },
529*b1cdbd2cSJim Jagielski { 1792, 0x0008, 11 },
530*b1cdbd2cSJim Jagielski { 1856, 0x000c, 11 },
531*b1cdbd2cSJim Jagielski { 1920, 0x000d, 11 },
532*b1cdbd2cSJim Jagielski { 1984, 0x0012, 12 },
533*b1cdbd2cSJim Jagielski { 2048, 0x0013, 12 },
534*b1cdbd2cSJim Jagielski { 2112, 0x0014, 12 },
535*b1cdbd2cSJim Jagielski { 2176, 0x0015, 12 },
536*b1cdbd2cSJim Jagielski { 2240, 0x0016, 12 },
537*b1cdbd2cSJim Jagielski { 2304, 0x0017, 12 },
538*b1cdbd2cSJim Jagielski { 2368, 0x001c, 12 },
539*b1cdbd2cSJim Jagielski { 2432, 0x001d, 12 },
540*b1cdbd2cSJim Jagielski { 2496, 0x001e, 12 },
541*b1cdbd2cSJim Jagielski { 2560, 0x001f, 12 },
542*b1cdbd2cSJim Jagielski { 9999, 0x0001, 12 } // EOL
543*b1cdbd2cSJim Jagielski };
544*b1cdbd2cSJim Jagielski
545*b1cdbd2cSJim Jagielski
546*b1cdbd2cSJim Jagielski const CCIHuffmanTableEntry CCI2DModeTableSave[CCI2DModeTableSize]={
547*b1cdbd2cSJim Jagielski { CCI2DMODE_UNCOMP , 0x000f, 10 },
548*b1cdbd2cSJim Jagielski { CCI2DMODE_PASS , 0x0001, 4 },
549*b1cdbd2cSJim Jagielski { CCI2DMODE_HORZ , 0x0001, 3 },
550*b1cdbd2cSJim Jagielski { CCI2DMODE_VERT_L3, 0x0002, 7 },
551*b1cdbd2cSJim Jagielski { CCI2DMODE_VERT_L2, 0x0002, 6 },
552*b1cdbd2cSJim Jagielski { CCI2DMODE_VERT_L1, 0x0002, 3 },
553*b1cdbd2cSJim Jagielski { CCI2DMODE_VERT_0 , 0x0001, 1 },
554*b1cdbd2cSJim Jagielski { CCI2DMODE_VERT_R1, 0x0003, 3 },
555*b1cdbd2cSJim Jagielski { CCI2DMODE_VERT_R2, 0x0003, 6 },
556*b1cdbd2cSJim Jagielski { CCI2DMODE_VERT_R3, 0x0003, 7 }
557*b1cdbd2cSJim Jagielski };
558*b1cdbd2cSJim Jagielski
559*b1cdbd2cSJim Jagielski
560*b1cdbd2cSJim Jagielski const CCIHuffmanTableEntry CCIUncompTableSave[CCIUncompTableSize]={
561*b1cdbd2cSJim Jagielski { CCIUNCOMP_0White_1Black, 0x0001, 1 },
562*b1cdbd2cSJim Jagielski { CCIUNCOMP_1White_1Black, 0x0001, 2 },
563*b1cdbd2cSJim Jagielski { CCIUNCOMP_2White_1Black, 0x0001, 3 },
564*b1cdbd2cSJim Jagielski { CCIUNCOMP_3White_1Black, 0x0001, 4 },
565*b1cdbd2cSJim Jagielski { CCIUNCOMP_4White_1Black, 0x0001, 5 },
566*b1cdbd2cSJim Jagielski { CCIUNCOMP_5White , 0x0001, 6 },
567*b1cdbd2cSJim Jagielski { CCIUNCOMP_0White_End , 0x0001, 7 },
568*b1cdbd2cSJim Jagielski { CCIUNCOMP_1White_End , 0x0001, 8 },
569*b1cdbd2cSJim Jagielski { CCIUNCOMP_2White_End , 0x0001, 9 },
570*b1cdbd2cSJim Jagielski { CCIUNCOMP_3White_End , 0x0001, 10 },
571*b1cdbd2cSJim Jagielski { CCIUNCOMP_4White_End , 0x0001, 11 }
572*b1cdbd2cSJim Jagielski };
573*b1cdbd2cSJim Jagielski
574*b1cdbd2cSJim Jagielski //=========================================================================
575*b1cdbd2cSJim Jagielski
576*b1cdbd2cSJim Jagielski
CCIDecompressor(sal_uLong nOpts,sal_uInt32 nImageWidth)577*b1cdbd2cSJim Jagielski CCIDecompressor::CCIDecompressor( sal_uLong nOpts, sal_uInt32 nImageWidth ) :
578*b1cdbd2cSJim Jagielski bTableBad ( sal_False ),
579*b1cdbd2cSJim Jagielski bStatus ( sal_False ),
580*b1cdbd2cSJim Jagielski pByteSwap ( NULL ),
581*b1cdbd2cSJim Jagielski nWidth ( nImageWidth ),
582*b1cdbd2cSJim Jagielski nOptions ( nOpts ),
583*b1cdbd2cSJim Jagielski pLastLine ( NULL )
584*b1cdbd2cSJim Jagielski {
585*b1cdbd2cSJim Jagielski if ( nOpts & CCI_OPTION_INVERSEBITORDER )
586*b1cdbd2cSJim Jagielski {
587*b1cdbd2cSJim Jagielski pByteSwap = new sal_uInt8[ 256 ];
588*b1cdbd2cSJim Jagielski for ( int i = 0; i < 256; i++ )
589*b1cdbd2cSJim Jagielski {
590*b1cdbd2cSJim Jagielski pByteSwap[ i ] = sal::static_int_cast< sal_uInt8 >(
591*b1cdbd2cSJim Jagielski ( i << 7 ) | ( ( i & 2 ) << 5 ) | ( ( i & 4 ) << 3 ) | ( ( i & 8 ) << 1 ) |
592*b1cdbd2cSJim Jagielski ( ( i & 16 ) >> 1 ) | ( ( i & 32 ) >> 3 ) | ( ( i & 64 ) >> 5 ) | ( ( i & 128 ) >> 7 ));
593*b1cdbd2cSJim Jagielski }
594*b1cdbd2cSJim Jagielski }
595*b1cdbd2cSJim Jagielski
596*b1cdbd2cSJim Jagielski pWhiteLookUp =new CCILookUpTableEntry[1<<13];
597*b1cdbd2cSJim Jagielski pBlackLookUp =new CCILookUpTableEntry[1<<13];
598*b1cdbd2cSJim Jagielski p2DModeLookUp=new CCILookUpTableEntry[1<<10];
599*b1cdbd2cSJim Jagielski pUncompLookUp=new CCILookUpTableEntry[1<<11];
600*b1cdbd2cSJim Jagielski
601*b1cdbd2cSJim Jagielski MakeLookUp(CCIWhiteTable,CCIWhiteTableSave,pWhiteLookUp,CCIWhiteTableSize,13);
602*b1cdbd2cSJim Jagielski MakeLookUp(CCIBlackTable,CCIBlackTableSave,pBlackLookUp,CCIBlackTableSize,13);
603*b1cdbd2cSJim Jagielski MakeLookUp(CCI2DModeTable,CCI2DModeTableSave,p2DModeLookUp,CCI2DModeTableSize,10);
604*b1cdbd2cSJim Jagielski MakeLookUp(CCIUncompTable,CCIUncompTableSave,pUncompLookUp,CCIUncompTableSize,11);
605*b1cdbd2cSJim Jagielski }
606*b1cdbd2cSJim Jagielski
607*b1cdbd2cSJim Jagielski
~CCIDecompressor()608*b1cdbd2cSJim Jagielski CCIDecompressor::~CCIDecompressor()
609*b1cdbd2cSJim Jagielski {
610*b1cdbd2cSJim Jagielski delete[] pByteSwap;
611*b1cdbd2cSJim Jagielski delete[] pLastLine;
612*b1cdbd2cSJim Jagielski delete[] pWhiteLookUp;
613*b1cdbd2cSJim Jagielski delete[] pBlackLookUp;
614*b1cdbd2cSJim Jagielski delete[] p2DModeLookUp;
615*b1cdbd2cSJim Jagielski delete[] pUncompLookUp;
616*b1cdbd2cSJim Jagielski }
617*b1cdbd2cSJim Jagielski
618*b1cdbd2cSJim Jagielski
StartDecompression(SvStream & rIStream)619*b1cdbd2cSJim Jagielski void CCIDecompressor::StartDecompression( SvStream & rIStream )
620*b1cdbd2cSJim Jagielski {
621*b1cdbd2cSJim Jagielski pIStream = &rIStream;
622*b1cdbd2cSJim Jagielski nInputBitsBufSize = 0;
623*b1cdbd2cSJim Jagielski bFirstEOL = sal_True;
624*b1cdbd2cSJim Jagielski bStatus = sal_True;
625*b1cdbd2cSJim Jagielski nEOLCount = 0;
626*b1cdbd2cSJim Jagielski
627*b1cdbd2cSJim Jagielski if ( bTableBad == sal_True )
628*b1cdbd2cSJim Jagielski return;
629*b1cdbd2cSJim Jagielski }
630*b1cdbd2cSJim Jagielski
631*b1cdbd2cSJim Jagielski
DecompressScanline(sal_uInt8 * pTarget,sal_uLong nTargetBits)632*b1cdbd2cSJim Jagielski sal_Bool CCIDecompressor::DecompressScanline( sal_uInt8 * pTarget, sal_uLong nTargetBits )
633*b1cdbd2cSJim Jagielski {
634*b1cdbd2cSJim Jagielski sal_uInt16 i;
635*b1cdbd2cSJim Jagielski sal_uInt8 * pSrc,* pDst;
636*b1cdbd2cSJim Jagielski sal_Bool b2D;
637*b1cdbd2cSJim Jagielski
638*b1cdbd2cSJim Jagielski if ( nEOLCount >= 5 ) // RTC( Return To Controller )
639*b1cdbd2cSJim Jagielski return sal_True;
640*b1cdbd2cSJim Jagielski
641*b1cdbd2cSJim Jagielski if ( bStatus == sal_False )
642*b1cdbd2cSJim Jagielski return sal_False;
643*b1cdbd2cSJim Jagielski
644*b1cdbd2cSJim Jagielski // Wenn EOL-Codes vorhanden sind, steht der EOL-Code auch vor der ersten Zeile.
645*b1cdbd2cSJim Jagielski // (und ich dachte EOL heisst 'End Of Line'...)
646*b1cdbd2cSJim Jagielski // Daher lesen wir den EOL-Code immer vor jeder Zeile als erstes ein:
647*b1cdbd2cSJim Jagielski if ( nOptions & CCI_OPTION_EOL )
648*b1cdbd2cSJim Jagielski {
649*b1cdbd2cSJim Jagielski if ( bFirstEOL )
650*b1cdbd2cSJim Jagielski {
651*b1cdbd2cSJim Jagielski sal_uInt32 nCurPos = pIStream->Tell();
652*b1cdbd2cSJim Jagielski sal_uInt16 nOldInputBitsBufSize = nInputBitsBufSize;
653*b1cdbd2cSJim Jagielski sal_uInt32 nOldInputBitsBuf = nInputBitsBuf;
654*b1cdbd2cSJim Jagielski if ( ReadEOL( 32 ) == sal_False )
655*b1cdbd2cSJim Jagielski {
656*b1cdbd2cSJim Jagielski nInputBitsBufSize = nOldInputBitsBufSize;
657*b1cdbd2cSJim Jagielski nInputBitsBuf = nOldInputBitsBuf;
658*b1cdbd2cSJim Jagielski pIStream->Seek( nCurPos );
659*b1cdbd2cSJim Jagielski nOptions &=~ CCI_OPTION_EOL; // CCITT Group 3 - Compression Type 2
660*b1cdbd2cSJim Jagielski }
661*b1cdbd2cSJim Jagielski bFirstEOL = sal_False;
662*b1cdbd2cSJim Jagielski }
663*b1cdbd2cSJim Jagielski else
664*b1cdbd2cSJim Jagielski {
665*b1cdbd2cSJim Jagielski if ( ReadEOL( nTargetBits ) == sal_False )
666*b1cdbd2cSJim Jagielski {
667*b1cdbd2cSJim Jagielski return bStatus;
668*b1cdbd2cSJim Jagielski }
669*b1cdbd2cSJim Jagielski }
670*b1cdbd2cSJim Jagielski }
671*b1cdbd2cSJim Jagielski
672*b1cdbd2cSJim Jagielski if ( nEOLCount >= 5 ) // RTC( Return To Controller )
673*b1cdbd2cSJim Jagielski return sal_True;
674*b1cdbd2cSJim Jagielski
675*b1cdbd2cSJim Jagielski // ggf. eine weisse vorherige Zeile herstellen fuer 2D:
676*b1cdbd2cSJim Jagielski if ( nOptions & CCI_OPTION_2D )
677*b1cdbd2cSJim Jagielski {
678*b1cdbd2cSJim Jagielski if ( pLastLine == NULL || nLastLineSize != ( ( nTargetBits + 7 ) >> 3 ) )
679*b1cdbd2cSJim Jagielski {
680*b1cdbd2cSJim Jagielski if ( pLastLine == NULL )
681*b1cdbd2cSJim Jagielski delete[] pLastLine;
682*b1cdbd2cSJim Jagielski nLastLineSize = ( nTargetBits + 7 ) >> 3;
683*b1cdbd2cSJim Jagielski pLastLine = new sal_uInt8[ nLastLineSize ];
684*b1cdbd2cSJim Jagielski pDst = pLastLine;
685*b1cdbd2cSJim Jagielski for ( i = 0; i < nLastLineSize; i++ ) *( pDst++ ) = 0x00;
686*b1cdbd2cSJim Jagielski }
687*b1cdbd2cSJim Jagielski }
688*b1cdbd2cSJim Jagielski // ggf. Zeilen-Anfang auf naechste Byte-Grenze runden:
689*b1cdbd2cSJim Jagielski if ( nOptions & CCI_OPTION_BYTEALIGNROW )
690*b1cdbd2cSJim Jagielski nInputBitsBufSize &= 0xfff8;
691*b1cdbd2cSJim Jagielski
692*b1cdbd2cSJim Jagielski // Ist es eine 2D-Zeile ?:
693*b1cdbd2cSJim Jagielski if ( nOptions & CCI_OPTION_2D )
694*b1cdbd2cSJim Jagielski {
695*b1cdbd2cSJim Jagielski if ( nOptions & CCI_OPTION_EOL )
696*b1cdbd2cSJim Jagielski b2D = Read2DTag();
697*b1cdbd2cSJim Jagielski else
698*b1cdbd2cSJim Jagielski b2D = sal_True;
699*b1cdbd2cSJim Jagielski }
700*b1cdbd2cSJim Jagielski else
701*b1cdbd2cSJim Jagielski b2D = sal_False;
702*b1cdbd2cSJim Jagielski
703*b1cdbd2cSJim Jagielski // Zeile einlesen:
704*b1cdbd2cSJim Jagielski if ( b2D )
705*b1cdbd2cSJim Jagielski Read2DScanlineData( pTarget, (sal_uInt16)nTargetBits );
706*b1cdbd2cSJim Jagielski else
707*b1cdbd2cSJim Jagielski Read1DScanlineData( pTarget, (sal_uInt16)nTargetBits );
708*b1cdbd2cSJim Jagielski
709*b1cdbd2cSJim Jagielski // Wenn wir im 2D-Modus sind, muessen wir uns die Zeile merken:
710*b1cdbd2cSJim Jagielski if ( nOptions & CCI_OPTION_2D && bStatus == sal_True )
711*b1cdbd2cSJim Jagielski {
712*b1cdbd2cSJim Jagielski pSrc = pTarget;
713*b1cdbd2cSJim Jagielski pDst = pLastLine;
714*b1cdbd2cSJim Jagielski for ( i = 0; i < nLastLineSize; i++ ) *(pDst++)=*(pSrc++);
715*b1cdbd2cSJim Jagielski }
716*b1cdbd2cSJim Jagielski
717*b1cdbd2cSJim Jagielski if ( pIStream->GetError() )
718*b1cdbd2cSJim Jagielski bStatus = sal_False;
719*b1cdbd2cSJim Jagielski
720*b1cdbd2cSJim Jagielski return bStatus;
721*b1cdbd2cSJim Jagielski }
722*b1cdbd2cSJim Jagielski
723*b1cdbd2cSJim Jagielski
MakeLookUp(const CCIHuffmanTableEntry * pHufTab,const CCIHuffmanTableEntry * pHufTabSave,CCILookUpTableEntry * pLookUp,sal_uInt16 nHuffmanTableSize,sal_uInt16 nMaxCodeBits)724*b1cdbd2cSJim Jagielski void CCIDecompressor::MakeLookUp(const CCIHuffmanTableEntry * pHufTab,
725*b1cdbd2cSJim Jagielski const CCIHuffmanTableEntry * pHufTabSave,
726*b1cdbd2cSJim Jagielski CCILookUpTableEntry * pLookUp,
727*b1cdbd2cSJim Jagielski sal_uInt16 nHuffmanTableSize,
728*b1cdbd2cSJim Jagielski sal_uInt16 nMaxCodeBits)
729*b1cdbd2cSJim Jagielski {
730*b1cdbd2cSJim Jagielski sal_uInt16 i,j,nMinCode,nMaxCode,nLookUpSize,nMask;
731*b1cdbd2cSJim Jagielski
732*b1cdbd2cSJim Jagielski if (bTableBad==sal_True) return;
733*b1cdbd2cSJim Jagielski
734*b1cdbd2cSJim Jagielski nLookUpSize=1<<nMaxCodeBits;
735*b1cdbd2cSJim Jagielski
736*b1cdbd2cSJim Jagielski nMask=0xffff>>(16-nMaxCodeBits);
737*b1cdbd2cSJim Jagielski
738*b1cdbd2cSJim Jagielski for (i=0; i<nLookUpSize; i++) pLookUp[i].nCodeBits=0;
739*b1cdbd2cSJim Jagielski for (i=0; i<nHuffmanTableSize; i++) {
740*b1cdbd2cSJim Jagielski if ( pHufTab[i].nValue!=pHufTabSave[i].nValue ||
741*b1cdbd2cSJim Jagielski pHufTab[i].nCode!=pHufTabSave[i].nCode ||
742*b1cdbd2cSJim Jagielski pHufTab[i].nCodeBits!=pHufTabSave[i].nCodeBits ||
743*b1cdbd2cSJim Jagielski pHufTab[i].nCodeBits==0 ||
744*b1cdbd2cSJim Jagielski pHufTab[i].nCodeBits>nMaxCodeBits )
745*b1cdbd2cSJim Jagielski {
746*b1cdbd2cSJim Jagielski bTableBad=sal_True;
747*b1cdbd2cSJim Jagielski return;
748*b1cdbd2cSJim Jagielski }
749*b1cdbd2cSJim Jagielski nMinCode = nMask & (pHufTab[i].nCode << (nMaxCodeBits-pHufTab[i].nCodeBits));
750*b1cdbd2cSJim Jagielski nMaxCode = nMinCode | (nMask >> pHufTab[i].nCodeBits);
751*b1cdbd2cSJim Jagielski for (j=nMinCode; j<=nMaxCode; j++) {
752*b1cdbd2cSJim Jagielski if (pLookUp[j].nCodeBits!=0) {
753*b1cdbd2cSJim Jagielski bTableBad=sal_True;
754*b1cdbd2cSJim Jagielski return;
755*b1cdbd2cSJim Jagielski }
756*b1cdbd2cSJim Jagielski pLookUp[j].nValue=pHufTab[i].nValue;
757*b1cdbd2cSJim Jagielski pLookUp[j].nCodeBits=pHufTab[i].nCodeBits;
758*b1cdbd2cSJim Jagielski }
759*b1cdbd2cSJim Jagielski }
760*b1cdbd2cSJim Jagielski }
761*b1cdbd2cSJim Jagielski
762*b1cdbd2cSJim Jagielski
ReadEOL(sal_uInt32)763*b1cdbd2cSJim Jagielski sal_Bool CCIDecompressor::ReadEOL( sal_uInt32 /*nMaxFillBits*/ )
764*b1cdbd2cSJim Jagielski {
765*b1cdbd2cSJim Jagielski sal_uInt16 nCode;
766*b1cdbd2cSJim Jagielski sal_uInt8 nByte;
767*b1cdbd2cSJim Jagielski
768*b1cdbd2cSJim Jagielski // if (nOptions&CCI_OPTION_BYTEALIGNEOL) nMaxFillBits=7; else nMaxFillBits=0;
769*b1cdbd2cSJim Jagielski // Buuuh: Entweder wird die Option in itiff.cxx nicht richtig gesetzt (-> Fehler in Doku)
770*b1cdbd2cSJim Jagielski // oder es gibt tatsaechlich gemeine Export-Filter, die immer ein Align machen.
771*b1cdbd2cSJim Jagielski // Ausserdem wurden Dateien gefunden, in denen mehr als die maximal 7 noetigen
772*b1cdbd2cSJim Jagielski // Fuellbits vor dem EOL-Code stehen. Daher akzeptieren wir nun grundsaetzlich
773*b1cdbd2cSJim Jagielski // bis zu 32-Bloedsinn-Bits vor dem EOL-Code:
774*b1cdbd2cSJim Jagielski // und ich habe eine Datei gefunden in der bis zu ??? Bloedsinn Bits stehen, zudem ist dort die Bit Reihenfolge verdreht (SJ);
775*b1cdbd2cSJim Jagielski
776*b1cdbd2cSJim Jagielski sal_uInt32 nMaxPos = pIStream->Tell();
777*b1cdbd2cSJim Jagielski nMaxPos += nWidth >> 3;
778*b1cdbd2cSJim Jagielski
779*b1cdbd2cSJim Jagielski for ( ;; )
780*b1cdbd2cSJim Jagielski {
781*b1cdbd2cSJim Jagielski while ( nInputBitsBufSize < 12 )
782*b1cdbd2cSJim Jagielski {
783*b1cdbd2cSJim Jagielski *pIStream >> nByte;
784*b1cdbd2cSJim Jagielski if ( pIStream->IsEof() )
785*b1cdbd2cSJim Jagielski return sal_False;
786*b1cdbd2cSJim Jagielski if ( pIStream->Tell() > nMaxPos )
787*b1cdbd2cSJim Jagielski return sal_False;
788*b1cdbd2cSJim Jagielski
789*b1cdbd2cSJim Jagielski if ( nOptions & CCI_OPTION_INVERSEBITORDER )
790*b1cdbd2cSJim Jagielski nByte = pByteSwap[ nByte ];
791*b1cdbd2cSJim Jagielski nInputBitsBuf=(nInputBitsBuf<<8) | (sal_uLong)nByte;
792*b1cdbd2cSJim Jagielski nInputBitsBufSize += 8;
793*b1cdbd2cSJim Jagielski }
794*b1cdbd2cSJim Jagielski nCode = (sal_uInt16)( ( nInputBitsBuf >> ( nInputBitsBufSize - 12 ) ) & 0x0fff );
795*b1cdbd2cSJim Jagielski if ( nCode == 0x0001 )
796*b1cdbd2cSJim Jagielski {
797*b1cdbd2cSJim Jagielski nEOLCount++;
798*b1cdbd2cSJim Jagielski nInputBitsBufSize -= 12;
799*b1cdbd2cSJim Jagielski break;
800*b1cdbd2cSJim Jagielski }
801*b1cdbd2cSJim Jagielski else
802*b1cdbd2cSJim Jagielski nInputBitsBufSize--;
803*b1cdbd2cSJim Jagielski }
804*b1cdbd2cSJim Jagielski return sal_True;
805*b1cdbd2cSJim Jagielski }
806*b1cdbd2cSJim Jagielski
807*b1cdbd2cSJim Jagielski
Read2DTag()808*b1cdbd2cSJim Jagielski sal_Bool CCIDecompressor::Read2DTag()
809*b1cdbd2cSJim Jagielski {
810*b1cdbd2cSJim Jagielski sal_uInt8 nByte;
811*b1cdbd2cSJim Jagielski
812*b1cdbd2cSJim Jagielski // Ein Bit einlesen und sal_True liefern, wenn es 0 ist, sonst sal_False
813*b1cdbd2cSJim Jagielski if (nInputBitsBufSize==0) {
814*b1cdbd2cSJim Jagielski *pIStream >> nByte;
815*b1cdbd2cSJim Jagielski if ( nOptions & CCI_OPTION_INVERSEBITORDER )
816*b1cdbd2cSJim Jagielski nByte = pByteSwap[ nByte ];
817*b1cdbd2cSJim Jagielski nInputBitsBuf=(sal_uLong)nByte;
818*b1cdbd2cSJim Jagielski nInputBitsBufSize=8;
819*b1cdbd2cSJim Jagielski }
820*b1cdbd2cSJim Jagielski nInputBitsBufSize--;
821*b1cdbd2cSJim Jagielski if ( ((nInputBitsBuf>>nInputBitsBufSize)&0x0001) ) return sal_False;
822*b1cdbd2cSJim Jagielski else return sal_True;
823*b1cdbd2cSJim Jagielski }
824*b1cdbd2cSJim Jagielski
825*b1cdbd2cSJim Jagielski
ReadBlackOrWhite()826*b1cdbd2cSJim Jagielski sal_uInt8 CCIDecompressor::ReadBlackOrWhite()
827*b1cdbd2cSJim Jagielski {
828*b1cdbd2cSJim Jagielski sal_uInt8 nByte;
829*b1cdbd2cSJim Jagielski
830*b1cdbd2cSJim Jagielski // Ein Bit einlesen und 0x00 liefern, wenn es 0 ist, sonst 0xff
831*b1cdbd2cSJim Jagielski if (nInputBitsBufSize==0) {
832*b1cdbd2cSJim Jagielski *pIStream >> nByte;
833*b1cdbd2cSJim Jagielski if ( nOptions & CCI_OPTION_INVERSEBITORDER )
834*b1cdbd2cSJim Jagielski nByte = pByteSwap[ nByte ];
835*b1cdbd2cSJim Jagielski nInputBitsBuf=(sal_uLong)nByte;
836*b1cdbd2cSJim Jagielski nInputBitsBufSize=8;
837*b1cdbd2cSJim Jagielski }
838*b1cdbd2cSJim Jagielski nInputBitsBufSize--;
839*b1cdbd2cSJim Jagielski if ( ((nInputBitsBuf>>nInputBitsBufSize)&0x0001) ) return 0xff;
840*b1cdbd2cSJim Jagielski else return 0x00;
841*b1cdbd2cSJim Jagielski }
842*b1cdbd2cSJim Jagielski
843*b1cdbd2cSJim Jagielski
ReadCodeAndDecode(const CCILookUpTableEntry * pLookUp,sal_uInt16 nMaxCodeBits)844*b1cdbd2cSJim Jagielski sal_uInt16 CCIDecompressor::ReadCodeAndDecode(const CCILookUpTableEntry * pLookUp,
845*b1cdbd2cSJim Jagielski sal_uInt16 nMaxCodeBits)
846*b1cdbd2cSJim Jagielski {
847*b1cdbd2cSJim Jagielski sal_uInt16 nCode,nCodeBits;
848*b1cdbd2cSJim Jagielski sal_uInt8 nByte;
849*b1cdbd2cSJim Jagielski
850*b1cdbd2cSJim Jagielski // Einen Huffman-Code einlesen und dekodieren:
851*b1cdbd2cSJim Jagielski while (nInputBitsBufSize<nMaxCodeBits) {
852*b1cdbd2cSJim Jagielski *pIStream >> nByte;
853*b1cdbd2cSJim Jagielski if ( nOptions & CCI_OPTION_INVERSEBITORDER )
854*b1cdbd2cSJim Jagielski nByte = pByteSwap[ nByte ];
855*b1cdbd2cSJim Jagielski nInputBitsBuf=(nInputBitsBuf<<8) | (sal_uLong)nByte;
856*b1cdbd2cSJim Jagielski nInputBitsBufSize+=8;
857*b1cdbd2cSJim Jagielski }
858*b1cdbd2cSJim Jagielski nCode=(sal_uInt16)((nInputBitsBuf>>(nInputBitsBufSize-nMaxCodeBits))
859*b1cdbd2cSJim Jagielski &(0xffff>>(16-nMaxCodeBits)));
860*b1cdbd2cSJim Jagielski nCodeBits=pLookUp[nCode].nCodeBits;
861*b1cdbd2cSJim Jagielski if (nCodeBits==0) bStatus=sal_False;
862*b1cdbd2cSJim Jagielski nInputBitsBufSize = nInputBitsBufSize - nCodeBits;
863*b1cdbd2cSJim Jagielski return pLookUp[nCode].nValue;
864*b1cdbd2cSJim Jagielski }
865*b1cdbd2cSJim Jagielski
866*b1cdbd2cSJim Jagielski
FillBits(sal_uInt8 * pTarget,sal_uInt16 nTargetBits,sal_uInt16 nBitPos,sal_uInt16 nNumBits,sal_uInt8 nBlackOrWhite)867*b1cdbd2cSJim Jagielski void CCIDecompressor::FillBits(sal_uInt8 * pTarget, sal_uInt16 nTargetBits,
868*b1cdbd2cSJim Jagielski sal_uInt16 nBitPos, sal_uInt16 nNumBits,
869*b1cdbd2cSJim Jagielski sal_uInt8 nBlackOrWhite)
870*b1cdbd2cSJim Jagielski {
871*b1cdbd2cSJim Jagielski if ( nBitPos >= nTargetBits )
872*b1cdbd2cSJim Jagielski return;
873*b1cdbd2cSJim Jagielski if ( nBitPos + nNumBits > nTargetBits )
874*b1cdbd2cSJim Jagielski nNumBits = nTargetBits - nBitPos;
875*b1cdbd2cSJim Jagielski
876*b1cdbd2cSJim Jagielski pTarget+=nBitPos>>3;
877*b1cdbd2cSJim Jagielski nBitPos&=7;
878*b1cdbd2cSJim Jagielski
879*b1cdbd2cSJim Jagielski if (nBlackOrWhite==0x00) *pTarget &= 0xff << (8-nBitPos);
880*b1cdbd2cSJim Jagielski else *pTarget |= 0xff >> nBitPos;
881*b1cdbd2cSJim Jagielski if (nNumBits>8-nBitPos) {
882*b1cdbd2cSJim Jagielski nNumBits-=8-nBitPos;
883*b1cdbd2cSJim Jagielski while (nNumBits>=8) {
884*b1cdbd2cSJim Jagielski *(++pTarget)=nBlackOrWhite;
885*b1cdbd2cSJim Jagielski nNumBits-=8;
886*b1cdbd2cSJim Jagielski }
887*b1cdbd2cSJim Jagielski if (nNumBits>0) *(++pTarget)=nBlackOrWhite;
888*b1cdbd2cSJim Jagielski }
889*b1cdbd2cSJim Jagielski }
890*b1cdbd2cSJim Jagielski
891*b1cdbd2cSJim Jagielski
CountBits(const sal_uInt8 * pData,sal_uInt16 nDataSizeBits,sal_uInt16 nBitPos,sal_uInt8 nBlackOrWhite)892*b1cdbd2cSJim Jagielski sal_uInt16 CCIDecompressor::CountBits(const sal_uInt8 * pData, sal_uInt16 nDataSizeBits,
893*b1cdbd2cSJim Jagielski sal_uInt16 nBitPos, sal_uInt8 nBlackOrWhite)
894*b1cdbd2cSJim Jagielski {
895*b1cdbd2cSJim Jagielski sal_uInt16 nPos,nLo;
896*b1cdbd2cSJim Jagielski sal_uInt8 nData;
897*b1cdbd2cSJim Jagielski
898*b1cdbd2cSJim Jagielski // Hier wird die Anzahl der zusammenhaengenden Bits gezaehlt, die
899*b1cdbd2cSJim Jagielski // ab Position nBitPos in pTarget alle die Farbe nBlackOrWhite
900*b1cdbd2cSJim Jagielski // (0xff oder 0x00) haben.
901*b1cdbd2cSJim Jagielski
902*b1cdbd2cSJim Jagielski nPos=nBitPos;
903*b1cdbd2cSJim Jagielski for (;;) {
904*b1cdbd2cSJim Jagielski if (nPos>=nDataSizeBits) {
905*b1cdbd2cSJim Jagielski nPos=nDataSizeBits;
906*b1cdbd2cSJim Jagielski break;
907*b1cdbd2cSJim Jagielski }
908*b1cdbd2cSJim Jagielski nData=pData[nPos>>3];
909*b1cdbd2cSJim Jagielski nLo=nPos & 7;
910*b1cdbd2cSJim Jagielski if ( nLo==0 && nData==nBlackOrWhite) nPos+=8;
911*b1cdbd2cSJim Jagielski else {
912*b1cdbd2cSJim Jagielski if ( ((nData^nBlackOrWhite) & (0x80 >> nLo))!=0) break;
913*b1cdbd2cSJim Jagielski nPos++;
914*b1cdbd2cSJim Jagielski }
915*b1cdbd2cSJim Jagielski }
916*b1cdbd2cSJim Jagielski if (nPos<=nBitPos) return 0;
917*b1cdbd2cSJim Jagielski else return nPos-nBitPos;
918*b1cdbd2cSJim Jagielski }
919*b1cdbd2cSJim Jagielski
920*b1cdbd2cSJim Jagielski
Read1DScanlineData(sal_uInt8 * pTarget,sal_uInt16 nTargetBits)921*b1cdbd2cSJim Jagielski void CCIDecompressor::Read1DScanlineData(sal_uInt8 * pTarget, sal_uInt16 nTargetBits)
922*b1cdbd2cSJim Jagielski {
923*b1cdbd2cSJim Jagielski sal_uInt16 nCode,nCodeBits,nDataBits,nTgtFreeByteBits;
924*b1cdbd2cSJim Jagielski sal_uInt8 nByte;
925*b1cdbd2cSJim Jagielski sal_uInt8 nBlackOrWhite; // ist 0xff fuer Black oder 0x00 fuer White
926*b1cdbd2cSJim Jagielski sal_Bool bTerminatingCode;
927*b1cdbd2cSJim Jagielski
928*b1cdbd2cSJim Jagielski // Der erste Code ist immer eine "White-Code":
929*b1cdbd2cSJim Jagielski nBlackOrWhite=0x00;
930*b1cdbd2cSJim Jagielski
931*b1cdbd2cSJim Jagielski // Anzahl der Bits, die im Byte *pTarget noch nicht geschrieben sind:
932*b1cdbd2cSJim Jagielski nTgtFreeByteBits=8;
933*b1cdbd2cSJim Jagielski
934*b1cdbd2cSJim Jagielski // Schleife ueber Codes aus dem Eingabe-Stream:
935*b1cdbd2cSJim Jagielski do {
936*b1cdbd2cSJim Jagielski
937*b1cdbd2cSJim Jagielski // die naechsten 13 Bits nach nCode holen, aber noch nicht
938*b1cdbd2cSJim Jagielski // aus dem Eingabe-Buffer loeschen:
939*b1cdbd2cSJim Jagielski while (nInputBitsBufSize<13) {
940*b1cdbd2cSJim Jagielski *pIStream >> nByte;
941*b1cdbd2cSJim Jagielski if ( nOptions & CCI_OPTION_INVERSEBITORDER )
942*b1cdbd2cSJim Jagielski nByte = pByteSwap[ nByte ];
943*b1cdbd2cSJim Jagielski nInputBitsBuf=(nInputBitsBuf<<8) | (sal_uLong)nByte;
944*b1cdbd2cSJim Jagielski nInputBitsBufSize+=8;
945*b1cdbd2cSJim Jagielski }
946*b1cdbd2cSJim Jagielski nCode=(sal_uInt16)((nInputBitsBuf>>(nInputBitsBufSize-13))&0x1fff);
947*b1cdbd2cSJim Jagielski
948*b1cdbd2cSJim Jagielski // Anzahl der DatenBits und Anzahl der CodeBits ermitteln:
949*b1cdbd2cSJim Jagielski if (nBlackOrWhite) {
950*b1cdbd2cSJim Jagielski nCodeBits=pBlackLookUp[nCode].nCodeBits;
951*b1cdbd2cSJim Jagielski nDataBits=pBlackLookUp[nCode].nValue;
952*b1cdbd2cSJim Jagielski }
953*b1cdbd2cSJim Jagielski else {
954*b1cdbd2cSJim Jagielski nCodeBits=pWhiteLookUp[nCode].nCodeBits;
955*b1cdbd2cSJim Jagielski nDataBits=pWhiteLookUp[nCode].nValue;
956*b1cdbd2cSJim Jagielski }
957*b1cdbd2cSJim Jagielski // Ist es ein Ungueltiger Code ?
958*b1cdbd2cSJim Jagielski if ( nDataBits == 9999 )
959*b1cdbd2cSJim Jagielski {
960*b1cdbd2cSJim Jagielski return;
961*b1cdbd2cSJim Jagielski }
962*b1cdbd2cSJim Jagielski if ( nCodeBits == 0 )
963*b1cdbd2cSJim Jagielski {
964*b1cdbd2cSJim Jagielski return; // das koennen sich jetzt um FuellBits handeln
965*b1cdbd2cSJim Jagielski }
966*b1cdbd2cSJim Jagielski nEOLCount = 0;
967*b1cdbd2cSJim Jagielski // Zuviele Daten ?
968*b1cdbd2cSJim Jagielski if (nDataBits>nTargetBits) {
969*b1cdbd2cSJim Jagielski // Ja, koennte ein Folge-Fehler durch ungueltigen Code sein,
970*b1cdbd2cSJim Jagielski // daher irdenwie weitermachen:
971*b1cdbd2cSJim Jagielski nDataBits=nTargetBits;
972*b1cdbd2cSJim Jagielski }
973*b1cdbd2cSJim Jagielski
974*b1cdbd2cSJim Jagielski // Ist es ein 'Terminating-Code' ?
975*b1cdbd2cSJim Jagielski if (nDataBits<64) bTerminatingCode=sal_True; else bTerminatingCode=sal_False;
976*b1cdbd2cSJim Jagielski
977*b1cdbd2cSJim Jagielski // Die gelesenen Bits aus dem Eingabe-Buffer entfernen:
978*b1cdbd2cSJim Jagielski nInputBitsBufSize = nInputBitsBufSize - nCodeBits;
979*b1cdbd2cSJim Jagielski
980*b1cdbd2cSJim Jagielski // Die Anzahl Daten-Bits in die Scanline schreiben:
981*b1cdbd2cSJim Jagielski if (nDataBits>0) {
982*b1cdbd2cSJim Jagielski nTargetBits = nTargetBits - nDataBits;
983*b1cdbd2cSJim Jagielski if (nBlackOrWhite==0x00) *pTarget &= 0xff << nTgtFreeByteBits;
984*b1cdbd2cSJim Jagielski else *pTarget |= 0xff >> (8-nTgtFreeByteBits);
985*b1cdbd2cSJim Jagielski if (nDataBits<=nTgtFreeByteBits) {
986*b1cdbd2cSJim Jagielski if (nDataBits==nTgtFreeByteBits) {
987*b1cdbd2cSJim Jagielski pTarget++;
988*b1cdbd2cSJim Jagielski nTgtFreeByteBits=8;
989*b1cdbd2cSJim Jagielski }
990*b1cdbd2cSJim Jagielski else nTgtFreeByteBits = nTgtFreeByteBits - nDataBits;
991*b1cdbd2cSJim Jagielski }
992*b1cdbd2cSJim Jagielski else {
993*b1cdbd2cSJim Jagielski nDataBits = nDataBits - nTgtFreeByteBits;
994*b1cdbd2cSJim Jagielski pTarget++;
995*b1cdbd2cSJim Jagielski nTgtFreeByteBits=8;
996*b1cdbd2cSJim Jagielski while (nDataBits>=8) {
997*b1cdbd2cSJim Jagielski *(pTarget++)=nBlackOrWhite;
998*b1cdbd2cSJim Jagielski nDataBits-=8;
999*b1cdbd2cSJim Jagielski }
1000*b1cdbd2cSJim Jagielski if (nDataBits>0) {
1001*b1cdbd2cSJim Jagielski *pTarget=nBlackOrWhite;
1002*b1cdbd2cSJim Jagielski nTgtFreeByteBits = nTgtFreeByteBits - nDataBits;
1003*b1cdbd2cSJim Jagielski }
1004*b1cdbd2cSJim Jagielski }
1005*b1cdbd2cSJim Jagielski }
1006*b1cdbd2cSJim Jagielski
1007*b1cdbd2cSJim Jagielski // ggf. Umschaltung Black <-> White:
1008*b1cdbd2cSJim Jagielski if (bTerminatingCode==sal_True) nBlackOrWhite=~nBlackOrWhite;
1009*b1cdbd2cSJim Jagielski
1010*b1cdbd2cSJim Jagielski } while (nTargetBits>0 || bTerminatingCode==sal_False);
1011*b1cdbd2cSJim Jagielski }
1012*b1cdbd2cSJim Jagielski
1013*b1cdbd2cSJim Jagielski
1014*b1cdbd2cSJim Jagielski
Read2DScanlineData(sal_uInt8 * pTarget,sal_uInt16 nTargetBits)1015*b1cdbd2cSJim Jagielski void CCIDecompressor::Read2DScanlineData(sal_uInt8 * pTarget, sal_uInt16 nTargetBits)
1016*b1cdbd2cSJim Jagielski {
1017*b1cdbd2cSJim Jagielski sal_uInt16 n2DMode,nBitPos,nUncomp,nRun,nRun2,nt;
1018*b1cdbd2cSJim Jagielski sal_uInt8 nBlackOrWhite;
1019*b1cdbd2cSJim Jagielski
1020*b1cdbd2cSJim Jagielski nBlackOrWhite=0x00;
1021*b1cdbd2cSJim Jagielski nBitPos=0;
1022*b1cdbd2cSJim Jagielski
1023*b1cdbd2cSJim Jagielski while (nBitPos<nTargetBits && bStatus==sal_True) {
1024*b1cdbd2cSJim Jagielski
1025*b1cdbd2cSJim Jagielski n2DMode=ReadCodeAndDecode(p2DModeLookUp,10);
1026*b1cdbd2cSJim Jagielski if (bStatus==sal_False) return;
1027*b1cdbd2cSJim Jagielski
1028*b1cdbd2cSJim Jagielski if (n2DMode==CCI2DMODE_UNCOMP) {
1029*b1cdbd2cSJim Jagielski for (;;) {
1030*b1cdbd2cSJim Jagielski nUncomp=ReadCodeAndDecode(pUncompLookUp,11);
1031*b1cdbd2cSJim Jagielski if ( nUncomp <= CCIUNCOMP_4White_1Black ) {
1032*b1cdbd2cSJim Jagielski nRun=nUncomp-CCIUNCOMP_0White_1Black;
1033*b1cdbd2cSJim Jagielski FillBits(pTarget,nTargetBits,nBitPos,nRun,0x00);
1034*b1cdbd2cSJim Jagielski nBitPos = nBitPos + nRun;
1035*b1cdbd2cSJim Jagielski FillBits(pTarget,nTargetBits,nBitPos,1,0xff);
1036*b1cdbd2cSJim Jagielski nBitPos++;
1037*b1cdbd2cSJim Jagielski }
1038*b1cdbd2cSJim Jagielski else if ( nUncomp == CCIUNCOMP_5White ) {
1039*b1cdbd2cSJim Jagielski FillBits(pTarget,nTargetBits,nBitPos,5,0x00);
1040*b1cdbd2cSJim Jagielski nBitPos = nBitPos + 5;
1041*b1cdbd2cSJim Jagielski }
1042*b1cdbd2cSJim Jagielski else {
1043*b1cdbd2cSJim Jagielski nRun=nUncomp-CCIUNCOMP_0White_End;
1044*b1cdbd2cSJim Jagielski FillBits(pTarget,nTargetBits,nBitPos,nRun,0x00);
1045*b1cdbd2cSJim Jagielski nBitPos = nBitPos + nRun;
1046*b1cdbd2cSJim Jagielski nBlackOrWhite=ReadBlackOrWhite();
1047*b1cdbd2cSJim Jagielski break;
1048*b1cdbd2cSJim Jagielski }
1049*b1cdbd2cSJim Jagielski }
1050*b1cdbd2cSJim Jagielski }
1051*b1cdbd2cSJim Jagielski
1052*b1cdbd2cSJim Jagielski else if (n2DMode==CCI2DMODE_PASS) {
1053*b1cdbd2cSJim Jagielski if (nBitPos==0 && nBlackOrWhite==0x00 && CountBits(pLastLine,nTargetBits,0,0xff)!=0) nRun=0;
1054*b1cdbd2cSJim Jagielski else {
1055*b1cdbd2cSJim Jagielski nRun=CountBits(pLastLine,nTargetBits,nBitPos,~nBlackOrWhite);
1056*b1cdbd2cSJim Jagielski nRun = nRun + CountBits(pLastLine,nTargetBits,nBitPos+nRun,nBlackOrWhite);
1057*b1cdbd2cSJim Jagielski }
1058*b1cdbd2cSJim Jagielski nRun = nRun + CountBits(pLastLine,nTargetBits,nBitPos+nRun,~nBlackOrWhite);
1059*b1cdbd2cSJim Jagielski FillBits(pTarget,nTargetBits,nBitPos,nRun,nBlackOrWhite);
1060*b1cdbd2cSJim Jagielski nBitPos = nBitPos + nRun;
1061*b1cdbd2cSJim Jagielski }
1062*b1cdbd2cSJim Jagielski
1063*b1cdbd2cSJim Jagielski else if (n2DMode==CCI2DMODE_HORZ) {
1064*b1cdbd2cSJim Jagielski if (nBlackOrWhite==0x00) {
1065*b1cdbd2cSJim Jagielski nRun=0;
1066*b1cdbd2cSJim Jagielski do {
1067*b1cdbd2cSJim Jagielski nt=ReadCodeAndDecode(pWhiteLookUp,13);
1068*b1cdbd2cSJim Jagielski nRun = nRun + nt;
1069*b1cdbd2cSJim Jagielski } while (nt>=64);
1070*b1cdbd2cSJim Jagielski nRun2=0;
1071*b1cdbd2cSJim Jagielski do {
1072*b1cdbd2cSJim Jagielski nt=ReadCodeAndDecode(pBlackLookUp,13);
1073*b1cdbd2cSJim Jagielski nRun2 = nRun2 + nt;
1074*b1cdbd2cSJim Jagielski } while (nt>=64);
1075*b1cdbd2cSJim Jagielski }
1076*b1cdbd2cSJim Jagielski else {
1077*b1cdbd2cSJim Jagielski nRun=0;
1078*b1cdbd2cSJim Jagielski do {
1079*b1cdbd2cSJim Jagielski nt=ReadCodeAndDecode(pBlackLookUp,13);
1080*b1cdbd2cSJim Jagielski nRun = nRun + nt;
1081*b1cdbd2cSJim Jagielski } while (nt>=64);
1082*b1cdbd2cSJim Jagielski nRun2=0;
1083*b1cdbd2cSJim Jagielski do {
1084*b1cdbd2cSJim Jagielski nt=ReadCodeAndDecode(pWhiteLookUp,13);
1085*b1cdbd2cSJim Jagielski nRun2 = nRun2 + nt;
1086*b1cdbd2cSJim Jagielski } while (nt>=64);
1087*b1cdbd2cSJim Jagielski }
1088*b1cdbd2cSJim Jagielski FillBits(pTarget,nTargetBits,nBitPos,nRun,nBlackOrWhite);
1089*b1cdbd2cSJim Jagielski nBitPos = nBitPos + nRun;
1090*b1cdbd2cSJim Jagielski FillBits(pTarget,nTargetBits,nBitPos,nRun2,~nBlackOrWhite);
1091*b1cdbd2cSJim Jagielski nBitPos = nBitPos + nRun2;
1092*b1cdbd2cSJim Jagielski }
1093*b1cdbd2cSJim Jagielski
1094*b1cdbd2cSJim Jagielski else { // Es ist einer der Modi CCI2DMODE_VERT_...
1095*b1cdbd2cSJim Jagielski if (nBitPos==0 && nBlackOrWhite==0x00 && CountBits(pLastLine,nTargetBits,0,0xff)!=0) nRun=0;
1096*b1cdbd2cSJim Jagielski else {
1097*b1cdbd2cSJim Jagielski nRun=CountBits(pLastLine,nTargetBits,nBitPos,~nBlackOrWhite);
1098*b1cdbd2cSJim Jagielski nRun = nRun + CountBits(pLastLine,nTargetBits,nBitPos+nRun,nBlackOrWhite);
1099*b1cdbd2cSJim Jagielski }
1100*b1cdbd2cSJim Jagielski nRun+=n2DMode-CCI2DMODE_VERT_0;
1101*b1cdbd2cSJim Jagielski FillBits(pTarget,nTargetBits,nBitPos,nRun,nBlackOrWhite);
1102*b1cdbd2cSJim Jagielski nBitPos = nBitPos + nRun;
1103*b1cdbd2cSJim Jagielski nBlackOrWhite=~nBlackOrWhite;
1104*b1cdbd2cSJim Jagielski }
1105*b1cdbd2cSJim Jagielski }
1106*b1cdbd2cSJim Jagielski }
1107*b1cdbd2cSJim Jagielski
1108*b1cdbd2cSJim Jagielski
1109