///|
fn pdf_ccitt_code(
  bits : Int,
  width : Int,
  run : Int,
  makeup? : Bool = false,
) -> PdfCCITTCode {
  { bits, width, run, makeup, }
}

///|
let pdf_ccitt_white_codes : Array[PdfCCITTCode] = [
  pdf_ccitt_code(0b00110101, 8, 0),
  pdf_ccitt_code(0b000111, 6, 1),
  pdf_ccitt_code(0b0111, 4, 2),
  pdf_ccitt_code(0b1000, 4, 3),
  pdf_ccitt_code(0b1011, 4, 4),
  pdf_ccitt_code(0b1100, 4, 5),
  pdf_ccitt_code(0b1110, 4, 6),
  pdf_ccitt_code(0b1111, 4, 7),
  pdf_ccitt_code(0b10011, 5, 8),
  pdf_ccitt_code(0b10100, 5, 9),
  pdf_ccitt_code(0b00111, 5, 10),
  pdf_ccitt_code(0b01000, 5, 11),
  pdf_ccitt_code(0b001000, 6, 12),
  pdf_ccitt_code(0b000011, 6, 13),
  pdf_ccitt_code(0b110100, 6, 14),
  pdf_ccitt_code(0b110101, 6, 15),
  pdf_ccitt_code(0b101010, 6, 16),
  pdf_ccitt_code(0b101011, 6, 17),
  pdf_ccitt_code(0b0100111, 7, 18),
  pdf_ccitt_code(0b0001100, 7, 19),
  pdf_ccitt_code(0b0001000, 7, 20),
  pdf_ccitt_code(0b0010111, 7, 21),
  pdf_ccitt_code(0b0000011, 7, 22),
  pdf_ccitt_code(0b0000100, 7, 23),
  pdf_ccitt_code(0b0101000, 7, 24),
  pdf_ccitt_code(0b0101011, 7, 25),
  pdf_ccitt_code(0b0010011, 7, 26),
  pdf_ccitt_code(0b0100100, 7, 27),
  pdf_ccitt_code(0b0011000, 7, 28),
  pdf_ccitt_code(0b00000010, 8, 29),
  pdf_ccitt_code(0b00000011, 8, 30),
  pdf_ccitt_code(0b00011010, 8, 31),
  pdf_ccitt_code(0b00011011, 8, 32),
  pdf_ccitt_code(0b00010010, 8, 33),
  pdf_ccitt_code(0b00010011, 8, 34),
  pdf_ccitt_code(0b00010100, 8, 35),
  pdf_ccitt_code(0b00010101, 8, 36),
  pdf_ccitt_code(0b00010110, 8, 37),
  pdf_ccitt_code(0b00010111, 8, 38),
  pdf_ccitt_code(0b00101000, 8, 39),
  pdf_ccitt_code(0b00101001, 8, 40),
  pdf_ccitt_code(0b00101010, 8, 41),
  pdf_ccitt_code(0b00101011, 8, 42),
  pdf_ccitt_code(0b00101100, 8, 43),
  pdf_ccitt_code(0b00101101, 8, 44),
  pdf_ccitt_code(0b00000100, 8, 45),
  pdf_ccitt_code(0b00000101, 8, 46),
  pdf_ccitt_code(0b00001010, 8, 47),
  pdf_ccitt_code(0b00001011, 8, 48),
  pdf_ccitt_code(0b01010010, 8, 49),
  pdf_ccitt_code(0b01010011, 8, 50),
  pdf_ccitt_code(0b01010100, 8, 51),
  pdf_ccitt_code(0b01010101, 8, 52),
  pdf_ccitt_code(0b00100100, 8, 53),
  pdf_ccitt_code(0b00100101, 8, 54),
  pdf_ccitt_code(0b01011000, 8, 55),
  pdf_ccitt_code(0b01011001, 8, 56),
  pdf_ccitt_code(0b01011010, 8, 57),
  pdf_ccitt_code(0b01011011, 8, 58),
  pdf_ccitt_code(0b01001010, 8, 59),
  pdf_ccitt_code(0b01001011, 8, 60),
  pdf_ccitt_code(0b00110010, 8, 61),
  pdf_ccitt_code(0b00110011, 8, 62),
  pdf_ccitt_code(0b00110100, 8, 63),
  pdf_ccitt_code(0b11011, 5, 64, makeup=true),
  pdf_ccitt_code(0b10010, 5, 128, makeup=true),
  pdf_ccitt_code(0b010111, 6, 192, makeup=true),
  pdf_ccitt_code(0b0110111, 7, 256, makeup=true),
  pdf_ccitt_code(0b00110110, 8, 320, makeup=true),
  pdf_ccitt_code(0b00110111, 8, 384, makeup=true),
  pdf_ccitt_code(0b01100100, 8, 448, makeup=true),
  pdf_ccitt_code(0b01100101, 8, 512, makeup=true),
  pdf_ccitt_code(0b01101000, 8, 576, makeup=true),
  pdf_ccitt_code(0b01100111, 8, 640, makeup=true),
  pdf_ccitt_code(0b011001100, 9, 704, makeup=true),
  pdf_ccitt_code(0b011001101, 9, 768, makeup=true),
  pdf_ccitt_code(0b011010010, 9, 832, makeup=true),
  pdf_ccitt_code(0b011010011, 9, 896, makeup=true),
  pdf_ccitt_code(0b011010100, 9, 960, makeup=true),
  pdf_ccitt_code(0b011010101, 9, 1024, makeup=true),
  pdf_ccitt_code(0b011010110, 9, 1088, makeup=true),
  pdf_ccitt_code(0b011010111, 9, 1152, makeup=true),
  pdf_ccitt_code(0b011011000, 9, 1216, makeup=true),
  pdf_ccitt_code(0b011011001, 9, 1280, makeup=true),
  pdf_ccitt_code(0b011011010, 9, 1344, makeup=true),
  pdf_ccitt_code(0b011011011, 9, 1408, makeup=true),
  pdf_ccitt_code(0b010011000, 9, 1472, makeup=true),
  pdf_ccitt_code(0b010011001, 9, 1536, makeup=true),
  pdf_ccitt_code(0b010011010, 9, 1600, makeup=true),
  pdf_ccitt_code(0b011000, 6, 1664, makeup=true),
  pdf_ccitt_code(0b010011011, 9, 1728, makeup=true),
  pdf_ccitt_code(0b00000001000, 11, 1792, makeup=true),
  pdf_ccitt_code(0b00000001100, 11, 1856, makeup=true),
  pdf_ccitt_code(0b00000001101, 11, 1920, makeup=true),
  pdf_ccitt_code(0b000000010010, 12, 1984, makeup=true),
  pdf_ccitt_code(0b000000010011, 12, 2048, makeup=true),
  pdf_ccitt_code(0b000000010100, 12, 2112, makeup=true),
  pdf_ccitt_code(0b000000010101, 12, 2176, makeup=true),
  pdf_ccitt_code(0b000000010110, 12, 2240, makeup=true),
  pdf_ccitt_code(0b000000010111, 12, 2304, makeup=true),
  pdf_ccitt_code(0b000000011100, 12, 2368, makeup=true),
  pdf_ccitt_code(0b000000011101, 12, 2432, makeup=true),
  pdf_ccitt_code(0b000000011110, 12, 2496, makeup=true),
  pdf_ccitt_code(0b000000011111, 12, 2560, makeup=true),
  pdf_ccitt_code(0b000000000001, 12, -1),
]

///|
let pdf_ccitt_black_codes : Array[PdfCCITTCode] = [
  pdf_ccitt_code(0b0000110111, 10, 0),
  pdf_ccitt_code(0b010, 3, 1),
  pdf_ccitt_code(0b11, 2, 2),
  pdf_ccitt_code(0b10, 2, 3),
  pdf_ccitt_code(0b011, 3, 4),
  pdf_ccitt_code(0b0011, 4, 5),
  pdf_ccitt_code(0b0010, 4, 6),
  pdf_ccitt_code(0b00011, 5, 7),
  pdf_ccitt_code(0b000101, 6, 8),
  pdf_ccitt_code(0b000100, 6, 9),
  pdf_ccitt_code(0b0000100, 7, 10),
  pdf_ccitt_code(0b0000101, 7, 11),
  pdf_ccitt_code(0b0000111, 7, 12),
  pdf_ccitt_code(0b00000100, 8, 13),
  pdf_ccitt_code(0b00000111, 8, 14),
  pdf_ccitt_code(0b000011000, 9, 15),
  pdf_ccitt_code(0b0000010111, 10, 16),
  pdf_ccitt_code(0b0000011000, 10, 17),
  pdf_ccitt_code(0b0000001000, 10, 18),
  pdf_ccitt_code(0b00001100111, 11, 19),
  pdf_ccitt_code(0b00001101000, 11, 20),
  pdf_ccitt_code(0b00001101100, 11, 21),
  pdf_ccitt_code(0b00000110111, 11, 22),
  pdf_ccitt_code(0b00000101000, 11, 23),
  pdf_ccitt_code(0b00000010111, 11, 24),
  pdf_ccitt_code(0b00000011000, 11, 25),
  pdf_ccitt_code(0b000011001010, 12, 26),
  pdf_ccitt_code(0b000011001011, 12, 27),
  pdf_ccitt_code(0b000011001100, 12, 28),
  pdf_ccitt_code(0b000011001101, 12, 29),
  pdf_ccitt_code(0b000001101000, 12, 30),
  pdf_ccitt_code(0b000001101001, 12, 31),
  pdf_ccitt_code(0b000001101010, 12, 32),
  pdf_ccitt_code(0b000001101011, 12, 33),
  pdf_ccitt_code(0b000011010010, 12, 34),
  pdf_ccitt_code(0b000011010011, 12, 35),
  pdf_ccitt_code(0b000011010100, 12, 36),
  pdf_ccitt_code(0b000011010101, 12, 37),
  pdf_ccitt_code(0b000011010110, 12, 38),
  pdf_ccitt_code(0b000011010111, 12, 39),
  pdf_ccitt_code(0b000001101100, 12, 40),
  pdf_ccitt_code(0b000001101101, 12, 41),
  pdf_ccitt_code(0b000011011010, 12, 42),
  pdf_ccitt_code(0b000011011011, 12, 43),
  pdf_ccitt_code(0b000001010100, 12, 44),
  pdf_ccitt_code(0b000001010101, 12, 45),
  pdf_ccitt_code(0b000001010110, 12, 46),
  pdf_ccitt_code(0b000001010111, 12, 47),
  pdf_ccitt_code(0b000001100100, 12, 48),
  pdf_ccitt_code(0b000001100101, 12, 49),
  pdf_ccitt_code(0b000001010010, 12, 50),
  pdf_ccitt_code(0b000001010011, 12, 51),
  pdf_ccitt_code(0b000000100100, 12, 52),
  pdf_ccitt_code(0b000000110111, 12, 53),
  pdf_ccitt_code(0b000000111000, 12, 54),
  pdf_ccitt_code(0b000000100111, 12, 55),
  pdf_ccitt_code(0b000000101000, 12, 56),
  pdf_ccitt_code(0b000001011000, 12, 57),
  pdf_ccitt_code(0b000001011001, 12, 58),
  pdf_ccitt_code(0b000000101011, 12, 59),
  pdf_ccitt_code(0b000000101100, 12, 60),
  pdf_ccitt_code(0b000001011010, 12, 61),
  pdf_ccitt_code(0b000001100110, 12, 62),
  pdf_ccitt_code(0b000001100111, 12, 63),
  pdf_ccitt_code(0b0000001111, 10, 64, makeup=true),
  pdf_ccitt_code(0b000011001000, 12, 128, makeup=true),
  pdf_ccitt_code(0b000011001001, 12, 192, makeup=true),
  pdf_ccitt_code(0b000001011011, 12, 256, makeup=true),
  pdf_ccitt_code(0b000000110011, 12, 320, makeup=true),
  pdf_ccitt_code(0b000000110100, 12, 384, makeup=true),
  pdf_ccitt_code(0b000000110101, 12, 448, makeup=true),
  pdf_ccitt_code(0b0000001101100, 13, 512, makeup=true),
  pdf_ccitt_code(0b0000001101101, 13, 576, makeup=true),
  pdf_ccitt_code(0b0000001001010, 13, 640, makeup=true),
  pdf_ccitt_code(0b0000001001011, 13, 704, makeup=true),
  pdf_ccitt_code(0b0000001001100, 13, 768, makeup=true),
  pdf_ccitt_code(0b0000001001101, 13, 832, makeup=true),
  pdf_ccitt_code(0b0000001110010, 13, 896, makeup=true),
  pdf_ccitt_code(0b0000001110011, 13, 960, makeup=true),
  pdf_ccitt_code(0b0000001110100, 13, 1024, makeup=true),
  pdf_ccitt_code(0b0000001110101, 13, 1088, makeup=true),
  pdf_ccitt_code(0b0000001110110, 13, 1152, makeup=true),
  pdf_ccitt_code(0b0000001110111, 13, 1216, makeup=true),
  pdf_ccitt_code(0b0000001010010, 13, 1280, makeup=true),
  pdf_ccitt_code(0b0000001010011, 13, 1344, makeup=true),
  pdf_ccitt_code(0b0000001010100, 13, 1408, makeup=true),
  pdf_ccitt_code(0b0000001010101, 13, 1472, makeup=true),
  pdf_ccitt_code(0b0000001011010, 13, 1536, makeup=true),
  pdf_ccitt_code(0b0000001011011, 13, 1600, makeup=true),
  pdf_ccitt_code(0b0000001100100, 13, 1664, makeup=true),
  pdf_ccitt_code(0b0000001100101, 13, 1728, makeup=true),
  pdf_ccitt_code(0b00000001000, 11, 1792, makeup=true),
  pdf_ccitt_code(0b00000001100, 11, 1856, makeup=true),
  pdf_ccitt_code(0b00000001101, 11, 1920, makeup=true),
  pdf_ccitt_code(0b000000010010, 12, 1984, makeup=true),
  pdf_ccitt_code(0b000000010011, 12, 2048, makeup=true),
  pdf_ccitt_code(0b000000010100, 12, 2112, makeup=true),
  pdf_ccitt_code(0b000000010101, 12, 2176, makeup=true),
  pdf_ccitt_code(0b000000010110, 12, 2240, makeup=true),
  pdf_ccitt_code(0b000000010111, 12, 2304, makeup=true),
  pdf_ccitt_code(0b000000011100, 12, 2368, makeup=true),
  pdf_ccitt_code(0b000000011101, 12, 2432, makeup=true),
  pdf_ccitt_code(0b000000011110, 12, 2496, makeup=true),
  pdf_ccitt_code(0b000000011111, 12, 2560, makeup=true),
  pdf_ccitt_code(0b000000000001, 12, -1),
]

///|
let pdf_ccitt_mode_codes : Array[PdfCCITTMode] = [
  { bits: 0b1, width: 1, mode: CCITTVertical(0), },
  { bits: 0b011, width: 3, mode: CCITTVertical(-1), },
  { bits: 0b010, width: 3, mode: CCITTVertical(1), },
  { bits: 0b001, width: 3, mode: CCITTHorizontal, },
  { bits: 0b0001, width: 4, mode: CCITTPass, },
  { bits: 0b000011, width: 6, mode: CCITTVertical(-2), },
  { bits: 0b000010, width: 6, mode: CCITTVertical(2), },
  { bits: 0b0000011, width: 7, mode: CCITTVertical(-3), },
  { bits: 0b0000010, width: 7, mode: CCITTVertical(3), },
  { bits: 0b000000001111, width: 12, mode: CCITTUncompressed, },
  { bits: 0b000000000001000000000001, width: 24, mode: CCITTEOFB, },
]