}
}
+ private StringBuffer decodeRowStringBuffer;
+
+ public AbstractUPCEANReader() {
+ decodeRowStringBuffer = new StringBuffer(20);
+ }
+
static int[] findStartGuardPattern(BitArray row) throws ReaderException {
boolean foundStart = false;
int[] startRange = null;
}
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);
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
0x00, 0x0B, 0x0D, 0xE, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A
};
- protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer resultString) throws ReaderException {
+ private int[] decodeMiddleCounters;
+
+ public EAN13Reader() {
+ decodeMiddleCounters = new int[4];
+ }
- int[] counters = 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];
*/
public final class EAN8Reader extends AbstractUPCEANReader {
- protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer result) throws ReaderException {
+ private int[] decodeMiddleCounters;
+
+ public EAN8Reader() {
+ decodeMiddleCounters = new int[4];
+ }
- int[] counters = 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];
{0x07, 0x0B, 0x0D, 0x0E, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A}
};
- protected int decodeMiddle(BitArray row, int[] startRange, StringBuffer result) throws ReaderException {
+ private int[] decodeMiddleCounters;
+
+ public UPCEReader() {
+ decodeMiddleCounters = new int[4];
+ }
- int[] counters = 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];
private final int width;\r
private final int height;\r
private final float moduleSize;\r
+ private final int[] crossCheckStateCount;\r
\r
/**\r
* <p>Creates a finder that will look in a portion of the whole image.</p>\r
this.width = width;\r
this.height = height;\r
this.moduleSize = moduleSize;\r
+ this.crossCheckStateCount = new int[3];\r
}\r
\r
/**\r
MonochromeBitmapSource image = this.image;\r
\r
int maxI = image.getHeight();\r
- int[] stateCount = new int[3];\r
+ int[] stateCount = crossCheckStateCount;\r
+ stateCount[0] = 0;\r
+ stateCount[1] = 0;\r
+ stateCount[2] = 0;\r
\r
// Start counting up from center\r
int i = startI;\r
private final MonochromeBitmapSource image;\r
private final Vector possibleCenters;\r
private boolean hasSkipped;\r
+ private final int[] crossCheckStateCount;\r
\r
/**\r
* <p>Creates a finder that will search the image for three finder patterns.</p>\r
FinderPatternFinder(MonochromeBitmapSource image) {\r
this.image = image;\r
this.possibleCenters = new Vector();\r
+ this.crossCheckStateCount = new int[5];\r
}\r
\r
FinderPatternInfo find(Hashtable hints) throws ReaderException {\r
\r
boolean done = false;\r
int[] stateCount = new int[5];\r
+ BitArray blackRow = new BitArray(maxJ);\r
for (int i = iSkip - 1; i < maxI && !done; i += iSkip) {\r
// Get a row of black/white values\r
- BitArray blackRow = image.getBlackRow(i, null, 0, maxJ);\r
+ blackRow = image.getBlackRow(i, blackRow, 0, maxJ);\r
stateCount[0] = 0;\r
stateCount[1] = 0;\r
stateCount[2] = 0;\r
Math.abs(moduleSize - (stateCount[4] << INTEGER_MATH_SHIFT)) < maxVariance;\r
}\r
\r
+ private int[] getCrossCheckStateCount() {\r
+ crossCheckStateCount[0] = 0;\r
+ crossCheckStateCount[1] = 0;\r
+ crossCheckStateCount[2] = 0;\r
+ crossCheckStateCount[3] = 0;\r
+ crossCheckStateCount[4] = 0;\r
+ return crossCheckStateCount;\r
+ }\r
+\r
/**\r
* <p>After a horizontal scan finds a potential finder pattern, this method\r
* "cross-checks" by scanning down vertically through the center of the possible\r
MonochromeBitmapSource image = this.image;\r
\r
int maxI = image.getHeight();\r
- int[] stateCount = new int[5];\r
+ int[] stateCount = getCrossCheckStateCount();\r
\r
// Start counting up from center\r
int i = startI;\r
MonochromeBitmapSource image = this.image;\r
\r
int maxJ = image.getWidth();\r
- int[] stateCount = new int[5];\r
+ int[] stateCount = getCrossCheckStateCount();\r
\r
int j = startJ;\r
while (j >= 0 && image.isBlack(j, centerI)) {\r