diff --git a/cpp/core/src/zxing/MultiFormatReader.cpp b/cpp/core/src/zxing/MultiFormatReader.cpp index 5bdf1657e..f12a32db3 100644 --- a/cpp/core/src/zxing/MultiFormatReader.cpp +++ b/cpp/core/src/zxing/MultiFormatReader.cpp @@ -19,7 +19,7 @@ * limitations under the License. */ -#include "MultiFormatReader.h" +#include #include #include #include @@ -27,23 +27,27 @@ #include namespace zxing { - MultiFormatReader::MultiFormatReader() : readers() { - readers.push_back(Ref(new zxing::qrcode::QRCodeReader())); - readers.push_back(Ref(new zxing::datamatrix::DataMatrixReader())); - readers.push_back(Ref(new zxing::oned::MultiFormatUPCEANReader())); - readers.push_back(Ref(new zxing::oned::MultiFormatOneDReader())); + MultiFormatReader::MultiFormatReader() { + readers.push_back(new zxing::qrcode::QRCodeReader()); + readers.push_back(new zxing::datamatrix::DataMatrixReader()); + readers.push_back(new zxing::oned::MultiFormatUPCEANReader()); + readers.push_back(new zxing::oned::MultiFormatOneDReader()); } Ref MultiFormatReader::decode(Ref image){ - int size = readers.size(); - for (int i = 0; i < size; i++) { - Ref reader = readers[i]; + for (unsigned int i = 0; i < readers.size(); i++) { try { - return reader->decode(image); + return reader[i]->decode(image); } catch (ReaderException re) { // continue } } throw ReaderException("No code detected"); } -} + + MultiFormatReader::~MultiFormatReader(){ + for (unsigned int i = 0; i < readers.size(); i++) { + delete readers[i]; + } + } +} \ No newline at end of file diff --git a/cpp/core/src/zxing/MultiFormatReader.h b/cpp/core/src/zxing/MultiFormatReader.h index 4cbe61bb6..f88ebc979 100644 --- a/cpp/core/src/zxing/MultiFormatReader.h +++ b/cpp/core/src/zxing/MultiFormatReader.h @@ -3,6 +3,7 @@ * ZXing * * Created by Lukasz Warchol on 10-01-26. + * Modified by Luiz Silva on 09/02/2010. * Copyright 2010 ZXing authors All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -27,11 +28,12 @@ namespace zxing { class MultiFormatReader : public Reader { private: - std::vector >readers; + std::vectorreaders; public: MultiFormatReader(); Ref decode(Ref image); + ~MultiFormatReader(); }; } diff --git a/cpp/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.cpp b/cpp/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.cpp index 25d6db633..d2bc01471 100644 --- a/cpp/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.cpp +++ b/cpp/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.cpp @@ -53,9 +53,10 @@ std::vector > MonochromeRectangleDetector::detect() { // Go try to find point A again with better information -- might have been off at first. pointA.reset(findCornerFromCenter(halfWidth, 0, left, right, halfHeight, -deltaY, top, bottom, halfWidth >> 2)); - std::vector > corners(4); - corners[0].reset(pointA); - corners[1].reset(pointB); + std::vector > corners(4); + + corners[0].reset(pointA); + corners[1].reset(pointB); corners[2].reset(pointC); corners[3].reset(pointD); return corners; @@ -63,11 +64,11 @@ std::vector > MonochromeRectangleDetector::detect() { Ref MonochromeRectangleDetector::findCornerFromCenter(int centerX, int deltaX, int left, int right, int centerY, int deltaY, int top, int bottom, int maxWhiteRun) { - int* lastRange = NULL; + Ref lastRange(NULL); for (int y = centerY, x = centerX; y < bottom && y >= top && x < right && x >= left; y += deltaY, x += deltaX) { - int* range; + Ref range(NULL); if (deltaX == 0) { // horizontal slices, up and down range = blackWhiteRange(y, maxWhiteRun, left, right, true); @@ -82,48 +83,40 @@ Ref MonochromeRectangleDetector::findCornerFromCenter(int centerX, // lastRange was found if (deltaX == 0) { int lastY = y - deltaY; - if (lastRange[0] < centerX) { - if (lastRange[1] > centerX) { + if (lastRange->start < centerX) { + if (lastRange->end > centerX) { // straddle, choose one or the other based on direction - Ref result(new CornerPoint(deltaY > 0 ? lastRange[0] : lastRange[1], lastY)); - delete [] lastRange; + Ref result(new CornerPoint(deltaY > 0 ? lastRange->start : lastRange->end, lastY)); return result; } - Ref result(new CornerPoint(lastRange[0], lastY)); - delete [] lastRange; + Ref result(new CornerPoint(lastRange->start, lastY)); return result; } else { - Ref result(new CornerPoint(lastRange[1], lastY)); - delete [] lastRange; + Ref result(new CornerPoint(lastRange->end, lastY)); return result; } } else { int lastX = x - deltaX; - if (lastRange[0] < centerY) { - if (lastRange[1] > centerY) { - Ref result(new CornerPoint(lastX, deltaX < 0 ? lastRange[0] : lastRange[1])); - delete [] lastRange; + if (lastRange->start < centerY) { + if (lastRange->end > centerY) { + Ref result(new CornerPoint(lastX, deltaX < 0 ? lastRange->start : lastRange->end)); return result; } - Ref result(new CornerPoint(lastX, lastRange[0])); - delete [] lastRange; + Ref result(new CornerPoint(lastX, lastRange->start)); return result; } else { - Ref result(new CornerPoint(lastX, lastRange[1])); - delete [] lastRange; + Ref result(new CornerPoint(lastX, lastRange->end)); return result; } } } } - delete [] lastRange; lastRange = range; } - delete [] lastRange; throw ReaderException("Couldn't find corners"); } -int* MonochromeRectangleDetector::blackWhiteRange(int fixedDimension, int maxWhiteRun, int minDim, int maxDim, +Ref MonochromeRectangleDetector::blackWhiteRange(int fixedDimension, int maxWhiteRun, int minDim, int maxDim, bool horizontal) { int center = (minDim + maxDim) >> 1; @@ -167,15 +160,13 @@ int* MonochromeRectangleDetector::blackWhiteRange(int fixedDimension, int maxWhi } } end--; - int* result; + Ref result(NULL); if (end > start) { - result = new int [2]; - result[0] = start; - result[1] = end; + result = new TwoInts; + result->start = start; + result->end = end; } - else - result = NULL; - return result; + return result; } } } diff --git a/cpp/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.h b/cpp/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.h index a2729fe9c..45799a5be 100644 --- a/cpp/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.h +++ b/cpp/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.h @@ -31,6 +31,11 @@ namespace zxing { namespace datamatrix { +struct TwoInts: public Counted { + int start; + int end; +}; + class MonochromeRectangleDetector : public Counted { private: static const int MAX_MODULES = 32; @@ -45,7 +50,7 @@ private: Ref findCornerFromCenter(int centerX, int deltaX, int left, int right, int centerY, int deltaY, int top, int bottom, int maxWhiteRun); - int* blackWhiteRange(int fixedDimension, int maxWhiteRun, int minDim, int maxDim, + Ref blackWhiteRange(int fixedDimension, int maxWhiteRun, int minDim, int maxDim, bool horizontal); int max(int a, float b) { return (float) a > b ? a : (int) b;};