decodeRow method
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);
}