diff --git a/core/src/com/google/zxing/oned/AbstractUPCEANReader.java b/core/src/com/google/zxing/oned/AbstractUPCEANReader.java index c08f29944..0f31cbec6 100644 --- a/core/src/com/google/zxing/oned/AbstractUPCEANReader.java +++ b/core/src/com/google/zxing/oned/AbstractUPCEANReader.java @@ -84,6 +84,12 @@ public abstract class AbstractUPCEANReader extends AbstractOneDReader implements } } + private StringBuffer decodeRowStringBuffer; + + public AbstractUPCEANReader() { + decodeRowStringBuffer = new StringBuffer(20); + } + static int[] findStartGuardPattern(BitArray row) throws ReaderException { boolean foundStart = false; int[] startRange = null; @@ -108,7 +114,8 @@ public abstract class AbstractUPCEANReader extends AbstractOneDReader implements } public final Result decodeRow(int rowNumber, BitArray row, int[] startGuardRange) throws ReaderException { - StringBuffer result = new StringBuffer(20); + StringBuffer result = decodeRowStringBuffer; + result.setLength(0); int endStart = decodeMiddle(row, startGuardRange, result); int[] endRange = decodeEnd(row, endStart); diff --git a/core/src/com/google/zxing/oned/Code39Reader.java b/core/src/com/google/zxing/oned/Code39Reader.java index 4d69d6b8d..4273c4f93 100644 --- a/core/src/com/google/zxing/oned/Code39Reader.java +++ b/core/src/com/google/zxing/oned/Code39Reader.java @@ -92,9 +92,7 @@ public final class Code39Reader extends AbstractOneDReader { public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws ReaderException { int[] start = findAsteriskPattern(row); - int nextStart = start[1]; - int end = row.getSize(); // Read off white space diff --git a/core/src/com/google/zxing/oned/EAN13Reader.java b/core/src/com/google/zxing/oned/EAN13Reader.java index b9ecd2228..eccdc4625 100644 --- a/core/src/com/google/zxing/oned/EAN13Reader.java +++ b/core/src/com/google/zxing/oned/EAN13Reader.java @@ -62,9 +62,18 @@ public final class EAN13Reader extends AbstractUPCEANReader { 0x00, 0x0B, 0x0D, 0xE, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A }; - protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer resultString) throws ReaderException { + private int[] decodeMiddleCounters; - int[] counters = new int[4]; + public EAN13Reader() { + decodeMiddleCounters = new int[4]; + } + + protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer resultString) throws ReaderException { + int[] counters = decodeMiddleCounters; + counters[0] = 0; + counters[1] = 0; + counters[2] = 0; + counters[3] = 0; int end = row.getSize(); int rowOffset = startRange[1]; diff --git a/core/src/com/google/zxing/oned/EAN8Reader.java b/core/src/com/google/zxing/oned/EAN8Reader.java index d83c751da..333eaec06 100644 --- a/core/src/com/google/zxing/oned/EAN8Reader.java +++ b/core/src/com/google/zxing/oned/EAN8Reader.java @@ -27,9 +27,18 @@ import com.google.zxing.common.BitArray; */ public final class EAN8Reader extends AbstractUPCEANReader { - protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer result) throws ReaderException { + private int[] decodeMiddleCounters; - int[] counters = new int[4]; + public EAN8Reader() { + decodeMiddleCounters = new int[4]; + } + + protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer result) throws ReaderException { + int[] counters = decodeMiddleCounters; + counters[0] = 0; + counters[1] = 0; + counters[2] = 0; + counters[3] = 0; int end = row.getSize(); int rowOffset = startRange[1]; diff --git a/core/src/com/google/zxing/oned/UPCEReader.java b/core/src/com/google/zxing/oned/UPCEReader.java index 165f9ad7a..c67103d08 100644 --- a/core/src/com/google/zxing/oned/UPCEReader.java +++ b/core/src/com/google/zxing/oned/UPCEReader.java @@ -46,9 +46,18 @@ public final class UPCEReader extends AbstractUPCEANReader { {0x07, 0x0B, 0x0D, 0x0E, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A} }; - protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer result) throws ReaderException { + private int[] decodeMiddleCounters; - int[] counters = new int[4]; + public UPCEReader() { + decodeMiddleCounters = new int[4]; + } + + protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer result) throws ReaderException { + int[] counters = decodeMiddleCounters; + counters[0] = 0; + counters[1] = 0; + counters[2] = 0; + counters[3] = 0; int end = row.getSize(); int rowOffset = startRange[1]; diff --git a/core/src/com/google/zxing/qrcode/detector/AlignmentPatternFinder.java b/core/src/com/google/zxing/qrcode/detector/AlignmentPatternFinder.java index 1f7ed3b9e..056fac6a9 100644 --- a/core/src/com/google/zxing/qrcode/detector/AlignmentPatternFinder.java +++ b/core/src/com/google/zxing/qrcode/detector/AlignmentPatternFinder.java @@ -45,6 +45,7 @@ final class AlignmentPatternFinder { private final int width; private final int height; private final float moduleSize; + private final int[] crossCheckStateCount; /** *

Creates a finder that will look in a portion of the whole image.

@@ -69,6 +70,7 @@ final class AlignmentPatternFinder { this.width = width; this.height = height; this.moduleSize = moduleSize; + this.crossCheckStateCount = new int[3]; } /** @@ -188,7 +190,10 @@ final class AlignmentPatternFinder { MonochromeBitmapSource image = this.image; int maxI = image.getHeight(); - int[] stateCount = new int[3]; + int[] stateCount = crossCheckStateCount; + stateCount[0] = 0; + stateCount[1] = 0; + stateCount[2] = 0; // Start counting up from center int i = startI; diff --git a/core/src/com/google/zxing/qrcode/detector/FinderPatternFinder.java b/core/src/com/google/zxing/qrcode/detector/FinderPatternFinder.java index b9aecb069..2714eefcd 100755 --- a/core/src/com/google/zxing/qrcode/detector/FinderPatternFinder.java +++ b/core/src/com/google/zxing/qrcode/detector/FinderPatternFinder.java @@ -45,6 +45,7 @@ final class FinderPatternFinder { private final MonochromeBitmapSource image; private final Vector possibleCenters; private boolean hasSkipped; + private final int[] crossCheckStateCount; /** *

Creates a finder that will search the image for three finder patterns.

@@ -54,6 +55,7 @@ final class FinderPatternFinder { FinderPatternFinder(MonochromeBitmapSource image) { this.image = image; this.possibleCenters = new Vector(); + this.crossCheckStateCount = new int[5]; } FinderPatternInfo find(Hashtable hints) throws ReaderException { @@ -74,9 +76,10 @@ final class FinderPatternFinder { boolean done = false; int[] stateCount = new int[5]; + BitArray blackRow = new BitArray(maxJ); for (int i = iSkip - 1; i < maxI && !done; i += iSkip) { // Get a row of black/white values - BitArray blackRow = image.getBlackRow(i, null, 0, maxJ); + blackRow = image.getBlackRow(i, blackRow, 0, maxJ); stateCount[0] = 0; stateCount[1] = 0; stateCount[2] = 0; @@ -199,6 +202,15 @@ final class FinderPatternFinder { Math.abs(moduleSize - (stateCount[4] << INTEGER_MATH_SHIFT)) < maxVariance; } + private int[] getCrossCheckStateCount() { + crossCheckStateCount[0] = 0; + crossCheckStateCount[1] = 0; + crossCheckStateCount[2] = 0; + crossCheckStateCount[3] = 0; + crossCheckStateCount[4] = 0; + return crossCheckStateCount; + } + /** *

After a horizontal scan finds a potential finder pattern, this method * "cross-checks" by scanning down vertically through the center of the possible @@ -214,7 +226,7 @@ final class FinderPatternFinder { MonochromeBitmapSource image = this.image; int maxI = image.getHeight(); - int[] stateCount = new int[5]; + int[] stateCount = getCrossCheckStateCount(); // Start counting up from center int i = startI; @@ -284,7 +296,7 @@ final class FinderPatternFinder { MonochromeBitmapSource image = this.image; int maxJ = image.getWidth(); - int[] stateCount = new int[5]; + int[] stateCount = getCrossCheckStateCount(); int j = startJ; while (j >= 0 && image.isBlack(j, centerI)) {