2008-09-03 08:01:41 +12:00
|
|
|
/* aztec.c - Handles Aztec Mesa 2D Symbols */
|
|
|
|
|
|
|
|
/*
|
|
|
|
libzint - the open source barcode library
|
2016-02-20 22:38:03 +13:00
|
|
|
Copyright (C) 2008-2016 Robin Stuart <rstuart114@gmail.com>
|
2013-05-17 05:26:38 +12:00
|
|
|
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
|
|
modification, are permitted provided that the following conditions
|
|
|
|
are met:
|
|
|
|
|
|
|
|
1. Redistributions of source code must retain the above copyright
|
2016-02-20 22:38:03 +13:00
|
|
|
notice, this list of conditions and the following disclaimer.
|
2013-05-17 05:26:38 +12:00
|
|
|
2. Redistributions in binary form must reproduce the above copyright
|
2016-02-20 22:38:03 +13:00
|
|
|
notice, this list of conditions and the following disclaimer in the
|
|
|
|
documentation and/or other materials provided with the distribution.
|
2013-05-17 05:26:38 +12:00
|
|
|
3. Neither the name of the project nor the names of its contributors
|
2016-02-20 22:38:03 +13:00
|
|
|
may be used to endorse or promote products derived from this software
|
|
|
|
without specific prior written permission.
|
2013-05-17 05:26:38 +12:00
|
|
|
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
|
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
|
|
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
SUCH DAMAGE.
|
2016-02-20 22:38:03 +13:00
|
|
|
*/
|
2008-09-03 08:01:41 +12:00
|
|
|
|
|
|
|
#define UPPER 1
|
|
|
|
#define LOWER 2
|
|
|
|
#define MIXED 4
|
|
|
|
#define PUNC 8
|
|
|
|
#define DIGIT 16
|
|
|
|
#define BINARY 32
|
|
|
|
|
2016-01-11 06:34:33 +13:00
|
|
|
static int AztecMap[22801];
|
2008-09-03 08:01:41 +12:00
|
|
|
|
2016-02-20 22:38:03 +13:00
|
|
|
static const int CompactAztecMap[] = {
|
|
|
|
/* 27 x 27 data grid */
|
|
|
|
609, 608, 411, 413, 415, 417, 419, 421, 423, 425, 427, 429, 431, 433, 435, 437, 439, 441, 443, 445, 447, 449, 451, 453, 455, 457, 459,
|
|
|
|
607, 606, 410, 412, 414, 416, 418, 420, 422, 424, 426, 428, 430, 432, 434, 436, 438, 440, 442, 444, 446, 448, 450, 452, 454, 456, 458,
|
|
|
|
605, 604, 409, 408, 243, 245, 247, 249, 251, 253, 255, 257, 259, 261, 263, 265, 267, 269, 271, 273, 275, 277, 279, 281, 283, 460, 461,
|
|
|
|
603, 602, 407, 406, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 462, 463,
|
|
|
|
601, 600, 405, 404, 241, 240, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, 284, 285, 464, 465,
|
|
|
|
599, 598, 403, 402, 239, 238, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 286, 287, 466, 467,
|
|
|
|
597, 596, 401, 400, 237, 236, 105, 104, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 140, 141, 288, 289, 468, 469,
|
|
|
|
595, 594, 399, 398, 235, 234, 103, 102, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 142, 143, 290, 291, 470, 471,
|
|
|
|
593, 592, 397, 396, 233, 232, 101, 100, 1, 1, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 0, 1, 28, 29, 144, 145, 292, 293, 472, 473,
|
|
|
|
591, 590, 395, 394, 231, 230, 99, 98, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 30, 31, 146, 147, 294, 295, 474, 475,
|
|
|
|
589, 588, 393, 392, 229, 228, 97, 96, 2027, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2007, 32, 33, 148, 149, 296, 297, 476, 477,
|
|
|
|
587, 586, 391, 390, 227, 226, 95, 94, 2026, 1, 0, 1, 1, 1, 1, 1, 0, 1, 2008, 34, 35, 150, 151, 298, 299, 478, 479,
|
|
|
|
585, 584, 389, 388, 225, 224, 93, 92, 2025, 1, 0, 1, 0, 0, 0, 1, 0, 1, 2009, 36, 37, 152, 153, 300, 301, 480, 481,
|
|
|
|
583, 582, 387, 386, 223, 222, 91, 90, 2024, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2010, 38, 39, 154, 155, 302, 303, 482, 483,
|
|
|
|
581, 580, 385, 384, 221, 220, 89, 88, 2023, 1, 0, 1, 0, 0, 0, 1, 0, 1, 2011, 40, 41, 156, 157, 304, 305, 484, 485,
|
|
|
|
579, 578, 383, 382, 219, 218, 87, 86, 2022, 1, 0, 1, 1, 1, 1, 1, 0, 1, 2012, 42, 43, 158, 159, 306, 307, 486, 487,
|
|
|
|
577, 576, 381, 380, 217, 216, 85, 84, 2021, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2013, 44, 45, 160, 161, 308, 309, 488, 489,
|
|
|
|
575, 574, 379, 378, 215, 214, 83, 82, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 46, 47, 162, 163, 310, 311, 490, 491,
|
|
|
|
573, 572, 377, 376, 213, 212, 81, 80, 0, 0, 2020, 2019, 2018, 2017, 2016, 2015, 2014, 0, 0, 48, 49, 164, 165, 312, 313, 492, 493,
|
|
|
|
571, 570, 375, 374, 211, 210, 78, 76, 74, 72, 70, 68, 66, 64, 62, 60, 58, 56, 54, 50, 51, 166, 167, 314, 315, 494, 495,
|
|
|
|
569, 568, 373, 372, 209, 208, 79, 77, 75, 73, 71, 69, 67, 65, 63, 61, 59, 57, 55, 52, 53, 168, 169, 316, 317, 496, 497,
|
|
|
|
567, 566, 371, 370, 206, 204, 202, 200, 198, 196, 194, 192, 190, 188, 186, 184, 182, 180, 178, 176, 174, 170, 171, 318, 319, 498, 499,
|
|
|
|
565, 564, 369, 368, 207, 205, 203, 201, 199, 197, 195, 193, 191, 189, 187, 185, 183, 181, 179, 177, 175, 172, 173, 320, 321, 500, 501,
|
|
|
|
563, 562, 366, 364, 362, 360, 358, 356, 354, 352, 350, 348, 346, 344, 342, 340, 338, 336, 334, 332, 330, 328, 326, 322, 323, 502, 503,
|
|
|
|
561, 560, 367, 365, 363, 361, 359, 357, 355, 353, 351, 349, 347, 345, 343, 341, 339, 337, 335, 333, 331, 329, 327, 324, 325, 504, 505,
|
|
|
|
558, 556, 554, 552, 550, 548, 546, 544, 542, 540, 538, 536, 534, 532, 530, 528, 526, 524, 522, 520, 518, 516, 514, 512, 510, 506, 507,
|
|
|
|
559, 557, 555, 553, 551, 549, 547, 545, 543, 541, 539, 537, 535, 533, 531, 529, 527, 525, 523, 521, 519, 517, 515, 513, 511, 508, 509
|
|
|
|
};
|
|
|
|
|
|
|
|
const int AztecCodeSet[128] = {
|
|
|
|
/* From Table 2 */
|
|
|
|
32, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 12, 32, 32, 32, 32, 32, 32,
|
|
|
|
32, 32, 32, 32, 32, 32, 32, 4, 4, 4, 4, 4, 23, 8, 8, 8, 8, 8, 8, 8,
|
|
|
|
8, 8, 8, 8, 24, 8, 24, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 8,
|
|
|
|
8, 8, 8, 8, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 4, 8, 4, 4, 4, 2, 2, 2,
|
|
|
|
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
|
|
2, 2, 2, 8, 4, 8, 4, 4
|
|
|
|
};
|
|
|
|
|
|
|
|
const int AztecSymbolChar[128] = {
|
|
|
|
/* From Table 2 */
|
|
|
|
0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 300, 14, 15, 16, 17, 18, 19,
|
|
|
|
20, 21, 22, 23, 24, 25, 26, 15, 16, 17, 18, 19, 1, 6, 7, 8, 9, 10, 11, 12,
|
|
|
|
13, 14, 15, 16, 301, 18, 302, 20, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 21, 22,
|
|
|
|
23, 24, 25, 26, 20, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
|
|
|
|
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 27, 21, 28, 22, 23, 24, 2, 3, 4,
|
|
|
|
5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
|
|
|
|
25, 26, 27, 29, 25, 30, 26, 27
|
2008-09-03 08:01:41 +12:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Problem characters are:
|
2016-02-20 22:38:03 +13:00
|
|
|
300: Carriage Return (ASCII 13)
|
|
|
|
301: Comma (ASCII 44)
|
|
|
|
302: Full Stop (ASCII 46)
|
|
|
|
*/
|
|
|
|
|
2016-08-16 23:43:41 +12:00
|
|
|
static const char *pentbit[32] = {
|
2016-02-20 22:38:03 +13:00
|
|
|
"00000", "00001", "00010", "00011", "00100", "00101", "00110", "00111", "01000", "01001",
|
|
|
|
"01010", "01011", "01100", "01101", "01110", "01111", "10000", "10001", "10010", "10011", "10100", "10101",
|
|
|
|
"10110", "10111", "11000", "11001", "11010", "11011", "11100", "11101", "11110", "11111"
|
|
|
|
};
|
2008-09-03 08:01:41 +12:00
|
|
|
|
2016-08-16 23:43:41 +12:00
|
|
|
static const char *quadbit[16] = {
|
2016-02-20 22:38:03 +13:00
|
|
|
"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001",
|
|
|
|
"1010", "1011", "1100", "1101", "1110", "1111"
|
2008-09-03 08:01:41 +12:00
|
|
|
};
|
|
|
|
|
2016-02-20 22:38:03 +13:00
|
|
|
static const char *tribit[8] = {
|
|
|
|
"000", "001", "010", "011", "100", "101", "110", "111"
|
2008-09-03 08:01:41 +12:00
|
|
|
};
|
|
|
|
|
2016-02-20 22:38:03 +13:00
|
|
|
static const int AztecSizes[32] = {
|
|
|
|
/* Codewords per symbol */
|
|
|
|
21, 48, 60, 88, 120, 156, 196, 240, 230, 272, 316, 364, 416, 470, 528, 588, 652, 720, 790,
|
|
|
|
864, 940, 1020, 920, 992, 1066, 1144, 1224, 1306, 1392, 1480, 1570, 1664
|
|
|
|
};
|
2009-01-16 18:50:22 +13:00
|
|
|
|
2016-02-20 22:38:03 +13:00
|
|
|
static const int AztecCompactSizes[4] = {
|
|
|
|
17, 40, 51, 76
|
2008-09-03 08:01:41 +12:00
|
|
|
};
|
|
|
|
|
2016-02-20 22:38:03 +13:00
|
|
|
static const int Aztec10DataSizes[32] = {
|
|
|
|
/* Data bits per symbol maximum with 10% error correction */
|
|
|
|
96, 246, 408, 616, 840, 1104, 1392, 1704, 2040, 2420, 2820, 3250, 3720, 4200, 4730,
|
|
|
|
5270, 5840, 6450, 7080, 7750, 8430, 9150, 9900, 10680, 11484, 12324, 13188, 14076,
|
|
|
|
15000, 15948, 16920, 17940
|
|
|
|
};
|
2008-09-03 08:01:41 +12:00
|
|
|
|
2016-02-20 22:38:03 +13:00
|
|
|
static const int Aztec23DataSizes[32] = {
|
|
|
|
/* Data bits per symbol maximum with 23% error correction */
|
|
|
|
84, 204, 352, 520, 720, 944, 1184, 1456, 1750, 2070, 2410, 2780, 3180, 3590, 4040,
|
|
|
|
4500, 5000, 5520, 6060, 6630, 7210, 7830, 8472, 9132, 9816, 10536, 11280, 12036,
|
|
|
|
12828, 13644, 14472, 15348
|
2008-09-03 08:01:41 +12:00
|
|
|
};
|
|
|
|
|
2016-02-20 22:38:03 +13:00
|
|
|
static const int Aztec36DataSizes[32] = {
|
|
|
|
/* Data bits per symbol maximum with 36% error correction */
|
|
|
|
66, 168, 288, 432, 592, 776, 984, 1208, 1450, 1720, 2000, 2300, 2640, 2980, 3350,
|
|
|
|
3740, 4150, 4580, 5030, 5500, 5990, 6500, 7032, 7584, 8160, 8760, 9372, 9996, 10656,
|
|
|
|
11340, 12024, 12744
|
2008-09-03 08:01:41 +12:00
|
|
|
};
|
|
|
|
|
2016-02-20 22:38:03 +13:00
|
|
|
static const int Aztec50DataSizes[32] = {
|
|
|
|
/* Data bits per symbol maximum with 50% error correction */
|
|
|
|
48, 126, 216, 328, 456, 600, 760, 936, 1120, 1330, 1550, 1790, 2050, 2320, 2610,
|
|
|
|
2910, 3230, 3570, 3920, 4290, 4670, 5070, 5484, 5916, 6360, 6828, 7308, 7800, 8316,
|
|
|
|
8844, 9384, 9948
|
2008-09-03 08:01:41 +12:00
|
|
|
};
|
|
|
|
|
2016-02-20 22:38:03 +13:00
|
|
|
static const int AztecCompact10DataSizes [4] = {
|
|
|
|
78, 198, 336, 520
|
2008-09-03 08:01:41 +12:00
|
|
|
};
|
|
|
|
|
2016-02-20 22:38:03 +13:00
|
|
|
static const int AztecCompact23DataSizes [4] = {
|
|
|
|
66, 168, 288, 440
|
|
|
|
};
|
|
|
|
|
|
|
|
static const int AztecCompact36DataSizes [4] = {
|
|
|
|
48, 138, 232, 360
|
|
|
|
};
|
|
|
|
|
|
|
|
static const int AztecCompact50DataSizes [4] = {
|
|
|
|
36, 102, 176, 280
|
|
|
|
};
|
2008-09-03 08:01:41 +12:00
|
|
|
|
2012-12-30 07:37:03 +13:00
|
|
|
static const int AztecOffset[32] = {
|
2016-02-20 22:38:03 +13:00
|
|
|
66, 64, 62, 60, 57, 55, 53, 51, 49, 47, 45, 42, 40, 38, 36, 34, 32, 30, 28, 25, 23, 21,
|
|
|
|
19, 17, 15, 13, 10, 8, 6, 4, 2, 0
|
2008-09-03 08:01:41 +12:00
|
|
|
};
|
|
|
|
|
2016-02-20 22:38:03 +13:00
|
|
|
static const int AztecCompactOffset[4] = {
|
|
|
|
6, 4, 2, 0
|
|
|
|
};
|