Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
BC_PDF417ErrorCorrection.cpp
Go to the documentation of this file.
1// Copyright 2014 The PDFium Authors
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 <stdint.h>
26
27#include "core/fxcrt/data_vector.h"
28
29namespace {
30
31const uint16_t EC_LEVEL_0_COEFFICIENTS[2] = {27, 917};
32const uint16_t EC_LEVEL_1_COEFFICIENTS[4] = {522, 568, 723, 809};
33const uint16_t EC_LEVEL_2_COEFFICIENTS[8] = {237, 308, 436, 284,
34 646, 653, 428, 379};
35
36const 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
40const 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
45const 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
52const 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
63const 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
83const 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
120const 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
129 int32_t errorCorrectionLevel) {
130 if (errorCorrectionLevel < 0 || errorCorrectionLevel > 8)
131 return -1;
132 return 1 << (errorCorrectionLevel + 1);
133}
134
135// static
136absl::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 absl::nullopt;
142
143 DataVector<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}
static int32_t GetErrorCorrectionCodewordCount(int32_t errorCorrectionLevel)