EnumerateTransitions:
PROC [
T: TransitionTableEntryProc] ~ {
{
V:
PROC [length:
INT, bitstring: Bitstring] ~ {
T[white, bitstring, black, scan, length];
T[black, bitstring, white, scan, length]};
Vertical mode codes
V[0, L[1,Z]];
V[1, L[0,1,1,Z]];
V[2, L[0,0,0,0,1,1,Z]];
V[3, L[0,0,0,0,0,1,1,Z]];
V[-1, L[0,1,0,Z]];
V[-2, L[0,0,0,0,1,0,Z]];
V[-3, L[0,0,0,0,0,1,0,Z]];
};
T[white, L[0,0,1,Z], hwhite, null, 0];
T[black, L[0,0,1,Z], hblack, null, 0];
FOR s: State
IN [white..black]
DO
T[s, L[0,0,0,1,Z], s, pass, 0];
T[s, L[0,0,0,0,0,0,Z], unc, utest, 0];
ENDLOOP;
{
W:
PROC [length:
INT, bitstring: Bitstring] ~ {
T[hwhite, bitstring, hhblack, emit, length];
T[hhwhite, bitstring, black, emit, length]};
White run terminating codes
W[00, L[0,0,1,1,0,1,0,1,Z]];
W[01, L[0,0,0,1,1,1,Z]];
W[02, L[0,1,1,1,Z]];
W[03, L[1,0,0,0,Z]];
W[04, L[1,0,1,1,Z]];
W[05, L[1,1,0,0,Z]];
W[06, L[1,1,1,0,Z]];
W[07, L[1,1,1,1,Z]];
W[08, L[1,0,0,1,1,Z]];
W[09, L[1,0,1,0,0,Z]];
W[10, L[0,0,1,1,1,Z]];
W[11, L[0,1,0,0,0,Z]];
W[12, L[0,0,1,0,0,0,Z]];
W[13, L[0,0,0,0,1,1,Z]];
W[14, L[1,1,0,1,0,0,Z]];
W[15, L[1,1,0,1,0,1,Z]];
W[16, L[1,0,1,0,1,0,Z]];
W[17, L[1,0,1,0,1,1,Z]];
W[18, L[0,1,0,0,1,1,1,Z]];
W[19, L[0,0,0,1,1,0,0,Z]];
W[20, L[0,0,0,1,0,0,0,Z]];
W[21, L[0,0,1,0,1,1,1,Z]];
W[22, L[0,0,0,0,0,1,1,Z]];
W[23, L[0,0,0,0,1,0,0,Z]];
W[24, L[0,1,0,1,0,0,0,Z]];
W[25, L[0,1,0,1,0,1,1,Z]];
W[26, L[0,0,1,0,0,1,1,Z]];
W[27, L[0,1,0,0,1,0,0,Z]];
W[28, L[0,0,1,1,0,0,0,Z]];
W[29, L[0,0,0,0,0,0,1,0,Z]];
W[30, L[0,0,0,0,0,0,1,1,Z]];
W[31, L[0,0,0,1,1,0,1,0,Z]];
W[32, L[0,0,0,1,1,0,1,1,Z]];
W[33, L[0,0,0,1,0,0,1,0,Z]];
W[34, L[0,0,0,1,0,0,1,1,Z]];
W[35, L[0,0,0,1,0,1,0,0,Z]];
W[36, L[0,0,0,1,0,1,0,1,Z]];
W[37, L[0,0,0,1,0,1,1,0,Z]];
W[38, L[0,0,0,1,0,1,1,1,Z]];
W[39, L[0,0,1,0,1,0,0,0,Z]];
W[40, L[0,0,1,0,1,0,0,1,Z]];
W[41, L[0,0,1,0,1,0,1,0,Z]];
W[42, L[0,0,1,0,1,0,1,1,Z]];
W[43, L[0,0,1,0,1,1,0,0,Z]];
W[44, L[0,0,1,0,1,1,0,1,Z]];
W[45, L[0,0,0,0,0,1,0,0,Z]];
W[46, L[0,0,0,0,0,1,0,1,Z]];
W[47, L[0,0,0,0,1,0,1,0,Z]];
W[48, L[0,0,0,0,1,0,1,1,Z]];
W[49, L[0,1,0,1,0,0,1,0,Z]];
W[50, L[0,1,0,1,0,0,1,1,Z]];
W[51, L[0,1,0,1,0,1,0,0,Z]];
W[52, L[0,1,0,1,0,1,0,1,Z]];
W[53, L[0,0,1,0,0,1,0,0,Z]];
W[54, L[0,0,1,0,0,1,0,1,Z]];
W[55, L[0,1,0,1,1,0,0,0,Z]];
W[56, L[0,1,0,1,1,0,0,1,Z]];
W[57, L[0,1,0,1,1,0,1,0,Z]];
W[58, L[0,1,0,1,1,0,1,1,Z]];
W[59, L[0,1,0,0,1,0,1,0,Z]];
W[60, L[0,1,0,0,1,0,1,1,Z]];
W[61, L[0,0,1,1,0,0,1,0,Z]];
W[62, L[0,0,1,1,0,0,1,1,Z]];
W[63, L[0,0,1,1,0,1,0,0,Z]];
};
{
B:
PROC [length:
INT, bitstring: Bitstring] ~ {
T[hhblack, bitstring, white, emit, length];
T[hblack, bitstring, hhwhite, emit, length]};
Black run terminating codes
B[00, L[0,0,0,0,1,1,0,1,1,1,Z]];
B[01, L[0,1,0,Z]];
B[02, L[1,1,Z]];
B[03, L[1,0,Z]];
B[04, L[0,1,1,Z]];
B[05, L[0,0,1,1,Z]];
B[06, L[0,0,1,0,Z]];
B[07, L[0,0,0,1,1,Z]];
B[08, L[0,0,0,1,0,1,Z]];
B[09, L[0,0,0,1,0,0,Z]];
B[10, L[0,0,0,0,1,0,0,Z]];
B[11, L[0,0,0,0,1,0,1,Z]];
B[12, L[0,0,0,0,1,1,1,Z]];
B[13, L[0,0,0,0,0,1,0,0,Z]];
B[14, L[0,0,0,0,0,1,1,1,Z]];
B[15, L[0,0,0,0,1,1,0,0,0,Z]];
B[16, L[0,0,0,0,0,1,0,1,1,1,Z]];
B[17, L[0,0,0,0,0,1,1,0,0,0,Z]];
B[18, L[0,0,0,0,0,0,1,0,0,0,Z]];
B[19, L[0,0,0,0,1,1,0,0,1,1,1,Z]];
B[20, L[0,0,0,0,1,1,0,1,0,0,0,Z]];
B[21, L[0,0,0,0,1,1,0,1,1,0,0,Z]];
B[22, L[0,0,0,0,0,1,1,0,1,1,1,Z]];
B[23, L[0,0,0,0,0,1,0,1,0,0,0,Z]];
B[24, L[0,0,0,0,0,0,1,0,1,1,1,Z]];
B[25, L[0,0,0,0,0,0,1,1,0,0,0,Z]];
B[26, L[0,0,0,0,1,1,0,0,1,0,1,0,Z]];
B[27, L[0,0,0,0,1,1,0,0,1,0,1,1,Z]];
B[28, L[0,0,0,0,1,1,0,0,1,1,0,0,Z]];
B[29, L[0,0,0,0,1,1,0,0,1,1,0,1,Z]];
B[30, L[0,0,0,0,0,1,1,0,1,0,0,0,Z]];
B[31, L[0,0,0,0,0,1,1,0,1,0,0,1,Z]];
B[32, L[0,0,0,0,0,1,1,0,1,0,1,0,Z]];
B[33, L[0,0,0,0,0,1,1,0,1,0,1,1,Z]];
B[34, L[0,0,0,0,1,1,0,1,0,0,1,0,Z]];
B[35, L[0,0,0,0,1,1,0,1,0,0,1,1,Z]];
B[36, L[0,0,0,0,1,1,0,1,0,1,0,0,Z]];
B[37, L[0,0,0,0,1,1,0,1,0,1,0,1,Z]];
B[38, L[0,0,0,0,1,1,0,1,0,1,1,0,Z]];
B[39, L[0,0,0,0,1,1,0,1,0,1,1,1,Z]];
B[40, L[0,0,0,0,0,1,1,0,1,1,0,0,Z]];
B[41, L[0,0,0,0,0,1,1,0,1,1,0,1,Z]];
B[42, L[0,0,0,0,1,1,0,1,1,0,1,0,Z]];
B[43, L[0,0,0,0,1,1,0,1,1,0,1,1,Z]];
B[44, L[0,0,0,0,0,1,0,1,0,1,0,0,Z]];
B[45, L[0,0,0,0,0,1,0,1,0,1,0,1,Z]];
B[46, L[0,0,0,0,0,1,0,1,0,1,1,0,Z]];
B[47, L[0,0,0,0,0,1,0,1,0,1,1,1,Z]];
B[48, L[0,0,0,0,0,1,1,0,0,1,0,0,Z]];
B[49, L[0,0,0,0,0,1,1,0,0,1,0,1,Z]];
B[50, L[0,0,0,0,0,1,0,1,0,0,1,0,Z]];
B[51, L[0,0,0,0,0,1,0,1,0,0,1,1,Z]];
B[52, L[0,0,0,0,0,0,1,0,0,1,0,0,Z]];
B[53, L[0,0,0,0,0,0,1,1,0,1,1,1,Z]];
B[54, L[0,0,0,0,0,0,1,1,1,0,0,0,Z]];
B[55, L[0,0,0,0,0,0,1,0,0,1,1,1,Z]];
B[56, L[0,0,0,0,0,0,1,0,1,0,0,0,Z]];
B[57, L[0,0,0,0,0,1,0,1,1,0,0,0,Z]];
B[58, L[0,0,0,0,0,1,0,1,1,0,0,1,Z]];
B[59, L[0,0,0,0,0,0,1,0,1,0,1,1,Z]];
B[60, L[0,0,0,0,0,0,1,0,1,1,0,0,Z]];
B[61, L[0,0,0,0,0,1,0,1,1,0,1,0,Z]];
B[62, L[0,0,0,0,0,1,1,0,0,1,1,0,Z]];
B[63, L[0,0,0,0,0,1,1,0,0,1,1,1,Z]];
};
{
MW:
PROC [length:
INT, bitstring: Bitstring] ~ {
T[hwhite, bitstring, hwhite, null, length];
T[hhwhite, bitstring, hhwhite, null, length]};
White makeup codes
MW[0064, L[1,1,0,1,1,Z]];
MW[0128, L[1,0,0,1,0,Z]];
MW[0192, L[0,1,0,1,1,1,Z]];
MW[0256, L[0,1,1,0,1,1,1,Z]];
MW[0320, L[0,0,1,1,0,1,1,0,Z]];
MW[0384, L[0,0,1,1,0,1,1,1,Z]];
MW[0448, L[0,1,1,0,0,1,0,0,Z]];
MW[0512, L[0,1,1,0,0,1,0,1,Z]];
MW[0576, L[0,1,1,0,1,0,0,0,Z]];
MW[0640, L[0,1,1,0,0,1,1,1,Z]];
MW[0704, L[0,1,1,0,0,1,1,0,0,Z]];
MW[0768, L[0,1,1,0,0,1,1,0,1,Z]];
MW[0832, L[0,1,1,0,1,0,0,1,0,Z]];
MW[0896, L[0,1,1,0,1,0,0,1,1,Z]];
MW[0960, L[0,1,1,0,1,0,1,0,0,Z]];
MW[1024, L[0,1,1,0,1,0,1,0,1,Z]];
MW[1088, L[0,1,1,0,1,0,1,1,0,Z]];
MW[1152, L[0,1,1,0,1,0,1,1,1,Z]];
MW[1216, L[0,1,1,0,1,1,0,0,0,Z]];
MW[1280, L[0,1,1,0,1,1,0,0,1,Z]];
MW[1344, L[0,1,1,0,1,1,0,1,0,Z]];
MW[1408, L[0,1,1,0,1,1,0,1,1,Z]];
MW[1472, L[0,1,0,0,1,1,0,0,0,Z]];
MW[1536, L[0,1,0,0,1,1,0,0,1,Z]];
MW[1600, L[0,1,0,0,1,1,0,1,0,Z]];
MW[1664, L[0,1,1,0,0,0,Z]];
MW[1728, L[0,1,0,0,1,1,0,1,1,Z]];
};
{
MB:
PROC [length:
INT, bitstring: Bitstring] ~ {
T[hblack, bitstring, hblack, null, length];
T[hhblack, bitstring, hhblack, null, length]};
Black makeup codes
MB[0064, L[0,0,0,0,0,0,1,1,1,1,Z]];
MB[0128, L[0,0,0,0,1,1,0,0,1,0,0,0,Z]];
MB[0192, L[0,0,0,0,1,1,0,0,1,0,0,1,Z]];
MB[0256, L[0,0,0,0,0,1,0,1,1,0,1,1,Z]];
MB[0320, L[0,0,0,0,0,0,1,1,0,0,1,1,Z]];
MB[0384, L[0,0,0,0,0,0,1,1,0,1,0,0,Z]];
MB[0448, L[0,0,0,0,0,0,1,1,0,1,0,1,Z]];
MB[0512, L[0,0,0,0,0,0,1,1,0,1,1,0,0,Z]];
MB[0576, L[0,0,0,0,0,0,1,1,0,1,1,0,1,Z]];
MB[0640, L[0,0,0,0,0,0,1,0,0,1,0,1,0,Z]];
MB[0704, L[0,0,0,0,0,0,1,0,0,1,0,1,1,Z]];
MB[0768, L[0,0,0,0,0,0,1,0,0,1,1,0,0,Z]];
MB[0832, L[0,0,0,0,0,0,1,0,0,1,1,0,1,Z]];
MB[0896, L[0,0,0,0,0,0,1,1,1,0,0,1,0,Z]];
MB[0960, L[0,0,0,0,0,0,1,1,1,0,0,1,1,Z]];
MB[1024, L[0,0,0,0,0,0,1,1,1,0,1,0,0,Z]];
MB[1088, L[0,0,0,0,0,0,1,1,1,0,1,0,1,Z]];
MB[1152, L[0,0,0,0,0,0,1,1,1,0,1,1,0,Z]];
MB[1216, L[0,0,0,0,0,0,1,1,1,0,1,1,1,Z]];
MB[1280, L[0,0,0,0,0,0,1,0,1,0,0,1,0,Z]];
MB[1344, L[0,0,0,0,0,0,1,0,1,0,0,1,1,Z]];
MB[1408, L[0,0,0,0,0,0,1,0,1,0,1,0,0,Z]];
MB[1472, L[0,0,0,0,0,0,1,0,1,0,1,0,1,Z]];
MB[1536, L[0,0,0,0,0,0,1,0,1,1,0,1,0,Z]];
MB[1600, L[0,0,0,0,0,0,1,0,1,1,0,1,1,Z]];
MB[1664, L[0,0,0,0,0,0,1,1,0,0,1,0,0,Z]];
MB[1728, L[0,0,0,0,0,0,1,1,0,0,1,0,1,Z]];
};
{
M:
PROC [length:
INT, bitstring: Bitstring] ~ {
T[hwhite, bitstring, hwhite, null, length];
T[hhwhite, bitstring, hhwhite, null, length];
T[hblack, bitstring, hblack, null, length];
T[hhblack, bitstring, hhblack, null, length]};
Common makeup codes
M[1792, L[0,0,0,0,0,0,0,1,0,0,0,Z]];
M[1856, L[0,0,0,0,0,0,0,1,1,0,0,Z]];
M[1920, L[0,0,0,0,0,0,0,1,1,0,1,Z]];
M[1984, L[0,0,0,0,0,0,0,1,0,0,1,0,Z]];
M[2048, L[0,0,0,0,0,0,0,1,0,0,1,1,Z]];
M[2112, L[0,0,0,0,0,0,0,1,0,1,0,0,Z]];
M[2176, L[0,0,0,0,0,0,0,1,0,1,0,1,Z]];
M[2240, L[0,0,0,0,0,0,0,1,0,1,1,0,Z]];
M[2304, L[0,0,0,0,0,0,0,1,0,1,1,1,Z]];
M[2368, L[0,0,0,0,0,0,0,1,1,1,0,0,Z]];
M[2432, L[0,0,0,0,0,0,0,1,1,1,0,1,Z]];
M[2496, L[0,0,0,0,0,0,0,1,1,1,1,0,Z]];
M[2560, L[0,0,0,0,0,0,0,1,1,1,1,1,Z]];
};
{
U:
PROC [length:
INT, bitstring: Bitstring] ~ {
T[unc, bitstring, unc, one, length]};
U[1, L[1,Z]];
U[2, L[0,1,Z]];
U[3, L[0,0,1,Z]];
U[4, L[0,0,0,1,Z]];
U[5, L[0,0,0,0,1,Z]];
T[unc, L[0,0,0,0,0,1,Z], unc, zeros, 5];
};
FOR length: [0..4]
IN [0..4]
DO
-- Patterns like 0
60
n1T
b: Bitstring ¬ ALL[0];
b[length+6] ¬ 1;
b[length+7] ¬ 0;
b[length+8] ¬ Z;
T[unc, b, white, zeros, length];
b[length+7] ¬ 1;
T[unc, b, black, zeros, length];
ENDLOOP;
{
These states are used to pick up when uncompressed data spans a scanline boundary.
T[uncb1, L[Z], unc, one, 1];
T[uncb2, L[Z], unc, one, 2];
T[uncb3, L[Z], unc, one, 3];
T[uncb4, L[Z], unc, one, 4];
T[uncb5, L[Z], unc, one, 5];
T[uncw1, L[Z], unc, zeros, 1];
T[uncw2, L[Z], unc, zeros, 2];
T[uncw3, L[Z], unc, zeros, 3];
T[uncw4, L[Z], unc, zeros, 4];
T[uncw5, L[Z], unc, zeros, 5];
};
};