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