decodeRow method

U1DResult? decodeRow(
  1. UBitArray row
)

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