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