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