8
9
10
11
12
13
14
15
16
17
18
19
20
21
23#include "fxbarcode/pdf417/BC_PDF417ErrorCorrection.h"
29#include "core/fxcrt/data_vector.h"
30#include "core/fxcrt/span.h"
34const uint16_t EC_LEVEL_0_COEFFICIENTS[2] = {27, 917};
35const uint16_t EC_LEVEL_1_COEFFICIENTS[4] = {522, 568, 723, 809};
36const uint16_t EC_LEVEL_2_COEFFICIENTS[8] = {237, 308, 436, 284,
39const uint16_t EC_LEVEL_3_COEFFICIENTS[16] = {274, 562, 232, 755, 599, 524,
40 801, 132, 295, 116, 442, 428,
43const uint16_t EC_LEVEL_4_COEFFICIENTS[32] = {
44 361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677,
45 742, 687, 284, 193, 517, 273, 494, 263, 147, 593, 800,
46 571, 320, 803, 133, 231, 390, 685, 330, 63, 410};
48const uint16_t EC_LEVEL_5_COEFFICIENTS[64] = {
49 539, 422, 6, 93, 862, 771, 453, 106, 610, 287, 107, 505, 733,
50 877, 381, 612, 723, 476, 462, 172, 430, 609, 858, 822, 543, 376,
51 511, 400, 672, 762, 283, 184, 440, 35, 519, 31, 460, 594, 225,
52 535, 517, 352, 605, 158, 651, 201, 488, 502, 648, 733, 717, 83,
53 404, 97, 280, 771, 840, 629, 4, 381, 843, 623, 264, 543};
55const uint16_t EC_LEVEL_6_COEFFICIENTS[128] = {
56 521, 310, 864, 547, 858, 580, 296, 379, 53, 779, 897, 444, 400, 925, 749,
57 415, 822, 93, 217, 208, 928, 244, 583, 620, 246, 148, 447, 631, 292, 908,
58 490, 704, 516, 258, 457, 907, 594, 723, 674, 292, 272, 96, 684, 432, 686,
59 606, 860, 569, 193, 219, 129, 186, 236, 287, 192, 775, 278, 173, 40, 379,
60 712, 463, 646, 776, 171, 491, 297, 763, 156, 732, 95, 270, 447, 90, 507,
61 48, 228, 821, 808, 898, 784, 663, 627, 378, 382, 262, 380, 602, 754, 336,
62 89, 614, 87, 432, 670, 616, 157, 374, 242, 726, 600, 269, 375, 898, 845,
63 454, 354, 130, 814, 587, 804, 34, 211, 330, 539, 297, 827, 865, 37, 517,
64 834, 315, 550, 86, 801, 4, 108, 539};
66const uint16_t EC_LEVEL_7_COEFFICIENTS[256] = {
67 524, 894, 75, 766, 882, 857, 74, 204, 82, 586, 708, 250, 905, 786, 138,
68 720, 858, 194, 311, 913, 275, 190, 375, 850, 438, 733, 194, 280, 201, 280,
69 828, 757, 710, 814, 919, 89, 68, 569, 11, 204, 796, 605, 540, 913, 801,
70 700, 799, 137, 439, 418, 592, 668, 353, 859, 370, 694, 325, 240, 216, 257,
71 284, 549, 209, 884, 315, 70, 329, 793, 490, 274, 877, 162, 749, 812, 684,
72 461, 334, 376, 849, 521, 307, 291, 803, 712, 19, 358, 399, 908, 103, 511,
73 51, 8, 517, 225, 289, 470, 637, 731, 66, 255, 917, 269, 463, 830, 730,
74 433, 848, 585, 136, 538, 906, 90, 2, 290, 743, 199, 655, 903, 329, 49,
75 802, 580, 355, 588, 188, 462, 10, 134, 628, 320, 479, 130, 739, 71, 263,
76 318, 374, 601, 192, 605, 142, 673, 687, 234, 722, 384, 177, 752, 607, 640,
77 455, 193, 689, 707, 805, 641, 48, 60, 732, 621, 895, 544, 261, 852, 655,
78 309, 697, 755, 756, 60, 231, 773, 434, 421, 726, 528, 503, 118, 49, 795,
79 32, 144, 500, 238, 836, 394, 280, 566, 319, 9, 647, 550, 73, 914, 342,
80 126, 32, 681, 331, 792, 620, 60, 609, 441, 180, 791, 893, 754, 605, 383,
81 228, 749, 760, 213, 54, 297, 134, 54, 834, 299, 922, 191, 910, 532, 609,
82 829, 189, 20, 167, 29, 872, 449, 83, 402, 41, 656, 505, 579, 481, 173,
83 404, 251, 688, 95, 497, 555, 642, 543, 307, 159, 924, 558, 648, 55, 497,
86const uint16_t EC_LEVEL_8_COEFFICIENTS[512] = {
87 352, 77, 373, 504, 35, 599, 428, 207, 409, 574, 118, 498, 285, 380, 350,
88 492, 197, 265, 920, 155, 914, 299, 229, 643, 294, 871, 306, 88, 87, 193,
89 352, 781, 846, 75, 327, 520, 435, 543, 203, 666, 249, 346, 781, 621, 640,
90 268, 794, 534, 539, 781, 408, 390, 644, 102, 476, 499, 290, 632, 545, 37,
91 858, 916, 552, 41, 542, 289, 122, 272, 383, 800, 485, 98, 752, 472, 761,
92 107, 784, 860, 658, 741, 290, 204, 681, 407, 855, 85, 99, 62, 482, 180,
93 20, 297, 451, 593, 913, 142, 808, 684, 287, 536, 561, 76, 653, 899, 729,
94 567, 744, 390, 513, 192, 516, 258, 240, 518, 794, 395, 768, 848, 51, 610,
95 384, 168, 190, 826, 328, 596, 786, 303, 570, 381, 415, 641, 156, 237, 151,
96 429, 531, 207, 676, 710, 89, 168, 304, 402, 40, 708, 575, 162, 864, 229,
97 65, 861, 841, 512, 164, 477, 221, 92, 358, 785, 288, 357, 850, 836, 827,
98 736, 707, 94, 8, 494, 114, 521, 2, 499, 851, 543, 152, 729, 771, 95,
99 248, 361, 578, 323, 856, 797, 289, 51, 684, 466, 533, 820, 669, 45, 902,
100 452, 167, 342, 244, 173, 35, 463, 651, 51, 699, 591, 452, 578, 37, 124,
101 298, 332, 552, 43, 427, 119, 662, 777, 475, 850, 764, 364, 578, 911, 283,
102 711, 472, 420, 245, 288, 594, 394, 511, 327, 589, 777, 699, 688, 43, 408,
103 842, 383, 721, 521, 560, 644, 714, 559, 62, 145, 873, 663, 713, 159, 672,
104 729, 624, 59, 193, 417, 158, 209, 563, 564, 343, 693, 109, 608, 563, 365,
105 181, 772, 677, 310, 248, 353, 708, 410, 579, 870, 617, 841, 632, 860, 289,
106 536, 35, 777, 618, 586, 424, 833, 77, 597, 346, 269, 757, 632, 695, 751,
107 331, 247, 184, 45, 787, 680, 18, 66, 407, 369, 54, 492, 228, 613, 830,
108 922, 437, 519, 644, 905, 789, 420, 305, 441, 207, 300, 892, 827, 141, 537,
109 381, 662, 513, 56, 252, 341, 242, 797, 838, 837, 720, 224, 307, 631, 61,
110 87, 560, 310, 756, 665, 397, 808, 851, 309, 473, 795, 378, 31, 647, 915,
111 459, 806, 590, 731, 425, 216, 548, 249, 321, 881, 699, 535, 673, 782, 210,
112 815, 905, 303, 843, 922, 281, 73, 469, 791, 660, 162, 498, 308, 155, 422,
113 907, 817, 187, 62, 16, 425, 535, 336, 286, 437, 375, 273, 610, 296, 183,
114 923, 116, 667, 751, 353, 62, 366, 691, 379, 687, 842, 37, 357, 720, 742,
115 330, 5, 39, 923, 311, 424, 242, 749, 321, 54, 669, 316, 342, 299, 534,
116 105, 667, 488, 640, 672, 576, 540, 316, 486, 721, 610, 46, 656, 447, 171,
117 616, 464, 190, 531, 297, 321, 762, 752, 533, 175, 134, 14, 381, 433, 717,
118 45, 111, 20, 596, 284, 736, 138, 646, 411, 877, 669, 141, 919, 45, 780,
119 407, 164, 332, 899, 165, 726, 600, 325, 498, 655, 357, 752, 768, 223, 849,
120 647, 63, 310, 863, 251, 366, 304, 282, 738, 675, 410, 389, 244, 31, 121,
123constexpr std::array<pdfium::span<
const uint16_t>, 9> EC_COEFFICIENTS = {
124 {EC_LEVEL_0_COEFFICIENTS, EC_LEVEL_1_COEFFICIENTS, EC_LEVEL_2_COEFFICIENTS,
125 EC_LEVEL_3_COEFFICIENTS, EC_LEVEL_4_COEFFICIENTS, EC_LEVEL_5_COEFFICIENTS,
126 EC_LEVEL_6_COEFFICIENTS, EC_LEVEL_7_COEFFICIENTS,
127 EC_LEVEL_8_COEFFICIENTS}};
133 int32_t errorCorrectionLevel) {
134 if (errorCorrectionLevel < 0 || errorCorrectionLevel > 8)
136 return 1 << (errorCorrectionLevel + 1);
142 int32_t errorCorrectionLevel) {
147 DataVector<
wchar_t> ech(k);
148 size_t sld = dataCodewords.GetLength();
149 for (size_t i = 0; i < sld; i++) {
150 int32_t t1 = (dataCodewords[i] + ech[k - 1]) % 929;
153 for (int32_t j = k - 1; j >= 1; j--) {
154 t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][j]) % 929;
156 ech[j] = (
wchar_t)((ech[j - 1] + t3) % 929);
158 t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][0]) % 929;
160 ech[0] = (
wchar_t)(t3 % 929);
164 for (int32_t j = k - 1; j >= 0; j--) {
166 ech[j] =
static_cast<
wchar_t>(929) - ech[j];
static std::optional< WideString > GenerateErrorCorrection(const WideString &dataCodewords, int32_t errorCorrectionLevel)
static int32_t GetErrorCorrectionCodewordCount(int32_t errorCorrectionLevel)
fxcrt::WideString WideString