forked from makiuchi-d/gozxing
/
data_mask.go
99 lines (86 loc) · 1.66 KB
/
data_mask.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package decoder
import (
"github.com/kaxap/gozxing"
)
var DataMaskValues = []DataMask{
// See ISO 18004:2006 6.8.1
/**
* 000: mask bits for which (x + y) mod 2 == 0
*/
{ // DATA_MASK_000
func(i, j int) bool {
return ((i + j) & 0x01) == 0
},
},
/**
* 001: mask bits for which x mod 2 == 0
*/
{ // DATA_MASK_001
func(i, j int) bool {
return (i & 0x01) == 0
},
},
/**
* 010: mask bits for which y mod 3 == 0
*/
{ // DATA_MASK_010
func(i, j int) bool {
return j%3 == 0
},
},
/**
* 011: mask bits for which (x + y) mod 3 == 0
*/
{ // DATA_MASK_011
func(i, j int) bool {
return (i+j)%3 == 0
},
},
/**
* 100: mask bits for which (x/2 + y/3) mod 2 == 0
*/
{ // DATA_MASK_100
func(i, j int) bool {
return (((i / 2) + (j / 3)) & 0x01) == 0
},
},
/**
* 101: mask bits for which xy mod 2 + xy mod 3 == 0
* equivalently, such that xy mod 6 == 0
*/
{ // DATA_MASK_101
func(i, j int) bool {
return (i*j)%6 == 0
},
},
/**
* 110: mask bits for which (xy mod 2 + xy mod 3) mod 2 == 0
* equivalently, such that xy mod 6 < 3
*/
{ // DATA_MASK_110
func(i, j int) bool {
return ((i * j) % 6) < 3
},
},
/**
* 111: mask bits for which ((x+y)mod 2 + xy mod 3) mod 2 == 0
* equivalently, such that (x + y + xy mod 3) mod 2 == 0
*/
{ // DATA_MASK_111
func(i, j int) bool {
return ((i + j + ((i * j) % 3)) & 0x01) == 0
},
},
}
type DataMask struct {
isMasked func(i, j int) bool
}
func (this DataMask) UnmaskBitMatrix(bits *gozxing.BitMatrix, dimension int) {
for i := 0; i < dimension; i++ {
for j := 0; j < dimension; j++ {
if this.isMasked(i, j) {
bits.Flip(j, i)
}
}
}
}