Remove getBits()
authorsrowen <srowen@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Mon, 22 Jun 2009 17:48:37 +0000 (17:48 +0000)
committersrowen <srowen@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Mon, 22 Jun 2009 17:48:37 +0000 (17:48 +0000)
git-svn-id: http://zxing.googlecode.com/svn/trunk@976 59b500cc-1b3d-0410-9834-0bbf25fbcc57

core/src/com/google/zxing/common/BitArray.java
core/src/com/google/zxing/common/BitMatrix.java
core/src/com/google/zxing/qrcode/decoder/BitMatrixParser.java
core/src/com/google/zxing/qrcode/decoder/DataMask.java
core/test/src/com/google/zxing/common/BitMatrixTestCase.java
core/test/src/com/google/zxing/qrcode/decoder/DataMaskTestCase.java

index ce4ea08..bab2a3a 100644 (file)
@@ -59,6 +59,15 @@ public final class BitArray {
     bits[i >> 5] |= 1 << (i & 0x1F);\r
   }\r
 \r
+  /**\r
+   * Flips bit i.\r
+   *\r
+   * @param i bit to set\r
+   */\r
+  public void flip(int i) {\r
+    bits[i >> 5] ^= 1 << (i & 0x1F);\r
+  }\r
+\r
   /**\r
    * Sets a block of 32 bits, starting at bit i.\r
    *\r
index 74e452d..5440787 100755 (executable)
@@ -71,6 +71,17 @@ public final class BitMatrix {
     bits[offset >> 5] |= 1 << (offset & 0x1F);\r
   }\r
 \r
+  /**\r
+   * <p>Flips the given bit.</p>\r
+   *\r
+   * @param i row offset\r
+   * @param j column offset\r
+   */\r
+  public void flip(int i, int j) {\r
+    int offset = i + dimension * j;\r
+    bits[offset >> 5] ^= 1 << (offset & 0x1F);\r
+  }\r
+\r
   /**\r
    * <p>Sets a square region of the bit matrix to true.</p>\r
    *\r
@@ -108,13 +119,6 @@ public final class BitMatrix {
     return dimension;\r
   }\r
 \r
-  /**\r
-   * @return array of ints holding internal representation of this matrix's bits\r
-   */\r
-  public int[] getBits() {\r
-    return bits;\r
-  }\r
-\r
   public String toString() {\r
     StringBuffer result = new StringBuffer(dimension * (dimension + 1));\r
     for (int i = 0; i < dimension; i++) {\r
index 9b8ae48..59d558f 100644 (file)
@@ -161,7 +161,7 @@ final class BitMatrixParser {
     // some bits from reading as we wind through the bit matrix.\r
     DataMask dataMask = DataMask.forReference((int) formatInfo.getDataMask());\r
     int dimension = bitMatrix.getDimension();\r
-    dataMask.unmaskBitMatrix(bitMatrix.getBits(), dimension);\r
+    dataMask.unmaskBitMatrix(bitMatrix, dimension);\r
 \r
     BitMatrix functionPattern = version.buildFunctionPattern();\r
 \r
index 6ba1b35..40d07a5 100755 (executable)
@@ -16,6 +16,8 @@
 \r
 package com.google.zxing.qrcode.decoder;\r
 \r
+import com.google.zxing.common.BitMatrix;\r
+\r
 /**\r
  * <p>Encapsulates data masks for the data bits in a QR code, per ISO 18004:2006 6.8. Implementations\r
  * of this class can un-mask a raw BitMatrix. For simplicity, they will unmask the entire BitMatrix,\r
@@ -50,10 +52,20 @@ abstract class DataMask {
    * <p>Implementations of this method reverse the data masking process applied to a QR Code and\r
    * make its bits ready to read.</p>\r
    *\r
-   * @param bits representation of QR Code bits from {@link com.google.zxing.common.BitMatrix#getBits()}\r
+   * @param bits representation of QR Code bits\r
    * @param dimension dimension of QR Code, represented by bits, being unmasked\r
    */\r
-  abstract void unmaskBitMatrix(int[] bits, int dimension);\r
+  final void unmaskBitMatrix(BitMatrix bits, int dimension) {\r
+    for (int y = 0; y < dimension; y++) {\r
+      for (int x = 0; x < dimension; x++) {\r
+        if (isMasked(x, y)) {\r
+          bits.flip(x, y);\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  abstract boolean isMasked(int x, int y);\r
 \r
   /**\r
    * @param reference a value between 0 and 7 indicating one of the eight possible\r
@@ -68,166 +80,67 @@ abstract class DataMask {
   }\r
 \r
   /**\r
-   * 000: mask bits for which (i + j) mod 2 == 0\r
+   * 000: mask bits for which (x + y) mod 2 == 0\r
    */\r
   private static class DataMask000 extends DataMask {\r
-    private static final int BITMASK = 0x55555555; // = 010101...\r
-\r
-    void unmaskBitMatrix(int[] bits, int dimension) {\r
-      // This one's easy. Because the dimension of BitMatrix is always odd,\r
-      // we can merely flip every other bit\r
-      int max = bits.length;\r
-      for (int i = 0; i < max; i++) {\r
-        bits[i] ^= BITMASK;\r
-      }\r
+    boolean isMasked(int x, int y) {\r
+      return ((x + y) & 0x01) == 0;\r
     }\r
   }\r
 \r
   /**\r
-   * 001: mask bits for which i mod 2 == 0\r
+   * 001: mask bits for which x mod 2 == 0\r
    */\r
   private static class DataMask001 extends DataMask {\r
-    void unmaskBitMatrix(int[] bits, int dimension) {\r
-      int bitMask = 0;\r
-      int count = 0;\r
-      int offset = 0;\r
-      for (int j = 0; j < dimension; j++) {\r
-        for (int i = 0; i < dimension; i++) {\r
-          if ((i & 0x01) == 0) {\r
-            bitMask |= 1 << count;\r
-          }\r
-          if (++count == 32) {\r
-            bits[offset++] ^= bitMask;\r
-            count = 0;\r
-            bitMask = 0;\r
-          }\r
-        }\r
-      }\r
-      bits[offset] ^= bitMask;\r
+    boolean isMasked(int x, int y) {\r
+      return (x & 0x01) == 0;\r
     }\r
   }\r
 \r
   /**\r
-   * 010: mask bits for which j mod 3 == 0\r
+   * 010: mask bits for which y mod 3 == 0\r
    */\r
   private static class DataMask010 extends DataMask {\r
-    void unmaskBitMatrix(int[] bits, int dimension) {\r
-      int bitMask = 0;\r
-      int count = 0;\r
-      int offset = 0;\r
-      for (int j = 0; j < dimension; j++) {\r
-        boolean columnMasked = j % 3 == 0;\r
-        for (int i = 0; i < dimension; i++) {\r
-          if (columnMasked) {\r
-            bitMask |= 1 << count;\r
-          }\r
-          if (++count == 32) {\r
-            bits[offset++] ^= bitMask;\r
-            count = 0;\r
-            bitMask = 0;\r
-          }\r
-        }\r
-      }\r
-      bits[offset] ^= bitMask;\r
+    boolean isMasked(int x, int y) {\r
+      return y % 3 == 0;\r
     }\r
   }\r
 \r
   /**\r
-   * 011: mask bits for which (i + j) mod 3 == 0\r
+   * 011: mask bits for which (x + y) mod 3 == 0\r
    */\r
   private static class DataMask011 extends DataMask {\r
-    void unmaskBitMatrix(int[] bits, int dimension) {\r
-      int bitMask = 0;\r
-      int count = 0;\r
-      int offset = 0;\r
-      for (int j = 0; j < dimension; j++) {\r
-        for (int i = 0; i < dimension; i++) {\r
-          if ((i + j) % 3 == 0) {\r
-            bitMask |= 1 << count;\r
-          }\r
-          if (++count == 32) {\r
-            bits[offset++] ^= bitMask;\r
-            count = 0;\r
-            bitMask = 0;\r
-          }\r
-        }\r
-      }\r
-      bits[offset] ^= bitMask;\r
+    boolean isMasked(int x, int y) {\r
+      return (x + y) % 3 == 0;\r
     }\r
   }\r
 \r
   /**\r
-   * 100: mask bits for which (i/2 + j/3) mod 2 == 0\r
+   * 100: mask bits for which (x/2 + y/3) mod 2 == 0\r
    */\r
   private static class DataMask100 extends DataMask {\r
-    void unmaskBitMatrix(int[] bits, int dimension) {\r
-      int bitMask = 0;\r
-      int count = 0;\r
-      int offset = 0;\r
-      for (int j = 0; j < dimension; j++) {\r
-        int jComponentParity = (j / 3) & 0x01;\r
-        for (int i = 0; i < dimension; i++) {\r
-          if (((i >> 1) & 0x01) == jComponentParity) {\r
-            bitMask |= 1 << count;\r
-          }\r
-          if (++count == 32) {\r
-            bits[offset++] ^= bitMask;\r
-            count = 0;\r
-            bitMask = 0;\r
-          }\r
-        }\r
-      }\r
-      bits[offset] ^= bitMask;\r
+    boolean isMasked(int x, int y) {\r
+      return (((x >>> 1) + (y/3)) & 0x01) == 0;\r
     }\r
   }\r
 \r
   /**\r
-   * 101: mask bits for which ij mod 2 + ij mod 3 == 0\r
+   * 101: mask bits for which xy mod 2 + xy mod 3 == 0\r
    */\r
   private static class DataMask101 extends DataMask {\r
-    void unmaskBitMatrix(int[] bits, int dimension) {\r
-      int bitMask = 0;\r
-      int count = 0;\r
-      int offset = 0;\r
-      for (int j = 0; j < dimension; j++) {\r
-        for (int i = 0; i < dimension; i++) {\r
-          int product = i * j;\r
-          if (((product & 0x01) == 0) && product % 3 == 0) {\r
-            bitMask |= 1 << count;\r
-          }\r
-          if (++count == 32) {\r
-            bits[offset++] ^= bitMask;\r
-            count = 0;\r
-            bitMask = 0;\r
-          }\r
-        }\r
-      }\r
-      bits[offset] ^= bitMask;\r
+    boolean isMasked(int x, int y) {\r
+      int temp = x * y;\r
+      return (temp & 0x01) + (temp % 3) == 0;\r
     }\r
   }\r
 \r
   /**\r
-   * 110: mask bits for which (ij mod 2 + ij mod 3) mod 2 == 0\r
+   * 110: mask bits for which (xy mod 2 + xy mod 3) mod 2 == 0\r
    */\r
   private static class DataMask110 extends DataMask {\r
-    void unmaskBitMatrix(int[] bits, int dimension) {\r
-      int bitMask = 0;\r
-      int count = 0;\r
-      int offset = 0;\r
-      for (int j = 0; j < dimension; j++) {\r
-        for (int i = 0; i < dimension; i++) {\r
-          int product = i * j;\r
-          if ((((product & 0x01) + product % 3) & 0x01) == 0) {\r
-            bitMask |= 1 << count;\r
-          }\r
-          if (++count == 32) {\r
-            bits[offset++] ^= bitMask;\r
-            count = 0;\r
-            bitMask = 0;\r
-          }\r
-        }\r
-      }\r
-      bits[offset] ^= bitMask;\r
+    boolean isMasked(int x, int y) {\r
+      int temp = x * y;\r
+      return (((temp & 0x01) + (temp % 3)) & 0x01) == 0;\r
     }\r
   }\r
 \r
@@ -235,23 +148,8 @@ abstract class DataMask {
    * 111: mask bits for which ((i+j)mod 2 + ij mod 3) mod 2 == 0\r
    */\r
   private static class DataMask111 extends DataMask {\r
-    void unmaskBitMatrix(int[] bits, int dimension) {\r
-      int bitMask = 0;\r
-      int count = 0;\r
-      int offset = 0;\r
-      for (int j = 0; j < dimension; j++) {\r
-        for (int i = 0; i < dimension; i++) {\r
-          if (((((i + j) & 0x01) + (i * j) % 3) & 0x01) == 0) {\r
-            bitMask |= 1 << count;\r
-          }\r
-          if (++count == 32) {\r
-            bits[offset++] ^= bitMask;\r
-            count = 0;\r
-            bitMask = 0;\r
-          }\r
-        }\r
-      }\r
-      bits[offset] ^= bitMask;\r
+    boolean isMasked(int x, int y) {\r
+      return ((((x + y) & 0x01) + ((x * y) % 3)) & 0x01) == 0;\r
     }\r
   }\r
 }\r
index 1bb8351..48ef90c 100644 (file)
@@ -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]);
-  }
-
 }
\ No newline at end of file
index 41a8dda..1f15ce6 100644 (file)
@@ -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(