X-Git-Url: http://git.rot13.org/?p=zxing.git;a=blobdiff_plain;f=cpp%2Fcore%2Fsrc%2Fzxing%2Fqrcode%2Fdetector%2FAlignmentPatternFinder.cpp;h=1f76491892e88a2bc81d0da2d755245b6489734f;hp=87af79edf96e3ff60307c6de6f5d55cd1c4f9306;hb=d59aa5593ed5a911b1141be85d1888088c21e859;hpb=1bd3f8056f89c3e7c5163326ce2145de97acb829 diff --git a/cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.cpp b/cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.cpp index 87af79ed..1f764918 100644 --- a/cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.cpp +++ b/cpp/core/src/zxing/qrcode/detector/AlignmentPatternFinder.cpp @@ -23,17 +23,18 @@ #include #include #include +#include namespace zxing { namespace qrcode { using namespace std; -float AlignmentPatternFinder::centerFromEnd(valarray &stateCount, int end) { +float AlignmentPatternFinder::centerFromEnd(vector &stateCount, int end) { return (float)(end - stateCount[2]) - stateCount[1] / 2.0f; } -bool AlignmentPatternFinder::foundPatternCross(valarray &stateCount) { +bool AlignmentPatternFinder::foundPatternCross(vector &stateCount) { float maxVariance = moduleSize_ / 2.0f; for (size_t i = 0; i < 3; i++) { if (abs(moduleSize_ - stateCount[i]) >= maxVariance) { @@ -46,7 +47,7 @@ bool AlignmentPatternFinder::foundPatternCross(valarray &stateCount) { float AlignmentPatternFinder::crossCheckVertical(size_t startI, size_t centerJ, int maxCount, int originalStateCountTotal) { int maxI = image_->getHeight(); - valarray stateCount(3); + vector stateCount(3, 0); // Start counting up from center @@ -85,14 +86,14 @@ float AlignmentPatternFinder::crossCheckVertical(size_t startI, size_t centerJ, } int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; - if (5 * abs(stateCountTotal - originalStateCountTotal) >= originalStateCountTotal) { + if (5 * abs(stateCountTotal - originalStateCountTotal) >= 2 * originalStateCountTotal) { return NAN; } return foundPatternCross(stateCount) ? centerFromEnd(stateCount, i) : NAN; } -Ref AlignmentPatternFinder::handlePossibleCenter(valarray &stateCount, size_t i, size_t j) { +Ref AlignmentPatternFinder::handlePossibleCenter(vector &stateCount, size_t i, size_t j) { int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; float centerJ = centerFromEnd(stateCount, j); float centerI = crossCheckVertical(i, (int)centerJ, 2 * stateCount[1], stateCountTotal); @@ -111,15 +112,19 @@ Ref AlignmentPatternFinder::handlePossibleCenter(valarray // Hadn't found this before; save it tmp->retain(); possibleCenters_->push_back(tmp); + if (callback_ != 0) { + callback_->foundPossibleResultPoint(*tmp); + } } Ref result; return result; } AlignmentPatternFinder::AlignmentPatternFinder(Ref image, size_t startX, size_t startY, size_t width, - size_t height, float moduleSize) : + size_t height, float moduleSize, + Refconst& callback) : image_(image), possibleCenters_(new vector ()), startX_(startX), startY_(startY), - width_(width), height_(height), moduleSize_(moduleSize) { + width_(width), height_(height), moduleSize_(moduleSize), callback_(callback) { } AlignmentPatternFinder::~AlignmentPatternFinder() { @@ -136,7 +141,7 @@ Ref AlignmentPatternFinder::find() { // Ref luminanceRow(new BitArray(width_)); // We are looking for black/white/black modules in 1:1:1 ratio; // this tracks the number of black/white/black modules seen so far - valarray stateCount(3); + vector stateCount(3, 0); for (size_t iGen = 0; iGen < height_; iGen++) { // Search from middle outwards size_t i = middleI + ((iGen & 0x01) == 0 ? ((iGen + 1) >> 1) : -((iGen + 1) >> 1));