/*++

Copyright (c) 1996  Microsoft Corporation

Module Name:

    tifftabl.h

Abstract:

    Tables used for Group3 fax compression and decompression.

Environment:

    WIN32 User Mode

Author:

    Wesley Witt (wesw) 17-Feb-1996

--*/


#ifndef _FAXTABLE_H_
#define _FAXTABLE_H_

//
// Data structure for representing code table entries
//

typedef struct _CODETABLE {

    WORD    length;     // code length
    WORD    code;       // code word itself

} CODETABLE;

typedef const CODETABLE *PCODETABLE;

//
// Code word for end-of-line (EOL)
//  000000000001
//

#define EOL_CODE                   1
#define EOL_REVERSED_CODE          0x0800
#define EOL_LENGTH                 12

#define TAG_1D_EOL_REVERSED_CODE   0x1001
#define TAG_1D_EOL_LENGTH          13

//
// Code word for 2D encoding - pass mode
//  0001
//

#define PASSCODE        1
#define PASSCODE_REVERSED  0x08
#define PASSCODE_LENGTH 4

//
// Code word for 2D encoding - horizontal mode prefix
//  001
//

#define HORZCODE        1
#define HORZCODE_REVERSED  0x04
#define HORZCODE_LENGTH 3

//
// Code word for 2D encoding - vertical mode
//

static const CODETABLE VertCodes[] = {

    {  7, 0x02 },       // 0000010     VTMODE3N
    {  6, 0x02 },       // 000010      VTMODE2N
    {  3, 0x02 },       // 010         VTMODE1N
    {  1, 0x01 },       // 1           VTMODE0
    {  3, 0x03 },       // 011         VTMODE1P
    {  6, 0x03 },       // 000011      VTMODE2P
    {  7, 0x03 },       // 0000011     VTMODE3P
};


static const CODETABLE VertCodesReversed[] = {

    {  7, 0x20 },       // 010 0000    VTMODE3N
    {  6, 0x10 },       // 01 0000     VTMODE2N
    {  3, 0x02 },       // 010         VTMODE1N
    {  1, 0x01 },       // 1           VTMODE0
    {  3, 0x06 },       // 110         VTMODE1P
    {  6, 0x30 },       // 11 0000     VTMODE2P
    {  7, 0x60 },       // 110 0000    VTMODE3P
};




//
// Code table for white runs
//

static const CODETABLE WhiteRunCodes[] = {

    {  8, 0x35 },       // 00110101            0         0
    {  6, 0x07 },       // 000111              1         1
    {  4, 0x07 },       // 0111                2         2
    {  4, 0x08 },       // 1000                3         3
    {  4, 0x0b },       // 1011                4         4
    {  4, 0x0c },       // 1100                5         5
    {  4, 0x0e },       // 1110                6         6
    {  4, 0x0f },       // 1111                7         7
    {  5, 0x13 },       // 10011               8         8
    {  5, 0x14 },       // 10100               9         9
    {  5, 0x07 },       // 00111              10        10
    {  5, 0x08 },       // 01000              11        11
    {  6, 0x08 },       // 001000             12        12
    {  6, 0x03 },       // 000011             13        13
    {  6, 0x34 },       // 110100             14        14
    {  6, 0x35 },       // 110101             15        15
    {  6, 0x2a },       // 101010             16        16
    {  6, 0x2b },       // 101011             17        17
    {  7, 0x27 },       // 0100111            18        18
    {  7, 0x0c },       // 0001100            19        19
    {  7, 0x08 },       // 0001000            20        20
    {  7, 0x17 },       // 0010111            21        21
    {  7, 0x03 },       // 0000011            22        22
    {  7, 0x04 },       // 0000100            23        23
    {  7, 0x28 },       // 0101000            24        24
    {  7, 0x2b },       // 0101011            25        25
    {  7, 0x13 },       // 0010011            26        26
    {  7, 0x24 },       // 0100100            27        27
    {  7, 0x18 },       // 0011000            28        28
    {  8, 0x02 },       // 00000010           29        29
    {  8, 0x03 },       // 00000011           30        30
    {  8, 0x1a },       // 00011010           31        31
    {  8, 0x1b },       // 00011011           32        32
    {  8, 0x12 },       // 00010010           33        33
    {  8, 0x13 },       // 00010011           34        34
    {  8, 0x14 },       // 00010100           35        35
    {  8, 0x15 },       // 00010101           36        36
    {  8, 0x16 },       // 00010110           37        37
    {  8, 0x17 },       // 00010111           38        38
    {  8, 0x28 },       // 00101000           39        39
    {  8, 0x29 },       // 00101001           40        40
    {  8, 0x2a },       // 00101010           41        41
    {  8, 0x2b },       // 00101011           42        42
    {  8, 0x2c },       // 00101100           43        43
    {  8, 0x2d },       // 00101101           44        44
    {  8, 0x04 },       // 00000100           45        45
    {  8, 0x05 },       // 00000101           46        46
    {  8, 0x0a },       // 00001010           47        47
    {  8, 0x0b },       // 00001011           48        48
    {  8, 0x52 },       // 01010010           49        49
    {  8, 0x53 },       // 01010011           50        50
    {  8, 0x54 },       // 01010100           51        51
    {  8, 0x55 },       // 01010101           52        52
    {  8, 0x24 },       // 00100100           53        53
    {  8, 0x25 },       // 00100101           54        54
    {  8, 0x58 },       // 01011000           55        55
    {  8, 0x59 },       // 01011001           56        56
    {  8, 0x5a },       // 01011010           57        57
    {  8, 0x5b },       // 01011011           58        58
    {  8, 0x4a },       // 01001010           59        59
    {  8, 0x4b },       // 01001011           50        60
    {  8, 0x32 },       // 00110010           51        61
    {  8, 0x33 },       // 00110011           52        62
    {  8, 0x34 },       // 00110100           53        63
    {  5, 0x1b },       // 11011              54        64
    {  5, 0x12 },       // 10010              55       128
    {  6, 0x17 },       // 010111             56       192
    {  7, 0x37 },       // 0110111            57       256
    {  8, 0x36 },       // 00110110           58       320
    {  8, 0x37 },       // 00110111           59       384
    {  8, 0x64 },       // 01100100           60       448
    {  8, 0x65 },       // 01100101           61       512
    {  8, 0x68 },       // 01101000           62       576
    {  8, 0x67 },       // 01100111           63       640
    {  9, 0xcc },       // 011001100          64       704
    {  9, 0xcd },       // 011001101          65       768
    {  9, 0xd2 },       // 011010010          66       832
    {  9, 0xd3 },       // 011010011          67       896
    {  9, 0xd4 },       // 011010100          68       960
    {  9, 0xd5 },       // 011010101          69      1024
    {  9, 0xd6 },       // 011010110          70      1088
    {  9, 0xd7 },       // 011010111          71      1152
    {  9, 0xd8 },       // 011011000          72      1216
    {  9, 0xd9 },       // 011011001          73      1280
    {  9, 0xda },       // 011011010          74      1344
    {  9, 0xdb },       // 011011011          75      1408
    {  9, 0x98 },       // 010011000          76      1472
    {  9, 0x99 },       // 010011001          77      1536
    {  9, 0x9a },       // 010011010          78      1600
    {  6, 0x18 },       // 011000             79      1664
    {  9, 0x9b },       // 010011011          80      1728
    { 11, 0x08 },       // 00000001000        81      1792
    { 11, 0x0c },       // 00000001100        82      1856
    { 11, 0x0d },       // 00000001101        83      1920
    { 12, 0x12 },       // 000000010010       84      1984
    { 12, 0x13 },       // 000000010011       85      2048
    { 12, 0x14 },       // 000000010100       86      2112
    { 12, 0x15 },       // 000000010101       87      2176
    { 12, 0x16 },       // 000000010110       88      2240
    { 12, 0x17 },       // 000000010111       89      2304
    { 12, 0x1c },       // 000000011100       90      2368
    { 12, 0x1d },       // 000000011101       91      2432
    { 12, 0x1e },       // 000000011110       92      2496
    { 12, 0x1f },       // 000000011111       93      2560
};

static const CODETABLE WhiteRunCodesReversed[] = {

    {  8, 0x00ac },       // 00110101            0         0
    {  6, 0x0038 },       // 000111              1         1
    {  4, 0x000e },       // 0111                2         2
    {  4, 0x0001 },       // 1000                3         3
    {  4, 0x000d },       // 1011                4         4
    {  4, 0x0003 },       // 1100                5         5
    {  4, 0x0007 },       // 1110                6         6
    {  4, 0x000f },       // 1111                7         7
    {  5, 0x0019 },       // 10011               8         8
    {  5, 0x0005 },       // 10100               9         9
    {  5, 0x001c },       // 00111              10        10
    {  5, 0x0002 },       // 01000              11        11
    {  6, 0x0004 },       // 001000             12        12
    {  6, 0x0030 },       // 000011             13        13
    {  6, 0x000b },       // 110100             14        14
    {  6, 0x002b },       // 110101             15        15
    {  6, 0x0015 },       // 101010             16        16
    {  6, 0x0035 },       // 101011             17        17
    {  7, 0x0072 },       // 0100111            18        18
    {  7, 0x0018 },       // 0001100            19        19
    {  7, 0x0008 },       // 0001000            20        20
    {  7, 0x0074 },       // 0010111            21        21
    {  7, 0x0060 },       // 0000011            22        22
    {  7, 0x0010 },       // 0000100            23        23
    {  7, 0x000a },       // 0101000            24        24
    {  7, 0x006a },       // 0101011            25        25
    {  7, 0x0064 },       // 0010011            26        26
    {  7, 0x0012 },       // 0100100            27        27
    {  7, 0x000c },       // 0011000            28        28
    {  8, 0x0040 },       // 00000010           29        29
    {  8, 0x00c0 },       // 00000011           30        30
    {  8, 0x0058 },       // 00011010           31        31
    {  8, 0x00d8 },       // 00011011           32        32
    {  8, 0x0048 },       // 00010010           33        33
    {  8, 0x00c8 },       // 00010011           34        34
    {  8, 0x0028 },       // 00010100           35        35
    {  8, 0x00a8 },       // 00010101           36        36
    {  8, 0x0068 },       // 00010110           37        37
    {  8, 0x00e8 },       // 00010111           38        38
    {  8, 0x0014 },       // 00101000           39        39
    {  8, 0x0094 },       // 00101001           40        40
    {  8, 0x0054 },       // 00101010           41        41
    {  8, 0x00d4 },       // 00101011           42        42
    {  8, 0x0034 },       // 00101100           43        43
    {  8, 0x00b4 },       // 00101101           44        44
    {  8, 0x0020 },       // 00000100           45        45
    {  8, 0x00a0 },       // 00000101           46        46
    {  8, 0x0050 },       // 00001010           47        47
    {  8, 0x00d0 },       // 00001011           48        48
    {  8, 0x004a },       // 01010010           49        49
    {  8, 0x00ca },       // 01010011           50        50
    {  8, 0x002a },       // 01010100           51        51
    {  8, 0x00aa },       // 01010101           52        52
    {  8, 0x0024 },       // 00100100           53        53
    {  8, 0x00a4 },       // 00100101           54        54
    {  8, 0x001a },       // 01011000           55        55
    {  8, 0x009a },       // 01011001           56        56
    {  8, 0x005a },       // 01011010           57        57
    {  8, 0x00da },       // 01011011           58        58
    {  8, 0x0052 },       // 01001010           59        59
    {  8, 0x00d2 },       // 01001011           50        60
    {  8, 0x004c },       // 00110010           51        61
    {  8, 0x00cc },       // 00110011           52        62
    {  8, 0x002c },       // 00110100           53        63
    {  5, 0x001b },       // 11011              54        64
    {  5, 0x0009 },       // 10010              55       128
    {  6, 0x003a },       // 010111             56       192
    {  7, 0x0076 },       // 0110111            57       256
    {  8, 0x006c },       // 00110110           58       320
    {  8, 0x00ec },       // 00110111           59       384
    {  8, 0x0026 },       // 01100100           60       448
    {  8, 0x00a6 },       // 01100101           61       512
    {  8, 0x0016 },       // 01101000           62       576
    {  8, 0x00e6 },       // 01100111           63       640
    {  9, 0x0066 },       // 011001100          64       704
    {  9, 0x0166 },       // 011001101          65       768
    {  9, 0x0096 },       // 011010010          66       832
    {  9, 0x0196 },       // 011010011          67       896
    {  9, 0x0056 },       // 011010100          68       960
    {  9, 0x0156 },       // 011010101          69      1024
    {  9, 0x00d6 },       // 011010110          70      1088
    {  9, 0x01d6 },       // 011010111          71      1152
    {  9, 0x0036 },       // 011011000          72      1216
    {  9, 0x0136 },       // 011011001          73      1280
    {  9, 0x00b6 },       // 011011010          74      1344
    {  9, 0x01b6 },       // 011011011          75      1408
    {  9, 0x0032 },       // 010011000          76      1472
    {  9, 0x0132 },       // 010011001          77      1536
    {  9, 0x00b2 },       // 010011010          78      1600
    {  6, 0x0006 },       // 011000             79      1664
    {  9, 0x01b2 },       // 010011011          80      1728
    { 11, 0x0080 },       // 00000001000        81      1792
    { 11, 0x0180 },       // 00000001100        82      1856
    { 11, 0x0580 },       // 00000001101        83      1920
    { 12, 0x0480 },       // 000000010010       84      1984
    { 12, 0x0c80 },       // 000000010011       85      2048
    { 12, 0x0280 },       // 000000010100       86      2112
    { 12, 0x0a80 },       // 000000010101       87      2176
    { 12, 0x0680 },       // 000000010110       88      2240
    { 12, 0x0e80 },       // 000000010111       89      2304
    { 12, 0x0380 },       // 000000011100       90      2368
    { 12, 0x0b80 },       // 000000011101       91      2432
    { 12, 0x0780 },       // 000000011110       92      2496
    { 12, 0x0f80 },       // 000000011111       93      2560
};

#define WhiteRunCodeEntries  (sizeof(WhiteRunCodes)/sizeof(CODETABLE))

//
// Code table for black runs
//

static const CODETABLE BlackRunCodes[] = {

    { 10, 0x37 },       // 0000110111          0       0
    {  3, 0x02 },       // 010                 1       1
    {  2, 0x03 },       // 11                  2       2
    {  2, 0x02 },       // 10                  3       3
    {  3, 0x03 },       // 011                 4       4
    {  4, 0x03 },       // 0011                5       5
    {  4, 0x02 },       // 0010                6       6
    {  5, 0x03 },       // 00011               7       7
    {  6, 0x05 },       // 000101              8       8
    {  6, 0x04 },       // 000100              9       9
    {  7, 0x04 },       // 0000100            10      10
    {  7, 0x05 },       // 0000101            11      11
    {  7, 0x07 },       // 0000111            12      12
    {  8, 0x04 },       // 00000100           13      13
    {  8, 0x07 },       // 00000111           14      14
    {  9, 0x18 },       // 000011000          15      15
    { 10, 0x17 },       // 0000010111         16      16
    { 10, 0x18 },       // 0000011000         17      17
    { 10, 0x08 },       // 0000001000         18      18
    { 11, 0x67 },       // 00001100111        19      19
    { 11, 0x68 },       // 00001101000        20      20
    { 11, 0x6c },       // 00001101100        21      21
    { 11, 0x37 },       // 00000110111        22      22
    { 11, 0x28 },       // 00000101000        23      23
    { 11, 0x17 },       // 00000010111        24      24
    { 11, 0x18 },       // 00000011000        25      25
    { 12, 0xca },       // 000011001010       26      26
    { 12, 0xcb },       // 000011001011       27      27
    { 12, 0xcc },       // 000011001100       28      28
    { 12, 0xcd },       // 000011001101       29      29
    { 12, 0x68 },       // 000001101000       30      30
    { 12, 0x69 },       // 000001101001       31      31
    { 12, 0x6a },       // 000001101010       32      32
    { 12, 0x6b },       // 000001101011       33      33
    { 12, 0xd2 },       // 000011010010       34      34
    { 12, 0xd3 },       // 000011010011       35      35
    { 12, 0xd4 },       // 000011010100       36      36
    { 12, 0xd5 },       // 000011010101       37      37
    { 12, 0xd6 },       // 000011010110       38      38
    { 12, 0xd7 },       // 000011010111       39      39
    { 12, 0x6c },       // 000001101100       40      40
    { 12, 0x6d },       // 000001101101       41      41
    { 12, 0xda },       // 000011011010       42      42
    { 12, 0xdb },       // 000011011011       43      43
    { 12, 0x54 },       // 000001010100       44      44
    { 12, 0x55 },       // 000001010101       45      45
    { 12, 0x56 },       // 000001010110       46      46
    { 12, 0x57 },       // 000001010111       47      47
    { 12, 0x64 },       // 000001100100       48      48
    { 12, 0x65 },       // 000001100101       49      49
    { 12, 0x52 },       // 000001010010       50      50
    { 12, 0x53 },       // 000001010011       51      51
    { 12, 0x24 },       // 000000100100       52      52
    { 12, 0x37 },       // 000000110111       53      53
    { 12, 0x38 },       // 000000111000       54      54
    { 12, 0x27 },       // 000000100111       55      55
    { 12, 0x28 },       // 000000101000       56      56
    { 12, 0x58 },       // 000001011000       57      57
    { 12, 0x59 },       // 000001011001       58      58
    { 12, 0x2b },       // 000000101011       59      59
    { 12, 0x2c },       // 000000101100       50      60
    { 12, 0x5a },       // 000001011010       51      61
    { 12, 0x66 },       // 000001100110       52      62
    { 12, 0x67 },       // 000001100111       53      63
    { 10, 0x0f },       // 0000001111         54      64
    { 12, 0xc8 },       // 000011001000       55     128
    { 12, 0xc9 },       // 000011001001       56     192
    { 12, 0x5b },       // 000001011011       57     256
    { 12, 0x33 },       // 000000110011       58     320
    { 12, 0x34 },       // 000000110100       59     384
    { 12, 0x35 },       // 000000110101       60     448
    { 13, 0x6c },       // 0000001101100      61     512
    { 13, 0x6d },       // 0000001101101      62     576
    { 13, 0x4a },       // 0000001001010      63     640
    { 13, 0x4b },       // 0000001001011      64     704
    { 13, 0x4c },       // 0000001001100      65     768
    { 13, 0x4d },       // 0000001001101      66     832
    { 13, 0x72 },       // 0000001110010      67     896
    { 13, 0x73 },       // 0000001110011      68     960
    { 13, 0x74 },       // 0000001110100      69    1024
    { 13, 0x75 },       // 0000001110101      70    1088
    { 13, 0x76 },       // 0000001110110      71    1152
    { 13, 0x77 },       // 0000001110111      72    1216
    { 13, 0x52 },       // 0000001010010      73    1280
    { 13, 0x53 },       // 0000001010011      74    1344
    { 13, 0x54 },       // 0000001010100      75    1408
    { 13, 0x55 },       // 0000001010101      76    1472
    { 13, 0x5a },       // 0000001011010      77    1536
    { 13, 0x5b },       // 0000001011011      78    1600
    { 13, 0x64 },       // 0000001100100      79    1664
    { 13, 0x65 },       // 0000001100101      80    1728
    { 11, 0x08 },       // 00000001000        81    1792
    { 11, 0x0c },       // 00000001100        82    1856
    { 11, 0x0d },       // 00000001101        83    1920
    { 12, 0x12 },       // 000000010010       84    1984
    { 12, 0x13 },       // 000000010011       85    2048
    { 12, 0x14 },       // 000000010100       86    2112
    { 12, 0x15 },       // 000000010101       87    2176
    { 12, 0x16 },       // 000000010110       88    2240
    { 12, 0x17 },       // 000000010111       89    2304
    { 12, 0x1c },       // 000000011100       90    2368
    { 12, 0x1d },       // 000000011101       91    2432
    { 12, 0x1e },       // 000000011110       92    2496
    { 12, 0x1f },       // 000000011111       93    2560
};

static const CODETABLE BlackRunCodesReversed[] = {

    { 10, 0x03b0 },       // 0000110111          0       0
    {  3, 0x0002 },       // 010                 1       1
    {  2, 0x0003 },       // 11                  2       2
    {  2, 0x0001 },       // 10                  3       3
    {  3, 0x0006 },       // 011                 4       4
    {  4, 0x000c },       // 0011                5       5
    {  4, 0x0004 },       // 0010                6       6
    {  5, 0x0018 },       // 00011               7       7
    {  6, 0x0028 },       // 000101              8       8
    {  6, 0x0008 },       // 000100              9       9
    {  7, 0x0010 },       // 0000100            10      10
    {  7, 0x0050 },       // 0000101            11      11
    {  7, 0x0070 },       // 0000111            12      12
    {  8, 0x0020 },       // 00000100           13      13
    {  8, 0x00e0 },       // 00000111           14      14
    {  9, 0x0030 },       // 000011000          15      15
    { 10, 0x03a0 },       // 0000010111         16      16
    { 10, 0x0060 },       // 0000011000         17      17
    { 10, 0x0040 },       // 0000001000         18      18
    { 11, 0x0730 },       // 00001100111        19      19
    { 11, 0x00b0 },       // 00001101000        20      20
    { 11, 0x01b0 },       // 00001101100        21      21
    { 11, 0x0760 },       // 00000110111        22      22
    { 11, 0x00a0 },       // 00000101000        23      23
    { 11, 0x0740 },       // 00000010111        24      24
    { 11, 0x00c0 },       // 00000011000        25      25
    { 12, 0x0530 },       // 000011001010       26      26
    { 12, 0x0d30 },       // 000011001011       27      27
    { 12, 0x0330 },       // 000011001100       28      28
    { 12, 0x0b30 },       // 000011001101       29      29
    { 12, 0x0160 },       // 000001101000       30      30
    { 12, 0x0960 },       // 000001101001       31      31
    { 12, 0x0560 },       // 000001101010       32      32
    { 12, 0x0d60 },       // 000001101011       33      33
    { 12, 0x04b0 },       // 000011010010       34      34
    { 12, 0x0cb0 },       // 000011010011       35      35
    { 12, 0x02b0 },       // 000011010100       36      36
    { 12, 0x0ab0 },       // 000011010101       37      37
    { 12, 0x06b0 },       // 000011010110       38      38
    { 12, 0x0eb0 },       // 000011010111       39      39
    { 12, 0x0360 },       // 000001101100       40      40
    { 12, 0x0b60 },       // 000001101101       41      41
    { 12, 0x05b0 },       // 000011011010       42      42
    { 12, 0x0db0 },       // 000011011011       43      43
    { 12, 0x02a0 },       // 000001010100       44      44
    { 12, 0x0aa0 },       // 000001010101       45      45
    { 12, 0x06a0 },       // 000001010110       46      46
    { 12, 0x0ea0 },       // 000001010111       47      47
    { 12, 0x0260 },       // 000001100100       48      48
    { 12, 0x0a60 },       // 000001100101       49      49
    { 12, 0x04a0 },       // 000001010010       50      50
    { 12, 0x0ca0 },       // 000001010011       51      51
    { 12, 0x0240 },       // 000000100100       52      52
    { 12, 0x0ec0 },       // 000000110111       53      53
    { 12, 0x01c0 },       // 000000111000       54      54
    { 12, 0x0e40 },       // 000000100111       55      55
    { 12, 0x0140 },       // 000000101000       56      56
    { 12, 0x01a0 },       // 000001011000       57      57
    { 12, 0x09a0 },       // 000001011001       58      58
    { 12, 0x0d40 },       // 000000101011       59      59
    { 12, 0x0340 },       // 000000101100       50      60
    { 12, 0x05a0 },       // 000001011010       51      61
    { 12, 0x0660 },       // 000001100110       52      62
    { 12, 0x0e60 },       // 000001100111       53      63
    { 10, 0x03c0 },       // 0000001111         54      64
    { 12, 0x0130 },       // 000011001000       55     128
    { 12, 0x0930 },       // 000011001001       56     192
    { 12, 0x0da0 },       // 000001011011       57     256
    { 12, 0x0cc0 },       // 000000110011       58     320
    { 12, 0x02c0 },       // 000000110100       59     384
    { 12, 0x0ac0 },       // 000000110101       60     448
    { 13, 0x06c0 },       // 0000001101100      61     512
    { 13, 0x16c0 },       // 0000001101101      62     576
    { 13, 0x0a40 },       // 0000001001010      63     640
    { 13, 0x1a40 },       // 0000001001011      64     704
    { 13, 0x0640 },       // 0000001001100      65     768
    { 13, 0x1640 },       // 0000001001101      66     832
    { 13, 0x09c0 },       // 0000001110010      67     896
    { 13, 0x19c0 },       // 0000001110011      68     960
    { 13, 0x05c0 },       // 0000001110100      69    1024
    { 13, 0x15c0 },       // 0000001110101      70    1088
    { 13, 0x0dc0 },       // 0000001110110      71    1152
    { 13, 0x1dc0 },       // 0000001110111      72    1216
    { 13, 0x0940 },       // 0000001010010      73    1280
    { 13, 0x1940 },       // 0000001010011      74    1344
    { 13, 0x0540 },       // 0000001010100      75    1408
    { 13, 0x1540 },       // 0000001010101      76    1472
    { 13, 0x0b40 },       // 0000001011010      77    1536
    { 13, 0x1b40 },       // 0000001011011      78    1600
    { 13, 0x04c0 },       // 0000001100100      79    1664
    { 13, 0x14c0 },       // 0000001100101      80    1728
    { 11, 0x0080 },       // 00000001000        81    1792
    { 11, 0x0180 },       // 00000001100        82    1856
    { 11, 0x0580 },       // 00000001101        83    1920
    { 12, 0x0480 },       // 000000010010       84    1984
    { 12, 0x0c80 },       // 000000010011       85    2048
    { 12, 0x0280 },       // 000000010100       86    2112
    { 12, 0x0a80 },       // 000000010101       87    2176
    { 12, 0x0680 },       // 000000010110       88    2240
    { 12, 0x0e80 },       // 000000010111       89    2304
    { 12, 0x0380 },       // 000000011100       90    2368
    { 12, 0x0b80 },       // 000000011101       91    2432
    { 12, 0x0780 },       // 000000011110       92    2496
    { 12, 0x0f80 },       // 000000011111       93    2560
};


#define BlackRunCodeEntries  (sizeof(BlackRunCodes)/sizeof(CODETABLE))


#define BADRUN      3000
#define DECODEEOL   3001
#define DECODEEOL2  3002
#define HORZMODE    3003
#define VTMODE3N    3004
#define VTMODE2N    3005
#define VTMODE1N    3006
#define VTMODE0     3007
#define VTMODE1P    3008
#define VTMODE2P    3009
#define VTMODE3P    3010
#define PASSMODE    3011


typedef struct _DECODE_TREE {
    INT     Left;
    INT     Right;
} DECODE_TREE;

typedef CONST DECODE_TREE *PDECODE_TREE;


static const DECODE_TREE WhiteDecodeTree[] =
{
    {         1,                 80  },                   // 0
    {        40,                  2  },                   // 1
    {        21,                  3  },                   // 2
    {         4,                 -2  },                   // 3
    {        16,                  5  },                   // 4
    {        10,                  6  },                   // 5
    {         7,               -256  },                   // 6
    {         9,                  8  },                   // 7
    {     -1344,              -1408  },                   // 8
    {     -1216,              -1280  },                   // 9
    {        11,                 13  },                   // 10
    {      -576,                 12  },                   // 11
    {      -832,               -896  },                   // 12
    {        14,                 15  },                   // 13
    {      -960,              -1024  },                   // 14
    {     -1088,              -1152  },                   // 15
    {     -1664,                 17  },                   // 16
    {        18,                 19  },                   // 17
    {      -448,               -512  },                   // 18
    {        20,               -640  },                   // 19
    {      -704,               -768  },                   // 20
    {        32,                 22  },                   // 21
    {        23,                 28  },                   // 22
    {        24,                 26  },                   // 23
    {       -24,                 25  },                   // 24
    {       -49,                -50  },                   // 25
    {        27,                -25  },                   // 26
    {       -51,                -52  },                   // 27
    {        29,               -192  },                   // 28
    {        30,                 31  },                   // 29
    {       -55,                -56  },                   // 30
    {       -57,                -58  },                   // 31
    {       -11,                 33  },                   // 32
    {        34,                 36  },                   // 33
    {       -27,                 35  },                   // 34
    {       -59,                -60  },                   // 35
    {        37,                -18  },                   // 36
    {        38,                 39  },                   // 37
    {     -1472,              -1536  },                   // 38
    {     -1600,              -1728  },                   // 39
    {        59,                 41  },                   // 40
    {        49,                 42  },                   // 41
    {        43,                -10  },                   // 42
    {        47,                 44  },                   // 43
    {        46,                 45  },                   // 44
    {      -320,               -384  },                   // 45
    {       -63,                  0  },                   // 46
    {       -28,                 48  },                   // 47
    {       -61,                -62  },                   // 48
    {        56,                 50  },                   // 49
    {        53,                 51  },                   // 50
    {        52,                -21  },                   // 51
    {       -43,                -44  },                   // 52
    {        55,                 54  },                   // 53
    {       -41,                -42  },                   // 54
    {       -39,                -40  },                   // 55
    {       -12,                 57  },                   // 56
    {        58,                -26  },                   // 57
    {       -53,                -54  },                   // 58
    {        70,                 60  },                   // 59
    {        64,                 61  },                   // 60
    {        62,                 -1  },                   // 61
    {       -19,                 63  },                   // 62
    {       -31,                -32  },                   // 63
    {        68,                 65  },                   // 64
    {        67,                 66  },                   // 65
    {       -37,                -38  },                   // 66
    {       -35,                -36  },                   // 67
    {       -20,                 69  },                   // 68
    {       -33,                -34  },                   // 69
    {        74,                 71  },                   // 70
    {        72,                -13  },                   // 71
    {       -23,                 73  },                   // 72
    {       -47,                -48  },                   // 73
    {        77,                 75  },                   // 74
    {        76,                -22  },                   // 75
    {       -45,                -46  },                   // 76
    {        79,                 78  },                   // 77
    {       -29,                -30  },                   // 78
    { DECODEEOL,             BADRUN  },                   // 79
    {        86,                 81  },                   // 80
    {        83,                 82  },                   // 81
    {        -6,                 -7  },                   // 82
    {        -5,                 84  },                   // 83
    {        85,                -64  },                   // 84
    {       -14,                -15  },                   // 85
    {        90,                 87  },                   // 86
    {        88,                 -4  },                   // 87
    {        -9,                 89  },                   // 88
    {       -16,                -17  },                   // 89
    {        -3,                 91  },                   // 90
    {      -128,                 -8  }                    // 91
};

#define WhiteDecodeEntries  (sizeof(WhiteDecodeTree)/sizeof(DECODE_TREE))


static const DECODE_TREE BlackDecodeTree[] =
{
    {         2,                  1  },                   // 0
    {        -3,                 -2  },                   // 1
    {         4,                  3  },                   // 2
    {        -1,                 -4  },                   // 3
    {         6,                  5  },                   // 4
    {        -6,                 -5  },                   // 5
    {         9,                  7  },                   // 6
    {         8,                 -7  },                   // 7
    {        -9,                 -8  },                   // 8
    {        31,                 10  },                   // 9
    {        30,                 11  },                   // 10
    {        12,                -12  },                   // 11
    {        23,                 13  },                   // 12
    {        17,                 14  },                   // 13
    {        15,                  0  },                   // 14
    {       -21,                 16  },                   // 15
    {       -42,                -43  },                   // 16
    {        21,                 18  },                   // 17
    {        20,                 19  },                   // 18
    {       -38,                -39  },                   // 19
    {       -36,                -37  },                   // 20
    {       -20,                 22  },                   // 21
    {       -34,                -35  },                   // 22
    {       -15,                 24  },                   // 23
    {        27,                 25  },                   // 24
    {        26,                -19  },                   // 25
    {       -28,                -29  },                   // 26
    {        29,                 28  },                   // 27
    {       -26,                -27  },                   // 28
    {      -128,               -192  },                   // 29
    {       -10,                -11  },                   // 30
    {        57,                 32  },                   // 31
    {        45,                 33  },                   // 32
    {        34,                -14  },                   // 33
    {        41,                 35  },                   // 34
    {        38,                 36  },                   // 35
    {        37,                -22  },                   // 36
    {       -40,                -41  },                   // 37
    {        40,                 39  },                   // 38
    {       -32,                -33  },                   // 39
    {       -30,                -31  },                   // 40
    {       -17,                 42  },                   // 41
    {        44,                 43  },                   // 42
    {       -62,                -63  },                   // 43
    {       -48,                -49  },                   // 44
    {       -13,                 46  },                   // 45
    {        51,                 47  },                   // 46
    {        48,                -16  },                   // 47
    {        50,                 49  },                   // 48
    {       -61,               -256  },                   // 49
    {       -57,                -58  },                   // 50
    {        55,                 52  },                   // 51
    {        54,                 53  },                   // 52
    {       -46,                -47  },                   // 53
    {       -44,                -45  },                   // 54
    {       -23,                 56  },                   // 55
    {       -50,                -51  },                   // 56
    { DECODEEOL,                 58  },                   // 57
    {        75,                 59  },                   // 58
    {        67,                 60  },                   // 59
    {        61,                -64  },                   // 60
    {        65,                 62  },                   // 61
    {        64,                 63  },                   // 62
    {     -1152,              -1216  },                   // 63
    {     -1024,              -1088  },                   // 64
    {       -54,                 66  },                   // 65
    {      -896,               -960  },                   // 66
    {        72,                 68  },                   // 67
    {        71,                 69  },                   // 68
    {        70,                -53  },                   // 69
    {      -512,               -576  },                   // 70
    {      -384,               -448  },                   // 71
    {       -25,                 73  },                   // 72
    {        74,               -320  },                   // 73
    {     -1664,              -1728  },                   // 74
    {        85,                 76  },                   // 75
    {        80,                 77  },                   // 76
    {        78,                -24  },                   // 77
    {       -60,                 79  },                   // 78
    {     -1536,              -1600  },                   // 79
    {        83,                 81  },                   // 80
    {        82,                -59  },                   // 81
    {     -1408,              -1472  },                   // 82
    {       -56,                 84  },                   // 83
    {     -1280,              -1344  },                   // 84
    {       -18,                 86  },                   // 85
    {        89,                 87  },                   // 86
    {        88,                -55  },                   // 87
    {      -768,               -832  },                   // 88
    {       -52,                 90  },                   // 89
    {      -640,               -704  }                    // 90
};

#define BlackDecodeEntries  (sizeof(BlackDecodeTree)/sizeof(DECODE_TREE))


static const DECODE_TREE TwoDecodeTree[] =
{
    {         1,            VTMODE0  },                   // 0
    {         2,                  3  },                   // 1
    {         4,           HORZMODE  },                   // 2
    {  VTMODE1N,           VTMODE1P  },                   // 3
    {         5,           PASSMODE  },                   // 4
    {         6,                  7  },                   // 5
    {         8,                  9  },                   // 6
    {  VTMODE2N,           VTMODE2P  },                   // 7
    { DECODEEOL,             BADRUN  },                   // 8
    {  VTMODE3N,           VTMODE3P  }                    // 9
};


static const BYTE BitReverseTable[256] =
{
    0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
    0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
    0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
    0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
    0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
    0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
    0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
    0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
    0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
    0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
    0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
    0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
    0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
    0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
    0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
    0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
    0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
    0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
    0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
    0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
    0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
    0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
    0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
    0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
    0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
    0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
    0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
    0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
    0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
    0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
    0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
    0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
};



static const BYTE First1[256] = {
    0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
    4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
};



static const BYTE Last1[256] = {
    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
};


static const BYTE All1[8] = {
    0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe
};


#endif  // !_FAXTABLE_H_











