| 1 | { lbc_pdf417 - Handles PDF-417 bar codes
|
|---|
| 2 |
|
|---|
| 3 | Based on Zint (done by Robin Stuart and the Zint team)
|
|---|
| 4 | http://github.com/zint/zint
|
|---|
| 5 | and Pascal adaption by TheUnknownOnes
|
|---|
| 6 | http://theunknownones.net
|
|---|
| 7 |
|
|---|
| 8 | Refactoring: W. Pamler
|
|---|
| 9 | }
|
|---|
| 10 |
|
|---|
| 11 | unit lbc_pdf417;
|
|---|
| 12 |
|
|---|
| 13 | {$IFDEF FPC}
|
|---|
| 14 | {$mode objfpc}{$H+}
|
|---|
| 15 | {$ENDIF}
|
|---|
| 16 |
|
|---|
| 17 | interface
|
|---|
| 18 |
|
|---|
| 19 | uses
|
|---|
| 20 | SysUtils, Types, zint;
|
|---|
| 21 |
|
|---|
| 22 | function pdf417(ASymbol: PZintSymbol; ASource: PByte; ALength: Integer): Integer;
|
|---|
| 23 | function pdf417enc(ASymbol: PZintSymbol; ASource: PByte; ALength: Integer): Integer;
|
|---|
| 24 | function micro_pdf417(ASymbol: PZintSymbol; ASource: PByte; ALength: Integer): Integer;
|
|---|
| 25 |
|
|---|
| 26 | implementation
|
|---|
| 27 |
|
|---|
| 28 | uses
|
|---|
| 29 | lbc_helper;
|
|---|
| 30 |
|
|---|
| 31 | const
|
|---|
| 32 | TEX = 900;
|
|---|
| 33 | BYT = 901;
|
|---|
| 34 | NUM = 902;
|
|---|
| 35 | _FALSE = 0;
|
|---|
| 36 | _TRUE = 1;
|
|---|
| 37 |
|
|---|
| 38 | const
|
|---|
| 39 | BRSET: String = 'ABCDEFabcdefghijklmnopqrstuvwxyz*+-';
|
|---|
| 40 |
|
|---|
| 41 | const
|
|---|
| 42 | { Left and Right Row Address Pattern from Table 2 }
|
|---|
| 43 | RAPLR: array[0..52] of String = (
|
|---|
| 44 | '', '221311', '311311', '312211', '222211', '213211', '214111', '223111',
|
|---|
| 45 | '313111', '322111', '412111', '421111', '331111', '241111', '232111', '231211', '321211',
|
|---|
| 46 | '411211', '411121', '411112', '321112', '312112', '311212', '311221', '311131', '311122',
|
|---|
| 47 | '311113', '221113', '221122', '221131', '221221', '222121', '312121', '321121', '231121',
|
|---|
| 48 | '231112', '222112', '213112', '212212', '212221', '212131', '212122', '212113', '211213',
|
|---|
| 49 | '211123', '211132', '211141', '211231', '211222', '211312', '211321', '211411', '212311'
|
|---|
| 50 | );
|
|---|
| 51 |
|
|---|
| 52 | { Centre Row Address Pattern from Table 2 }
|
|---|
| 53 | RAPC: array[0..52] of String = (
|
|---|
| 54 | '', '112231', '121231', '122131', '131131', '131221', '132121', '141121',
|
|---|
| 55 | '141211', '142111', '133111', '132211', '131311', '122311', '123211', '124111', '115111',
|
|---|
| 56 | '114211', '114121', '123121', '123112', '122212', '122221', '121321', '121411', '112411',
|
|---|
| 57 | '113311', '113221', '113212', '113122', '122122', '131122', '131113', '122113', '113113',
|
|---|
| 58 | '112213', '112222', '112312', '112321', '111421', '111331', '111322', '111232', '111223',
|
|---|
| 59 | '111133', '111124', '111214', '112114', '121114', '121123', '121132', '112132', '112141'
|
|---|
| 60 | );
|
|---|
| 61 |
|
|---|
| 62 | { PDF417 error correction coefficients from Grand Zebu }
|
|---|
| 63 | coefrs : array[0..1021] of Integer = (
|
|---|
| 64 | { k = 2 }
|
|---|
| 65 | 27, 917,
|
|---|
| 66 |
|
|---|
| 67 | { k = 4 }
|
|---|
| 68 | 522, 568, 723, 809,
|
|---|
| 69 |
|
|---|
| 70 | { k = 8 }
|
|---|
| 71 | 237, 308, 436, 284, 646, 653, 428, 379,
|
|---|
| 72 |
|
|---|
| 73 | { k = 16 }
|
|---|
| 74 | 274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, 42, 176, 65,
|
|---|
| 75 |
|
|---|
| 76 | { k = 32 }
|
|---|
| 77 | 361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687, 284, 193, 517,
|
|---|
| 78 | 273, 494, 263, 147, 593, 800, 571, 320, 803, 133, 231, 390, 685, 330, 63, 410,
|
|---|
| 79 |
|
|---|
| 80 | { k = 64 }
|
|---|
| 81 | 539, 422, 6, 93, 862, 771, 453, 106, 610, 287, 107, 505, 733, 877, 381, 612,
|
|---|
| 82 | 723, 476, 462, 172, 430, 609, 858, 822, 543, 376, 511, 400, 672, 762, 283, 184,
|
|---|
| 83 | 440, 35, 519, 31, 460, 594, 225, 535, 517, 352, 605, 158, 651, 201, 488, 502,
|
|---|
| 84 | 648, 733, 717, 83, 404, 97, 280, 771, 840, 629, 4, 381, 843, 623, 264, 543,
|
|---|
| 85 |
|
|---|
| 86 | { k = 128 }
|
|---|
| 87 | 521, 310, 864, 547, 858, 580, 296, 379, 53, 779, 897, 444, 400, 925, 749, 415,
|
|---|
| 88 | 822, 93, 217, 208, 928, 244, 583, 620, 246, 148, 447, 631, 292, 908, 490, 704,
|
|---|
| 89 | 516, 258, 457, 907, 594, 723, 674, 292, 272, 96, 684, 432, 686, 606, 860, 569,
|
|---|
| 90 | 193, 219, 129, 186, 236, 287, 192, 775, 278, 173, 40, 379, 712, 463, 646, 776,
|
|---|
| 91 | 171, 491, 297, 763, 156, 732, 95, 270, 447, 90, 507, 48, 228, 821, 808, 898,
|
|---|
| 92 | 784, 663, 627, 378, 382, 262, 380, 602, 754, 336, 89, 614, 87, 432, 670, 616,
|
|---|
| 93 | 157, 374, 242, 726, 600, 269, 375, 898, 845, 454, 354, 130, 814, 587, 804, 34,
|
|---|
| 94 | 211, 330, 539, 297, 827, 865, 37, 517, 834, 315, 550, 86, 801, 4, 108, 539,
|
|---|
| 95 |
|
|---|
| 96 | { k = 256 }
|
|---|
| 97 | 524, 894, 75, 766, 882, 857, 74, 204, 82, 586, 708, 250, 905, 786, 138, 720,
|
|---|
| 98 | 858, 194, 311, 913, 275, 190, 375, 850, 438, 733, 194, 280, 201, 280, 828, 757,
|
|---|
| 99 | 710, 814, 919, 89, 68, 569, 11, 204, 796, 605, 540, 913, 801, 700, 799, 137,
|
|---|
| 100 | 439, 418, 592, 668, 353, 859, 370, 694, 325, 240, 216, 257, 284, 549, 209, 884,
|
|---|
| 101 | 315, 70, 329, 793, 490, 274, 877, 162, 749, 812, 684, 461, 334, 376, 849, 521,
|
|---|
| 102 | 307, 291, 803, 712, 19, 358, 399, 908, 103, 511, 51, 8, 517, 225, 289, 470,
|
|---|
| 103 | 637, 731, 66, 255, 917, 269, 463, 830, 730, 433, 848, 585, 136, 538, 906, 90,
|
|---|
| 104 | 2, 290, 743, 199, 655, 903, 329, 49, 802, 580, 355, 588, 188, 462, 10, 134,
|
|---|
| 105 | 628, 320, 479, 130, 739, 71, 263, 318, 374, 601, 192, 605, 142, 673, 687, 234,
|
|---|
| 106 | 722, 384, 177, 752, 607, 640, 455, 193, 689, 707, 805, 641, 48, 60, 732, 621,
|
|---|
| 107 | 895, 544, 261, 852, 655, 309, 697, 755, 756, 60, 231, 773, 434, 421, 726, 528,
|
|---|
| 108 | 503, 118, 49, 795, 32, 144, 500, 238, 836, 394, 280, 566, 319, 9, 647, 550,
|
|---|
| 109 | 73, 914, 342, 126, 32, 681, 331, 792, 620, 60, 609, 441, 180, 791, 893, 754,
|
|---|
| 110 | 605, 383, 228, 749, 760, 213, 54, 297, 134, 54, 834, 299, 922, 191, 910, 532,
|
|---|
| 111 | 609, 829, 189, 20, 167, 29, 872, 449, 83, 402, 41, 656, 505, 579, 481, 173,
|
|---|
| 112 | 404, 251, 688, 95, 497, 555, 642, 543, 307, 159, 924, 558, 648, 55, 497, 10,
|
|---|
| 113 |
|
|---|
| 114 | { k = 512 }
|
|---|
| 115 | 352, 77, 373, 504, 35, 599, 428, 207, 409, 574, 118, 498, 285, 380, 350, 492,
|
|---|
| 116 | 197, 265, 920, 155, 914, 299, 229, 643, 294, 871, 306, 88, 87, 193, 352, 781,
|
|---|
| 117 | 846, 75, 327, 520, 435, 543, 203, 666, 249, 346, 781, 621, 640, 268, 794, 534,
|
|---|
| 118 | 539, 781, 408, 390, 644, 102, 476, 499, 290, 632, 545, 37, 858, 916, 552, 41,
|
|---|
| 119 | 542, 289, 122, 272, 383, 800, 485, 98, 752, 472, 761, 107, 784, 860, 658, 741,
|
|---|
| 120 | 290, 204, 681, 407, 855, 85, 99, 62, 482, 180, 20, 297, 451, 593, 913, 142,
|
|---|
| 121 | 808, 684, 287, 536, 561, 76, 653, 899, 729, 567, 744, 390, 513, 192, 516, 258,
|
|---|
| 122 | 240, 518, 794, 395, 768, 848, 51, 610, 384, 168, 190, 826, 328, 596, 786, 303,
|
|---|
| 123 | 570, 381, 415, 641, 156, 237, 151, 429, 531, 207, 676, 710, 89, 168, 304, 402,
|
|---|
| 124 | 40, 708, 575, 162, 864, 229, 65, 861, 841, 512, 164, 477, 221, 92, 358, 785,
|
|---|
| 125 | 288, 357, 850, 836, 827, 736, 707, 94, 8, 494, 114, 521, 2, 499, 851, 543,
|
|---|
| 126 | 152, 729, 771, 95, 248, 361, 578, 323, 856, 797, 289, 51, 684, 466, 533, 820,
|
|---|
| 127 | 669, 45, 902, 452, 167, 342, 244, 173, 35, 463, 651, 51, 699, 591, 452, 578,
|
|---|
| 128 | 37, 124, 298, 332, 552, 43, 427, 119, 662, 777, 475, 850, 764, 364, 578, 911,
|
|---|
| 129 | 283, 711, 472, 420, 245, 288, 594, 394, 511, 327, 589, 777, 699, 688, 43, 408,
|
|---|
| 130 | 842, 383, 721, 521, 560, 644, 714, 559, 62, 145, 873, 663, 713, 159, 672, 729,
|
|---|
| 131 | 624, 59, 193, 417, 158, 209, 563, 564, 343, 693, 109, 608, 563, 365, 181, 772,
|
|---|
| 132 | 677, 310, 248, 353, 708, 410, 579, 870, 617, 841, 632, 860, 289, 536, 35, 777,
|
|---|
| 133 | 618, 586, 424, 833, 77, 597, 346, 269, 757, 632, 695, 751, 331, 247, 184, 45,
|
|---|
| 134 | 787, 680, 18, 66, 407, 369, 54, 492, 228, 613, 830, 922, 437, 519, 644, 905,
|
|---|
| 135 | 789, 420, 305, 441, 207, 300, 892, 827, 141, 537, 381, 662, 513, 56, 252, 341,
|
|---|
| 136 | 242, 797, 838, 837, 720, 224, 307, 631, 61, 87, 560, 310, 756, 665, 397, 808,
|
|---|
| 137 | 851, 309, 473, 795, 378, 31, 647, 915, 459, 806, 590, 731, 425, 216, 548, 249,
|
|---|
| 138 | 321, 881, 699, 535, 673, 782, 210, 815, 905, 303, 843, 922, 281, 73, 469, 791,
|
|---|
| 139 | 660, 162, 498, 308, 155, 422, 907, 817, 187, 62, 16, 425, 535, 336, 286, 437,
|
|---|
| 140 | 375, 273, 610, 296, 183, 923, 116, 667, 751, 353, 62, 366, 691, 379, 687, 842,
|
|---|
| 141 | 37, 357, 720, 742, 330, 5, 39, 923, 311, 424, 242, 749, 321, 54, 669, 316,
|
|---|
| 142 | 342, 299, 534, 105, 667, 488, 640, 672, 576, 540, 316, 486, 721, 610, 46, 656,
|
|---|
| 143 | 447, 171, 616, 464, 190, 531, 297, 321, 762, 752, 533, 175, 134, 14, 381, 433,
|
|---|
| 144 | 717, 45, 111, 20, 596, 284, 736, 138, 646, 411, 877, 669, 141, 919, 45, 780,
|
|---|
| 145 | 407, 164, 332, 899, 165, 726, 600, 325, 498, 655, 357, 752, 768, 223, 849, 647,
|
|---|
| 146 | 63, 310, 863, 251, 366, 304, 282, 738, 675, 410, 389, 244, 31, 121, 303, 263
|
|---|
| 147 | );
|
|---|
| 148 |
|
|---|
| 149 | { Converts values into bar patterns - replacing Grand Zebu's true type font }
|
|---|
| 150 | PDFttf : array[0..34] of String = (
|
|---|
| 151 | '00000', '00001', '00010', '00011', '00100', '00101', '00110', '00111',
|
|---|
| 152 | '01000', '01001', '01010', '01011', '01100', '01101', '01110', '01111', '10000', '10001',
|
|---|
| 153 | '10010', '10011', '10100', '10101', '10110', '10111', '11000', '11001', '11010',
|
|---|
| 154 | '11011', '11100', '11101', '11110', '11111', '01', '1111111101010100', '11111101000101001');
|
|---|
| 155 |
|
|---|
| 156 | { MicroPDF417 coefficients from ISO/IEC 24728:2006 Annex F }
|
|---|
| 157 | Microcoeffs : array[0..343] of Integer = (
|
|---|
| 158 | { k = 7 }
|
|---|
| 159 | 76, 925, 537, 597, 784, 691, 437,
|
|---|
| 160 |
|
|---|
| 161 | { k = 8 }
|
|---|
| 162 | 237, 308, 436, 284, 646, 653, 428, 379,
|
|---|
| 163 |
|
|---|
| 164 | { k = 9 }
|
|---|
| 165 | 567, 527, 622, 257, 289, 362, 501, 441, 205,
|
|---|
| 166 |
|
|---|
| 167 | { k = 10 }
|
|---|
| 168 | 377, 457, 64, 244, 826, 841, 818, 691, 266, 612,
|
|---|
| 169 |
|
|---|
| 170 | { k = 11 }
|
|---|
| 171 | 462, 45, 565, 708, 825, 213, 15, 68, 327, 602, 904,
|
|---|
| 172 |
|
|---|
| 173 | { k = 12 }
|
|---|
| 174 | 597, 864, 757, 201, 646, 684, 347, 127, 388, 7, 69, 851,
|
|---|
| 175 |
|
|---|
| 176 | { k = 13 }
|
|---|
| 177 | 764, 713, 342, 384, 606, 583, 322, 592, 678, 204, 184, 394, 692,
|
|---|
| 178 |
|
|---|
| 179 | { k = 14 }
|
|---|
| 180 | 669, 677, 154, 187, 241, 286, 274, 354, 478, 915, 691, 833, 105, 215,
|
|---|
| 181 |
|
|---|
| 182 | { k = 15 }
|
|---|
| 183 | 460, 829, 476, 109, 904, 664, 230, 5, 80, 74, 550, 575, 147, 868, 642,
|
|---|
| 184 |
|
|---|
| 185 | { k = 16 }
|
|---|
| 186 | 274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, 42, 176, 65,
|
|---|
| 187 |
|
|---|
| 188 | { k = 18 }
|
|---|
| 189 | 279, 577, 315, 624, 37, 855, 275, 739, 120, 297, 312, 202, 560, 321, 233, 756,
|
|---|
| 190 | 760, 573,
|
|---|
| 191 |
|
|---|
| 192 | { k = 21 }
|
|---|
| 193 | 108, 519, 781, 534, 129, 425, 681, 553, 422, 716, 763, 693, 624, 610, 310, 691,
|
|---|
| 194 | 347, 165, 193, 259, 568,
|
|---|
| 195 |
|
|---|
| 196 | { k = 26 }
|
|---|
| 197 | 443, 284, 887, 544, 788, 93, 477, 760, 331, 608, 269, 121, 159, 830, 446, 893,
|
|---|
| 198 | 699, 245, 441, 454, 325, 858, 131, 847, 764, 169,
|
|---|
| 199 |
|
|---|
| 200 | { k = 32 }
|
|---|
| 201 | 361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687, 284, 193, 517,
|
|---|
| 202 | 273, 494, 263, 147, 593, 800, 571, 320, 803, 133, 231, 390, 685, 330, 63, 410,
|
|---|
| 203 |
|
|---|
| 204 | { k = 38 }
|
|---|
| 205 | 234, 228, 438, 848, 133, 703, 529, 721, 788, 322, 280, 159, 738, 586, 388, 684,
|
|---|
| 206 | 445, 680, 245, 595, 614, 233, 812, 32, 284, 658, 745, 229, 95, 689, 920, 771,
|
|---|
| 207 | 554, 289, 231, 125, 117, 518,
|
|---|
| 208 |
|
|---|
| 209 | { k = 44 }
|
|---|
| 210 | 476, 36, 659, 848, 678, 64, 764, 840, 157, 915, 470, 876, 109, 25, 632, 405,
|
|---|
| 211 | 417, 436, 714, 60, 376, 97, 413, 706, 446, 21, 3, 773, 569, 267, 272, 213,
|
|---|
| 212 | 31, 560, 231, 758, 103, 271, 572, 436, 339, 730, 82, 285,
|
|---|
| 213 |
|
|---|
| 214 | { k = 50 }
|
|---|
| 215 | 923, 797, 576, 875, 156, 706, 63, 81, 257, 874, 411, 416, 778, 50, 205, 303,
|
|---|
| 216 | 188, 535, 909, 155, 637, 230, 534, 96, 575, 102, 264, 233, 919, 593, 865, 26,
|
|---|
| 217 | 579, 623, 766, 146, 10, 739, 246, 127, 71, 244, 211, 477, 920, 876, 427, 820,
|
|---|
| 218 | 718, 435
|
|---|
| 219 | );
|
|---|
| 220 | { rows, columns, error codewords, k-offset of valid MicroPDF417 sizes from ISO/IEC 24728:2006 }
|
|---|
| 221 |
|
|---|
| 222 | MicroVariants: array[0..135] of Integer = (
|
|---|
| 223 | 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
|---|
| 224 | 11, 14, 17, 20, 24, 28, 8, 11, 14, 17, 20, 23, 26, 6, 8, 10, 12, 15, 20, 26, 32, 38, 44, 4, 6, 8, 10, 12, 15, 20, 26, 32, 38, 44,
|
|---|
| 225 | 7, 7, 7, 8, 8, 8, 8, 9, 9, 10, 11, 13, 15, 12, 14, 16, 18, 21, 26, 32, 38, 44, 50, 8, 12, 14, 16, 18, 21, 26, 32, 38, 44, 50,
|
|---|
| 226 | 0, 0, 0, 7, 7, 7, 7, 15, 15, 24, 34, 57, 84, 45, 70, 99, 115, 133, 154, 180, 212, 250, 294, 7, 45, 70, 99, 115, 133, 154, 180, 212, 250, 294
|
|---|
| 227 | );
|
|---|
| 228 | { rows, columns, error codewords, k-offset }
|
|---|
| 229 |
|
|---|
| 230 | { following is Left RAP, Centre RAP, Right RAP and Start Cluster from ISO/IEC 24728:2006 tables 10, 11 and 12 }
|
|---|
| 231 | RAPTable: array[0..135] of Integer = (
|
|---|
| 232 | 1, 8, 36, 19, 9, 25, 1, 1, 8, 36, 19, 9, 27, 1, 7, 15, 25, 37, 1, 1, 21, 15, 1, 47, 1, 7, 15, 25, 37, 1, 1, 21, 15, 1,
|
|---|
| 233 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7, 15, 25, 37, 17, 9, 29, 31, 25, 19, 1, 7, 15, 25, 37, 17, 9, 29, 31, 25,
|
|---|
| 234 | 9, 8, 36, 19, 17, 33, 1, 9, 8, 36, 19, 17, 35, 1, 7, 15, 25, 37, 33, 17, 37, 47, 49, 43, 1, 7, 15, 25, 37, 33, 17, 37, 47, 49,
|
|---|
| 235 | 0, 3, 6, 0, 6, 0, 0, 0, 3, 6, 0, 6, 6, 0, 0, 6, 0, 0, 0, 0, 6, 6, 0, 3, 0, 0, 6, 0, 0, 0, 0, 6, 6, 0 );
|
|---|
| 236 |
|
|---|
| 237 | codagemc: array[0..2786] of String = (
|
|---|
| 238 | 'urA', 'xfs', 'ypy', 'unk', 'xdw', 'yoz', 'pDA', 'uls', 'pBk', 'eBA',
|
|---|
| 239 | 'pAs', 'eAk', 'prA', 'uvs', 'xhy', 'pnk', 'utw', 'xgz', 'fDA', 'pls', 'fBk', 'frA', 'pvs',
|
|---|
| 240 | 'uxy', 'fnk', 'ptw', 'uwz', 'fls', 'psy', 'fvs', 'pxy', 'ftw', 'pwz', 'fxy', 'yrx', 'ufk',
|
|---|
| 241 | 'xFw', 'ymz', 'onA', 'uds', 'xEy', 'olk', 'ucw', 'dBA', 'oks', 'uci', 'dAk', 'okg', 'dAc',
|
|---|
| 242 | 'ovk', 'uhw', 'xaz', 'dnA', 'ots', 'ugy', 'dlk', 'osw', 'ugj', 'dks', 'osi', 'dvk', 'oxw',
|
|---|
| 243 | 'uiz', 'dts', 'owy', 'dsw', 'owj', 'dxw', 'oyz', 'dwy', 'dwj', 'ofA', 'uFs', 'xCy', 'odk',
|
|---|
| 244 | 'uEw', 'xCj', 'clA', 'ocs', 'uEi', 'ckk', 'ocg', 'ckc', 'ckE', 'cvA', 'ohs', 'uay', 'ctk',
|
|---|
| 245 | 'ogw', 'uaj', 'css', 'ogi', 'csg', 'csa', 'cxs', 'oiy', 'cww', 'oij', 'cwi', 'cyy', 'oFk',
|
|---|
| 246 | 'uCw', 'xBj', 'cdA', 'oEs', 'uCi', 'cck', 'oEg', 'uCb', 'ccc', 'oEa', 'ccE', 'oED', 'chk',
|
|---|
| 247 | 'oaw', 'uDj', 'cgs', 'oai', 'cgg', 'oab', 'cga', 'cgD', 'obj', 'cib', 'cFA', 'oCs', 'uBi',
|
|---|
| 248 | 'cEk', 'oCg', 'uBb', 'cEc', 'oCa', 'cEE', 'oCD', 'cEC', 'cas', 'cag', 'caa', 'cCk', 'uAr',
|
|---|
| 249 | 'oBa', 'oBD', 'cCB', 'tfk', 'wpw', 'yez', 'mnA', 'tds', 'woy', 'mlk', 'tcw', 'woj', 'FBA',
|
|---|
| 250 | 'mks', 'FAk', 'mvk', 'thw', 'wqz', 'FnA', 'mts', 'tgy', 'Flk', 'msw', 'Fks', 'Fkg', 'Fvk',
|
|---|
| 251 | 'mxw', 'tiz', 'Fts', 'mwy', 'Fsw', 'Fsi', 'Fxw', 'myz', 'Fwy', 'Fyz', 'vfA', 'xps', 'yuy',
|
|---|
| 252 | 'vdk', 'xow', 'yuj', 'qlA', 'vcs', 'xoi', 'qkk', 'vcg', 'xob', 'qkc', 'vca', 'mfA', 'tFs',
|
|---|
| 253 | 'wmy', 'qvA', 'mdk', 'tEw', 'wmj', 'qtk', 'vgw', 'xqj', 'hlA', 'Ekk', 'mcg', 'tEb', 'hkk',
|
|---|
| 254 | 'qsg', 'hkc', 'EvA', 'mhs', 'tay', 'hvA', 'Etk', 'mgw', 'taj', 'htk', 'qww', 'vij', 'hss',
|
|---|
| 255 | 'Esg', 'hsg', 'Exs', 'miy', 'hxs', 'Eww', 'mij', 'hww', 'qyj', 'hwi', 'Eyy', 'hyy', 'Eyj',
|
|---|
| 256 | 'hyj', 'vFk', 'xmw', 'ytj', 'qdA', 'vEs', 'xmi', 'qck', 'vEg', 'xmb', 'qcc', 'vEa', 'qcE',
|
|---|
| 257 | 'qcC', 'mFk', 'tCw', 'wlj', 'qhk', 'mEs', 'tCi', 'gtA', 'Eck', 'vai', 'tCb', 'gsk', 'Ecc',
|
|---|
| 258 | 'mEa', 'gsc', 'qga', 'mED', 'EcC', 'Ehk', 'maw', 'tDj', 'gxk', 'Egs', 'mai', 'gws', 'qii',
|
|---|
| 259 | 'mab', 'gwg', 'Ega', 'EgD', 'Eiw', 'mbj', 'gyw', 'Eii', 'gyi', 'Eib', 'gyb', 'gzj', 'qFA',
|
|---|
| 260 | 'vCs', 'xli', 'qEk', 'vCg', 'xlb', 'qEc', 'vCa', 'qEE', 'vCD', 'qEC', 'qEB', 'EFA', 'mCs',
|
|---|
| 261 | 'tBi', 'ghA', 'EEk', 'mCg', 'tBb', 'ggk', 'qag', 'vDb', 'ggc', 'EEE', 'mCD', 'ggE', 'qaD',
|
|---|
| 262 | 'ggC', 'Eas', 'mDi', 'gis', 'Eag', 'mDb', 'gig', 'qbb', 'gia', 'EaD', 'giD', 'gji', 'gjb',
|
|---|
| 263 | 'qCk', 'vBg', 'xkr', 'qCc', 'vBa', 'qCE', 'vBD', 'qCC', 'qCB', 'ECk', 'mBg', 'tAr', 'gak',
|
|---|
| 264 | 'ECc', 'mBa', 'gac', 'qDa', 'mBD', 'gaE', 'ECC', 'gaC', 'ECB', 'EDg', 'gbg', 'gba', 'gbD',
|
|---|
| 265 | 'vAq', 'vAn', 'qBB', 'mAq', 'EBE', 'gDE', 'gDC', 'gDB', 'lfA', 'sps', 'wey', 'ldk', 'sow',
|
|---|
| 266 | 'ClA', 'lcs', 'soi', 'Ckk', 'lcg', 'Ckc', 'CkE', 'CvA', 'lhs', 'sqy', 'Ctk', 'lgw', 'sqj',
|
|---|
| 267 | 'Css', 'lgi', 'Csg', 'Csa', 'Cxs', 'liy', 'Cww', 'lij', 'Cwi', 'Cyy', 'Cyj', 'tpk', 'wuw',
|
|---|
| 268 | 'yhj', 'ndA', 'tos', 'wui', 'nck', 'tog', 'wub', 'ncc', 'toa', 'ncE', 'toD', 'lFk', 'smw',
|
|---|
| 269 | 'wdj', 'nhk', 'lEs', 'smi', 'atA', 'Cck', 'tqi', 'smb', 'ask', 'ngg', 'lEa', 'asc', 'CcE',
|
|---|
| 270 | 'asE', 'Chk', 'law', 'snj', 'axk', 'Cgs', 'trj', 'aws', 'nii', 'lab', 'awg', 'Cga', 'awa',
|
|---|
| 271 | 'Ciw', 'lbj', 'ayw', 'Cii', 'ayi', 'Cib', 'Cjj', 'azj', 'vpA', 'xus', 'yxi', 'vok', 'xug',
|
|---|
| 272 | 'yxb', 'voc', 'xua', 'voE', 'xuD', 'voC', 'nFA', 'tms', 'wti', 'rhA', 'nEk', 'xvi', 'wtb',
|
|---|
| 273 | 'rgk', 'vqg', 'xvb', 'rgc', 'nEE', 'tmD', 'rgE', 'vqD', 'nEB', 'CFA', 'lCs', 'sli', 'ahA',
|
|---|
| 274 | 'CEk', 'lCg', 'slb', 'ixA', 'agk', 'nag', 'tnb', 'iwk', 'rig', 'vrb', 'lCD', 'iwc', 'agE',
|
|---|
| 275 | 'naD', 'iwE', 'CEB', 'Cas', 'lDi', 'ais', 'Cag', 'lDb', 'iys', 'aig', 'nbb', 'iyg', 'rjb',
|
|---|
| 276 | 'CaD', 'aiD', 'Cbi', 'aji', 'Cbb', 'izi', 'ajb', 'vmk', 'xtg', 'ywr', 'vmc', 'xta', 'vmE',
|
|---|
| 277 | 'xtD', 'vmC', 'vmB', 'nCk', 'tlg', 'wsr', 'rak', 'nCc', 'xtr', 'rac', 'vna', 'tlD', 'raE',
|
|---|
| 278 | 'nCC', 'raC', 'nCB', 'raB', 'CCk', 'lBg', 'skr', 'aak', 'CCc', 'lBa', 'iik', 'aac', 'nDa',
|
|---|
| 279 | 'lBD', 'iic', 'rba', 'CCC', 'iiE', 'aaC', 'CCB', 'aaB', 'CDg', 'lBr', 'abg', 'CDa', 'ijg',
|
|---|
| 280 | 'aba', 'CDD', 'ija', 'abD', 'CDr', 'ijr', 'vlc', 'xsq', 'vlE', 'xsn', 'vlC', 'vlB', 'nBc',
|
|---|
| 281 | 'tkq', 'rDc', 'nBE', 'tkn', 'rDE', 'vln', 'rDC', 'nBB', 'rDB', 'CBc', 'lAq', 'aDc', 'CBE',
|
|---|
| 282 | 'lAn', 'ibc', 'aDE', 'nBn', 'ibE', 'rDn', 'CBB', 'ibC', 'aDB', 'ibB', 'aDq', 'ibq', 'ibn',
|
|---|
| 283 | 'xsf', 'vkl', 'tkf', 'nAm', 'nAl', 'CAo', 'aBo', 'iDo', 'CAl', 'aBl', 'kpk', 'BdA', 'kos',
|
|---|
| 284 | 'Bck', 'kog', 'seb', 'Bcc', 'koa', 'BcE', 'koD', 'Bhk', 'kqw', 'sfj', 'Bgs', 'kqi', 'Bgg',
|
|---|
| 285 | 'kqb', 'Bga', 'BgD', 'Biw', 'krj', 'Bii', 'Bib', 'Bjj', 'lpA', 'sus', 'whi', 'lok', 'sug',
|
|---|
| 286 | 'loc', 'sua', 'loE', 'suD', 'loC', 'BFA', 'kms', 'sdi', 'DhA', 'BEk', 'svi', 'sdb', 'Dgk',
|
|---|
| 287 | 'lqg', 'svb', 'Dgc', 'BEE', 'kmD', 'DgE', 'lqD', 'BEB', 'Bas', 'kni', 'Dis', 'Bag', 'knb',
|
|---|
| 288 | 'Dig', 'lrb', 'Dia', 'BaD', 'Bbi', 'Dji', 'Bbb', 'Djb', 'tuk', 'wxg', 'yir', 'tuc', 'wxa',
|
|---|
| 289 | 'tuE', 'wxD', 'tuC', 'tuB', 'lmk', 'stg', 'nqk', 'lmc', 'sta', 'nqc', 'tva', 'stD', 'nqE',
|
|---|
| 290 | 'lmC', 'nqC', 'lmB', 'nqB', 'BCk', 'klg', 'Dak', 'BCc', 'str', 'bik', 'Dac', 'lna', 'klD',
|
|---|
| 291 | 'bic', 'nra', 'BCC', 'biE', 'DaC', 'BCB', 'DaB', 'BDg', 'klr', 'Dbg', 'BDa', 'bjg', 'Dba',
|
|---|
| 292 | 'BDD', 'bja', 'DbD', 'BDr', 'Dbr', 'bjr', 'xxc', 'yyq', 'xxE', 'yyn', 'xxC', 'xxB', 'ttc',
|
|---|
| 293 | 'wwq', 'vvc', 'xxq', 'wwn', 'vvE', 'xxn', 'vvC', 'ttB', 'vvB', 'llc', 'ssq', 'nnc', 'llE',
|
|---|
| 294 | 'ssn', 'rrc', 'nnE', 'ttn', 'rrE', 'vvn', 'llB', 'rrC', 'nnB', 'rrB', 'BBc', 'kkq', 'DDc',
|
|---|
| 295 | 'BBE', 'kkn', 'bbc', 'DDE', 'lln', 'jjc', 'bbE', 'nnn', 'BBB', 'jjE', 'rrn', 'DDB', 'jjC',
|
|---|
| 296 | 'BBq', 'DDq', 'BBn', 'bbq', 'DDn', 'jjq', 'bbn', 'jjn', 'xwo', 'yyf', 'xwm', 'xwl', 'tso',
|
|---|
| 297 | 'wwf', 'vto', 'xwv', 'vtm', 'tsl', 'vtl', 'lko', 'ssf', 'nlo', 'lkm', 'rno', 'nlm', 'lkl',
|
|---|
| 298 | 'rnm', 'nll', 'rnl', 'BAo', 'kkf', 'DBo', 'lkv', 'bDo', 'DBm', 'BAl', 'jbo', 'bDm', 'DBl',
|
|---|
| 299 | 'jbm', 'bDl', 'jbl', 'DBv', 'jbv', 'xwd', 'vsu', 'vst', 'nku', 'rlu', 'rlt', 'DAu', 'bBu',
|
|---|
| 300 | 'jDu', 'jDt', 'ApA', 'Aok', 'keg', 'Aoc', 'AoE', 'AoC', 'Aqs', 'Aqg', 'Aqa', 'AqD', 'Ari',
|
|---|
| 301 | 'Arb', 'kuk', 'kuc', 'sha', 'kuE', 'shD', 'kuC', 'kuB', 'Amk', 'kdg', 'Bqk', 'kvg', 'kda',
|
|---|
| 302 | 'Bqc', 'kva', 'BqE', 'kvD', 'BqC', 'AmB', 'BqB', 'Ang', 'kdr', 'Brg', 'kvr', 'Bra', 'AnD',
|
|---|
| 303 | 'BrD', 'Anr', 'Brr', 'sxc', 'sxE', 'sxC', 'sxB', 'ktc', 'lvc', 'sxq', 'sgn', 'lvE', 'sxn',
|
|---|
| 304 | 'lvC', 'ktB', 'lvB', 'Alc', 'Bnc', 'AlE', 'kcn', 'Drc', 'BnE', 'AlC', 'DrE', 'BnC', 'AlB',
|
|---|
| 305 | 'DrC', 'BnB', 'Alq', 'Bnq', 'Aln', 'Drq', 'Bnn', 'Drn', 'wyo', 'wym', 'wyl', 'swo', 'txo',
|
|---|
| 306 | 'wyv', 'txm', 'swl', 'txl', 'kso', 'sgf', 'lto', 'swv', 'nvo', 'ltm', 'ksl', 'nvm', 'ltl',
|
|---|
| 307 | 'nvl', 'Ako', 'kcf', 'Blo', 'ksv', 'Dno', 'Blm', 'Akl', 'bro', 'Dnm', 'Bll', 'brm', 'Dnl',
|
|---|
| 308 | 'Akv', 'Blv', 'Dnv', 'brv', 'yze', 'yzd', 'wye', 'xyu', 'wyd', 'xyt', 'swe', 'twu', 'swd',
|
|---|
| 309 | 'vxu', 'twt', 'vxt', 'kse', 'lsu', 'ksd', 'ntu', 'lst', 'rvu', 'ypk', 'zew', 'xdA', 'yos',
|
|---|
| 310 | 'zei', 'xck', 'yog', 'zeb', 'xcc', 'yoa', 'xcE', 'yoD', 'xcC', 'xhk', 'yqw', 'zfj', 'utA',
|
|---|
| 311 | 'xgs', 'yqi', 'usk', 'xgg', 'yqb', 'usc', 'xga', 'usE', 'xgD', 'usC', 'uxk', 'xiw', 'yrj',
|
|---|
| 312 | 'ptA', 'uws', 'xii', 'psk', 'uwg', 'xib', 'psc', 'uwa', 'psE', 'uwD', 'psC', 'pxk', 'uyw',
|
|---|
| 313 | 'xjj', 'ftA', 'pws', 'uyi', 'fsk', 'pwg', 'uyb', 'fsc', 'pwa', 'fsE', 'pwD', 'fxk', 'pyw',
|
|---|
| 314 | 'uzj', 'fws', 'pyi', 'fwg', 'pyb', 'fwa', 'fyw', 'pzj', 'fyi', 'fyb', 'xFA', 'yms', 'zdi',
|
|---|
| 315 | 'xEk', 'ymg', 'zdb', 'xEc', 'yma', 'xEE', 'ymD', 'xEC', 'xEB', 'uhA', 'xas', 'yni', 'ugk',
|
|---|
| 316 | 'xag', 'ynb', 'ugc', 'xaa', 'ugE', 'xaD', 'ugC', 'ugB', 'oxA', 'uis', 'xbi', 'owk', 'uig',
|
|---|
| 317 | 'xbb', 'owc', 'uia', 'owE', 'uiD', 'owC', 'owB', 'dxA', 'oys', 'uji', 'dwk', 'oyg', 'ujb',
|
|---|
| 318 | 'dwc', 'oya', 'dwE', 'oyD', 'dwC', 'dys', 'ozi', 'dyg', 'ozb', 'dya', 'dyD', 'dzi', 'dzb',
|
|---|
| 319 | 'xCk', 'ylg', 'zcr', 'xCc', 'yla', 'xCE', 'ylD', 'xCC', 'xCB', 'uak', 'xDg', 'ylr', 'uac',
|
|---|
| 320 | 'xDa', 'uaE', 'xDD', 'uaC', 'uaB', 'oik', 'ubg', 'xDr', 'oic', 'uba', 'oiE', 'ubD', 'oiC',
|
|---|
| 321 | 'oiB', 'cyk', 'ojg', 'ubr', 'cyc', 'oja', 'cyE', 'ojD', 'cyC', 'cyB', 'czg', 'ojr', 'cza',
|
|---|
| 322 | 'czD', 'czr', 'xBc', 'ykq', 'xBE', 'ykn', 'xBC', 'xBB', 'uDc', 'xBq', 'uDE', 'xBn', 'uDC',
|
|---|
| 323 | 'uDB', 'obc', 'uDq', 'obE', 'uDn', 'obC', 'obB', 'cjc', 'obq', 'cjE', 'obn', 'cjC', 'cjB',
|
|---|
| 324 | 'cjq', 'cjn', 'xAo', 'ykf', 'xAm', 'xAl', 'uBo', 'xAv', 'uBm', 'uBl', 'oDo', 'uBv', 'oDm',
|
|---|
| 325 | 'oDl', 'cbo', 'oDv', 'cbm', 'cbl', 'xAe', 'xAd', 'uAu', 'uAt', 'oBu', 'oBt', 'wpA', 'yes',
|
|---|
| 326 | 'zFi', 'wok', 'yeg', 'zFb', 'woc', 'yea', 'woE', 'yeD', 'woC', 'woB', 'thA', 'wqs', 'yfi',
|
|---|
| 327 | 'tgk', 'wqg', 'yfb', 'tgc', 'wqa', 'tgE', 'wqD', 'tgC', 'tgB', 'mxA', 'tis', 'wri', 'mwk',
|
|---|
| 328 | 'tig', 'wrb', 'mwc', 'tia', 'mwE', 'tiD', 'mwC', 'mwB', 'FxA', 'mys', 'tji', 'Fwk', 'myg',
|
|---|
| 329 | 'tjb', 'Fwc', 'mya', 'FwE', 'myD', 'FwC', 'Fys', 'mzi', 'Fyg', 'mzb', 'Fya', 'FyD', 'Fzi',
|
|---|
| 330 | 'Fzb', 'yuk', 'zhg', 'hjs', 'yuc', 'zha', 'hbw', 'yuE', 'zhD', 'hDy', 'yuC', 'yuB', 'wmk',
|
|---|
| 331 | 'ydg', 'zEr', 'xqk', 'wmc', 'zhr', 'xqc', 'yva', 'ydD', 'xqE', 'wmC', 'xqC', 'wmB', 'xqB',
|
|---|
| 332 | 'tak', 'wng', 'ydr', 'vik', 'tac', 'wna', 'vic', 'xra', 'wnD', 'viE', 'taC', 'viC', 'taB',
|
|---|
| 333 | 'viB', 'mik', 'tbg', 'wnr', 'qyk', 'mic', 'tba', 'qyc', 'vja', 'tbD', 'qyE', 'miC', 'qyC',
|
|---|
| 334 | 'miB', 'qyB', 'Eyk', 'mjg', 'tbr', 'hyk', 'Eyc', 'mja', 'hyc', 'qza', 'mjD', 'hyE', 'EyC',
|
|---|
| 335 | 'hyC', 'EyB', 'Ezg', 'mjr', 'hzg', 'Eza', 'hza', 'EzD', 'hzD', 'Ezr', 'ytc', 'zgq', 'grw',
|
|---|
| 336 | 'ytE', 'zgn', 'gny', 'ytC', 'glz', 'ytB', 'wlc', 'ycq', 'xnc', 'wlE', 'ycn', 'xnE', 'ytn',
|
|---|
| 337 | 'xnC', 'wlB', 'xnB', 'tDc', 'wlq', 'vbc', 'tDE', 'wln', 'vbE', 'xnn', 'vbC', 'tDB', 'vbB',
|
|---|
| 338 | 'mbc', 'tDq', 'qjc', 'mbE', 'tDn', 'qjE', 'vbn', 'qjC', 'mbB', 'qjB', 'Ejc', 'mbq', 'gzc',
|
|---|
| 339 | 'EjE', 'mbn', 'gzE', 'qjn', 'gzC', 'EjB', 'gzB', 'Ejq', 'gzq', 'Ejn', 'gzn', 'yso', 'zgf',
|
|---|
| 340 | 'gfy', 'ysm', 'gdz', 'ysl', 'wko', 'ycf', 'xlo', 'ysv', 'xlm', 'wkl', 'xll', 'tBo', 'wkv',
|
|---|
| 341 | 'vDo', 'tBm', 'vDm', 'tBl', 'vDl', 'mDo', 'tBv', 'qbo', 'vDv', 'qbm', 'mDl', 'qbl', 'Ebo',
|
|---|
| 342 | 'mDv', 'gjo', 'Ebm', 'gjm', 'Ebl', 'gjl', 'Ebv', 'gjv', 'yse', 'gFz', 'ysd', 'wke', 'xku',
|
|---|
| 343 | 'wkd', 'xkt', 'tAu', 'vBu', 'tAt', 'vBt', 'mBu', 'qDu', 'mBt', 'qDt', 'EDu', 'gbu', 'EDt',
|
|---|
| 344 | 'gbt', 'ysF', 'wkF', 'xkh', 'tAh', 'vAx', 'mAx', 'qBx', 'wek', 'yFg', 'zCr', 'wec', 'yFa',
|
|---|
| 345 | 'weE', 'yFD', 'weC', 'weB', 'sqk', 'wfg', 'yFr', 'sqc', 'wfa', 'sqE', 'wfD', 'sqC', 'sqB',
|
|---|
| 346 | 'lik', 'srg', 'wfr', 'lic', 'sra', 'liE', 'srD', 'liC', 'liB', 'Cyk', 'ljg', 'srr', 'Cyc',
|
|---|
| 347 | 'lja', 'CyE', 'ljD', 'CyC', 'CyB', 'Czg', 'ljr', 'Cza', 'CzD', 'Czr', 'yhc', 'zaq', 'arw',
|
|---|
| 348 | 'yhE', 'zan', 'any', 'yhC', 'alz', 'yhB', 'wdc', 'yEq', 'wvc', 'wdE', 'yEn', 'wvE', 'yhn',
|
|---|
| 349 | 'wvC', 'wdB', 'wvB', 'snc', 'wdq', 'trc', 'snE', 'wdn', 'trE', 'wvn', 'trC', 'snB', 'trB',
|
|---|
| 350 | 'lbc', 'snq', 'njc', 'lbE', 'snn', 'njE', 'trn', 'njC', 'lbB', 'njB', 'Cjc', 'lbq', 'azc',
|
|---|
| 351 | 'CjE', 'lbn', 'azE', 'njn', 'azC', 'CjB', 'azB', 'Cjq', 'azq', 'Cjn', 'azn', 'zio', 'irs',
|
|---|
| 352 | 'rfy', 'zim', 'inw', 'rdz', 'zil', 'ily', 'ikz', 'ygo', 'zaf', 'afy', 'yxo', 'ziv', 'ivy',
|
|---|
| 353 | 'adz', 'yxm', 'ygl', 'itz', 'yxl', 'wco', 'yEf', 'wto', 'wcm', 'xvo', 'yxv', 'wcl', 'xvm',
|
|---|
| 354 | 'wtl', 'xvl', 'slo', 'wcv', 'tno', 'slm', 'vro', 'tnm', 'sll', 'vrm', 'tnl', 'vrl', 'lDo',
|
|---|
| 355 | 'slv', 'nbo', 'lDm', 'rjo', 'nbm', 'lDl', 'rjm', 'nbl', 'rjl', 'Cbo', 'lDv', 'ajo', 'Cbm',
|
|---|
| 356 | 'izo', 'ajm', 'Cbl', 'izm', 'ajl', 'izl', 'Cbv', 'ajv', 'zie', 'ifw', 'rFz', 'zid', 'idy',
|
|---|
| 357 | 'icz', 'yge', 'aFz', 'ywu', 'ygd', 'ihz', 'ywt', 'wce', 'wsu', 'wcd', 'xtu', 'wst', 'xtt',
|
|---|
| 358 | 'sku', 'tlu', 'skt', 'vnu', 'tlt', 'vnt', 'lBu', 'nDu', 'lBt', 'rbu', 'nDt', 'rbt', 'CDu',
|
|---|
| 359 | 'abu', 'CDt', 'iju', 'abt', 'ijt', 'ziF', 'iFy', 'iEz', 'ygF', 'ywh', 'wcF', 'wsh', 'xsx',
|
|---|
| 360 | 'skh', 'tkx', 'vlx', 'lAx', 'nBx', 'rDx', 'CBx', 'aDx', 'ibx', 'iCz', 'wFc', 'yCq', 'wFE',
|
|---|
| 361 | 'yCn', 'wFC', 'wFB', 'sfc', 'wFq', 'sfE', 'wFn', 'sfC', 'sfB', 'krc', 'sfq', 'krE', 'sfn',
|
|---|
| 362 | 'krC', 'krB', 'Bjc', 'krq', 'BjE', 'krn', 'BjC', 'BjB', 'Bjq', 'Bjn', 'yao', 'zDf', 'Dfy',
|
|---|
| 363 | 'yam', 'Ddz', 'yal', 'wEo', 'yCf', 'who', 'wEm', 'whm', 'wEl', 'whl', 'sdo', 'wEv', 'svo',
|
|---|
| 364 | 'sdm', 'svm', 'sdl', 'svl', 'kno', 'sdv', 'lro', 'knm', 'lrm', 'knl', 'lrl', 'Bbo', 'knv',
|
|---|
| 365 | 'Djo', 'Bbm', 'Djm', 'Bbl', 'Djl', 'Bbv', 'Djv', 'zbe', 'bfw', 'npz', 'zbd', 'bdy', 'bcz',
|
|---|
| 366 | 'yae', 'DFz', 'yiu', 'yad', 'bhz', 'yit', 'wEe', 'wgu', 'wEd', 'wxu', 'wgt', 'wxt', 'scu',
|
|---|
| 367 | 'stu', 'sct', 'tvu', 'stt', 'tvt', 'klu', 'lnu', 'klt', 'nru', 'lnt', 'nrt', 'BDu', 'Dbu',
|
|---|
| 368 | 'BDt', 'bju', 'Dbt', 'bjt', 'jfs', 'rpy', 'jdw', 'roz', 'jcy', 'jcj', 'zbF', 'bFy', 'zjh',
|
|---|
| 369 | 'jhy', 'bEz', 'jgz', 'yaF', 'yih', 'yyx', 'wEF', 'wgh', 'wwx', 'xxx', 'sch', 'ssx', 'ttx',
|
|---|
| 370 | 'vvx', 'kkx', 'llx', 'nnx', 'rrx', 'BBx', 'DDx', 'bbx', 'jFw', 'rmz', 'jEy', 'jEj', 'bCz',
|
|---|
| 371 | 'jaz', 'jCy', 'jCj', 'jBj', 'wCo', 'wCm', 'wCl', 'sFo', 'wCv', 'sFm', 'sFl', 'kfo', 'sFv',
|
|---|
| 372 | 'kfm', 'kfl', 'Aro', 'kfv', 'Arm', 'Arl', 'Arv', 'yDe', 'Bpz', 'yDd', 'wCe', 'wau', 'wCd',
|
|---|
| 373 | 'wat', 'sEu', 'shu', 'sEt', 'sht', 'kdu', 'kvu', 'kdt', 'kvt', 'Anu', 'Bru', 'Ant', 'Brt',
|
|---|
| 374 | 'zDp', 'Dpy', 'Doz', 'yDF', 'ybh', 'wCF', 'wah', 'wix', 'sEh', 'sgx', 'sxx', 'kcx', 'ktx',
|
|---|
| 375 | 'lvx', 'Alx', 'Bnx', 'Drx', 'bpw', 'nuz', 'boy', 'boj', 'Dmz', 'bqz', 'jps', 'ruy', 'jow',
|
|---|
| 376 | 'ruj', 'joi', 'job', 'bmy', 'jqy', 'bmj', 'jqj', 'jmw', 'rtj', 'jmi', 'jmb', 'blj', 'jnj',
|
|---|
| 377 | 'jli', 'jlb', 'jkr', 'sCu', 'sCt', 'kFu', 'kFt', 'Afu', 'Aft', 'wDh', 'sCh', 'sax', 'kEx',
|
|---|
| 378 | 'khx', 'Adx', 'Avx', 'Buz', 'Duy', 'Duj', 'buw', 'nxj', 'bui', 'bub', 'Dtj', 'bvj', 'jus',
|
|---|
| 379 | 'rxi', 'jug', 'rxb', 'jua', 'juD', 'bti', 'jvi', 'btb', 'jvb', 'jtg', 'rwr', 'jta', 'jtD',
|
|---|
| 380 | 'bsr', 'jtr', 'jsq', 'jsn', 'Bxj', 'Dxi', 'Dxb', 'bxg', 'nyr', 'bxa', 'bxD', 'Dwr', 'bxr',
|
|---|
| 381 | 'bwq', 'bwn', 'pjk', 'urw', 'ejA', 'pbs', 'uny', 'ebk', 'pDw', 'ulz', 'eDs', 'pBy', 'eBw',
|
|---|
| 382 | 'zfc', 'fjk', 'prw', 'zfE', 'fbs', 'pny', 'zfC', 'fDw', 'plz', 'zfB', 'fBy', 'yrc', 'zfq',
|
|---|
| 383 | 'frw', 'yrE', 'zfn', 'fny', 'yrC', 'flz', 'yrB', 'xjc', 'yrq', 'xjE', 'yrn', 'xjC', 'xjB',
|
|---|
| 384 | 'uzc', 'xjq', 'uzE', 'xjn', 'uzC', 'uzB', 'pzc', 'uzq', 'pzE', 'uzn', 'pzC', 'djA', 'ors',
|
|---|
| 385 | 'ufy', 'dbk', 'onw', 'udz', 'dDs', 'oly', 'dBw', 'okz', 'dAy', 'zdo', 'drs', 'ovy', 'zdm',
|
|---|
| 386 | 'dnw', 'otz', 'zdl', 'dly', 'dkz', 'yno', 'zdv', 'dvy', 'ynm', 'dtz', 'ynl', 'xbo', 'ynv',
|
|---|
| 387 | 'xbm', 'xbl', 'ujo', 'xbv', 'ujm', 'ujl', 'ozo', 'ujv', 'ozm', 'ozl', 'crk', 'ofw', 'uFz',
|
|---|
| 388 | 'cns', 'ody', 'clw', 'ocz', 'cky', 'ckj', 'zcu', 'cvw', 'ohz', 'zct', 'cty', 'csz', 'ylu',
|
|---|
| 389 | 'cxz', 'ylt', 'xDu', 'xDt', 'ubu', 'ubt', 'oju', 'ojt', 'cfs', 'oFy', 'cdw', 'oEz', 'ccy',
|
|---|
| 390 | 'ccj', 'zch', 'chy', 'cgz', 'ykx', 'xBx', 'uDx', 'cFw', 'oCz', 'cEy', 'cEj', 'caz', 'cCy',
|
|---|
| 391 | 'cCj', 'FjA', 'mrs', 'tfy', 'Fbk', 'mnw', 'tdz', 'FDs', 'mly', 'FBw', 'mkz', 'FAy', 'zFo',
|
|---|
| 392 | 'Frs', 'mvy', 'zFm', 'Fnw', 'mtz', 'zFl', 'Fly', 'Fkz', 'yfo', 'zFv', 'Fvy', 'yfm', 'Ftz',
|
|---|
| 393 | 'yfl', 'wro', 'yfv', 'wrm', 'wrl', 'tjo', 'wrv', 'tjm', 'tjl', 'mzo', 'tjv', 'mzm', 'mzl',
|
|---|
| 394 | 'qrk', 'vfw', 'xpz', 'hbA', 'qns', 'vdy', 'hDk', 'qlw', 'vcz', 'hBs', 'qky', 'hAw', 'qkj',
|
|---|
| 395 | 'hAi', 'Erk', 'mfw', 'tFz', 'hrk', 'Ens', 'mdy', 'hns', 'qty', 'mcz', 'hlw', 'Eky', 'hky',
|
|---|
| 396 | 'Ekj', 'hkj', 'zEu', 'Evw', 'mhz', 'zhu', 'zEt', 'hvw', 'Ety', 'zht', 'hty', 'Esz', 'hsz',
|
|---|
| 397 | 'ydu', 'Exz', 'yvu', 'ydt', 'hxz', 'yvt', 'wnu', 'xru', 'wnt', 'xrt', 'tbu', 'vju', 'tbt',
|
|---|
| 398 | 'vjt', 'mju', 'mjt', 'grA', 'qfs', 'vFy', 'gnk', 'qdw', 'vEz', 'gls', 'qcy', 'gkw', 'qcj',
|
|---|
| 399 | 'gki', 'gkb', 'Efs', 'mFy', 'gvs', 'Edw', 'mEz', 'gtw', 'qgz', 'gsy', 'Ecj', 'gsj', 'zEh',
|
|---|
| 400 | 'Ehy', 'zgx', 'gxy', 'Egz', 'gwz', 'ycx', 'ytx', 'wlx', 'xnx', 'tDx', 'vbx', 'mbx', 'gfk',
|
|---|
| 401 | 'qFw', 'vCz', 'gds', 'qEy', 'gcw', 'qEj', 'gci', 'gcb', 'EFw', 'mCz', 'ghw', 'EEy', 'ggy',
|
|---|
| 402 | 'EEj', 'ggj', 'Eaz', 'giz', 'gFs', 'qCy', 'gEw', 'qCj', 'gEi', 'gEb', 'ECy', 'gay', 'ECj',
|
|---|
| 403 | 'gaj', 'gCw', 'qBj', 'gCi', 'gCb', 'EBj', 'gDj', 'gBi', 'gBb', 'Crk', 'lfw', 'spz', 'Cns',
|
|---|
| 404 | 'ldy', 'Clw', 'lcz', 'Cky', 'Ckj', 'zCu', 'Cvw', 'lhz', 'zCt', 'Cty', 'Csz', 'yFu', 'Cxz',
|
|---|
| 405 | 'yFt', 'wfu', 'wft', 'sru', 'srt', 'lju', 'ljt', 'arA', 'nfs', 'tpy', 'ank', 'ndw', 'toz',
|
|---|
| 406 | 'als', 'ncy', 'akw', 'ncj', 'aki', 'akb', 'Cfs', 'lFy', 'avs', 'Cdw', 'lEz', 'atw', 'ngz',
|
|---|
| 407 | 'asy', 'Ccj', 'asj', 'zCh', 'Chy', 'zax', 'axy', 'Cgz', 'awz', 'yEx', 'yhx', 'wdx', 'wvx',
|
|---|
| 408 | 'snx', 'trx', 'lbx', 'rfk', 'vpw', 'xuz', 'inA', 'rds', 'voy', 'ilk', 'rcw', 'voj', 'iks',
|
|---|
| 409 | 'rci', 'ikg', 'rcb', 'ika', 'afk', 'nFw', 'tmz', 'ivk', 'ads', 'nEy', 'its', 'rgy', 'nEj',
|
|---|
| 410 | 'isw', 'aci', 'isi', 'acb', 'isb', 'CFw', 'lCz', 'ahw', 'CEy', 'ixw', 'agy', 'CEj', 'iwy',
|
|---|
| 411 | 'agj', 'iwj', 'Caz', 'aiz', 'iyz', 'ifA', 'rFs', 'vmy', 'idk', 'rEw', 'vmj', 'ics', 'rEi',
|
|---|
| 412 | 'icg', 'rEb', 'ica', 'icD', 'aFs', 'nCy', 'ihs', 'aEw', 'nCj', 'igw', 'raj', 'igi', 'aEb',
|
|---|
| 413 | 'igb', 'CCy', 'aay', 'CCj', 'iiy', 'aaj', 'iij', 'iFk', 'rCw', 'vlj', 'iEs', 'rCi', 'iEg',
|
|---|
| 414 | 'rCb', 'iEa', 'iED', 'aCw', 'nBj', 'iaw', 'aCi', 'iai', 'aCb', 'iab', 'CBj', 'aDj', 'ibj',
|
|---|
| 415 | 'iCs', 'rBi', 'iCg', 'rBb', 'iCa', 'iCD', 'aBi', 'iDi', 'aBb', 'iDb', 'iBg', 'rAr', 'iBa',
|
|---|
| 416 | 'iBD', 'aAr', 'iBr', 'iAq', 'iAn', 'Bfs', 'kpy', 'Bdw', 'koz', 'Bcy', 'Bcj', 'Bhy', 'Bgz',
|
|---|
| 417 | 'yCx', 'wFx', 'sfx', 'krx', 'Dfk', 'lpw', 'suz', 'Dds', 'loy', 'Dcw', 'loj', 'Dci', 'Dcb',
|
|---|
| 418 | 'BFw', 'kmz', 'Dhw', 'BEy', 'Dgy', 'BEj', 'Dgj', 'Baz', 'Diz', 'bfA', 'nps', 'tuy', 'bdk',
|
|---|
| 419 | 'now', 'tuj', 'bcs', 'noi', 'bcg', 'nob', 'bca', 'bcD', 'DFs', 'lmy', 'bhs', 'DEw', 'lmj',
|
|---|
| 420 | 'bgw', 'DEi', 'bgi', 'DEb', 'bgb', 'BCy', 'Day', 'BCj', 'biy', 'Daj', 'bij', 'rpk', 'vuw',
|
|---|
| 421 | 'xxj', 'jdA', 'ros', 'vui', 'jck', 'rog', 'vub', 'jcc', 'roa', 'jcE', 'roD', 'jcC', 'bFk',
|
|---|
| 422 | 'nmw', 'ttj', 'jhk', 'bEs', 'nmi', 'jgs', 'rqi', 'nmb', 'jgg', 'bEa', 'jga', 'bED', 'jgD',
|
|---|
| 423 | 'DCw', 'llj', 'baw', 'DCi', 'jiw', 'bai', 'DCb', 'jii', 'bab', 'jib', 'BBj', 'DDj', 'bbj',
|
|---|
| 424 | 'jjj', 'jFA', 'rms', 'vti', 'jEk', 'rmg', 'vtb', 'jEc', 'rma', 'jEE', 'rmD', 'jEC', 'jEB',
|
|---|
| 425 | 'bCs', 'nli', 'jas', 'bCg', 'nlb', 'jag', 'rnb', 'jaa', 'bCD', 'jaD', 'DBi', 'bDi', 'DBb',
|
|---|
| 426 | 'jbi', 'bDb', 'jbb', 'jCk', 'rlg', 'vsr', 'jCc', 'rla', 'jCE', 'rlD', 'jCC', 'jCB', 'bBg',
|
|---|
| 427 | 'nkr', 'jDg', 'bBa', 'jDa', 'bBD', 'jDD', 'DAr', 'bBr', 'jDr', 'jBc', 'rkq', 'jBE', 'rkn',
|
|---|
| 428 | 'jBC', 'jBB', 'bAq', 'jBq', 'bAn', 'jBn', 'jAo', 'rkf', 'jAm', 'jAl', 'bAf', 'jAv', 'Apw',
|
|---|
| 429 | 'kez', 'Aoy', 'Aoj', 'Aqz', 'Bps', 'kuy', 'Bow', 'kuj', 'Boi', 'Bob', 'Amy', 'Bqy', 'Amj',
|
|---|
| 430 | 'Bqj', 'Dpk', 'luw', 'sxj', 'Dos', 'lui', 'Dog', 'lub', 'Doa', 'DoD', 'Bmw', 'ktj', 'Dqw',
|
|---|
| 431 | 'Bmi', 'Dqi', 'Bmb', 'Dqb', 'Alj', 'Bnj', 'Drj', 'bpA', 'nus', 'txi', 'bok', 'nug', 'txb',
|
|---|
| 432 | 'boc', 'nua', 'boE', 'nuD', 'boC', 'boB', 'Dms', 'lti', 'bqs', 'Dmg', 'ltb', 'bqg', 'nvb',
|
|---|
| 433 | 'bqa', 'DmD', 'bqD', 'Bli', 'Dni', 'Blb', 'bri', 'Dnb', 'brb', 'ruk', 'vxg', 'xyr', 'ruc',
|
|---|
| 434 | 'vxa', 'ruE', 'vxD', 'ruC', 'ruB', 'bmk', 'ntg', 'twr', 'jqk', 'bmc', 'nta', 'jqc', 'rva',
|
|---|
| 435 | 'ntD', 'jqE', 'bmC', 'jqC', 'bmB', 'jqB', 'Dlg', 'lsr', 'bng', 'Dla', 'jrg', 'bna', 'DlD',
|
|---|
| 436 | 'jra', 'bnD', 'jrD', 'Bkr', 'Dlr', 'bnr', 'jrr', 'rtc', 'vwq', 'rtE', 'vwn', 'rtC', 'rtB',
|
|---|
| 437 | 'blc', 'nsq', 'jnc', 'blE', 'nsn', 'jnE', 'rtn', 'jnC', 'blB', 'jnB', 'Dkq', 'blq', 'Dkn',
|
|---|
| 438 | 'jnq', 'bln', 'jnn', 'rso', 'vwf', 'rsm', 'rsl', 'bko', 'nsf', 'jlo', 'bkm', 'jlm', 'bkl',
|
|---|
| 439 | 'jll', 'Dkf', 'bkv', 'jlv', 'rse', 'rsd', 'bke', 'jku', 'bkd', 'jkt', 'Aey', 'Aej', 'Auw',
|
|---|
| 440 | 'khj', 'Aui', 'Aub', 'Adj', 'Avj', 'Bus', 'kxi', 'Bug', 'kxb', 'Bua', 'BuD', 'Ati', 'Bvi',
|
|---|
| 441 | 'Atb', 'Bvb', 'Duk', 'lxg', 'syr', 'Duc', 'lxa', 'DuE', 'lxD', 'DuC', 'DuB', 'Btg', 'kwr',
|
|---|
| 442 | 'Dvg', 'lxr', 'Dva', 'BtD', 'DvD', 'Asr', 'Btr', 'Dvr', 'nxc', 'tyq', 'nxE', 'tyn', 'nxC',
|
|---|
| 443 | 'nxB', 'Dtc', 'lwq', 'bvc', 'nxq', 'lwn', 'bvE', 'DtC', 'bvC', 'DtB', 'bvB', 'Bsq', 'Dtq',
|
|---|
| 444 | 'Bsn', 'bvq', 'Dtn', 'bvn', 'vyo', 'xzf', 'vym', 'vyl', 'nwo', 'tyf', 'rxo', 'nwm', 'rxm',
|
|---|
| 445 | 'nwl', 'rxl', 'Dso', 'lwf', 'bto', 'Dsm', 'jvo', 'btm', 'Dsl', 'jvm', 'btl', 'jvl', 'Bsf',
|
|---|
| 446 | 'Dsv', 'btv', 'jvv', 'vye', 'vyd', 'nwe', 'rwu', 'nwd', 'rwt', 'Dse', 'bsu', 'Dsd', 'jtu',
|
|---|
| 447 | 'bst', 'jtt', 'vyF', 'nwF', 'rwh', 'DsF', 'bsh', 'jsx', 'Ahi', 'Ahb', 'Axg', 'kir', 'Axa',
|
|---|
| 448 | 'AxD', 'Agr', 'Axr', 'Bxc', 'kyq', 'BxE', 'kyn', 'BxC', 'BxB', 'Awq', 'Bxq', 'Awn', 'Bxn',
|
|---|
| 449 | 'lyo', 'szf', 'lym', 'lyl', 'Bwo', 'kyf', 'Dxo', 'lyv', 'Dxm', 'Bwl', 'Dxl', 'Awf', 'Bwv',
|
|---|
| 450 | 'Dxv', 'tze', 'tzd', 'lye', 'nyu', 'lyd', 'nyt', 'Bwe', 'Dwu', 'Bwd', 'bxu', 'Dwt', 'bxt',
|
|---|
| 451 | 'tzF', 'lyF', 'nyh', 'BwF', 'Dwh', 'bwx', 'Aiq', 'Ain', 'Ayo', 'kjf', 'Aym', 'Ayl', 'Aif',
|
|---|
| 452 | 'Ayv', 'kze', 'kzd', 'Aye', 'Byu', 'Ayd', 'Byt', 'szp'
|
|---|
| 453 | );
|
|---|
| 454 |
|
|---|
| 455 | {
|
|---|
| 456 | Three figure numbers in comments give the location of command equivalents in the
|
|---|
| 457 | original Visual Basic source code file pdf417.frm
|
|---|
| 458 | this code retains some original (French) procedure and variable names to ease conversion }
|
|---|
| 459 |
|
|---|
| 460 | { text mode processing tables }
|
|---|
| 461 | asciix: array[0..94] of Integer = (
|
|---|
| 462 | 7, 8, 8, 4, 12, 4, 4, 8, 8, 8, 12, 4, 12, 12, 12, 12, 4, 4, 4, 4, 4, 4, 4, 4,
|
|---|
| 463 | 4, 4, 12, 8, 8, 4, 8, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|---|
| 464 | 1, 1, 1, 1, 8, 8, 8, 4, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|---|
| 465 | 2, 2, 2, 2, 8, 8, 8, 8
|
|---|
| 466 | );
|
|---|
| 467 |
|
|---|
| 468 | asciiy: array[0..94] of Integer = (
|
|---|
| 469 | 26, 10, 20, 15, 18, 21, 10, 28, 23, 24, 22, 20, 13, 16, 17, 19, 0, 1, 2, 3,
|
|---|
| 470 | 4, 5, 6, 7, 8, 9, 14, 0, 1, 23, 2, 25, 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
|---|
| 471 | 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 4, 5, 6, 24, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
|---|
| 472 | 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 21, 27, 9
|
|---|
| 473 | );
|
|---|
| 474 |
|
|---|
| 475 | { Automatic sizing table }
|
|---|
| 476 | MicroAutosize : array[0..55] of Integer = (
|
|---|
| 477 | 4, 6, 7, 8, 10, 12, 13, 14, 16, 18, 19, 20, 24, 29, 30, 33, 34, 37, 39, 46, 54, 58, 70, 72, 82, 90, 108, 126,
|
|---|
| 478 | 1, 14, 2, 7, 3, 25, 8, 16, 5, 17, 9, 6, 10, 11, 28, 12, 19, 13, 29, 20, 30, 21, 22, 31, 23, 32, 33, 34
|
|---|
| 479 | );
|
|---|
| 480 |
|
|---|
| 481 | type
|
|---|
| 482 | TGlobalList = array[0..1] of array[0..999] of Integer;
|
|---|
| 483 |
|
|---|
| 484 | { 866 }
|
|---|
| 485 |
|
|---|
| 486 | function GetMode(code: Char): Integer;
|
|---|
| 487 | begin
|
|---|
| 488 | if (code in [#9, #10, #13]) or ((code >= ' ') and (code <= '~')) then
|
|---|
| 489 | Result := TEX
|
|---|
| 490 | else
|
|---|
| 491 | if (code >= '0') and (code <= '9') then
|
|---|
| 492 | Result := NUM
|
|---|
| 493 | else
|
|---|
| 494 | Result := BYT;
|
|---|
| 495 | end;
|
|---|
| 496 |
|
|---|
| 497 | { 844 }
|
|---|
| 498 | procedure ReGroup(var index_list: Integer; var list: TGlobalList);
|
|---|
| 499 | var
|
|---|
| 500 | i, j : Integer;
|
|---|
| 501 | begin
|
|---|
| 502 | { bring together same type blocks }
|
|---|
| 503 | if (index_list > 1) then
|
|---|
| 504 | begin
|
|---|
| 505 | i := 1;
|
|---|
| 506 | while(i < index_list) do
|
|---|
| 507 | begin
|
|---|
| 508 | if (list[1, i - 1] = list[1, i]) then
|
|---|
| 509 | begin
|
|---|
| 510 | { bring together }
|
|---|
| 511 | list[0, i - 1] := list[0, i - 1] + list[0, i];
|
|---|
| 512 | j := i + 1;
|
|---|
| 513 |
|
|---|
| 514 | { decreace the list }
|
|---|
| 515 | while (j < index_list) do
|
|---|
| 516 | begin
|
|---|
| 517 | list[0, j - 1] := list[0, j];
|
|---|
| 518 | list[1, j - 1] := list[1, j];
|
|---|
| 519 | Inc(j);
|
|---|
| 520 | end;
|
|---|
| 521 | dec(index_list);
|
|---|
| 522 | dec(i);
|
|---|
| 523 | end;
|
|---|
| 524 | inc(i);
|
|---|
| 525 | end;
|
|---|
| 526 | end;
|
|---|
| 527 | { 865 }
|
|---|
| 528 | end;
|
|---|
| 529 |
|
|---|
| 530 |
|
|---|
| 531 | { 478 }
|
|---|
| 532 | procedure pdfsmooth(var index_list: Integer; var list: TGlobalList);
|
|---|
| 533 | var
|
|---|
| 534 | i, crnt, last, next, len: Integer;
|
|---|
| 535 | begin
|
|---|
| 536 | for i := 0 to index_list - 1 do
|
|---|
| 537 | begin
|
|---|
| 538 | crnt := list[1, i];
|
|---|
| 539 | len := list[0, i];
|
|---|
| 540 | if (i <> 0) then last := list[1, i - 1] else last := _FALSE;
|
|---|
| 541 | if (i <> index_list - 1) then next := list[1, i + 1] else next := _FALSE;
|
|---|
| 542 |
|
|---|
| 543 | if (crnt = NUM) then
|
|---|
| 544 | begin
|
|---|
| 545 | if (i = 0) then
|
|---|
| 546 | begin { first block }
|
|---|
| 547 | if (index_list > 1) then
|
|---|
| 548 | begin { and there are others }
|
|---|
| 549 | if ((next = TEX) and (len < 8)) then list[1, i] := TEX;
|
|---|
| 550 | if ((next = BYT) and (len = 1)) then list[1, i] := BYT;
|
|---|
| 551 | end;
|
|---|
| 552 | end
|
|---|
| 553 | else
|
|---|
| 554 | begin
|
|---|
| 555 | if (i = index_list - 1) then
|
|---|
| 556 | begin { last block }
|
|---|
| 557 | if ((last = TEX) and (len < 7)) then list[1, i] := TEX;
|
|---|
| 558 | if ((last = BYT) and (len = 1)) then list[1, i] := BYT;
|
|---|
| 559 | end
|
|---|
| 560 | else
|
|---|
| 561 | begin { not first or last block }
|
|---|
| 562 | if (((last = BYT) and (next = BYT)) and (len < 4)) then list[1, i] := BYT;
|
|---|
| 563 | if (((last = BYT) and (next = TEX)) and (len < 4)) then list[1, i] := TEX;
|
|---|
| 564 | if (((last = TEX) and (next = BYT)) and (len < 5)) then list[1, i] := TEX;
|
|---|
| 565 | if (((last = TEX) and (next = TEX)) and (len < 8)) then list[1, i] := TEX;
|
|---|
| 566 | end;
|
|---|
| 567 | end;
|
|---|
| 568 | end;
|
|---|
| 569 | end;
|
|---|
| 570 | ReGroup(index_list, list);
|
|---|
| 571 |
|
|---|
| 572 | { 520 }
|
|---|
| 573 | for i := 0 to index_list - 1 do
|
|---|
| 574 | begin
|
|---|
| 575 | crnt := list[1, i];
|
|---|
| 576 | len := list[0, i];
|
|---|
| 577 | if (i <> 0) then last := list[1, i - 1] else last := _FALSE;
|
|---|
| 578 | if (i <> index_list - 1) then next := list[1, i + 1] else next := _FALSE;
|
|---|
| 579 |
|
|---|
| 580 | if ((crnt = TEX) and (i > 0)) then
|
|---|
| 581 | begin { not the first }
|
|---|
| 582 | if (i = index_list - 1) then
|
|---|
| 583 | begin { the last one }
|
|---|
| 584 | if ((last = BYT) and (len = 1)) then list[1, i] := BYT;
|
|---|
| 585 | end
|
|---|
| 586 | else
|
|---|
| 587 | begin { not the last one }
|
|---|
| 588 | if (((last = BYT) and (next = BYT)) and (len < 5)) then
|
|---|
| 589 | list[1, i] := BYT;
|
|---|
| 590 | if ((((last = BYT) and (next <> BYT)) or ((last <> BYT) and (next = BYT))) and (len < 3)) then
|
|---|
| 591 | list[1, i] := BYT;
|
|---|
| 592 | end;
|
|---|
| 593 | end;
|
|---|
| 594 | end;
|
|---|
| 595 | { 540 }
|
|---|
| 596 | ReGroup(index_list, list);
|
|---|
| 597 | end;
|
|---|
| 598 |
|
|---|
| 599 | { 547 }
|
|---|
| 600 | procedure textprocess(var chainemc : TIntegerDynArray; var mc_length: Integer;
|
|---|
| 601 | ASource: PChar; start, _length, {%H-}block: Integer);
|
|---|
| 602 | var
|
|---|
| 603 | j, indexlistet, curtable : Integer;
|
|---|
| 604 | listet : array[0..1] of array[0..4999] of Integer;
|
|---|
| 605 | chainet: array[0..4999] of Integer;
|
|---|
| 606 | wnet : Integer;
|
|---|
| 607 | codeascii : Char;
|
|---|
| 608 | flag : Integer;
|
|---|
| 609 | newtable : Integer;
|
|---|
| 610 | cw_number : Integer;
|
|---|
| 611 | begin
|
|---|
| 612 | //codeascii := #0;
|
|---|
| 613 | wnet := 0;
|
|---|
| 614 |
|
|---|
| 615 | for j := 0 to 999 do
|
|---|
| 616 | listet[0][j] := 0;
|
|---|
| 617 |
|
|---|
| 618 | { listet will contain the table numbers and the value of each characters }
|
|---|
| 619 | for indexlistet := 0 to _length - 1 do
|
|---|
| 620 | begin
|
|---|
| 621 | codeascii := ASource[start + indexlistet];
|
|---|
| 622 | case codeascii of
|
|---|
| 623 | #9:
|
|---|
| 624 | begin
|
|---|
| 625 | listet[0][indexlistet] := 12;
|
|---|
| 626 | listet[1][indexlistet] := 12;
|
|---|
| 627 | end;
|
|---|
| 628 | #10:
|
|---|
| 629 | begin
|
|---|
| 630 | listet[0][indexlistet] := 8;
|
|---|
| 631 | listet[1][indexlistet] := 15;
|
|---|
| 632 | end;
|
|---|
| 633 | #13:
|
|---|
| 634 | begin
|
|---|
| 635 | listet[0][indexlistet] := 12;
|
|---|
| 636 | listet[1][indexlistet] := 11;
|
|---|
| 637 | end;
|
|---|
| 638 | else
|
|---|
| 639 | begin
|
|---|
| 640 | listet[0][indexlistet] := asciix[Ord(codeascii) - 32];
|
|---|
| 641 | listet[1][indexlistet] := asciiy[Ord(codeascii) - 32];
|
|---|
| 642 | end;
|
|---|
| 643 | end;
|
|---|
| 644 | end;
|
|---|
| 645 |
|
|---|
| 646 | { 570 }
|
|---|
| 647 | curtable := 1; { default table }
|
|---|
| 648 | for j := 0 to _length - 1 do
|
|---|
| 649 | begin
|
|---|
| 650 | if (listet[0][j] and curtable) <> 0 then
|
|---|
| 651 | begin { The character is in the current table }
|
|---|
| 652 | chainet[wnet] := listet[1][j];
|
|---|
| 653 | Inc(wnet);
|
|---|
| 654 | end
|
|---|
| 655 | else
|
|---|
| 656 | begin { Obliged to change table }
|
|---|
| 657 | flag := _FALSE; { True if we change table for only one character }
|
|---|
| 658 | if (j = (_length - 1)) then
|
|---|
| 659 | flag := _TRUE
|
|---|
| 660 | else
|
|---|
| 661 | if not ((listet[0][j] and listet[0][j + 1]) <> 0) then flag := _TRUE;
|
|---|
| 662 |
|
|---|
| 663 | if (flag <> 0) then
|
|---|
| 664 | begin { we change only one character - look for temporary switch }
|
|---|
| 665 | if (((listet[0][j] and 1) <> 0) and (curtable = 2)) then
|
|---|
| 666 | begin { T_UPP }
|
|---|
| 667 | chainet[wnet] := 27;
|
|---|
| 668 | chainet[wnet + 1] := listet[1][j];
|
|---|
| 669 | Inc(wnet, 2);
|
|---|
| 670 | end;
|
|---|
| 671 | if (listet[0][j] and 8) <> 0 then
|
|---|
| 672 | begin { T_PUN }
|
|---|
| 673 | chainet[wnet] := 29;
|
|---|
| 674 | chainet[wnet + 1] := listet[1][j];
|
|---|
| 675 | Inc(wnet, 2);
|
|---|
| 676 | end;
|
|---|
| 677 | if (not ((((listet[0][j] and 1) <> 0) and (curtable = 2)) or ((listet[0][j] and 8) <> 0))) then
|
|---|
| 678 | begin
|
|---|
| 679 | { No temporary switch available }
|
|---|
| 680 | flag := _FALSE;
|
|---|
| 681 | end;
|
|---|
| 682 | end;
|
|---|
| 683 |
|
|---|
| 684 | { 599 }
|
|---|
| 685 | if (not (flag <> 0)) then
|
|---|
| 686 | begin
|
|---|
| 687 | if (j = (_length - 1)) then
|
|---|
| 688 | newtable := listet[0][j]
|
|---|
| 689 | else
|
|---|
| 690 | begin
|
|---|
| 691 | if (not ((listet[0][j] and listet[0][j + 1]) <> 0)) then
|
|---|
| 692 | newtable := listet[0][j]
|
|---|
| 693 | else
|
|---|
| 694 | newtable := listet[0][j] and listet[0][j + 1];
|
|---|
| 695 | end;
|
|---|
| 696 |
|
|---|
| 697 | { Maintain the first if several tables are possible }
|
|---|
| 698 | case newtable of
|
|---|
| 699 | 3,
|
|---|
| 700 | 5,
|
|---|
| 701 | 7,
|
|---|
| 702 | 9,
|
|---|
| 703 | 11,
|
|---|
| 704 | 13,
|
|---|
| 705 | 15:
|
|---|
| 706 | newtable := 1;
|
|---|
| 707 | 6,
|
|---|
| 708 | 10,
|
|---|
| 709 | 14:
|
|---|
| 710 | newtable := 2;
|
|---|
| 711 | 12:
|
|---|
| 712 | newtable := 4;
|
|---|
| 713 | end;
|
|---|
| 714 |
|
|---|
| 715 | { 619 - select the switch }
|
|---|
| 716 | case curtable of
|
|---|
| 717 | 1:
|
|---|
| 718 | case newtable of
|
|---|
| 719 | 2: begin chainet[wnet] := 27; Inc(wnet); end;
|
|---|
| 720 | 4: begin chainet[wnet] := 28; Inc(wnet); end;
|
|---|
| 721 | 8: begin chainet[wnet] := 28; Inc(wnet); chainet[wnet] := 25; Inc(wnet); end;
|
|---|
| 722 | end;
|
|---|
| 723 | 2:
|
|---|
| 724 | case newtable of
|
|---|
| 725 | 1: begin chainet[wnet] := 28; Inc(wnet); chainet[wnet] := 28; Inc(wnet); end;
|
|---|
| 726 | 4: begin chainet[wnet] := 28; Inc(wnet); end;
|
|---|
| 727 | 8: begin chainet[wnet] := 28; Inc(wnet); chainet[wnet] := 25; Inc(wnet); end;
|
|---|
| 728 | end;
|
|---|
| 729 | 4:
|
|---|
| 730 | case newtable of
|
|---|
| 731 | 1: begin chainet[wnet] := 28; Inc(wnet); end;
|
|---|
| 732 | 2: begin chainet[wnet] := 27; Inc(wnet); end;
|
|---|
| 733 | 8: begin chainet[wnet] := 25; Inc(wnet); end;
|
|---|
| 734 | end;
|
|---|
| 735 | 8:
|
|---|
| 736 | case newtable of
|
|---|
| 737 | 1: begin chainet[wnet] := 29; Inc(wnet); end;
|
|---|
| 738 | 2: begin chainet[wnet] := 29; Inc(wnet); chainet[wnet] := 27; Inc(wnet); end;
|
|---|
| 739 | 4: begin chainet[wnet] := 29; Inc(wnet); chainet[wnet] := 28; Inc(wnet); end;
|
|---|
| 740 | end;
|
|---|
| 741 | end;
|
|---|
| 742 | curtable := newtable;
|
|---|
| 743 | { 659 - at last we add the character }
|
|---|
| 744 | chainet[wnet] := listet[1][j];
|
|---|
| 745 | Inc(wnet);
|
|---|
| 746 | end;
|
|---|
| 747 | end;
|
|---|
| 748 | end;
|
|---|
| 749 |
|
|---|
| 750 | { 663 }
|
|---|
| 751 | if (wnet and 1) <> 0 then
|
|---|
| 752 | begin
|
|---|
| 753 | chainet[wnet] := 29;
|
|---|
| 754 | Inc(wnet);
|
|---|
| 755 | end;
|
|---|
| 756 | { Now translate the string chainet into codewords }
|
|---|
| 757 | chainemc[mc_length] := 900;
|
|---|
| 758 | mc_length := mc_length + 1;
|
|---|
| 759 |
|
|---|
| 760 | j := 0;
|
|---|
| 761 | while j < wnet do
|
|---|
| 762 | begin
|
|---|
| 763 | cw_number := (30 * chainet[j]) + chainet[j + 1];
|
|---|
| 764 | chainemc[mc_length] := cw_number;
|
|---|
| 765 | mc_length := mc_length + 1;
|
|---|
| 766 | Inc(j, 2);
|
|---|
| 767 | end;
|
|---|
| 768 | end;
|
|---|
| 769 |
|
|---|
| 770 | { 671 }
|
|---|
| 771 | procedure byteprocess(var chainemc: TIntegerDynArray; var mc_length: Integer;
|
|---|
| 772 | ASource: PByte; start, _length, {%H-}block: Integer);
|
|---|
| 773 | var
|
|---|
| 774 | len : Integer;
|
|---|
| 775 | chunkLen : UInt64;
|
|---|
| 776 | mantisa : UInt64;
|
|---|
| 777 | total : UInt64;
|
|---|
| 778 | begin
|
|---|
| 779 | len := 0;
|
|---|
| 780 | //chunkLen := 0;
|
|---|
| 781 | //mantisa := 0;
|
|---|
| 782 | //total := 0;
|
|---|
| 783 |
|
|---|
| 784 | if (_length = 1) then
|
|---|
| 785 | begin
|
|---|
| 786 | chainemc[mc_length] := 913;
|
|---|
| 787 | Inc(mc_length);
|
|---|
| 788 | chainemc[mc_length] := ASource[start];
|
|---|
| 789 | Inc(mc_length);
|
|---|
| 790 | end
|
|---|
| 791 | else
|
|---|
| 792 | begin
|
|---|
| 793 | { select the switch for multiple of 6 bytes }
|
|---|
| 794 | if (_length mod 6 = 0) then
|
|---|
| 795 | begin
|
|---|
| 796 | chainemc[mc_length] := 924;
|
|---|
| 797 | Inc(mc_length);
|
|---|
| 798 | end
|
|---|
| 799 | else
|
|---|
| 800 | begin
|
|---|
| 801 | chainemc[mc_length] := 901;
|
|---|
| 802 | Inc(mc_length);
|
|---|
| 803 | end;
|
|---|
| 804 |
|
|---|
| 805 | while (len < _length) do
|
|---|
| 806 | begin
|
|---|
| 807 | chunkLen := _length - len;
|
|---|
| 808 | if (6 <= chunkLen) then { Take groups of 6 }
|
|---|
| 809 | begin
|
|---|
| 810 | chunkLen := 6;
|
|---|
| 811 | Inc(len, chunkLen);
|
|---|
| 812 | total := 0;
|
|---|
| 813 |
|
|---|
| 814 | while (chunkLen > 0) do
|
|---|
| 815 | begin
|
|---|
| 816 | Dec(chunkLen);
|
|---|
| 817 | mantisa := ASource[start];
|
|---|
| 818 | Inc(start);
|
|---|
| 819 | total := total or (mantisa shl UInt64(chunkLen * 8));
|
|---|
| 820 | end;
|
|---|
| 821 |
|
|---|
| 822 | chunkLen := 5;
|
|---|
| 823 |
|
|---|
| 824 | while (chunkLen > 0) do
|
|---|
| 825 | begin
|
|---|
| 826 | Dec(chunkLen);
|
|---|
| 827 | chainemc[mc_length + Int64(chunkLen)] := Integer(total mod 900);
|
|---|
| 828 | total := total div 900;
|
|---|
| 829 | end;
|
|---|
| 830 | Inc(mc_length, 5);
|
|---|
| 831 | end
|
|---|
| 832 | else { If it remain a group of less than 6 bytes }
|
|---|
| 833 | begin
|
|---|
| 834 | Inc(len, chunkLen);
|
|---|
| 835 | while (chunkLen > 0) do
|
|---|
| 836 | begin
|
|---|
| 837 | Dec(chunkLen);
|
|---|
| 838 | chainemc[mc_length] := ASource[start];
|
|---|
| 839 | Inc(mc_length);
|
|---|
| 840 | Inc(start);
|
|---|
| 841 | end;
|
|---|
| 842 | end;
|
|---|
| 843 | end;
|
|---|
| 844 | end;
|
|---|
| 845 | end;
|
|---|
| 846 |
|
|---|
| 847 | { 712 }
|
|---|
| 848 | procedure numbprocess(var chainemc: TIntegerDynArray; var mc_length: Integer;
|
|---|
| 849 | ASource: PChar; start, _length, {%H-}block: Integer);
|
|---|
| 850 | var
|
|---|
| 851 | j, loop, len, dum_length, diviseur, nombre : Integer;
|
|---|
| 852 | dummy : array[0..99] of Integer;
|
|---|
| 853 | chainemod: TCharDynArray = nil;
|
|---|
| 854 | chainemult: TCharDynArray = nil;
|
|---|
| 855 | temp: Char;
|
|---|
| 856 | P: PChar;
|
|---|
| 857 | begin
|
|---|
| 858 | SetLength(chainemod, 50);
|
|---|
| 859 | SetLength(chainemult, 100);
|
|---|
| 860 | strcpy(chainemod, '');
|
|---|
| 861 | for loop := 0 to 50 do
|
|---|
| 862 | dummy[loop] := 0;
|
|---|
| 863 |
|
|---|
| 864 | chainemc[mc_length] := 902;
|
|---|
| 865 | mc_length := mc_length + 1;
|
|---|
| 866 |
|
|---|
| 867 | j := 0;
|
|---|
| 868 | while(j < _length) do
|
|---|
| 869 | begin
|
|---|
| 870 | dum_length := 0;
|
|---|
| 871 | strcpy(chainemod, '');
|
|---|
| 872 | len := _length - j;
|
|---|
| 873 | if (len > 44) then len := 44;
|
|---|
| 874 | concat(chainemod, '1');
|
|---|
| 875 | for loop := 1 to len do
|
|---|
| 876 | begin
|
|---|
| 877 | P := @ASource[start + loop + j - 1];
|
|---|
| 878 | chainemod[loop] := P^;
|
|---|
| 879 | end;
|
|---|
| 880 | chainemod[len + 1] := #0;
|
|---|
| 881 |
|
|---|
| 882 | repeat
|
|---|
| 883 | diviseur := 900;
|
|---|
| 884 |
|
|---|
| 885 | { 877 - gosub Modulo }
|
|---|
| 886 | strcpy(chainemult, '');
|
|---|
| 887 | nombre := 0;
|
|---|
| 888 | while (strlen(chainemod) <> 0) do
|
|---|
| 889 | begin
|
|---|
| 890 | nombre := nombre * 10;
|
|---|
| 891 | Inc(nombre, ctoi(chainemod[0]));
|
|---|
| 892 | for loop := 0 to strlen(chainemod) - 1 do
|
|---|
| 893 | chainemod[loop] := chainemod[loop + 1];
|
|---|
| 894 |
|
|---|
| 895 | if (nombre < diviseur) then
|
|---|
| 896 | begin
|
|---|
| 897 | if (strlen(chainemult) <> 0) then concat(chainemult, '0');
|
|---|
| 898 | end
|
|---|
| 899 | else
|
|---|
| 900 | begin
|
|---|
| 901 | temp := Chr((nombre div diviseur) + Ord('0'));
|
|---|
| 902 | chainemult[strlen(chainemult) + 1] := #0;
|
|---|
| 903 | chainemult[strlen(chainemult)] := temp;
|
|---|
| 904 | end;
|
|---|
| 905 | nombre := nombre mod diviseur;
|
|---|
| 906 | end;
|
|---|
| 907 | diviseur := nombre;
|
|---|
| 908 | { return to 723 }
|
|---|
| 909 |
|
|---|
| 910 | for loop := dum_length downto 1 do
|
|---|
| 911 | dummy[loop] := dummy[loop - 1];
|
|---|
| 912 |
|
|---|
| 913 | dummy[0] := diviseur;
|
|---|
| 914 | Inc(dum_length);
|
|---|
| 915 | strcpy(PChar(chainemod), PChar(chainemult));
|
|---|
| 916 | until not (strlen(chainemult) <> 0);
|
|---|
| 917 |
|
|---|
| 918 | for loop := 0 to dum_length - 1 do
|
|---|
| 919 | begin
|
|---|
| 920 | chainemc[mc_length] := dummy[loop];
|
|---|
| 921 | mc_length := mc_length + 1;
|
|---|
| 922 | end;
|
|---|
| 923 | Inc(j, len);
|
|---|
| 924 | end;
|
|---|
| 925 | end;
|
|---|
| 926 |
|
|---|
| 927 | { 366 }
|
|---|
| 928 | function pdf417(ASymbol: PZintSymbol; ASource: PByte; ALength: Integer): Integer;
|
|---|
| 929 | var
|
|---|
| 930 | i, k, j, index_src, index_list, mode, len, loop, offset : Integer;
|
|---|
| 931 | mccorrection : array[0..519] of Integer;
|
|---|
| 932 | total, mc_length, c1, c2, c3, codeerr : Integer;
|
|---|
| 933 | chainemc: TIntegerDynArray = nil;
|
|---|
| 934 | dummy : array[0..34] of Integer;
|
|---|
| 935 | codebarre: TCharDynArray = nil;
|
|---|
| 936 | pattern: TCharDynArray = nil;
|
|---|
| 937 | list: TGlobalList;
|
|---|
| 938 | begin
|
|---|
| 939 | SetLength(chainemc, 2700);
|
|---|
| 940 | SetLength(codebarre, 140);
|
|---|
| 941 | SetLength(pattern, 580);
|
|---|
| 942 | codeerr := 0;
|
|---|
| 943 |
|
|---|
| 944 | { 456 }
|
|---|
| 945 | index_list := 0;
|
|---|
| 946 | index_src := 0;
|
|---|
| 947 |
|
|---|
| 948 | mode := GetMode(Chr(ASource[index_src]));
|
|---|
| 949 |
|
|---|
| 950 | for i := 0 to 999 do
|
|---|
| 951 | list[0, i] := 0;
|
|---|
| 952 |
|
|---|
| 953 | { 463 }
|
|---|
| 954 | repeat
|
|---|
| 955 | list[1, index_list] := mode;
|
|---|
| 956 | while ((list[1, index_list] = mode) and (index_src < ALength)) do
|
|---|
| 957 | begin
|
|---|
| 958 | Inc(list[0, index_list]);
|
|---|
| 959 | Inc(index_src);
|
|---|
| 960 | mode := GetMode(Chr(ASource[index_src]));
|
|---|
| 961 | end;
|
|---|
| 962 | Inc(index_list);
|
|---|
| 963 | until not (index_src < ALength);
|
|---|
| 964 |
|
|---|
| 965 | { 474 }
|
|---|
| 966 | pdfsmooth(index_list, list);
|
|---|
| 967 |
|
|---|
| 968 | { 541 - now compress the data }
|
|---|
| 969 | index_src := 0;
|
|---|
| 970 | mc_length := 0;
|
|---|
| 971 | if (ASymbol^.output_options and READER_INIT) <> 0 then
|
|---|
| 972 | begin
|
|---|
| 973 | chainemc[mc_length] := 921; { Reader Initialisation }
|
|---|
| 974 | Inc(mc_length);
|
|---|
| 975 | end;
|
|---|
| 976 | for i := 0 to index_list - 1 do
|
|---|
| 977 | begin
|
|---|
| 978 | case list[1, i] of
|
|---|
| 979 | TEX: { 547 - text mode }
|
|---|
| 980 | textprocess(chainemc, mc_length, PChar(ASource), index_src, list[0, i], i);
|
|---|
| 981 | BYT: { 670 - octet stream mode }
|
|---|
| 982 | byteprocess(chainemc, mc_length, ASource, index_src, list[0, i], i);
|
|---|
| 983 | NUM: { 712 - numeric mode }
|
|---|
| 984 | numbprocess(chainemc, mc_length, PChar(ASource), index_src, list[0, i], i);
|
|---|
| 985 | end;
|
|---|
| 986 | index_src := index_src + list[0, i];
|
|---|
| 987 | end;
|
|---|
| 988 |
|
|---|
| 989 | { 752 - Now take care of the number of CWs per row }
|
|---|
| 990 | if (Asymbol^.option_1 < 0) then
|
|---|
| 991 | begin
|
|---|
| 992 | ASymbol^.option_1 := 6;
|
|---|
| 993 | if (mc_length <= 863) then ASymbol^.option_1 := 5;
|
|---|
| 994 | if (mc_length <= 320) then ASymbol^.option_1 := 4;
|
|---|
| 995 | if (mc_length <= 160) then ASymbol^.option_1 := 3;
|
|---|
| 996 | if (mc_length <= 40) then ASymbol^.option_1 := 2;
|
|---|
| 997 | end;
|
|---|
| 998 | k := 1;
|
|---|
| 999 | for loop := 1 to ASymbol^.option_1 + 1 do
|
|---|
| 1000 | k := k * 2;
|
|---|
| 1001 |
|
|---|
| 1002 | len := mc_length;
|
|---|
| 1003 | if (ASymbol^.option_2 > 30) then ASymbol^.option_2 := 30;
|
|---|
| 1004 | if (ASymbol^.option_2 < 1) then
|
|---|
| 1005 | ASymbol^.option_2 := Trunc(0.5 + sqrt((len + k) / 3.0));
|
|---|
| 1006 |
|
|---|
| 1007 | if (((len + k) / ASymbol^.option_2) > 90) then
|
|---|
| 1008 | { stop the symbol from becoming too high }
|
|---|
| 1009 | ASymbol^.option_2 := ASymbol^.option_2 + 1;
|
|---|
| 1010 |
|
|---|
| 1011 | if (len + k > 928) then
|
|---|
| 1012 | begin
|
|---|
| 1013 | { Enforce maximum codeword limit }
|
|---|
| 1014 | result := 2; exit;
|
|---|
| 1015 | end;
|
|---|
| 1016 |
|
|---|
| 1017 | if (((len + k) / ASymbol^.option_2) > 90) then
|
|---|
| 1018 | begin
|
|---|
| 1019 | result := 4; exit;
|
|---|
| 1020 | end;
|
|---|
| 1021 |
|
|---|
| 1022 | { 781 - Padding calculation }
|
|---|
| 1023 | len := mc_length + 1 + k;
|
|---|
| 1024 | i := 0;
|
|---|
| 1025 | if ((len / ASymbol^.option_2) < 3) then
|
|---|
| 1026 | i := (ASymbol^.option_2 * 3) - len { A bar code must have at least three rows }
|
|---|
| 1027 | else
|
|---|
| 1028 | if ((len mod ASymbol^.option_2) > 0) then
|
|---|
| 1029 | i := ASymbol^.option_2 - len mod ASymbol^.option_2;
|
|---|
| 1030 |
|
|---|
| 1031 | { We add the padding }
|
|---|
| 1032 | while (i > 0) do
|
|---|
| 1033 | begin
|
|---|
| 1034 | chainemc[mc_length] := 900;
|
|---|
| 1035 | Inc(mc_length);
|
|---|
| 1036 | Dec(i);
|
|---|
| 1037 | end;
|
|---|
| 1038 | { we add the _length descriptor }
|
|---|
| 1039 | for i := mc_length downto 1 do
|
|---|
| 1040 | chainemc[i] := chainemc[i - 1];
|
|---|
| 1041 | chainemc[0] := mc_length + 1;
|
|---|
| 1042 | Inc(mc_length);
|
|---|
| 1043 |
|
|---|
| 1044 | { 796 - we now take care of the Reed Solomon codes }
|
|---|
| 1045 | case ASymbol^.option_1 of
|
|---|
| 1046 | 1: offset := 2;
|
|---|
| 1047 | 2: offset := 6;
|
|---|
| 1048 | 3: offset := 14;
|
|---|
| 1049 | 4: offset := 30;
|
|---|
| 1050 | 5: offset := 62;
|
|---|
| 1051 | 6: offset := 126;
|
|---|
| 1052 | 7: offset := 254;
|
|---|
| 1053 | 8: offset := 510;
|
|---|
| 1054 | else
|
|---|
| 1055 | offset := 0;
|
|---|
| 1056 | end;
|
|---|
| 1057 |
|
|---|
| 1058 | len := mc_length;
|
|---|
| 1059 | for loop := 0 to 519 do
|
|---|
| 1060 | mccorrection[loop] := 0;
|
|---|
| 1061 |
|
|---|
| 1062 | //total := 0;
|
|---|
| 1063 | for i := 0 to len - 1 do
|
|---|
| 1064 | begin
|
|---|
| 1065 | total := (chainemc[i] + mccorrection[k - 1]) mod 929;
|
|---|
| 1066 | for j := k - 1 downto 1 do
|
|---|
| 1067 | mccorrection[j] := (mccorrection[j - 1] + 929 - (total * coefrs[offset + j]) mod 929) mod 929;
|
|---|
| 1068 | j := 0;
|
|---|
| 1069 | mccorrection[0] := (929 - (total * coefrs[offset + j]) mod 929) mod 929;
|
|---|
| 1070 | end;
|
|---|
| 1071 |
|
|---|
| 1072 | { we add these codes to the string }
|
|---|
| 1073 | for i := k - 1 downto 0 do
|
|---|
| 1074 | begin
|
|---|
| 1075 | if mccorrection[i] <> 0 then
|
|---|
| 1076 | chainemc[mc_length] := 929 - mccorrection[i]
|
|---|
| 1077 | else
|
|---|
| 1078 | chainemc[mc_length] := 0;
|
|---|
| 1079 | Inc(mc_length);
|
|---|
| 1080 | end;
|
|---|
| 1081 |
|
|---|
| 1082 | { 818 - The CW string is finished }
|
|---|
| 1083 | c1 := (mc_length div ASymbol^.option_2 - 1) div 3;
|
|---|
| 1084 | c2 := ASymbol^.option_1 * 3 + (mc_length div ASymbol^.option_2 - 1) mod 3;
|
|---|
| 1085 | c3 := ASymbol^.option_2 - 1;
|
|---|
| 1086 |
|
|---|
| 1087 | { we now encode each row }
|
|---|
| 1088 | for i := 0 to (mc_length div ASymbol^.option_2) - 1 do
|
|---|
| 1089 | begin
|
|---|
| 1090 | for j := 0 to ASymbol^.option_2 - 1 do
|
|---|
| 1091 | dummy[j + 1] := chainemc[i * ASymbol^.option_2 + j];
|
|---|
| 1092 |
|
|---|
| 1093 | k := (i div 3) * 30;
|
|---|
| 1094 | case i mod 3 of
|
|---|
| 1095 | { follows this pattern from US Patent 5,243,655:
|
|---|
| 1096 | Row 0: L0 (row #, # of rows) R0 (row #, # of columns)
|
|---|
| 1097 | Row 1: L1 (row #, security level) R1 (row #, # of rows)
|
|---|
| 1098 | Row 2: L2 (row #, # of columns) R2 (row #, security level)
|
|---|
| 1099 | Row 3: L3 (row #, # of rows) R3 (row #, # of columns)
|
|---|
| 1100 | etc. }
|
|---|
| 1101 | 0:
|
|---|
| 1102 | begin
|
|---|
| 1103 | dummy[0] := k + c1;
|
|---|
| 1104 | dummy[ASymbol^.option_2 + 1] := k + c3;
|
|---|
| 1105 | end;
|
|---|
| 1106 | 1:
|
|---|
| 1107 | begin
|
|---|
| 1108 | dummy[0] := k + c2;
|
|---|
| 1109 | dummy[ASymbol^.option_2 + 1] := k + c1;
|
|---|
| 1110 | end;
|
|---|
| 1111 | 2:
|
|---|
| 1112 | begin
|
|---|
| 1113 | dummy[0] := k + c3;
|
|---|
| 1114 | dummy[ASymbol^.option_2 + 1] := k + c2;
|
|---|
| 1115 | end;
|
|---|
| 1116 | end;
|
|---|
| 1117 | strcpy(codebarre, '+*'); { Start with a start char and a separator }
|
|---|
| 1118 | if (ASymbol^.symbology = BARCODE_PDF417TRUNC) then
|
|---|
| 1119 | begin
|
|---|
| 1120 | { truncated - so same as before except knock off the last 5 chars }
|
|---|
| 1121 | for j := 0 to ASymbol^.option_2 do
|
|---|
| 1122 | begin
|
|---|
| 1123 | case i mod 3 of
|
|---|
| 1124 | 1: offset := 929;
|
|---|
| 1125 | 2: offset := 1858;
|
|---|
| 1126 | else
|
|---|
| 1127 | offset := 0;
|
|---|
| 1128 | end;
|
|---|
| 1129 | concat(codebarre[0], PChar(codagemc[offset + dummy[j]]));
|
|---|
| 1130 | concat(codebarre[0], '*');
|
|---|
| 1131 | end;
|
|---|
| 1132 | end
|
|---|
| 1133 | else
|
|---|
| 1134 | begin
|
|---|
| 1135 | { normal PDF417 symbol }
|
|---|
| 1136 | for j := 0 to ASymbol^.option_2 + 1 do
|
|---|
| 1137 | begin
|
|---|
| 1138 | case i mod 3 of
|
|---|
| 1139 | 1: offset := 929; { cluster(3) }
|
|---|
| 1140 | 2: offset := 1858; { cluster(6) }
|
|---|
| 1141 | else
|
|---|
| 1142 | offset := 0; { cluster(0) }
|
|---|
| 1143 | end;
|
|---|
| 1144 | concat(codebarre, PChar(codagemc[offset + dummy[j]]));
|
|---|
| 1145 | concat(codebarre, '*');
|
|---|
| 1146 | end;
|
|---|
| 1147 | concat(codebarre, '-');
|
|---|
| 1148 | end;
|
|---|
| 1149 |
|
|---|
| 1150 | strcpy(pattern, '');
|
|---|
| 1151 | for loop := 0 to strlen(codebarre) - 1 do
|
|---|
| 1152 | lookup(PChar(BRSET), PDFttf, codebarre[loop], pattern);
|
|---|
| 1153 |
|
|---|
| 1154 | for loop := 0 to strlen(pattern) - 1 do
|
|---|
| 1155 | if (pattern[loop] = '1') then set_module(ASymbol, i, loop);
|
|---|
| 1156 |
|
|---|
| 1157 | //if (symbol.height = 0) then
|
|---|
| 1158 | ASymbol^.row_height[i] := 3;
|
|---|
| 1159 | end;
|
|---|
| 1160 | ASymbol^.rows := (mc_length div ASymbol^.option_2);
|
|---|
| 1161 | ASymbol^.width := strlen(pattern);
|
|---|
| 1162 |
|
|---|
| 1163 | { 843 }
|
|---|
| 1164 | result := codeerr; exit;
|
|---|
| 1165 | end;
|
|---|
| 1166 |
|
|---|
| 1167 | { 345 }
|
|---|
| 1168 | function pdf417enc(ASymbol: PZintSymbol; ASource: PByte; ALength: Integer): Integer;
|
|---|
| 1169 | var
|
|---|
| 1170 | codeerr: Integer;
|
|---|
| 1171 | begin
|
|---|
| 1172 | Result := 0;
|
|---|
| 1173 |
|
|---|
| 1174 | if ((ASymbol^.option_1 < -1) or (ASymbol^.option_1 > 8)) then
|
|---|
| 1175 | begin
|
|---|
| 1176 | ASymbol^.SetErrorText('Security value out of range');
|
|---|
| 1177 | Asymbol^.option_1 := -1;
|
|---|
| 1178 | Result := WARN_INVALID_OPTION;
|
|---|
| 1179 | end;
|
|---|
| 1180 |
|
|---|
| 1181 | if ((ASymbol^.option_2 < 0) or (ASymbol^.option_2 > 30)) then
|
|---|
| 1182 | begin
|
|---|
| 1183 | ASymbol^.SetErrorText('Number of columns out of range (max 30)');
|
|---|
| 1184 | ASymbol^.option_2 := 0;
|
|---|
| 1185 | Result := WARN_INVALID_OPTION;
|
|---|
| 1186 | end;
|
|---|
| 1187 |
|
|---|
| 1188 | { 349 }
|
|---|
| 1189 | codeerr := pdf417(ASymbol, ASource, ALength);
|
|---|
| 1190 |
|
|---|
| 1191 | { 352 }
|
|---|
| 1192 | if (codeerr <> 0) then
|
|---|
| 1193 | begin
|
|---|
| 1194 | case codeerr of
|
|---|
| 1195 | 1:
|
|---|
| 1196 | begin
|
|---|
| 1197 | ASymbol^.SetErrorText('No such file or file unreadable');
|
|---|
| 1198 | Result := ERROR_INVALID_OPTION;
|
|---|
| 1199 | end;
|
|---|
| 1200 | 2:
|
|---|
| 1201 | begin
|
|---|
| 1202 | ASymbol^.SetErrorText('Input string too long');
|
|---|
| 1203 | Result := ERROR_TOO_LONG;
|
|---|
| 1204 | end;
|
|---|
| 1205 | 3:
|
|---|
| 1206 | begin
|
|---|
| 1207 | ASymbol^.SetErrorText('Number of codewords per row too small');
|
|---|
| 1208 | Result := WARN_INVALID_OPTION;
|
|---|
| 1209 | end;
|
|---|
| 1210 | 4:
|
|---|
| 1211 | begin
|
|---|
| 1212 | ASymbol^.SetErrorText('Data too long for specified number of columns');
|
|---|
| 1213 | Result := ERROR_TOO_LONG;
|
|---|
| 1214 | end;
|
|---|
| 1215 | else
|
|---|
| 1216 | ASymbol^.SetErrorText('Something strange happened');
|
|---|
| 1217 | Result := ERROR_ENCODING_PROBLEM;
|
|---|
| 1218 | end;
|
|---|
| 1219 | end;
|
|---|
| 1220 | end;
|
|---|
| 1221 |
|
|---|
| 1222 | { Like PDF417 only much smaller! }
|
|---|
| 1223 | function micro_pdf417(ASymbol: PZintSymbol; ASource: PByte; ALength: Integer): Integer;
|
|---|
| 1224 | var
|
|---|
| 1225 | i, k, j, index_src, index_list, mode, len, offset : Integer;
|
|---|
| 1226 | mccorrection : array[0..49] of Integer;
|
|---|
| 1227 | total, mc_length, codeerr : Integer;
|
|---|
| 1228 | chainemc: TIntegerDynArray = nil;
|
|---|
| 1229 | dummy : array[0..5] of Integer;
|
|---|
| 1230 | codebarre: TCharDynArray = nil;
|
|---|
| 1231 | pattern: TCharDynArray = nil;
|
|---|
| 1232 | variant, LeftRAPStart, CentreRAPStart, RightRAPStart, StartCluster : Integer;
|
|---|
| 1233 | LeftRAP, CentreRAP, RightRAP, Cluster, writer, flip, loop : Integer;
|
|---|
| 1234 | list: TGlobalList;
|
|---|
| 1235 | begin
|
|---|
| 1236 | SetLength(chainemc, 2700);
|
|---|
| 1237 | SetLength(codebarre, 100);
|
|---|
| 1238 | SetLength(pattern, 580);
|
|---|
| 1239 |
|
|---|
| 1240 | { Encoding starts out the same as PDF417, so use the same code }
|
|---|
| 1241 | codeerr := 0;
|
|---|
| 1242 |
|
|---|
| 1243 | { 456 }
|
|---|
| 1244 | index_list := 0;
|
|---|
| 1245 | index_src := 0;
|
|---|
| 1246 |
|
|---|
| 1247 | mode := GetMode(Chr(ASource[index_src]));
|
|---|
| 1248 |
|
|---|
| 1249 | for i := 0 to 999 do
|
|---|
| 1250 | list[0, i] := 0;
|
|---|
| 1251 |
|
|---|
| 1252 | { 463 }
|
|---|
| 1253 | repeat
|
|---|
| 1254 | list[1, index_list] := mode;
|
|---|
| 1255 | while ((list[1, index_list] = mode) and (index_src < ALength)) do
|
|---|
| 1256 | begin
|
|---|
| 1257 | Inc(list[0, index_list]);
|
|---|
| 1258 | Inc(index_src);
|
|---|
| 1259 | mode := GetMode(Chr(ASource[index_src]));
|
|---|
| 1260 | end;
|
|---|
| 1261 | Inc(index_list);
|
|---|
| 1262 | until not (index_src < ALength);
|
|---|
| 1263 |
|
|---|
| 1264 | { 474 }
|
|---|
| 1265 | pdfsmooth(index_list, list);
|
|---|
| 1266 |
|
|---|
| 1267 | { 541 - now compress the data }
|
|---|
| 1268 | index_src := 0;
|
|---|
| 1269 | mc_length := 0;
|
|---|
| 1270 | if (ASymbol^.output_options and READER_INIT) <> 0 then
|
|---|
| 1271 | begin
|
|---|
| 1272 | chainemc[mc_length] := 921; { Reader Initialisation }
|
|---|
| 1273 | Inc(mc_length);
|
|---|
| 1274 | end;
|
|---|
| 1275 | for i := 0 to index_list - 1 do
|
|---|
| 1276 | begin
|
|---|
| 1277 | case list[1, i] of
|
|---|
| 1278 | TEX: { 547 - text mode }
|
|---|
| 1279 | textprocess(chainemc, mc_length, PChar(ASource), index_src, list[0, i], i);
|
|---|
| 1280 | BYT: { 670 - octet stream mode }
|
|---|
| 1281 | byteprocess(chainemc, mc_length, ASource, index_src, list[0, i], i);
|
|---|
| 1282 | NUM: { 712 - numeric mode }
|
|---|
| 1283 | numbprocess(chainemc, mc_length, PChar(ASource), index_src, list[0, i], i);
|
|---|
| 1284 | end;
|
|---|
| 1285 | index_src := index_src + list[0, i];
|
|---|
| 1286 | end;
|
|---|
| 1287 |
|
|---|
| 1288 | { This is where it all changes! }
|
|---|
| 1289 |
|
|---|
| 1290 | if (mc_length > 126) then
|
|---|
| 1291 | begin
|
|---|
| 1292 | ASymbol^.SetErrorText('Input data too long.');
|
|---|
| 1293 | result := ERROR_TOO_LONG;
|
|---|
| 1294 | exit;
|
|---|
| 1295 | end;
|
|---|
| 1296 |
|
|---|
| 1297 | if (ASymbol^.option_2 > 4) then
|
|---|
| 1298 | begin
|
|---|
| 1299 | ASymbol^.SetErrorText('Specified width out of range');
|
|---|
| 1300 | ASymbol^.option_2 := 0;
|
|---|
| 1301 | codeerr := WARN_INVALID_OPTION;
|
|---|
| 1302 | end;
|
|---|
| 1303 |
|
|---|
| 1304 | { Now figure out which variant of the symbol to use and load values accordingly }
|
|---|
| 1305 |
|
|---|
| 1306 | variant := 0;
|
|---|
| 1307 |
|
|---|
| 1308 | if ((ASymbol^.option_2 = 1) and (mc_length > 20)) then
|
|---|
| 1309 | begin
|
|---|
| 1310 | { the user specified 1 column but the data doesn't fit - go to automatic }
|
|---|
| 1311 | ASymbol^.option_2 := 0;
|
|---|
| 1312 | ASymbol^.SetErrorText('Specified symbol size too small for data');
|
|---|
| 1313 | codeerr := WARN_INVALID_OPTION;
|
|---|
| 1314 | end;
|
|---|
| 1315 |
|
|---|
| 1316 | if ((ASymbol^.option_2 = 2) and (mc_length > 37)) then
|
|---|
| 1317 | begin
|
|---|
| 1318 | { the user specified 2 columns but the data doesn't fit - go to automatic }
|
|---|
| 1319 | ASymbol^.option_2 := 0;
|
|---|
| 1320 | ASymbol^.SetErrorText('Specified symbol size too small for data');
|
|---|
| 1321 | codeerr := WARN_INVALID_OPTION;
|
|---|
| 1322 | end;
|
|---|
| 1323 |
|
|---|
| 1324 | if ((ASymbol^.option_2 = 3) and (mc_length > 82)) then
|
|---|
| 1325 | begin
|
|---|
| 1326 | { the user specified 3 columns but the data doesn't fit - go to automatic }
|
|---|
| 1327 | ASymbol^.option_2 := 0;
|
|---|
| 1328 | ASymbol^.SetErrorText('Specified symbol size too small for data');
|
|---|
| 1329 | codeerr := WARN_INVALID_OPTION;
|
|---|
| 1330 | end;
|
|---|
| 1331 |
|
|---|
| 1332 | if (ASymbol^.option_2 = 1) then
|
|---|
| 1333 | begin
|
|---|
| 1334 | { the user specified 1 column and the data does fit }
|
|---|
| 1335 | variant := 6;
|
|---|
| 1336 | if (mc_length <= 16) then variant := 5;
|
|---|
| 1337 | if (mc_length <= 12) then variant := 4;
|
|---|
| 1338 | if (mc_length <= 10) then variant := 3;
|
|---|
| 1339 | if (mc_length <= 7) then variant := 2;
|
|---|
| 1340 | if (mc_length <= 4) then variant := 1;
|
|---|
| 1341 | end;
|
|---|
| 1342 |
|
|---|
| 1343 | if (ASymbol^.option_2 = 2) then
|
|---|
| 1344 | begin
|
|---|
| 1345 | { the user specified 2 columns and the data does fit }
|
|---|
| 1346 | variant := 13;
|
|---|
| 1347 | if (mc_length <= 33) then variant := 12;
|
|---|
| 1348 | if (mc_length <= 29) then variant := 11;
|
|---|
| 1349 | if (mc_length <= 24) then variant := 10;
|
|---|
| 1350 | if (mc_length <= 19) then variant := 9;
|
|---|
| 1351 | if (mc_length <= 13) then variant := 8;
|
|---|
| 1352 | if (mc_length <= 8) then variant := 7;
|
|---|
| 1353 | end;
|
|---|
| 1354 |
|
|---|
| 1355 | if (ASymbol^.option_2 = 3) then
|
|---|
| 1356 | begin
|
|---|
| 1357 | { the user specified 3 columns and the data does fit }
|
|---|
| 1358 | variant := 23;
|
|---|
| 1359 | if (mc_length <= 70) then variant := 22;
|
|---|
| 1360 | if (mc_length <= 58) then variant := 21;
|
|---|
| 1361 | if (mc_length <= 46) then variant := 20;
|
|---|
| 1362 | if (mc_length <= 34) then variant := 19;
|
|---|
| 1363 | if (mc_length <= 24) then variant := 18;
|
|---|
| 1364 | if (mc_length <= 18) then variant := 17;
|
|---|
| 1365 | if (mc_length <= 14) then variant := 16;
|
|---|
| 1366 | if (mc_length <= 10) then variant := 15;
|
|---|
| 1367 | if (mc_length <= 6) then variant := 14;
|
|---|
| 1368 | end;
|
|---|
| 1369 |
|
|---|
| 1370 | if (ASymbol^.option_2 = 4) then
|
|---|
| 1371 | begin
|
|---|
| 1372 | { the user specified 4 columns and the data does fit }
|
|---|
| 1373 | variant := 34;
|
|---|
| 1374 | if (mc_length <= 108) then variant := 33;
|
|---|
| 1375 | if (mc_length <= 90) then variant := 32;
|
|---|
| 1376 | if (mc_length <= 72) then variant := 31;
|
|---|
| 1377 | if (mc_length <= 54) then variant := 30;
|
|---|
| 1378 | if (mc_length <= 39) then variant := 29;
|
|---|
| 1379 | if (mc_length <= 30) then variant := 28;
|
|---|
| 1380 | if (mc_length <= 24) then variant := 27;
|
|---|
| 1381 | if (mc_length <= 18) then variant := 26;
|
|---|
| 1382 | if (mc_length <= 12) then variant := 25;
|
|---|
| 1383 | if (mc_length <= 8) then variant := 24;
|
|---|
| 1384 | end;
|
|---|
| 1385 |
|
|---|
| 1386 | if (variant = 0) then
|
|---|
| 1387 | begin
|
|---|
| 1388 | { Zint can choose automatically from all available variations }
|
|---|
| 1389 | for i := 27 downto 0 do
|
|---|
| 1390 | begin
|
|---|
| 1391 | if (MicroAutosize[i] >= mc_length) then
|
|---|
| 1392 | variant := MicroAutosize[i + 28];
|
|---|
| 1393 | end;
|
|---|
| 1394 | end;
|
|---|
| 1395 |
|
|---|
| 1396 | { Now we have the variant we can load the data }
|
|---|
| 1397 | Dec(variant);
|
|---|
| 1398 | ASymbol^.option_2 := MicroVariants[variant]; { columns }
|
|---|
| 1399 | ASymbol^.rows := MicroVariants[variant + 34]; { rows }
|
|---|
| 1400 | k := MicroVariants[variant + 68]; { number of EC CWs }
|
|---|
| 1401 | len := (ASymbol^.option_2 * ASymbol^.rows) - k; { number of non-EC CWs }
|
|---|
| 1402 | i := len - mc_length; { amount of padding required }
|
|---|
| 1403 | offset := MicroVariants[variant + 102]; { coefficient offset }
|
|---|
| 1404 |
|
|---|
| 1405 | { We add the padding }
|
|---|
| 1406 | while (i > 0) do
|
|---|
| 1407 | begin
|
|---|
| 1408 | chainemc[mc_length] := 900;
|
|---|
| 1409 | Inc(mc_length);
|
|---|
| 1410 | Dec(i);
|
|---|
| 1411 | end;
|
|---|
| 1412 |
|
|---|
| 1413 | { Reed-Solomon error correction }
|
|---|
| 1414 | len := mc_length;
|
|---|
| 1415 | for loop := 0 to 49 do
|
|---|
| 1416 | mccorrection[loop] := 0;
|
|---|
| 1417 |
|
|---|
| 1418 | for i := 0 to len - 1 do
|
|---|
| 1419 | begin
|
|---|
| 1420 | total := (chainemc[i] + mccorrection[k - 1]) mod 929;
|
|---|
| 1421 | for j := k - 1 downto 0 do
|
|---|
| 1422 | begin
|
|---|
| 1423 | if (j = 0) then
|
|---|
| 1424 | mccorrection[j] := (929 - (total * Microcoeffs[offset + j]) mod 929) mod 929
|
|---|
| 1425 | else
|
|---|
| 1426 | mccorrection[j] := (mccorrection[j - 1] + 929 - (total * Microcoeffs[offset + j]) mod 929) mod 929;
|
|---|
| 1427 | end;
|
|---|
| 1428 | end;
|
|---|
| 1429 |
|
|---|
| 1430 | for j := 0 to k - 1 do
|
|---|
| 1431 | if (mccorrection[j] <> 0) then mccorrection[j] := 929 - mccorrection[j];
|
|---|
| 1432 |
|
|---|
| 1433 | { we add these codes to the string }
|
|---|
| 1434 | for i := k - 1 downto 0 do
|
|---|
| 1435 | begin
|
|---|
| 1436 | chainemc[mc_length] := mccorrection[i];
|
|---|
| 1437 | Inc(mc_length);
|
|---|
| 1438 | end;
|
|---|
| 1439 |
|
|---|
| 1440 | { Now get the RAP (Row Address Pattern) start values }
|
|---|
| 1441 | LeftRAPStart := RAPTable[variant];
|
|---|
| 1442 | CentreRAPStart := RAPTable[variant + 34];
|
|---|
| 1443 | RightRAPStart := RAPTable[variant + 68];
|
|---|
| 1444 | StartCluster := RAPTable[variant + 102] div 3;
|
|---|
| 1445 |
|
|---|
| 1446 | { That's all values loaded, get on with the encoding }
|
|---|
| 1447 |
|
|---|
| 1448 | LeftRAP := LeftRAPStart;
|
|---|
| 1449 | CentreRAP := CentreRAPStart;
|
|---|
| 1450 | RightRAP := RightRAPStart;
|
|---|
| 1451 | Cluster := StartCluster; { Cluster can be 0, 1 or 2 for Cluster(0), Cluster(3) and Cluster(6) }
|
|---|
| 1452 |
|
|---|
| 1453 | for i := 0 to ASymbol^.rows - 1 do
|
|---|
| 1454 | begin
|
|---|
| 1455 | strcpy(codebarre, '');
|
|---|
| 1456 | offset := 929 * Cluster;
|
|---|
| 1457 | for j := 0 to 4 do
|
|---|
| 1458 | dummy[j] := 0;
|
|---|
| 1459 |
|
|---|
| 1460 | for j := 0 to ASymbol^.option_2 - 1 do
|
|---|
| 1461 | dummy[j + 1] := chainemc[i * ASymbol^.option_2 + j];
|
|---|
| 1462 |
|
|---|
| 1463 | { Copy the data into codebarre }
|
|---|
| 1464 | concat(codebarre, PChar(RAPLR[LeftRAP]));
|
|---|
| 1465 | concat(codebarre, '1');
|
|---|
| 1466 | concat(codebarre, PChar(codagemc[offset + dummy[1]]));
|
|---|
| 1467 | concat(codebarre, '1');
|
|---|
| 1468 | if (ASymbol^.option_2 = 3) then
|
|---|
| 1469 | concat(codebarre, PChar(RAPC[CentreRAP]));
|
|---|
| 1470 |
|
|---|
| 1471 | if (ASymbol^.option_2 >= 2) then
|
|---|
| 1472 | begin
|
|---|
| 1473 | concat(codebarre, '1');
|
|---|
| 1474 | concat(codebarre, PChar(codagemc[offset + dummy[2]]));
|
|---|
| 1475 | concat(codebarre, '1');
|
|---|
| 1476 | end;
|
|---|
| 1477 | if (ASymbol^.option_2 = 4) then
|
|---|
| 1478 | concat(codebarre, PChar(RAPC[CentreRAP]));
|
|---|
| 1479 |
|
|---|
| 1480 | if (ASymbol^.option_2 >= 3) then
|
|---|
| 1481 | begin
|
|---|
| 1482 | concat(codebarre, '1');
|
|---|
| 1483 | concat(codebarre, PChar(codagemc[offset + dummy[3]]));
|
|---|
| 1484 | concat(codebarre, '1');
|
|---|
| 1485 | end;
|
|---|
| 1486 | if (ASymbol^.option_2 = 4) then
|
|---|
| 1487 | begin
|
|---|
| 1488 | concat(codebarre, '1');
|
|---|
| 1489 | concat(codebarre, PChar(codagemc[offset + dummy[4]]));
|
|---|
| 1490 | concat(codebarre, '1');
|
|---|
| 1491 | end;
|
|---|
| 1492 | concat(codebarre, PChar(RAPLR[RightRAP]));
|
|---|
| 1493 | concat(codebarre, '1'); { stop }
|
|---|
| 1494 |
|
|---|
| 1495 | { Now codebarre is a mixture of letters and numbers }
|
|---|
| 1496 |
|
|---|
| 1497 | writer := 0;
|
|---|
| 1498 | flip := 1;
|
|---|
| 1499 | strcpy(pattern, '');
|
|---|
| 1500 | for loop := 0 to strlen(codebarre) - 1 do
|
|---|
| 1501 | begin
|
|---|
| 1502 | if ((codebarre[loop] >= '0') and (codebarre[loop] <= '9')) then
|
|---|
| 1503 | begin
|
|---|
| 1504 | for k := 0 to ctoi(codebarre[loop]) - 1 do
|
|---|
| 1505 | begin
|
|---|
| 1506 | if (flip = 0) then
|
|---|
| 1507 | pattern[writer] := '0'
|
|---|
| 1508 | else
|
|---|
| 1509 | pattern[writer] := '1';
|
|---|
| 1510 | Inc(writer);
|
|---|
| 1511 | end;
|
|---|
| 1512 | pattern[writer] := #0;
|
|---|
| 1513 | if (flip = 0) then
|
|---|
| 1514 | flip := 1
|
|---|
| 1515 | else
|
|---|
| 1516 | flip := 0;
|
|---|
| 1517 | end
|
|---|
| 1518 | else
|
|---|
| 1519 | begin
|
|---|
| 1520 | lookup(PChar(BRSET), PDFttf, codebarre[loop], pattern);
|
|---|
| 1521 | Inc(writer, 5);
|
|---|
| 1522 | end;
|
|---|
| 1523 | end;
|
|---|
| 1524 | ASymbol^.width := writer;
|
|---|
| 1525 |
|
|---|
| 1526 | { so now pattern[] holds the string of '1's and '0's. - copy this to the symbol }
|
|---|
| 1527 | for loop := 0 to strlen(pattern) - 1 do
|
|---|
| 1528 | if (pattern[loop] = '1') then set_module(ASymbol, i, loop);
|
|---|
| 1529 |
|
|---|
| 1530 | Asymbol^.row_height[i] := 2;
|
|---|
| 1531 |
|
|---|
| 1532 | { Set up RAPs and Cluster for next row }
|
|---|
| 1533 | Inc(LeftRAP);
|
|---|
| 1534 | Inc(CentreRAP);
|
|---|
| 1535 | Inc(RightRAP);
|
|---|
| 1536 | Inc(Cluster);
|
|---|
| 1537 |
|
|---|
| 1538 | if (LeftRAP = 53) then
|
|---|
| 1539 | LeftRAP := 1;
|
|---|
| 1540 |
|
|---|
| 1541 | if (CentreRAP = 53) then
|
|---|
| 1542 | CentreRAP := 1;
|
|---|
| 1543 |
|
|---|
| 1544 | if (RightRAP = 53) then
|
|---|
| 1545 | RightRAP := 1;
|
|---|
| 1546 |
|
|---|
| 1547 | if (Cluster = 3) then
|
|---|
| 1548 | Cluster := 0;
|
|---|
| 1549 | end;
|
|---|
| 1550 |
|
|---|
| 1551 | Result := codeerr;
|
|---|
| 1552 | end;
|
|---|
| 1553 |
|
|---|
| 1554 | end.
|
|---|
| 1555 |
|
|---|