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 
        };