#include <zxing/qrcode/detector/AlignmentPatternFinder.h>\r
#include <zxing/qrcode/Version.h>\r
#include <zxing/common/GridSampler.h>\r
+#include <zxing/DecodeHints.h>\r
#include <cmath>\r
#include <sstream>\r
+#include <cstdlib>\r
\r
namespace zxing {\r
namespace qrcode {\r
return image_;\r
}\r
\r
-Ref<DetectorResult> Detector::detect() {\r
- FinderPatternFinder finder(image_);\r
- Ref<FinderPatternInfo> info(finder.find());\r
+Ref<DetectorResult> Detector::detect(DecodeHints const& hints) {\r
+ callback_ = hints.getResultPointCallback();\r
+ FinderPatternFinder finder(image_, hints.getResultPointCallback());\r
+ Ref<FinderPatternInfo> info(finder.find(hints));\r
\r
Ref<FinderPattern> topLeft(info->getTopLeft());\r
Ref<FinderPattern> topRight(info->getTopRight());\r
\r
int Detector::computeDimension(Ref<ResultPoint> topLeft, Ref<ResultPoint> topRight, Ref<ResultPoint> bottomLeft,\r
float moduleSize) {\r
- int tltrCentersDimension = lround(FinderPatternFinder::distance(topLeft, topRight) / moduleSize);\r
- int tlblCentersDimension = lround(FinderPatternFinder::distance(topLeft, bottomLeft) / moduleSize);\r
+ int tltrCentersDimension = int(FinderPatternFinder::distance(topLeft, topRight) / moduleSize + 0.5f);\r
+ int tlblCentersDimension = int(FinderPatternFinder::distance(topLeft, bottomLeft) / moduleSize + 0.5f);\r
int dimension = ((tltrCentersDimension + tlblCentersDimension) >> 1) + 7;\r
switch (dimension & 0x03) { // mod 4\r
case 0:\r
\r
float Detector::sizeOfBlackWhiteBlackRunBothWays(int fromX, int fromY, int toX, int toY) {\r
\r
- float result = sizeOfBlackWhiteBlackRun(fromX, fromY, toX, toY);\r
-\r
-\r
- // Now count other way -- don't run off image though of course\r
- int otherToX = fromX - (toX - fromX);\r
- if (otherToX < 0) {\r
- // "to" should the be the first value not included, so, the first value off\r
- // the edge is -1\r
- otherToX = -1;\r
- } else if (otherToX >= (int)image_->getWidth()) {\r
- otherToX = image_->getWidth();\r
- }\r
- int otherToY = fromY - (toY - fromY);\r
- if (otherToY < 0) {\r
- otherToY = -1;\r
- } else if (otherToY >= (int)image_->getHeight()) {\r
- otherToY = image_->getHeight();\r
- }\r
- result += sizeOfBlackWhiteBlackRun(fromX, fromY, otherToX, otherToY);\r
- return result - 1.0f; // -1 because we counted the middle pixel twice\r
+ float result = sizeOfBlackWhiteBlackRun(fromX, fromY, toX, toY);\r
+\r
+ // Now count other way -- don't run off image though of course\r
+ float scale = 1.0f;\r
+ int otherToX = fromX - (toX - fromX);\r
+ if (otherToX < 0) {\r
+ scale = (float) fromX / (float) (fromX - otherToX);\r
+ otherToX = 0;\r
+ } else if (otherToX > (int)image_->getWidth()) {\r
+ scale = (float) (image_->getWidth() - fromX) / (float) (otherToX - fromX);\r
+ otherToX = image_->getWidth();\r
+ }\r
+ int otherToY = (int) (fromY - (toY - fromY) * scale);\r
+\r
+ scale = 1.0f;\r
+ if (otherToY < 0) {\r
+ scale = (float) fromY / (float) (fromY - otherToY);\r
+ otherToY = 0;\r
+ } else if (otherToY > (int)image_->getHeight()) {\r
+ scale = (float) (image_->getHeight() - fromY) / (float) (otherToY - fromY);\r
+ otherToY = image_->getHeight();\r
+ }\r
+ otherToX = (int) (fromX + (otherToX - fromX) * scale);\r
+\r
+ result += sizeOfBlackWhiteBlackRun(fromX, fromY, otherToX, otherToY);\r
+ return result;\r
}\r
\r
float Detector::sizeOfBlackWhiteBlackRun(int fromX, int fromY, int toX, int toY) {\r
if (state == 3) { // Found black, white, black, and stumbled back onto white; done\r
int diffX = x - fromX;\r
int diffY = y - fromY;\r
+ if (xstep < 0) {\r
+ diffX++;\r
+ }\r
return (float)sqrt((double)(diffX * diffX + diffY * diffY));\r
}\r
error += dy;\r
int allowance = (int)(allowanceFactor * overallEstModuleSize);\r
int alignmentAreaLeftX = max(0, estAlignmentX - allowance);\r
int alignmentAreaRightX = min((int)(image_->getWidth() - 1), estAlignmentX + allowance);\r
+ if (alignmentAreaRightX - alignmentAreaLeftX < overallEstModuleSize * 3) {\r
+ throw zxing::ReaderException("region too small to hold alignment pattern");\r
+ }\r
int alignmentAreaTopY = max(0, estAlignmentY - allowance);\r
int alignmentAreaBottomY = min((int)(image_->getHeight() - 1), estAlignmentY + allowance);\r
\r
AlignmentPatternFinder alignmentFinder(image_, alignmentAreaLeftX, alignmentAreaTopY, alignmentAreaRightX\r
- - alignmentAreaLeftX, alignmentAreaBottomY - alignmentAreaTopY, overallEstModuleSize);\r
+ - alignmentAreaLeftX, alignmentAreaBottomY - alignmentAreaTopY, overallEstModuleSize, callback_);\r
return alignmentFinder.find();\r
}\r
\r