decodeRow method

U1DResult? decodeRow(
  1. UBitArray row
)

Implementation

U1DResult? decodeRow(UBitArray row) {
  final List<int>? startRange = _decodeStart(row);
  if (startRange == null) return null;
  final List<int>? endRange = _decodeEnd(row);
  if (endRange == null) return null;

  final StringBuffer result = StringBuffer();
  int payloadStart = startRange[1];
  final int payloadEnd = endRange[0];
  final Int32List counterDigitPair = Int32List(10);
  final Int32List counterBlack = Int32List(5);
  final Int32List counterWhite = Int32List(5);

  while (payloadStart < payloadEnd) {
    try {
      U1DReader.recordPattern(row, payloadStart, counterDigitPair);
    } catch (_) {
      return null;
    }
    for (int k = 0; k < 5; k++) {
      counterBlack[k] = counterDigitPair[k * 2];
      counterWhite[k] = counterDigitPair[k * 2 + 1];
    }
    final int blackDigit = _decodeDigit(counterBlack);
    final int whiteDigit = _decodeDigit(counterWhite);
    if (blackDigit < 0 || whiteDigit < 0) return null;
    result
      ..writeCharCode(48 + blackDigit)
      ..writeCharCode(48 + whiteDigit);
    for (final int counter in counterDigitPair) {
      payloadStart += counter;
    }
  }

  final String text = result.toString();
  if (text.length < 6 || text.length.isOdd) return null;
  return U1DResult(UCodeFormat.itf, text, startRange[1].toDouble(), endRange[0].toDouble());
}