jbig2enc 0.1.2

Rust reimplementation of jbig2enc, a JBIG2 encoder for bi-level images
Documentation
/// QMコーダの1状態エントリ。
///
/// `qe`: 確率推定値(LPS確率)
/// `mps`: MPS(より可能性の高いシンボル)出現時の次状態インデックス
/// `lps`: LPS(より可能性の低いシンボル)出現時の次状態インデックス
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct StateEntry {
    pub qe: u16,
    pub mps: u8,
    pub lps: u8,
}

const fn s(qe: u16, mps: u8, lps: u8) -> StateEntry {
    StateEntry { qe, mps, lps }
}

/// JBIG2仕様 Table E.1 に基づくQMコーダ状態テーブル。
///
/// 46状態 x 2(MPS=0用とMPS=1用)= 92エントリ。
/// インデックス0-45: MPS=0の状態、インデックス46-91: MPS=1の状態。
/// MPS/LPS反転が必要な状態では、lpsが反対側(+46 or -46)を指す。
///
/// C++版 `ctbl[]` のマクロ展開結果と同等。
/// MPS=0側: F(x)=x, SWITCH(F(x))=x+46
/// MPS=1側: F(x)=x+46, SWITCH(x)=x-46
#[rustfmt::skip]
pub static STATE_TABLE: [StateEntry; 92] = [
    // ===== MPS=0 側 (indices 0..46) =====
    // F(x) = x, SWITCH(F(x)) = x + 46
    s(0x5601,  1, 47),  //  0: SWITCH
    s(0x3401,  2,  6),  //  1
    s(0x1801,  3,  9),  //  2
    s(0x0ac1,  4, 12),  //  3
    s(0x0521,  5, 29),  //  4
    s(0x0221, 38, 33),  //  5
    s(0x5601,  7, 52),  //  6: SWITCH
    s(0x5401,  8, 14),  //  7
    s(0x4801,  9, 14),  //  8
    s(0x3801, 10, 14),  //  9
    s(0x3001, 11, 17),  // 10
    s(0x2401, 12, 18),  // 11
    s(0x1c01, 13, 20),  // 12
    s(0x1601, 29, 21),  // 13
    s(0x5601, 15, 60),  // 14: SWITCH
    s(0x5401, 16, 14),  // 15
    s(0x5101, 17, 15),  // 16
    s(0x4801, 18, 16),  // 17
    s(0x3801, 19, 17),  // 18
    s(0x3401, 20, 18),  // 19
    s(0x3001, 21, 19),  // 20
    s(0x2801, 22, 19),  // 21
    s(0x2401, 23, 20),  // 22
    s(0x2201, 24, 21),  // 23
    s(0x1c01, 25, 22),  // 24
    s(0x1801, 26, 23),  // 25
    s(0x1601, 27, 24),  // 26
    s(0x1401, 28, 25),  // 27
    s(0x1201, 29, 26),  // 28
    s(0x1101, 30, 27),  // 29
    s(0x0ac1, 31, 28),  // 30
    s(0x09c1, 32, 29),  // 31
    s(0x08a1, 33, 30),  // 32
    s(0x0521, 34, 31),  // 33
    s(0x0441, 35, 32),  // 34
    s(0x02a1, 36, 33),  // 35
    s(0x0221, 37, 34),  // 36
    s(0x0141, 38, 35),  // 37
    s(0x0111, 39, 36),  // 38
    s(0x0085, 40, 37),  // 39
    s(0x0049, 41, 38),  // 40
    s(0x0025, 42, 39),  // 41
    s(0x0015, 43, 40),  // 42
    s(0x0009, 44, 41),  // 43
    s(0x0005, 45, 42),  // 44
    s(0x0001, 45, 43),  // 45

    // ===== MPS=1 側 (indices 46..92) =====
    // F(x) = x + 46, SWITCH(x) = x - 46
    s(0x5601, 47,  1),  // 46: SWITCH
    s(0x3401, 48, 52),  // 47
    s(0x1801, 49, 55),  // 48
    s(0x0ac1, 50, 58),  // 49
    s(0x0521, 51, 75),  // 50
    s(0x0221, 84, 79),  // 51
    s(0x5601, 53,  6),  // 52: SWITCH
    s(0x5401, 54, 60),  // 53
    s(0x4801, 55, 60),  // 54
    s(0x3801, 56, 60),  // 55
    s(0x3001, 57, 63),  // 56
    s(0x2401, 58, 64),  // 57
    s(0x1c01, 59, 66),  // 58
    s(0x1601, 75, 67),  // 59
    s(0x5601, 61, 14),  // 60: SWITCH
    s(0x5401, 62, 60),  // 61
    s(0x5101, 63, 61),  // 62
    s(0x4801, 64, 62),  // 63
    s(0x3801, 65, 63),  // 64
    s(0x3401, 66, 64),  // 65
    s(0x3001, 67, 65),  // 66
    s(0x2801, 68, 65),  // 67
    s(0x2401, 69, 66),  // 68
    s(0x2201, 70, 67),  // 69
    s(0x1c01, 71, 68),  // 70
    s(0x1801, 72, 69),  // 71
    s(0x1601, 73, 70),  // 72
    s(0x1401, 74, 71),  // 73
    s(0x1201, 75, 72),  // 74
    s(0x1101, 76, 73),  // 75
    s(0x0ac1, 77, 74),  // 76
    s(0x09c1, 78, 75),  // 77
    s(0x08a1, 79, 76),  // 78
    s(0x0521, 80, 77),  // 79
    s(0x0441, 81, 78),  // 80
    s(0x02a1, 82, 79),  // 81
    s(0x0221, 83, 80),  // 82
    s(0x0141, 84, 81),  // 83
    s(0x0111, 85, 82),  // 84
    s(0x0085, 86, 83),  // 85
    s(0x0049, 87, 84),  // 86
    s(0x0025, 88, 85),  // 87
    s(0x0015, 89, 86),  // 88
    s(0x0009, 90, 87),  // 89
    s(0x0005, 91, 88),  // 90
    s(0x0001, 91, 89),  // 91
];