📄 g4sdecod.c
字号:
{
if (next_bit ()) /* 1 */ return (VERTICAL_V0_MODE);
else /* 0... */
{
if (next_bit ()) /* 01... */
{
if (next_bit ()) /* 011 */ return (VERTICAL_VR1_MODE);
else /* 010 */ return (VERTICAL_VL1_MODE);
}
else /* 00... */
{
if (next_bit ()) /* 001 */ return (HORIZONTAL_MODE);
else /* 000... */
{
if (next_bit ()) /* 0001 */ return (PASS_MODE);
else /* 0000... */
{
if (next_bit ()) /* 0000 1... */
{
if (next_bit ()) /* 0000 11 */ return (VERTICAL_VR2_MODE);
else /* 0000 10 */ return (VERTICAL_VL2_MODE);
}
else /* 0000 0... */
{
if (next_bit ()) /* 0000 01... */
{
if (next_bit ()) /* 0000 011 */ return (VERTICAL_VR3_MODE);
else /* 0000 010 */ return (VERTICAL_VL3_MODE);
}
else /* 0000 00... */
{
if (next_bit ()) /* 0000 001... */
{
if (next_bit ()) /* 0000 0011... */
{
if (next_bit ()) /* 0000 0011 1... */
{
if (next_bit ()) /* 0000 0011 11 */
return (EXT_MODE_UNCOMPRESSED);
else /* 0000 0011 10 */ return (ERROR_MODE);
}
else /* 0000 0011 0 */ return (ERROR_MODE);
}
else /* 0000 0010 */ return (ERROR_MODE);
}
else /* 0000 000 */ return (ERROR_MODE_1);
/* under the assumption that there are no errors in the file,
then this bit string can only be the beginning of an
EOFB (end-of-facsimile-block) code */
}
}
}
}
}
}
return (-1);
}
static void new_row ()
{
(*p_decode_new_row) ();
color = WHITE;
if (current_row == ODD)
{
current_row = EVEN;
odd_runs [++odd_index] = a0;
odd_runs [++odd_index] = a0;
odd_index = 1;
even_index = 0;
}
else /* current_row == EVEN */
{
current_row = ODD;
even_runs [++even_index] = a0;
even_runs [++even_index] = a0;
even_index = 1;
odd_index = 0;
}
a0 = 0;
b1 = -1;
#if defined (TRACE)
row_number++;
#endif
}
static char next_bit (void)
{
char value;
static unsigned char decode_mask [8] =
{ 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
if (!bit_number) code_byte = (*p_decode_next_byte) ();
if ((unsigned char) code_byte & decode_mask [bit_number]) value = 1;
else value = 0;
if (++bit_number > 7) bit_number = 0;
return (value);
}
/*
* return the length of the next run, assumed to be black
*/
static short decode_black_run ()
{
short cumulative = 0, code_value;
for (;;)
{
code_value = decode_black_word ();
cumulative += code_value;
if (code_value < 0) return (code_value);
if (code_value < 64) return (cumulative);
}
}
static short decode_black_word ()
{
if (next_bit ()) /* 1... */
{
if (next_bit ()) /* 11 */ return (2);
else /* 10 */ return (3);
}
else /* 0... */
{
if (next_bit ()) /* 01... */
{
if (next_bit ()) /* 011 */ return (4);
else /* 010 */ return (1);
}
else /* 00... */
{
if (next_bit ()) /* 001... */
{
if (next_bit ()) /* 0011 */ return (5);
else /* 0010 */ return (6);
}
else /* 000... */
{
if (next_bit ()) /* 0001... */
{
if (next_bit ()) /* 0001 1 */ return (7);
else /* 0001 0... */
{
if (next_bit ()) /* 0001 01 */ return (8);
else /* 0001 00 */ return (9);
}
}
else /* 0000... */
{
if (next_bit ()) /* 0000 1... */
{
if (next_bit ()) /* 0000 11... */
{
if (next_bit ()) /* 0000 111 */ return (12);
else /* 0000 110... */
{
if (next_bit ()) /* 0000 1101... */
{
if (next_bit ()) /* 0000 1101 1... */
{
if (next_bit ()) /* 0000 1101 11 */ return (0);
else /* 0000 1101 10... */
{
if (next_bit ()) /* 0000 1101 101... */
{
if (next_bit ()) /* 0000 1101 1011 */ return (43);
else /* 0000 1101 1010 */ return (42);
}
else /* 0000 1101 100 */ return (21);
}
}
else /* 0000 1101 0... */
{
if (next_bit ()) /* 0000 1101 01... */
{
if (next_bit ()) /* 0000 1101 011... */
{
if (next_bit ()) /* 0000 1101 0111 */ return (39);
else /* 0000 1101 0110 */ return (38);
}
else /* 0000 1101 010... */
{
if (next_bit ()) /* 0000 1101 0101 */ return (37);
else /* 0000 1101 0100 */ return (36);
}
}
else /* 0000 1101 00... */
{
if (next_bit ()) /* 0000 1101 001... */
{
if (next_bit ()) /* 0000 1101 0011 */ return (35);
else /* 0000 1101 0010 */ return (34);
}
else /* 0000 1101 000 */ return (20);
}
}
}
else /* 0000 1100... */
{
if (next_bit ()) /* 0000 1100 1... */
{
if (next_bit ()) /* 0000 1100 11... */
{
if (next_bit ()) /* 0000 1100 111 */ return (19);
else /* 0000 1100 110... */
{
if (next_bit ()) /* 0000 1100 1101 */ return (29);
else /* 0000 1100 1100 */ return (28);
}
}
else /* 0000 1100 10... */
{
if (next_bit ()) /* 0000 1100 101.. */
{
if (next_bit ()) /* 0000 1100 1011 */ return (27);
else /* 0000 1100 1010 */ return (26);
}
else /* 0000 1100 100... */
{
if (next_bit ()) /* 0000 1100 1001 */ return (192);
else /* 0000 1100 1000 */ return (128);
}
}
}
else /* 0000 1100 0 */ return (15);
}
}
}
else /* 0000 10... */
{
if (next_bit ()) /* 0000 101 */ return (11);
else /* 0000 100 */ return (10);
}
}
else /* 0000 0... */
{
if (next_bit ()) /* 0000 01... */
{
if (next_bit ()) /* 0000 011... */
{
if (next_bit ()) /* 0000 0111 */ return (14);
else /* 0000 0110... */
{
if (next_bit ()) /* 0000 0110 1... */
{
if (next_bit ()) /* 0000 0110 11... */
{
if (next_bit ()) /* 0000 0110 111 */ return (22);
else /* 0000 0110 110... */
{
if (next_bit ()) /* 0000 0110 1101 */ return (41);
else /* 0000 0110 1100 */ return (40);
}
}
else /* 0000 0110 10... */
{
if (next_bit ()) /* 0000 0110 101... */
{
if (next_bit ()) /* 0000 0110 1011 */ return (33);
else /* 0000 0110 1010 */ return (32);
}
else /* 0000 0110 100... */
{
if (next_bit ()) /* 0000 0110 1001 */ return (31);
else /* 0000 0110 1000 */ return (30);
}
}
}
else /* 0000 0110 0... */
{
if (next_bit ()) /* 0000 0110 01... */
{
if (next_bit ()) /* 0000 0110 011... */
{
if (next_bit ()) /* 0000 0110 0111 */ return (63);
else /* 0000 0110 0110 */ return (62);
}
else /* 0000 0110 010... */
{
if (next_bit ()) /* 0000 0110 0101 */ return (49);
else /* 0000 0110 0100 */ return (48);
}
}
else /* 0000 0110 00 */ return (17);
}
}
}
else /* 0000 010... */
{
if (next_bit ()) /* 0000 0101... */
{
if (next_bit ()) /* 0000 0101 1... */
{
if (next_bit ()) /* 0000 0101 11 */ return (16);
else /* 0000 0101 10... */
{
if (next_bit ()) /* 0000 0101 101... */
{
if (next_bit ()) /* 0000 0101 1011 */ return (256);
else /* 0000 0101 1010 */ return (61);
}
else /* 0000 0101 100... */
{
if (next_bit ()) /* 0000 0101 1001 */ return (58);
else /* 0000 0101 1000 */ return (57);
}
}
}
else /* 0000 0101 0... */
{
if (next_bit ()) /* 0000 0101 01... */
{
if (next_bit ()) /* 0000 0101 011... */
{
if (next_bit ()) /* 0000 0101 0111 */ return (47);
else /* 0000 0101 0110 */ return (46);
}
else /* 0000 0101 010... */
{
if (next_bit ()) /* 0000 0101 0101 */ return (45);
else /* 0000 0101 0100 */ return (44);
}
}
else /* 0000 0101 00... */
{
if (next_bit ()) /* 0000 0101 001... */
{
if (next_bit ()) /* 0000 0101 0011 */ return (51);
else /* 0000 0101 0010 */ return (50);
}
else /* 0000 0101 000 */ return (23);
}
}
}
else /* 0000 0100 */ return (13);
}
}
else /* 0000 00... */
{
if (next_bit ()) /* 0000 001... */
{
if (next_bit ()) /* 0000 0011... */
{
if (next_bit ()) /* 0000 0011 1... */
{
if (next_bit ()) /* 0000 0011 11 */ return (64);
else /* 0000 0011 10... */
{
if (next_bit ()) /* 0000 0011 101... */
{
if (next_bit ()) /* 0000 0011 1011... */
{
if (next_bit ()) /* 0000 0011 1011 1 */ return (1216);
else /* 0000 0011 1011 0 */ return (1152);
}
else /* 0000 0011 1010... */
{
if (next_bit ()) /* 0000 0011 1010 1 */ return (1088);
else /* 0000 0011 1010 0 */ return (1024);
}
}
else /* 0000 0011 100... */
{
if (next_bit ()) /* 0000 0011 1001... */
{
if (next_bit ()) /* 0000 0011 1001 1 */ return (960);
else /* 0000 0011 1001 0 */ return (896);
}
else /* 0000 0011 1000 */ return (54);
}
}
}
else /* 0000 0011 0... */
{
if (next_bit ()) /* 0000 0011 01... */
{
if (next_bit ()) /* 0000 0011 011... */
{
if (next_bit ()) /* 0000 0011 0111 */ return (53);
else /* 0000 0011 0110... */
{
if (next_bit ()) /* 0000 0011 0110 1 */ return (576);
else /* 0000 0011 0110 0 */ return (512);
}
}
else /* 0000 0011 010... */
{
if (next_bit ()) /* 0000 0011 0101 */ return (448);
else /* 0000 0011 0100 */ return (384);
}
}
else /* 0000 0011 00... */
{
if (next_bit ()) /* 0000 0011 001... */
{
if (next_bit ()) /* 0000 0011 0011 */ return (320);
else /* 0000 0011 0010... */
{
if (next_bit ()) /* 0000 0011 0010 1 */ return (1728);
else /* 0000 0011 0010 0 */ return (1664);
}
}
else /* 0000 0011 000 */ return (25);
}
}
}
else /* 0000 0010... */
{
if (next_bit ()) /* 0000 0010 1... */
{
if (next_bit ()) /* 0000 0010 11... */
{
if (next_bit ()) /* 0000 0010 111 */ return (24);
else /* 0000 0010 110... */
{
if (next_bit ()) /* 0000 0010 1101... */
{
if (next_bit ()) /* 0000 0010 1101 1 */ return (1600);
else /* 0000 0010 1101 0 */ return (1536);
}
else /* 0000 0010 1100 */ return (60);
}
}
else /* 0000 0010 10... */
{
if (next_bit ()) /* 0000 0010 101... */
{
if (next_bit ()) /* 0000 0010 1011 */ return (59);
else /* 0000 0010 1010... */
{
if (next_bit ()) /* 0000 0010 1010 1 */ return (1472);
else /* 0000 0010 1010 0 */ return (1408);
}
}
else /* 0000 0010 100... */
{
if (next_bit ()) /* 0000 0010 1001... */
{
if (next_bit ()) /* 0000 0010 1001 1 */ return (1344);
else /* 0000 0010 1001 0 */ return (1280);
}
else /* 0000 0010 1000 */ return (56);
}
}
}
else /* 0000 0010 0... */
{
if (next_bit ()) /* 0000 0010 01... */
{
if (next_bit ()) /* 0000 0010 011... */
{
if (next_bit ()) /* 0000 0010 0111 */ return (55);
else /* 0000 0010 0110... */
{
if (next_bit ()) /* 0000 0010 0110 1 */ return (832);
else /* 0000 0010 0110 0 */ return (768);
}
}
else /* 0000 0010 010... */
{
if (next_bit ()) /* 0000 0010 0101... */
{
if (next_bit ()) /* 0000 0010 0101 1 */ return (704);
else /* 0000 0010 0101 0 */ return (640);
}
else /* 0000 0010 0100 */ return (52);
}
}
else /* 0000 0010 00 */ return (18);
}
}
}
else /* 0000 000... */
{
if (next_bit ()) /* 0000 0001... */
{
if (next_bit ()) /* 0000 0001 1... */
{
if (next_bit ()) /* 0000 0001 11... */
{
if (next_bit ()) /* 0000 0001 111... */
{
if (next_bit ()) /* 0000 0001 1111 */ return (2560);
else /* 0000 0001 1110 */ return (2496);
}
else /* 0000 0001 110... */
{
if (next_bit ()) /* 0000 0001 1101 */ return (2432);
else /* 0000 0001 1100 */ return (2368);
}
}
else /* 0000 0001 10... */
{
if (next_bit ()) /* 0000 0001 101 */ return (1920);
else /* 0000 0001 100 */ return (1856);
}
}
else /* 0000 0001 0... */
{
if (next_bit ()) /* 0000 0001 01... */
{
if (next_bit ()) /* 0000 0001 011... */
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -