diff --git a/src/i2of5_reader.js b/src/i2of5_reader.js index b428f83..c866af2 100644 --- a/src/i2of5_reader.js +++ b/src/i2of5_reader.js @@ -38,7 +38,26 @@ define( I2of5Reader.prototype = Object.create(BarcodeReader.prototype, properties); I2of5Reader.prototype.constructor = I2of5Reader; - I2of5Reader.prototype._findPattern = function(pattern, offset) { + I2of5Reader.prototype._matchPattern = function(counter, code) { + var i, + counterSum = [0, 0], + codeSum = [0, 0], + correction = [0, 0]; + + for (i = 0; i < counter.length; i++) { + counterSum[i % 2] += counter[i]; + codeSum[i % 2] += code[i] + } + correction[0] = codeSum[0]/counterSum[0]; + correction[1] = codeSum[1]/counterSum[1]; + + for (i = 0; i < counter.length; i++) { + counter[i] *= correction[i % 2]; + } + return BarcodeReader.prototype._matchPattern.call(this, counter, code); + }; + + I2of5Reader.prototype._findPattern = function(pattern, offset, isWhite, tryHarder) { var counter = [], self = this, i, @@ -53,9 +72,11 @@ define( j, sum, normalized, - isWhite = false, epsilon = self.AVG_CODE_ERROR; + isWhite = isWhite || false; + tryHarder = tryHarder || false; + if (!offset) { offset = self._nextSet(self._row); } @@ -84,12 +105,16 @@ define( return bestMatch; } } - for ( j = 0; j < counter.length - 2; j++) { - counter[j] = counter[j + 2]; + if (tryHarder) { + for (j = 0; j < counter.length - 2; j++) { + counter[j] = counter[j + 2]; + } + counter[counter.length - 2] = 0; + counter[counter.length - 1] = 0; + counterPos--; + } else { + return null; } - counter[counter.length - 2] = 0; - counter[counter.length - 1] = 0; - counterPos--; } else { counterPos++; } @@ -107,7 +132,7 @@ define( startInfo; while(!startInfo) { - startInfo = self._findPattern(self.START_PATTERN, offset); + startInfo = self._findPattern(self.START_PATTERN, offset, false, true); if (!startInfo) { return null; } @@ -274,11 +299,6 @@ define( return null; } - // Checksum - if (!self._checksum(result)) { - return null; - } - return { code : result.join(""), start : startInfo.start,