/* * This file is subject to the terms and conditions defined in * file 'LICENSE.md', which is part of this source code package. */ package ccittfax // map pixel run lengths to the encoded bit sequences // all the bit sequences for all groups could be found here https://www.itu.int/rec/T-REC-T.6-198811-I/en var ( bTerms map[int]code wTerms map[int]code bMakeups map[int]code wMakeups map[int]code commonMakeups map[int]code masks map[int]byte eol = code{ Code: 1 << 4, BitsWritten: 12, } eol1 = code{ Code: 3 << 3, BitsWritten: 13, } eol0 = code{ Code: 2 << 3, BitsWritten: 13, } p = code{ Code: 1 << 12, BitsWritten: 4, } h = code{ Code: 1 << 13, BitsWritten: 3, } v0 = code{ Code: 1 << 15, BitsWritten: 1, } v1r = code{ Code: 3 << 13, BitsWritten: 3, } v2r = code{ Code: 3 << 10, BitsWritten: 6, } v3r = code{ Code: 3 << 9, BitsWritten: 7, } v1l = code{ Code: 2 << 13, BitsWritten: 3, } v2l = code{ Code: 2 << 10, BitsWritten: 6, } v3l = code{ Code: 2 << 9, BitsWritten: 7, } ) // code describes the encoded bit sequence and the bits actually // used to represent it within the uint16. type code struct { Code uint16 BitsWritten int } func init() { bTerms = make(map[int]code) bTerms[0] = code{ Code: 13<<8 | 3<<6, BitsWritten: 10, } bTerms[1] = code{ Code: 2 << (5 + 8), BitsWritten: 3, } bTerms[2] = code{ Code: 3 << (6 + 8), BitsWritten: 2, } bTerms[3] = code{ Code: 2 << (6 + 8), BitsWritten: 2, } bTerms[4] = code{ Code: 3 << (5 + 8), BitsWritten: 3, } bTerms[5] = code{ Code: 3 << (4 + 8), BitsWritten: 4, } bTerms[6] = code{ Code: 2 << (4 + 8), BitsWritten: 4, } bTerms[7] = code{ Code: 3 << (3 + 8), BitsWritten: 5, } bTerms[8] = code{ Code: 5 << (2 + 8), BitsWritten: 6, } bTerms[9] = code{ Code: 4 << (2 + 8), BitsWritten: 6, } bTerms[10] = code{ Code: 4 << (1 + 8), BitsWritten: 7, } bTerms[11] = code{ Code: 5 << (1 + 8), BitsWritten: 7, } bTerms[12] = code{ Code: 7 << (1 + 8), BitsWritten: 7, } bTerms[13] = code{ Code: 4 << 8, BitsWritten: 8, } bTerms[14] = code{ Code: 7 << 8, BitsWritten: 8, } bTerms[15] = code{ Code: 12 << 8, BitsWritten: 9, } bTerms[16] = code{ Code: 5<<8 | 3<<6, BitsWritten: 10, } bTerms[17] = code{ Code: 6 << 8, BitsWritten: 10, } bTerms[18] = code{ Code: 2 << 8, BitsWritten: 10, } bTerms[19] = code{ Code: 12<<8 | 7<<5, BitsWritten: 11, } bTerms[20] = code{ Code: 13 << 8, BitsWritten: 11, } bTerms[21] = code{ Code: 13<<8 | 4<<5, BitsWritten: 11, } bTerms[22] = code{ Code: 6<<8 | 7<<5, BitsWritten: 11, } bTerms[23] = code{ Code: 5 << 8, BitsWritten: 11, } bTerms[24] = code{ Code: 2<<8 | 7<<5, BitsWritten: 11, } bTerms[25] = code{ Code: 3 << 8, BitsWritten: 11, } bTerms[26] = code{ Code: 12<<8 | 10<<4, BitsWritten: 12, } bTerms[27] = code{ Code: 12<<8 | 11<<4, BitsWritten: 12, } bTerms[28] = code{ Code: 12<<8 | 12<<4, BitsWritten: 12, } bTerms[29] = code{ Code: 12<<8 | 13<<4, BitsWritten: 12, } bTerms[30] = code{ Code: 6<<8 | 8<<4, BitsWritten: 12, } bTerms[31] = code{ Code: 6<<8 | 9<<4, BitsWritten: 12, } bTerms[32] = code{ Code: 6<<8 | 10<<4, BitsWritten: 12, } bTerms[33] = code{ Code: 6<<8 | 11<<4, BitsWritten: 12, } bTerms[34] = code{ Code: 13<<8 | 2<<4, BitsWritten: 12, } bTerms[35] = code{ Code: 13<<8 | 3<<4, BitsWritten: 12, } bTerms[36] = code{ Code: 13<<8 | 4<<4, BitsWritten: 12, } bTerms[37] = code{ Code: 13<<8 | 5<<4, BitsWritten: 12, } bTerms[38] = code{ Code: 13<<8 | 6<<4, BitsWritten: 12, } bTerms[39] = code{ Code: 13<<8 | 7<<4, BitsWritten: 12, } bTerms[40] = code{ Code: 6<<8 | 12<<4, BitsWritten: 12, } bTerms[41] = code{ Code: 6<<8 | 13<<4, BitsWritten: 12, } bTerms[42] = code{ Code: 13<<8 | 10<<4, BitsWritten: 12, } bTerms[43] = code{ Code: 13<<8 | 11<<4, BitsWritten: 12, } bTerms[44] = code{ Code: 5<<8 | 4<<4, BitsWritten: 12, } bTerms[45] = code{ Code: 5<<8 | 5<<4, BitsWritten: 12, } bTerms[46] = code{ Code: 5<<8 | 6<<4, BitsWritten: 12, } bTerms[47] = code{ Code: 5<<8 | 7<<4, BitsWritten: 12, } bTerms[48] = code{ Code: 6<<8 | 4<<4, BitsWritten: 12, } bTerms[49] = code{ Code: 6<<8 | 5<<4, BitsWritten: 12, } bTerms[50] = code{ Code: 5<<8 | 2<<4, BitsWritten: 12, } bTerms[51] = code{ Code: 5<<8 | 3<<4, BitsWritten: 12, } bTerms[52] = code{ Code: 2<<8 | 4<<4, BitsWritten: 12, } bTerms[53] = code{ Code: 3<<8 | 7<<4, BitsWritten: 12, } bTerms[54] = code{ Code: 3<<8 | 8<<4, BitsWritten: 12, } bTerms[55] = code{ Code: 2<<8 | 7<<4, BitsWritten: 12, } bTerms[56] = code{ Code: 2<<8 | 8<<4, BitsWritten: 12, } bTerms[57] = code{ Code: 5<<8 | 8<<4, BitsWritten: 12, } bTerms[58] = code{ Code: 5<<8 | 9<<4, BitsWritten: 12, } bTerms[59] = code{ Code: 2<<8 | 11<<4, BitsWritten: 12, } bTerms[60] = code{ Code: 2<<8 | 12<<4, BitsWritten: 12, } bTerms[61] = code{ Code: 5<<8 | 10<<4, BitsWritten: 12, } bTerms[62] = code{ Code: 6<<8 | 6<<4, BitsWritten: 12, } bTerms[63] = code{ Code: 6<<8 | 7<<4, BitsWritten: 12, } wTerms = make(map[int]code) wTerms[0] = code{ Code: 53 << 8, BitsWritten: 8, } wTerms[1] = code{ Code: 7 << (2 + 8), BitsWritten: 6, } wTerms[2] = code{ Code: 7 << (4 + 8), BitsWritten: 4, } wTerms[3] = code{ Code: 8 << (4 + 8), BitsWritten: 4, } wTerms[4] = code{ Code: 11 << (4 + 8), BitsWritten: 4, } wTerms[5] = code{ Code: 12 << (4 + 8), BitsWritten: 4, } wTerms[6] = code{ Code: 14 << (4 + 8), BitsWritten: 4, } wTerms[7] = code{ Code: 15 << (4 + 8), BitsWritten: 4, } wTerms[8] = code{ Code: 19 << (3 + 8), BitsWritten: 5, } wTerms[9] = code{ Code: 20 << (3 + 8), BitsWritten: 5, } wTerms[10] = code{ Code: 7 << (3 + 8), BitsWritten: 5, } wTerms[11] = code{ Code: 8 << (3 + 8), BitsWritten: 5, } wTerms[12] = code{ Code: 8 << (2 + 8), BitsWritten: 6, } wTerms[13] = code{ Code: 3 << (2 + 8), BitsWritten: 6, } wTerms[14] = code{ Code: 52 << (2 + 8), BitsWritten: 6, } wTerms[15] = code{ Code: 53 << (2 + 8), BitsWritten: 6, } wTerms[16] = code{ Code: 42 << (2 + 8), BitsWritten: 6, } wTerms[17] = code{ Code: 43 << (2 + 8), BitsWritten: 6, } wTerms[18] = code{ Code: 39 << (1 + 8), BitsWritten: 7, } wTerms[19] = code{ Code: 12 << (1 + 8), BitsWritten: 7, } wTerms[20] = code{ Code: 8 << (1 + 8), BitsWritten: 7, } wTerms[21] = code{ Code: 23 << (1 + 8), BitsWritten: 7, } wTerms[22] = code{ Code: 3 << (1 + 8), BitsWritten: 7, } wTerms[23] = code{ Code: 4 << (1 + 8), BitsWritten: 7, } wTerms[24] = code{ Code: 40 << (1 + 8), BitsWritten: 7, } wTerms[25] = code{ Code: 43 << (1 + 8), BitsWritten: 7, } wTerms[26] = code{ Code: 19 << (1 + 8), BitsWritten: 7, } wTerms[27] = code{ Code: 36 << (1 + 8), BitsWritten: 7, } wTerms[28] = code{ Code: 24 << (1 + 8), BitsWritten: 7, } wTerms[29] = code{ Code: 2 << 8, BitsWritten: 8, } wTerms[30] = code{ Code: 3 << 8, BitsWritten: 8, } wTerms[31] = code{ Code: 26 << 8, BitsWritten: 8, } wTerms[32] = code{ Code: 27 << 8, BitsWritten: 8, } wTerms[33] = code{ Code: 18 << 8, BitsWritten: 8, } wTerms[34] = code{ Code: 19 << 8, BitsWritten: 8, } wTerms[35] = code{ Code: 20 << 8, BitsWritten: 8, } wTerms[36] = code{ Code: 21 << 8, BitsWritten: 8, } wTerms[37] = code{ Code: 22 << 8, BitsWritten: 8, } wTerms[38] = code{ Code: 23 << 8, BitsWritten: 8, } wTerms[39] = code{ Code: 40 << 8, BitsWritten: 8, } wTerms[40] = code{ Code: 41 << 8, BitsWritten: 8, } wTerms[41] = code{ Code: 42 << 8, BitsWritten: 8, } wTerms[42] = code{ Code: 43 << 8, BitsWritten: 8, } wTerms[43] = code{ Code: 44 << 8, BitsWritten: 8, } wTerms[44] = code{ Code: 45 << 8, BitsWritten: 8, } wTerms[45] = code{ Code: 4 << 8, BitsWritten: 8, } wTerms[46] = code{ Code: 5 << 8, BitsWritten: 8, } wTerms[47] = code{ Code: 10 << 8, BitsWritten: 8, } wTerms[48] = code{ Code: 11 << 8, BitsWritten: 8, } wTerms[49] = code{ Code: 82 << 8, BitsWritten: 8, } wTerms[50] = code{ Code: 83 << 8, BitsWritten: 8, } wTerms[51] = code{ Code: 84 << 8, BitsWritten: 8, } wTerms[52] = code{ Code: 85 << 8, BitsWritten: 8, } wTerms[53] = code{ Code: 36 << 8, BitsWritten: 8, } wTerms[54] = code{ Code: 37 << 8, BitsWritten: 8, } wTerms[55] = code{ Code: 88 << 8, BitsWritten: 8, } wTerms[56] = code{ Code: 89 << 8, BitsWritten: 8, } wTerms[57] = code{ Code: 90 << 8, BitsWritten: 8, } wTerms[58] = code{ Code: 91 << 8, BitsWritten: 8, } wTerms[59] = code{ Code: 74 << 8, BitsWritten: 8, } wTerms[60] = code{ Code: 75 << 8, BitsWritten: 8, } wTerms[61] = code{ Code: 50 << 8, BitsWritten: 8, } wTerms[62] = code{ Code: 51 << 8, BitsWritten: 8, } wTerms[63] = code{ Code: 52 << 8, BitsWritten: 8, } bMakeups = make(map[int]code) bMakeups[64] = code{ Code: 3<<8 | 3<<6, BitsWritten: 10, } bMakeups[128] = code{ Code: 12<<8 | 8<<4, BitsWritten: 12, } bMakeups[192] = code{ Code: 12<<8 | 9<<4, BitsWritten: 12, } bMakeups[256] = code{ Code: 5<<8 | 11<<4, BitsWritten: 12, } bMakeups[320] = code{ Code: 3<<8 | 3<<4, BitsWritten: 12, } bMakeups[384] = code{ Code: 3<<8 | 4<<4, BitsWritten: 12, } bMakeups[448] = code{ Code: 3<<8 | 5<<4, BitsWritten: 12, } bMakeups[512] = code{ Code: 3<<8 | 12<<3, BitsWritten: 13, } bMakeups[576] = code{ Code: 3<<8 | 13<<3, BitsWritten: 13, } bMakeups[640] = code{ Code: 2<<8 | 10<<3, BitsWritten: 13, } bMakeups[704] = code{ Code: 2<<8 | 11<<3, BitsWritten: 13, } bMakeups[768] = code{ Code: 2<<8 | 12<<3, BitsWritten: 13, } bMakeups[832] = code{ Code: 2<<8 | 13<<3, BitsWritten: 13, } bMakeups[896] = code{ Code: 3<<8 | 18<<3, BitsWritten: 13, } bMakeups[960] = code{ Code: 3<<8 | 19<<3, BitsWritten: 13, } bMakeups[1024] = code{ Code: 3<<8 | 20<<3, BitsWritten: 13, } bMakeups[1088] = code{ Code: 3<<8 | 21<<3, BitsWritten: 13, } bMakeups[1152] = code{ Code: 3<<8 | 22<<3, BitsWritten: 13, } bMakeups[1216] = code{ Code: 119 << 3, BitsWritten: 13, } bMakeups[1280] = code{ Code: 2<<8 | 18<<3, BitsWritten: 13, } bMakeups[1344] = code{ Code: 2<<8 | 19<<3, BitsWritten: 13, } bMakeups[1408] = code{ Code: 2<<8 | 20<<3, BitsWritten: 13, } bMakeups[1472] = code{ Code: 2<<8 | 21<<3, BitsWritten: 13, } bMakeups[1536] = code{ Code: 2<<8 | 26<<3, BitsWritten: 13, } bMakeups[1600] = code{ Code: 2<<8 | 27<<3, BitsWritten: 13, } bMakeups[1664] = code{ Code: 3<<8 | 4<<3, BitsWritten: 13, } bMakeups[1728] = code{ Code: 3<<8 | 5<<3, BitsWritten: 13, } wMakeups = make(map[int]code) wMakeups[64] = code{ Code: 27 << (3 + 8), BitsWritten: 5, } wMakeups[128] = code{ Code: 18 << (3 + 8), BitsWritten: 5, } wMakeups[192] = code{ Code: 23 << (2 + 8), BitsWritten: 6, } wMakeups[256] = code{ Code: 55 << (1 + 8), BitsWritten: 7, } wMakeups[320] = code{ Code: 54 << 8, BitsWritten: 8, } wMakeups[384] = code{ Code: 55 << 8, BitsWritten: 8, } wMakeups[448] = code{ Code: 100 << 8, BitsWritten: 8, } wMakeups[512] = code{ Code: 101 << 8, BitsWritten: 8, } wMakeups[576] = code{ Code: 104 << 8, BitsWritten: 8, } wMakeups[640] = code{ Code: 103 << 8, BitsWritten: 8, } wMakeups[704] = code{ Code: 102 << 8, BitsWritten: 9, } wMakeups[768] = code{ Code: 102<<8 | 1<<7, BitsWritten: 9, } wMakeups[832] = code{ Code: 105 << 8, BitsWritten: 9, } wMakeups[896] = code{ Code: 105<<8 | 1<<7, BitsWritten: 9, } wMakeups[960] = code{ Code: 106 << 8, BitsWritten: 9, } wMakeups[1024] = code{ Code: 106<<8 | 1<<7, BitsWritten: 9, } wMakeups[1088] = code{ Code: 107 << 8, BitsWritten: 9, } wMakeups[1152] = code{ Code: 107<<8 | 1<<7, BitsWritten: 9, } wMakeups[1216] = code{ Code: 108 << 8, BitsWritten: 9, } wMakeups[1280] = code{ Code: 108<<8 | 1<<7, BitsWritten: 9, } wMakeups[1344] = code{ Code: 109 << 8, BitsWritten: 9, } wMakeups[1408] = code{ Code: 109<<8 | 1<<7, BitsWritten: 9, } wMakeups[1472] = code{ Code: 76 << 8, BitsWritten: 9, } wMakeups[1536] = code{ Code: 76<<8 | 1<<7, BitsWritten: 9, } wMakeups[1600] = code{ Code: 77 << 8, BitsWritten: 9, } wMakeups[1664] = code{ Code: 24 << (2 + 8), BitsWritten: 6, } wMakeups[1728] = code{ Code: 77<<8 | 1<<7, BitsWritten: 9, } commonMakeups = make(map[int]code) commonMakeups[1792] = code{ Code: 1 << 8, BitsWritten: 11, } commonMakeups[1856] = code{ Code: 1<<8 | 4<<5, BitsWritten: 11, } commonMakeups[1920] = code{ Code: 1<<8 | 5<<5, BitsWritten: 11, } commonMakeups[1984] = code{ Code: 1<<8 | 2<<4, BitsWritten: 12, } commonMakeups[2048] = code{ Code: 1<<8 | 3<<4, BitsWritten: 12, } commonMakeups[2112] = code{ Code: 1<<8 | 4<<4, BitsWritten: 12, } commonMakeups[2176] = code{ Code: 1<<8 | 5<<4, BitsWritten: 12, } commonMakeups[2240] = code{ Code: 1<<8 | 6<<4, BitsWritten: 12, } commonMakeups[2304] = code{ Code: 1<<8 | 7<<4, BitsWritten: 12, } commonMakeups[2368] = code{ Code: 1<<8 | 12<<4, BitsWritten: 12, } commonMakeups[2432] = code{ Code: 1<<8 | 13<<4, BitsWritten: 12, } commonMakeups[2496] = code{ Code: 1<<8 | 14<<4, BitsWritten: 12, } commonMakeups[2560] = code{ Code: 1<<8 | 15<<4, BitsWritten: 12, } masks = make(map[int]byte) masks[0] = 0xFF masks[1] = 0xFE masks[2] = 0xFC masks[3] = 0xF8 masks[4] = 0xF0 masks[5] = 0xE0 masks[6] = 0xC0 masks[7] = 0x80 masks[8] = 0x00 }