decodeRow method

U1DResult? decodeRow(
  1. UBitArray row
)

Implementation

U1DResult? decodeRow(UBitArray row) {
  final Int32List counters = Int32List(9);
  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 = _toNarrowWidePattern(counters);
    if (pattern < 0) return null;
    final int index = UCode39Patterns.characterEncodings.indexOf(pattern);
    if (index < 0) return null;
    decodedChar = UCode39Patterns.alphabet[index];
    result.write(decodedChar);
    lastStart = nextStart;
    for (final int counter in counters) {
      nextStart += counter;
    }
    nextStart = row.getNextSet(nextStart);
  } while (decodedChar != "*" && nextStart < end);

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

  int lastPatternSize = 0;
  for (final int counter in counters) {
    lastPatternSize += counter;
  }
  final int whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize;
  if (nextStart != end && (whiteSpaceAfterEnd * 2) < lastPatternSize) return null;

  if (usingCheckDigit) {
    if (text.isEmpty) return null;
    int total = 0;
    for (int i = 0; i < text.length - 1; i++) {
      total += UCode39Patterns.alphabet.indexOf(text[i]);
    }
    if (text[text.length - 1] != UCode39Patterns.alphabet[total % 43]) return null;
    text = text.substring(0, text.length - 1);
  }
  if (text.isEmpty) return null;
  if (extendedMode) {
    final String? decoded = _decodeExtended(text);
    if (decoded == null) return null;
    text = decoded;
  }
  return U1DResult(UCodeFormat.code39, text, (start[1] + start[0]) / 2, lastStart + lastPatternSize / 2);
}