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