|
|
1.1 root 1: /* Copyright (c) 1989, 1990 AT&T --- All Rights Reserved. */
2: /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T. */
3: /* The copyright notice does not imply actual or intended publication. */
4: /* AUTHORS: */
5: /* H. S. Baird - ATT-BL MH - first versions */
6: /* CCITT Group 3 FAX compression codes */
7: #define EOLSTRING "000000000001"
8: #define EOLLENGTH 12 /* length of EOLSTRING */
9: #define MAXCODELEN 24
10:
11: #define DST_EOL -3
12:
13: /* translate a runlength value <=2560 to an index into the Huffman code table;
14: if the index is >=64, then must repeat for (r%64) */
15: #define rtoi(r) (((r)<64)? (r): 64+((r)/64))
16: /* translate an index into the Huffman code table to a runlength value */
17: #define itor(i) (((i)<64)? (i): (((i)>64)? (((i)-64)*64): DST_EOL))
18:
19: /* Black run code table */
20: static char *codeblk[] = {
21: /* code run-length value */
22: "0000110111", /* 0, */
23: "010", /* 1, */
24: "11", /* 2, */
25: "10", /* 3, */
26: "011", /* 4, */
27: "0011", /* 5, */
28: "0010", /* 6, */
29: "00011", /* 7, */
30: "000101", /* 8, */
31: "000100", /* 9, */
32: "0000100", /* 10, */
33: "0000101", /* 11, */
34: "0000111", /* 12, */
35: "00000100", /* 13, */
36: "00000111", /* 14, */
37: "000011000", /* 15, */
38: "0000010111", /* 16, */
39: "0000011000", /* 17, */
40: "0000001000", /* 18, */
41: "00001100111", /* 19, */
42: "00001101000", /* 20, */
43: "00001101100", /* 21, */
44: "00000110111", /* 22, */
45: "00000101000", /* 23, */
46: "00000010111", /* 24, */
47: "00000011000", /* 25, */
48: "000011001010", /* 26, */
49: "000011001011", /* 27, */
50: "000011001100", /* 28, */
51: "000011001101", /* 29, */
52: "000001101000", /* 30, */
53: "000001101001", /* 31, */
54: "000001101010", /* 32, */
55: "000001101011", /* 33, */
56: "000011010010", /* 34, */
57: "000011010011", /* 35, */
58: "000011010100", /* 36, */
59: "000011010101", /* 37, */
60: "000011010110", /* 38, */
61: "000011010111", /* 39, */
62: "000001101100", /* 40, */
63: "000001101101", /* 41, */
64: "000011011010", /* 42, */
65: "000011011011", /* 43, */
66: "000001010100", /* 44, */
67: "000001010101", /* 45, */
68: "000001010110", /* 46, */
69: "000001010111", /* 47, */
70: "000001100100", /* 48, */
71: "000001100101", /* 49, */
72: "000001010010", /* 50, */
73: "000001010011", /* 51, */
74: "000000100100", /* 52, */
75: "000000110111", /* 53, */
76: "000000111000", /* 54, */
77: "000000100111", /* 55, */
78: "000000101000", /* 56, */
79: "000001011000", /* 57, */
80: "000001011001", /* 58, */
81: "000000101011", /* 59, */
82: "000000101100", /* 60, */
83: "000001011010", /* 61, */
84: "000001100110", /* 62, */
85: "000001100111", /* 63 */
86: EOLSTRING, /* EOL */
87: "0000001111", /* 64, */
88: "000011001000", /* 128, */
89: "000011001001", /* 192, */
90: "000001011011", /* 256, */
91: "000000110011", /* 320, */
92: "000000110100", /* 384, */
93: "000000110101", /* 448, */
94: "0000001101100", /* 512, */
95: "0000001101101", /* 576, */
96: "0000001001010", /* 640, */
97: "0000001001011", /* 704, */
98: "0000001001100", /* 768, */
99: "0000001001101", /* 832, */
100: "0000001110010", /* 896, */
101: "0000001110011", /* 960, */
102: "0000001110100", /* 1024, */
103: "0000001110101", /* 1088, */
104: "0000001110110", /* 1152, */
105: "0000001110111", /* 1216, */
106: "0000001010010", /* 1280, */
107: "0000001010011", /* 1344, */
108: "0000001010100", /* 1408, */
109: "0000001010101", /* 1472, */
110: "0000001011010", /* 1536, */
111: "0000001011011", /* 1600, */
112: "0000001100100", /* 1664, */
113: "0000001100101", /* 1728 */
114: /* extended length: */
115: "00000001000", /* 1792, */
116: "00000001100", /* 1856, */
117: "00000001101", /* 1920, */
118: "000000010010", /* 1984, */
119: "000000010011", /* 2048, */
120: "000000010100", /* 2112, */
121: "000000010101", /* 2176, */
122: "000000010110", /* 2240, */
123: "000000010111", /* 2304, */
124: "000000011100", /* 2368, */
125: "000000011101", /* 2432, */
126: "000000011110", /* 2496, */
127: "000000011111", /* 2560 */
128: NULL /* are there codes beyond 2560? */
129: };
130: /* No. bits in the codes in the above table */
131: static short bitcblk[] = {
132: 10,3,2,2,3,4,4,5,6,6, /* 0 - 9 */
133: 7,7,7,8,8,9,10,10,10,11, /* 10 - 19 */
134: 11,11,11,11,11,11,12,12,12,12, /* 20 - 29 */
135: 12,12,12,12,12,12,12,12,12,12, /* 30 - 39 */
136: 12,12,12,12,12,12,12,12,12,12, /* 40 - 49 */
137: 12,12,12,12,12,12,12,12,12,12, /* 50 - 59 */
138: 12,12,12,12, /* 60 - 63 */
139: 12, /* EOL */
140: 10, /* 64 */
141: 12,12,12,12,12,12, /* 128 - 448 */
142: 13,13,13,13,13,13,13,13,13, /* 512 - */
143: 13,13,13,13,13,13,13,13,13,
144: 13,13, /* - 1728 */
145: 11,11,11, /* 1792 - 1920 */
146: 12,12,12,12,12,12,12,12,12,12, /* 1984 - 2560 */
147: /* for codes over 2560 */
148: 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,
149: -1
150: };
151:
152: /* White run code table */
153: static char *codewht[] = {
154: /* code run-length value */
155: "00110101", /* 0, */
156: "000111", /* 1, */
157: "0111", /* 2, */
158: "1000", /* 3, */
159: "1011", /* 4, */
160: "1100", /* 5, */
161: "1110", /* 6, */
162: "1111", /* 7, */
163: "10011", /* 8, */
164: "10100", /* 9, */
165: "00111", /* 10, */
166: "01000", /* 11, */
167: "001000", /* 12, */
168: "000011", /* 13, */
169: "110100", /* 14, */
170: "110101", /* 15, */
171: "101010", /* 16, */
172: "101011", /* 17, */
173: "0100111", /* 18, */
174: "0001100", /* 19, */
175: "0001000", /* 20, */
176: "0010111", /* 21, */
177: "0000011", /* 22, */
178: "0000100", /* 23, */
179: "0101000", /* 24, */
180: "0101011", /* 25, */
181: "0010011", /* 26, */
182: "0100100", /* 27, */
183: "0011000", /* 28, */
184: "00000010", /* 29, */
185: "00000011", /* 30, */
186: "00011010", /* 31, */
187: "00011011", /* 32, */
188: "00010010", /* 33, */
189: "00010011", /* 34, */
190: "00010100", /* 35, */
191: "00010101", /* 36, */
192: "00010110", /* 37, */
193: "00010111", /* 38, */
194: "00101000", /* 39, */
195: "00101001", /* 40, */
196: "00101010", /* 41, */
197: "00101011", /* 42, */
198: "00101100", /* 43, */
199: "00101101", /* 44, */
200: "00000100", /* 45, */
201: "00000101", /* 46, */
202: "00001010", /* 47, */
203: "00001011", /* 48, */
204: "01010010", /* 49, */
205: "01010011", /* 50, */
206: "01010100", /* 51, */
207: "01010101", /* 52, */
208: "00100100", /* 53, */
209: "00100101", /* 54, */
210: "01011000", /* 55, */
211: "01011001", /* 56, */
212: "01011010", /* 57, */
213: "01011011", /* 58, */
214: "01001010", /* 59, */
215: "01001011", /* 60, */
216: "00110010", /* 61, */
217: "00110011", /* 62, */
218: "00110100", /* 63 */
219: EOLSTRING, /* EOL */
220: "11011", /* 64, */
221: "10010", /* 128, */
222: "010111", /* 192, */
223: "0110111", /* 256, */
224: "00110110", /* 320, */
225: "00110111", /* 384, */
226: "01100100", /* 448, */
227: "01100101", /* 512, */
228: "01101000", /* 576, */
229: "01100111", /* 640, */
230: "011001100", /* 704, */
231: "011001101", /* 768, */
232: "011010010", /* 832, */
233: "011010011", /* 896, */
234: "011010100", /* 960, */
235: "011010101", /* 1024, */
236: "011010110", /* 1088, */
237: "011010111", /* 1152, */
238: "011011000", /* 1216, */
239: "011011001", /* 1280, */
240: "011011010", /* 1344, */
241: "011011011", /* 1408, */
242: "010011000", /* 1472, */
243: "010011001", /* 1536, */
244: "010011010", /* 1600, */
245: "011000", /* 1664, */
246: "010011011", /* 1728 */
247: /* extended length: */
248: "00000001000", /* 1792, */
249: "00000001100", /* 1856, */
250: "00000001101", /* 1920, */
251: "000000010010", /* 1984, */
252: "000000010011", /* 2048, */
253: "000000010100", /* 2112, */
254: "000000010101", /* 2176, */
255: "000000010110", /* 2240, */
256: "000000010111", /* 2304, */
257: "000000011100", /* 2368, */
258: "000000011101", /* 2432, */
259: "000000011110", /* 2496, */
260: "000000011111", /* 2560 */
261: NULL /* are there codes beyond 2560? */
262: };
263: /* no. bits in the codes in the above table */
264: static short bitcwht[] = {
265: 8,6,4,4,4,4,4,4,5,5, /* 0 - 9 */
266: 5,5,6,6,6,6,6,6,7,7, /* 10 - 19 */
267: 7,7,7,7,7,7,7,7,7,8, /* 20 - 29 */
268: 8,8,8,8,8,8,8,8,8,8, /* 30 - 39 */
269: 8,8,8,8,8,8,8,8,8,8, /* 40 - 49 */
270: 8,8,8,8,8,8,8,8,8,8, /* 50 - 59 */
271: 8,8,8,8, /* 60 - 63 */
272: 12, /* EOL */
273: 5,5, /* 64,128 */
274: 6, /* 192 */
275: 7, /* 256 */
276: 8,8,8,8,8,8, /* 320 - 640 */
277: 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, /* 704 - 1600 */
278: 6, /* 1664 */
279: 9, /* 1728 */
280: 11,11,11, /* 1792,1856,1920 */
281: 12,12,12,12,12,12,12,12,12,12, /* 1984 - 2560 */
282: /* for codes over 2560 */
283: 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,
284: -1
285: };
286:
287: /* 2-D codes (indices into code2d[] table) */
288: #define i2D_V0 0
289: #define i2D_VR1 1
290: #define i2D_VR2 2
291: #define i2D_VR3 3
292: #define i2D_VL1 4
293: #define i2D_VL2 5
294: #define i2D_VL3 6
295: #define i2D_PASS 7
296: #define i2D_HORIZ 8
297: #define i2D_EOL 9
298:
299: static char *code2d[] = {
300: "1", /* V0 */
301: "011", /* VR1 */
302: "000011", /* VR2 */
303: "0000011", /* VR3 */
304: "010", /* VL1 */
305: "000010", /* VL2 */
306: "0000010", /* VL3 */
307: "0001", /* PASS */
308: "001", /* HORIZ */
309: EOLSTRING, /* EOL */
310: NULL };
311: static short bitc2d[] = { 1,3,6,7,3,6,7,4,3,12 };
312:
313: #define EOL0STRING "0000000000010"
314: #define EOL1STRING "0000000000011"
315: #define EOFB "000000000001000000000001"
316:
317: static char *spare1d[] = {
318: "000000001", /* 0, */
319: "0000000001", /* 0, */
320: "00000000001", /* 0 */
321: NULL };
322: static char *spare2d[] = {
323: "0000001", /* 0, */
324: "00000001", /* 0, */
325: "000000001", /* 0, */
326: "0000000001", /* 0, */
327: "00000000001", /* 0 */
328: NULL };
329:
330: /* State-transition table for decoding CCITT G3-1 */
331:
332: /* bit colors; also, starting index in table of 1-D codes*/
333: #define DST_color short
334: #define DST_white 0
335: #define DST_black 1
336:
337: #define flip_color(c) ((c)? 0: 1)
338:
339: #define DST_2d 2 /* starting index in table of 2-D codes */
340:
341: #define DST_state short /* state-id: index into DST_tbl.e[] */
342: #define DST_state_NULL (-1)
343: #define DST_state_ERROR (-2)
344:
345: #define DST_action int
346: #define DST_action_NULL (-1)
347: #define DST_action_ERROR (-2)
348:
349: /* transition in finite-state machine */
350: typedef struct DST_transit {
351: DST_action a; /* action to perform */
352: DST_state s; /* next state */
353: } DST_transit;
354: typedef struct DST_entry {
355: char p[MAXCODELEN+1]; /* code prefix so far (in ASCII) */
356: short l; /* strlen(.p) */
357: short z; /* no. of trailing "0"'s in .p */
358: DST_transit t[2]; /* two transitions: on 0 & 1 */
359: } DST_entry;
360: typedef struct DST_table {
361: int mny; /* no. entries so far */
362: DST_entry *e; /* array in malloc space:
363: e[DST_white] starts white 1-D codes;
364: e[DST_black] starts black 1-D codes;
365: e[DST_2d] starts 2-D codes */
366: } DST_table;
367: typedef struct DST_context {
368: DST_color c; /* current run-color */
369: int l; /* length of current code in bits: 0..(len-1) */
370: DST_table *t; /* table */
371: DST_state s; /* current state */
372: DST_transit tr; /* current state/action */
373: } DST_context;
374:
375:
376: DST_table *ccitt_table();
377: RLE_Line *g31_to_rlel();
378: int rlel_to_g31();
379: RLE_Line *g32_to_rlel();
380: int rlel_to_g32();
381: RLE_Line *g4_to_rlel();
382: int rlel_to_g4();
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.