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