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