| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 // Original code is licensed as follows: | 6 // Original code is licensed as follows: |
| 7 /* | 7 /* |
| 8 * Copyright 2013 ZXing authors | 8 * Copyright 2013 ZXing authors |
| 9 * | 9 * |
| 10 * Licensed under the Apache License, Version 2.0 (the "License"); | 10 * Licensed under the Apache License, Version 2.0 (the "License"); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 #include "BC_PDF417DetectionResultRowIndicatorColumn.h" | 33 #include "BC_PDF417DetectionResultRowIndicatorColumn.h" |
| 34 #include "BC_PDF417DetectionResult.h" | 34 #include "BC_PDF417DetectionResult.h" |
| 35 #include "BC_PDF417DecodedBitStreamParser.h" | 35 #include "BC_PDF417DecodedBitStreamParser.h" |
| 36 #include "BC_PDF417CodewordDecoder.h" | 36 #include "BC_PDF417CodewordDecoder.h" |
| 37 #include "BC_PDF417DecodedBitStreamParser.h" | 37 #include "BC_PDF417DecodedBitStreamParser.h" |
| 38 #include "BC_PDF417ECModulusPoly.h" | 38 #include "BC_PDF417ECModulusPoly.h" |
| 39 #include "BC_PDF417ECModulusGF.h" | 39 #include "BC_PDF417ECModulusGF.h" |
| 40 #include "BC_PDF417ECErrorCorrection.h" | 40 #include "BC_PDF417ECErrorCorrection.h" |
| 41 #include "BC_PDF417DecodedBitStreamParser.h" | 41 #include "BC_PDF417DecodedBitStreamParser.h" |
| 42 #include "BC_PDF417ScanningDecoder.h" | 42 #include "BC_PDF417ScanningDecoder.h" |
| 43 FX_INT32 CBC_PDF417ScanningDecoder::CODEWORD_SKEW_SIZE = 2; | 43 int32_t CBC_PDF417ScanningDecoder::CODEWORD_SKEW_SIZE = 2; |
| 44 FX_INT32 CBC_PDF417ScanningDecoder::MAX_ERRORS = 3; | 44 int32_t CBC_PDF417ScanningDecoder::MAX_ERRORS = 3; |
| 45 FX_INT32 CBC_PDF417ScanningDecoder::MAX_EC_CODEWORDS = 512; | 45 int32_t CBC_PDF417ScanningDecoder::MAX_EC_CODEWORDS = 512; |
| 46 CBC_PDF417ECErrorCorrection* CBC_PDF417ScanningDecoder::errorCorrection = NULL; | 46 CBC_PDF417ECErrorCorrection* CBC_PDF417ScanningDecoder::errorCorrection = NULL; |
| 47 CBC_PDF417ScanningDecoder::CBC_PDF417ScanningDecoder() | 47 CBC_PDF417ScanningDecoder::CBC_PDF417ScanningDecoder() |
| 48 { | 48 { |
| 49 } | 49 } |
| 50 CBC_PDF417ScanningDecoder::~CBC_PDF417ScanningDecoder() | 50 CBC_PDF417ScanningDecoder::~CBC_PDF417ScanningDecoder() |
| 51 { | 51 { |
| 52 } | 52 } |
| 53 void CBC_PDF417ScanningDecoder::Initialize() | 53 void CBC_PDF417ScanningDecoder::Initialize() |
| 54 { | 54 { |
| 55 errorCorrection = FX_NEW CBC_PDF417ECErrorCorrection; | 55 errorCorrection = FX_NEW CBC_PDF417ECErrorCorrection; |
| 56 } | 56 } |
| 57 void CBC_PDF417ScanningDecoder::Finalize() | 57 void CBC_PDF417ScanningDecoder::Finalize() |
| 58 { | 58 { |
| 59 delete errorCorrection; | 59 delete errorCorrection; |
| 60 } | 60 } |
| 61 CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::decode(CBC_CommonBitMatrix*
image, CBC_ResultPoint* imageTopLeft, CBC_ResultPoint* imageBottomLeft, CBC_Resu
ltPoint* imageTopRight, | 61 CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::decode(CBC_CommonBitMatrix*
image, CBC_ResultPoint* imageTopLeft, CBC_ResultPoint* imageBottomLeft, CBC_Resu
ltPoint* imageTopRight, |
| 62 CBC_ResultPoint* imageBottomRight, FX_INT32 minCodewordWidth, FX_INT32 m
axCodewordWidth, FX_INT32 &e) | 62 CBC_ResultPoint* imageBottomRight, int32_t minCodewordWidth, int32_t max
CodewordWidth, int32_t &e) |
| 63 { | 63 { |
| 64 CBC_BoundingBox* boundingBox = FX_NEW CBC_BoundingBox(image, imageTopLeft, i
mageBottomLeft, imageTopRight, imageBottomRight, e); | 64 CBC_BoundingBox* boundingBox = FX_NEW CBC_BoundingBox(image, imageTopLeft, i
mageBottomLeft, imageTopRight, imageBottomRight, e); |
| 65 BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | 65 BC_EXCEPTION_CHECK_ReturnValue(e, NULL); |
| 66 CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn = NULL; | 66 CBC_DetectionResultRowIndicatorColumn* leftRowIndicatorColumn = NULL; |
| 67 CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn = NULL; | 67 CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn = NULL; |
| 68 CBC_DetectionResult* detectionResult = NULL; | 68 CBC_DetectionResult* detectionResult = NULL; |
| 69 for (FX_INT32 i = 0; i < 2; i++) { | 69 for (int32_t i = 0; i < 2; i++) { |
| 70 if (imageTopLeft != NULL) { | 70 if (imageTopLeft != NULL) { |
| 71 leftRowIndicatorColumn = getRowIndicatorColumn(image, boundingBox, *
imageTopLeft, TRUE, minCodewordWidth, maxCodewordWidth); | 71 leftRowIndicatorColumn = getRowIndicatorColumn(image, boundingBox, *
imageTopLeft, TRUE, minCodewordWidth, maxCodewordWidth); |
| 72 } | 72 } |
| 73 if (imageTopRight != NULL) { | 73 if (imageTopRight != NULL) { |
| 74 rightRowIndicatorColumn = getRowIndicatorColumn(image, boundingBox,
*imageTopRight, FALSE, minCodewordWidth, maxCodewordWidth); | 74 rightRowIndicatorColumn = getRowIndicatorColumn(image, boundingBox,
*imageTopRight, FALSE, minCodewordWidth, maxCodewordWidth); |
| 75 } | 75 } |
| 76 detectionResult = merge(leftRowIndicatorColumn, rightRowIndicatorColumn,
e); | 76 detectionResult = merge(leftRowIndicatorColumn, rightRowIndicatorColumn,
e); |
| 77 if (e != BCExceptionNO) { | 77 if (e != BCExceptionNO) { |
| 78 e = BCExceptiontNotFoundInstance; | 78 e = BCExceptiontNotFoundInstance; |
| 79 delete leftRowIndicatorColumn; | 79 delete leftRowIndicatorColumn; |
| 80 delete rightRowIndicatorColumn; | 80 delete rightRowIndicatorColumn; |
| 81 delete boundingBox; | 81 delete boundingBox; |
| 82 return NULL; | 82 return NULL; |
| 83 } | 83 } |
| 84 if (i == 0 && (detectionResult->getBoundingBox()->getMinY() < boundingBo
x->getMinY() || detectionResult->getBoundingBox()->getMaxY() > boundingBox->getM
axY())) { | 84 if (i == 0 && (detectionResult->getBoundingBox()->getMinY() < boundingBo
x->getMinY() || detectionResult->getBoundingBox()->getMaxY() > boundingBox->getM
axY())) { |
| 85 delete boundingBox; | 85 delete boundingBox; |
| 86 boundingBox = detectionResult->getBoundingBox(); | 86 boundingBox = detectionResult->getBoundingBox(); |
| 87 } else { | 87 } else { |
| 88 detectionResult->setBoundingBox(boundingBox); | 88 detectionResult->setBoundingBox(boundingBox); |
| 89 break; | 89 break; |
| 90 } | 90 } |
| 91 } | 91 } |
| 92 FX_INT32 maxBarcodeColumn = detectionResult->getBarcodeColumnCount() + 1; | 92 int32_t maxBarcodeColumn = detectionResult->getBarcodeColumnCount() + 1; |
| 93 detectionResult->setDetectionResultColumn(0, leftRowIndicatorColumn); | 93 detectionResult->setDetectionResultColumn(0, leftRowIndicatorColumn); |
| 94 detectionResult->setDetectionResultColumn(maxBarcodeColumn, rightRowIndicato
rColumn); | 94 detectionResult->setDetectionResultColumn(maxBarcodeColumn, rightRowIndicato
rColumn); |
| 95 FX_BOOL leftToRight = leftRowIndicatorColumn != NULL; | 95 FX_BOOL leftToRight = leftRowIndicatorColumn != NULL; |
| 96 for (FX_INT32 barcodeColumnCount = 1; barcodeColumnCount <= maxBarcodeColumn
; barcodeColumnCount++) { | 96 for (int32_t barcodeColumnCount = 1; barcodeColumnCount <= maxBarcodeColumn;
barcodeColumnCount++) { |
| 97 FX_INT32 barcodeColumn = leftToRight ? barcodeColumnCount : maxBarcodeCo
lumn - barcodeColumnCount; | 97 int32_t barcodeColumn = leftToRight ? barcodeColumnCount : maxBarcodeCol
umn - barcodeColumnCount; |
| 98 if (detectionResult->getDetectionResultColumn(barcodeColumn) != NULL) { | 98 if (detectionResult->getDetectionResultColumn(barcodeColumn) != NULL) { |
| 99 continue; | 99 continue; |
| 100 } | 100 } |
| 101 CBC_DetectionResultColumn* detectionResultColumn = NULL; | 101 CBC_DetectionResultColumn* detectionResultColumn = NULL; |
| 102 if (barcodeColumn == 0 || barcodeColumn == maxBarcodeColumn) { | 102 if (barcodeColumn == 0 || barcodeColumn == maxBarcodeColumn) { |
| 103 detectionResultColumn = FX_NEW CBC_DetectionResultRowIndicatorColumn
(boundingBox, barcodeColumn == 0); | 103 detectionResultColumn = FX_NEW CBC_DetectionResultRowIndicatorColumn
(boundingBox, barcodeColumn == 0); |
| 104 } else { | 104 } else { |
| 105 detectionResultColumn = FX_NEW CBC_DetectionResultColumn(boundingBox
); | 105 detectionResultColumn = FX_NEW CBC_DetectionResultColumn(boundingBox
); |
| 106 } | 106 } |
| 107 detectionResult->setDetectionResultColumn(barcodeColumn, detectionResult
Column); | 107 detectionResult->setDetectionResultColumn(barcodeColumn, detectionResult
Column); |
| 108 FX_INT32 startColumn = -1; | 108 int32_t startColumn = -1; |
| 109 FX_INT32 previousStartColumn = startColumn; | 109 int32_t previousStartColumn = startColumn; |
| 110 for (FX_INT32 imageRow = boundingBox->getMinY(); imageRow <= boundingBox
->getMaxY(); imageRow++) { | 110 for (int32_t imageRow = boundingBox->getMinY(); imageRow <= boundingBox-
>getMaxY(); imageRow++) { |
| 111 startColumn = getStartColumn(detectionResult, barcodeColumn, imageRo
w, leftToRight); | 111 startColumn = getStartColumn(detectionResult, barcodeColumn, imageRo
w, leftToRight); |
| 112 if (startColumn < 0 || startColumn > boundingBox->getMaxX()) { | 112 if (startColumn < 0 || startColumn > boundingBox->getMaxX()) { |
| 113 if (previousStartColumn == -1) { | 113 if (previousStartColumn == -1) { |
| 114 continue; | 114 continue; |
| 115 } | 115 } |
| 116 startColumn = previousStartColumn; | 116 startColumn = previousStartColumn; |
| 117 } | 117 } |
| 118 CBC_Codeword* codeword = detectCodeword(image, boundingBox->getMinX(
), boundingBox->getMaxX(), leftToRight, startColumn, imageRow, minCodewordWidth,
maxCodewordWidth); | 118 CBC_Codeword* codeword = detectCodeword(image, boundingBox->getMinX(
), boundingBox->getMaxX(), leftToRight, startColumn, imageRow, minCodewordWidth,
maxCodewordWidth); |
| 119 if (codeword != NULL) { | 119 if (codeword != NULL) { |
| 120 detectionResultColumn->setCodeword(imageRow, codeword); | 120 detectionResultColumn->setCodeword(imageRow, codeword); |
| 121 previousStartColumn = startColumn; | 121 previousStartColumn = startColumn; |
| 122 minCodewordWidth = minCodewordWidth < codeword->getWidth() ? min
CodewordWidth : codeword->getWidth(); | 122 minCodewordWidth = minCodewordWidth < codeword->getWidth() ? min
CodewordWidth : codeword->getWidth(); |
| 123 maxCodewordWidth = maxCodewordWidth > codeword->getWidth() ? max
CodewordWidth : codeword->getWidth(); | 123 maxCodewordWidth = maxCodewordWidth > codeword->getWidth() ? max
CodewordWidth : codeword->getWidth(); |
| 124 } | 124 } |
| 125 } | 125 } |
| 126 } | 126 } |
| 127 CBC_CommonDecoderResult* decoderresult = createDecoderResult(detectionResult
, e); | 127 CBC_CommonDecoderResult* decoderresult = createDecoderResult(detectionResult
, e); |
| 128 if (e != BCExceptionNO) { | 128 if (e != BCExceptionNO) { |
| 129 delete detectionResult; | 129 delete detectionResult; |
| 130 return NULL; | 130 return NULL; |
| 131 } | 131 } |
| 132 return decoderresult; | 132 return decoderresult; |
| 133 } | 133 } |
| 134 CFX_ByteString CBC_PDF417ScanningDecoder::toString(CFX_PtrArray* barcodeMatrix) | 134 CFX_ByteString CBC_PDF417ScanningDecoder::toString(CFX_PtrArray* barcodeMatrix) |
| 135 { | 135 { |
| 136 CFX_ByteString result; | 136 CFX_ByteString result; |
| 137 for (FX_INT32 row = 0; row < barcodeMatrix->GetSize(); row++) { | 137 for (int32_t row = 0; row < barcodeMatrix->GetSize(); row++) { |
| 138 result += row; | 138 result += row; |
| 139 FX_INT32 l = 0; | 139 int32_t l = 0; |
| 140 for (; l < ((CFX_PtrArray*)barcodeMatrix->GetAt(row))->GetSize(); l++) { | 140 for (; l < ((CFX_PtrArray*)barcodeMatrix->GetAt(row))->GetSize(); l++) { |
| 141 CBC_BarcodeValue* barcodeValue = (CBC_BarcodeValue*)((CFX_PtrArray*)
barcodeMatrix->GetAt(row))->GetAt(l); | 141 CBC_BarcodeValue* barcodeValue = (CBC_BarcodeValue*)((CFX_PtrArray*)
barcodeMatrix->GetAt(row))->GetAt(l); |
| 142 if (barcodeValue->getValue()->GetSize() == 0) { | 142 if (barcodeValue->getValue()->GetSize() == 0) { |
| 143 result += ""; | 143 result += ""; |
| 144 } else { | 144 } else { |
| 145 result += barcodeValue->getValue()->GetAt(0); | 145 result += barcodeValue->getValue()->GetAt(0); |
| 146 result += barcodeValue->getConfidence(barcodeValue->getValue()->
GetAt(0)); | 146 result += barcodeValue->getConfidence(barcodeValue->getValue()->
GetAt(0)); |
| 147 } | 147 } |
| 148 } | 148 } |
| 149 } | 149 } |
| 150 return result; | 150 return result; |
| 151 } | 151 } |
| 152 CBC_DetectionResult* CBC_PDF417ScanningDecoder::merge(CBC_DetectionResultRowIndi
catorColumn* leftRowIndicatorColumn, CBC_DetectionResultRowIndicatorColumn* righ
tRowIndicatorColumn, FX_INT32 &e) | 152 CBC_DetectionResult* CBC_PDF417ScanningDecoder::merge(CBC_DetectionResultRowIndi
catorColumn* leftRowIndicatorColumn, CBC_DetectionResultRowIndicatorColumn* righ
tRowIndicatorColumn, int32_t &e) |
| 153 { | 153 { |
| 154 if (leftRowIndicatorColumn == NULL && rightRowIndicatorColumn == NULL) { | 154 if (leftRowIndicatorColumn == NULL && rightRowIndicatorColumn == NULL) { |
| 155 e = BCExceptionIllegalArgument; | 155 e = BCExceptionIllegalArgument; |
| 156 return NULL; | 156 return NULL; |
| 157 } | 157 } |
| 158 CBC_BarcodeMetadata* barcodeMetadata = getBarcodeMetadata(leftRowIndicatorCo
lumn, rightRowIndicatorColumn); | 158 CBC_BarcodeMetadata* barcodeMetadata = getBarcodeMetadata(leftRowIndicatorCo
lumn, rightRowIndicatorColumn); |
| 159 if (barcodeMetadata == NULL) { | 159 if (barcodeMetadata == NULL) { |
| 160 e = BCExceptionCannotMetadata; | 160 e = BCExceptionCannotMetadata; |
| 161 return NULL; | 161 return NULL; |
| 162 } | 162 } |
| 163 CBC_BoundingBox* leftboundingBox = adjustBoundingBox(leftRowIndicatorColumn,
e); | 163 CBC_BoundingBox* leftboundingBox = adjustBoundingBox(leftRowIndicatorColumn,
e); |
| 164 if (e != BCExceptionNO) { | 164 if (e != BCExceptionNO) { |
| 165 delete barcodeMetadata; | 165 delete barcodeMetadata; |
| 166 return NULL; | 166 return NULL; |
| 167 } | 167 } |
| 168 CBC_BoundingBox* rightboundingBox = adjustBoundingBox(rightRowIndicatorColum
n, e); | 168 CBC_BoundingBox* rightboundingBox = adjustBoundingBox(rightRowIndicatorColum
n, e); |
| 169 if (e != BCExceptionNO) { | 169 if (e != BCExceptionNO) { |
| 170 delete barcodeMetadata; | 170 delete barcodeMetadata; |
| 171 return NULL; | 171 return NULL; |
| 172 } | 172 } |
| 173 CBC_BoundingBox* boundingBox = CBC_BoundingBox::merge(leftboundingBox, right
boundingBox, e); | 173 CBC_BoundingBox* boundingBox = CBC_BoundingBox::merge(leftboundingBox, right
boundingBox, e); |
| 174 if (e != BCExceptionNO) { | 174 if (e != BCExceptionNO) { |
| 175 delete barcodeMetadata; | 175 delete barcodeMetadata; |
| 176 return NULL; | 176 return NULL; |
| 177 } | 177 } |
| 178 CBC_DetectionResult* detectionresult = FX_NEW CBC_DetectionResult(barcodeMet
adata, boundingBox); | 178 CBC_DetectionResult* detectionresult = FX_NEW CBC_DetectionResult(barcodeMet
adata, boundingBox); |
| 179 return detectionresult; | 179 return detectionresult; |
| 180 } | 180 } |
| 181 CBC_BoundingBox* CBC_PDF417ScanningDecoder::adjustBoundingBox(CBC_DetectionResul
tRowIndicatorColumn* rowIndicatorColumn, FX_INT32 &e) | 181 CBC_BoundingBox* CBC_PDF417ScanningDecoder::adjustBoundingBox(CBC_DetectionResul
tRowIndicatorColumn* rowIndicatorColumn, int32_t &e) |
| 182 { | 182 { |
| 183 if (rowIndicatorColumn == NULL) { | 183 if (rowIndicatorColumn == NULL) { |
| 184 return NULL; | 184 return NULL; |
| 185 } | 185 } |
| 186 CFX_Int32Array* rowHeights = rowIndicatorColumn->getRowHeights(e); | 186 CFX_Int32Array* rowHeights = rowIndicatorColumn->getRowHeights(e); |
| 187 BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | 187 BC_EXCEPTION_CHECK_ReturnValue(e, NULL); |
| 188 FX_INT32 maxRowHeight = getMax(*rowHeights); | 188 int32_t maxRowHeight = getMax(*rowHeights); |
| 189 FX_INT32 missingStartRows = 0; | 189 int32_t missingStartRows = 0; |
| 190 for (FX_INT32 i = 0; i < rowHeights->GetSize(); i++) { | 190 for (int32_t i = 0; i < rowHeights->GetSize(); i++) { |
| 191 FX_INT32 rowHeight = rowHeights->GetAt(i); | 191 int32_t rowHeight = rowHeights->GetAt(i); |
| 192 missingStartRows += maxRowHeight - rowHeight; | 192 missingStartRows += maxRowHeight - rowHeight; |
| 193 if (rowHeight > 0) { | 193 if (rowHeight > 0) { |
| 194 break; | 194 break; |
| 195 } | 195 } |
| 196 } | 196 } |
| 197 CFX_PtrArray* codewords = rowIndicatorColumn->getCodewords(); | 197 CFX_PtrArray* codewords = rowIndicatorColumn->getCodewords(); |
| 198 for (FX_INT32 row = 0; missingStartRows > 0 && codewords->GetAt(row) == NULL
; row++) { | 198 for (int32_t row = 0; missingStartRows > 0 && codewords->GetAt(row) == NULL;
row++) { |
| 199 missingStartRows--; | 199 missingStartRows--; |
| 200 } | 200 } |
| 201 FX_INT32 missingEndRows = 0; | 201 int32_t missingEndRows = 0; |
| 202 for (FX_INT32 row1 = rowHeights->GetSize() - 1; row1 >= 0; row1--) { | 202 for (int32_t row1 = rowHeights->GetSize() - 1; row1 >= 0; row1--) { |
| 203 missingEndRows += maxRowHeight - rowHeights->GetAt(row1); | 203 missingEndRows += maxRowHeight - rowHeights->GetAt(row1); |
| 204 if (rowHeights->GetAt(row1) > 0) { | 204 if (rowHeights->GetAt(row1) > 0) { |
| 205 break; | 205 break; |
| 206 } | 206 } |
| 207 } | 207 } |
| 208 for (FX_INT32 row2 = codewords->GetSize() - 1; missingEndRows > 0 && codewor
ds->GetAt(row2) == NULL; row2--) { | 208 for (int32_t row2 = codewords->GetSize() - 1; missingEndRows > 0 && codeword
s->GetAt(row2) == NULL; row2--) { |
| 209 missingEndRows--; | 209 missingEndRows--; |
| 210 } | 210 } |
| 211 CBC_BoundingBox* boundingBox = rowIndicatorColumn->getBoundingBox()->addMiss
ingRows(missingStartRows, missingEndRows, rowIndicatorColumn->isLeft(), e); | 211 CBC_BoundingBox* boundingBox = rowIndicatorColumn->getBoundingBox()->addMiss
ingRows(missingStartRows, missingEndRows, rowIndicatorColumn->isLeft(), e); |
| 212 BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | 212 BC_EXCEPTION_CHECK_ReturnValue(e, NULL); |
| 213 return boundingBox; | 213 return boundingBox; |
| 214 } | 214 } |
| 215 FX_INT32 CBC_PDF417ScanningDecoder::getMax(CFX_Int32Array& values) | 215 int32_t CBC_PDF417ScanningDecoder::getMax(CFX_Int32Array& values) |
| 216 { | 216 { |
| 217 FX_INT32 maxValue = -1; | 217 int32_t maxValue = -1; |
| 218 for (FX_INT32 i = 0; i < values.GetSize(); i++) { | 218 for (int32_t i = 0; i < values.GetSize(); i++) { |
| 219 FX_INT32 value = values.GetAt(i); | 219 int32_t value = values.GetAt(i); |
| 220 maxValue = maxValue > value ? maxValue : value; | 220 maxValue = maxValue > value ? maxValue : value; |
| 221 } | 221 } |
| 222 return maxValue; | 222 return maxValue; |
| 223 } | 223 } |
| 224 CBC_BarcodeMetadata* CBC_PDF417ScanningDecoder::getBarcodeMetadata(CBC_Detection
ResultRowIndicatorColumn* leftRowIndicatorColumn, | 224 CBC_BarcodeMetadata* CBC_PDF417ScanningDecoder::getBarcodeMetadata(CBC_Detection
ResultRowIndicatorColumn* leftRowIndicatorColumn, |
| 225 CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn) | 225 CBC_DetectionResultRowIndicatorColumn* rightRowIndicatorColumn) |
| 226 { | 226 { |
| 227 CBC_BarcodeMetadata* leftBarcodeMetadata = NULL; | 227 CBC_BarcodeMetadata* leftBarcodeMetadata = NULL; |
| 228 CBC_BarcodeMetadata* rightBarcodeMetadata = NULL; | 228 CBC_BarcodeMetadata* rightBarcodeMetadata = NULL; |
| 229 if (leftRowIndicatorColumn == NULL || (leftBarcodeMetadata = leftRowIndicato
rColumn->getBarcodeMetadata()) == NULL) { | 229 if (leftRowIndicatorColumn == NULL || (leftBarcodeMetadata = leftRowIndicato
rColumn->getBarcodeMetadata()) == NULL) { |
| 230 return rightRowIndicatorColumn == NULL ? NULL : rightRowIndicatorColumn-
>getBarcodeMetadata(); | 230 return rightRowIndicatorColumn == NULL ? NULL : rightRowIndicatorColumn-
>getBarcodeMetadata(); |
| 231 } | 231 } |
| 232 if (rightRowIndicatorColumn == NULL || (rightBarcodeMetadata = rightRowIndic
atorColumn->getBarcodeMetadata()) == NULL) { | 232 if (rightRowIndicatorColumn == NULL || (rightBarcodeMetadata = rightRowIndic
atorColumn->getBarcodeMetadata()) == NULL) { |
| 233 return leftRowIndicatorColumn == NULL ? NULL : leftRowIndicatorColumn->g
etBarcodeMetadata(); | 233 return leftRowIndicatorColumn == NULL ? NULL : leftRowIndicatorColumn->g
etBarcodeMetadata(); |
| 234 } | 234 } |
| 235 if (leftBarcodeMetadata->getColumnCount() != rightBarcodeMetadata->getColumn
Count() && | 235 if (leftBarcodeMetadata->getColumnCount() != rightBarcodeMetadata->getColumn
Count() && |
| 236 leftBarcodeMetadata->getErrorCorrectionLevel() != rightBarcodeMetada
ta->getErrorCorrectionLevel() && | 236 leftBarcodeMetadata->getErrorCorrectionLevel() != rightBarcodeMetada
ta->getErrorCorrectionLevel() && |
| 237 leftBarcodeMetadata->getRowCount() != rightBarcodeMetadata->getRowCo
unt()) { | 237 leftBarcodeMetadata->getRowCount() != rightBarcodeMetadata->getRowCo
unt()) { |
| 238 delete leftBarcodeMetadata; | 238 delete leftBarcodeMetadata; |
| 239 delete rightBarcodeMetadata; | 239 delete rightBarcodeMetadata; |
| 240 return NULL; | 240 return NULL; |
| 241 } | 241 } |
| 242 delete rightBarcodeMetadata; | 242 delete rightBarcodeMetadata; |
| 243 return leftBarcodeMetadata; | 243 return leftBarcodeMetadata; |
| 244 } | 244 } |
| 245 CBC_DetectionResultRowIndicatorColumn* CBC_PDF417ScanningDecoder::getRowIndicato
rColumn(CBC_CommonBitMatrix* image, CBC_BoundingBox* boundingBox, CBC_ResultPoin
t startPoint, | 245 CBC_DetectionResultRowIndicatorColumn* CBC_PDF417ScanningDecoder::getRowIndicato
rColumn(CBC_CommonBitMatrix* image, CBC_BoundingBox* boundingBox, CBC_ResultPoin
t startPoint, |
| 246 FX_BOOL leftToRight, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidt
h) | 246 FX_BOOL leftToRight, int32_t minCodewordWidth, int32_t maxCodewordWidth) |
| 247 { | 247 { |
| 248 CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn = FX_NEW CBC_Detec
tionResultRowIndicatorColumn(boundingBox, leftToRight); | 248 CBC_DetectionResultRowIndicatorColumn* rowIndicatorColumn = FX_NEW CBC_Detec
tionResultRowIndicatorColumn(boundingBox, leftToRight); |
| 249 for (FX_INT32 i = 0; i < 2; i++) { | 249 for (int32_t i = 0; i < 2; i++) { |
| 250 FX_INT32 increment = i == 0 ? 1 : -1; | 250 int32_t increment = i == 0 ? 1 : -1; |
| 251 FX_INT32 startColumn = (FX_INT32) startPoint.GetX(); | 251 int32_t startColumn = (int32_t) startPoint.GetX(); |
| 252 for (FX_INT32 imageRow = (FX_INT32) startPoint.GetY(); imageRow <= bound
ingBox->getMaxY() && imageRow >= boundingBox->getMinY(); imageRow += increment)
{ | 252 for (int32_t imageRow = (int32_t) startPoint.GetY(); imageRow <= boundin
gBox->getMaxY() && imageRow >= boundingBox->getMinY(); imageRow += increment) { |
| 253 CBC_Codeword* codeword = detectCodeword(image, 0, image->GetWidth(),
leftToRight, startColumn, imageRow, minCodewordWidth, maxCodewordWidth); | 253 CBC_Codeword* codeword = detectCodeword(image, 0, image->GetWidth(),
leftToRight, startColumn, imageRow, minCodewordWidth, maxCodewordWidth); |
| 254 if (codeword != NULL) { | 254 if (codeword != NULL) { |
| 255 rowIndicatorColumn->setCodeword(imageRow, codeword); | 255 rowIndicatorColumn->setCodeword(imageRow, codeword); |
| 256 if (leftToRight) { | 256 if (leftToRight) { |
| 257 startColumn = codeword->getStartX(); | 257 startColumn = codeword->getStartX(); |
| 258 } else { | 258 } else { |
| 259 startColumn = codeword->getEndX(); | 259 startColumn = codeword->getEndX(); |
| 260 } | 260 } |
| 261 } | 261 } |
| 262 } | 262 } |
| 263 } | 263 } |
| 264 return rowIndicatorColumn; | 264 return rowIndicatorColumn; |
| 265 } | 265 } |
| 266 void CBC_PDF417ScanningDecoder::adjustCodewordCount(CBC_DetectionResult* detecti
onResult, CFX_PtrArray* barcodeMatrix, FX_INT32 &e) | 266 void CBC_PDF417ScanningDecoder::adjustCodewordCount(CBC_DetectionResult* detecti
onResult, CFX_PtrArray* barcodeMatrix, int32_t &e) |
| 267 { | 267 { |
| 268 CFX_Int32Array* numberOfCodewords = ((CBC_BarcodeValue*)((CFX_PtrArray*)barc
odeMatrix->GetAt(0))->GetAt(1))->getValue(); | 268 CFX_Int32Array* numberOfCodewords = ((CBC_BarcodeValue*)((CFX_PtrArray*)barc
odeMatrix->GetAt(0))->GetAt(1))->getValue(); |
| 269 FX_INT32 calculatedNumberOfCodewords = detectionResult->getBarcodeColumnCoun
t() * detectionResult->getBarcodeRowCount() - getNumberOfECCodeWords(detectionRe
sult->getBarcodeECLevel()); | 269 int32_t calculatedNumberOfCodewords = detectionResult->getBarcodeColumnCount
() * detectionResult->getBarcodeRowCount() - getNumberOfECCodeWords(detectionRes
ult->getBarcodeECLevel()); |
| 270 if (numberOfCodewords->GetSize() == 0) { | 270 if (numberOfCodewords->GetSize() == 0) { |
| 271 if (calculatedNumberOfCodewords < 1 || calculatedNumberOfCodewords > CBC
_PDF417Common::MAX_CODEWORDS_IN_BARCODE) { | 271 if (calculatedNumberOfCodewords < 1 || calculatedNumberOfCodewords > CBC
_PDF417Common::MAX_CODEWORDS_IN_BARCODE) { |
| 272 e = BCExceptiontNotFoundInstance; | 272 e = BCExceptiontNotFoundInstance; |
| 273 delete numberOfCodewords; | 273 delete numberOfCodewords; |
| 274 BC_EXCEPTION_CHECK_ReturnVoid(e); | 274 BC_EXCEPTION_CHECK_ReturnVoid(e); |
| 275 } | 275 } |
| 276 ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))-
>setValue(calculatedNumberOfCodewords); | 276 ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))-
>setValue(calculatedNumberOfCodewords); |
| 277 } else if (numberOfCodewords->GetAt(0) != calculatedNumberOfCodewords) { | 277 } else if (numberOfCodewords->GetAt(0) != calculatedNumberOfCodewords) { |
| 278 ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))-
>setValue(calculatedNumberOfCodewords); | 278 ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(0))->GetAt(1))-
>setValue(calculatedNumberOfCodewords); |
| 279 } | 279 } |
| 280 delete numberOfCodewords; | 280 delete numberOfCodewords; |
| 281 } | 281 } |
| 282 CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::createDecoderResult(CBC_Dete
ctionResult* detectionResult, FX_INT32 &e) | 282 CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::createDecoderResult(CBC_Dete
ctionResult* detectionResult, int32_t &e) |
| 283 { | 283 { |
| 284 CFX_PtrArray* barcodeMatrix = createBarcodeMatrix(detectionResult); | 284 CFX_PtrArray* barcodeMatrix = createBarcodeMatrix(detectionResult); |
| 285 adjustCodewordCount(detectionResult, barcodeMatrix, e); | 285 adjustCodewordCount(detectionResult, barcodeMatrix, e); |
| 286 if (e != BCExceptionNO) { | 286 if (e != BCExceptionNO) { |
| 287 for (FX_INT32 i = 0; i < barcodeMatrix->GetSize(); i++) { | 287 for (int32_t i = 0; i < barcodeMatrix->GetSize(); i++) { |
| 288 CFX_PtrArray* temp = (CFX_PtrArray*)barcodeMatrix->GetAt(i); | 288 CFX_PtrArray* temp = (CFX_PtrArray*)barcodeMatrix->GetAt(i); |
| 289 for (FX_INT32 j = 0; j < temp->GetSize(); j++) { | 289 for (int32_t j = 0; j < temp->GetSize(); j++) { |
| 290 delete (CBC_BarcodeValue*)temp->GetAt(j); | 290 delete (CBC_BarcodeValue*)temp->GetAt(j); |
| 291 } | 291 } |
| 292 temp->RemoveAll(); | 292 temp->RemoveAll(); |
| 293 delete temp; | 293 delete temp; |
| 294 } | 294 } |
| 295 barcodeMatrix->RemoveAll(); | 295 barcodeMatrix->RemoveAll(); |
| 296 delete barcodeMatrix; | 296 delete barcodeMatrix; |
| 297 return NULL; | 297 return NULL; |
| 298 } | 298 } |
| 299 CFX_Int32Array erasures; | 299 CFX_Int32Array erasures; |
| 300 CFX_Int32Array codewords; | 300 CFX_Int32Array codewords; |
| 301 codewords.SetSize(detectionResult->getBarcodeRowCount() * detectionResult->g
etBarcodeColumnCount()); | 301 codewords.SetSize(detectionResult->getBarcodeRowCount() * detectionResult->g
etBarcodeColumnCount()); |
| 302 CFX_PtrArray ambiguousIndexValuesList; | 302 CFX_PtrArray ambiguousIndexValuesList; |
| 303 CFX_Int32Array ambiguousIndexesList; | 303 CFX_Int32Array ambiguousIndexesList; |
| 304 for (FX_INT32 row = 0; row < detectionResult->getBarcodeRowCount(); row++) { | 304 for (int32_t row = 0; row < detectionResult->getBarcodeRowCount(); row++) { |
| 305 for (FX_INT32 l = 0; l < detectionResult->getBarcodeColumnCount(); l++)
{ | 305 for (int32_t l = 0; l < detectionResult->getBarcodeColumnCount(); l++) { |
| 306 CFX_Int32Array* values = ((CBC_BarcodeValue*)((CFX_PtrArray*)barcode
Matrix->GetAt(row))->GetAt(l + 1))->getValue(); | 306 CFX_Int32Array* values = ((CBC_BarcodeValue*)((CFX_PtrArray*)barcode
Matrix->GetAt(row))->GetAt(l + 1))->getValue(); |
| 307 FX_INT32 codewordIndex = row * detectionResult->getBarcodeColumnCoun
t() + l; | 307 int32_t codewordIndex = row * detectionResult->getBarcodeColumnCount
() + l; |
| 308 if (values->GetSize() == 0) { | 308 if (values->GetSize() == 0) { |
| 309 erasures.Add(codewordIndex); | 309 erasures.Add(codewordIndex); |
| 310 } else if (values->GetSize() == 1) { | 310 } else if (values->GetSize() == 1) { |
| 311 codewords[codewordIndex] = values->GetAt(0); | 311 codewords[codewordIndex] = values->GetAt(0); |
| 312 } else { | 312 } else { |
| 313 ambiguousIndexesList.Add(codewordIndex); | 313 ambiguousIndexesList.Add(codewordIndex); |
| 314 ambiguousIndexValuesList.Add(values); | 314 ambiguousIndexValuesList.Add(values); |
| 315 } | 315 } |
| 316 } | 316 } |
| 317 } | 317 } |
| 318 CFX_PtrArray ambiguousIndexValues; | 318 CFX_PtrArray ambiguousIndexValues; |
| 319 ambiguousIndexValues.SetSize(ambiguousIndexValuesList.GetSize()); | 319 ambiguousIndexValues.SetSize(ambiguousIndexValuesList.GetSize()); |
| 320 for (FX_INT32 i = 0; i < ambiguousIndexValues.GetSize(); i++) { | 320 for (int32_t i = 0; i < ambiguousIndexValues.GetSize(); i++) { |
| 321 ambiguousIndexValues.SetAt(i, ambiguousIndexValuesList.GetAt(i)); | 321 ambiguousIndexValues.SetAt(i, ambiguousIndexValuesList.GetAt(i)); |
| 322 } | 322 } |
| 323 for (FX_INT32 l = 0; l < barcodeMatrix->GetSize(); l++) { | 323 for (int32_t l = 0; l < barcodeMatrix->GetSize(); l++) { |
| 324 CFX_PtrArray* temp = (CFX_PtrArray*)barcodeMatrix->GetAt(l); | 324 CFX_PtrArray* temp = (CFX_PtrArray*)barcodeMatrix->GetAt(l); |
| 325 for (FX_INT32 j = 0; j < temp->GetSize(); j++) { | 325 for (int32_t j = 0; j < temp->GetSize(); j++) { |
| 326 delete (CBC_BarcodeValue*)temp->GetAt(j); | 326 delete (CBC_BarcodeValue*)temp->GetAt(j); |
| 327 } | 327 } |
| 328 temp->RemoveAll(); | 328 temp->RemoveAll(); |
| 329 delete temp; | 329 delete temp; |
| 330 } | 330 } |
| 331 barcodeMatrix->RemoveAll(); | 331 barcodeMatrix->RemoveAll(); |
| 332 delete barcodeMatrix; | 332 delete barcodeMatrix; |
| 333 CBC_CommonDecoderResult* decoderResult = createDecoderResultFromAmbiguousVal
ues(detectionResult->getBarcodeECLevel(), codewords, erasures, ambiguousIndexesL
ist, ambiguousIndexValues, e); | 333 CBC_CommonDecoderResult* decoderResult = createDecoderResultFromAmbiguousVal
ues(detectionResult->getBarcodeECLevel(), codewords, erasures, ambiguousIndexesL
ist, ambiguousIndexValues, e); |
| 334 BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | 334 BC_EXCEPTION_CHECK_ReturnValue(e, NULL); |
| 335 return decoderResult; | 335 return decoderResult; |
| 336 } | 336 } |
| 337 CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::createDecoderResultFromAmbig
uousValues(FX_INT32 ecLevel, CFX_Int32Array &codewords, CFX_Int32Array &erasureA
rray, CFX_Int32Array &ambiguousIndexes, | 337 CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::createDecoderResultFromAmbig
uousValues(int32_t ecLevel, CFX_Int32Array &codewords, CFX_Int32Array &erasureAr
ray, CFX_Int32Array &ambiguousIndexes, |
| 338 CFX_PtrArray& ambiguousIndexValues, FX_INT32 &e) | 338 CFX_PtrArray& ambiguousIndexValues, int32_t &e) |
| 339 { | 339 { |
| 340 CFX_Int32Array ambiguousIndexCount; | 340 CFX_Int32Array ambiguousIndexCount; |
| 341 ambiguousIndexCount.SetSize(ambiguousIndexes.GetSize()); | 341 ambiguousIndexCount.SetSize(ambiguousIndexes.GetSize()); |
| 342 FX_INT32 tries = 100; | 342 int32_t tries = 100; |
| 343 while (tries-- > 0) { | 343 while (tries-- > 0) { |
| 344 for (FX_INT32 l = 0; l < ambiguousIndexCount.GetSize(); l++) { | 344 for (int32_t l = 0; l < ambiguousIndexCount.GetSize(); l++) { |
| 345 codewords[ambiguousIndexes[l]] = ((CFX_Int32Array*)ambiguousIndexVal
ues.GetAt(l))->GetAt(ambiguousIndexCount[l]); | 345 codewords[ambiguousIndexes[l]] = ((CFX_Int32Array*)ambiguousIndexVal
ues.GetAt(l))->GetAt(ambiguousIndexCount[l]); |
| 346 } | 346 } |
| 347 CBC_CommonDecoderResult* decoderResult = decodeCodewords(codewords, ecLe
vel, erasureArray, e); | 347 CBC_CommonDecoderResult* decoderResult = decodeCodewords(codewords, ecLe
vel, erasureArray, e); |
| 348 if (e != BCExceptionNO) { | 348 if (e != BCExceptionNO) { |
| 349 e = BCExceptionNO; | 349 e = BCExceptionNO; |
| 350 continue; | 350 continue; |
| 351 } else { | 351 } else { |
| 352 return decoderResult; | 352 return decoderResult; |
| 353 } | 353 } |
| 354 if (ambiguousIndexCount.GetSize() == 0) { | 354 if (ambiguousIndexCount.GetSize() == 0) { |
| 355 e = BCExceptionChecksumInstance; | 355 e = BCExceptionChecksumInstance; |
| 356 return NULL; | 356 return NULL; |
| 357 } | 357 } |
| 358 for (FX_INT32 i = 0; i < ambiguousIndexCount.GetSize(); i++) { | 358 for (int32_t i = 0; i < ambiguousIndexCount.GetSize(); i++) { |
| 359 if (ambiguousIndexCount[i] < ((CFX_Int32Array*)(ambiguousIndexValues
.GetAt(i)))->GetSize() - 1) { | 359 if (ambiguousIndexCount[i] < ((CFX_Int32Array*)(ambiguousIndexValues
.GetAt(i)))->GetSize() - 1) { |
| 360 ambiguousIndexCount[i]++; | 360 ambiguousIndexCount[i]++; |
| 361 break; | 361 break; |
| 362 } else { | 362 } else { |
| 363 ambiguousIndexCount[i] = 0; | 363 ambiguousIndexCount[i] = 0; |
| 364 if (i == ambiguousIndexCount.GetSize() - 1) { | 364 if (i == ambiguousIndexCount.GetSize() - 1) { |
| 365 e = BCExceptionChecksumInstance; | 365 e = BCExceptionChecksumInstance; |
| 366 return NULL; | 366 return NULL; |
| 367 } | 367 } |
| 368 } | 368 } |
| 369 } | 369 } |
| 370 } | 370 } |
| 371 e = BCExceptionChecksumInstance; | 371 e = BCExceptionChecksumInstance; |
| 372 return NULL; | 372 return NULL; |
| 373 } | 373 } |
| 374 CFX_PtrArray* CBC_PDF417ScanningDecoder::createBarcodeMatrix(CBC_DetectionResult
* detectionResult) | 374 CFX_PtrArray* CBC_PDF417ScanningDecoder::createBarcodeMatrix(CBC_DetectionResult
* detectionResult) |
| 375 { | 375 { |
| 376 CFX_PtrArray* barcodeMatrix = FX_NEW CFX_PtrArray; | 376 CFX_PtrArray* barcodeMatrix = FX_NEW CFX_PtrArray; |
| 377 barcodeMatrix->SetSize(detectionResult->getBarcodeRowCount()); | 377 barcodeMatrix->SetSize(detectionResult->getBarcodeRowCount()); |
| 378 CFX_PtrArray* temp = NULL; | 378 CFX_PtrArray* temp = NULL; |
| 379 FX_INT32 colume = 0; | 379 int32_t colume = 0; |
| 380 for (FX_INT32 row = 0; row < barcodeMatrix->GetSize(); row++) { | 380 for (int32_t row = 0; row < barcodeMatrix->GetSize(); row++) { |
| 381 temp = FX_NEW CFX_PtrArray; | 381 temp = FX_NEW CFX_PtrArray; |
| 382 temp->SetSize(detectionResult->getBarcodeColumnCount() + 2); | 382 temp->SetSize(detectionResult->getBarcodeColumnCount() + 2); |
| 383 for (colume = 0; colume < detectionResult->getBarcodeColumnCount() + 2;
colume++) { | 383 for (colume = 0; colume < detectionResult->getBarcodeColumnCount() + 2;
colume++) { |
| 384 temp->SetAt(colume, FX_NEW CBC_BarcodeValue()); | 384 temp->SetAt(colume, FX_NEW CBC_BarcodeValue()); |
| 385 } | 385 } |
| 386 barcodeMatrix->SetAt(row, temp); | 386 barcodeMatrix->SetAt(row, temp); |
| 387 } | 387 } |
| 388 colume = -1; | 388 colume = -1; |
| 389 for (FX_INT32 i = 0; i < detectionResult->getDetectionResultColumns().GetSiz
e(); i++) { | 389 for (int32_t i = 0; i < detectionResult->getDetectionResultColumns().GetSize
(); i++) { |
| 390 CBC_DetectionResultColumn* detectionResultColumn = (CBC_DetectionResultC
olumn*) detectionResult->getDetectionResultColumns().GetAt(i); | 390 CBC_DetectionResultColumn* detectionResultColumn = (CBC_DetectionResultC
olumn*) detectionResult->getDetectionResultColumns().GetAt(i); |
| 391 colume++; | 391 colume++; |
| 392 if (detectionResultColumn == NULL) { | 392 if (detectionResultColumn == NULL) { |
| 393 continue; | 393 continue; |
| 394 } | 394 } |
| 395 CFX_PtrArray* temp = detectionResultColumn->getCodewords(); | 395 CFX_PtrArray* temp = detectionResultColumn->getCodewords(); |
| 396 for (FX_INT32 l = 0; l < temp->GetSize(); l++) { | 396 for (int32_t l = 0; l < temp->GetSize(); l++) { |
| 397 CBC_Codeword* codeword = (CBC_Codeword*) temp->GetAt(l); | 397 CBC_Codeword* codeword = (CBC_Codeword*) temp->GetAt(l); |
| 398 if (codeword == NULL || codeword->getRowNumber() == -1) { | 398 if (codeword == NULL || codeword->getRowNumber() == -1) { |
| 399 continue; | 399 continue; |
| 400 } | 400 } |
| 401 ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(codeword->g
etRowNumber()))->GetAt(colume))->setValue(codeword->getValue()); | 401 ((CBC_BarcodeValue*)((CFX_PtrArray*)barcodeMatrix->GetAt(codeword->g
etRowNumber()))->GetAt(colume))->setValue(codeword->getValue()); |
| 402 } | 402 } |
| 403 } | 403 } |
| 404 return barcodeMatrix; | 404 return barcodeMatrix; |
| 405 } | 405 } |
| 406 FX_BOOL CBC_PDF417ScanningDecoder::isValidBarcodeColumn(CBC_DetectionResult* det
ectionResult, FX_INT32 barcodeColumn) | 406 FX_BOOL CBC_PDF417ScanningDecoder::isValidBarcodeColumn(CBC_DetectionResult* det
ectionResult, int32_t barcodeColumn) |
| 407 { | 407 { |
| 408 return barcodeColumn >= 0 && barcodeColumn <= detectionResult->getBarcodeCol
umnCount() + 1; | 408 return barcodeColumn >= 0 && barcodeColumn <= detectionResult->getBarcodeCol
umnCount() + 1; |
| 409 } | 409 } |
| 410 FX_INT32 CBC_PDF417ScanningDecoder::getStartColumn(CBC_DetectionResult* detectio
nResult, FX_INT32 barcodeColumn, FX_INT32 imageRow, FX_BOOL leftToRight) | 410 int32_t CBC_PDF417ScanningDecoder::getStartColumn(CBC_DetectionResult* detection
Result, int32_t barcodeColumn, int32_t imageRow, FX_BOOL leftToRight) |
| 411 { | 411 { |
| 412 FX_INT32 offset = leftToRight ? 1 : -1; | 412 int32_t offset = leftToRight ? 1 : -1; |
| 413 CBC_Codeword* codeword = NULL; | 413 CBC_Codeword* codeword = NULL; |
| 414 if (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { | 414 if (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { |
| 415 codeword = detectionResult->getDetectionResultColumn(barcodeColumn - off
set)->getCodeword(imageRow); | 415 codeword = detectionResult->getDetectionResultColumn(barcodeColumn - off
set)->getCodeword(imageRow); |
| 416 } | 416 } |
| 417 if (codeword != NULL) { | 417 if (codeword != NULL) { |
| 418 return leftToRight ? codeword->getEndX() : codeword->getStartX(); | 418 return leftToRight ? codeword->getEndX() : codeword->getStartX(); |
| 419 } | 419 } |
| 420 codeword = detectionResult->getDetectionResultColumn(barcodeColumn)->getCode
wordNearby(imageRow); | 420 codeword = detectionResult->getDetectionResultColumn(barcodeColumn)->getCode
wordNearby(imageRow); |
| 421 if (codeword != NULL) { | 421 if (codeword != NULL) { |
| 422 return leftToRight ? codeword->getStartX() : codeword->getEndX(); | 422 return leftToRight ? codeword->getStartX() : codeword->getEndX(); |
| 423 } | 423 } |
| 424 if (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { | 424 if (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { |
| 425 codeword = detectionResult->getDetectionResultColumn(barcodeColumn - off
set)->getCodewordNearby(imageRow); | 425 codeword = detectionResult->getDetectionResultColumn(barcodeColumn - off
set)->getCodewordNearby(imageRow); |
| 426 } | 426 } |
| 427 if (codeword != NULL) { | 427 if (codeword != NULL) { |
| 428 return leftToRight ? codeword->getEndX() : codeword->getStartX(); | 428 return leftToRight ? codeword->getEndX() : codeword->getStartX(); |
| 429 } | 429 } |
| 430 FX_INT32 skippedColumns = 0; | 430 int32_t skippedColumns = 0; |
| 431 while (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { | 431 while (isValidBarcodeColumn(detectionResult, barcodeColumn - offset)) { |
| 432 barcodeColumn -= offset; | 432 barcodeColumn -= offset; |
| 433 for (FX_INT32 i = 0; i < detectionResult->getDetectionResultColumn(barco
deColumn)->getCodewords()->GetSize(); i++) { | 433 for (int32_t i = 0; i < detectionResult->getDetectionResultColumn(barcod
eColumn)->getCodewords()->GetSize(); i++) { |
| 434 CBC_Codeword* previousRowCodeword = (CBC_Codeword*) detectionResult-
>getDetectionResultColumn(barcodeColumn)->getCodewords()->GetAt(i); | 434 CBC_Codeword* previousRowCodeword = (CBC_Codeword*) detectionResult-
>getDetectionResultColumn(barcodeColumn)->getCodewords()->GetAt(i); |
| 435 if (previousRowCodeword != NULL) { | 435 if (previousRowCodeword != NULL) { |
| 436 return (leftToRight ? previousRowCodeword->getEndX() : previousR
owCodeword->getStartX()) + | 436 return (leftToRight ? previousRowCodeword->getEndX() : previousR
owCodeword->getStartX()) + |
| 437 offset * skippedColumns * (previousRowCodeword->getEndX()
- previousRowCodeword->getStartX()); | 437 offset * skippedColumns * (previousRowCodeword->getEndX()
- previousRowCodeword->getStartX()); |
| 438 } | 438 } |
| 439 } | 439 } |
| 440 skippedColumns++; | 440 skippedColumns++; |
| 441 } | 441 } |
| 442 return leftToRight ? detectionResult->getBoundingBox()->getMinX() : detectio
nResult->getBoundingBox()->getMaxX(); | 442 return leftToRight ? detectionResult->getBoundingBox()->getMinX() : detectio
nResult->getBoundingBox()->getMaxX(); |
| 443 } | 443 } |
| 444 CBC_Codeword* CBC_PDF417ScanningDecoder::detectCodeword(CBC_CommonBitMatrix* ima
ge, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 startC
olumn, | 444 CBC_Codeword* CBC_PDF417ScanningDecoder::detectCodeword(CBC_CommonBitMatrix* ima
ge, int32_t minColumn, int32_t maxColumn, FX_BOOL leftToRight, int32_t startColu
mn, |
| 445 FX_INT32 imageRow, FX_INT32 minCodewordWidth, FX_INT32 maxCodewordWidth) | 445 int32_t imageRow, int32_t minCodewordWidth, int32_t maxCodewordWidth) |
| 446 { | 446 { |
| 447 startColumn = adjustCodewordStartColumn(image, minColumn, maxColumn, leftToR
ight, startColumn, imageRow); | 447 startColumn = adjustCodewordStartColumn(image, minColumn, maxColumn, leftToR
ight, startColumn, imageRow); |
| 448 CFX_Int32Array* moduleBitCount = getModuleBitCount(image, minColumn, maxColu
mn, leftToRight, startColumn, imageRow); | 448 CFX_Int32Array* moduleBitCount = getModuleBitCount(image, minColumn, maxColu
mn, leftToRight, startColumn, imageRow); |
| 449 if (moduleBitCount == NULL) { | 449 if (moduleBitCount == NULL) { |
| 450 return NULL; | 450 return NULL; |
| 451 } | 451 } |
| 452 FX_INT32 endColumn; | 452 int32_t endColumn; |
| 453 FX_INT32 codewordBitCount = CBC_PDF417Common::getBitCountSum(*moduleBitCount
); | 453 int32_t codewordBitCount = CBC_PDF417Common::getBitCountSum(*moduleBitCount)
; |
| 454 if (leftToRight) { | 454 if (leftToRight) { |
| 455 endColumn = startColumn + codewordBitCount; | 455 endColumn = startColumn + codewordBitCount; |
| 456 } else { | 456 } else { |
| 457 for (FX_INT32 i = 0; i < moduleBitCount->GetSize() >> 1; i++) { | 457 for (int32_t i = 0; i < moduleBitCount->GetSize() >> 1; i++) { |
| 458 FX_INT32 tmpCount = moduleBitCount->GetAt(i); | 458 int32_t tmpCount = moduleBitCount->GetAt(i); |
| 459 moduleBitCount->SetAt(i, moduleBitCount->GetAt(moduleBitCount->GetSi
ze() - 1 - i)); | 459 moduleBitCount->SetAt(i, moduleBitCount->GetAt(moduleBitCount->GetSi
ze() - 1 - i)); |
| 460 moduleBitCount->SetAt(moduleBitCount->GetSize() - 1 - i, tmpCount); | 460 moduleBitCount->SetAt(moduleBitCount->GetSize() - 1 - i, tmpCount); |
| 461 } | 461 } |
| 462 endColumn = startColumn; | 462 endColumn = startColumn; |
| 463 startColumn = endColumn - codewordBitCount; | 463 startColumn = endColumn - codewordBitCount; |
| 464 } | 464 } |
| 465 FX_INT32 decodedValue = CBC_PDF417CodewordDecoder::getDecodedValue(*moduleBi
tCount); | 465 int32_t decodedValue = CBC_PDF417CodewordDecoder::getDecodedValue(*moduleBit
Count); |
| 466 FX_INT32 codeword = CBC_PDF417Common::getCodeword(decodedValue); | 466 int32_t codeword = CBC_PDF417Common::getCodeword(decodedValue); |
| 467 delete moduleBitCount; | 467 delete moduleBitCount; |
| 468 if (codeword == -1) { | 468 if (codeword == -1) { |
| 469 return NULL; | 469 return NULL; |
| 470 } | 470 } |
| 471 return FX_NEW CBC_Codeword(startColumn, endColumn, getCodewordBucketNumber(d
ecodedValue), codeword); | 471 return FX_NEW CBC_Codeword(startColumn, endColumn, getCodewordBucketNumber(d
ecodedValue), codeword); |
| 472 } | 472 } |
| 473 CFX_Int32Array* CBC_PDF417ScanningDecoder::getModuleBitCount(CBC_CommonBitMatrix
* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32 s
tartColumn, FX_INT32 imageRow) | 473 CFX_Int32Array* CBC_PDF417ScanningDecoder::getModuleBitCount(CBC_CommonBitMatrix
* image, int32_t minColumn, int32_t maxColumn, FX_BOOL leftToRight, int32_t star
tColumn, int32_t imageRow) |
| 474 { | 474 { |
| 475 FX_INT32 imageColumn = startColumn; | 475 int32_t imageColumn = startColumn; |
| 476 CFX_Int32Array* moduleBitCount = FX_NEW CFX_Int32Array; | 476 CFX_Int32Array* moduleBitCount = FX_NEW CFX_Int32Array; |
| 477 moduleBitCount->SetSize(8); | 477 moduleBitCount->SetSize(8); |
| 478 FX_INT32 moduleNumber = 0; | 478 int32_t moduleNumber = 0; |
| 479 FX_INT32 increment = leftToRight ? 1 : -1; | 479 int32_t increment = leftToRight ? 1 : -1; |
| 480 FX_BOOL previousPixelValue = leftToRight; | 480 FX_BOOL previousPixelValue = leftToRight; |
| 481 while (((leftToRight && imageColumn < maxColumn) || (!leftToRight && imageCo
lumn >= minColumn)) && moduleNumber < moduleBitCount->GetSize()) { | 481 while (((leftToRight && imageColumn < maxColumn) || (!leftToRight && imageCo
lumn >= minColumn)) && moduleNumber < moduleBitCount->GetSize()) { |
| 482 if (image->Get(imageColumn, imageRow) == previousPixelValue) { | 482 if (image->Get(imageColumn, imageRow) == previousPixelValue) { |
| 483 moduleBitCount->SetAt(moduleNumber, moduleBitCount->GetAt(moduleNumb
er) + 1); | 483 moduleBitCount->SetAt(moduleNumber, moduleBitCount->GetAt(moduleNumb
er) + 1); |
| 484 imageColumn += increment; | 484 imageColumn += increment; |
| 485 } else { | 485 } else { |
| 486 moduleNumber++; | 486 moduleNumber++; |
| 487 previousPixelValue = !previousPixelValue; | 487 previousPixelValue = !previousPixelValue; |
| 488 } | 488 } |
| 489 } | 489 } |
| 490 if (moduleNumber == moduleBitCount->GetSize() || (((leftToRight && imageColu
mn == maxColumn) || (!leftToRight && imageColumn == minColumn)) && moduleNumber
== moduleBitCount->GetSize() - 1)) { | 490 if (moduleNumber == moduleBitCount->GetSize() || (((leftToRight && imageColu
mn == maxColumn) || (!leftToRight && imageColumn == minColumn)) && moduleNumber
== moduleBitCount->GetSize() - 1)) { |
| 491 return moduleBitCount; | 491 return moduleBitCount; |
| 492 } | 492 } |
| 493 delete moduleBitCount; | 493 delete moduleBitCount; |
| 494 return NULL; | 494 return NULL; |
| 495 } | 495 } |
| 496 FX_INT32 CBC_PDF417ScanningDecoder::getNumberOfECCodeWords(FX_INT32 barcodeECLev
el) | 496 int32_t CBC_PDF417ScanningDecoder::getNumberOfECCodeWords(int32_t barcodeECLevel
) |
| 497 { | 497 { |
| 498 return 2 << barcodeECLevel; | 498 return 2 << barcodeECLevel; |
| 499 } | 499 } |
| 500 FX_INT32 CBC_PDF417ScanningDecoder::adjustCodewordStartColumn(CBC_CommonBitMatri
x* image, FX_INT32 minColumn, FX_INT32 maxColumn, FX_BOOL leftToRight, FX_INT32
codewordStartColumn, FX_INT32 imageRow) | 500 int32_t CBC_PDF417ScanningDecoder::adjustCodewordStartColumn(CBC_CommonBitMatrix
* image, int32_t minColumn, int32_t maxColumn, FX_BOOL leftToRight, int32_t code
wordStartColumn, int32_t imageRow) |
| 501 { | 501 { |
| 502 FX_INT32 correctedStartColumn = codewordStartColumn; | 502 int32_t correctedStartColumn = codewordStartColumn; |
| 503 FX_INT32 increment = leftToRight ? -1 : 1; | 503 int32_t increment = leftToRight ? -1 : 1; |
| 504 for (FX_INT32 i = 0; i < 2; i++) { | 504 for (int32_t i = 0; i < 2; i++) { |
| 505 FX_BOOL l = image->Get(correctedStartColumn, imageRow); | 505 FX_BOOL l = image->Get(correctedStartColumn, imageRow); |
| 506 while (((leftToRight && correctedStartColumn >= minColumn) || (!leftToRi
ght && correctedStartColumn < maxColumn)) && leftToRight == image->Get(corrected
StartColumn, imageRow)) { | 506 while (((leftToRight && correctedStartColumn >= minColumn) || (!leftToRi
ght && correctedStartColumn < maxColumn)) && leftToRight == image->Get(corrected
StartColumn, imageRow)) { |
| 507 if (abs(codewordStartColumn - correctedStartColumn) > CODEWORD_SKEW_
SIZE) { | 507 if (abs(codewordStartColumn - correctedStartColumn) > CODEWORD_SKEW_
SIZE) { |
| 508 return codewordStartColumn; | 508 return codewordStartColumn; |
| 509 } | 509 } |
| 510 correctedStartColumn += increment; | 510 correctedStartColumn += increment; |
| 511 } | 511 } |
| 512 increment = -increment; | 512 increment = -increment; |
| 513 leftToRight = !leftToRight; | 513 leftToRight = !leftToRight; |
| 514 } | 514 } |
| 515 return correctedStartColumn; | 515 return correctedStartColumn; |
| 516 } | 516 } |
| 517 FX_BOOL CBC_PDF417ScanningDecoder::checkCodewordSkew(FX_INT32 codewordSize, FX_I
NT32 minCodewordWidth, FX_INT32 maxCodewordWidth) | 517 FX_BOOL CBC_PDF417ScanningDecoder::checkCodewordSkew(int32_t codewordSize, int32
_t minCodewordWidth, int32_t maxCodewordWidth) |
| 518 { | 518 { |
| 519 return minCodewordWidth - CODEWORD_SKEW_SIZE <= codewordSize && codewordSize
<= maxCodewordWidth + CODEWORD_SKEW_SIZE; | 519 return minCodewordWidth - CODEWORD_SKEW_SIZE <= codewordSize && codewordSize
<= maxCodewordWidth + CODEWORD_SKEW_SIZE; |
| 520 } | 520 } |
| 521 CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::decodeCodewords(CFX_Int32Arr
ay &codewords, FX_INT32 ecLevel, CFX_Int32Array &erasures, FX_INT32 &e) | 521 CBC_CommonDecoderResult* CBC_PDF417ScanningDecoder::decodeCodewords(CFX_Int32Arr
ay &codewords, int32_t ecLevel, CFX_Int32Array &erasures, int32_t &e) |
| 522 { | 522 { |
| 523 if (codewords.GetSize() == 0) { | 523 if (codewords.GetSize() == 0) { |
| 524 e = BCExceptionFormatInstance; | 524 e = BCExceptionFormatInstance; |
| 525 return NULL; | 525 return NULL; |
| 526 } | 526 } |
| 527 FX_INT32 numECCodewords = 1 << (ecLevel + 1); | 527 int32_t numECCodewords = 1 << (ecLevel + 1); |
| 528 FX_INT32 correctedErrorsCount = correctErrors(codewords, erasures, numECCode
words, e); | 528 int32_t correctedErrorsCount = correctErrors(codewords, erasures, numECCodew
ords, e); |
| 529 BC_EXCEPTION_CHECK_ReturnValue(e , NULL); | 529 BC_EXCEPTION_CHECK_ReturnValue(e , NULL); |
| 530 verifyCodewordCount(codewords, numECCodewords, e); | 530 verifyCodewordCount(codewords, numECCodewords, e); |
| 531 BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | 531 BC_EXCEPTION_CHECK_ReturnValue(e, NULL); |
| 532 CFX_ByteString bytestring; | 532 CFX_ByteString bytestring; |
| 533 CBC_CommonDecoderResult* decoderResult = CBC_DecodedBitStreamPaser::decode(c
odewords, bytestring.FormatInteger(ecLevel), e); | 533 CBC_CommonDecoderResult* decoderResult = CBC_DecodedBitStreamPaser::decode(c
odewords, bytestring.FormatInteger(ecLevel), e); |
| 534 BC_EXCEPTION_CHECK_ReturnValue(e, NULL); | 534 BC_EXCEPTION_CHECK_ReturnValue(e, NULL); |
| 535 return decoderResult; | 535 return decoderResult; |
| 536 } | 536 } |
| 537 FX_INT32 CBC_PDF417ScanningDecoder::correctErrors(CFX_Int32Array &codewords, CFX
_Int32Array &erasures, FX_INT32 numECCodewords, FX_INT32 &e) | 537 int32_t CBC_PDF417ScanningDecoder::correctErrors(CFX_Int32Array &codewords, CFX_
Int32Array &erasures, int32_t numECCodewords, int32_t &e) |
| 538 { | 538 { |
| 539 if ((erasures.GetSize() != 0 && erasures.GetSize() > (numECCodewords / 2 + M
AX_ERRORS)) || numECCodewords < 0 || numECCodewords > MAX_EC_CODEWORDS) { | 539 if ((erasures.GetSize() != 0 && erasures.GetSize() > (numECCodewords / 2 + M
AX_ERRORS)) || numECCodewords < 0 || numECCodewords > MAX_EC_CODEWORDS) { |
| 540 e = BCExceptionChecksumInstance; | 540 e = BCExceptionChecksumInstance; |
| 541 return -1; | 541 return -1; |
| 542 } | 542 } |
| 543 FX_INT32 result = CBC_PDF417ECErrorCorrection::decode(codewords, numECCodewo
rds, erasures, e); | 543 int32_t result = CBC_PDF417ECErrorCorrection::decode(codewords, numECCodewor
ds, erasures, e); |
| 544 BC_EXCEPTION_CHECK_ReturnValue(e, -1); | 544 BC_EXCEPTION_CHECK_ReturnValue(e, -1); |
| 545 return result; | 545 return result; |
| 546 } | 546 } |
| 547 void CBC_PDF417ScanningDecoder::verifyCodewordCount(CFX_Int32Array &codewords, F
X_INT32 numECCodewords, FX_INT32 &e) | 547 void CBC_PDF417ScanningDecoder::verifyCodewordCount(CFX_Int32Array &codewords, i
nt32_t numECCodewords, int32_t &e) |
| 548 { | 548 { |
| 549 if (codewords.GetSize() < 4) { | 549 if (codewords.GetSize() < 4) { |
| 550 e = BCExceptionFormatInstance; | 550 e = BCExceptionFormatInstance; |
| 551 return; | 551 return; |
| 552 } | 552 } |
| 553 FX_INT32 numberOfCodewords = codewords.GetAt(0); | 553 int32_t numberOfCodewords = codewords.GetAt(0); |
| 554 if (numberOfCodewords > codewords.GetSize()) { | 554 if (numberOfCodewords > codewords.GetSize()) { |
| 555 e = BCExceptionFormatInstance; | 555 e = BCExceptionFormatInstance; |
| 556 return; | 556 return; |
| 557 } | 557 } |
| 558 if (numberOfCodewords == 0) { | 558 if (numberOfCodewords == 0) { |
| 559 if (numECCodewords < codewords.GetSize()) { | 559 if (numECCodewords < codewords.GetSize()) { |
| 560 codewords[0] = codewords.GetSize() - numECCodewords; | 560 codewords[0] = codewords.GetSize() - numECCodewords; |
| 561 } else { | 561 } else { |
| 562 e = BCExceptionFormatInstance; | 562 e = BCExceptionFormatInstance; |
| 563 return; | 563 return; |
| 564 } | 564 } |
| 565 } | 565 } |
| 566 } | 566 } |
| 567 CFX_Int32Array* CBC_PDF417ScanningDecoder::getBitCountForCodeword(FX_INT32 codew
ord) | 567 CFX_Int32Array* CBC_PDF417ScanningDecoder::getBitCountForCodeword(int32_t codewo
rd) |
| 568 { | 568 { |
| 569 CFX_Int32Array* result = FX_NEW CFX_Int32Array; | 569 CFX_Int32Array* result = FX_NEW CFX_Int32Array; |
| 570 result->SetSize(8); | 570 result->SetSize(8); |
| 571 FX_INT32 previousValue = 0; | 571 int32_t previousValue = 0; |
| 572 FX_INT32 i = result->GetSize() - 1; | 572 int32_t i = result->GetSize() - 1; |
| 573 while (TRUE) { | 573 while (TRUE) { |
| 574 if ((codeword & 0x1) != previousValue) { | 574 if ((codeword & 0x1) != previousValue) { |
| 575 previousValue = codeword & 0x1; | 575 previousValue = codeword & 0x1; |
| 576 i--; | 576 i--; |
| 577 if (i < 0) { | 577 if (i < 0) { |
| 578 break; | 578 break; |
| 579 } | 579 } |
| 580 } | 580 } |
| 581 result->SetAt(i, result->GetAt(i) + 1); | 581 result->SetAt(i, result->GetAt(i) + 1); |
| 582 codeword >>= 1; | 582 codeword >>= 1; |
| 583 } | 583 } |
| 584 return result; | 584 return result; |
| 585 } | 585 } |
| 586 FX_INT32 CBC_PDF417ScanningDecoder::getCodewordBucketNumber(FX_INT32 codeword) | 586 int32_t CBC_PDF417ScanningDecoder::getCodewordBucketNumber(int32_t codeword) |
| 587 { | 587 { |
| 588 CFX_Int32Array* array = getBitCountForCodeword(codeword); | 588 CFX_Int32Array* array = getBitCountForCodeword(codeword); |
| 589 FX_INT32 result = getCodewordBucketNumber(*array); | 589 int32_t result = getCodewordBucketNumber(*array); |
| 590 delete array; | 590 delete array; |
| 591 return result; | 591 return result; |
| 592 } | 592 } |
| 593 FX_INT32 CBC_PDF417ScanningDecoder::getCodewordBucketNumber(CFX_Int32Array& modu
leBitCount) | 593 int32_t CBC_PDF417ScanningDecoder::getCodewordBucketNumber(CFX_Int32Array& modul
eBitCount) |
| 594 { | 594 { |
| 595 return (moduleBitCount.GetAt(0) - moduleBitCount.GetAt(2) + moduleBitCount.G
etAt(4) - moduleBitCount.GetAt(6) + 9) % 9; | 595 return (moduleBitCount.GetAt(0) - moduleBitCount.GetAt(2) + moduleBitCount.G
etAt(4) - moduleBitCount.GetAt(6) + 9) % 9; |
| 596 } | 596 } |
| OLD | NEW |