decodeRow method

U1DResult? decodeRow(
  1. UBitArray row,
  2. Set<UCodeFormat> formats
)

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