decodeMatrix method
Decodes a Data Matrix Code represented as a [BitMatrix]. A 1 or "true" is taken to mean a black module.
@param bits booleans representing white/black Data Matrix Code modules @return text and bytes encoded within the Data Matrix Code @throws FormatException if the Data Matrix Code cannot be decoded @throws ChecksumException if error correction fails
Implementation
DecoderResult decodeMatrix(BitMatrix bits) {
// Construct a parser and read version, error-correction level
final parser = BitMatrixParser(bits);
final version = parser.version;
// Read codewords
final codewords = parser.readCodewords();
// Separate into data blocks
final dataBlocks = DataBlock.getDataBlocks(codewords, version);
// Count total number of data bytes
int totalBytes = 0;
for (DataBlock db in dataBlocks) {
totalBytes += db.numDataCodewords;
}
final resultBytes = Uint8List(totalBytes);
int errorsCorrected = 0;
final dataBlocksCount = dataBlocks.length;
// Error-correct and copy data blocks together into a stream of bytes
for (int j = 0; j < dataBlocksCount; j++) {
final dataBlock = dataBlocks[j];
final codewordBytes = dataBlock.codewords;
final numDataCodewords = dataBlock.numDataCodewords;
errorsCorrected += _correctErrors(codewordBytes, numDataCodewords);
for (int i = 0; i < numDataCodewords; i++) {
// De-interlace data blocks.
resultBytes[i * dataBlocksCount + j] = codewordBytes[i];
}
}
// Decode the contents of that stream of bytes
return DecodedBitStreamParser.decode(resultBytes)
..errorsCorrected = errorsCorrected;
}