Farm out beep/vibrate stuff to class to try to reduce CaptureActivity complexity
[zxing.git] / core / src / com / google / zxing / qrcode / decoder / DataMask.java
1 /*\r
2  * Copyright 2007 ZXing authors\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *      http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 package com.google.zxing.qrcode.decoder;\r
18 \r
19 import com.google.zxing.common.BitMatrix;\r
20 \r
21 /**\r
22  * <p>Encapsulates data masks for the data bits in a QR code, per ISO 18004:2006 6.8. Implementations\r
23  * of this class can un-mask a raw BitMatrix. For simplicity, they will unmask the entire BitMatrix,\r
24  * including areas used for finder patterns, timing patterns, etc. These areas should be unused\r
25  * after the point they are unmasked anyway.</p>\r
26  *\r
27  * <p>Note that the diagram in section 6.8.1 is misleading since it indicates that i is column position\r
28  * and j is row position. In fact, as the text says, i is row position and j is column position.</p>\r
29  *\r
30  * @author Sean Owen\r
31  */\r
32 abstract class DataMask {\r
33 \r
34   /**\r
35    * See ISO 18004:2006 6.8.1\r
36    */\r
37   private static final DataMask[] DATA_MASKS = {\r
38       new DataMask000(),\r
39       new DataMask001(),\r
40       new DataMask010(),\r
41       new DataMask011(),\r
42       new DataMask100(),\r
43       new DataMask101(),\r
44       new DataMask110(),\r
45       new DataMask111(),\r
46   };\r
47 \r
48   private DataMask() {\r
49   }\r
50 \r
51   /**\r
52    * <p>Implementations of this method reverse the data masking process applied to a QR Code and\r
53    * make its bits ready to read.</p>\r
54    *\r
55    * @param bits representation of QR Code bits\r
56    * @param dimension dimension of QR Code, represented by bits, being unmasked\r
57    */\r
58   final void unmaskBitMatrix(BitMatrix bits, int dimension) {\r
59     for (int i = 0; i < dimension; i++) {\r
60       for (int j = 0; j < dimension; j++) {\r
61         if (isMasked(i, j)) {\r
62           bits.flip(j, i);\r
63         }\r
64       }\r
65     }\r
66   }\r
67 \r
68   abstract boolean isMasked(int i, int j);\r
69 \r
70   /**\r
71    * @param reference a value between 0 and 7 indicating one of the eight possible\r
72    * data mask patterns a QR Code may use\r
73    * @return {@link DataMask} encapsulating the data mask pattern\r
74    */\r
75   static DataMask forReference(int reference) {\r
76     if (reference < 0 || reference > 7) {\r
77       throw new IllegalArgumentException();\r
78     }\r
79     return DATA_MASKS[reference];\r
80   }\r
81 \r
82   /**\r
83    * 000: mask bits for which (x + y) mod 2 == 0\r
84    */\r
85   private static class DataMask000 extends DataMask {\r
86     boolean isMasked(int i, int j) {\r
87       return ((i + j) & 0x01) == 0;\r
88     }\r
89   }\r
90 \r
91   /**\r
92    * 001: mask bits for which x mod 2 == 0\r
93    */\r
94   private static class DataMask001 extends DataMask {\r
95     boolean isMasked(int i, int j) {\r
96       return (i & 0x01) == 0;\r
97     }\r
98   }\r
99 \r
100   /**\r
101    * 010: mask bits for which y mod 3 == 0\r
102    */\r
103   private static class DataMask010 extends DataMask {\r
104     boolean isMasked(int i, int j) {\r
105       return j % 3 == 0;\r
106     }\r
107   }\r
108 \r
109   /**\r
110    * 011: mask bits for which (x + y) mod 3 == 0\r
111    */\r
112   private static class DataMask011 extends DataMask {\r
113     boolean isMasked(int i, int j) {\r
114       return (i + j) % 3 == 0;\r
115     }\r
116   }\r
117 \r
118   /**\r
119    * 100: mask bits for which (x/2 + y/3) mod 2 == 0\r
120    */\r
121   private static class DataMask100 extends DataMask {\r
122     boolean isMasked(int i, int j) {\r
123       return (((i >>> 1) + (j /3)) & 0x01) == 0;\r
124     }\r
125   }\r
126 \r
127   /**\r
128    * 101: mask bits for which xy mod 2 + xy mod 3 == 0\r
129    */\r
130   private static class DataMask101 extends DataMask {\r
131     boolean isMasked(int i, int j) {\r
132       int temp = i * j;\r
133       return (temp & 0x01) + (temp % 3) == 0;\r
134     }\r
135   }\r
136 \r
137   /**\r
138    * 110: mask bits for which (xy mod 2 + xy mod 3) mod 2 == 0\r
139    */\r
140   private static class DataMask110 extends DataMask {\r
141     boolean isMasked(int i, int j) {\r
142       int temp = i * j;\r
143       return (((temp & 0x01) + (temp % 3)) & 0x01) == 0;\r
144     }\r
145   }\r
146 \r
147   /**\r
148    * 111: mask bits for which ((x+y)mod 2 + xy mod 3) mod 2 == 0\r
149    */\r
150   private static class DataMask111 extends DataMask {\r
151     boolean isMasked(int i, int j) {\r
152       return ((((i + j) & 0x01) + ((i * j) % 3)) & 0x01) == 0;\r
153     }\r
154   }\r
155 }\r