/** * @param bitMatrix {@link BitMatrix} to parse * @throws ReaderException if dimension is not >= 21 and 1 mod 4 */ public BitMatrixParser(BitMatrix bitMatrix){ int dimension = bitMatrix.getDimension(); if (dimension < 21 || (dimension & 0x03) != 1) { throw new ReaderException(); } this.bitMatrix = bitMatrix; }
/** * @param bitMatrix {@link BitMatrix} to parse * @throws ReaderException if dimension is < 10 or > 144 or not 0 mod 2 */ public BitMatrixParser(BitMatrix bitMatrix) { int dimension = bitMatrix.getDimension(); if (dimension < 10 || dimension > 144 || (dimension & 0x01) != 0) { throw new ReaderException(); } version = readVersion(bitMatrix); this.mappingBitMatrix = extractDataRegion(bitMatrix); // TODO(bbrown): Make this work for rectangular symbols this.readMappingMatrix = new BitMatrix(this.mappingBitMatrix.getDimension()); }
/** * <p>Extracts the data region from a {@link BitMatrix} that contains * alignment patterns.</p> * * @param bitMatrix Original {@link BitMatrix} with alignment patterns * @return BitMatrix that has the alignment patterns removed */ BitMatrix extractDataRegion(BitMatrix bitMatrix) { int symbolSizeRows = version.getSymbolSizeRows(); int symbolSizeColumns = version.getSymbolSizeColumns(); // TODO(bbrown): Make this work with rectangular codes if (bitMatrix.getDimension() != symbolSizeRows) { throw new ArgumentException("Dimension of bitMarix must match the version size"); } int dataRegionSizeRows = version.getDataRegionSizeRows(); int dataRegionSizeColumns = version.getDataRegionSizeColumns(); int numDataRegionsRow = symbolSizeRows / dataRegionSizeRows; int numDataRegionsColumn = symbolSizeColumns / dataRegionSizeColumns; int sizeDataRegionRow = numDataRegionsRow * dataRegionSizeRows; //int sizeDataRegionColumn = numDataRegionsColumn * dataRegionSizeColumns; // TODO(bbrown): Make this work with rectangular codes BitMatrix bitMatrixWithoutAlignment = new BitMatrix(sizeDataRegionRow); for (int dataRegionRow = 0; dataRegionRow < numDataRegionsRow; ++dataRegionRow) { int dataRegionRowOffset = dataRegionRow * dataRegionSizeRows; for (int dataRegionColumn = 0; dataRegionColumn < numDataRegionsColumn; ++dataRegionColumn) { int dataRegionColumnOffset = dataRegionColumn * dataRegionSizeColumns; for (int i = 0; i < dataRegionSizeRows; ++i) { int readRowOffset = dataRegionRow * (dataRegionSizeRows + 2) + 1 + i; int writeRowOffset = dataRegionRowOffset + i; for (int j = 0; j < dataRegionSizeColumns; ++j) { int readColumnOffset = dataRegionColumn * (dataRegionSizeColumns + 2) + 1 + j; if (bitMatrix.get(readRowOffset, readColumnOffset)) { int writeColumnOffset = dataRegionColumnOffset + j; bitMatrixWithoutAlignment.set(writeRowOffset, writeColumnOffset); } } } } } return bitMatrixWithoutAlignment; }
/** * <p>Creates the version object based on the dimension of the original bit matrix from * the datamatrix code.</p> * * <p>See ISO 16022:2006 Table 7 - ECC 200 symbol attributes</p> * * @param bitMatrix Original {@link BitMatrix} including alignment patterns * @return {@link Version} encapsulating the Data Matrix Code's "version" * @throws ReaderException if the dimensions of the mapping matrix are not valid * Data Matrix dimensions. */ public Version readVersion(BitMatrix bitMatrix) { if (version != null) { return version; } // TODO(bbrown): make this work for rectangular dimensions as well. int numRows = bitMatrix.getDimension(); int numColumns = numRows; return Version.getVersionForDimensions(numRows, numColumns); }