forked from makiuchi-d/gozxing
-
Notifications
You must be signed in to change notification settings - Fork 0
/
luminance_source.go
151 lines (128 loc) · 4.39 KB
/
luminance_source.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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package gozxing
import (
"errors"
)
type LuminanceSource interface {
/**
* Fetches one row of luminance data from the underlying platform's bitmap. Values range from
* 0 (black) to 255 (white). Because Java does not have an unsigned byte type, callers will have
* to bitwise and with 0xff for each value. It is preferable for implementations of this method
* to only fetch this row rather than the whole image, since no 2D Readers may be installed and
* getMatrix() may never be called.
*
* @param y The row to fetch, which must be in [0,getHeight())
* @param row An optional preallocated array. If null or too small, it will be ignored.
* Always use the returned object, and ignore the .length of the array.
* @return An array containing the luminance data.
*/
GetRow(y int, row []byte) ([]byte, error)
/**
* Fetches luminance data for the underlying bitmap. Values should be fetched using:
* {@code int luminance = array[y * width + x] & 0xff}
*
* @return A row-major 2D array of luminance values. Do not use result.length as it may be
* larger than width * height bytes on some platforms. Do not modify the contents
* of the result.
*/
GetMatrix() []byte
/**
* @return The width of the bitmap.
*/
GetWidth() int
/**
* @return The height of the bitmap.
*/
GetHeight() int
/**
* @return Whether this subclass supports cropping.
*/
IsCropSupported() bool
/**
* Returns a new object with cropped image data. Implementations may keep a reference to the
* original data rather than a copy. Only callable if isCropSupported() is true.
*
* @param left The left coordinate, which must be in [0,getWidth())
* @param top The top coordinate, which must be in [0,getHeight())
* @param width The width of the rectangle to crop.
* @param height The height of the rectangle to crop.
* @return A cropped version of this object.
*/
Crop(left, top, width, height int) (LuminanceSource, error)
/**
* @return Whether this subclass supports counter-clockwise rotation.
*/
IsRotateSupported() bool
/**
* @return a wrapper of this {@code LuminanceSource} which inverts the luminances it returns -- black becomes
* white and vice versa, and each value becomes (255-value).
*/
Invert() LuminanceSource
/**
* Returns a new object with rotated image data by 90 degrees counterclockwise.
* Only callable if {@link #isRotateSupported()} is true.
*
* @return A rotated version of this object.
*/
RotateCounterClockwise() (LuminanceSource, error)
/**
* Returns a new object with rotated image data by 45 degrees counterclockwise.
* Only callable if {@link #isRotateSupported()} is true.
*
* @return A rotated version of this object.
*/
RotateCounterClockwise45() (LuminanceSource, error)
String() string
}
type LuminanceSourceBase struct {
Width int
Height int
}
func (this *LuminanceSourceBase) GetWidth() int {
return this.Width
}
func (this *LuminanceSourceBase) GetHeight() int {
return this.Height
}
func (this *LuminanceSourceBase) IsCropSupported() bool {
return false
}
func (this *LuminanceSourceBase) Crop(left, top, width, height int) (LuminanceSource, error) {
return nil, errors.New("UnsupportedOperationException: This luminance source does not support cropping")
}
func (this *LuminanceSourceBase) IsRotateSupported() bool {
return false
}
func (this *LuminanceSourceBase) RotateCounterClockwise() (LuminanceSource, error) {
return nil, errors.New("UnsupportedOperationException: This luminance source does not support rotation by 90 degrees")
}
func (this *LuminanceSourceBase) RotateCounterClockwise45() (LuminanceSource, error) {
return nil, errors.New("UnsupportedOperationException: This luminance source does not support rotation by 45 degrees")
}
func LuminanceSourceInvert(this LuminanceSource) LuminanceSource {
return NewInvertedLuminanceSource(this)
}
func LuminanceSourceString(this LuminanceSource) string {
width := this.GetWidth()
height := this.GetHeight()
row := make([]byte, width)
result := make([]byte, 0, height*(width+1))
for y := 0; y < height; y++ {
row, _ = this.GetRow(y, row)
for x := 0; x < width; x++ {
luminance := row[x] & 0xFF
var c byte
if luminance < 0x40 {
c = '#'
} else if luminance < 0x80 {
c = '+'
} else if luminance < 0xC0 {
c = '.'
} else {
c = ' '
}
result = append(result, c)
}
result = append(result, '\n')
}
return string(result)
}