66 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * Helper class to handle QR Code symbol modules
 | 
						|
 *
 | 
						|
 * @param {Number} size Symbol size
 | 
						|
 */
 | 
						|
function BitMatrix (size) {
 | 
						|
  if (!size || size < 1) {
 | 
						|
    throw new Error('BitMatrix size must be defined and greater than 0')
 | 
						|
  }
 | 
						|
 | 
						|
  this.size = size
 | 
						|
  this.data = new Uint8Array(size * size)
 | 
						|
  this.reservedBit = new Uint8Array(size * size)
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Set bit value at specified location
 | 
						|
 * If reserved flag is set, this bit will be ignored during masking process
 | 
						|
 *
 | 
						|
 * @param {Number}  row
 | 
						|
 * @param {Number}  col
 | 
						|
 * @param {Boolean} value
 | 
						|
 * @param {Boolean} reserved
 | 
						|
 */
 | 
						|
BitMatrix.prototype.set = function (row, col, value, reserved) {
 | 
						|
  const index = row * this.size + col
 | 
						|
  this.data[index] = value
 | 
						|
  if (reserved) this.reservedBit[index] = true
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Returns bit value at specified location
 | 
						|
 *
 | 
						|
 * @param  {Number}  row
 | 
						|
 * @param  {Number}  col
 | 
						|
 * @return {Boolean}
 | 
						|
 */
 | 
						|
BitMatrix.prototype.get = function (row, col) {
 | 
						|
  return this.data[row * this.size + col]
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Applies xor operator at specified location
 | 
						|
 * (used during masking process)
 | 
						|
 *
 | 
						|
 * @param {Number}  row
 | 
						|
 * @param {Number}  col
 | 
						|
 * @param {Boolean} value
 | 
						|
 */
 | 
						|
BitMatrix.prototype.xor = function (row, col, value) {
 | 
						|
  this.data[row * this.size + col] ^= value
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Check if bit at specified location is reserved
 | 
						|
 *
 | 
						|
 * @param {Number}   row
 | 
						|
 * @param {Number}   col
 | 
						|
 * @return {Boolean}
 | 
						|
 */
 | 
						|
BitMatrix.prototype.isReserved = function (row, col) {
 | 
						|
  return this.reservedBit[row * this.size + col]
 | 
						|
}
 | 
						|
 | 
						|
module.exports = BitMatrix
 |