blob: da13700ae25cad1e5959f74291d56e791ba69cda [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"
Dan Sinclair1770c022016-03-14 14:14:16 -040028#include "xfa/fxbarcode/qrcode/BC_QRCoderVersion.h"
29#include "xfa/fxbarcode/utils.h"
30
dsinclaira2615342016-06-16 12:29:07 -070031namespace {
32
33const uint8_t BITS_SET_IN_HALF_BYTE[] = {0, 1, 1, 2, 1, 2, 2, 3,
34 1, 2, 2, 3, 2, 3, 3, 4};
35
36int32_t NumBitsDiffering(int32_t a, int32_t b) {
37 a ^= b;
38 return BITS_SET_IN_HALF_BYTE[a & 0x0F] +
39 BITS_SET_IN_HALF_BYTE[(a >> 4) & 0x0F] +
40 BITS_SET_IN_HALF_BYTE[(a >> 8) & 0x0F] +
41 BITS_SET_IN_HALF_BYTE[(a >> 12) & 0x0F] +
42 BITS_SET_IN_HALF_BYTE[(a >> 16) & 0x0F] +
43 BITS_SET_IN_HALF_BYTE[(a >> 20) & 0x0F] +
44 BITS_SET_IN_HALF_BYTE[(a >> 24) & 0x0F] +
45 BITS_SET_IN_HALF_BYTE[(a >> 28) & 0x0F];
46}
47
48} // namespace
49
Dan Sinclair1770c022016-03-14 14:14:16 -040050const int32_t CBC_QRCoderVersion::VERSION_DECODE_INFO[] = {
51 0x07C94, 0x085BC, 0x09A99, 0x0A4D3, 0x0BBF6, 0x0C762, 0x0D847,
52 0x0E60D, 0x0F928, 0x10B78, 0x1145D, 0x12A17, 0x13532, 0x149A6,
53 0x15683, 0x168C9, 0x177EC, 0x18EC4, 0x191E1, 0x1AFAB, 0x1B08E,
54 0x1CC1A, 0x1D33F, 0x1ED75, 0x1F250, 0x209D5, 0x216F0, 0x228BA,
55 0x2379F, 0x24B0B, 0x2542E, 0x26A64, 0x27541, 0x28C69};
tsepez6020e452016-05-02 13:47:17 -070056
Tom Sepez8b6186f2017-03-28 12:06:45 -070057std::vector<CBC_QRCoderVersion*>* CBC_QRCoderVersion::VERSION = nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -040058
59void CBC_QRCoderVersion::Initialize() {
Tom Sepez8b6186f2017-03-28 12:06:45 -070060 VERSION = new std::vector<CBC_QRCoderVersion*>();
Dan Sinclair1770c022016-03-14 14:14:16 -040061}
62void CBC_QRCoderVersion::Finalize() {
Tom Sepez8b6186f2017-03-28 12:06:45 -070063 for (size_t i = 0; i < VERSION->size(); i++)
64 delete (*VERSION)[i];
tsepez6020e452016-05-02 13:47:17 -070065
Dan Sinclair1770c022016-03-14 14:14:16 -040066 delete VERSION;
tsepez6020e452016-05-02 13:47:17 -070067 VERSION = nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -040068}
69CBC_QRCoderVersion::CBC_QRCoderVersion(int32_t versionNumber,
70 CBC_QRCoderECBlocks* ecBlocks1,
71 CBC_QRCoderECBlocks* ecBlocks2,
72 CBC_QRCoderECBlocks* ecBlocks3,
73 CBC_QRCoderECBlocks* ecBlocks4) {
74 m_versionNumber = versionNumber;
Tom Sepez8b6186f2017-03-28 12:06:45 -070075 m_ecBlocksArray.push_back(ecBlocks1);
76 m_ecBlocksArray.push_back(ecBlocks2);
77 m_ecBlocksArray.push_back(ecBlocks3);
78 m_ecBlocksArray.push_back(ecBlocks4);
Dan Sinclair1770c022016-03-14 14:14:16 -040079 int32_t total = 0;
80 int32_t ecCodeWords = ecBlocks1->GetECCodeWordsPerBlock();
Tom Sepez8b6186f2017-03-28 12:06:45 -070081 std::vector<CBC_QRCoderECB*>* ecbArray = ecBlocks1->GetECBlocks();
82 for (size_t i = 0; i < ecbArray->size(); i++) {
tsepezaef780d2016-04-28 14:56:27 -070083 CBC_QRCoderECB* ecBlock = (*ecbArray)[i];
Dan Sinclair1770c022016-03-14 14:14:16 -040084 total += ecBlock->GetCount() * (ecBlock->GetDataCodeWords() + ecCodeWords);
85 }
86 m_totalCodeWords = total;
87 switch (versionNumber) {
88 case 1:
89 break;
90 case 2:
Tom Sepez8b6186f2017-03-28 12:06:45 -070091 m_alignmentPatternCenters.push_back(6);
92 m_alignmentPatternCenters.push_back(18);
Dan Sinclair1770c022016-03-14 14:14:16 -040093 break;
94 case 3:
Tom Sepez8b6186f2017-03-28 12:06:45 -070095 m_alignmentPatternCenters.push_back(6);
96 m_alignmentPatternCenters.push_back(22);
Dan Sinclair1770c022016-03-14 14:14:16 -040097 break;
98 case 4:
Tom Sepez8b6186f2017-03-28 12:06:45 -070099 m_alignmentPatternCenters.push_back(6);
100 m_alignmentPatternCenters.push_back(26);
Dan Sinclair1770c022016-03-14 14:14:16 -0400101 break;
102 case 5:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700103 m_alignmentPatternCenters.push_back(6);
104 m_alignmentPatternCenters.push_back(30);
Dan Sinclair1770c022016-03-14 14:14:16 -0400105 break;
106 case 6:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700107 m_alignmentPatternCenters.push_back(6);
108 m_alignmentPatternCenters.push_back(34);
Dan Sinclair1770c022016-03-14 14:14:16 -0400109 break;
110 case 7:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700111 m_alignmentPatternCenters.push_back(6);
112 m_alignmentPatternCenters.push_back(22);
113 m_alignmentPatternCenters.push_back(38);
Dan Sinclair1770c022016-03-14 14:14:16 -0400114 break;
115 case 8:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700116 m_alignmentPatternCenters.push_back(6);
117 m_alignmentPatternCenters.push_back(24);
118 m_alignmentPatternCenters.push_back(42);
Dan Sinclair1770c022016-03-14 14:14:16 -0400119 break;
120 case 9:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700121 m_alignmentPatternCenters.push_back(6);
122 m_alignmentPatternCenters.push_back(26);
123 m_alignmentPatternCenters.push_back(46);
Dan Sinclair1770c022016-03-14 14:14:16 -0400124 break;
125 case 10:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700126 m_alignmentPatternCenters.push_back(6);
127 m_alignmentPatternCenters.push_back(28);
128 m_alignmentPatternCenters.push_back(50);
Dan Sinclair1770c022016-03-14 14:14:16 -0400129 break;
130 case 11:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700131 m_alignmentPatternCenters.push_back(6);
132 m_alignmentPatternCenters.push_back(30);
133 m_alignmentPatternCenters.push_back(54);
Dan Sinclair1770c022016-03-14 14:14:16 -0400134 break;
135 case 12:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700136 m_alignmentPatternCenters.push_back(6);
137 m_alignmentPatternCenters.push_back(32);
138 m_alignmentPatternCenters.push_back(58);
Dan Sinclair1770c022016-03-14 14:14:16 -0400139 break;
140 case 13:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700141 m_alignmentPatternCenters.push_back(6);
142 m_alignmentPatternCenters.push_back(34);
143 m_alignmentPatternCenters.push_back(62);
Dan Sinclair1770c022016-03-14 14:14:16 -0400144 break;
145 case 14:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700146 m_alignmentPatternCenters.push_back(6);
147 m_alignmentPatternCenters.push_back(26);
148 m_alignmentPatternCenters.push_back(46);
149 m_alignmentPatternCenters.push_back(66);
Dan Sinclair1770c022016-03-14 14:14:16 -0400150 break;
151 case 15:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700152 m_alignmentPatternCenters.push_back(6);
153 m_alignmentPatternCenters.push_back(26);
154 m_alignmentPatternCenters.push_back(48);
155 m_alignmentPatternCenters.push_back(70);
Dan Sinclair1770c022016-03-14 14:14:16 -0400156 break;
157 case 16:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700158 m_alignmentPatternCenters.push_back(6);
159 m_alignmentPatternCenters.push_back(26);
160 m_alignmentPatternCenters.push_back(50);
161 m_alignmentPatternCenters.push_back(74);
Dan Sinclair1770c022016-03-14 14:14:16 -0400162 break;
163 case 17:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700164 m_alignmentPatternCenters.push_back(6);
165 m_alignmentPatternCenters.push_back(30);
166 m_alignmentPatternCenters.push_back(54);
167 m_alignmentPatternCenters.push_back(78);
Dan Sinclair1770c022016-03-14 14:14:16 -0400168 break;
169 case 18:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700170 m_alignmentPatternCenters.push_back(6);
171 m_alignmentPatternCenters.push_back(30);
172 m_alignmentPatternCenters.push_back(56);
173 m_alignmentPatternCenters.push_back(82);
Dan Sinclair1770c022016-03-14 14:14:16 -0400174 break;
175 case 19:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700176 m_alignmentPatternCenters.push_back(6);
177 m_alignmentPatternCenters.push_back(30);
178 m_alignmentPatternCenters.push_back(58);
179 m_alignmentPatternCenters.push_back(86);
Dan Sinclair1770c022016-03-14 14:14:16 -0400180 break;
181 case 20:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700182 m_alignmentPatternCenters.push_back(6);
183 m_alignmentPatternCenters.push_back(34);
184 m_alignmentPatternCenters.push_back(62);
185 m_alignmentPatternCenters.push_back(90);
Dan Sinclair1770c022016-03-14 14:14:16 -0400186 break;
187 case 21:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700188 m_alignmentPatternCenters.push_back(6);
189 m_alignmentPatternCenters.push_back(28);
190 m_alignmentPatternCenters.push_back(50);
191 m_alignmentPatternCenters.push_back(72);
192 m_alignmentPatternCenters.push_back(94);
Dan Sinclair1770c022016-03-14 14:14:16 -0400193 break;
194 case 22:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700195 m_alignmentPatternCenters.push_back(6);
196 m_alignmentPatternCenters.push_back(26);
197 m_alignmentPatternCenters.push_back(50);
198 m_alignmentPatternCenters.push_back(74);
199 m_alignmentPatternCenters.push_back(98);
Dan Sinclair1770c022016-03-14 14:14:16 -0400200 break;
201 case 23:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700202 m_alignmentPatternCenters.push_back(6);
203 m_alignmentPatternCenters.push_back(30);
204 m_alignmentPatternCenters.push_back(54);
205 m_alignmentPatternCenters.push_back(74);
206 m_alignmentPatternCenters.push_back(102);
Dan Sinclair1770c022016-03-14 14:14:16 -0400207 break;
208 case 24:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700209 m_alignmentPatternCenters.push_back(6);
210 m_alignmentPatternCenters.push_back(28);
211 m_alignmentPatternCenters.push_back(54);
212 m_alignmentPatternCenters.push_back(80);
213 m_alignmentPatternCenters.push_back(106);
Dan Sinclair1770c022016-03-14 14:14:16 -0400214 break;
215 case 25:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700216 m_alignmentPatternCenters.push_back(6);
217 m_alignmentPatternCenters.push_back(32);
218 m_alignmentPatternCenters.push_back(58);
219 m_alignmentPatternCenters.push_back(84);
220 m_alignmentPatternCenters.push_back(110);
Dan Sinclair1770c022016-03-14 14:14:16 -0400221 break;
222 case 26:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700223 m_alignmentPatternCenters.push_back(6);
224 m_alignmentPatternCenters.push_back(30);
225 m_alignmentPatternCenters.push_back(58);
226 m_alignmentPatternCenters.push_back(86);
227 m_alignmentPatternCenters.push_back(114);
Dan Sinclair1770c022016-03-14 14:14:16 -0400228 break;
229 case 27:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700230 m_alignmentPatternCenters.push_back(6);
231 m_alignmentPatternCenters.push_back(34);
232 m_alignmentPatternCenters.push_back(62);
233 m_alignmentPatternCenters.push_back(90);
234 m_alignmentPatternCenters.push_back(118);
Dan Sinclair1770c022016-03-14 14:14:16 -0400235 break;
236 case 28:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700237 m_alignmentPatternCenters.push_back(6);
238 m_alignmentPatternCenters.push_back(26);
239 m_alignmentPatternCenters.push_back(50);
240 m_alignmentPatternCenters.push_back(74);
241 m_alignmentPatternCenters.push_back(98);
242 m_alignmentPatternCenters.push_back(122);
Dan Sinclair1770c022016-03-14 14:14:16 -0400243 break;
244 case 29:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700245 m_alignmentPatternCenters.push_back(6);
246 m_alignmentPatternCenters.push_back(30);
247 m_alignmentPatternCenters.push_back(54);
248 m_alignmentPatternCenters.push_back(78);
249 m_alignmentPatternCenters.push_back(102);
250 m_alignmentPatternCenters.push_back(126);
Dan Sinclair1770c022016-03-14 14:14:16 -0400251 break;
252 case 30:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700253 m_alignmentPatternCenters.push_back(6);
254 m_alignmentPatternCenters.push_back(26);
255 m_alignmentPatternCenters.push_back(52);
256 m_alignmentPatternCenters.push_back(78);
257 m_alignmentPatternCenters.push_back(104);
258 m_alignmentPatternCenters.push_back(130);
Dan Sinclair1770c022016-03-14 14:14:16 -0400259 break;
260 case 31:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700261 m_alignmentPatternCenters.push_back(6);
262 m_alignmentPatternCenters.push_back(30);
263 m_alignmentPatternCenters.push_back(56);
264 m_alignmentPatternCenters.push_back(82);
265 m_alignmentPatternCenters.push_back(108);
266 m_alignmentPatternCenters.push_back(134);
Dan Sinclair1770c022016-03-14 14:14:16 -0400267 break;
268 case 32:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700269 m_alignmentPatternCenters.push_back(6);
270 m_alignmentPatternCenters.push_back(34);
271 m_alignmentPatternCenters.push_back(60);
272 m_alignmentPatternCenters.push_back(86);
273 m_alignmentPatternCenters.push_back(112);
274 m_alignmentPatternCenters.push_back(138);
Dan Sinclair1770c022016-03-14 14:14:16 -0400275 break;
276 case 33:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700277 m_alignmentPatternCenters.push_back(6);
278 m_alignmentPatternCenters.push_back(30);
279 m_alignmentPatternCenters.push_back(58);
280 m_alignmentPatternCenters.push_back(86);
281 m_alignmentPatternCenters.push_back(114);
282 m_alignmentPatternCenters.push_back(142);
Dan Sinclair1770c022016-03-14 14:14:16 -0400283 break;
284 case 34:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700285 m_alignmentPatternCenters.push_back(6);
286 m_alignmentPatternCenters.push_back(34);
287 m_alignmentPatternCenters.push_back(62);
288 m_alignmentPatternCenters.push_back(90);
289 m_alignmentPatternCenters.push_back(118);
290 m_alignmentPatternCenters.push_back(146);
Dan Sinclair1770c022016-03-14 14:14:16 -0400291 break;
292 case 35:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700293 m_alignmentPatternCenters.push_back(6);
294 m_alignmentPatternCenters.push_back(30);
295 m_alignmentPatternCenters.push_back(54);
296 m_alignmentPatternCenters.push_back(78);
297 m_alignmentPatternCenters.push_back(102);
298 m_alignmentPatternCenters.push_back(126);
299 m_alignmentPatternCenters.push_back(150);
Dan Sinclair1770c022016-03-14 14:14:16 -0400300 break;
301 case 36:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700302 m_alignmentPatternCenters.push_back(6);
303 m_alignmentPatternCenters.push_back(24);
304 m_alignmentPatternCenters.push_back(50);
305 m_alignmentPatternCenters.push_back(76);
306 m_alignmentPatternCenters.push_back(102);
307 m_alignmentPatternCenters.push_back(128);
308 m_alignmentPatternCenters.push_back(154);
Dan Sinclair1770c022016-03-14 14:14:16 -0400309 break;
310 case 37:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700311 m_alignmentPatternCenters.push_back(6);
312 m_alignmentPatternCenters.push_back(28);
313 m_alignmentPatternCenters.push_back(54);
314 m_alignmentPatternCenters.push_back(80);
315 m_alignmentPatternCenters.push_back(106);
316 m_alignmentPatternCenters.push_back(132);
317 m_alignmentPatternCenters.push_back(158);
Dan Sinclair1770c022016-03-14 14:14:16 -0400318 break;
319 case 38:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700320 m_alignmentPatternCenters.push_back(6);
321 m_alignmentPatternCenters.push_back(32);
322 m_alignmentPatternCenters.push_back(58);
323 m_alignmentPatternCenters.push_back(84);
324 m_alignmentPatternCenters.push_back(110);
325 m_alignmentPatternCenters.push_back(136);
326 m_alignmentPatternCenters.push_back(162);
Dan Sinclair1770c022016-03-14 14:14:16 -0400327 break;
328 case 39:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700329 m_alignmentPatternCenters.push_back(6);
330 m_alignmentPatternCenters.push_back(26);
331 m_alignmentPatternCenters.push_back(54);
332 m_alignmentPatternCenters.push_back(82);
333 m_alignmentPatternCenters.push_back(110);
334 m_alignmentPatternCenters.push_back(138);
335 m_alignmentPatternCenters.push_back(166);
Dan Sinclair1770c022016-03-14 14:14:16 -0400336 break;
337 case 40:
Tom Sepez8b6186f2017-03-28 12:06:45 -0700338 m_alignmentPatternCenters.push_back(6);
339 m_alignmentPatternCenters.push_back(30);
340 m_alignmentPatternCenters.push_back(58);
341 m_alignmentPatternCenters.push_back(86);
342 m_alignmentPatternCenters.push_back(114);
343 m_alignmentPatternCenters.push_back(142);
344 m_alignmentPatternCenters.push_back(170);
Dan Sinclair1770c022016-03-14 14:14:16 -0400345 break;
346 }
347}
tsepezaef780d2016-04-28 14:56:27 -0700348
Dan Sinclair1770c022016-03-14 14:14:16 -0400349CBC_QRCoderVersion::~CBC_QRCoderVersion() {
Tom Sepez8b6186f2017-03-28 12:06:45 -0700350 for (size_t i = 0; i < m_ecBlocksArray.size(); ++i)
tsepezaef780d2016-04-28 14:56:27 -0700351 delete m_ecBlocksArray[i];
Dan Sinclair1770c022016-03-14 14:14:16 -0400352}
tsepezaef780d2016-04-28 14:56:27 -0700353
Dan Sinclair1770c022016-03-14 14:14:16 -0400354int32_t CBC_QRCoderVersion::GetVersionNumber() {
355 return m_versionNumber;
356}
Tom Sepez8b6186f2017-03-28 12:06:45 -0700357std::vector<int32_t>* CBC_QRCoderVersion::GetAlignmentPatternCenters() {
Dan Sinclair1770c022016-03-14 14:14:16 -0400358 return &m_alignmentPatternCenters;
359}
360int32_t CBC_QRCoderVersion::GetTotalCodeWords() {
361 return m_totalCodeWords;
362}
363int32_t CBC_QRCoderVersion::GetDimensionForVersion() {
364 return 17 + 4 * m_versionNumber;
365}
366CBC_QRCoderECBlocks* CBC_QRCoderVersion::GetECBlocksForLevel(
367 CBC_QRCoderErrorCorrectionLevel* ecLevel) {
tsepezaef780d2016-04-28 14:56:27 -0700368 return m_ecBlocksArray[ecLevel->Ordinal()];
Dan Sinclair1770c022016-03-14 14:14:16 -0400369}
370CBC_QRCoderVersion* CBC_QRCoderVersion::GetProvisionalVersionForDimension(
371 int32_t dimension,
372 int32_t& e) {
373 if ((dimension % 4) != 1) {
374 e = BCExceptionRead;
Tom Sepez3c056ae2017-02-06 09:34:23 -0800375 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400376 }
377 CBC_QRCoderVersion* qcv = GetVersionForNumber((dimension - 17) >> 2, e);
Tom Sepezc8017b22017-01-31 13:02:10 -0800378 if (e != BCExceptionNO)
379 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400380 return qcv;
381}
382CBC_QRCoderVersion* CBC_QRCoderVersion::DecodeVersionInformation(
383 int32_t versionBits,
384 int32_t& e) {
385 int32_t bestDifference = FXSYS_IntMax;
386 int32_t bestVersion = 0;
387 for (int32_t i = 0; i < 34; i++) {
388 int32_t targetVersion = VERSION_DECODE_INFO[i];
389 if (targetVersion == versionBits) {
390 CBC_QRCoderVersion* qcv = GetVersionForNumber(i + 7, e);
Tom Sepezc8017b22017-01-31 13:02:10 -0800391 if (e != BCExceptionNO)
392 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400393 return qcv;
394 }
dsinclaira2615342016-06-16 12:29:07 -0700395 int32_t bitsDifference = NumBitsDiffering(versionBits, targetVersion);
Dan Sinclair1770c022016-03-14 14:14:16 -0400396 if (bitsDifference < bestDifference) {
397 bestVersion = i + 7;
398 bestDifference = bitsDifference;
399 }
400 }
401 if (bestDifference <= 3) {
402 CBC_QRCoderVersion* qcv = GetVersionForNumber(bestVersion, e);
Tom Sepezc8017b22017-01-31 13:02:10 -0800403 if (e != BCExceptionNO)
404 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400405 return qcv;
406 }
thestig6dc1d772016-06-09 18:39:33 -0700407 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400408}
409CBC_CommonBitMatrix* CBC_QRCoderVersion::BuildFunctionPattern(int32_t& e) {
410 int32_t dimension = GetDimensionForVersion();
411 CBC_CommonBitMatrix* bitMatrix = new CBC_CommonBitMatrix();
412 bitMatrix->Init(dimension);
413 bitMatrix->SetRegion(0, 0, 9, 9, e);
Tom Sepezc8017b22017-01-31 13:02:10 -0800414 if (e != BCExceptionNO)
415 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400416 bitMatrix->SetRegion(dimension - 8, 0, 8, 9, e);
Tom Sepezc8017b22017-01-31 13:02:10 -0800417 if (e != BCExceptionNO)
418 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400419 bitMatrix->SetRegion(0, dimension - 8, 9, 8, e);
Tom Sepezc8017b22017-01-31 13:02:10 -0800420 if (e != BCExceptionNO)
421 return nullptr;
Tom Sepez8b6186f2017-03-28 12:06:45 -0700422 size_t max = m_alignmentPatternCenters.size();
423 for (size_t x = 0; x < max; x++) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400424 int32_t i = m_alignmentPatternCenters[x] - 2;
Tom Sepez8b6186f2017-03-28 12:06:45 -0700425 for (size_t y = 0; y < max; y++) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400426 if ((x == 0 && (y == 0 || y == max - 1)) || (x == max - 1 && y == 0)) {
427 continue;
428 }
429 bitMatrix->SetRegion(m_alignmentPatternCenters[y] - 2, i, 5, 5, e);
Tom Sepezc8017b22017-01-31 13:02:10 -0800430 if (e != BCExceptionNO)
431 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400432 }
433 }
434 bitMatrix->SetRegion(6, 9, 1, dimension - 17, e);
Tom Sepezc8017b22017-01-31 13:02:10 -0800435 if (e != BCExceptionNO)
436 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400437 bitMatrix->SetRegion(9, 6, dimension - 17, 1, e);
Tom Sepezc8017b22017-01-31 13:02:10 -0800438 if (e != BCExceptionNO)
439 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400440 if (m_versionNumber > 6) {
441 bitMatrix->SetRegion(dimension - 11, 0, 3, 6, e);
Tom Sepezc8017b22017-01-31 13:02:10 -0800442 if (e != BCExceptionNO)
443 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400444 bitMatrix->SetRegion(0, dimension - 11, 6, 3, e);
Tom Sepezc8017b22017-01-31 13:02:10 -0800445 if (e != BCExceptionNO)
446 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400447 }
448 return bitMatrix;
449}
450CBC_QRCoderVersion* CBC_QRCoderVersion::GetVersionForNumber(
451 int32_t versionNumber,
452 int32_t& e) {
Tom Sepez8b6186f2017-03-28 12:06:45 -0700453 if (VERSION->empty()) {
454 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400455 1, new CBC_QRCoderECBlocks(7, new CBC_QRCoderECB(1, 19)),
456 new CBC_QRCoderECBlocks(10, new CBC_QRCoderECB(1, 16)),
457 new CBC_QRCoderECBlocks(13, new CBC_QRCoderECB(1, 13)),
458 new CBC_QRCoderECBlocks(17, new CBC_QRCoderECB(1, 9))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700459 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400460 2, new CBC_QRCoderECBlocks(10, new CBC_QRCoderECB(1, 34)),
461 new CBC_QRCoderECBlocks(16, new CBC_QRCoderECB(1, 28)),
462 new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(1, 22)),
463 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(1, 16))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700464 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400465 3, new CBC_QRCoderECBlocks(15, new CBC_QRCoderECB(1, 55)),
466 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(1, 44)),
467 new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 17)),
468 new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(2, 13))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700469 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400470 4, new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(1, 80)),
471 new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 32)),
472 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(2, 24)),
473 new CBC_QRCoderECBlocks(16, new CBC_QRCoderECB(4, 9))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700474 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400475 5, new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(1, 108)),
476 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(2, 43)),
477 new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 15),
478 new CBC_QRCoderECB(2, 16)),
479 new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(2, 11),
480 new CBC_QRCoderECB(2, 12))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700481 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400482 6, new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 68)),
483 new CBC_QRCoderECBlocks(16, new CBC_QRCoderECB(4, 27)),
484 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(4, 19)),
485 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 15))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700486 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400487 7, new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(2, 78)),
488 new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(4, 31)),
489 new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 14),
490 new CBC_QRCoderECB(4, 15)),
491 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 13),
492 new CBC_QRCoderECB(1, 14))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700493 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400494 8, new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(2, 97)),
495 new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(2, 38),
496 new CBC_QRCoderECB(2, 39)),
497 new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(4, 18),
498 new CBC_QRCoderECB(2, 19)),
499 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 14),
500 new CBC_QRCoderECB(2, 15))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700501 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400502 9, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(2, 116)),
503 new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(3, 36),
504 new CBC_QRCoderECB(2, 37)),
505 new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(4, 16),
506 new CBC_QRCoderECB(4, 17)),
507 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(4, 12),
508 new CBC_QRCoderECB(4, 13))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700509 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400510 10, new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 68),
511 new CBC_QRCoderECB(2, 69)),
512 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 43),
513 new CBC_QRCoderECB(1, 44)),
514 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(6, 19),
515 new CBC_QRCoderECB(2, 20)),
516 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(6, 15),
517 new CBC_QRCoderECB(2, 16))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700518 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400519 11, new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(4, 81)),
520 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(1, 50),
521 new CBC_QRCoderECB(4, 51)),
522 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 22),
523 new CBC_QRCoderECB(4, 23)),
524 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(3, 12),
525 new CBC_QRCoderECB(8, 13))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700526 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400527 12, new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(2, 92),
528 new CBC_QRCoderECB(2, 93)),
529 new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(6, 36),
530 new CBC_QRCoderECB(2, 37)),
531 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 20),
532 new CBC_QRCoderECB(6, 21)),
533 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(7, 14),
534 new CBC_QRCoderECB(4, 15))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700535 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400536 13, new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 107)),
537 new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(8, 37),
538 new CBC_QRCoderECB(1, 38)),
539 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(8, 20),
540 new CBC_QRCoderECB(4, 21)),
541 new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(12, 11),
542 new CBC_QRCoderECB(4, 12))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700543 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400544 14, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(3, 115),
545 new CBC_QRCoderECB(1, 116)),
546 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(4, 40),
547 new CBC_QRCoderECB(5, 41)),
548 new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(11, 16),
549 new CBC_QRCoderECB(5, 17)),
550 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(11, 12),
551 new CBC_QRCoderECB(5, 13))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700552 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400553 15, new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(5, 87),
554 new CBC_QRCoderECB(1, 88)),
555 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(5, 41),
556 new CBC_QRCoderECB(5, 42)),
557 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(5, 24),
558 new CBC_QRCoderECB(7, 25)),
559 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(11, 12),
560 new CBC_QRCoderECB(7, 13))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700561 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400562 16, new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(5, 98),
563 new CBC_QRCoderECB(1, 99)),
564 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(7, 45),
565 new CBC_QRCoderECB(3, 46)),
566 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(15, 19),
567 new CBC_QRCoderECB(2, 20)),
568 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(3, 15),
569 new CBC_QRCoderECB(13, 16))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700570 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400571 17, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(1, 107),
572 new CBC_QRCoderECB(5, 108)),
573 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(10, 46),
574 new CBC_QRCoderECB(1, 47)),
575 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(1, 22),
576 new CBC_QRCoderECB(15, 23)),
577 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 14),
578 new CBC_QRCoderECB(17, 15))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700579 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400580 18, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(5, 120),
581 new CBC_QRCoderECB(1, 121)),
582 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(9, 43),
583 new CBC_QRCoderECB(4, 44)),
584 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(17, 22),
585 new CBC_QRCoderECB(1, 23)),
586 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 14),
587 new CBC_QRCoderECB(19, 15))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700588 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400589 19, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(3, 113),
590 new CBC_QRCoderECB(4, 114)),
591 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(3, 44),
592 new CBC_QRCoderECB(11, 45)),
593 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(17, 21),
594 new CBC_QRCoderECB(4, 22)),
595 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(9, 13),
596 new CBC_QRCoderECB(16, 14))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700597 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400598 20, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(3, 107),
599 new CBC_QRCoderECB(5, 108)),
600 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(3, 41),
601 new CBC_QRCoderECB(13, 42)),
602 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(15, 24),
603 new CBC_QRCoderECB(5, 25)),
604 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(15, 15),
605 new CBC_QRCoderECB(10, 16))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700606 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400607 21, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 116),
608 new CBC_QRCoderECB(4, 117)),
609 new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(17, 42)),
610 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(17, 22),
611 new CBC_QRCoderECB(6, 23)),
612 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 16),
613 new CBC_QRCoderECB(6, 17))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700614 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400615 22, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 111),
616 new CBC_QRCoderECB(7, 112)),
617 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(17, 46)),
618 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(7, 24),
619 new CBC_QRCoderECB(16, 25)),
620 new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(34, 13))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700621 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400622 23, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(4, 121),
623 new CBC_QRCoderECB(5, 122)),
624 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 47),
625 new CBC_QRCoderECB(14, 48)),
626 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 24),
627 new CBC_QRCoderECB(14, 25)),
628 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(16, 15),
629 new CBC_QRCoderECB(14, 16))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700630 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400631 24, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(6, 117),
632 new CBC_QRCoderECB(4, 118)),
633 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(6, 45),
634 new CBC_QRCoderECB(14, 46)),
635 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 24),
636 new CBC_QRCoderECB(16, 25)),
637 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(30, 16),
638 new CBC_QRCoderECB(2, 17))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700639 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400640 25, new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(8, 106),
641 new CBC_QRCoderECB(4, 107)),
642 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(8, 47),
643 new CBC_QRCoderECB(13, 48)),
644 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(7, 24),
645 new CBC_QRCoderECB(22, 25)),
646 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(22, 15),
647 new CBC_QRCoderECB(13, 16))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700648 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400649 26, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(10, 114),
650 new CBC_QRCoderECB(2, 115)),
651 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(19, 46),
652 new CBC_QRCoderECB(4, 47)),
653 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(28, 22),
654 new CBC_QRCoderECB(6, 23)),
655 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(33, 16),
656 new CBC_QRCoderECB(4, 17))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700657 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400658 27, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(8, 122),
659 new CBC_QRCoderECB(4, 123)),
660 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(22, 45),
661 new CBC_QRCoderECB(3, 46)),
662 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(8, 23),
663 new CBC_QRCoderECB(26, 24)),
664 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(12, 15),
665 new CBC_QRCoderECB(28, 16))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700666 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400667 28, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(3, 117),
668 new CBC_QRCoderECB(10, 118)),
669 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(3, 45),
670 new CBC_QRCoderECB(23, 46)),
671 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(4, 24),
672 new CBC_QRCoderECB(31, 25)),
673 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 15),
674 new CBC_QRCoderECB(31, 16))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700675 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400676 29, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(7, 116),
677 new CBC_QRCoderECB(7, 117)),
678 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(21, 45),
679 new CBC_QRCoderECB(7, 46)),
680 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(1, 23),
681 new CBC_QRCoderECB(37, 24)),
682 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 15),
683 new CBC_QRCoderECB(26, 16))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700684 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400685 30, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(5, 115),
686 new CBC_QRCoderECB(10, 116)),
687 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(19, 47),
688 new CBC_QRCoderECB(10, 48)),
689 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(15, 24),
690 new CBC_QRCoderECB(25, 25)),
691 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(23, 15),
692 new CBC_QRCoderECB(25, 16))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700693 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400694 31, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(13, 115),
695 new CBC_QRCoderECB(3, 116)),
696 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 46),
697 new CBC_QRCoderECB(29, 47)),
698 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(42, 24),
699 new CBC_QRCoderECB(1, 25)),
700 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(23, 15),
701 new CBC_QRCoderECB(28, 16))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700702 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400703 32, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(17, 115)),
704 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(10, 46),
705 new CBC_QRCoderECB(23, 47)),
706 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(10, 24),
707 new CBC_QRCoderECB(35, 25)),
708 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 15),
709 new CBC_QRCoderECB(35, 16))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700710 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400711 33, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(17, 115),
712 new CBC_QRCoderECB(1, 116)),
713 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(14, 46),
714 new CBC_QRCoderECB(21, 47)),
715 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(29, 24),
716 new CBC_QRCoderECB(19, 25)),
717 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 15),
718 new CBC_QRCoderECB(46, 16))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700719 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400720 34, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(13, 115),
721 new CBC_QRCoderECB(6, 116)),
722 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(14, 46),
723 new CBC_QRCoderECB(23, 47)),
724 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(44, 24),
725 new CBC_QRCoderECB(7, 25)),
726 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(59, 16),
727 new CBC_QRCoderECB(1, 17))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700728 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400729 35, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(12, 121),
730 new CBC_QRCoderECB(7, 122)),
731 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(12, 47),
732 new CBC_QRCoderECB(26, 48)),
733 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(39, 24),
734 new CBC_QRCoderECB(14, 25)),
735 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(22, 15),
736 new CBC_QRCoderECB(41, 16))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700737 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400738 36, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(6, 121),
739 new CBC_QRCoderECB(14, 122)),
740 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(6, 47),
741 new CBC_QRCoderECB(34, 48)),
742 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(46, 24),
743 new CBC_QRCoderECB(10, 25)),
744 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(2, 15),
745 new CBC_QRCoderECB(64, 16))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700746 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400747 37, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(17, 122),
748 new CBC_QRCoderECB(4, 123)),
749 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(29, 46),
750 new CBC_QRCoderECB(14, 47)),
751 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(49, 24),
752 new CBC_QRCoderECB(10, 25)),
753 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(24, 15),
754 new CBC_QRCoderECB(46, 16))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700755 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400756 38, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(4, 122),
757 new CBC_QRCoderECB(18, 123)),
758 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(13, 46),
759 new CBC_QRCoderECB(32, 47)),
760 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(48, 24),
761 new CBC_QRCoderECB(14, 25)),
762 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(42, 15),
763 new CBC_QRCoderECB(32, 16))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700764 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400765 39, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(20, 117),
766 new CBC_QRCoderECB(4, 118)),
767 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(40, 47),
768 new CBC_QRCoderECB(7, 48)),
769 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(43, 24),
770 new CBC_QRCoderECB(22, 25)),
771 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(10, 15),
772 new CBC_QRCoderECB(67, 16))));
Tom Sepez8b6186f2017-03-28 12:06:45 -0700773 VERSION->push_back(new CBC_QRCoderVersion(
Dan Sinclair1770c022016-03-14 14:14:16 -0400774 40, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 118),
775 new CBC_QRCoderECB(6, 119)),
776 new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(18, 47),
777 new CBC_QRCoderECB(31, 48)),
778 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(34, 24),
779 new CBC_QRCoderECB(34, 25)),
780 new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(20, 15),
781 new CBC_QRCoderECB(61, 16))));
782 }
783 if (versionNumber < 1 || versionNumber > 40) {
784 e = BCExceptionIllegalArgument;
Tom Sepez3c056ae2017-02-06 09:34:23 -0800785 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400786 }
tsepez6020e452016-05-02 13:47:17 -0700787 return (*VERSION)[versionNumber - 1];
Dan Sinclair1770c022016-03-14 14:14:16 -0400788}
tsepez6020e452016-05-02 13:47:17 -0700789
Dan Sinclair1770c022016-03-14 14:14:16 -0400790void CBC_QRCoderVersion::Destroy() {
Tom Sepez8b6186f2017-03-28 12:06:45 -0700791 for (size_t i = 0; i < VERSION->size(); i++)
tsepez6020e452016-05-02 13:47:17 -0700792 delete (*VERSION)[i];
Tom Sepez8b6186f2017-03-28 12:06:45 -0700793 VERSION->clear();
Dan Sinclair1770c022016-03-14 14:14:16 -0400794}