[SCM] Multi-format 1D/2D barcode image processing library branch, upstream, updated. 24d4480bc48cf9eabf7b2bd2f528248b0e458809

luizcroc luizcroc at 59b500cc-1b3d-0410-9834-0bbf25fbcc57
Wed Aug 4 01:31:30 UTC 2010


The following commit has been merged in the upstream branch:
commit a0350d01294a878cbfb1b2d133ecded70ba652f7
Author: luizcroc <luizcroc at 59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Date:   Wed May 12 22:11:18 2010 +0000

    Memory leak in MultiFormatReader fixed and a better fix for the memory leak in MonochromeRectangleDetector
    
    git-svn-id: http://zxing.googlecode.com/svn/trunk@1355 59b500cc-1b3d-0410-9834-0bbf25fbcc57

diff --git a/cpp/core/src/zxing/MultiFormatReader.cpp b/cpp/core/src/zxing/MultiFormatReader.cpp
index 5bdf165..f12a32d 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 <zxing/MultiFormatReader.h>
 #include <zxing/qrcode/QRCodeReader.h>
 #include <zxing/datamatrix/DataMatrixReader.h>
 #include <zxing/oned/MultiFormatUPCEANReader.h>
@@ -27,23 +27,27 @@
 #include <zxing/ReaderException.h>
 
 namespace zxing {
-	MultiFormatReader::MultiFormatReader() : readers() {
-    readers.push_back(Ref<Reader>(new zxing::qrcode::QRCodeReader()));
-		readers.push_back(Ref<Reader>(new zxing::datamatrix::DataMatrixReader()));
-		readers.push_back(Ref<Reader>(new zxing::oned::MultiFormatUPCEANReader()));
-		readers.push_back(Ref<Reader>(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<Result> MultiFormatReader::decode(Ref<BinaryBitmap> image){
-		int size = readers.size();
-		for (int i = 0; i < size; i++) {
-			Ref<Reader> 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 4cbe61b..f88ebc9 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<Ref<Reader> >readers;
+		std::vector<Reader*>readers;
 	public:
 		MultiFormatReader();
 		
 		Ref<Result> decode(Ref<BinaryBitmap> image);
   
+		~MultiFormatReader();
 	};
 }
diff --git a/cpp/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.cpp b/cpp/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.cpp
index 25d6db6..d2bc014 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<Ref<CornerPoint> > 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<Ref<CornerPoint> > corners(4);
-  	corners[0].reset(pointA);
-  	corners[1].reset(pointB);
+	  std::vector<Ref<CornerPoint> > 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<Ref<CornerPoint> > MonochromeRectangleDetector::detect() {
 
 Ref<CornerPoint> MonochromeRectangleDetector::findCornerFromCenter(int centerX, int deltaX, int left, int right,
       int centerY, int deltaY, int top, int bottom, int maxWhiteRun) {    
-	  int* lastRange = NULL;
+	Ref<TwoInts> lastRange(NULL);
     for (int y = centerY, x = centerX;
          y < bottom && y >= top && x < right && x >= left;
          y += deltaY, x += deltaX) {
-      int* range;
+    Ref<TwoInts> range(NULL);
       if (deltaX == 0) {
         // horizontal slices, up and down
         range = blackWhiteRange(y, maxWhiteRun, left, right, true);
@@ -82,48 +83,40 @@ Ref<CornerPoint> 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<CornerPoint> result(new CornerPoint(deltaY > 0 ? lastRange[0] : lastRange[1], lastY));
-							delete [] lastRange;
+			        Ref<CornerPoint> result(new CornerPoint(deltaY > 0 ? lastRange->start : lastRange->end, lastY));
 			        return result;
             }
-			      Ref<CornerPoint> result(new CornerPoint(lastRange[0], lastY));
-						delete [] lastRange;
+			      Ref<CornerPoint> result(new CornerPoint(lastRange->start, lastY));
 			      return result;
           } else {
-			      Ref<CornerPoint> result(new CornerPoint(lastRange[1], lastY));
-						delete [] lastRange;
+			      Ref<CornerPoint> result(new CornerPoint(lastRange->end, lastY));
 			      return result;
             }
         } else {
           int lastX = x - deltaX;
-          if (lastRange[0] < centerY) {
-            if (lastRange[1] > centerY) {
-			        Ref<CornerPoint> result(new CornerPoint(lastX, deltaX < 0 ? lastRange[0] : lastRange[1]));
-							delete [] lastRange;
+          if (lastRange->start < centerY) {
+            if (lastRange->end > centerY) {
+			        Ref<CornerPoint> result(new CornerPoint(lastX, deltaX < 0 ? lastRange->start : lastRange->end));
 			        return result;
             }
-			      Ref<CornerPoint> result(new CornerPoint(lastX, lastRange[0]));
-						delete [] lastRange;
+			      Ref<CornerPoint> result(new CornerPoint(lastX, lastRange->start));
 			      return result;
           } else {
-			      Ref<CornerPoint> result(new CornerPoint(lastX, lastRange[1]));
-						delete [] lastRange;
+			      Ref<CornerPoint> 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<TwoInts> 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<TwoInts> 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 a2729fe..45799a5 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<CornerPoint> 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<TwoInts> blackWhiteRange(int fixedDimension, int maxWhiteRun, int minDim, int maxDim,
       bool horizontal);
 
   int max(int a, float b) { return (float) a > b ? a : (int) b;};

-- 
Multi-format 1D/2D barcode image processing library



More information about the Pkg-google-commits mailing list