Index: xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.cpp |
diff --git a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.cpp b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.cpp |
index 5091d4e55e36eb3d9739b442dbf8ee394d00f801..4f681d1e7d3ee43c41003d4e0c5f8ecc9b1f3edc 100644 |
--- a/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.cpp |
+++ b/xfa/src/fxbarcode/pdf417/BC_PDF417DetectionResultRowIndicatorColumn.cpp |
@@ -1,265 +1,265 @@ |
-// 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 2013 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/BC_ResultPoint.h" |
-#include "BC_PDF417BarcodeMetadata.h" |
-#include "BC_PDF417BoundingBox.h" |
-#include "BC_PDF417Codeword.h" |
-#include "BC_PDF417BarcodeValue.h" |
-#include "BC_PDF417Common.h" |
-#include "BC_PDF417DetectionResultColumn.h" |
-#include "BC_PDF417DetectionResultRowIndicatorColumn.h" |
-CBC_DetectionResultRowIndicatorColumn::CBC_DetectionResultRowIndicatorColumn( |
- CBC_BoundingBox* boundingBox, |
- FX_BOOL isLeft) |
- : CBC_DetectionResultColumn(boundingBox) { |
- m_isLeft = isLeft; |
-} |
-CBC_DetectionResultRowIndicatorColumn:: |
- ~CBC_DetectionResultRowIndicatorColumn() {} |
-void CBC_DetectionResultRowIndicatorColumn::setRowNumbers() { |
- for (int32_t i = 0; i < m_codewords->GetSize(); i++) { |
- CBC_Codeword* codeword = (CBC_Codeword*)m_codewords->GetAt(i); |
- if (codeword != NULL) { |
- codeword->setRowNumberAsRowIndicatorColumn(); |
- } |
- } |
-} |
-int32_t |
-CBC_DetectionResultRowIndicatorColumn::adjustCompleteIndicatorColumnRowNumbers( |
- CBC_BarcodeMetadata barcodeMetadata) { |
- CFX_PtrArray* codewords = getCodewords(); |
- setRowNumbers(); |
- removeIncorrectCodewords(codewords, barcodeMetadata); |
- CBC_BoundingBox* boundingBox = getBoundingBox(); |
- CBC_ResultPoint* top = |
- m_isLeft ? boundingBox->getTopLeft() : boundingBox->getTopRight(); |
- CBC_ResultPoint* bottom = |
- m_isLeft ? boundingBox->getBottomLeft() : boundingBox->getBottomRight(); |
- int32_t firstRow = imageRowToCodewordIndex((int32_t)top->GetY()); |
- int32_t lastRow = imageRowToCodewordIndex((int32_t)bottom->GetY()); |
- FX_FLOAT averageRowHeight = |
- (lastRow - firstRow) / (FX_FLOAT)barcodeMetadata.getRowCount(); |
- int32_t barcodeRow = -1; |
- int32_t maxRowHeight = 1; |
- int32_t currentRowHeight = 0; |
- for (int32_t codewordsRow = firstRow; codewordsRow < lastRow; |
- codewordsRow++) { |
- if (codewords->GetAt(codewordsRow) == NULL) { |
- continue; |
- } |
- CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordsRow); |
- int32_t rowDifference = codeword->getRowNumber() - barcodeRow; |
- if (rowDifference == 0) { |
- currentRowHeight++; |
- } else if (rowDifference == 1) { |
- maxRowHeight = |
- maxRowHeight > currentRowHeight ? maxRowHeight : currentRowHeight; |
- currentRowHeight = 1; |
- barcodeRow = codeword->getRowNumber(); |
- } else if (rowDifference < 0) { |
- codewords->SetAt(codewordsRow, NULL); |
- } else if (codeword->getRowNumber() >= barcodeMetadata.getRowCount()) { |
- codewords->SetAt(codewordsRow, NULL); |
- } else if (rowDifference > codewordsRow) { |
- codewords->SetAt(codewordsRow, NULL); |
- } else { |
- int32_t checkedRows; |
- if (maxRowHeight > 2) { |
- checkedRows = (maxRowHeight - 2) * rowDifference; |
- } else { |
- checkedRows = rowDifference; |
- } |
- FX_BOOL closePreviousCodewordFound = checkedRows >= codewordsRow; |
- for (int32_t i = 1; i <= checkedRows && !closePreviousCodewordFound; |
- i++) { |
- closePreviousCodewordFound = codewords->GetAt(codewordsRow - i) != NULL; |
- } |
- if (closePreviousCodewordFound) { |
- codewords->SetAt(codewordsRow, NULL); |
- } else { |
- barcodeRow = codeword->getRowNumber(); |
- currentRowHeight = 1; |
- } |
- } |
- } |
- return (int32_t)(averageRowHeight + 0.5); |
-} |
-CFX_Int32Array* CBC_DetectionResultRowIndicatorColumn::getRowHeights( |
- int32_t& e) { |
- CBC_BarcodeMetadata* barcodeMetadata = getBarcodeMetadata(); |
- if (barcodeMetadata == NULL) { |
- e = BCExceptionCannotMetadata; |
- return NULL; |
- } |
- adjustIncompleteIndicatorColumnRowNumbers(*barcodeMetadata); |
- CFX_Int32Array* result = new CFX_Int32Array; |
- result->SetSize(barcodeMetadata->getRowCount()); |
- for (int32_t i = 0; i < getCodewords()->GetSize(); i++) { |
- CBC_Codeword* codeword = (CBC_Codeword*)getCodewords()->GetAt(i); |
- if (codeword != NULL) { |
- result->SetAt(codeword->getRowNumber(), |
- result->GetAt(codeword->getRowNumber()) + 1); |
- } |
- } |
- return result; |
-} |
-int32_t CBC_DetectionResultRowIndicatorColumn:: |
- adjustIncompleteIndicatorColumnRowNumbers( |
- CBC_BarcodeMetadata barcodeMetadata) { |
- CBC_BoundingBox* boundingBox = getBoundingBox(); |
- CBC_ResultPoint* top = |
- m_isLeft ? boundingBox->getTopLeft() : boundingBox->getTopRight(); |
- CBC_ResultPoint* bottom = |
- m_isLeft ? boundingBox->getBottomLeft() : boundingBox->getBottomRight(); |
- int32_t firstRow = imageRowToCodewordIndex((int32_t)top->GetY()); |
- int32_t lastRow = imageRowToCodewordIndex((int32_t)bottom->GetY()); |
- FX_FLOAT averageRowHeight = |
- (lastRow - firstRow) / (FX_FLOAT)barcodeMetadata.getRowCount(); |
- CFX_PtrArray* codewords = getCodewords(); |
- int32_t barcodeRow = -1; |
- int32_t maxRowHeight = 1; |
- int32_t currentRowHeight = 0; |
- for (int32_t codewordsRow = firstRow; codewordsRow < lastRow; |
- codewordsRow++) { |
- if (codewords->GetAt(codewordsRow) == NULL) { |
- continue; |
- } |
- CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordsRow); |
- codeword->setRowNumberAsRowIndicatorColumn(); |
- int32_t rowDifference = codeword->getRowNumber() - barcodeRow; |
- if (rowDifference == 0) { |
- currentRowHeight++; |
- } else if (rowDifference == 1) { |
- maxRowHeight = |
- maxRowHeight > currentRowHeight ? maxRowHeight : currentRowHeight; |
- currentRowHeight = 1; |
- barcodeRow = codeword->getRowNumber(); |
- } else if (codeword->getRowNumber() >= barcodeMetadata.getRowCount()) { |
- codewords->SetAt(codewordsRow, NULL); |
- } else { |
- barcodeRow = codeword->getRowNumber(); |
- currentRowHeight = 1; |
- } |
- } |
- return (int32_t)(averageRowHeight + 0.5); |
-} |
-CBC_BarcodeMetadata* |
-CBC_DetectionResultRowIndicatorColumn::getBarcodeMetadata() { |
- CFX_PtrArray* codewords = getCodewords(); |
- CBC_BarcodeValue barcodeColumnCount; |
- CBC_BarcodeValue barcodeRowCountUpperPart; |
- CBC_BarcodeValue barcodeRowCountLowerPart; |
- CBC_BarcodeValue barcodeECLevel; |
- for (int32_t i = 0; i < codewords->GetSize(); i++) { |
- CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(i); |
- if (codeword == NULL) { |
- continue; |
- } |
- codeword->setRowNumberAsRowIndicatorColumn(); |
- int32_t rowIndicatorValue = codeword->getValue() % 30; |
- int32_t codewordRowNumber = codeword->getRowNumber(); |
- if (!m_isLeft) { |
- codewordRowNumber += 2; |
- } |
- switch (codewordRowNumber % 3) { |
- case 0: |
- barcodeRowCountUpperPart.setValue(rowIndicatorValue * 3 + 1); |
- break; |
- case 1: |
- barcodeECLevel.setValue(rowIndicatorValue / 3); |
- barcodeRowCountLowerPart.setValue(rowIndicatorValue % 3); |
- break; |
- case 2: |
- barcodeColumnCount.setValue(rowIndicatorValue + 1); |
- break; |
- } |
- } |
- if ((barcodeColumnCount.getValue()->GetSize() == 0) || |
- (barcodeRowCountUpperPart.getValue()->GetSize() == 0) || |
- (barcodeRowCountLowerPart.getValue()->GetSize() == 0) || |
- (barcodeECLevel.getValue()->GetSize() == 0) || |
- barcodeColumnCount.getValue()->GetAt(0) < 1 || |
- barcodeRowCountUpperPart.getValue()->GetAt(0) + |
- barcodeRowCountLowerPart.getValue()->GetAt(0) < |
- CBC_PDF417Common::MIN_ROWS_IN_BARCODE || |
- barcodeRowCountUpperPart.getValue()->GetAt(0) + |
- barcodeRowCountLowerPart.getValue()->GetAt(0) > |
- CBC_PDF417Common::MAX_ROWS_IN_BARCODE) { |
- return NULL; |
- } |
- CBC_BarcodeMetadata* barcodeMetadata = |
- new CBC_BarcodeMetadata(barcodeColumnCount.getValue()->GetAt(0), |
- barcodeRowCountUpperPart.getValue()->GetAt(0), |
- barcodeRowCountLowerPart.getValue()->GetAt(0), |
- barcodeECLevel.getValue()->GetAt(0)); |
- removeIncorrectCodewords(codewords, *barcodeMetadata); |
- return barcodeMetadata; |
-} |
-FX_BOOL CBC_DetectionResultRowIndicatorColumn::isLeft() { |
- return m_isLeft; |
-} |
-CFX_ByteString CBC_DetectionResultRowIndicatorColumn::toString() { |
- return (CFX_ByteString) "IsLeft: " + (CFX_ByteString)m_isLeft + '\n' + |
- CBC_DetectionResultColumn::toString(); |
-} |
-void CBC_DetectionResultRowIndicatorColumn::removeIncorrectCodewords( |
- CFX_PtrArray* codewords, |
- CBC_BarcodeMetadata barcodeMetadata) { |
- for (int32_t codewordRow = 0; codewordRow < codewords->GetSize(); |
- codewordRow++) { |
- CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordRow); |
- if (codeword == NULL) { |
- continue; |
- } |
- int32_t rowIndicatorValue = codeword->getValue() % 30; |
- int32_t codewordRowNumber = codeword->getRowNumber(); |
- if (codewordRowNumber > barcodeMetadata.getRowCount()) { |
- codewords->SetAt(codewordRow, NULL); |
- continue; |
- } |
- if (!m_isLeft) { |
- codewordRowNumber += 2; |
- } |
- switch (codewordRowNumber % 3) { |
- case 0: |
- if (rowIndicatorValue * 3 + 1 != |
- barcodeMetadata.getRowCountUpperPart()) { |
- codewords->SetAt(codewordRow, NULL); |
- } |
- break; |
- case 1: |
- if (rowIndicatorValue / 3 != |
- barcodeMetadata.getErrorCorrectionLevel() || |
- rowIndicatorValue % 3 != barcodeMetadata.getRowCountLowerPart()) { |
- codewords->SetAt(codewordRow, NULL); |
- } |
- break; |
- case 2: |
- if (rowIndicatorValue + 1 != barcodeMetadata.getColumnCount()) { |
- codewords->SetAt(codewordRow, NULL); |
- } |
- break; |
- } |
- } |
-} |
+// 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 2013 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/BC_ResultPoint.h" |
+#include "BC_PDF417BarcodeMetadata.h" |
+#include "BC_PDF417BoundingBox.h" |
+#include "BC_PDF417Codeword.h" |
+#include "BC_PDF417BarcodeValue.h" |
+#include "BC_PDF417Common.h" |
+#include "BC_PDF417DetectionResultColumn.h" |
+#include "BC_PDF417DetectionResultRowIndicatorColumn.h" |
+CBC_DetectionResultRowIndicatorColumn::CBC_DetectionResultRowIndicatorColumn( |
+ CBC_BoundingBox* boundingBox, |
+ FX_BOOL isLeft) |
+ : CBC_DetectionResultColumn(boundingBox) { |
+ m_isLeft = isLeft; |
+} |
+CBC_DetectionResultRowIndicatorColumn:: |
+ ~CBC_DetectionResultRowIndicatorColumn() {} |
+void CBC_DetectionResultRowIndicatorColumn::setRowNumbers() { |
+ for (int32_t i = 0; i < m_codewords->GetSize(); i++) { |
+ CBC_Codeword* codeword = (CBC_Codeword*)m_codewords->GetAt(i); |
+ if (codeword != NULL) { |
+ codeword->setRowNumberAsRowIndicatorColumn(); |
+ } |
+ } |
+} |
+int32_t |
+CBC_DetectionResultRowIndicatorColumn::adjustCompleteIndicatorColumnRowNumbers( |
+ CBC_BarcodeMetadata barcodeMetadata) { |
+ CFX_PtrArray* codewords = getCodewords(); |
+ setRowNumbers(); |
+ removeIncorrectCodewords(codewords, barcodeMetadata); |
+ CBC_BoundingBox* boundingBox = getBoundingBox(); |
+ CBC_ResultPoint* top = |
+ m_isLeft ? boundingBox->getTopLeft() : boundingBox->getTopRight(); |
+ CBC_ResultPoint* bottom = |
+ m_isLeft ? boundingBox->getBottomLeft() : boundingBox->getBottomRight(); |
+ int32_t firstRow = imageRowToCodewordIndex((int32_t)top->GetY()); |
+ int32_t lastRow = imageRowToCodewordIndex((int32_t)bottom->GetY()); |
+ FX_FLOAT averageRowHeight = |
+ (lastRow - firstRow) / (FX_FLOAT)barcodeMetadata.getRowCount(); |
+ int32_t barcodeRow = -1; |
+ int32_t maxRowHeight = 1; |
+ int32_t currentRowHeight = 0; |
+ for (int32_t codewordsRow = firstRow; codewordsRow < lastRow; |
+ codewordsRow++) { |
+ if (codewords->GetAt(codewordsRow) == NULL) { |
+ continue; |
+ } |
+ CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordsRow); |
+ int32_t rowDifference = codeword->getRowNumber() - barcodeRow; |
+ if (rowDifference == 0) { |
+ currentRowHeight++; |
+ } else if (rowDifference == 1) { |
+ maxRowHeight = |
+ maxRowHeight > currentRowHeight ? maxRowHeight : currentRowHeight; |
+ currentRowHeight = 1; |
+ barcodeRow = codeword->getRowNumber(); |
+ } else if (rowDifference < 0) { |
+ codewords->SetAt(codewordsRow, NULL); |
+ } else if (codeword->getRowNumber() >= barcodeMetadata.getRowCount()) { |
+ codewords->SetAt(codewordsRow, NULL); |
+ } else if (rowDifference > codewordsRow) { |
+ codewords->SetAt(codewordsRow, NULL); |
+ } else { |
+ int32_t checkedRows; |
+ if (maxRowHeight > 2) { |
+ checkedRows = (maxRowHeight - 2) * rowDifference; |
+ } else { |
+ checkedRows = rowDifference; |
+ } |
+ FX_BOOL closePreviousCodewordFound = checkedRows >= codewordsRow; |
+ for (int32_t i = 1; i <= checkedRows && !closePreviousCodewordFound; |
+ i++) { |
+ closePreviousCodewordFound = codewords->GetAt(codewordsRow - i) != NULL; |
+ } |
+ if (closePreviousCodewordFound) { |
+ codewords->SetAt(codewordsRow, NULL); |
+ } else { |
+ barcodeRow = codeword->getRowNumber(); |
+ currentRowHeight = 1; |
+ } |
+ } |
+ } |
+ return (int32_t)(averageRowHeight + 0.5); |
+} |
+CFX_Int32Array* CBC_DetectionResultRowIndicatorColumn::getRowHeights( |
+ int32_t& e) { |
+ CBC_BarcodeMetadata* barcodeMetadata = getBarcodeMetadata(); |
+ if (barcodeMetadata == NULL) { |
+ e = BCExceptionCannotMetadata; |
+ return NULL; |
+ } |
+ adjustIncompleteIndicatorColumnRowNumbers(*barcodeMetadata); |
+ CFX_Int32Array* result = new CFX_Int32Array; |
+ result->SetSize(barcodeMetadata->getRowCount()); |
+ for (int32_t i = 0; i < getCodewords()->GetSize(); i++) { |
+ CBC_Codeword* codeword = (CBC_Codeword*)getCodewords()->GetAt(i); |
+ if (codeword != NULL) { |
+ result->SetAt(codeword->getRowNumber(), |
+ result->GetAt(codeword->getRowNumber()) + 1); |
+ } |
+ } |
+ return result; |
+} |
+int32_t CBC_DetectionResultRowIndicatorColumn:: |
+ adjustIncompleteIndicatorColumnRowNumbers( |
+ CBC_BarcodeMetadata barcodeMetadata) { |
+ CBC_BoundingBox* boundingBox = getBoundingBox(); |
+ CBC_ResultPoint* top = |
+ m_isLeft ? boundingBox->getTopLeft() : boundingBox->getTopRight(); |
+ CBC_ResultPoint* bottom = |
+ m_isLeft ? boundingBox->getBottomLeft() : boundingBox->getBottomRight(); |
+ int32_t firstRow = imageRowToCodewordIndex((int32_t)top->GetY()); |
+ int32_t lastRow = imageRowToCodewordIndex((int32_t)bottom->GetY()); |
+ FX_FLOAT averageRowHeight = |
+ (lastRow - firstRow) / (FX_FLOAT)barcodeMetadata.getRowCount(); |
+ CFX_PtrArray* codewords = getCodewords(); |
+ int32_t barcodeRow = -1; |
+ int32_t maxRowHeight = 1; |
+ int32_t currentRowHeight = 0; |
+ for (int32_t codewordsRow = firstRow; codewordsRow < lastRow; |
+ codewordsRow++) { |
+ if (codewords->GetAt(codewordsRow) == NULL) { |
+ continue; |
+ } |
+ CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordsRow); |
+ codeword->setRowNumberAsRowIndicatorColumn(); |
+ int32_t rowDifference = codeword->getRowNumber() - barcodeRow; |
+ if (rowDifference == 0) { |
+ currentRowHeight++; |
+ } else if (rowDifference == 1) { |
+ maxRowHeight = |
+ maxRowHeight > currentRowHeight ? maxRowHeight : currentRowHeight; |
+ currentRowHeight = 1; |
+ barcodeRow = codeword->getRowNumber(); |
+ } else if (codeword->getRowNumber() >= barcodeMetadata.getRowCount()) { |
+ codewords->SetAt(codewordsRow, NULL); |
+ } else { |
+ barcodeRow = codeword->getRowNumber(); |
+ currentRowHeight = 1; |
+ } |
+ } |
+ return (int32_t)(averageRowHeight + 0.5); |
+} |
+CBC_BarcodeMetadata* |
+CBC_DetectionResultRowIndicatorColumn::getBarcodeMetadata() { |
+ CFX_PtrArray* codewords = getCodewords(); |
+ CBC_BarcodeValue barcodeColumnCount; |
+ CBC_BarcodeValue barcodeRowCountUpperPart; |
+ CBC_BarcodeValue barcodeRowCountLowerPart; |
+ CBC_BarcodeValue barcodeECLevel; |
+ for (int32_t i = 0; i < codewords->GetSize(); i++) { |
+ CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(i); |
+ if (codeword == NULL) { |
+ continue; |
+ } |
+ codeword->setRowNumberAsRowIndicatorColumn(); |
+ int32_t rowIndicatorValue = codeword->getValue() % 30; |
+ int32_t codewordRowNumber = codeword->getRowNumber(); |
+ if (!m_isLeft) { |
+ codewordRowNumber += 2; |
+ } |
+ switch (codewordRowNumber % 3) { |
+ case 0: |
+ barcodeRowCountUpperPart.setValue(rowIndicatorValue * 3 + 1); |
+ break; |
+ case 1: |
+ barcodeECLevel.setValue(rowIndicatorValue / 3); |
+ barcodeRowCountLowerPart.setValue(rowIndicatorValue % 3); |
+ break; |
+ case 2: |
+ barcodeColumnCount.setValue(rowIndicatorValue + 1); |
+ break; |
+ } |
+ } |
+ if ((barcodeColumnCount.getValue()->GetSize() == 0) || |
+ (barcodeRowCountUpperPart.getValue()->GetSize() == 0) || |
+ (barcodeRowCountLowerPart.getValue()->GetSize() == 0) || |
+ (barcodeECLevel.getValue()->GetSize() == 0) || |
+ barcodeColumnCount.getValue()->GetAt(0) < 1 || |
+ barcodeRowCountUpperPart.getValue()->GetAt(0) + |
+ barcodeRowCountLowerPart.getValue()->GetAt(0) < |
+ CBC_PDF417Common::MIN_ROWS_IN_BARCODE || |
+ barcodeRowCountUpperPart.getValue()->GetAt(0) + |
+ barcodeRowCountLowerPart.getValue()->GetAt(0) > |
+ CBC_PDF417Common::MAX_ROWS_IN_BARCODE) { |
+ return NULL; |
+ } |
+ CBC_BarcodeMetadata* barcodeMetadata = |
+ new CBC_BarcodeMetadata(barcodeColumnCount.getValue()->GetAt(0), |
+ barcodeRowCountUpperPart.getValue()->GetAt(0), |
+ barcodeRowCountLowerPart.getValue()->GetAt(0), |
+ barcodeECLevel.getValue()->GetAt(0)); |
+ removeIncorrectCodewords(codewords, *barcodeMetadata); |
+ return barcodeMetadata; |
+} |
+FX_BOOL CBC_DetectionResultRowIndicatorColumn::isLeft() { |
+ return m_isLeft; |
+} |
+CFX_ByteString CBC_DetectionResultRowIndicatorColumn::toString() { |
+ return (CFX_ByteString) "IsLeft: " + (CFX_ByteString)m_isLeft + '\n' + |
+ CBC_DetectionResultColumn::toString(); |
+} |
+void CBC_DetectionResultRowIndicatorColumn::removeIncorrectCodewords( |
+ CFX_PtrArray* codewords, |
+ CBC_BarcodeMetadata barcodeMetadata) { |
+ for (int32_t codewordRow = 0; codewordRow < codewords->GetSize(); |
+ codewordRow++) { |
+ CBC_Codeword* codeword = (CBC_Codeword*)codewords->GetAt(codewordRow); |
+ if (codeword == NULL) { |
+ continue; |
+ } |
+ int32_t rowIndicatorValue = codeword->getValue() % 30; |
+ int32_t codewordRowNumber = codeword->getRowNumber(); |
+ if (codewordRowNumber > barcodeMetadata.getRowCount()) { |
+ codewords->SetAt(codewordRow, NULL); |
+ continue; |
+ } |
+ if (!m_isLeft) { |
+ codewordRowNumber += 2; |
+ } |
+ switch (codewordRowNumber % 3) { |
+ case 0: |
+ if (rowIndicatorValue * 3 + 1 != |
+ barcodeMetadata.getRowCountUpperPart()) { |
+ codewords->SetAt(codewordRow, NULL); |
+ } |
+ break; |
+ case 1: |
+ if (rowIndicatorValue / 3 != |
+ barcodeMetadata.getErrorCorrectionLevel() || |
+ rowIndicatorValue % 3 != barcodeMetadata.getRowCountLowerPart()) { |
+ codewords->SetAt(codewordRow, NULL); |
+ } |
+ break; |
+ case 2: |
+ if (rowIndicatorValue + 1 != barcodeMetadata.getColumnCount()) { |
+ codewords->SetAt(codewordRow, NULL); |
+ } |
+ break; |
+ } |
+ } |
+} |