• 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 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