decodeRow method
Implementation
U1DResult? decodeRow(UBitArray row) {
final List<int>? startRange = UUpcEanReader._findStartGuardPattern(row);
if (startRange == null) return null;
final StringBuffer result = StringBuffer();
final Int32List counters = Int32List(4);
int rowOffset = startRange[1];
try {
for (int x = 0; x < 4; x++) {
final int bestMatch = UUpcEanReader._decodeDigit(row, counters, rowOffset, UUpcEanPatterns.lPatterns);
result.writeCharCode(48 + bestMatch);
for (final int counter in counters) {
rowOffset += counter;
}
}
final List<int>? middleRange = UUpcEanReader._findGuardPattern(row, rowOffset, true, UUpcEanPatterns.middlePattern);
if (middleRange == null) return null;
rowOffset = middleRange[1];
for (int x = 0; x < 4; x++) {
final int bestMatch = UUpcEanReader._decodeDigit(row, counters, rowOffset, UUpcEanPatterns.lPatterns);
result.writeCharCode(48 + bestMatch);
for (final int counter in counters) {
rowOffset += counter;
}
}
} catch (_) {
return null;
}
final List<int>? endRange = UUpcEanReader._findGuardPattern(row, rowOffset, false, UUpcEanPatterns.startEndPattern);
if (endRange == null) return null;
final int quietEnd = endRange[1] + (endRange[1] - endRange[0]);
if (quietEnd >= row.size || !row.isRange(endRange[1], quietEnd, false)) return null;
final String text = result.toString();
if (text.length != 8 || !UUpcEanPatterns.checksum(text)) return null;
return U1DResult(UCodeFormat.ean8, text, startRange[0].toDouble(), endRange[1].toDouble());
}