decodeRow method

U1DResult? decodeRow(
  1. UBitArray row
)

Implementation

U1DResult? decodeRow(UBitArray row) {
  final Int32List counters = Int32List(6);
  final List<int>? start = _findAsteriskPattern(row, counters);
  if (start == null) return null;

  int nextStart = row.getNextSet(start[1]);
  final int end = row.size;
  final StringBuffer result = StringBuffer();
  int lastStart;
  String decodedChar;

  do {
    try {
      U1DReader.recordPattern(row, nextStart, counters);
    } catch (_) {
      return null;
    }
    final int pattern = _toPattern(counters);
    if (pattern < 0) return null;
    final int index = UCode93Patterns.characterEncodings.indexOf(pattern);
    if (index < 0) return null;
    decodedChar = UCode93Patterns.alphabet[index];
    result.write(decodedChar);
    lastStart = nextStart;
    for (final int counter in counters) {
      nextStart += counter;
    }
    nextStart = row.getNextSet(nextStart);
  } while (decodedChar != "*" && nextStart < end);

  String raw = result.toString();
  if (!raw.endsWith("*")) return null;
  raw = raw.substring(0, raw.length - 1);
  if (raw.length < 2) return null;

  if (!_checkChecksum(raw, 20, 15)) return null;
  raw = raw.substring(0, raw.length - 2);
  final String? text = _decodeExtended(raw);
  if (text == null || text.isEmpty) return null;

  int lastPatternSize = 0;
  for (final int counter in counters) {
    lastPatternSize += counter;
  }
  return U1DResult(UCodeFormat.code93, text, (start[1] + start[0]) / 2, lastStart + lastPatternSize / 2);
}