decodeRow method
Implementation
U1DResult? decodeRow(UBitArray row) {
final List<int> counters = <int>[];
final int i = row.getNextUnset(0);
final int end = row.size;
int count = 0;
bool isWhite = true;
for (int j = i; j < end; j++) {
if (row.get(j) != isWhite) {
count++;
} else {
counters.add(count);
count = 1;
isWhite = !isWhite;
}
}
counters.add(count);
if (counters.length < 8) return null;
final Int32List counterArray = Int32List.fromList(counters);
int startOffset = -1;
for (int k = 1; k < counters.length; k += 2) {
final int charOffset = _toNarrowWidePattern(counterArray, k);
if (charOffset != -1 && _isStartOrEnd(_alphabet[charOffset])) {
startOffset = k;
break;
}
}
if (startOffset < 0) return null;
final StringBuffer result = StringBuffer();
int nextStart = startOffset;
do {
final int charOffset = _toNarrowWidePattern(counterArray, nextStart);
if (charOffset == -1) return null;
result.write(_alphabet[charOffset]);
nextStart += 8;
if (result.length > 1 && _isStartOrEnd(_alphabet[charOffset])) break;
} while (nextStart < counters.length);
String text = result.toString();
if (text.length < 3) return null;
if (!_isStartOrEnd(text[0]) || !_isStartOrEnd(text[text.length - 1])) return null;
text = text.substring(1, text.length - 1);
if (text.isEmpty) return null;
double runningCount = 0;
for (int k = 0; k < startOffset; k++) {
runningCount += counterArray[k];
}
final double left = runningCount;
for (int k = startOffset; k < nextStart - 1; k++) {
runningCount += counterArray[k];
}
return U1DResult(UCodeFormat.codabar, text, left, runningCount);
}