decodeRow method
Implementation
U1DResult? decodeRow(UBitArray row, Set<UCodeFormat> formats) {
final List<int>? startRange = _findStartGuardPattern(row);
if (startRange == null) return null;
final StringBuffer result = StringBuffer();
int rowOffset = startRange[1];
final Int32List counters = Int32List(4);
final Int32List lgPatternFound = Int32List(1);
try {
rowOffset = _decodeMiddle(row, startRange, result, counters, lgPatternFound);
} catch (_) {
return null;
}
final List<int>? endRange = _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;
String text = result.toString();
if (text.length != 13) return null;
if (!UUpcEanPatterns.checksum(text)) return null;
UCodeFormat format = UCodeFormat.ean13;
if (text.startsWith("0")) {
if (formats.contains(UCodeFormat.upcA)) {
format = UCodeFormat.upcA;
text = text.substring(1);
} else if (!formats.contains(UCodeFormat.ean13)) {
return null;
}
} else if (!formats.contains(UCodeFormat.ean13)) {
return null;
}
return U1DResult(format, text, startRange[0].toDouble(), endRange[1].toDouble());
}