readCodewords method
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;
}