mirror of
https://github.com/zxing/zxing.git
synced 2025-02-02 05:41:08 -08:00
Another round of optimization, focused on reusing arrays and small objects.
git-svn-id: https://zxing.googlecode.com/svn/trunk@665 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
parent
14e22bd443
commit
1dc71920e9
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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];
|
||||
|
||||
|
|
|
@ -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];
|
||||
|
||||
|
|
|
@ -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];
|
||||
|
||||
|
|
|
@ -45,6 +45,7 @@ final class AlignmentPatternFinder {
|
|||
private final int width;
|
||||
private final int height;
|
||||
private final float moduleSize;
|
||||
private final int[] crossCheckStateCount;
|
||||
|
||||
/**
|
||||
* <p>Creates a finder that will look in a portion of the whole image.</p>
|
||||
|
@ -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;
|
||||
|
|
|
@ -45,6 +45,7 @@ final class FinderPatternFinder {
|
|||
private final MonochromeBitmapSource image;
|
||||
private final Vector possibleCenters;
|
||||
private boolean hasSkipped;
|
||||
private final int[] crossCheckStateCount;
|
||||
|
||||
/**
|
||||
* <p>Creates a finder that will search the image for three finder patterns.</p>
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>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)) {
|
||||
|
|
Loading…
Reference in a new issue