// Copyright 2014 PDFium Authors. All rights reserved. | |
// Use of this source code is governed by a BSD-style license that can be | |
// found in the LICENSE file. | |
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | |
// Original code is licensed as follows: | |
/* | |
* Copyright 2007 ZXing authors | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
#include "xfa/src/fxbarcode/barcode.h" | |
#include "xfa/src/fxbarcode/utils.h" | |
#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h" | |
#include "BC_QRCoderECB.h" | |
#include "BC_QRCoderFormatInformation.h" | |
#include "BC_QRCoderErrorCorrectionLevel.h" | |
#include "BC_QRCoderBitVector.h" | |
#include "BC_QRCoderECBlocks.h" | |
#include "BC_QRCoderVersion.h" | |
const int32_t CBC_QRCoderVersion::VERSION_DECODE_INFO[] = { | |
0x07C94, 0x085BC, 0x09A99, 0x0A4D3, 0x0BBF6, 0x0C762, 0x0D847, | |
0x0E60D, 0x0F928, 0x10B78, 0x1145D, 0x12A17, 0x13532, 0x149A6, | |
0x15683, 0x168C9, 0x177EC, 0x18EC4, 0x191E1, 0x1AFAB, 0x1B08E, | |
0x1CC1A, 0x1D33F, 0x1ED75, 0x1F250, 0x209D5, 0x216F0, 0x228BA, | |
0x2379F, 0x24B0B, 0x2542E, 0x26A64, 0x27541, 0x28C69}; | |
CFX_PtrArray* CBC_QRCoderVersion::VERSION = NULL; | |
void CBC_QRCoderVersion::Initialize() { | |
VERSION = new CFX_PtrArray(); | |
} | |
void CBC_QRCoderVersion::Finalize() { | |
for (int32_t i = 0; i < VERSION->GetSize(); i++) { | |
CBC_QRCoderVersion* v = (CBC_QRCoderVersion*)(VERSION->GetAt(i)); | |
delete v; | |
} | |
delete VERSION; | |
} | |
CBC_QRCoderVersion::CBC_QRCoderVersion(int32_t versionNumber, | |
CBC_QRCoderECBlocks* ecBlocks1, | |
CBC_QRCoderECBlocks* ecBlocks2, | |
CBC_QRCoderECBlocks* ecBlocks3, | |
CBC_QRCoderECBlocks* ecBlocks4) { | |
m_versionNumber = versionNumber; | |
m_ecBlocks.Add(ecBlocks1); | |
m_ecBlocks.Add(ecBlocks2); | |
m_ecBlocks.Add(ecBlocks3); | |
m_ecBlocks.Add(ecBlocks4); | |
int32_t total = 0; | |
int32_t ecCodeWords = ecBlocks1->GetECCodeWordsPerBlock(); | |
CFX_PtrArray* ecbArray = ecBlocks1->GetECBlocks(); | |
for (int32_t i = 0; i < ecbArray->GetSize(); i++) { | |
CBC_QRCoderECB* ecBlock = (CBC_QRCoderECB*)((*ecbArray)[i]); | |
total += ecBlock->GetCount() * (ecBlock->GetDataCodeWords() + ecCodeWords); | |
} | |
m_totalCodeWords = total; | |
switch (versionNumber) { | |
case 1: | |
break; | |
case 2: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(18); | |
break; | |
case 3: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(22); | |
break; | |
case 4: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(26); | |
break; | |
case 5: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(30); | |
break; | |
case 6: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(34); | |
break; | |
case 7: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(22); | |
m_alignmentPatternCenters.Add(38); | |
break; | |
case 8: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(24); | |
m_alignmentPatternCenters.Add(42); | |
break; | |
case 9: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(26); | |
m_alignmentPatternCenters.Add(46); | |
break; | |
case 10: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(28); | |
m_alignmentPatternCenters.Add(50); | |
break; | |
case 11: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(30); | |
m_alignmentPatternCenters.Add(54); | |
break; | |
case 12: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(32); | |
m_alignmentPatternCenters.Add(58); | |
break; | |
case 13: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(34); | |
m_alignmentPatternCenters.Add(62); | |
break; | |
case 14: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(26); | |
m_alignmentPatternCenters.Add(46); | |
m_alignmentPatternCenters.Add(66); | |
break; | |
case 15: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(26); | |
m_alignmentPatternCenters.Add(48); | |
m_alignmentPatternCenters.Add(70); | |
break; | |
case 16: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(26); | |
m_alignmentPatternCenters.Add(50); | |
m_alignmentPatternCenters.Add(74); | |
break; | |
case 17: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(30); | |
m_alignmentPatternCenters.Add(54); | |
m_alignmentPatternCenters.Add(78); | |
break; | |
case 18: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(30); | |
m_alignmentPatternCenters.Add(56); | |
m_alignmentPatternCenters.Add(82); | |
break; | |
case 19: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(30); | |
m_alignmentPatternCenters.Add(58); | |
m_alignmentPatternCenters.Add(86); | |
break; | |
case 20: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(34); | |
m_alignmentPatternCenters.Add(62); | |
m_alignmentPatternCenters.Add(90); | |
break; | |
case 21: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(28); | |
m_alignmentPatternCenters.Add(50); | |
m_alignmentPatternCenters.Add(72); | |
m_alignmentPatternCenters.Add(94); | |
break; | |
case 22: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(26); | |
m_alignmentPatternCenters.Add(50); | |
m_alignmentPatternCenters.Add(74); | |
m_alignmentPatternCenters.Add(98); | |
break; | |
case 23: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(30); | |
m_alignmentPatternCenters.Add(54); | |
m_alignmentPatternCenters.Add(74); | |
m_alignmentPatternCenters.Add(102); | |
break; | |
case 24: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(28); | |
m_alignmentPatternCenters.Add(54); | |
m_alignmentPatternCenters.Add(80); | |
m_alignmentPatternCenters.Add(106); | |
break; | |
case 25: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(32); | |
m_alignmentPatternCenters.Add(58); | |
m_alignmentPatternCenters.Add(84); | |
m_alignmentPatternCenters.Add(110); | |
break; | |
case 26: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(30); | |
m_alignmentPatternCenters.Add(58); | |
m_alignmentPatternCenters.Add(86); | |
m_alignmentPatternCenters.Add(114); | |
break; | |
case 27: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(34); | |
m_alignmentPatternCenters.Add(62); | |
m_alignmentPatternCenters.Add(90); | |
m_alignmentPatternCenters.Add(118); | |
break; | |
case 28: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(26); | |
m_alignmentPatternCenters.Add(50); | |
m_alignmentPatternCenters.Add(74); | |
m_alignmentPatternCenters.Add(98); | |
m_alignmentPatternCenters.Add(122); | |
break; | |
case 29: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(30); | |
m_alignmentPatternCenters.Add(54); | |
m_alignmentPatternCenters.Add(78); | |
m_alignmentPatternCenters.Add(102); | |
m_alignmentPatternCenters.Add(126); | |
break; | |
case 30: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(26); | |
m_alignmentPatternCenters.Add(52); | |
m_alignmentPatternCenters.Add(78); | |
m_alignmentPatternCenters.Add(104); | |
m_alignmentPatternCenters.Add(130); | |
break; | |
case 31: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(30); | |
m_alignmentPatternCenters.Add(56); | |
m_alignmentPatternCenters.Add(82); | |
m_alignmentPatternCenters.Add(108); | |
m_alignmentPatternCenters.Add(134); | |
break; | |
case 32: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(34); | |
m_alignmentPatternCenters.Add(60); | |
m_alignmentPatternCenters.Add(86); | |
m_alignmentPatternCenters.Add(112); | |
m_alignmentPatternCenters.Add(138); | |
break; | |
case 33: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(30); | |
m_alignmentPatternCenters.Add(58); | |
m_alignmentPatternCenters.Add(86); | |
m_alignmentPatternCenters.Add(114); | |
m_alignmentPatternCenters.Add(142); | |
break; | |
case 34: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(34); | |
m_alignmentPatternCenters.Add(62); | |
m_alignmentPatternCenters.Add(90); | |
m_alignmentPatternCenters.Add(118); | |
m_alignmentPatternCenters.Add(146); | |
break; | |
case 35: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(30); | |
m_alignmentPatternCenters.Add(54); | |
m_alignmentPatternCenters.Add(78); | |
m_alignmentPatternCenters.Add(102); | |
m_alignmentPatternCenters.Add(126); | |
m_alignmentPatternCenters.Add(150); | |
break; | |
case 36: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(24); | |
m_alignmentPatternCenters.Add(50); | |
m_alignmentPatternCenters.Add(76); | |
m_alignmentPatternCenters.Add(102); | |
m_alignmentPatternCenters.Add(128); | |
m_alignmentPatternCenters.Add(154); | |
break; | |
case 37: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(28); | |
m_alignmentPatternCenters.Add(54); | |
m_alignmentPatternCenters.Add(80); | |
m_alignmentPatternCenters.Add(106); | |
m_alignmentPatternCenters.Add(132); | |
m_alignmentPatternCenters.Add(158); | |
break; | |
case 38: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(32); | |
m_alignmentPatternCenters.Add(58); | |
m_alignmentPatternCenters.Add(84); | |
m_alignmentPatternCenters.Add(110); | |
m_alignmentPatternCenters.Add(136); | |
m_alignmentPatternCenters.Add(162); | |
break; | |
case 39: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(26); | |
m_alignmentPatternCenters.Add(54); | |
m_alignmentPatternCenters.Add(82); | |
m_alignmentPatternCenters.Add(110); | |
m_alignmentPatternCenters.Add(138); | |
m_alignmentPatternCenters.Add(166); | |
break; | |
case 40: | |
m_alignmentPatternCenters.Add(6); | |
m_alignmentPatternCenters.Add(30); | |
m_alignmentPatternCenters.Add(58); | |
m_alignmentPatternCenters.Add(86); | |
m_alignmentPatternCenters.Add(114); | |
m_alignmentPatternCenters.Add(142); | |
m_alignmentPatternCenters.Add(170); | |
break; | |
} | |
} | |
CBC_QRCoderVersion::~CBC_QRCoderVersion() { | |
if (m_ecBlocks.GetSize() != 0) { | |
int32_t itBeg = 0; | |
int32_t itEnd = m_ecBlocks.GetSize(); | |
while (itBeg != itEnd) { | |
delete ((CBC_QRCoderECBlocks*)(m_ecBlocks[itBeg])); | |
itBeg++; | |
} | |
} | |
} | |
int32_t CBC_QRCoderVersion::GetVersionNumber() { | |
return m_versionNumber; | |
} | |
CFX_Int32Array* CBC_QRCoderVersion::GetAlignmentPatternCenters() { | |
return &m_alignmentPatternCenters; | |
} | |
int32_t CBC_QRCoderVersion::GetTotalCodeWords() { | |
return m_totalCodeWords; | |
} | |
int32_t CBC_QRCoderVersion::GetDimensionForVersion() { | |
return 17 + 4 * m_versionNumber; | |
} | |
CBC_QRCoderECBlocks* CBC_QRCoderVersion::GetECBlocksForLevel( | |
CBC_QRCoderErrorCorrectionLevel* ecLevel) { | |
return (CBC_QRCoderECBlocks*)m_ecBlocks[ecLevel->Ordinal()]; | |
} | |
CBC_QRCoderVersion* CBC_QRCoderVersion::GetProvisionalVersionForDimension( | |
int32_t dimension, | |
int32_t& e) { | |
if ((dimension % 4) != 1) { | |
e = BCExceptionRead; | |
BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | |
} | |
CBC_QRCoderVersion* qcv = GetVersionForNumber((dimension - 17) >> 2, e); | |
BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | |
return qcv; | |
} | |
CBC_QRCoderVersion* CBC_QRCoderVersion::DecodeVersionInformation( | |
int32_t versionBits, | |
int32_t& e) { | |
int32_t bestDifference = FXSYS_IntMax; | |
int32_t bestVersion = 0; | |
for (int32_t i = 0; i < 34; i++) { | |
int32_t targetVersion = VERSION_DECODE_INFO[i]; | |
if (targetVersion == versionBits) { | |
CBC_QRCoderVersion* qcv = GetVersionForNumber(i + 7, e); | |
BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | |
return qcv; | |
} | |
int32_t bitsDifference = CBC_QRCoderFormatInformation::NumBitsDiffering( | |
versionBits, targetVersion); | |
if (bitsDifference < bestDifference) { | |
bestVersion = i + 7; | |
bestDifference = bitsDifference; | |
} | |
} | |
if (bestDifference <= 3) { | |
CBC_QRCoderVersion* qcv = GetVersionForNumber(bestVersion, e); | |
BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | |
return qcv; | |
} | |
return NULL; | |
} | |
CBC_CommonBitMatrix* CBC_QRCoderVersion::BuildFunctionPattern(int32_t& e) { | |
int32_t dimension = GetDimensionForVersion(); | |
CBC_CommonBitMatrix* bitMatrix = new CBC_CommonBitMatrix(); | |
bitMatrix->Init(dimension); | |
bitMatrix->SetRegion(0, 0, 9, 9, e); | |
BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | |
bitMatrix->SetRegion(dimension - 8, 0, 8, 9, e); | |
BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | |
bitMatrix->SetRegion(0, dimension - 8, 9, 8, e); | |
BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | |
int32_t max = m_alignmentPatternCenters.GetSize(); | |
for (int32_t x = 0; x < max; x++) { | |
int32_t i = m_alignmentPatternCenters[x] - 2; | |
for (int32_t y = 0; y < max; y++) { | |
if ((x == 0 && (y == 0 || y == max - 1)) || (x == max - 1 && y == 0)) { | |
continue; | |
} | |
bitMatrix->SetRegion(m_alignmentPatternCenters[y] - 2, i, 5, 5, e); | |
BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | |
} | |
} | |
bitMatrix->SetRegion(6, 9, 1, dimension - 17, e); | |
BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | |
bitMatrix->SetRegion(9, 6, dimension - 17, 1, e); | |
BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | |
if (m_versionNumber > 6) { | |
bitMatrix->SetRegion(dimension - 11, 0, 3, 6, e); | |
BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | |
bitMatrix->SetRegion(0, dimension - 11, 6, 3, e); | |
BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | |
} | |
return bitMatrix; | |
} | |
CBC_QRCoderVersion* CBC_QRCoderVersion::GetVersionForNumber( | |
int32_t versionNumber, | |
int32_t& e) { | |
if (VERSION->GetSize() == 0) { | |
VERSION->Add(new CBC_QRCoderVersion( | |
1, new CBC_QRCoderECBlocks(7, new CBC_QRCoderECB(1, 19)), | |
new CBC_QRCoderECBlocks(10, new CBC_QRCoderECB(1, 16)), | |
new CBC_QRCoderECBlocks(13, new CBC_QRCoderECB(1, 13)), | |
new CBC_QRCoderECBlocks(17, new CBC_QRCoderECB(1, 9)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
2, new CBC_QRCoderECBlocks(10, new CBC_QRCoderECB(1, 34)), | |
new CBC_QRCoderECBlocks(16, new CBC_QRCoderECB(1, 28)), | |
new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(1, 22)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(1, 16)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
3, new CBC_QRCoderECBlocks(15, new CBC_QRCoderECB(1, 55)), | |
new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(1, 44)), | |
new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 17)), | |
new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(2, 13)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
4, new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(1, 80)), | |
new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 32)), | |
new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(2, 24)), | |
new CBC_QRCoderECBlocks(16, new CBC_QRCoderECB(4, 9)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
5, new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(1, 108)), | |
new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(2, 43)), | |
new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 15), | |
new CBC_QRCoderECB(2, 16)), | |
new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(2, 11), | |
new CBC_QRCoderECB(2, 12)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
6, new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 68)), | |
new CBC_QRCoderECBlocks(16, new CBC_QRCoderECB(4, 27)), | |
new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(4, 19)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 15)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
7, new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(2, 78)), | |
new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(4, 31)), | |
new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 14), | |
new CBC_QRCoderECB(4, 15)), | |
new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 13), | |
new CBC_QRCoderECB(1, 14)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
8, new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(2, 97)), | |
new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(2, 38), | |
new CBC_QRCoderECB(2, 39)), | |
new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(4, 18), | |
new CBC_QRCoderECB(2, 19)), | |
new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 14), | |
new CBC_QRCoderECB(2, 15)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
9, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(2, 116)), | |
new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(3, 36), | |
new CBC_QRCoderECB(2, 37)), | |
new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(4, 16), | |
new CBC_QRCoderECB(4, 17)), | |
new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(4, 12), | |
new CBC_QRCoderECB(4, 13)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
10, new CBC_QRCoderECBlocks(18, new CBC_QRCoderECB(2, 68), | |
new CBC_QRCoderECB(2, 69)), | |
new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 43), | |
new CBC_QRCoderECB(1, 44)), | |
new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(6, 19), | |
new CBC_QRCoderECB(2, 20)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(6, 15), | |
new CBC_QRCoderECB(2, 16)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
11, new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(4, 81)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(1, 50), | |
new CBC_QRCoderECB(4, 51)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 22), | |
new CBC_QRCoderECB(4, 23)), | |
new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(3, 12), | |
new CBC_QRCoderECB(8, 13)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
12, new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(2, 92), | |
new CBC_QRCoderECB(2, 93)), | |
new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(6, 36), | |
new CBC_QRCoderECB(2, 37)), | |
new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 20), | |
new CBC_QRCoderECB(6, 21)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(7, 14), | |
new CBC_QRCoderECB(4, 15)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
13, new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(4, 107)), | |
new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(8, 37), | |
new CBC_QRCoderECB(1, 38)), | |
new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(8, 20), | |
new CBC_QRCoderECB(4, 21)), | |
new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(12, 11), | |
new CBC_QRCoderECB(4, 12)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
14, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(3, 115), | |
new CBC_QRCoderECB(1, 116)), | |
new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(4, 40), | |
new CBC_QRCoderECB(5, 41)), | |
new CBC_QRCoderECBlocks(20, new CBC_QRCoderECB(11, 16), | |
new CBC_QRCoderECB(5, 17)), | |
new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(11, 12), | |
new CBC_QRCoderECB(5, 13)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
15, new CBC_QRCoderECBlocks(22, new CBC_QRCoderECB(5, 87), | |
new CBC_QRCoderECB(1, 88)), | |
new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(5, 41), | |
new CBC_QRCoderECB(5, 42)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(5, 24), | |
new CBC_QRCoderECB(7, 25)), | |
new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(11, 12), | |
new CBC_QRCoderECB(7, 13)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
16, new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(5, 98), | |
new CBC_QRCoderECB(1, 99)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(7, 45), | |
new CBC_QRCoderECB(3, 46)), | |
new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(15, 19), | |
new CBC_QRCoderECB(2, 20)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(3, 15), | |
new CBC_QRCoderECB(13, 16)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
17, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(1, 107), | |
new CBC_QRCoderECB(5, 108)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(10, 46), | |
new CBC_QRCoderECB(1, 47)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(1, 22), | |
new CBC_QRCoderECB(15, 23)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 14), | |
new CBC_QRCoderECB(17, 15)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
18, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(5, 120), | |
new CBC_QRCoderECB(1, 121)), | |
new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(9, 43), | |
new CBC_QRCoderECB(4, 44)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(17, 22), | |
new CBC_QRCoderECB(1, 23)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 14), | |
new CBC_QRCoderECB(19, 15)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
19, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(3, 113), | |
new CBC_QRCoderECB(4, 114)), | |
new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(3, 44), | |
new CBC_QRCoderECB(11, 45)), | |
new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(17, 21), | |
new CBC_QRCoderECB(4, 22)), | |
new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(9, 13), | |
new CBC_QRCoderECB(16, 14)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
20, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(3, 107), | |
new CBC_QRCoderECB(5, 108)), | |
new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(3, 41), | |
new CBC_QRCoderECB(13, 42)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(15, 24), | |
new CBC_QRCoderECB(5, 25)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(15, 15), | |
new CBC_QRCoderECB(10, 16)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
21, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 116), | |
new CBC_QRCoderECB(4, 117)), | |
new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(17, 42)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(17, 22), | |
new CBC_QRCoderECB(6, 23)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 16), | |
new CBC_QRCoderECB(6, 17)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
22, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 111), | |
new CBC_QRCoderECB(7, 112)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(17, 46)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(7, 24), | |
new CBC_QRCoderECB(16, 25)), | |
new CBC_QRCoderECBlocks(24, new CBC_QRCoderECB(34, 13)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
23, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(4, 121), | |
new CBC_QRCoderECB(5, 122)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(4, 47), | |
new CBC_QRCoderECB(14, 48)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 24), | |
new CBC_QRCoderECB(14, 25)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(16, 15), | |
new CBC_QRCoderECB(14, 16)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
24, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(6, 117), | |
new CBC_QRCoderECB(4, 118)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(6, 45), | |
new CBC_QRCoderECB(14, 46)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 24), | |
new CBC_QRCoderECB(16, 25)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(30, 16), | |
new CBC_QRCoderECB(2, 17)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
25, new CBC_QRCoderECBlocks(26, new CBC_QRCoderECB(8, 106), | |
new CBC_QRCoderECB(4, 107)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(8, 47), | |
new CBC_QRCoderECB(13, 48)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(7, 24), | |
new CBC_QRCoderECB(22, 25)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(22, 15), | |
new CBC_QRCoderECB(13, 16)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
26, new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(10, 114), | |
new CBC_QRCoderECB(2, 115)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(19, 46), | |
new CBC_QRCoderECB(4, 47)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(28, 22), | |
new CBC_QRCoderECB(6, 23)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(33, 16), | |
new CBC_QRCoderECB(4, 17)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
27, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(8, 122), | |
new CBC_QRCoderECB(4, 123)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(22, 45), | |
new CBC_QRCoderECB(3, 46)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(8, 23), | |
new CBC_QRCoderECB(26, 24)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(12, 15), | |
new CBC_QRCoderECB(28, 16)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
28, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(3, 117), | |
new CBC_QRCoderECB(10, 118)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(3, 45), | |
new CBC_QRCoderECB(23, 46)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(4, 24), | |
new CBC_QRCoderECB(31, 25)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 15), | |
new CBC_QRCoderECB(31, 16)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
29, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(7, 116), | |
new CBC_QRCoderECB(7, 117)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(21, 45), | |
new CBC_QRCoderECB(7, 46)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(1, 23), | |
new CBC_QRCoderECB(37, 24)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 15), | |
new CBC_QRCoderECB(26, 16)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
30, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(5, 115), | |
new CBC_QRCoderECB(10, 116)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(19, 47), | |
new CBC_QRCoderECB(10, 48)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(15, 24), | |
new CBC_QRCoderECB(25, 25)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(23, 15), | |
new CBC_QRCoderECB(25, 16)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
31, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(13, 115), | |
new CBC_QRCoderECB(3, 116)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(2, 46), | |
new CBC_QRCoderECB(29, 47)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(42, 24), | |
new CBC_QRCoderECB(1, 25)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(23, 15), | |
new CBC_QRCoderECB(28, 16)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
32, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(17, 115)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(10, 46), | |
new CBC_QRCoderECB(23, 47)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(10, 24), | |
new CBC_QRCoderECB(35, 25)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 15), | |
new CBC_QRCoderECB(35, 16)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
33, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(17, 115), | |
new CBC_QRCoderECB(1, 116)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(14, 46), | |
new CBC_QRCoderECB(21, 47)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(29, 24), | |
new CBC_QRCoderECB(19, 25)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(11, 15), | |
new CBC_QRCoderECB(46, 16)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
34, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(13, 115), | |
new CBC_QRCoderECB(6, 116)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(14, 46), | |
new CBC_QRCoderECB(23, 47)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(44, 24), | |
new CBC_QRCoderECB(7, 25)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(59, 16), | |
new CBC_QRCoderECB(1, 17)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
35, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(12, 121), | |
new CBC_QRCoderECB(7, 122)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(12, 47), | |
new CBC_QRCoderECB(26, 48)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(39, 24), | |
new CBC_QRCoderECB(14, 25)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(22, 15), | |
new CBC_QRCoderECB(41, 16)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
36, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(6, 121), | |
new CBC_QRCoderECB(14, 122)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(6, 47), | |
new CBC_QRCoderECB(34, 48)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(46, 24), | |
new CBC_QRCoderECB(10, 25)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(2, 15), | |
new CBC_QRCoderECB(64, 16)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
37, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(17, 122), | |
new CBC_QRCoderECB(4, 123)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(29, 46), | |
new CBC_QRCoderECB(14, 47)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(49, 24), | |
new CBC_QRCoderECB(10, 25)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(24, 15), | |
new CBC_QRCoderECB(46, 16)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
38, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(4, 122), | |
new CBC_QRCoderECB(18, 123)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(13, 46), | |
new CBC_QRCoderECB(32, 47)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(48, 24), | |
new CBC_QRCoderECB(14, 25)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(42, 15), | |
new CBC_QRCoderECB(32, 16)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
39, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(20, 117), | |
new CBC_QRCoderECB(4, 118)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(40, 47), | |
new CBC_QRCoderECB(7, 48)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(43, 24), | |
new CBC_QRCoderECB(22, 25)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(10, 15), | |
new CBC_QRCoderECB(67, 16)))); | |
VERSION->Add(new CBC_QRCoderVersion( | |
40, new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(19, 118), | |
new CBC_QRCoderECB(6, 119)), | |
new CBC_QRCoderECBlocks(28, new CBC_QRCoderECB(18, 47), | |
new CBC_QRCoderECB(31, 48)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(34, 24), | |
new CBC_QRCoderECB(34, 25)), | |
new CBC_QRCoderECBlocks(30, new CBC_QRCoderECB(20, 15), | |
new CBC_QRCoderECB(61, 16)))); | |
} | |
if (versionNumber < 1 || versionNumber > 40) { | |
e = BCExceptionIllegalArgument; | |
BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | |
} | |
return (CBC_QRCoderVersion*)(*VERSION)[versionNumber - 1]; | |
} | |
void CBC_QRCoderVersion::Destroy() { | |
int32_t i; | |
for (i = 0; i < VERSION->GetSize(); i++) { | |
delete ((CBC_QRCoderVersion*)(*VERSION)[i]); | |
} | |
} |