decodeRow method

  1. @override
Result decodeRow(
  1. int rowNumber,
  2. BitArray row,
  3. DecodeHint? hints
)
override

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,
) {
  // Find out where the Middle section (payload) starts & ends
  final startRange = _decodeStart(row);
  final endRange = _decodeEnd(row);

  final result = StringBuffer();
  _decodeMiddle(row, startRange[1], endRange[0], result);
  final resultString = result.toString();

  final allowedLengths = hints?.allowedLengths ?? _defaultAllowedLengths;

  // To avoid false positives with 2D barcodes (and other patterns), make
  // an assumption that the decoded string must be a 'standard' length if it's short
  final length = resultString.length;
  bool lengthOK = false;
  int maxAllowedLength = 0;
  for (int allowedLength in allowedLengths) {
    if (length == allowedLength) {
      lengthOK = true;
      break;
    }
    if (allowedLength > maxAllowedLength) {
      maxAllowedLength = allowedLength;
    }
  }
  if (!lengthOK && length > maxAllowedLength) {
    lengthOK = true;
  }
  if (!lengthOK) {
    throw FormatsException.instance;
  }

  final resultObject = Result(
    resultString,
    null, // no natural byte representation for these barcodes
    [
      ResultPoint(startRange[1].toDouble(), rowNumber.toDouble()),
      ResultPoint(endRange[0].toDouble(), rowNumber.toDouble()),
    ],
    BarcodeFormat.itf,
  );
  resultObject.putMetadata(ResultMetadataType.symbologyIdentifier, ']I0');
  return resultObject;
}