www.pudn.com > viewImage.rar > Huffman.cpp


/************************************************************************** 
 
This file contains T.4 decoding data 
 
Contents are : 
 
a) two binary trees for decoding MH fax run-length codes 
b) one binary tree for decoding MR codes. 
c) one lookup table of inverted characters 
 
MH trees = one tree for white run lengths,  one tree for black run lengths. 
 
All decodes for all trees start from the top. 
 
For each node the first leaf is the offset from the root to the next 
node if the current bit is 0,  and the second leaf is the offset to 
the next node if the bit is 1.  A minus value is a terminator,  with a 
run-length equal to the negation of the minus value.      
 
******************************************************************************/ 
 
#include "stdafx.h" 
#include "TifHeader.h" 
#include "huffman.h" 
 
const int gWTree [][2] = 
{ 
		{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 */ 
		{OUREOL, 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 */ 
}; 
 
const int gBTree[][2] = 
{ 
      {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 */ 
      {OUREOL, 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 */ 
}; 
 
const int gTwoTree [][2] = 
{ 
      {1, VTMODE0},        /* 0 */ 
      {2, 3},              /* 1 */ 
      {4, HORZMODE},       /* 2 */ 
      {VTMODE1N, VTMODE1P},/* 3 */ 
      {5, PASSMODE},       /* 4 */ 
      {6, 7},              /* 5 */ 
      {8, 9},              /* 6 */ 
      {VTMODE2N, VTMODE2P},/* 7 */ 
      {OUREOL, BADRUN},    /* 8 */ 
      {VTMODE3N, VTMODE3P} /* 9 */ 
}; 
 
const unsigned char gBackward[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 
};