readCodewords method

Uint8List readCodewords()

Implementation

Uint8List readCodewords() {
  final Uint8List result = Uint8List(_version.totalCodewords);
  int resultOffset = 0;
  int row = 4;
  int column = 0;
  final int numRows = _mappingBitMatrix.height;
  final int numColumns = _mappingBitMatrix.width;
  bool corner1Read = false;
  bool corner2Read = false;
  bool corner3Read = false;
  bool corner4Read = false;

  do {
    if (row == numRows && column == 0 && !corner1Read) {
      result[resultOffset++] = _readCorner1(numRows, numColumns);
      row -= 2;
      column += 2;
      corner1Read = true;
    } else if (row == numRows - 2 && column == 0 && (numColumns & 0x03) != 0 && !corner2Read) {
      result[resultOffset++] = _readCorner2(numRows, numColumns);
      row -= 2;
      column += 2;
      corner2Read = true;
    } else if (row == numRows + 4 && column == 2 && (numColumns & 0x07) == 0 && !corner3Read) {
      result[resultOffset++] = _readCorner3(numRows, numColumns);
      row -= 2;
      column += 2;
      corner3Read = true;
    } else if (row == numRows - 2 && column == 0 && (numColumns & 0x07) == 4 && !corner4Read) {
      result[resultOffset++] = _readCorner4(numRows, numColumns);
      row -= 2;
      column += 2;
      corner4Read = true;
    } else {
      do {
        if (row < numRows && column >= 0 && !_readMappingMatrix.get(column, row)) {
          result[resultOffset++] = _readUtah(row, column, numRows, numColumns);
        }
        row -= 2;
        column += 2;
      } while (row >= 0 && column < numColumns);
      row += 1;
      column += 3;

      do {
        if (row >= 0 && column < numColumns && !_readMappingMatrix.get(column, row)) {
          result[resultOffset++] = _readUtah(row, column, numRows, numColumns);
        }
        row += 2;
        column -= 2;
      } while (row < numRows && column >= 0);
      row += 3;
      column += 1;
    }
  } while (row < numRows || column < numColumns);

  if (resultOffset != _version.totalCodewords) throw const UCodeDecodeException("Data Matrix codeword count mismatch");
  return result;
}