zenquant 0.1.3

AQ-informed palette quantizer — perceptual masking meets color quantization
Documentation
extern crate alloc;

// Auto-generated 64x64 blue noise threshold map (void-and-cluster, seed=42)
// Mean: 127.0, Std: 73.6
#[rustfmt::skip]
pub(crate) const BLUE_NOISE_64: [u8; 4096] = [
      0, 193, 109, 168, 230,  65, 216,   0,  76, 244, 161,  98, 123, 167,   0, 246,
     99,  71, 238, 106, 148,   0, 170, 135,  69, 202, 104, 138,   0, 201,  99,  69,
    184, 116,  94,   0,  76, 141, 221, 179, 160,  85,   0, 103, 164, 133,  84, 204,
    153,   0, 174,  73, 200,  44, 148, 188,   0, 140,  72, 229,  12, 185, 222,  48,
    172,  84, 239,  41,  95,  22, 161, 119, 180,  34,  62, 208,  22, 220,  68, 146,
     34, 156, 177,  22, 124, 229,  84,  35, 252, 153,  22, 220,  84, 148,  35, 249,
    154,  22, 231, 167, 242,  35, 120,  67,  22, 126, 227, 202,  36,  60, 239,  22,
     52, 120, 216,  29, 103, 182,  82, 232, 116, 217, 177,  58, 131, 104, 153, 208,
    128,  32, 151, 209, 123, 196, 248,  43,  93, 234, 145, 189,  80, 135, 196,  50,
    226, 121,  85, 209,  66, 198,  50, 181, 114,  89, 189,  66, 237,  50, 178, 130,
     84, 191,  66, 125,  50, 201,  93, 151, 240, 183,  50,  74, 117, 189, 145, 101,
    179, 236,  64, 160, 248, 130,  22, 165,  48,  86,  23, 161, 248,  82,  23,  62,
    225, 186,  68,   6, 143,  57,  82, 141, 218, 124,   6, 108,  41, 249, 114,  94,
    183,   6, 252,  41, 140, 103, 154, 234,   6, 215,  41, 126, 158, 207, 109,   6,
    219,  41, 205,  99, 147, 175,   6, 212,  41, 100, 142, 171, 233,   6, 218,  73,
    202,  36, 138,  89,   6, 215,  65, 105, 194, 135, 208, 113,   5, 195, 235,  94,
     16, 108, 250,  89, 175, 236,  12, 187,  26,  69, 176, 229, 158,  12, 174,  25,
    216,  61, 162, 192,  12, 221,  26, 129,  62, 145, 176,  12,  95,  26, 241,  62,
    168, 141,  12, 252,  26, 225,  62, 117, 190,  12, 252,  26,  92, 157,  45, 130,
     12, 163, 112, 207,  54, 178, 144, 246,  10, 229,  42,  76, 179,  52, 142, 167,
    205,  51, 159, 215,  38, 103, 162, 114, 210, 151,  53, 206,  91,  63, 236, 149,
     80, 134, 115,  93, 240,  73, 170, 207,  83, 247, 107, 230, 198,  77, 183, 122,
    229,  91, 115, 183,  77, 133,  90, 232, 155,  78, 124, 215,  66, 187, 110, 226,
     82, 252, 190,  22, 230, 119,  33,  74, 173,  98, 151, 243, 127, 213,  34, 117,
     80, 138,  27, 126, 190,  66, 229,  48,  84, 251, 103,  31, 136, 195, 125,  44,
    206, 232,  31,  52, 177, 119,  44, 100, 191,  31,  52, 165, 137,  44, 101, 156,
     31,  52, 210, 155,  44, 203, 169,  31,  53, 208, 168,  44, 136, 245,  31, 176,
    150,  47, 100,  68, 155,  90, 203, 222, 124,  61,  29, 166,  11,  92,  64, 245,
      0, 198, 234,  83,  19, 135, 202,   0, 126, 186,  17, 165, 231,  76,   0, 108,
    165,  17, 187, 146, 210,   0, 159, 242,  17, 126, 209,  73,   0, 252, 211,  17,
    196, 245,  73,   0, 237, 103,  17, 248, 139,  95,   0, 112, 196,  17,  97,  62,
    210,   0, 133, 175, 244,  16,  50, 158,   1, 197, 225, 105, 188, 232, 147, 171,
    102, 179,  60, 115, 220, 158,  94, 242, 144,  40, 223, 117,  50, 176, 250, 198,
     94,  70, 242, 104,  79, 226, 137,  68, 181, 148,  93, 224, 114, 150,  68, 130,
     85, 172, 140, 118, 180,  68, 127, 193,  73, 221, 181, 237,  70, 156, 232, 139,
    111, 238, 193,  36, 110, 142, 189, 100, 252,  83, 136,  67,  43, 121,  21, 217,
    132,  36, 152, 252,  46, 180,  32,  61, 169,  74, 202, 152,  92,  23, 146,  36,
    220, 154,  44, 129,  23, 186,  36, 112, 230,  44, 169,  23, 188,  36, 177, 223,
     44, 102,  23, 213,  36, 226, 158,  44, 108,  23, 148,  36,  91, 212,  44, 181,
     25,  88,  58, 226,  79, 218,  63, 130,  40, 177,  20, 214, 157, 199,  77,  53,
    230,  88, 203,   6, 105,  78, 197, 119, 234, 101,   6,  59, 239, 189, 129,  63,
    119,   6, 201, 164, 251,  64,  94, 213,   6,  77, 248, 132,  64, 237, 107,   6,
    162, 232, 188,  64, 147,  90,   6, 204, 167, 245,  65, 129, 171,   6, 119,  74,
    208, 163, 122, 149,   7, 167,  29, 205, 227, 149, 115, 242,   5,  96, 249, 164,
     15, 188,  64, 125, 215, 150,  12, 211,  25, 184, 135, 208, 108,  12, 224,  85,
    177, 235,  81, 101,  12, 140, 199, 155, 123, 192, 102,  12, 199,  89, 140, 204,
     75, 125,  12, 252, 112, 176, 238,  79, 121,  12, 192, 220, 109, 252, 188, 151,
     13, 246,  42, 197,  96, 248, 119,  76,  10,  95,  46,  72, 185, 144,  30, 117,
     50, 138, 244, 169,  39, 239, 131,  90, 156,  47, 253,  80, 171,  43, 155, 202,
     27, 138,  52, 219, 173, 233,  48,  27, 241,  57, 146, 216, 162,  48,  27, 248,
     57, 153,  97, 204,  48,  27, 129,  57, 214,  95, 144,  48,  27,  84,  56, 218,
    104,  66, 177,  22, 216,  54, 183, 156, 194, 238, 169, 206, 128,  61, 212, 180,
    222, 108,  26,  96,  72, 186,  51, 228,  70, 115, 163,  31, 127, 236,  99,  56,
    249, 107, 191,  33, 122,  77, 108, 170,  87, 180,  33,  74, 112, 222, 175, 109,
    192,  33, 171,  76, 141, 187, 223, 154,  33, 169,  76, 239, 198, 164, 126,  33,
    142, 225, 128,  82, 112, 144,  38, 102,  61, 120,  30,  87,  11, 233, 100,  74,
      1, 199, 155, 230,  19, 145, 104,   1, 195, 215,  17, 223,  64, 185,   1, 121,
    169,  17, 149,  66, 206,   1, 135, 212,  17, 226, 128, 239,   1, 147,  85,  17,
    135, 235, 215,   1, 240,  89,  17, 106, 251, 185,   1, 133, 103,  17, 231, 191,
     92,   1, 203, 161, 240,  16, 201, 231,   1, 213, 141, 253, 161,  42, 174, 147,
    235,  84,  59, 176, 120, 205, 250, 166, 133,  40,  99, 145, 200,  83, 151, 211,
     72, 225,  90, 241, 161, 186, 253,  67, 156, 106,  49, 165, 188,  60, 244, 205,
     71,  49, 106, 126,  60, 168, 199,  71,  49, 115, 223,  60, 212, 146,  71,  48,
    170, 237,  57,  35,  71, 171,  89, 128, 163,  75, 189,  53, 110, 200,  21, 121,
    186,  35, 134, 219,  45,  84,  32,  61,  80, 181, 246,  51, 118,  23, 243,  36,
    134, 197,  43, 110,  23,  55,  98,  37, 191,  81, 203,  23,  92, 132,  37, 116,
    181, 163,  23, 152, 210,  37, 118, 149, 206,  24, 159,  91,  37, 180, 249, 116,
     25, 151, 102, 195, 137, 218,  58, 247,  40, 105,  20, 219, 133,  78, 241,  55,
    164, 110, 244,   7, 101, 192, 153, 236, 113, 204,   7, 165, 228,  96, 171,  62,
    105,   7, 179, 142, 229, 125, 150, 234,   7, 143, 249, 120, 212, 231, 156,   7,
    221,  86, 242, 184,  97, 247,   7, 230,  86, 137, 236, 193, 124,   7,  96, 197,
    218,  77, 125, 251,   7, 114,  29, 186, 144, 228, 169,  91,   5, 157, 209,  94,
     15, 198,  64, 149, 213, 127,  13, 177,  25, 143,  89,  67, 136,  13, 194, 219,
    159, 249,  79, 214,  13,  72, 178, 209, 116,  56, 175,  13,  46,  75, 195,  98,
     54, 140,  13,  46,  74, 132, 165,  54, 182,  13,  46,  73, 219, 155,  51, 136,
     13, 167,  42, 179,  90, 159, 202,  79,  10, 121,  45, 246, 183,  60,  30, 145,
     49, 222,  89, 174,  39,  71, 228,  97, 214,  47, 235, 178, 211,  43, 124,  85,
     27, 119,  51, 165,  95, 201,  47,  27,  91, 221,  73, 155, 104, 178,  27, 252,
    122, 199, 225, 114, 193,  27, 219, 102, 122, 249, 168, 105,  27, 177, 227,  85,
    241,  64, 207,  22, 227,  53, 243, 100, 173, 206,  72, 138, 104, 229, 124, 250,
    180, 135,  26, 115, 252, 162,  51, 133,  73, 158, 121,  31, 103, 251, 147,  56,
    229, 190, 137,  33, 244, 108, 136, 165, 242, 131,  33, 197, 241, 127, 147,  68,
    173,  33,  80, 167, 233, 151,  68, 202,  33,  80, 204, 131, 244,  68, 115,  33,
    188, 148, 112,  82, 140, 120,  38, 150,  62, 239,  30, 195,  11, 166,  69,  98,
      1,  81, 233, 190,  19, 102, 199,   1, 246, 187,  17, 197,  63, 164,   1, 179,
    106,  17, 208,  67, 182,   1, 222,  65,  17, 185,  97, 217,   1,  55, 224,  18,
    213, 107, 143,   1,  56,  96,  18, 134, 227, 153,   2,  56, 149,  18, 209, 163,
     97,   2, 235, 185, 215,  16, 191, 224,   2, 113, 159,  88, 217,  42, 192, 213,
    144, 169,  59, 128,  77, 212, 145, 175, 112,  40,  98, 237, 138,  82, 205, 240,
     72, 159,  90, 236, 121, 157,  85, 191, 112, 153,  49, 142,  84, 115, 181,  96,
    156,  49, 240, 204, 126, 253, 188, 165,  49,  95, 180, 216,  86, 192, 129,  48,
    253, 134,  57,  35,  71, 170, 109,  86, 136, 184, 231,  53, 129, 149,  21, 110,
    244,  35, 220, 158,  45, 239,  32,  61,  81, 215, 154,  51, 220,  24, 118,  36,
    130, 221,  43, 145,  24,  55, 247,  37, 214,  74, 253,  24, 166, 209,  37, 246,
     75, 188,  24,  88, 176,  37, 114,  75, 243,  24, 117, 235,  37, 103, 228,  74,
     25, 216, 167, 101, 153, 237,  58, 202,  40,  76,  20, 107, 249,  79, 225,  55,
     87, 193, 107,   7, 181,  94, 121, 230, 132, 193,   7, 122, 175,  96, 189,  63,
    172,   7, 195, 111, 178, 204, 101, 140,   7, 175, 196, 125, 235,  69, 149,   7,
    127, 221, 112, 153,  69, 214,   7, 197, 106, 207, 140,  68, 161,   7, 174, 144,
    197,  86, 122, 228,   8, 126,  29, 253, 162, 216, 142, 203,   5, 161, 182, 125,
     15, 151,  64, 246, 139, 198,  13, 168,  25, 253,  89,  67, 243,  13, 212, 138,
    253, 103,  79, 231,  13,  71, 160, 224, 122,  56,  99,  13,  46, 184, 106, 204,
     54, 171,  13,  46, 229, 133, 162,  54, 148,  13,  46, 189, 125, 241,  51, 114,
     13, 178,  42, 203,  79, 183, 142, 101,  10, 117,  45, 170,  94,  60,  31, 205,
     49, 214, 173,  90,  39,  71, 210, 101, 146,  47, 183, 159, 132,  43, 157,  85,
     27, 206,  51, 154, 124, 240,  47,  27,  85, 243, 158, 217,  83, 136,  27, 237,
     93, 142, 248, 200,  97,  28, 241,  92, 224, 173, 248,  91,  28, 200,  96, 211,
    246,  64, 149,  22, 245,  53, 220,  83, 195, 229,  72, 241, 194, 116, 232, 141,
    253, 116,  26, 128, 233, 156,  51, 224,  73, 116, 205,  32, 219, 108, 235,  56,
    164, 112, 185,  34, 214,  93, 189, 168, 203, 133,  34, 113, 198, 227, 160,  67,
    187,  34,  77, 164, 118, 186,  67, 129,  34,  77, 114, 216, 167,  69, 151,  33,
     84, 119, 194,  92, 111, 158,  38, 174,  62, 149,  30, 130,  11, 156,  70,  97,
      2,  81, 193, 217,  19, 110, 184,   2, 172, 234,  18,  99,  63, 191,   2, 124,
    224,  18, 245,  67, 141,   2, 117,  65,  18, 232,  73, 174,   2,  56, 124,  18,
    111, 221, 131,   2,  56, 213,  18, 178, 206, 158,   2,  56, 134,  18, 219, 181,
    138,   2, 231, 170, 215,  16, 134, 242,   2, 105, 187,  88, 214,  42, 198, 170,
    223, 149,  59, 164,  77, 141, 250,  96, 131,  40, 150, 248, 169,  83, 148, 201,
     73, 179, 128,  89, 172, 202, 250, 149, 109, 181,  49, 141, 242,  89, 170, 251,
    204,  49, 176, 239,  87, 145, 253, 103,  49, 137, 237, 185,  85, 253, 105,  48,
    238, 161,  57,  35,  71, 198,  88, 120, 210, 159, 251,  53, 139, 237,  21, 127,
    182,  35, 106, 243,  45, 203,  32,  61, 218,  82, 200,  51, 134,  24, 241,  37,
    100, 152,  43, 232,  24,  55,  81,  37, 209,  85, 221,  24, 104, 209,  37, 136,
     75,  98,  24, 153, 192,  37, 123,  75, 230,  24,  99, 209,  37, 170, 125,  74,
     25, 207, 102, 124, 144, 228,  58, 184,  40,  76,  20, 114, 175,  79, 107,  55,
     87, 199, 131,   8, 177,  90, 123, 191, 145, 176,   8, 119, 217, 178, 111,  60,
    219,   8, 194, 109, 216, 161, 128, 234,   8, 159, 121, 195, 150,  68, 187,   8,
    157, 199, 231, 111,  68, 225,   8, 153, 196, 176, 125,  68, 146,   8, 228, 195,
    135,  85, 187, 251,   8, 173,  29, 100, 223, 135, 196, 226,   5, 206, 161, 245,
     15, 226,  64, 209, 147, 235,  13, 226,  25, 105, 233,  66,  91,  14, 208, 133,
    171, 253,  78, 140,  14,  98, 197, 179, 105,  56, 253,  14,  46, 238, 107, 226,
     54, 124,  14,  47, 136, 170, 203,  54,  92,  14,  47, 245, 190,  92,  51, 159,
     14, 225,  43, 152,  79, 113, 236, 150,  10, 171,  45,  95, 151,  60,  31, 137,
     49, 113, 160,  95,  39,  71, 165, 113,  76,  47, 160, 184, 246,  43, 155,  71,
     28, 121,  51, 184, 238,  70,  47,  28, 139,  73, 186,  98, 168, 125,  28, 178,
     93, 164, 207, 243,  90,  28, 107, 247, 132, 225, 163, 102,  28, 217, 118, 243,
    100,  64, 168,  22, 210,  54, 200,  83, 121, 239,  72, 132, 249, 110, 217, 177,
    234, 190,  26, 248, 126, 215,  51, 187, 253, 210, 123,  32, 141, 104, 189, 239,
     97, 206, 160,  34, 113, 155, 212, 244, 168, 225,  34, 211,  82, 221, 146,  70,
    250,  34,  78, 148, 188, 222,  70, 157,  34,  77, 200, 138, 174,  69, 149,  33,
    180, 204, 114,  88, 241, 127,  38, 164,  62, 208,  30, 193,  11, 166,  70,  91,
      2, 141,  78, 173,  19,  99, 135,   2, 146,  87,  18, 201,  77, 218,   2,  55,
    146,  18, 231,  91, 200,   2, 122,  88,  18, 110, 129, 152,   3,  55, 196,  18,
    131, 185, 113,   3,  56, 120,  18, 182, 210, 116,   3,  56, 236,  18, 211,  82,
    131,   3, 228, 141, 180,  16, 190, 253,   3, 109, 180,  88, 233,  42, 202, 129,
    102, 208,  59, 228, 148, 195, 242,  68, 176,  40, 234, 157,  60, 128, 171, 227,
    117, 181,  67, 134, 250,  58, 185, 147,  67, 204,  49, 247, 182, 113, 237, 101,
    211,  49, 233, 169, 214, 143, 242,  98,  49, 145, 251,  87, 130, 107, 192,  48,
    254, 161,  57,  36,  71, 105, 136,  90, 154, 227, 138,  53, 120, 147,  21, 242,
    162,  35, 185, 105,  46,  81,  32, 207, 127,  98, 183, 111, 250,  24,  93,  37,
     83, 214,  43, 172,  24,  82, 221,  37, 239, 172,  91,  24,  74, 139,  37, 168,
     66, 151,  24,  97,  74,  38, 171,  66, 226,  24, 176, 203,  38, 228, 165,  93,
     25, 102, 200, 151, 233, 206,  58, 218,  40,  76,  20, 163, 217,  79, 179,  55,
     86, 254, 122,   8, 166, 220, 111, 162,  59, 223,   8,  50, 137, 210, 192, 159,
    245,   8, 144, 103, 197, 130, 165, 107,   8, 132, 192, 225, 162, 205,  93,   8,
    224, 109, 190, 249, 129, 204,   8, 117, 196, 161, 104,  71, 139,   8,  65, 144,
    183, 224, 123,  85,   9, 160,  29, 175, 117, 194, 236, 102,   5, 198, 113, 219,
     15, 145,  66, 234, 191, 137,  14, 239,  25, 147, 198,  78, 168,  14, 108,  59,
    122, 201,  78, 227,  14, 240,  48, 208, 157,  58, 104,  14,  47, 120, 254, 186,
     80, 133,  14,  47, 155,  93, 238, 137,  83,  14,  47, 233, 182, 212, 121, 237,
     14,  68,  43, 179, 249, 111,  81, 242,  10, 146,  45, 174, 250,  60,  31, 134,
     50, 203, 158,  91,  39,  61, 100, 185,  86, 121, 232, 104, 217,  44, 240, 141,
     28, 174,  52, 155, 119,  66,  97,  28, 228,  81, 244, 147, 218,  65,  28, 153,
     52, 200, 228, 174,  65,  28, 183,  52, 215, 247, 126, 152,  28,  90,  51, 196,
    109, 162, 211,  22, 131,  54, 196, 134,  96, 209,  72, 129,  90, 149, 170, 230,
    182, 110,  26, 212, 125, 247, 156, 216,  44, 172,  64,  32, 152,  89, 184,  74,
    224,  99, 250,  34, 191, 172, 143, 196, 116, 180,  34, 127, 187,  85, 176, 126,
    238,  34,  90, 119, 209, 231, 109, 157,  34,  97, 187,  65, 112, 251, 171,  33,
     84, 243, 137,  97, 222, 166,  38, 227,  62, 158,  30, 226,  11, 207,  70,  95,
      3, 245,  78, 169,  19, 198,  75,   3, 139, 250,  18, 190, 236, 118,   3, 209,
    154,  19, 116, 207,  88,   3, 247,  73,  19, 153,  54, 206,   3, 109, 223,  19,
    101, 146, 166,   3,  79, 143,  19,  71, 172, 206,   3, 225, 160,  19, 131, 208,
    155,   3,  58, 201,  75,  16, 121, 174,   3, 248, 179, 113, 188,  42, 236, 123,
    216, 141,  59, 233,  98, 145,  36, 114, 194,  83, 108, 135,  70, 170,  57, 131,
     39, 180,  70, 148,  56, 216, 128,  40, 214, 236, 101,  76, 248, 164,  40, 193,
     70, 218,  57, 251, 186,  40, 194, 245, 118,  57, 136,  85,  40, 191,  78,  60,
    229, 122, 187,  35, 145, 234,  87, 211, 107,  77, 137,  54,  99, 144,  21, 165,
     88,  35, 190, 118,  44, 220, 171, 237,  57, 159, 207,  43, 224,  25, 254, 190,
     93, 238, 126, 228,  25, 160, 106, 188,  87, 136, 170,  25, 134,  59, 150, 243,
    122, 178,  25, 136,  97, 123, 219,  89, 148,  25, 235, 168, 213, 106, 242, 146,
     26, 101, 163, 248, 111, 178,  58, 140,  41, 194,  20, 208, 242,  82, 199,  53,
    133, 206, 157,   9, 181,  65,  88, 130,  28, 230,   9, 176,  94, 148, 110,  66,
    213,   9,  47, 193,  96, 241,  63, 166,   9,  47, 197, 231, 105, 214,  87,   9,
     47,  92, 200, 227,  63, 162,   9,  48, 212, 180, 100,  63, 125,   9,  48, 181,
     85, 215,  43,  70,   9, 203,  28, 244, 154, 224, 119, 167,   5, 157, 114, 254,
     15, 106,  68, 215, 136, 251,  14, 199, 100, 145,  78, 123, 217,  14, 167,  32,
    135, 160, 108, 172,  14, 139,  32, 202, 254, 122,  68,  15, 185,  32, 176, 143,
    211, 160,  15, 113,  32, 241, 177,  69, 112,  15, 251,  32, 194, 154, 226, 117,
     15, 193, 133, 221,  94, 158, 127,  81,  11,  94,  67,  45, 228,  69,  29, 173,
    227,  39, 239,  87,  29, 111, 155, 223,  39, 185, 249,  57, 195,  75, 236, 202,
     84, 247,  63, 222,  81, 211, 117,  74, 151,  94, 219, 158,  81, 118, 234,  67,
    104, 247,  77, 147, 193,  82, 140, 233, 193, 156,  81, 142, 219,  89,  66, 164,
    252,  57, 152,  22, 184, 238,  39, 218, 163, 183, 250, 146, 187, 130, 212,  79,
    143, 166, 127, 175, 197,  51,  80, 173,  66, 111,  20, 159,  38, 139, 118,  46,
    178,  19, 124,  38, 153, 184,  46, 217,  19, 181,  39, 130, 249,  46, 201,  19,
    132,  39, 170, 222,  46, 125,  19,  95,  39, 127, 204,  46, 110,  19, 187,  38,
    127, 100, 229,  82, 123,  63, 101, 195,  54, 128,  30, 108,  11,  93,  48, 194,
      3,  95,  55,  20, 230, 140, 211,   3, 238, 132, 201,  91, 240, 183,   4,  99,
    218, 141, 197, 231,  94,   4, 244, 101, 138, 238,  63, 198,   4, 143,  96, 162,
    226,  63, 205,   4, 106, 254, 202, 167,  63, 230,   4, 179, 241, 138, 232,  84,
    197,   4, 173,  42, 204,  17, 151, 117,   4, 233,  83, 202, 220, 160, 245, 113,
    185, 212, 249,  84, 159,  36, 123,  96, 153,  52, 220,  26, 108,  65, 229, 156,
     59,  78,  26, 109,  65, 171, 129,  59, 169,  26, 114,  92, 175, 220,  59, 184,
     26, 111, 137,  75, 180,  59, 148,  27, 216, 105,  75, 160,  60,  98,  27, 154,
    216,  69, 245, 132, 163, 219, 254,  73, 211, 143, 178,  65,  41, 135,  22,  66,
    152,  32, 121, 190, 107,  64, 247, 196,  34, 181,  78, 147, 171, 206, 131,  35,
    240, 166, 186, 251, 148, 208,  35, 196,  81, 208, 229, 158,  75,  35, 116, 237,
     83, 192, 232, 160,  35, 212,  86, 116, 182, 143, 248,  36, 124, 207, 175,  51,
    109, 143,  33, 103,  58,  90,  30, 169,  43,  95,  20, 119, 236, 170,  82, 225,
     48, 174,  70,   9, 222, 166,  16,  83, 232, 118,   9, 254,  49,  15,  86, 198,
    104,   9, 123,  50,  15,  87, 227, 119,   9, 142,  50,  15, 245, 202, 137,   9,
    154,  50,  15,  92, 243, 130,   9, 239,  50,  16,  93, 194, 223,   9,  80, 241,
     16, 180, 223, 200,  10, 187, 136, 110, 191, 246, 155, 199,   5, 100, 192, 126,
    105, 238, 147, 205,  45, 126, 186, 143,  56, 168, 210,  98, 127, 223, 164,  55,
    139, 214,  91, 221, 135, 184,  55, 154, 254,  96, 189, 131, 104,  55, 172,  95,
    250, 128, 203, 115,  55, 189, 165,  73, 204, 123, 173,  53, 151, 108, 140, 192,
    122,  86,  63, 150, 118, 236,  65, 227,  11,  59, 129,  75, 217,  57, 254,  15,
    215,  80,  23, 102, 235,  89,  29, 225, 104,  21, 138,  70, 192,  31, 113, 248,
     21, 192,  69, 162,  31, 240, 106,  21, 178,  69, 222,  31, 153, 229,  21, 194,
     69, 166,  31, 222, 144,  21, 102, 227, 153,  31, 234,  78,  21, 254,  64,  34,
    231, 163,  23, 247,  44, 173,  23, 149,  91, 220, 186,  26, 114, 163,  36, 142,
     59, 189, 129, 169,  62, 155, 203,  69, 174, 245,  42, 160, 238,  60, 179,  79,
    152,  42, 244, 110,  61, 170,  79, 199,  42, 116, 167,  61, 209,  79, 123,  42,
    218, 102,  61, 175,  78, 199,  42, 136,  61,  99, 201, 134, 189, 166, 211, 101,
     52, 207, 132,  82, 213, 103,  74, 205, 167,  39, 103, 240, 148, 206,  92, 181,
      4, 246,  41, 199,  10, 252, 115,   4, 132,  86, 201,  10,  92, 144,   4, 217,
    120, 172,  10, 133, 210,   4, 231, 138, 214,  10, 246,  93,   4, 179, 244, 150,
     10, 137, 234,   4, 252, 112, 213,  10, 247, 161,   4, 116,  43,  92,  10, 156,
    183,   4, 110, 190,  12, 144, 232, 118,   4, 135, 177,  52,  10,  69, 235, 118,
     86, 152, 112, 227,  83, 139,  45, 218, 182,  54, 235, 120, 186, 228, 102, 188,
     53,  88, 226, 189,  94, 152, 120,  53,  88, 159, 124, 200, 142, 107,  53,  88,
    174, 205, 120,  91, 156,  53, 167,  87, 182,  72, 212, 238,  67, 224, 130, 246,
     75, 142, 234,  60, 167,  41, 185,  55, 246,  71, 222,  88, 191, 132,  28, 168,
    195,  20,  65, 163,  30, 187,  96, 154,  20, 107, 150,  30,  72,  45, 134,  20,
    237, 146,  30,  72,  45, 238,  20, 193, 223,  30,  72,  45, 230,  21, 196, 222,
     30,  72,  45, 184,  21, 134, 226,  30, 126,  46, 144,  21, 173, 150,  29, 115,
     45, 220,  23,  99, 252, 134,  20,  89, 198, 162,  20, 116, 250, 157,  50, 213,
    127, 242,  99, 210, 124, 223,  67, 244, 195,  78, 221, 174, 211, 161, 246,  76,
    201, 109, 177, 129, 205, 166,  76, 108, 172, 137, 240, 182, 163,  76, 131, 157,
    115, 240, 143, 223, 200,  75, 107, 190, 240,  95, 195, 111,  83, 207,  61, 197,
    175,  87, 152, 205,  70, 115, 218, 152, 106,  44, 140, 208,  39,  98, 232,  72,
    146,  42, 182,   5,  54, 172,  11, 120,  41, 140,   5,  62,  95,  11, 117,  40,
    157,   5,  62, 254,  11, 114,  41, 247,   5,  62, 100,  11, 113,  41, 254,   5,
     62, 179,  11, 100,  41, 244,   5,  61, 158,  12, 221,  40, 250,   5, 105, 237,
     11, 128,  41, 178,   6, 193,  59, 231,  10, 239, 183,  77,   5, 173, 115,  11,
    225,  80, 156, 111, 249, 145,  93, 207, 166, 230, 111, 254, 133, 203, 182, 222,
     86, 233, 188,  97, 141, 220, 183, 150,  87, 191, 213, 152, 224, 189,  87, 210,
    103, 201,  80, 169, 123, 147, 172, 213, 133,  76, 177, 125, 157, 188, 139,  80,
    161, 217, 109, 243,  84, 142,  32, 175,  81, 119,  57, 224, 128, 204,  60, 190,
     97,  30, 219, 199,  77,  39, 235,  28,  58,  86, 184,  38, 154,  81,  29,  58,
    139, 122,  38, 163,  80,  29,  58, 120, 232,  38, 128,  80,  29,  58, 139, 164,
     38, 131, 247,  29,  58, 207,  86,  38, 112, 234,  29,  65,  94,  50, 221,  33,
     63, 191,  21,  54, 162, 213,  98, 130, 205, 164,  20, 154,  90, 243,  23, 165,
    254, 139,  61,  17, 132, 182, 106, 150, 201, 130,  16, 216,  52, 235, 110, 173,
    200,  16, 214,  52, 194, 243,  99, 209,  16, 168,  52, 245, 177, 117, 233,  16,
    221,  52, 150, 215, 186, 106,  16, 251,  53, 194, 143, 210, 243,  16, 176, 115,
    251,  92, 138, 230, 118,  15, 241,  67,  39, 255, 102, 196,  41, 142,  74, 119,
];

pub(crate) const BLUE_NOISE_SIZE: usize = 64;

/// Look up the blue noise threshold at pixel position (x, y).
///
/// Returns a value in [-0.5, 0.5] suitable for ordered dithering.
/// The map tiles seamlessly due to the toroidal void-and-cluster generation.
#[inline]
pub(crate) fn threshold(x: usize, y: usize) -> f32 {
    let idx = (y % BLUE_NOISE_SIZE) * BLUE_NOISE_SIZE + (x % BLUE_NOISE_SIZE);
    BLUE_NOISE_64[idx] as f32 / 255.0 - 0.5
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn map_has_correct_size() {
        assert_eq!(BLUE_NOISE_64.len(), BLUE_NOISE_SIZE * BLUE_NOISE_SIZE);
        assert_eq!(BLUE_NOISE_64.len(), 4096);
    }

    #[test]
    fn mean_is_reasonable() {
        let sum: u64 = BLUE_NOISE_64.iter().map(|&v| v as u64).sum();
        let mean = sum as f64 / BLUE_NOISE_64.len() as f64;
        // Should be close to 127.5 for a uniform distribution
        assert!(
            (mean - 127.5).abs() < 2.0,
            "mean {mean:.1} too far from 127.5"
        );
    }

    #[test]
    fn threshold_range() {
        for y in 0..BLUE_NOISE_SIZE {
            for x in 0..BLUE_NOISE_SIZE {
                let t = threshold(x, y);
                assert!(
                    (-0.5..=0.5).contains(&t),
                    "threshold({x},{y}) = {t} out of range"
                );
            }
        }
    }

    #[test]
    fn threshold_tiles_seamlessly() {
        // Values should wrap around the tile boundary
        for i in 0..BLUE_NOISE_SIZE {
            assert_eq!(threshold(i, 0), threshold(i + BLUE_NOISE_SIZE, 0));
            assert_eq!(threshold(0, i), threshold(0, i + BLUE_NOISE_SIZE));
        }
    }
}