decodeRow method
Attempts to decode a one-dimensional barcode format given a single row of an image.
@param rowNumber row number from top of the row @param row the black/white pixel data of the row @param hints decode hints @return Result containing encoded string and start/end of barcode @throws NotFoundException if no potential barcode is found @throws ChecksumException if a potential barcode is found but does not pass its checksum @throws FormatException if a potential barcode is found but format is invalid
Implementation
@override
Result decodeRow(
int rowNumber,
BitArray row,
DecodeHint? hints,
) {
final start = _findAsteriskPattern(row);
// Read off white space
int nextStart = row.getNextSet(start[1]);
final end = row.size;
final theCounters = _counters;
theCounters.fillRange(0, theCounters.length, 0);
final result = _decodeRowResult;
result.clear();
String decodedChar;
int lastStart;
do {
OneDReader.recordPattern(row, nextStart, theCounters);
final pattern = _toPattern(theCounters);
if (pattern < 0) {
throw NotFoundException.instance;
}
decodedChar = _patternToChar(pattern);
result.write(decodedChar);
lastStart = nextStart;
for (int counter in theCounters) {
nextStart += counter;
}
// Read off white space
nextStart = row.getNextSet(nextStart);
} while (decodedChar != '*');
result.deleteCharAt(result.length - 1); // remove asterisk
int lastPatternSize = 0;
for (int counter in theCounters) {
lastPatternSize += counter;
}
// Should be at least one more black module
if (nextStart == end || !row.get(nextStart)) {
throw NotFoundException.instance;
}
if (result.length < 2) {
// false positive -- need at least 2 checksum digits
throw NotFoundException.instance;
}
_checkChecksums(result.toString());
// Remove checksum digits
result.setLength(result.length - 2);
final resultString = _decodeExtended(result.toString());
final left = (start[1] + start[0]) / 2.0;
final right = lastStart + lastPatternSize / 2.0;
final resultObject = Result(
resultString,
null,
[
ResultPoint(left, rowNumber.toDouble()),
ResultPoint(right, rowNumber.toDouble())
],
BarcodeFormat.code93,
);
resultObject.putMetadata(ResultMetadataType.symbologyIdentifier, ']G0');
return resultObject;
}