decodeRow method

U1DResult? decodeRow(
  1. UBitArray row
)

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());
}