blob: cae0d54c7c2b3c027585b81428be3fd7f752b574 [file] [log] [blame]
Dan Sinclair1770c022016-03-14 14:14:16 -04001// 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 2007 ZXing authors
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 "xfa/fxbarcode/common/BC_CommonBitMatrix.h"
24#include "xfa/fxbarcode/qrcode/BC_QRCoderBitVector.h"
25#include "xfa/fxbarcode/qrcode/BC_QRCoderECB.h"
26#include "xfa/fxbarcode/qrcode/BC_QRCoderECBlocks.h"
27#include "xfa/fxbarcode/qrcode/BC_QRCoderErrorCorrectionLevel.h"
28#include "xfa/fxbarcode/qrcode/BC_QRCoderFormatInformation.h"
29#include "xfa/fxbarcode/qrcode/BC_QRCoderVersion.h"
30#include "xfa/fxbarcode/utils.h"
31
32const int32_t CBC_QRCoderVersion::VERSION_DECODE_INFO[] = {
33 0x07C94, 0x085BC, 0x09A99, 0x0A4D3, 0x0BBF6, 0x0C762, 0x0D847,
34 0x0E60D, 0x0F928, 0x10B78, 0x1145D, 0x12A17, 0x13532, 0x149A6,
35 0x15683, 0x168C9, 0x177EC, 0x18EC4, 0x191E1, 0x1AFAB, 0x1B08E,
36 0x1CC1A, 0x1D33F, 0x1ED75, 0x1F250, 0x209D5, 0x216F0, 0x228BA,
37 0x2379F, 0x24B0B, 0x2542E, 0x26A64, 0x27541, 0x28C69};
tsepez6020e452016-05-02 13:47:17 -070038
39CFX_ArrayTemplate<CBC_QRCoderVersion*>* CBC_QRCoderVersion::VERSION = nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -040040
41void CBC_QRCoderVersion::Initialize() {
tsepez6020e452016-05-02 13:47:17 -070042 VERSION = new CFX_ArrayTemplate<CBC_QRCoderVersion*>();
Dan Sinclair1770c022016-03-14 14:14:16 -040043}
44void CBC_QRCoderVersion::Finalize() {
tsepez6020e452016-05-02 13:47:17 -070045 for (int32_t i = 0; i < VERSION->GetSize(); i++)
46 delete VERSION->GetAt(i);
47
Dan Sinclair1770c022016-03-14 14:14:16 -040048 delete VERSION;
tsepez6020e452016-05-02 13:47:17 -070049 VERSION = nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -040050}
51CBC_QRCoderVersion::CBC_QRCoderVersion(int32_t versionNumber,
52 CBC_QRCoderECBlocks* ecBlocks1,
53 CBC_QRCoderECBlocks* ecBlocks2,
54 CBC_QRCoderECBlocks* ecBlocks3,
55 CBC_QRCoderECBlocks* ecBlocks4) {
56 m_versionNumber = versionNumber;
tsepezaef780d2016-04-28 14:56:27 -070057 m_ecBlocksArray.Add(ecBlocks1);
58 m_ecBlocksArray.Add(ecBlocks2);
59 m_ecBlocksArray.Add(ecBlocks3);
60 m_ecBlocksArray.Add(ecBlocks4);
Dan Sinclair1770c022016-03-14 14:14:16 -040061 int32_t total = 0;
62 int32_t ecCodeWords = ecBlocks1->GetECCodeWordsPerBlock();
tsepezaef780d2016-04-28 14:56:27 -070063 CFX_ArrayTemplate<CBC_QRCoderECB*>* ecbArray = ecBlocks1->GetECBlocks();
Dan Sinclair1770c022016-03-14 14:14:16 -040064 for (int32_t i = 0; i < ecbArray->GetSize(); i++) {
tsepezaef780d2016-04-28 14:56:27 -070065 CBC_QRCoderECB* ecBlock = (*ecbArray)[i];
Dan Sinclair1770c022016-03-14 14:14:16 -040066 total += ecBlock->GetCount() * (ecBlock->GetDataCodeWords() + ecCodeWords);
67 }
68 m_totalCodeWords = total;
69 switch (versionNumber) {
70 case 1:
71 break;
72 case 2:
73 m_alignmentPatternCenters.Add(6);
74 m_alignmentPatternCenters.Add(18);
75 break;
76 case 3:
77 m_alignmentPatternCenters.Add(6);
78 m_alignmentPatternCenters.Add(22);
79 break;
80 case 4:
81 m_alignmentPatternCenters.Add(6);
82 m_alignmentPatternCenters.Add(26);
83 break;
84 case 5:
85 m_alignmentPatternCenters.Add(6);
86 m_alignmentPatternCenters.Add(30);
87 break;
88 case 6:
89 m_alignmentPatternCenters.Add(6);
90 m_alignmentPatternCenters.Add(34);
91 break;
92 case 7:
93 m_alignmentPatternCenters.Add(6);
94 m_alignmentPatternCenters.Add(22);
95 m_alignmentPatternCenters.Add(38);
96 break;
97 case 8:
98 m_alignmentPatternCenters.Add(6);
99 m_alignmentPatternCenters.Add(24);
100 m_alignmentPatternCenters.Add(42);
101 break;
102 case 9:
103 m_alignmentPatternCenters.Add(6);
104 m_alignmentPatternCenters.Add(26);
105 m_alignmentPatternCenters.Add(46);
106 break;
107 case 10:
108 m_alignmentPatternCenters.Add(6);
109 m_alignmentPatternCenters.Add(28);
110 m_alignmentPatternCenters.Add(50);
111 break;
112 case 11:
113 m_alignmentPatternCenters.Add(6);
114 m_alignmentPatternCenters.Add(30);
115 m_alignmentPatternCenters.Add(54);
116 break;
117 case 12:
118 m_alignmentPatternCenters.Add(6);
119 m_alignmentPatternCenters.Add(32);
120 m_alignmentPatternCenters.Add(58);
121 break;
122 case 13:
123 m_alignmentPatternCenters.Add(6);
124 m_alignmentPatternCenters.Add(34);
125 m_alignmentPatternCenters.Add(62);
126 break;
127 case 14:
128 m_alignmentPatternCenters.Add(6);
129 m_alignmentPatternCenters.Add(26);
130 m_alignmentPatternCenters.Add(46);
131 m_alignmentPatternCenters.Add(66);
132 break;
133 case 15:
134 m_alignmentPatternCenters.Add(6);
135 m_alignmentPatternCenters.Add(26);
136 m_alignmentPatternCenters.Add(48);
137 m_alignmentPatternCenters.Add(70);
138 break;
139 case 16:
140 m_alignmentPatternCenters.Add(6);
141 m_alignmentPatternCenters.Add(26);
142 m_alignmentPatternCenters.Add(50);
143 m_alignmentPatternCenters.Add(74);
144 break;
145 case 17:
146 m_alignmentPatternCenters.Add(6);
147 m_alignmentPatternCenters.Add(30);
148 m_alignmentPatternCenters.Add(54);
149 m_alignmentPatternCenters.Add(78);
150 break;
151 case 18:
152 m_alignmentPatternCenters.Add(6);
153 m_alignmentPatternCenters.Add(30);
154 m_alignmentPatternCenters.Add(56);
155 m_alignmentPatternCenters.Add(82);
156 break;
157 case 19:
158 m_alignmentPatternCenters.Add(6);
159 m_alignmentPatternCenters.Add(30);
160 m_alignmentPatternCenters.Add(58);
161 m_alignmentPatternCenters.Add(86);
162 break;
163 case 20:
164 m_alignmentPatternCenters.Add(6);
165 m_alignmentPatternCenters.Add(34);
166 m_alignmentPatternCenters.Add(62);
167 m_alignmentPatternCenters.Add(90);
168 break;
169 case 21:
170 m_alignmentPatternCenters.Add(6);
171 m_alignmentPatternCenters.Add(28);
172 m_alignmentPatternCenters.Add(50);
173 m_alignmentPatternCenters.Add(72);
174 m_alignmentPatternCenters.Add(94);
175 break;
176 case 22:
177 m_alignmentPatternCenters.Add(6);
178 m_alignmentPatternCenters.Add(26);
179 m_alignmentPatternCenters.Add(50);
180 m_alignmentPatternCenters.Add(74);
181 m_alignmentPatternCenters.Add(98);
182 break;
183 case 23:
184 m_alignmentPatternCenters.Add(6);
185 m_alignmentPatternCenters.Add(30);
186 m_alignmentPatternCenters.Add(54);
187 m_alignmentPatternCenters.Add(74);
188 m_alignmentPatternCenters.Add(102);
189 break;
190 case 24:
191 m_alignmentPatternCenters.Add(6);
192 m_alignmentPatternCenters.Add(28);
193 m_alignmentPatternCenters.Add(54);
194 m_alignmentPatternCenters.Add(80);
195 m_alignmentPatternCenters.Add(106);
196 break;
197 case 25:
198 m_alignmentPatternCenters.Add(6);
199 m_alignmentPatternCenters.Add(32);
200 m_alignmentPatternCenters.Add(58);
201 m_alignmentPatternCenters.Add(84);
202 m_alignmentPatternCenters.Add(110);
203 break;
204 case 26:
205 m_alignmentPatternCenters.Add(6);
206 m_alignmentPatternCenters.Add(30);
207 m_alignmentPatternCenters.Add(58);
208 m_alignmentPatternCenters.Add(86);
209 m_alignmentPatternCenters.Add(114);
210 break;
211 case 27:
212 m_alignmentPatternCenters.Add(6);
213 m_alignmentPatternCenters.Add(34);
214 m_alignmentPatternCenters.Add(62);
215 m_alignmentPatternCenters.Add(90);
216 m_alignmentPatternCenters.Add(118);
217 break;
218 case 28:
219 m_alignmentPatternCenters.Add(6);
220 m_alignmentPatternCenters.Add(26);
221 m_alignmentPatternCenters.Add(50);
222 m_alignmentPatternCenters.Add(74);
223 m_alignmentPatternCenters.Add(98);
224 m_alignmentPatternCenters.Add(122);
225 break;
226 case 29:
227 m_alignmentPatternCenters.Add(6);
228 m_alignmentPatternCenters.Add(30);
229 m_alignmentPatternCenters.Add(54);
230 m_alignmentPatternCenters.Add(78);
231 m_alignmentPatternCenters.Add(102);
232 m_alignmentPatternCenters.Add(126);
233 break;
234 case 30:
235 m_alignmentPatternCenters.Add(6);
236 m_alignmentPatternCenters.Add(26);
237 m_alignmentPatternCenters.Add(52);
238 m_alignmentPatternCenters.Add(78);
239 m_alignmentPatternCenters.Add(104);
240 m_alignmentPatternCenters.Add(130);
241 break;
242 case 31:
243 m_alignmentPatternCenters.Add(6);
244 m_alignmentPatternCenters.Add(30);
245 m_alignmentPatternCenters.Add(56);
246 m_alignmentPatternCenters.Add(82);
247 m_alignmentPatternCenters.Add(108);
248 m_alignmentPatternCenters.Add(134);
249 break;
250 case 32:
251 m_alignmentPatternCenters.Add(6);
252 m_alignmentPatternCenters.Add(34);
253 m_alignmentPatternCenters.Add(60);
254 m_alignmentPatternCenters.Add(86);
255 m_alignmentPatternCenters.Add(112);
256 m_alignmentPatternCenters.Add(138);
257 break;
258 case 33:
259 m_alignmentPatternCenters.Add(6);
260 m_alignmentPatternCenters.Add(30);
261 m_alignmentPatternCenters.Add(58);
262 m_alignmentPatternCenters.Add(86);
263 m_alignmentPatternCenters.Add(114);
264 m_alignmentPatternCenters.Add(142);
265 break;
266 case 34:
267 m_alignmentPatternCenters.Add(6);
268 m_alignmentPatternCenters.Add(34);
269 m_alignmentPatternCenters.Add(62);
270 m_alignmentPatternCenters.Add(90);
271 m_alignmentPatternCenters.Add(118);
272 m_alignmentPatternCenters.Add(146);
273 break;
274 case 35:
275 m_alignmentPatternCenters.Add(6);
276 m_alignmentPatternCenters.Add(30);
277 m_alignmentPatternCenters.Add(54);
278 m_alignmentPatternCenters.Add(78);
279 m_alignmentPatternCenters.Add(102);
280 m_alignmentPatternCenters.Add(126);
281 m_alignmentPatternCenters.Add(150);
282 break;
283 case 36:
284 m_alignmentPatternCenters.Add(6);
285 m_alignmentPatternCenters.Add(24);
286 m_alignmentPatternCenters.Add(50);
287 m_alignmentPatternCenters.Add(76);
288 m_alignmentPatternCenters.Add(102);
289 m_alignmentPatternCenters.Add(128);
290 m_alignmentPatternCenters.Add(154);
291 break;
292 case 37:
293 m_alignmentPatternCenters.Add(6);
294 m_alignmentPatternCenters.Add(28);
295 m_alignmentPatternCenters.Add(54);
296 m_alignmentPatternCenters.Add(80);
297 m_alignmentPatternCenters.Add(106);
298 m_alignmentPatternCenters.Add(132);
299 m_alignmentPatternCenters.Add(158);
300 break;
301 case 38:
302 m_alignmentPatternCenters.Add(6);
303 m_alignmentPatternCenters.Add(32);
304 m_alignmentPatternCenters.Add(58);
305 m_alignmentPatternCenters.Add(84);
306 m_alignmentPatternCenters.Add(110);
307 m_alignmentPatternCenters.Add(136);
308 m_alignmentPatternCenters.Add(162);
309 break;
310 case 39:
311 m_alignmentPatternCenters.Add(6);
312 m_alignmentPatternCenters.Add(26);
313 m_alignmentPatternCenters.Add(54);
314 m_alignmentPatternCenters.Add(82);
315 m_alignmentPatternCenters.Add(110);
316 m_alignmentPatternCenters.Add(138);
317 m_alignmentPatternCenters.Add(166);
318 break;
319 case 40:
320 m_alignmentPatternCenters.Add(6);
321 m_alignmentPatternCenters.Add(30);
322 m_alignmentPatternCenters.Add(58);
323 m_alignmentPatternCenters.Add(86);
324 m_alignmentPatternCenters.Add(114);
325 m_alignmentPatternCenters.Add(142);
326 m_alignmentPatternCenters.Add(170);
327 break;
328 }
329}
tsepezaef780d2016-04-28 14:56:27 -0700330
Dan Sinclair1770c022016-03-14 14:14:16 -0400331CBC_QRCoderVersion::~CBC_QRCoderVersion() {
tsepezaef780d2016-04-28 14:56:27 -0700332 for (int32_t i = 0; i < m_ecBlocksArray.GetSize(); ++i)
333 delete m_ecBlocksArray[i];
Dan Sinclair1770c022016-03-14 14:14:16 -0400334}
tsepezaef780d2016-04-28 14:56:27 -0700335
Dan Sinclair1770c022016-03-14 14:14:16 -0400336int32_t CBC_QRCoderVersion::GetVersionNumber() {
337 return m_versionNumber;
338}
339CFX_Int32Array* CBC_QRCoderVersion::GetAlignmentPatternCenters() {
340 return &m_alignmentPatternCenters;
341}
342int32_t CBC_QRCoderVersion::GetTotalCodeWords() {
343 return m_totalCodeWords;
344}
345int32_t CBC_QRCoderVersion::GetDimensionForVersion() {
346 return 17 + 4 * m_versionNumber;
347}
348CBC_QRCoderECBlocks* CBC_QRCoderVersion::GetECBlocksForLevel(
349 CBC_QRCoderErrorCorrectionLevel* ecLevel) {
tsepezaef780d2016-04-28 14:56:27 -0700350 return m_ecBlocksArray[ecLevel->Ordinal()];
Dan Sinclair1770c022016-03-14 14:14:16 -0400351}
352CBC_QRCoderVersion* CBC_QRCoderVersion::GetProvisionalVersionForDimension(
353 int32_t dimension,
354 int32_t& e) {
355 if ((dimension % 4) != 1) {
356 e = BCExceptionRead;
thestig6dc1d772016-06-09 18:39:33 -0700357 BC_EXCEPTION_CHECK_ReturnValue(e, nullptr);
Dan Sinclair1770c022016-03-14 14:14:16 -0400358 }
359 CBC_QRCoderVersion* qcv = GetVersionForNumber((dimension - 17) >> 2, e);
thestig6dc1d772016-06-09 18:39:33 -0700360 BC_EXCEPTION_CHECK_ReturnValue(e, nullptr);
Dan Sinclair1770c022016-03-14 14:14:16 -0400361 return qcv;
362}
363CBC_QRCoderVersion* CBC_QRCoderVersion::DecodeVersionInformation(
364 int32_t versionBits,
365 int32_t& e) {
366 int32_t bestDifference = FXSYS_IntMax;
367 int32_t bestVersion = 0;
368 for (int32_t i = 0; i < 34; i++) {
369 int32_t targetVersion = VERSION_DECODE_INFO[i];
370 if (targetVersion == versionBits) {
371 CBC_QRCoderVersion* qcv = GetVersionForNumber(i + 7, e);
thestig6dc1d772016-06-09 18:39:33 -0700372 BC_EXCEPTION_CHECK_ReturnValue(e, nullptr);
Dan Sinclair1770c022016-03-14 14:14:16 -0400373 return qcv;
374 }
375 int32_t bitsDifference = CBC_QRCoderFormatInformation::NumBitsDiffering(
376 versionBits, targetVersion);
377 if (bitsDifference < bestDifference) {
378 bestVersion = i + 7;
379 bestDifference = bitsDifference;
380 }
381 }
382 if (bestDifference <= 3) {
383 CBC_QRCoderVersion* qcv = GetVersionForNumber(bestVersion, e);
thestig6dc1d772016-06-09 18:39:33 -0700384 BC_EXCEPTION_CHECK_ReturnValue(e, nullptr);
Dan Sinclair1770c022016-03-14 14:14:16 -0400385 return qcv;
386 }
thestig6dc1d772016-06-09 18:39:33 -0700387 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400388}
389CBC_CommonBitMatrix* CBC_QRCoderVersion::BuildFunctionPattern(int32_t& e) {
390 int32_t dimension = GetDimensionForVersion();
391 CBC_CommonBitMatrix* bitMatrix = new CBC_CommonBitMatrix();
392 bitMatrix->Init(dimension);
393 bitMatrix->SetRegion(0, 0, 9, 9, e);
thestig6dc1d772016-06-09 18:39:33 -0700394 BC_EXCEPTION_CHECK_ReturnValue(e, nullptr);
Dan Sinclair1770c022016-03-14 14:14:16 -0400395 bitMatrix->SetRegion(dimension - 8, 0, 8, 9, e);
thestig6dc1d772016-06-09 18:39:33 -0700396 BC_EXCEPTION_CHECK_ReturnValue(e, nullptr);
Dan Sinclair1770c022016-03-14 14:14:16 -0400397 bitMatrix->SetRegion(0, dimension - 8, 9, 8, e);
thestig6dc1d772016-06-09 18:39:33 -0700398 BC_EXCEPTION_CHECK_ReturnValue(e, nullptr);
Dan Sinclair1770c022016-03-14 14:14:16 -0400399 int32_t max = m_alignmentPatternCenters.GetSize();
400 for (int32_t x = 0; x < max; x++) {
401 int32_t i = m_alignmentPatternCenters[x] - 2;
402 for (int32_t y = 0; y < max; y++) {
403 if ((x == 0 && (y == 0 || y == max - 1)) || (x == max - 1 && y == 0)) {
404 continue;
405 }
406 bitMatrix->SetRegion(m_alignmentPatternCenters[y] - 2, i, 5, 5, e);
thestig6dc1d772016-06-09 18:39:33 -0700407 BC_EXCEPTION_CHECK_ReturnValue(e, nullptr);
Dan Sinclair1770c022016-03-14 14:14:16 -0400408 }
409 }
410 bitMatrix->SetRegion(6, 9, 1, dimension - 17, e);
thestig6dc1d772016-06-09 18:39:33 -0700411 BC_EXCEPTION_CHECK_ReturnValue(e, nullptr);
Dan Sinclair1770c022016-03-14 14:14:16 -0400412 bitMatrix->SetRegion(9, 6, dimension - 17, 1, e);
thestig6dc1d772016-06-09 18:39:33 -0700413 BC_EXCEPTION_CHECK_ReturnValue(e, nullptr);
Dan Sinclair1770c022016-03-14 14:14:16 -0400414 if (m_versionNumber > 6) {
415 bitMatrix->SetRegion(dimension - 11, 0, 3, 6, e);
thestig6dc1d772016-06-09 18:39:33 -0700416 BC_EXCEPTION_CHECK_ReturnValue(e, nullptr);
Dan Sinclair1770c022016-03-14 14:14:16 -0400417 bitMatrix->SetRegion(0, dimension - 11, 6, 3, e);
thestig6dc1d772016-06-09 18:39:33 -0700418 BC_EXCEPTION_CHECK_ReturnValue(e, nullptr);
Dan Sinclair1770c022016-03-14 14:14:16 -0400419 }
420 return bitMatrix;
421}
422CBC_QRCoderVersion* CBC_QRCoderVersion::GetVersionForNumber(
423 int32_t versionNumber,
424 int32_t& e) {
425 if (VERSION->GetSize() == 0) {
426 VERSION->Add(new CBC_QRCoderVersion(
427 1, new CBC_QRCoderECBlocks(7, new CBC_QRCoderECB(1, 19)),
428 new CBC_QRCoderECBlocks(10, new CBC_QRCoderECB(1, 16)),
429 new CBC_QRCoderECBlocks(13, new CBC_QRCoderECB(1, 13)),
430 new CBC_QRCoderECBlocks(17, new CBC_QRCoderECB(1, 9))));
431 VERSION->Add(new CBC_QRCoderVersion(
432 2, new CBC_QRCoderECBlocks(10, new CBC_QRCoderECB(1, 34)),
433 new CBC_QRCoderECBlocks(16, new CBC_QRCoderECB(1, 28)),
434 new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(1, 22)),
435 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(1, 16))));
436 VERSION->Add(new CBC_QRCoderVersion(
437 3, new CBC_QRCoderECBlocks(15, new CBC_QRCoderECB(1, 55)),
438 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(1, 44)),
439 new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 17)),
440 new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(2, 13))));
441 VERSION->Add(new CBC_QRCoderVersion(
442 4, new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(1, 80)),
443 new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 32)),
444 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(2, 24)),
445 new CBC_QRCoderECBlocks(16, new CBC_QRCoderECB(4, 9))));
446 VERSION->Add(new CBC_QRCoderVersion(
447 5, new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(1, 108)),
448 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(2, 43)),
449 new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 15),
450 new CBC_QRCoderECB(2, 16)),
451 new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(2, 11),
452 new CBC_QRCoderECB(2, 12))));
453 VERSION->Add(new CBC_QRCoderVersion(
454 6, new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 68)),
455 new CBC_QRCoderECBlocks(16, new CBC_QRCoderECB(4, 27)),
456 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(4, 19)),
457 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 15))));
458 VERSION->Add(new CBC_QRCoderVersion(
459 7, new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(2, 78)),
460 new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(4, 31)),
461 new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 14),
462 new CBC_QRCoderECB(4, 15)),
463 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 13),
464 new CBC_QRCoderECB(1, 14))));
465 VERSION->Add(new CBC_QRCoderVersion(
466 8, new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(2, 97)),
467 new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(2, 38),
468 new CBC_QRCoderECB(2, 39)),
469 new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(4, 18),
470 new CBC_QRCoderECB(2, 19)),
471 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 14),
472 new CBC_QRCoderECB(2, 15))));
473 VERSION->Add(new CBC_QRCoderVersion(
474 9, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(2, 116)),
475 new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(3, 36),
476 new CBC_QRCoderECB(2, 37)),
477 new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(4, 16),
478 new CBC_QRCoderECB(4, 17)),
479 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(4, 12),
480 new CBC_QRCoderECB(4, 13))));
481 VERSION->Add(new CBC_QRCoderVersion(
482 10, new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 68),
483 new CBC_QRCoderECB(2, 69)),
484 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 43),
485 new CBC_QRCoderECB(1, 44)),
486 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(6, 19),
487 new CBC_QRCoderECB(2, 20)),
488 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(6, 15),
489 new CBC_QRCoderECB(2, 16))));
490 VERSION->Add(new CBC_QRCoderVersion(
491 11, new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(4, 81)),
492 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(1, 50),
493 new CBC_QRCoderECB(4, 51)),
494 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 22),
495 new CBC_QRCoderECB(4, 23)),
496 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(3, 12),
497 new CBC_QRCoderECB(8, 13))));
498 VERSION->Add(new CBC_QRCoderVersion(
499 12, new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(2, 92),
500 new CBC_QRCoderECB(2, 93)),
501 new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(6, 36),
502 new CBC_QRCoderECB(2, 37)),
503 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 20),
504 new CBC_QRCoderECB(6, 21)),
505 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(7, 14),
506 new CBC_QRCoderECB(4, 15))));
507 VERSION->Add(new CBC_QRCoderVersion(
508 13, new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 107)),
509 new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(8, 37),
510 new CBC_QRCoderECB(1, 38)),
511 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(8, 20),
512 new CBC_QRCoderECB(4, 21)),
513 new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(12, 11),
514 new CBC_QRCoderECB(4, 12))));
515 VERSION->Add(new CBC_QRCoderVersion(
516 14, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(3, 115),
517 new CBC_QRCoderECB(1, 116)),
518 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(4, 40),
519 new CBC_QRCoderECB(5, 41)),
520 new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(11, 16),
521 new CBC_QRCoderECB(5, 17)),
522 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(11, 12),
523 new CBC_QRCoderECB(5, 13))));
524 VERSION->Add(new CBC_QRCoderVersion(
525 15, new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(5, 87),
526 new CBC_QRCoderECB(1, 88)),
527 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(5, 41),
528 new CBC_QRCoderECB(5, 42)),
529 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(5, 24),
530 new CBC_QRCoderECB(7, 25)),
531 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(11, 12),
532 new CBC_QRCoderECB(7, 13))));
533 VERSION->Add(new CBC_QRCoderVersion(
534 16, new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(5, 98),
535 new CBC_QRCoderECB(1, 99)),
536 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(7, 45),
537 new CBC_QRCoderECB(3, 46)),
538 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(15, 19),
539 new CBC_QRCoderECB(2, 20)),
540 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(3, 15),
541 new CBC_QRCoderECB(13, 16))));
542 VERSION->Add(new CBC_QRCoderVersion(
543 17, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(1, 107),
544 new CBC_QRCoderECB(5, 108)),
545 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(10, 46),
546 new CBC_QRCoderECB(1, 47)),
547 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(1, 22),
548 new CBC_QRCoderECB(15, 23)),
549 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 14),
550 new CBC_QRCoderECB(17, 15))));
551 VERSION->Add(new CBC_QRCoderVersion(
552 18, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(5, 120),
553 new CBC_QRCoderECB(1, 121)),
554 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(9, 43),
555 new CBC_QRCoderECB(4, 44)),
556 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(17, 22),
557 new CBC_QRCoderECB(1, 23)),
558 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 14),
559 new CBC_QRCoderECB(19, 15))));
560 VERSION->Add(new CBC_QRCoderVersion(
561 19, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(3, 113),
562 new CBC_QRCoderECB(4, 114)),
563 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(3, 44),
564 new CBC_QRCoderECB(11, 45)),
565 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(17, 21),
566 new CBC_QRCoderECB(4, 22)),
567 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(9, 13),
568 new CBC_QRCoderECB(16, 14))));
569 VERSION->Add(new CBC_QRCoderVersion(
570 20, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(3, 107),
571 new CBC_QRCoderECB(5, 108)),
572 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(3, 41),
573 new CBC_QRCoderECB(13, 42)),
574 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(15, 24),
575 new CBC_QRCoderECB(5, 25)),
576 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(15, 15),
577 new CBC_QRCoderECB(10, 16))));
578 VERSION->Add(new CBC_QRCoderVersion(
579 21, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 116),
580 new CBC_QRCoderECB(4, 117)),
581 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(17, 42)),
582 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(17, 22),
583 new CBC_QRCoderECB(6, 23)),
584 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 16),
585 new CBC_QRCoderECB(6, 17))));
586 VERSION->Add(new CBC_QRCoderVersion(
587 22, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 111),
588 new CBC_QRCoderECB(7, 112)),
589 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(17, 46)),
590 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(7, 24),
591 new CBC_QRCoderECB(16, 25)),
592 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(34, 13))));
593 VERSION->Add(new CBC_QRCoderVersion(
594 23, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(4, 121),
595 new CBC_QRCoderECB(5, 122)),
596 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 47),
597 new CBC_QRCoderECB(14, 48)),
598 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 24),
599 new CBC_QRCoderECB(14, 25)),
600 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(16, 15),
601 new CBC_QRCoderECB(14, 16))));
602 VERSION->Add(new CBC_QRCoderVersion(
603 24, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(6, 117),
604 new CBC_QRCoderECB(4, 118)),
605 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(6, 45),
606 new CBC_QRCoderECB(14, 46)),
607 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 24),
608 new CBC_QRCoderECB(16, 25)),
609 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(30, 16),
610 new CBC_QRCoderECB(2, 17))));
611 VERSION->Add(new CBC_QRCoderVersion(
612 25, new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(8, 106),
613 new CBC_QRCoderECB(4, 107)),
614 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(8, 47),
615 new CBC_QRCoderECB(13, 48)),
616 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(7, 24),
617 new CBC_QRCoderECB(22, 25)),
618 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(22, 15),
619 new CBC_QRCoderECB(13, 16))));
620 VERSION->Add(new CBC_QRCoderVersion(
621 26, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(10, 114),
622 new CBC_QRCoderECB(2, 115)),
623 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(19, 46),
624 new CBC_QRCoderECB(4, 47)),
625 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(28, 22),
626 new CBC_QRCoderECB(6, 23)),
627 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(33, 16),
628 new CBC_QRCoderECB(4, 17))));
629 VERSION->Add(new CBC_QRCoderVersion(
630 27, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(8, 122),
631 new CBC_QRCoderECB(4, 123)),
632 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(22, 45),
633 new CBC_QRCoderECB(3, 46)),
634 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(8, 23),
635 new CBC_QRCoderECB(26, 24)),
636 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(12, 15),
637 new CBC_QRCoderECB(28, 16))));
638 VERSION->Add(new CBC_QRCoderVersion(
639 28, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(3, 117),
640 new CBC_QRCoderECB(10, 118)),
641 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(3, 45),
642 new CBC_QRCoderECB(23, 46)),
643 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(4, 24),
644 new CBC_QRCoderECB(31, 25)),
645 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 15),
646 new CBC_QRCoderECB(31, 16))));
647 VERSION->Add(new CBC_QRCoderVersion(
648 29, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(7, 116),
649 new CBC_QRCoderECB(7, 117)),
650 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(21, 45),
651 new CBC_QRCoderECB(7, 46)),
652 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(1, 23),
653 new CBC_QRCoderECB(37, 24)),
654 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 15),
655 new CBC_QRCoderECB(26, 16))));
656 VERSION->Add(new CBC_QRCoderVersion(
657 30, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(5, 115),
658 new CBC_QRCoderECB(10, 116)),
659 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(19, 47),
660 new CBC_QRCoderECB(10, 48)),
661 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(15, 24),
662 new CBC_QRCoderECB(25, 25)),
663 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(23, 15),
664 new CBC_QRCoderECB(25, 16))));
665 VERSION->Add(new CBC_QRCoderVersion(
666 31, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(13, 115),
667 new CBC_QRCoderECB(3, 116)),
668 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 46),
669 new CBC_QRCoderECB(29, 47)),
670 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(42, 24),
671 new CBC_QRCoderECB(1, 25)),
672 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(23, 15),
673 new CBC_QRCoderECB(28, 16))));
674 VERSION->Add(new CBC_QRCoderVersion(
675 32, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(17, 115)),
676 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(10, 46),
677 new CBC_QRCoderECB(23, 47)),
678 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(10, 24),
679 new CBC_QRCoderECB(35, 25)),
680 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 15),
681 new CBC_QRCoderECB(35, 16))));
682 VERSION->Add(new CBC_QRCoderVersion(
683 33, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(17, 115),
684 new CBC_QRCoderECB(1, 116)),
685 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(14, 46),
686 new CBC_QRCoderECB(21, 47)),
687 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(29, 24),
688 new CBC_QRCoderECB(19, 25)),
689 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 15),
690 new CBC_QRCoderECB(46, 16))));
691 VERSION->Add(new CBC_QRCoderVersion(
692 34, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(13, 115),
693 new CBC_QRCoderECB(6, 116)),
694 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(14, 46),
695 new CBC_QRCoderECB(23, 47)),
696 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(44, 24),
697 new CBC_QRCoderECB(7, 25)),
698 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(59, 16),
699 new CBC_QRCoderECB(1, 17))));
700 VERSION->Add(new CBC_QRCoderVersion(
701 35, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(12, 121),
702 new CBC_QRCoderECB(7, 122)),
703 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(12, 47),
704 new CBC_QRCoderECB(26, 48)),
705 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(39, 24),
706 new CBC_QRCoderECB(14, 25)),
707 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(22, 15),
708 new CBC_QRCoderECB(41, 16))));
709 VERSION->Add(new CBC_QRCoderVersion(
710 36, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(6, 121),
711 new CBC_QRCoderECB(14, 122)),
712 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(6, 47),
713 new CBC_QRCoderECB(34, 48)),
714 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(46, 24),
715 new CBC_QRCoderECB(10, 25)),
716 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(2, 15),
717 new CBC_QRCoderECB(64, 16))));
718 VERSION->Add(new CBC_QRCoderVersion(
719 37, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(17, 122),
720 new CBC_QRCoderECB(4, 123)),
721 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(29, 46),
722 new CBC_QRCoderECB(14, 47)),
723 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(49, 24),
724 new CBC_QRCoderECB(10, 25)),
725 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(24, 15),
726 new CBC_QRCoderECB(46, 16))));
727 VERSION->Add(new CBC_QRCoderVersion(
728 38, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(4, 122),
729 new CBC_QRCoderECB(18, 123)),
730 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(13, 46),
731 new CBC_QRCoderECB(32, 47)),
732 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(48, 24),
733 new CBC_QRCoderECB(14, 25)),
734 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(42, 15),
735 new CBC_QRCoderECB(32, 16))));
736 VERSION->Add(new CBC_QRCoderVersion(
737 39, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(20, 117),
738 new CBC_QRCoderECB(4, 118)),
739 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(40, 47),
740 new CBC_QRCoderECB(7, 48)),
741 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(43, 24),
742 new CBC_QRCoderECB(22, 25)),
743 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(10, 15),
744 new CBC_QRCoderECB(67, 16))));
745 VERSION->Add(new CBC_QRCoderVersion(
746 40, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 118),
747 new CBC_QRCoderECB(6, 119)),
748 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(18, 47),
749 new CBC_QRCoderECB(31, 48)),
750 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(34, 24),
751 new CBC_QRCoderECB(34, 25)),
752 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(20, 15),
753 new CBC_QRCoderECB(61, 16))));
754 }
755 if (versionNumber < 1 || versionNumber > 40) {
756 e = BCExceptionIllegalArgument;
thestig6dc1d772016-06-09 18:39:33 -0700757 BC_EXCEPTION_CHECK_ReturnValue(e, nullptr);
Dan Sinclair1770c022016-03-14 14:14:16 -0400758 }
tsepez6020e452016-05-02 13:47:17 -0700759 return (*VERSION)[versionNumber - 1];
Dan Sinclair1770c022016-03-14 14:14:16 -0400760}
tsepez6020e452016-05-02 13:47:17 -0700761
Dan Sinclair1770c022016-03-14 14:14:16 -0400762void CBC_QRCoderVersion::Destroy() {
tsepez6020e452016-05-02 13:47:17 -0700763 for (int32_t i = 0; i < VERSION->GetSize(); i++)
764 delete (*VERSION)[i];
765 VERSION->RemoveAll();
Dan Sinclair1770c022016-03-14 14:14:16 -0400766}