www.pudn.com > commutil.zip > CODEWORD.CPP
// ******************************************************************** //
// //
// CODEWORD.CPP //
// Copyright (c) 1993, Michael Holmes and Bob Flanders //
// C++ Communication Utilities //
// //
// This file contains the tables to support conversion between //
// G3 fax codewords and a bitmapped array. //
// //
// The code_entry structure is used in converting from the //
// G3 format to a bitmapped format. The code_table variable //
// is arranged as a two dimensional array. The indices are on //
// color (white and black) and number of bits. Based on the //
// current color being searched for and the number of bits //
// retrieved from the input stream, the shorter arrays are //
// searched. If a match is found, the value element represents //
// the number of pels for the this codeword. //
// //
// The encode_table structure is used to encode a bitmap into //
// a G3 fax format data stream. This table is indexed by the //
// number of bits and their color. The first 64 entries are //
// direct translations. The remaining entries (make up codes) //
// are used as a prefix to the first 64 values. //
// //
// ******************************************************************** //
struct code_entry // codeword translation entries
{
unsigned
char code; // codeword (right justified)
int value; // value of codeword
} code_bl2[] = // 2 bit black codewords
{
{ 2, 3 }, // 10
{ 3, 2 }, // 11
{ 0, 0 }
},
code_bl3[] = // 3 bit black codewords
{
{ 2, 1 }, // 010
{ 3, 4 }, // 011
{ 0, 0 }
},
code_wh4[] = // 4 bit white codewords
{
{ 7, 2 }, // 0111
{ 8, 3 }, // 1000
{ 11, 4 }, // 1011
{ 12, 5 }, // 1100
{ 14, 6 }, // 1110
{ 15, 7 }, // 1111
{ 0, 0 }
},
code_bl4[] = // 4 bit black codewords
{
{ 2, 6 }, // 0010
{ 3, 5 }, // 0011
{ 0, 0 }
},
code_wh5[] = // 5 bit white codewords
{
{ 7, 10 }, // 00111
{ 8, 11 }, // 01000
{ 18, 128 }, // 10010
{ 19, 8 }, // 10011
{ 20, 9 }, // 10100
{ 27, 64 }, // 11011
{ 0, 0 }
},
code_bl5[] = // 5 bit black codewords
{
{ 3, 7 }, // 00011
{ 0, 0 }
},
code_wh6[] = // 6 bit white codewords
{
{ 3, 13 }, // 000011
{ 7, 1 }, // 000111
{ 8, 12 }, // 001000
{ 23, 192 }, // 010111
{ 24, 1664 }, // 011000
{ 42, 16 }, // 101010
{ 43, 17 }, // 101011
{ 52, 14 }, // 110100
{ 53, 15 }, // 110101
{ 0, 0 }
},
code_bl6[] = // 6 bit black codewords
{
{ 4, 9 }, // 000100
{ 5, 8 }, // 000101
{ 0, 0 }
},
code_wh7[] = // 7 bit white codewords
{
{ 3, 22 }, // 0000011
{ 4, 23 }, // 0000100
{ 8, 20 }, // 0001000
{ 12, 19 }, // 0001100
{ 19, 26 }, // 0010011
{ 23, 21 }, // 0010111
{ 24, 28 }, // 0011000
{ 36, 27 }, // 0100100
{ 39, 18 }, // 0100111
{ 40, 24 }, // 0101000
{ 43, 25 }, // 0101011
{ 55, 256 }, // 0110111
{ 0, 0 }
},
code_bl7[] = // 7 bit black codewords
{
{ 4, 10 }, // 0000100
{ 5, 11 }, // 0000101
{ 7, 12 }, // 0000111
{ 0, 0 }
},
code_wh8[] = // 8 bit white codewords
{
{ 2, 29 }, // 00000010
{ 3, 30 }, // 00000011
{ 4, 45 }, // 00000100
{ 5, 46 }, // 00000101
{ 10, 47 }, // 00001010
{ 11, 48 }, // 00001011
{ 18, 33 }, // 00010010
{ 19, 34 }, // 00010011
{ 20, 35 }, // 00010100
{ 21, 36 }, // 00010101
{ 22, 37 }, // 00010110
{ 23, 38 }, // 00010111
{ 26, 31 }, // 00011010
{ 27, 32 }, // 00011011
{ 36, 53 }, // 00100100
{ 37, 54 }, // 00100101
{ 40, 39 }, // 00101000
{ 41, 40 }, // 00101001
{ 42, 41 }, // 00101010
{ 43, 42 }, // 00101011
{ 44, 43 }, // 00101100
{ 45, 44 }, // 00101101
{ 50, 61 }, // 00110010
{ 51, 62 }, // 00110011
{ 52, 63 }, // 00110100
{ 53, 0 }, // 00110101
{ 54, 320 }, // 00110110
{ 55, 384 }, // 00110111
{ 74, 59 }, // 01001010
{ 75, 60 }, // 01001011
{ 82, 49 }, // 01010010
{ 83, 50 }, // 01010011
{ 84, 51 }, // 01010100
{ 85, 52 }, // 01010101
{ 88, 55 }, // 01011000
{ 89, 56 }, // 01011001
{ 90, 57 }, // 01011010
{ 91, 58 }, // 01011011
{ 100, 448 }, // 01100100
{ 101, 512 }, // 01100101
{ 103, 640 }, // 01100111
{ 104, 576 }, // 01101000
{ 0, 0 }
},
code_bl8[] = // 8 bit black codewords
{
{ 4, 13 }, // 00000100
{ 7, 14 }, // 00000111
{ 0, 0 }
},
code_wh9[] = // 9 bit white codewords
{
{ 152, 1472 }, // 010011000
{ 153, 1536 }, // 010011001
{ 154, 1600 }, // 010011010
{ 155, 1728 }, // 010011011
{ 204, 704 }, // 011001100
{ 205, 768 }, // 011001101
{ 210, 832 }, // 011010010
{ 211, 896 }, // 011010011
{ 212, 960 }, // 011010100
{ 213, 1024 }, // 011010101
{ 214, 1088 }, // 011010110
{ 215, 1152 }, // 011010111
{ 216, 1216 }, // 011011000
{ 217, 1280 }, // 011011001
{ 218, 1344 }, // 011011010
{ 219, 1408 }, // 011011011
{ 0, 0 }
},
code_bl9[] = // 9 bit black codewords
{
{ 24, 15 }, // 000011000
{ 0, 0 }
},
code_bl10[] = // 10 bit black codewords
{
{ 8, 18 }, // 0000001000
{ 15, 64 }, // 0000001111
{ 23, 16 }, // 0000010111
{ 24, 17 }, // 0000011000
{ 55, 0 }, // 0000110111
{ 0, 0 }
},
code_bl11[] = // 11 bit black codewords
{
{ 23, 24 }, // 00000010111
{ 24, 25 }, // 00000011000
{ 40, 23 }, // 00000101000
{ 55, 22 }, // 00000110111
{ 103, 19 }, // 00001100111
{ 104, 20 }, // 00001101000
{ 108, 21 }, // 00001101100
{ 0, 0 }
},
code_bl12[] = // 12 bit black codewords
{
{ 36, 52 }, // 000000100100
{ 39, 55 }, // 000000100111
{ 40, 56 }, // 000000101000
{ 43, 59 }, // 000000101011
{ 44, 60 }, // 000000101100
{ 51, 320 }, // 000000110011
{ 52, 384 }, // 000000110100
{ 53, 448 }, // 000000110101
{ 55, 53 }, // 000000110111
{ 56, 54 }, // 000000111000
{ 82, 50 }, // 000001010010
{ 83, 51 }, // 000001010011
{ 84, 44 }, // 000001010100
{ 85, 45 }, // 000001010101
{ 86, 46 }, // 000001010110
{ 87, 47 }, // 000001010111
{ 88, 57 }, // 000001011000
{ 89, 58 }, // 000001011001
{ 90, 61 }, // 000001011010
{ 91, 256 }, // 000001011011
{ 100, 48 }, // 000001100100
{ 101, 49 }, // 000001100101
{ 102, 62 }, // 000001100110
{ 103, 63 }, // 000001100111
{ 104, 30 }, // 000001101000
{ 105, 31 }, // 000001101001
{ 106, 32 }, // 000001101010
{ 107, 33 }, // 000001101011
{ 108, 40 }, // 000001101100
{ 109, 41 }, // 000001101101
{ 200, 128 }, // 000011001000
{ 201, 192 }, // 000011001001
{ 202, 26 }, // 000011001010
{ 203, 27 }, // 000011001011
{ 204, 28 }, // 000011001100
{ 205, 29 }, // 000011001101
{ 210, 34 }, // 000011010010
{ 211, 35 }, // 000011010011
{ 212, 36 }, // 000011010100
{ 213, 37 }, // 000011010101
{ 214, 38 }, // 000011010110
{ 215, 39 }, // 000011010111
{ 218, 42 }, // 000011011010
{ 219, 43 }, // 000011011011
{ 0, 0 }
},
code_bl13[] = // 13 bit black codewords
{
{ 74, 640 }, // 0000001001010
{ 75, 704 }, // 0000001001011
{ 76, 768 }, // 0000001001100
{ 77, 832 }, // 0000001001101
{ 82, 1280 }, // 0000001010010
{ 83, 1344 }, // 0000001010011
{ 84, 1408 }, // 0000001010100
{ 85, 1472 }, // 0000001010101
{ 90, 1536 }, // 0000001011010
{ 91, 1600 }, // 0000001011011
{ 100, 1664 }, // 0000001100100
{ 101, 1728 }, // 0000001100101
{ 108, 512 }, // 0000001101100
{ 109, 576 }, // 0000001101101
{ 114, 896 }, // 0000001110010
{ 115, 960 }, // 0000001110011
{ 116, 1024 }, // 0000001110100
{ 117, 1088 }, // 0000001110101
{ 118, 1152 }, // 0000001110110
{ 119, 1216 }, // 0000001110111
{ 0, 0 }
},
*code_table[13][2] = // codeword table pointer
{
{ 0, 0 }, // 1 bit entry
{ 0, code_bl2 }, // 2 bit entries
{ 0, code_bl3 }, // 3 bits entries
{ code_wh4, code_bl4 }, // 4 bits entries
{ code_wh5, code_bl5 }, // 5 bits entries
{ code_wh6, code_bl6 }, // 6 bits entries
{ code_wh7, code_bl7 }, // 7 bits entries
{ code_wh8, code_bl8 }, // 8 bits entries
{ code_wh9, code_bl9 }, // 9 bits entries
{ 0, code_bl10 }, // 10 bits entries
{ 0, code_bl11 }, // 11 bits entries
{ 0, code_bl12 }, // 12 bits entries
{ 0, code_bl13 }, // 13 bits entries
};
struct encode_entry // encode entry
{
unsigned
char code, // codeword (right justified)
bits; // length of codeword in bits
} encode_table[91][2] = // encode codeword table
{
{ { 53, 8 }, { 55, 10 } }, // 0
{ { 7, 6 }, { 2, 3 } }, // 1
{ { 7, 4 }, { 3, 2 } }, // 2
{ { 8, 4 }, { 2, 2 } }, // 3
{ { 11, 4 }, { 3, 3 } }, // 4
{ { 12, 4 }, { 3, 4 } }, // 5
{ { 14, 4 }, { 2, 4 } }, // 6
{ { 15, 4 }, { 3, 5 } }, // 7
{ { 19, 5 }, { 5, 6 } }, // 8
{ { 20, 5 }, { 4, 6 } }, // 9
{ { 7, 5 }, { 4, 7 } }, // 10
{ { 8, 5 }, { 5, 7 } }, // 11
{ { 8, 6 }, { 7, 7 } }, // 12
{ { 3, 6 }, { 4, 8 } }, // 13
{ { 52, 6 }, { 7, 8 } }, // 14
{ { 53, 6 }, { 24, 9 } }, // 15
{ { 42, 6 }, { 23, 10 } }, // 16
{ { 43, 6 }, { 24, 10 } }, // 17
{ { 39, 7 }, { 8, 10 } }, // 18
{ { 12, 7 }, { 103, 11 } }, // 19
{ { 8, 7 }, { 104, 11 } }, // 20
{ { 23, 7 }, { 108, 11 } }, // 21
{ { 3, 7 }, { 55, 11 } }, // 22
{ { 4, 7 }, { 40, 11 } }, // 23
{ { 40, 7 }, { 23, 11 } }, // 24
{ { 43, 7 }, { 24, 11 } }, // 25
{ { 19, 7 }, { 202, 12 } }, // 26
{ { 36, 7 }, { 203, 12 } }, // 27
{ { 24, 7 }, { 204, 12 } }, // 28
{ { 2, 8 }, { 205, 12 } }, // 29
{ { 3, 8 }, { 104, 12 } }, // 30
{ { 26, 8 }, { 105, 12 } }, // 31
{ { 27, 8 }, { 106, 12 } }, // 32
{ { 18, 8 }, { 107, 12 } }, // 33
{ { 19, 8 }, { 210, 12 } }, // 34
{ { 20, 8 }, { 211, 12 } }, // 35
{ { 21, 8 }, { 212, 12 } }, // 36
{ { 22, 8 }, { 213, 12 } }, // 37
{ { 23, 8 }, { 214, 12 } }, // 38
{ { 40, 8 }, { 215, 12 } }, // 39
{ { 41, 8 }, { 108, 12 } }, // 40
{ { 42, 8 }, { 109, 12 } }, // 41
{ { 43, 8 }, { 218, 12 } }, // 42
{ { 44, 8 }, { 219, 12 } }, // 43
{ { 45, 8 }, { 84, 12 } }, // 44
{ { 4, 8 }, { 85, 12 } }, // 45
{ { 5, 8 }, { 86, 12 } }, // 46
{ { 10, 8 }, { 87, 12 } }, // 47
{ { 11, 8 }, { 100, 12 } }, // 48
{ { 82, 8 }, { 101, 12 } }, // 49
{ { 83, 8 }, { 82, 12 } }, // 50
{ { 84, 8 }, { 83, 12 } }, // 51
{ { 85, 8 }, { 36, 12 } }, // 52
{ { 36, 8 }, { 55, 12 } }, // 53
{ { 37, 8 }, { 56, 12 } }, // 54
{ { 88, 8 }, { 39, 12 } }, // 55
{ { 89, 8 }, { 40, 12 } }, // 56
{ { 90, 8 }, { 88, 12 } }, // 57
{ { 91, 8 }, { 89, 12 } }, // 58
{ { 74, 8 }, { 43, 12 } }, // 59
{ { 75, 8 }, { 44, 12 } }, // 60
{ { 50, 8 }, { 90, 12 } }, // 61
{ { 51, 8 }, { 102, 12 } }, // 62
{ { 52, 8 }, { 103, 12 } }, // 63
{ { 27, 5 }, { 15, 10 } }, // 64
{ { 18, 5 }, { 200, 12 } }, // 128
{ { 23, 6 }, { 201, 12 } }, // 192
{ { 55, 7 }, { 91, 12 } }, // 256
{ { 54, 8 }, { 51, 12 } }, // 320
{ { 55, 8 }, { 52, 12 } }, // 384
{ { 100, 8 }, { 53, 12 } }, // 448
{ { 101, 8 }, { 108, 13 } }, // 512
{ { 104, 8 }, { 109, 13 } }, // 576
{ { 103, 8 }, { 74, 13 } }, // 640
{ { 204, 9 }, { 75, 13 } }, // 704
{ { 205, 9 }, { 76, 13 } }, // 768
{ { 210, 9 }, { 77, 13 } }, // 832
{ { 211, 9 }, { 114, 13 } }, // 896
{ { 212, 9 }, { 115, 13 } }, // 960
{ { 213, 9 }, { 116, 13 } }, // 1024
{ { 214, 9 }, { 117, 13 } }, // 1088
{ { 215, 9 }, { 118, 13 } }, // 1152
{ { 216, 9 }, { 119, 13 } }, // 1216
{ { 217, 9 }, { 82, 13 } }, // 1280
{ { 218, 9 }, { 83, 13 } }, // 1344
{ { 219, 9 }, { 84, 13 } }, // 1408
{ { 152, 9 }, { 85, 13 } }, // 1472
{ { 153, 9 }, { 90, 13 } }, // 1536
{ { 154, 9 }, { 91, 13 } }, // 1600
{ { 24, 6 }, { 100, 13 } }, // 1664
{ { 155, 9 }, { 101, 13 } } // 1728
};