|
|
researchv10 Norman
/* Copyright (c) 1989, 1990 AT&T --- All Rights Reserved. */
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T. */
/* The copyright notice does not imply actual or intended publication. */
/* AUTHORS: */
/* H. S. Baird - ATT-BL MH - first versions */
/* CCITT Group 3 FAX compression codes */
#define EOLSTRING "000000000001"
#define EOLLENGTH 12 /* length of EOLSTRING */
#define MAXCODELEN 24
#define DST_EOL -3
/* translate a runlength value <=2560 to an index into the Huffman code table;
if the index is >=64, then must repeat for (r%64) */
#define rtoi(r) (((r)<64)? (r): 64+((r)/64))
/* translate an index into the Huffman code table to a runlength value */
#define itor(i) (((i)<64)? (i): (((i)>64)? (((i)-64)*64): DST_EOL))
/* Black run code table */
static char *codeblk[] = {
/* code run-length value */
"0000110111", /* 0, */
"010", /* 1, */
"11", /* 2, */
"10", /* 3, */
"011", /* 4, */
"0011", /* 5, */
"0010", /* 6, */
"00011", /* 7, */
"000101", /* 8, */
"000100", /* 9, */
"0000100", /* 10, */
"0000101", /* 11, */
"0000111", /* 12, */
"00000100", /* 13, */
"00000111", /* 14, */
"000011000", /* 15, */
"0000010111", /* 16, */
"0000011000", /* 17, */
"0000001000", /* 18, */
"00001100111", /* 19, */
"00001101000", /* 20, */
"00001101100", /* 21, */
"00000110111", /* 22, */
"00000101000", /* 23, */
"00000010111", /* 24, */
"00000011000", /* 25, */
"000011001010", /* 26, */
"000011001011", /* 27, */
"000011001100", /* 28, */
"000011001101", /* 29, */
"000001101000", /* 30, */
"000001101001", /* 31, */
"000001101010", /* 32, */
"000001101011", /* 33, */
"000011010010", /* 34, */
"000011010011", /* 35, */
"000011010100", /* 36, */
"000011010101", /* 37, */
"000011010110", /* 38, */
"000011010111", /* 39, */
"000001101100", /* 40, */
"000001101101", /* 41, */
"000011011010", /* 42, */
"000011011011", /* 43, */
"000001010100", /* 44, */
"000001010101", /* 45, */
"000001010110", /* 46, */
"000001010111", /* 47, */
"000001100100", /* 48, */
"000001100101", /* 49, */
"000001010010", /* 50, */
"000001010011", /* 51, */
"000000100100", /* 52, */
"000000110111", /* 53, */
"000000111000", /* 54, */
"000000100111", /* 55, */
"000000101000", /* 56, */
"000001011000", /* 57, */
"000001011001", /* 58, */
"000000101011", /* 59, */
"000000101100", /* 60, */
"000001011010", /* 61, */
"000001100110", /* 62, */
"000001100111", /* 63 */
EOLSTRING, /* EOL */
"0000001111", /* 64, */
"000011001000", /* 128, */
"000011001001", /* 192, */
"000001011011", /* 256, */
"000000110011", /* 320, */
"000000110100", /* 384, */
"000000110101", /* 448, */
"0000001101100", /* 512, */
"0000001101101", /* 576, */
"0000001001010", /* 640, */
"0000001001011", /* 704, */
"0000001001100", /* 768, */
"0000001001101", /* 832, */
"0000001110010", /* 896, */
"0000001110011", /* 960, */
"0000001110100", /* 1024, */
"0000001110101", /* 1088, */
"0000001110110", /* 1152, */
"0000001110111", /* 1216, */
"0000001010010", /* 1280, */
"0000001010011", /* 1344, */
"0000001010100", /* 1408, */
"0000001010101", /* 1472, */
"0000001011010", /* 1536, */
"0000001011011", /* 1600, */
"0000001100100", /* 1664, */
"0000001100101", /* 1728 */
/* extended length: */
"00000001000", /* 1792, */
"00000001100", /* 1856, */
"00000001101", /* 1920, */
"000000010010", /* 1984, */
"000000010011", /* 2048, */
"000000010100", /* 2112, */
"000000010101", /* 2176, */
"000000010110", /* 2240, */
"000000010111", /* 2304, */
"000000011100", /* 2368, */
"000000011101", /* 2432, */
"000000011110", /* 2496, */
"000000011111", /* 2560 */
NULL /* are there codes beyond 2560? */
};
/* No. bits in the codes in the above table */
static short bitcblk[] = {
10,3,2,2,3,4,4,5,6,6, /* 0 - 9 */
7,7,7,8,8,9,10,10,10,11, /* 10 - 19 */
11,11,11,11,11,11,12,12,12,12, /* 20 - 29 */
12,12,12,12,12,12,12,12,12,12, /* 30 - 39 */
12,12,12,12,12,12,12,12,12,12, /* 40 - 49 */
12,12,12,12,12,12,12,12,12,12, /* 50 - 59 */
12,12,12,12, /* 60 - 63 */
12, /* EOL */
10, /* 64 */
12,12,12,12,12,12, /* 128 - 448 */
13,13,13,13,13,13,13,13,13, /* 512 - */
13,13,13,13,13,13,13,13,13,
13,13, /* - 1728 */
11,11,11, /* 1792 - 1920 */
12,12,12,12,12,12,12,12,12,12, /* 1984 - 2560 */
/* for codes over 2560 */
14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,
-1
};
/* White run code table */
static char *codewht[] = {
/* code run-length value */
"00110101", /* 0, */
"000111", /* 1, */
"0111", /* 2, */
"1000", /* 3, */
"1011", /* 4, */
"1100", /* 5, */
"1110", /* 6, */
"1111", /* 7, */
"10011", /* 8, */
"10100", /* 9, */
"00111", /* 10, */
"01000", /* 11, */
"001000", /* 12, */
"000011", /* 13, */
"110100", /* 14, */
"110101", /* 15, */
"101010", /* 16, */
"101011", /* 17, */
"0100111", /* 18, */
"0001100", /* 19, */
"0001000", /* 20, */
"0010111", /* 21, */
"0000011", /* 22, */
"0000100", /* 23, */
"0101000", /* 24, */
"0101011", /* 25, */
"0010011", /* 26, */
"0100100", /* 27, */
"0011000", /* 28, */
"00000010", /* 29, */
"00000011", /* 30, */
"00011010", /* 31, */
"00011011", /* 32, */
"00010010", /* 33, */
"00010011", /* 34, */
"00010100", /* 35, */
"00010101", /* 36, */
"00010110", /* 37, */
"00010111", /* 38, */
"00101000", /* 39, */
"00101001", /* 40, */
"00101010", /* 41, */
"00101011", /* 42, */
"00101100", /* 43, */
"00101101", /* 44, */
"00000100", /* 45, */
"00000101", /* 46, */
"00001010", /* 47, */
"00001011", /* 48, */
"01010010", /* 49, */
"01010011", /* 50, */
"01010100", /* 51, */
"01010101", /* 52, */
"00100100", /* 53, */
"00100101", /* 54, */
"01011000", /* 55, */
"01011001", /* 56, */
"01011010", /* 57, */
"01011011", /* 58, */
"01001010", /* 59, */
"01001011", /* 60, */
"00110010", /* 61, */
"00110011", /* 62, */
"00110100", /* 63 */
EOLSTRING, /* EOL */
"11011", /* 64, */
"10010", /* 128, */
"010111", /* 192, */
"0110111", /* 256, */
"00110110", /* 320, */
"00110111", /* 384, */
"01100100", /* 448, */
"01100101", /* 512, */
"01101000", /* 576, */
"01100111", /* 640, */
"011001100", /* 704, */
"011001101", /* 768, */
"011010010", /* 832, */
"011010011", /* 896, */
"011010100", /* 960, */
"011010101", /* 1024, */
"011010110", /* 1088, */
"011010111", /* 1152, */
"011011000", /* 1216, */
"011011001", /* 1280, */
"011011010", /* 1344, */
"011011011", /* 1408, */
"010011000", /* 1472, */
"010011001", /* 1536, */
"010011010", /* 1600, */
"011000", /* 1664, */
"010011011", /* 1728 */
/* extended length: */
"00000001000", /* 1792, */
"00000001100", /* 1856, */
"00000001101", /* 1920, */
"000000010010", /* 1984, */
"000000010011", /* 2048, */
"000000010100", /* 2112, */
"000000010101", /* 2176, */
"000000010110", /* 2240, */
"000000010111", /* 2304, */
"000000011100", /* 2368, */
"000000011101", /* 2432, */
"000000011110", /* 2496, */
"000000011111", /* 2560 */
NULL /* are there codes beyond 2560? */
};
/* no. bits in the codes in the above table */
static short bitcwht[] = {
8,6,4,4,4,4,4,4,5,5, /* 0 - 9 */
5,5,6,6,6,6,6,6,7,7, /* 10 - 19 */
7,7,7,7,7,7,7,7,7,8, /* 20 - 29 */
8,8,8,8,8,8,8,8,8,8, /* 30 - 39 */
8,8,8,8,8,8,8,8,8,8, /* 40 - 49 */
8,8,8,8,8,8,8,8,8,8, /* 50 - 59 */
8,8,8,8, /* 60 - 63 */
12, /* EOL */
5,5, /* 64,128 */
6, /* 192 */
7, /* 256 */
8,8,8,8,8,8, /* 320 - 640 */
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, /* 704 - 1600 */
6, /* 1664 */
9, /* 1728 */
11,11,11, /* 1792,1856,1920 */
12,12,12,12,12,12,12,12,12,12, /* 1984 - 2560 */
/* for codes over 2560 */
14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,
-1
};
/* 2-D codes (indices into code2d[] table) */
#define i2D_V0 0
#define i2D_VR1 1
#define i2D_VR2 2
#define i2D_VR3 3
#define i2D_VL1 4
#define i2D_VL2 5
#define i2D_VL3 6
#define i2D_PASS 7
#define i2D_HORIZ 8
#define i2D_EOL 9
static char *code2d[] = {
"1", /* V0 */
"011", /* VR1 */
"000011", /* VR2 */
"0000011", /* VR3 */
"010", /* VL1 */
"000010", /* VL2 */
"0000010", /* VL3 */
"0001", /* PASS */
"001", /* HORIZ */
EOLSTRING, /* EOL */
NULL };
static short bitc2d[] = { 1,3,6,7,3,6,7,4,3,12 };
#define EOL0STRING "0000000000010"
#define EOL1STRING "0000000000011"
#define EOFB "000000000001000000000001"
static char *spare1d[] = {
"000000001", /* 0, */
"0000000001", /* 0, */
"00000000001", /* 0 */
NULL };
static char *spare2d[] = {
"0000001", /* 0, */
"00000001", /* 0, */
"000000001", /* 0, */
"0000000001", /* 0, */
"00000000001", /* 0 */
NULL };
/* State-transition table for decoding CCITT G3-1 */
/* bit colors; also, starting index in table of 1-D codes*/
#define DST_color short
#define DST_white 0
#define DST_black 1
#define flip_color(c) ((c)? 0: 1)
#define DST_2d 2 /* starting index in table of 2-D codes */
#define DST_state short /* state-id: index into DST_tbl.e[] */
#define DST_state_NULL (-1)
#define DST_state_ERROR (-2)
#define DST_action int
#define DST_action_NULL (-1)
#define DST_action_ERROR (-2)
/* transition in finite-state machine */
typedef struct DST_transit {
DST_action a; /* action to perform */
DST_state s; /* next state */
} DST_transit;
typedef struct DST_entry {
char p[MAXCODELEN+1]; /* code prefix so far (in ASCII) */
short l; /* strlen(.p) */
short z; /* no. of trailing "0"'s in .p */
DST_transit t[2]; /* two transitions: on 0 & 1 */
} DST_entry;
typedef struct DST_table {
int mny; /* no. entries so far */
DST_entry *e; /* array in malloc space:
e[DST_white] starts white 1-D codes;
e[DST_black] starts black 1-D codes;
e[DST_2d] starts 2-D codes */
} DST_table;
typedef struct DST_context {
DST_color c; /* current run-color */
int l; /* length of current code in bits: 0..(len-1) */
DST_table *t; /* table */
DST_state s; /* current state */
DST_transit tr; /* current state/action */
} DST_context;
DST_table *ccitt_table();
RLE_Line *g31_to_rlel();
int rlel_to_g31();
RLE_Line *g32_to_rlel();
int rlel_to_g32();
RLE_Line *g4_to_rlel();
int rlel_to_g4();
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.