1
1
package zbar
2
2
3
3
import (
4
+ "bytes"
4
5
"errors"
5
6
"image"
6
7
"io"
8
+ "iter"
7
9
"runtime"
8
10
9
11
"github.com/tetratelabs/wazero"
@@ -39,7 +41,6 @@ func NewScanner() *Scanner {
39
41
}
40
42
41
43
func NewScannerWithConfig (cfg map [SymbolType ][]ScannerConfig ) (* Scanner , error ) {
42
-
43
44
rt , zbar := newZbarInstance ()
44
45
45
46
res := must (zbar .ExportedFunction ("ImageScanner_create" ).
@@ -70,7 +71,6 @@ func NewScannerWithConfig(cfg map[SymbolType][]ScannerConfig) (*Scanner, error)
70
71
func (s * Scanner ) SetConfig (t SymbolType , cfg ScannerConfig ) error {
71
72
res , err := s .mod .ExportedFunction ("ImageScanner_set_config" ).
72
73
Call (ctx , uint64 (s .scanner ), uint64 (t ), uint64 (cfg .Config ), uint64 (cfg .Value ))
73
-
74
74
if err != nil {
75
75
return err
76
76
}
@@ -102,7 +102,6 @@ func (s *Scanner) ReadAll(img image.Image) ([][]byte, error) {
102
102
Call (ctx , uint64 (zbarImg .ptr ))
103
103
104
104
return data , nil
105
-
106
105
}
107
106
108
107
func (s * Scanner ) Reader (img image.Image ) (* Reader , error ) {
@@ -124,7 +123,6 @@ func (s *Scanner) Reader(img image.Image) (*Reader, error) {
124
123
mod : s .mod ,
125
124
img : zbarImg ,
126
125
}, nil
127
-
128
126
}
129
127
130
128
func (s * Scanner ) scan (i img ) error {
@@ -142,7 +140,6 @@ func (s *Scanner) scan(i img) error {
142
140
}
143
141
144
142
func (s * Scanner ) createImage (i image.Image ) img {
145
-
146
143
bounds := i .Bounds ()
147
144
148
145
buf := s .malloc (uint32 (bounds .Dx () * bounds .Dy ()))
@@ -264,3 +261,31 @@ func (r *Reader) Close() error {
264
261
r .img .ptr = 0
265
262
return nil
266
263
}
264
+
265
+ // Iter returns a go 1.23 iterator reusing
266
+ // a single buffer for all symbols.
267
+ func (r * Reader ) Iter () iter.Seq2 [[]byte , error ] {
268
+ var (
269
+ // default io.Copy buffer size
270
+ copyBuf = make ([]byte , 32 * 1024 )
271
+ buf = bytes.Buffer {}
272
+ )
273
+
274
+ return func (yield func ([]byte , error ) bool ) {
275
+ defer r .Close ()
276
+
277
+ for {
278
+ _ , err := io .CopyBuffer (& buf , r , copyBuf )
279
+ if err != nil {
280
+ yield (nil , err )
281
+ return
282
+ }
283
+
284
+ if ! yield (buf .Bytes (), nil ) || ! r .Next () {
285
+ return
286
+ }
287
+
288
+ buf .Reset ()
289
+ }
290
+ }
291
+ }
0 commit comments