mirror of
https://github.com/zxing/zxing.git
synced 2025-02-02 05:41:08 -08:00
Remove getBits()
git-svn-id: https://zxing.googlecode.com/svn/trunk@976 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
parent
5f2b64ee50
commit
4b7e5e6461
|
@ -59,6 +59,15 @@ public final class BitArray {
|
|||
bits[i >> 5] |= 1 << (i & 0x1F);
|
||||
}
|
||||
|
||||
/**
|
||||
* Flips bit i.
|
||||
*
|
||||
* @param i bit to set
|
||||
*/
|
||||
public void flip(int i) {
|
||||
bits[i >> 5] ^= 1 << (i & 0x1F);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a block of 32 bits, starting at bit i.
|
||||
*
|
||||
|
|
|
@ -71,6 +71,17 @@ public final class BitMatrix {
|
|||
bits[offset >> 5] |= 1 << (offset & 0x1F);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Flips the given bit.</p>
|
||||
*
|
||||
* @param i row offset
|
||||
* @param j column offset
|
||||
*/
|
||||
public void flip(int i, int j) {
|
||||
int offset = i + dimension * j;
|
||||
bits[offset >> 5] ^= 1 << (offset & 0x1F);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Sets a square region of the bit matrix to true.</p>
|
||||
*
|
||||
|
@ -108,13 +119,6 @@ public final class BitMatrix {
|
|||
return dimension;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array of ints holding internal representation of this matrix's bits
|
||||
*/
|
||||
public int[] getBits() {
|
||||
return bits;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuffer result = new StringBuffer(dimension * (dimension + 1));
|
||||
for (int i = 0; i < dimension; i++) {
|
||||
|
|
|
@ -161,7 +161,7 @@ final class BitMatrixParser {
|
|||
// some bits from reading as we wind through the bit matrix.
|
||||
DataMask dataMask = DataMask.forReference((int) formatInfo.getDataMask());
|
||||
int dimension = bitMatrix.getDimension();
|
||||
dataMask.unmaskBitMatrix(bitMatrix.getBits(), dimension);
|
||||
dataMask.unmaskBitMatrix(bitMatrix, dimension);
|
||||
|
||||
BitMatrix functionPattern = version.buildFunctionPattern();
|
||||
|
||||
|
|
|
@ -16,6 +16,8 @@
|
|||
|
||||
package com.google.zxing.qrcode.decoder;
|
||||
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
|
||||
/**
|
||||
* <p>Encapsulates data masks for the data bits in a QR code, per ISO 18004:2006 6.8. Implementations
|
||||
* of this class can un-mask a raw BitMatrix. For simplicity, they will unmask the entire BitMatrix,
|
||||
|
@ -50,10 +52,20 @@ abstract class DataMask {
|
|||
* <p>Implementations of this method reverse the data masking process applied to a QR Code and
|
||||
* make its bits ready to read.</p>
|
||||
*
|
||||
* @param bits representation of QR Code bits from {@link com.google.zxing.common.BitMatrix#getBits()}
|
||||
* @param bits representation of QR Code bits
|
||||
* @param dimension dimension of QR Code, represented by bits, being unmasked
|
||||
*/
|
||||
abstract void unmaskBitMatrix(int[] bits, int dimension);
|
||||
final void unmaskBitMatrix(BitMatrix bits, int dimension) {
|
||||
for (int y = 0; y < dimension; y++) {
|
||||
for (int x = 0; x < dimension; x++) {
|
||||
if (isMasked(x, y)) {
|
||||
bits.flip(x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
abstract boolean isMasked(int x, int y);
|
||||
|
||||
/**
|
||||
* @param reference a value between 0 and 7 indicating one of the eight possible
|
||||
|
@ -68,166 +80,67 @@ abstract class DataMask {
|
|||
}
|
||||
|
||||
/**
|
||||
* 000: mask bits for which (i + j) mod 2 == 0
|
||||
* 000: mask bits for which (x + y) mod 2 == 0
|
||||
*/
|
||||
private static class DataMask000 extends DataMask {
|
||||
private static final int BITMASK = 0x55555555; // = 010101...
|
||||
|
||||
void unmaskBitMatrix(int[] bits, int dimension) {
|
||||
// This one's easy. Because the dimension of BitMatrix is always odd,
|
||||
// we can merely flip every other bit
|
||||
int max = bits.length;
|
||||
for (int i = 0; i < max; i++) {
|
||||
bits[i] ^= BITMASK;
|
||||
}
|
||||
boolean isMasked(int x, int y) {
|
||||
return ((x + y) & 0x01) == 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 001: mask bits for which i mod 2 == 0
|
||||
* 001: mask bits for which x mod 2 == 0
|
||||
*/
|
||||
private static class DataMask001 extends DataMask {
|
||||
void unmaskBitMatrix(int[] bits, int dimension) {
|
||||
int bitMask = 0;
|
||||
int count = 0;
|
||||
int offset = 0;
|
||||
for (int j = 0; j < dimension; j++) {
|
||||
for (int i = 0; i < dimension; i++) {
|
||||
if ((i & 0x01) == 0) {
|
||||
bitMask |= 1 << count;
|
||||
}
|
||||
if (++count == 32) {
|
||||
bits[offset++] ^= bitMask;
|
||||
count = 0;
|
||||
bitMask = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
bits[offset] ^= bitMask;
|
||||
boolean isMasked(int x, int y) {
|
||||
return (x & 0x01) == 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 010: mask bits for which j mod 3 == 0
|
||||
* 010: mask bits for which y mod 3 == 0
|
||||
*/
|
||||
private static class DataMask010 extends DataMask {
|
||||
void unmaskBitMatrix(int[] bits, int dimension) {
|
||||
int bitMask = 0;
|
||||
int count = 0;
|
||||
int offset = 0;
|
||||
for (int j = 0; j < dimension; j++) {
|
||||
boolean columnMasked = j % 3 == 0;
|
||||
for (int i = 0; i < dimension; i++) {
|
||||
if (columnMasked) {
|
||||
bitMask |= 1 << count;
|
||||
}
|
||||
if (++count == 32) {
|
||||
bits[offset++] ^= bitMask;
|
||||
count = 0;
|
||||
bitMask = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
bits[offset] ^= bitMask;
|
||||
boolean isMasked(int x, int y) {
|
||||
return y % 3 == 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 011: mask bits for which (i + j) mod 3 == 0
|
||||
* 011: mask bits for which (x + y) mod 3 == 0
|
||||
*/
|
||||
private static class DataMask011 extends DataMask {
|
||||
void unmaskBitMatrix(int[] bits, int dimension) {
|
||||
int bitMask = 0;
|
||||
int count = 0;
|
||||
int offset = 0;
|
||||
for (int j = 0; j < dimension; j++) {
|
||||
for (int i = 0; i < dimension; i++) {
|
||||
if ((i + j) % 3 == 0) {
|
||||
bitMask |= 1 << count;
|
||||
}
|
||||
if (++count == 32) {
|
||||
bits[offset++] ^= bitMask;
|
||||
count = 0;
|
||||
bitMask = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
bits[offset] ^= bitMask;
|
||||
boolean isMasked(int x, int y) {
|
||||
return (x + y) % 3 == 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 100: mask bits for which (i/2 + j/3) mod 2 == 0
|
||||
* 100: mask bits for which (x/2 + y/3) mod 2 == 0
|
||||
*/
|
||||
private static class DataMask100 extends DataMask {
|
||||
void unmaskBitMatrix(int[] bits, int dimension) {
|
||||
int bitMask = 0;
|
||||
int count = 0;
|
||||
int offset = 0;
|
||||
for (int j = 0; j < dimension; j++) {
|
||||
int jComponentParity = (j / 3) & 0x01;
|
||||
for (int i = 0; i < dimension; i++) {
|
||||
if (((i >> 1) & 0x01) == jComponentParity) {
|
||||
bitMask |= 1 << count;
|
||||
}
|
||||
if (++count == 32) {
|
||||
bits[offset++] ^= bitMask;
|
||||
count = 0;
|
||||
bitMask = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
bits[offset] ^= bitMask;
|
||||
boolean isMasked(int x, int y) {
|
||||
return (((x >>> 1) + (y/3)) & 0x01) == 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 101: mask bits for which ij mod 2 + ij mod 3 == 0
|
||||
* 101: mask bits for which xy mod 2 + xy mod 3 == 0
|
||||
*/
|
||||
private static class DataMask101 extends DataMask {
|
||||
void unmaskBitMatrix(int[] bits, int dimension) {
|
||||
int bitMask = 0;
|
||||
int count = 0;
|
||||
int offset = 0;
|
||||
for (int j = 0; j < dimension; j++) {
|
||||
for (int i = 0; i < dimension; i++) {
|
||||
int product = i * j;
|
||||
if (((product & 0x01) == 0) && product % 3 == 0) {
|
||||
bitMask |= 1 << count;
|
||||
}
|
||||
if (++count == 32) {
|
||||
bits[offset++] ^= bitMask;
|
||||
count = 0;
|
||||
bitMask = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
bits[offset] ^= bitMask;
|
||||
boolean isMasked(int x, int y) {
|
||||
int temp = x * y;
|
||||
return (temp & 0x01) + (temp % 3) == 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 110: mask bits for which (ij mod 2 + ij mod 3) mod 2 == 0
|
||||
* 110: mask bits for which (xy mod 2 + xy mod 3) mod 2 == 0
|
||||
*/
|
||||
private static class DataMask110 extends DataMask {
|
||||
void unmaskBitMatrix(int[] bits, int dimension) {
|
||||
int bitMask = 0;
|
||||
int count = 0;
|
||||
int offset = 0;
|
||||
for (int j = 0; j < dimension; j++) {
|
||||
for (int i = 0; i < dimension; i++) {
|
||||
int product = i * j;
|
||||
if ((((product & 0x01) + product % 3) & 0x01) == 0) {
|
||||
bitMask |= 1 << count;
|
||||
}
|
||||
if (++count == 32) {
|
||||
bits[offset++] ^= bitMask;
|
||||
count = 0;
|
||||
bitMask = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
bits[offset] ^= bitMask;
|
||||
boolean isMasked(int x, int y) {
|
||||
int temp = x * y;
|
||||
return (((temp & 0x01) + (temp % 3)) & 0x01) == 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -235,23 +148,8 @@ abstract class DataMask {
|
|||
* 111: mask bits for which ((i+j)mod 2 + ij mod 3) mod 2 == 0
|
||||
*/
|
||||
private static class DataMask111 extends DataMask {
|
||||
void unmaskBitMatrix(int[] bits, int dimension) {
|
||||
int bitMask = 0;
|
||||
int count = 0;
|
||||
int offset = 0;
|
||||
for (int j = 0; j < dimension; j++) {
|
||||
for (int i = 0; i < dimension; i++) {
|
||||
if (((((i + j) & 0x01) + (i * j) % 3) & 0x01) == 0) {
|
||||
bitMask |= 1 << count;
|
||||
}
|
||||
if (++count == 32) {
|
||||
bits[offset++] ^= bitMask;
|
||||
count = 0;
|
||||
bitMask = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
bits[offset] ^= bitMask;
|
||||
boolean isMasked(int x, int y) {
|
||||
return ((((x + y) & 0x01) + ((x * y) % 3)) & 0x01) == 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,13 +50,4 @@ public final class BitMatrixTestCase extends TestCase {
|
|||
}
|
||||
}
|
||||
|
||||
public void testGetBits() {
|
||||
BitMatrix matrix = new BitMatrix(6);
|
||||
matrix.set(0, 0);
|
||||
matrix.set(5, 5);
|
||||
int[] bits = matrix.getBits();
|
||||
assertEquals(1, bits[0]);
|
||||
assertEquals(8, bits[1]);
|
||||
}
|
||||
|
||||
}
|
|
@ -99,7 +99,7 @@ public final class DataMaskTestCase extends TestCase {
|
|||
|
||||
private void testMask(DataMask mask, int dimension, MaskCondition condition) {
|
||||
BitMatrix bits = new BitMatrix(dimension);
|
||||
mask.unmaskBitMatrix(bits.getBits(), dimension);
|
||||
mask.unmaskBitMatrix(bits, dimension);
|
||||
for (int i = 0; i < dimension; i++) {
|
||||
for (int j = 0; j < dimension; j++) {
|
||||
assertEquals(
|
||||
|
|
Loading…
Reference in a new issue