CODEWORD.CPP
资源名称:commutil.zip [点击查看]
上传用户:xr_qian
上传日期:2007-01-05
资源大小:443k
文件大小:22k
源码类别:
通讯/手机编程
开发平台:
DOS
- // ******************************************************************** //
- // //
- // 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
- };