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

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


The following commit has been merged in the upstream branch:
commit d39dc833bf39314664b24470f2f572e8534b9379
Author: srowen <srowen at 59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Date:   Tue May 4 09:25:18 2010 +0000

    Issue 396
    
    git-svn-id: http://zxing.googlecode.com/svn/trunk@1333 59b500cc-1b3d-0410-9834-0bbf25fbcc57

diff --git a/cpp/core/src/zxing/MultiFormatReader.cpp b/cpp/core/src/zxing/MultiFormatReader.cpp
index 72b950c..e65d0a9 100644
--- a/cpp/core/src/zxing/MultiFormatReader.cpp
+++ b/cpp/core/src/zxing/MultiFormatReader.cpp
@@ -49,6 +49,10 @@ namespace zxing {
 		throw ReaderException("No code detected");
 	}
 	MultiFormatReader::~MultiFormatReader(){
+		int size = readers->size();
+		for (int i = 0; i < size; i++) {
+			delete (*readers)[i];
+		}
 		delete readers;
 	}
 }
\ No newline at end of file
diff --git a/cpp/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.cpp b/cpp/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.cpp
index 1a39c3e..25d6db6 100644
--- a/cpp/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.cpp
+++ b/cpp/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.cpp
@@ -86,12 +86,15 @@ Ref<CornerPoint> MonochromeRectangleDetector::findCornerFromCenter(int centerX,
             if (lastRange[1] > centerX) {
               // straddle, choose one or the other based on direction
 			        Ref<CornerPoint> result(new CornerPoint(deltaY > 0 ? lastRange[0] : lastRange[1], lastY));
+							delete [] lastRange;
 			        return result;
             }
 			      Ref<CornerPoint> result(new CornerPoint(lastRange[0], lastY));
+						delete [] lastRange;
 			      return result;
           } else {
 			      Ref<CornerPoint> result(new CornerPoint(lastRange[1], lastY));
+						delete [] lastRange;
 			      return result;
             }
         } else {
@@ -99,19 +102,24 @@ Ref<CornerPoint> MonochromeRectangleDetector::findCornerFromCenter(int centerX,
           if (lastRange[0] < centerY) {
             if (lastRange[1] > centerY) {
 			        Ref<CornerPoint> result(new CornerPoint(lastX, deltaX < 0 ? lastRange[0] : lastRange[1]));
+							delete [] lastRange;
 			        return result;
             }
 			      Ref<CornerPoint> result(new CornerPoint(lastX, lastRange[0]));
+						delete [] lastRange;
 			      return result;
           } else {
 			      Ref<CornerPoint> result(new CornerPoint(lastX, lastRange[1]));
+						delete [] lastRange;
 			      return result;
             }
           }
         }
       }
+		delete [] lastRange;
       lastRange = range;
     }
+	delete [] lastRange;
     throw ReaderException("Couldn't find corners");
   }
 
diff --git a/cpp/core/src/zxing/oned/Code128Reader.cpp b/cpp/core/src/zxing/oned/Code128Reader.cpp
index 943a574..6f638d5 100644
--- a/cpp/core/src/zxing/oned/Code128Reader.cpp
+++ b/cpp/core/src/zxing/oned/Code128Reader.cpp
@@ -28,9 +28,9 @@
 namespace zxing {
 	namespace oned {
 		
-		const int CODE_PATTERNS_LENGHT = 107;
-		const int countersLenght = 6;
-		static const int CODE_PATTERNS[CODE_PATTERNS_LENGHT][countersLenght] = {
+		const int CODE_PATTERNS_LENGTH = 107;
+		const int countersLength = 6;
+		static const int CODE_PATTERNS[CODE_PATTERNS_LENGTH][countersLength] = {
 			{2, 1, 2, 2, 2, 2}, /* 0 */
 			{2, 2, 2, 1, 2, 2},
 			{2, 2, 2, 2, 2, 1},
@@ -155,7 +155,7 @@ namespace zxing {
 			}
 			
 			int counterPosition = 0;
-			int counters[countersLenght] = {0,0,0,0,0,0};
+			int counters[countersLength] = {0,0,0,0,0,0};
 			int patternStart = rowOffset;
 			bool isWhite = false;
 			int patternLength =  sizeof(counters) / sizeof(int);
@@ -206,13 +206,13 @@ namespace zxing {
 			recordPattern(row, rowOffset, counters, countersCount);
 			int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
 			int bestMatch = -1;
-			for (int d = 0; d < CODE_PATTERNS_LENGHT; d++) {
-				int pattern[countersLenght];
+			for (int d = 0; d < CODE_PATTERNS_LENGTH; d++) {
+				int pattern[countersLength];
 				
-				for(int ind = 0; ind< countersLenght; ind++){
+				for(int ind = 0; ind< countersLength; ind++){
 					pattern[ind] = CODE_PATTERNS[d][ind];
 				}
-//				memcpy(pattern, CODE_PATTERNS[d], countersLenght);
+//				memcpy(pattern, CODE_PATTERNS[d], countersLength);
 				int variance = patternMatchVariance(counters, countersCount, pattern, MAX_INDIVIDUAL_VARIANCE);
 				if (variance < bestVariance) {
 					bestVariance = variance;
@@ -243,6 +243,7 @@ namespace zxing {
 					codeSet = CODE_CODE_C;
 					break;
 				default:
+					delete [] startPatternInfo;
 					throw ReaderException("");
 			}
 			
@@ -254,7 +255,7 @@ namespace zxing {
 			
 			int lastStart = startPatternInfo[0];
 			int nextStart = startPatternInfo[1];
-			int counters[countersLenght] = {0,0,0,0,0,0};
+			int counters[countersLength] = {0,0,0,0,0,0};
 			
 			int lastCode = 0;
 			int code = 0;
@@ -271,7 +272,12 @@ namespace zxing {
 				lastCode = code;
 				
 				// Decode another code from image
+				try {
 				code = decodeCode(row, counters, sizeof(counters)/sizeof(int), nextStart);
+				} catch (ReaderException re) {
+					delete [] startPatternInfo;
+					throw re;
+				}
 				
 				// Remember whether the last code was printable or not (excluding CODE_STOP)
 				if (code != CODE_STOP) {
@@ -286,8 +292,8 @@ namespace zxing {
 				
 				// Advance to where the next code will to start
 				lastStart = nextStart;
-				int _countersLenght = sizeof(counters) / sizeof(int);
-				for (int i = 0; i < _countersLenght; i++) {
+				int _countersLength = sizeof(counters) / sizeof(int);
+				for (int i = 0; i < _countersLength; i++) {
 					nextStart += counters[i];
 				}
 				
@@ -296,6 +302,7 @@ namespace zxing {
 					case CODE_START_A:
 					case CODE_START_B:
 					case CODE_START_C:
+						delete [] startPatternInfo;
 						throw ReaderException("");
 				}
 				
@@ -418,6 +425,7 @@ namespace zxing {
 				nextStart++;
 			}
 			if (!row->isRange(nextStart, fminl(width, nextStart + (nextStart - lastStart) / 2), false)) {
+				delete [] startPatternInfo;
 				throw ReaderException("");
 			}
 			
@@ -425,6 +433,7 @@ namespace zxing {
 			checksumTotal -= multiplier * lastCode;
 			// lastCode is the checksum then:
 			if (checksumTotal % 103 != lastCode) {
+				delete [] startPatternInfo;
 				throw ReaderException("");
 			}
 			
@@ -444,6 +453,7 @@ namespace zxing {
 //			String resultString(tmpResultString);
 			
 			if (tmpResultString.length() == 0) {
+				delete [] startPatternInfo;
 				// Almost surely a false positive
 				throw ReaderException("");
 			}
diff --git a/cpp/core/src/zxing/oned/Code39Reader.cpp b/cpp/core/src/zxing/oned/Code39Reader.cpp
index cb03dd9..fbf2580 100644
--- a/cpp/core/src/zxing/oned/Code39Reader.cpp
+++ b/cpp/core/src/zxing/oned/Code39Reader.cpp
@@ -94,9 +94,15 @@ namespace zxing {
 			char decodedChar;
 			int lastStart;
 			do {
+				try {
 				recordPattern(row, nextStart, counters, countersLen);
+				} catch (ReaderException re) {
+					delete [] start;
+					throw re;
+				}
 				int pattern = toNarrowWidePattern(counters, countersLen);
 				if (pattern < 0) {
+					delete [] start;
 					throw ReaderException("pattern < 0");
 				}
 				decodedChar = patternToChar(pattern);
@@ -117,10 +123,14 @@ namespace zxing {
 			for (int i = 0; i < countersLen; i++) {
 				lastPatternSize += counters[i];
 			}
+			// IS begin
+			delete [] counters;
+			// IS end
 			int whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize;
 			// If 50% of last pattern size, following last pattern, is not whitespace, fail
 			// (but if it's whitespace to the very end of the image, that's OK)
 			if (nextStart != end && whiteSpaceAfterEnd / 2 < lastPatternSize) {
+				delete [] start;
 				throw ReaderException("too short end white space");
 			}
 			
@@ -146,6 +156,7 @@ namespace zxing {
 			}
 			
 			if (tmpResultString.length() == 0) {
+				delete [] start;
 				// Almost surely a false positive
 				throw ReaderException("");
 			}
@@ -216,6 +227,9 @@ namespace zxing {
 					isWhite = !isWhite;
 				}
 			}
+			// IS begin
+			delete [] counters;
+			// IS end
 			throw ReaderException("");
 		}
 		
diff --git a/cpp/core/src/zxing/oned/ITFReader.cpp b/cpp/core/src/zxing/oned/ITFReader.cpp
index e38ab21..c00ba56 100644
--- a/cpp/core/src/zxing/oned/ITFReader.cpp
+++ b/cpp/core/src/zxing/oned/ITFReader.cpp
@@ -70,10 +70,22 @@ namespace zxing {
 		Ref<Result> ITFReader::decodeRow(int rowNumber, Ref<BitArray> row){
 			// Find out where the Middle section (payload) starts & ends
 			int* startRange = decodeStart(row);
-			int* endRange = decodeEnd(row);
+			int* endRange;
+			try {
+				endRange = decodeEnd(row);
+			} catch (Exception e) {
+				delete [] startRange;
+				throw e;
+			}
 			
 			std::string tmpResult;
+			try {
 			decodeMiddle(row, startRange[1], endRange[0], tmpResult);
+			} catch (zxing::ReaderException re) {
+				delete [] startRange;
+				delete [] endRange;
+				throw re;
+			}
 			
 			// To avoid false positives with 2D barcodes (and other patterns), make
 			// an assumption that the decoded string must be 6, 10 or 14 digits.
@@ -83,7 +95,9 @@ namespace zxing {
 					lengthOK = true;
 				}
 			if (!lengthOK) {
-				throw ReaderException("not enought characters count");
+				delete [] startRange;
+				delete [] endRange;
+				throw ReaderException("not enough characters count");
 			}
 			
 			Ref<String> resultString(new String(tmpResult));
@@ -116,13 +130,13 @@ namespace zxing {
 			// Therefore, need to scan 10 lines and then
 			// split these into two arrays
 			int counterDigitPairLen = 10;
-			int* counterDigitPair = new int[counterDigitPairLen];
+			int counterDigitPair[counterDigitPairLen];
 			for (int i=0; i<counterDigitPairLen; i++) {
 				counterDigitPair[i] = 0;
 			}
 			
-			int* counterBlack = new int[5];
-			int* counterWhite = new int[5];
+			int counterBlack[5];
+			int counterWhite[5];
 			for (int i=0; i<5; i++) {
 				counterBlack[i] = 0;
 				counterWhite[i] = 0;
@@ -147,9 +161,6 @@ namespace zxing {
 					payloadStart += counterDigitPair[i];
 				}
 			}
-			delete [] counterDigitPair;
-			delete [] counterBlack;
-			delete [] counterWhite;
 		}
 		
 		/**
@@ -278,7 +289,7 @@ namespace zxing {
 			// TODO: This is very similar to implementation in UPCEANReader. Consider if they can be
 			// merged to a single method.
 			int patternLength = patternLen;
-			int* counters = new int[patternLength];
+			int counters[patternLength];
 			for (int i=0; i<patternLength; i++) {
 				counters[i] = 0;
 			}
diff --git a/cpp/core/src/zxing/oned/MultiFormatOneDReader.cpp b/cpp/core/src/zxing/oned/MultiFormatOneDReader.cpp
index 1338a56..cfb4b10 100644
--- a/cpp/core/src/zxing/oned/MultiFormatOneDReader.cpp
+++ b/cpp/core/src/zxing/oned/MultiFormatOneDReader.cpp
@@ -49,6 +49,10 @@ namespace zxing {
 			throw ReaderException("No code detected");
 		}
 		MultiFormatOneDReader::~MultiFormatOneDReader(){
+			int size = readers->size();
+			for (int i = 0; i < size; i++) {
+				delete (*readers)[i];
+			}
 			delete readers;
 		}
 	}
diff --git a/cpp/core/src/zxing/oned/MultiFormatUPCEANReader.cpp b/cpp/core/src/zxing/oned/MultiFormatUPCEANReader.cpp
index 61011f0..4331911 100644
--- a/cpp/core/src/zxing/oned/MultiFormatUPCEANReader.cpp
+++ b/cpp/core/src/zxing/oned/MultiFormatUPCEANReader.cpp
@@ -73,6 +73,10 @@ namespace zxing {
 		}
 		
 		MultiFormatUPCEANReader::~MultiFormatUPCEANReader(){
+			int size = readers->size();
+			for (int i = 0; i < size; i++) {
+				delete (*readers)[i];
+			}
 			delete readers;
 		}
 	}
diff --git a/cpp/core/src/zxing/oned/UPCEANReader.cpp b/cpp/core/src/zxing/oned/UPCEANReader.cpp
index 5345cad..b5923bf 100644
--- a/cpp/core/src/zxing/oned/UPCEANReader.cpp
+++ b/cpp/core/src/zxing/oned/UPCEANReader.cpp
@@ -100,7 +100,16 @@ namespace zxing {
 			
 			std::string tmpResultString;
 			std::string& tmpResultStringRef = tmpResultString;
-			int endStart = decodeMiddle(row, startGuardRange, 2 /*reference findGuardPattern*/ , tmpResultStringRef);
+			int endStart;
+			try {
+				endStart = decodeMiddle(row, startGuardRange, 2 /*reference findGuardPattern*/ , tmpResultStringRef);
+			} catch (ReaderException re) {
+				if (startGuardRange!=NULL) {
+					delete [] startGuardRange;
+					startGuardRange = NULL;
+				}
+				throw re;
+			}
 			
 			int* endRange = decodeEnd(row, endStart);
 						
@@ -114,6 +123,14 @@ namespace zxing {
 //			}
 			
 			if (!checkChecksum(tmpResultString)) {
+				if (startGuardRange!=NULL) {
+					delete [] startGuardRange;
+					startGuardRange = NULL;
+				}
+				if (endRange!=NULL) {
+					delete [] endRange;
+					endRange = NULL;
+				}
 				throw ReaderException("Checksum fail.");
 			}
 			
@@ -159,6 +176,9 @@ namespace zxing {
 				if (quietStart >= 0) {
 					foundStart = row->isRange(quietStart, start, false);
 				}
+				if (!foundStart) {
+					delete [] startRange;
+				}
 			}
 			return startRange;
 		}
@@ -217,13 +237,13 @@ namespace zxing {
 		}
 		
 //		int UPCEANReader::decodeDigit(Ref<BitArray> row, int counters[], int countersLen, int rowOffset, int** patterns/*[][]*/, int paterns1Len, int paterns2Len)		
-		int UPCEANReader::decodeDigit(Ref<BitArray> row, int counters[], int countersLen, int rowOffset, UPC_EAN_PATTERNS paternType){
+		int UPCEANReader::decodeDigit(Ref<BitArray> row, int counters[], int countersLen, int rowOffset, UPC_EAN_PATTERNS patternType){
 			recordPattern(row, rowOffset, counters, countersLen);
 			int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
 			int bestMatch = -1;
 			
 			int max = 0;
-			switch (paternType) {
+			switch (patternType) {
 				case UPC_EAN_PATTERNS_L_PATTERNS:
 					max = L_PATTERNS_LEN;
 					for (int i = 0; i < max; i++) {
diff --git a/cpp/core/src/zxing/oned/UPCEANReader.h b/cpp/core/src/zxing/oned/UPCEANReader.h
index 8f825c2..a6c155d 100644
--- a/cpp/core/src/zxing/oned/UPCEANReader.h
+++ b/cpp/core/src/zxing/oned/UPCEANReader.h
@@ -54,7 +54,7 @@ namespace zxing {
 			Ref<Result> decodeRow(int rowNumber, Ref<BitArray> row);
 			Ref<Result> decodeRow(int rowNumber, Ref<BitArray> row, int startGuardRange[]);
 			
-			static int decodeDigit(Ref<BitArray> row, int counters[], int countersLen, int rowOffset, UPC_EAN_PATTERNS paternType);	//throws ReaderException 
+			static int decodeDigit(Ref<BitArray> row, int counters[], int countersLen, int rowOffset, UPC_EAN_PATTERNS patternType);	//throws ReaderException 
 			
 			bool checkChecksum(std::string s);																						//throws ReaderException
 			

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



More information about the Pkg-google-commits mailing list