readCodewords method

Uint8List readCodewords()

Reads the bits in the [BitMatrix] representing the mapping matrix (No alignment patterns) in the correct order in order to reconstitute the codewords bytes contained within the Data Matrix Code.

@return bytes encoded within the Data Matrix Code @throws FormatException if the exact number of bytes expected is not read

Implementation

Uint8List readCodewords() {
  final result = Uint8List(_version.totalCodewords);
  int resultOffset = 0;

  int row = 4;
  int column = 0;

  final numRows = _mappingBitMatrix.height;
  final numColumns = _mappingBitMatrix.width;

  bool corner1Read = false;
  bool corner2Read = false;
  bool corner3Read = false;
  bool corner4Read = false;

  // Read all of the codewords
  do {
    // Check the four corner cases
    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 {
      // Sweep upward diagonally to the right
      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;

      // Sweep downward diagonally to the left
      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 FormatsException.instance;
  }
  return result;
}