diff options
Diffstat (limited to 'xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp')
-rw-r--r-- | xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp | 404 |
1 files changed, 202 insertions, 202 deletions
diff --git a/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp b/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp index a2c01c2fce..396f272f3f 100644 --- a/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp +++ b/xfa/src/fxbarcode/qrcode/BC_QRAlignmentPatternFinder.cpp @@ -1,202 +1,202 @@ -// 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/BC_ResultPoint.h"
-#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h"
-#include "BC_QRAlignmentPattern.h"
-#include "BC_QRAlignmentPatternFinder.h"
-CBC_QRAlignmentPatternFinder::CBC_QRAlignmentPatternFinder(
- CBC_CommonBitMatrix* image,
- int32_t startX,
- int32_t startY,
- int32_t width,
- int32_t height,
- FX_FLOAT moduleSize)
- : m_image(image),
- m_startX(startX),
- m_startY(startY),
- m_width(width),
- m_height(height),
- m_moduleSize(moduleSize)
-
-{
- m_crossCheckStateCount.SetSize(3);
-}
-CBC_QRAlignmentPatternFinder::~CBC_QRAlignmentPatternFinder() {
- for (int32_t i = 0; i < m_possibleCenters.GetSize(); i++) {
- delete (CBC_QRAlignmentPattern*)m_possibleCenters[i];
- }
- m_possibleCenters.RemoveAll();
-}
-CBC_QRAlignmentPattern* CBC_QRAlignmentPatternFinder::Find(int32_t& e) {
- int32_t startX = m_startX;
- int32_t height = m_height;
- int32_t maxJ = startX + m_width;
- int32_t middleI = m_startY + (height >> 1);
- CFX_Int32Array stateCount;
- stateCount.SetSize(3);
- for (int32_t iGen = 0; iGen < height; iGen++) {
- int32_t i =
- middleI + ((iGen & 0x01) == 0 ? ((iGen + 1) >> 1) : -((iGen + 1) >> 1));
- stateCount[0] = 0;
- stateCount[1] = 0;
- stateCount[2] = 0;
- int32_t j = startX;
- while (j < maxJ && !m_image->Get(j, i)) {
- j++;
- }
- int32_t currentState = 0;
- while (j < maxJ) {
- if (m_image->Get(j, i)) {
- if (currentState == 1) {
- stateCount[currentState]++;
- } else {
- if (currentState == 2) {
- if (FoundPatternCross(stateCount)) {
- CBC_QRAlignmentPattern* confirmed =
- HandlePossibleCenter(stateCount, i, j);
- if (confirmed != NULL) {
- return confirmed;
- }
- }
- stateCount[0] = stateCount[2];
- stateCount[1] = 1;
- stateCount[2] = 0;
- currentState = 1;
- } else {
- stateCount[++currentState]++;
- }
- }
- } else {
- if (currentState == 1) {
- currentState++;
- }
- stateCount[currentState]++;
- }
- j++;
- }
- if (FoundPatternCross(stateCount)) {
- CBC_QRAlignmentPattern* confirmed =
- HandlePossibleCenter(stateCount, i, maxJ);
- if (confirmed != NULL) {
- return confirmed;
- }
- }
- }
- if (m_possibleCenters.GetSize() != 0) {
- return ((CBC_QRAlignmentPattern*)(m_possibleCenters[0]))->Clone();
- }
- e = BCExceptionRead;
- BC_EXCEPTION_CHECK_ReturnValue(e, NULL);
- return NULL;
-}
-FX_FLOAT CBC_QRAlignmentPatternFinder::CenterFromEnd(
- const CFX_Int32Array& stateCount,
- int32_t end) {
- return (FX_FLOAT)(end - stateCount[2]) - stateCount[1] / 2.0f;
-}
-FX_BOOL CBC_QRAlignmentPatternFinder::FoundPatternCross(
- const CFX_Int32Array& stateCount) {
- FX_FLOAT moduleSize = m_moduleSize;
- FX_FLOAT maxVariance = moduleSize / 2.0f;
- for (int32_t i = 0; i < 3; i++) {
- if (fabs(moduleSize - stateCount[i]) >= maxVariance) {
- return false;
- }
- }
- return TRUE;
-}
-FX_FLOAT CBC_QRAlignmentPatternFinder::CrossCheckVertical(
- int32_t startI,
- int32_t centerJ,
- int32_t maxCount,
- int32_t originalStateCountTotal) {
- int32_t maxI = m_image->GetHeight();
- CFX_Int32Array stateCount;
- stateCount.Copy(m_crossCheckStateCount);
- stateCount[0] = 0;
- stateCount[1] = 0;
- stateCount[2] = 0;
- int32_t i = startI;
- while (i >= 0 && m_image->Get(centerJ, i) && stateCount[1] <= maxCount) {
- stateCount[1]++;
- i--;
- }
- if (i < 0 || stateCount[1] > maxCount) {
- return FXSYS_nan();
- }
- while (i >= 0 && !m_image->Get(centerJ, i) && stateCount[0] <= maxCount) {
- stateCount[0]++;
- i--;
- }
- if (stateCount[0] > maxCount) {
- return FXSYS_nan();
- }
- i = startI + 1;
- while (i < maxI && m_image->Get(centerJ, i) && stateCount[1] <= maxCount) {
- stateCount[1]++;
- i++;
- }
- if (i == maxI || stateCount[1] > maxCount) {
- return FXSYS_nan();
- }
- while (i < maxI && !m_image->Get(centerJ, i) && stateCount[2] <= maxCount) {
- stateCount[2]++;
- i++;
- }
- if (stateCount[2] > maxCount) {
- return FXSYS_nan();
- }
- int32_t stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2];
- if (5 * abs(stateCountTotal - originalStateCountTotal) >=
- originalStateCountTotal) {
- return FXSYS_nan();
- }
- return FoundPatternCross(stateCount) ? CenterFromEnd(stateCount, i)
- : FXSYS_nan();
-}
-CBC_QRAlignmentPattern* CBC_QRAlignmentPatternFinder::HandlePossibleCenter(
- const CFX_Int32Array& stateCount,
- int32_t i,
- int32_t j) {
- int32_t stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2];
- FX_FLOAT centerJ = CenterFromEnd(stateCount, j);
- FX_FLOAT centerI = CrossCheckVertical(i, (int32_t)centerJ, 2 * stateCount[1],
- stateCountTotal);
- if (!FXSYS_isnan(centerI)) {
- FX_FLOAT estimatedModuleSize =
- (FX_FLOAT)(stateCount[0] + stateCount[1] + stateCount[2]) / 3.0f;
- int32_t max = m_possibleCenters.GetSize();
- for (int32_t index = 0; index < max; index++) {
- CBC_QRAlignmentPattern* center =
- (CBC_QRAlignmentPattern*)(m_possibleCenters[index]);
- if (center->AboutEquals(estimatedModuleSize, centerI, centerJ)) {
- return new CBC_QRAlignmentPattern(centerJ, centerI,
- estimatedModuleSize);
- }
- }
- m_possibleCenters.Add(
- new CBC_QRAlignmentPattern(centerJ, centerI, estimatedModuleSize));
- }
- return NULL;
-}
+// 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/BC_ResultPoint.h" +#include "xfa/src/fxbarcode/common/BC_CommonBitMatrix.h" +#include "BC_QRAlignmentPattern.h" +#include "BC_QRAlignmentPatternFinder.h" +CBC_QRAlignmentPatternFinder::CBC_QRAlignmentPatternFinder( + CBC_CommonBitMatrix* image, + int32_t startX, + int32_t startY, + int32_t width, + int32_t height, + FX_FLOAT moduleSize) + : m_image(image), + m_startX(startX), + m_startY(startY), + m_width(width), + m_height(height), + m_moduleSize(moduleSize) + +{ + m_crossCheckStateCount.SetSize(3); +} +CBC_QRAlignmentPatternFinder::~CBC_QRAlignmentPatternFinder() { + for (int32_t i = 0; i < m_possibleCenters.GetSize(); i++) { + delete (CBC_QRAlignmentPattern*)m_possibleCenters[i]; + } + m_possibleCenters.RemoveAll(); +} +CBC_QRAlignmentPattern* CBC_QRAlignmentPatternFinder::Find(int32_t& e) { + int32_t startX = m_startX; + int32_t height = m_height; + int32_t maxJ = startX + m_width; + int32_t middleI = m_startY + (height >> 1); + CFX_Int32Array stateCount; + stateCount.SetSize(3); + for (int32_t iGen = 0; iGen < height; iGen++) { + int32_t i = + middleI + ((iGen & 0x01) == 0 ? ((iGen + 1) >> 1) : -((iGen + 1) >> 1)); + stateCount[0] = 0; + stateCount[1] = 0; + stateCount[2] = 0; + int32_t j = startX; + while (j < maxJ && !m_image->Get(j, i)) { + j++; + } + int32_t currentState = 0; + while (j < maxJ) { + if (m_image->Get(j, i)) { + if (currentState == 1) { + stateCount[currentState]++; + } else { + if (currentState == 2) { + if (FoundPatternCross(stateCount)) { + CBC_QRAlignmentPattern* confirmed = + HandlePossibleCenter(stateCount, i, j); + if (confirmed != NULL) { + return confirmed; + } + } + stateCount[0] = stateCount[2]; + stateCount[1] = 1; + stateCount[2] = 0; + currentState = 1; + } else { + stateCount[++currentState]++; + } + } + } else { + if (currentState == 1) { + currentState++; + } + stateCount[currentState]++; + } + j++; + } + if (FoundPatternCross(stateCount)) { + CBC_QRAlignmentPattern* confirmed = + HandlePossibleCenter(stateCount, i, maxJ); + if (confirmed != NULL) { + return confirmed; + } + } + } + if (m_possibleCenters.GetSize() != 0) { + return ((CBC_QRAlignmentPattern*)(m_possibleCenters[0]))->Clone(); + } + e = BCExceptionRead; + BC_EXCEPTION_CHECK_ReturnValue(e, NULL); + return NULL; +} +FX_FLOAT CBC_QRAlignmentPatternFinder::CenterFromEnd( + const CFX_Int32Array& stateCount, + int32_t end) { + return (FX_FLOAT)(end - stateCount[2]) - stateCount[1] / 2.0f; +} +FX_BOOL CBC_QRAlignmentPatternFinder::FoundPatternCross( + const CFX_Int32Array& stateCount) { + FX_FLOAT moduleSize = m_moduleSize; + FX_FLOAT maxVariance = moduleSize / 2.0f; + for (int32_t i = 0; i < 3; i++) { + if (fabs(moduleSize - stateCount[i]) >= maxVariance) { + return false; + } + } + return TRUE; +} +FX_FLOAT CBC_QRAlignmentPatternFinder::CrossCheckVertical( + int32_t startI, + int32_t centerJ, + int32_t maxCount, + int32_t originalStateCountTotal) { + int32_t maxI = m_image->GetHeight(); + CFX_Int32Array stateCount; + stateCount.Copy(m_crossCheckStateCount); + stateCount[0] = 0; + stateCount[1] = 0; + stateCount[2] = 0; + int32_t i = startI; + while (i >= 0 && m_image->Get(centerJ, i) && stateCount[1] <= maxCount) { + stateCount[1]++; + i--; + } + if (i < 0 || stateCount[1] > maxCount) { + return FXSYS_nan(); + } + while (i >= 0 && !m_image->Get(centerJ, i) && stateCount[0] <= maxCount) { + stateCount[0]++; + i--; + } + if (stateCount[0] > maxCount) { + return FXSYS_nan(); + } + i = startI + 1; + while (i < maxI && m_image->Get(centerJ, i) && stateCount[1] <= maxCount) { + stateCount[1]++; + i++; + } + if (i == maxI || stateCount[1] > maxCount) { + return FXSYS_nan(); + } + while (i < maxI && !m_image->Get(centerJ, i) && stateCount[2] <= maxCount) { + stateCount[2]++; + i++; + } + if (stateCount[2] > maxCount) { + return FXSYS_nan(); + } + int32_t stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; + if (5 * abs(stateCountTotal - originalStateCountTotal) >= + originalStateCountTotal) { + return FXSYS_nan(); + } + return FoundPatternCross(stateCount) ? CenterFromEnd(stateCount, i) + : FXSYS_nan(); +} +CBC_QRAlignmentPattern* CBC_QRAlignmentPatternFinder::HandlePossibleCenter( + const CFX_Int32Array& stateCount, + int32_t i, + int32_t j) { + int32_t stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; + FX_FLOAT centerJ = CenterFromEnd(stateCount, j); + FX_FLOAT centerI = CrossCheckVertical(i, (int32_t)centerJ, 2 * stateCount[1], + stateCountTotal); + if (!FXSYS_isnan(centerI)) { + FX_FLOAT estimatedModuleSize = + (FX_FLOAT)(stateCount[0] + stateCount[1] + stateCount[2]) / 3.0f; + int32_t max = m_possibleCenters.GetSize(); + for (int32_t index = 0; index < max; index++) { + CBC_QRAlignmentPattern* center = + (CBC_QRAlignmentPattern*)(m_possibleCenters[index]); + if (center->AboutEquals(estimatedModuleSize, centerI, centerJ)) { + return new CBC_QRAlignmentPattern(centerJ, centerI, + estimatedModuleSize); + } + } + m_possibleCenters.Add( + new CBC_QRAlignmentPattern(centerJ, centerI, estimatedModuleSize)); + } + return NULL; +} |