import BitMatrix from '../../common/BitMatrix' ; import Version from './Version' ; import FormatException from '../../FormatException' ; import IllegalArgumentException from '../../IllegalArgumentException' ; author bbrown google export default class BitMatrixParser { private mappingBitMatrix : BitMatrix ; private readMappingMatrix : BitMatrix ; private version : Version ; param bitMatrix BitMatrix to parse
     *  throws constructor ( bitMatrix ) { const dimension = bitMatrix . getHeight ( ) ; if ( dimension < 8 || dimension > 144 || ( dimension & 0x01 ) !== 0 ) { throw new FormatException ( ) ; } this . version = BitMatrixParser . readVersion ( bitMatrix ) ; this . mappingBitMatrix = this . extractDataRegion ( bitMatrix ) ; this . readMappingMatrix = new BitMatrix ( this . mappingBitMatrix . getWidth ( ) , this . mappingBitMatrix . getHeight ( ) ) ; } getVersion ( ) { return this . version ; } param bitMatrix Original  BitMatrix including alignment patterns
     *  return { link throws public static readVersion ( bitMatrix ) { const numRows = bitMatrix . getHeight ( ) ; const numColumns = bitMatrix . getWidth ( ) ; return Version . getVersionForDimensions ( numRows , numColumns ) ; } /**
     * <p>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.</p>
     *
     *  return throws readCodewords ( ) { const result = new Int8Array ( this . version . getTotalCodewords ( ) ) ; let resultOffset = 0 ; let row = 4 ; let column = 0 ; const numRows = this . mappingBitMatrix . getHeight ( ) ; const numColumns = this . mappingBitMatrix . getWidth ( ) ; let corner1Read = false ; let corner2Read = false ; let corner3Read = false ; let corner4Read = false ; do { if ( ( row === numRows ) && ( column === 0 ) && ! corner1Read ) { result [ resultOffset ++ ] = this . readCorner1 ( numRows , numColumns ) & 0xff ; row -= 2 ; column += 2 ; corner1Read = true ; } else if ( ( row === numRows - 2 ) && ( column === 0 ) && ( ( numColumns & 0x03 ) !== 0 ) && ! corner2Read ) { result [ resultOffset ++ ] = this . readCorner2 ( numRows , numColumns ) & 0xff ; row -= 2 ; column += 2 ; corner2Read = true ; } else if ( ( row === numRows + 4 ) && ( column === 2 ) && ( ( numColumns & 0x07 ) === 0 ) && ! corner3Read ) { result [ resultOffset ++ ] = this . readCorner3 ( numRows , numColumns ) & 0xff ; row -= 2 ; column += 2 ; corner3Read = true ; } else if ( ( row === numRows - 2 ) && ( column === 0 ) && ( ( numColumns & 0x07 ) === 4 ) && ! corner4Read ) { result [ resultOffset ++ ] = this . readCorner4 ( numRows , numColumns ) & 0xff ; row -= 2 ; column += 2 ; corner4Read = true ; } else { do { if ( ( row < numRows ) && ( column >= 0 ) && ! this . readMappingMatrix . get ( column , row ) ) { result [ resultOffset ++ ] = this . readUtah ( row , column , numRows , numColumns ) & 0xff ; } row -= 2 ; column += 2 ; } while ( ( row >= 0 ) && ( column < numColumns ) ) ; row += 1 ; column += 3 ; do { if ( ( row >= 0 ) && ( column < numColumns ) && ! this . readMappingMatrix . get ( column , row ) ) { result [ resultOffset ++ ] = this . readUtah ( row , column , numRows , numColumns ) & 0xff ; } row += 2 ; column -= 2 ; } while ( ( row < numRows ) && ( column >= 0 ) ) ; row += 3 ; column += 1 ; } } while ( ( row < numRows ) || ( column < numColumns ) ) ; if ( resultOffset !== this . version . getTotalCodewords ( ) ) { throw new FormatException ( ) ; } return result ; } param row param column param numRows param numColumns return private readModule ( row , column , numRows , numColumns ) { if ( row < 0 ) { row += numRows ; column += 4 - ( ( numRows + 4 ) & 0x07 ) ; } if ( column < 0 ) { column += numColumns ; row += 4 - ( ( numColumns + 4 ) & 0x07 ) ; } this . readMappingMatrix . set ( column , row ) ; return this . mappingBitMatrix . get ( column , row ) ; } param row param column param numRows param numColumns return private readUtah ( row , column , numRows , numColumns ) { let currentByte = 0 ; if ( this . readModule ( row - 2 , column - 2 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( row - 2 , column - 1 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( row - 1 , column - 2 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( row - 1 , column - 1 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( row - 1 , column , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( row , column - 2 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( row , column - 1 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( row , column , numRows , numColumns ) ) { currentByte |= 1 ; } return currentByte ; } param numRows param numColumns return private readCorner1 ( numRows , numColumns ) { let currentByte = 0 ; if ( this . readModule ( numRows - 1 , 0 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( numRows - 1 , 1 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( numRows - 1 , 2 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 0 , numColumns - 2 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 0 , numColumns - 1 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 1 , numColumns - 1 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 2 , numColumns - 1 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 3 , numColumns - 1 , numRows , numColumns ) ) { currentByte |= 1 ; } return currentByte ; } param numRows param numColumns return private readCorner2 ( numRows , numColumns ) { let currentByte = 0 ; if ( this . readModule ( numRows - 3 , 0 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( numRows - 2 , 0 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( numRows - 1 , 0 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 0 , numColumns - 4 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 0 , numColumns - 3 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 0 , numColumns - 2 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 0 , numColumns - 1 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 1 , numColumns - 1 , numRows , numColumns ) ) { currentByte |= 1 ; } return currentByte ; } param numRows param numColumns return private readCorner3 ( numRows , numColumns ) { let currentByte = 0 ; if ( this . readModule ( numRows - 1 , 0 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( numRows - 1 , numColumns - 1 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 0 , numColumns - 3 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 0 , numColumns - 2 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 0 , numColumns - 1 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 1 , numColumns - 3 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 1 , numColumns - 2 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 1 , numColumns - 1 , numRows , numColumns ) ) { currentByte |= 1 ; } return currentByte ; } param numRows param numColumns return private readCorner4 ( numRows , numColumns ) { let currentByte = 0 ; if ( this . readModule ( numRows - 3 , 0 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( numRows - 2 , 0 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( numRows - 1 , 0 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 0 , numColumns - 2 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 0 , numColumns - 1 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 1 , numColumns - 1 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 2 , numColumns - 1 , numRows , numColumns ) ) { currentByte |= 1 ; } currentByte <<= 1 ; if ( this . readModule ( 3 , numColumns - 1 , numRows , numColumns ) ) { currentByte |= 1 ; } return currentByte ; } /**
     * <p>Extracts the data region from a  BitMatrix that contains
     * alignment patterns.</p>
     *
     *  param bitMatrix Original  BitMatrix with alignment patterns
     *  return private extractDataRegion ( bitMatrix ) { const symbolSizeRows = this . version . getSymbolSizeRows ( ) ; const symbolSizeColumns = this . version . getSymbolSizeColumns ( ) ; if ( bitMatrix . getHeight ( ) !== symbolSizeRows ) { throw new IllegalArgumentException ( 'Dimension of bitMatrix must match the version size' ) ; } const dataRegionSizeRows = this . version . getDataRegionSizeRows ( ) ; const dataRegionSizeColumns = this . version . getDataRegionSizeColumns ( ) ; const numDataRegionsRow = symbolSizeRows / dataRegionSizeRows | 0 ; const numDataRegionsColumn = symbolSizeColumns / dataRegionSizeColumns | 0 ; const sizeDataRegionRow = numDataRegionsRow * dataRegionSizeRows ; const sizeDataRegionColumn = numDataRegionsColumn * dataRegionSizeColumns ; const bitMatrixWithoutAlignment = new BitMatrix ( sizeDataRegionColumn , sizeDataRegionRow ) ; for ( let dataRegionRow = 0 ; dataRegionRow < numDataRegionsRow ; ++ dataRegionRow ) { const dataRegionRowOffset = dataRegionRow * dataRegionSizeRows ; for ( let dataRegionColumn = 0 ; dataRegionColumn < numDataRegionsColumn ; ++ dataRegionColumn ) { const dataRegionColumnOffset = dataRegionColumn * dataRegionSizeColumns ; for ( let i = 0 ; i < dataRegionSizeRows ; ++ i ) { const readRowOffset = dataRegionRow * ( dataRegionSizeRows + 2 ) + 1 + i ; const writeRowOffset = dataRegionRowOffset + i ; for ( let j = 0 ; j < dataRegionSizeColumns ; ++ j ) { const readColumnOffset = dataRegionColumn * ( dataRegionSizeColumns + 2 ) + 1 + j ; if ( bitMatrix . get ( readColumnOffset , readRowOffset ) ) { const writeColumnOffset = dataRegionColumnOffset + j ; bitMatrixWithoutAlignment . set ( writeColumnOffset , writeRowOffset ) ; } } } } } return bitMatrixWithoutAlignment ; } }