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