-
Notifications
You must be signed in to change notification settings - Fork 0
/
qr_finder.c
89 lines (71 loc) · 2.13 KB
/
qr_finder.c
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
#include <config.h>
//#include <assert.h>
#include <zbar.h>
#include "decoder.h"
#include "vmsys.h"
#include "vmio.h"
#define malloc vm_malloc
#define free vm_free
#define calloc(x,y) vm_calloc(x*y)
#define realloc vm_realloc
#define assert(x) if(!(x)){vm_exit_app();while(1){};}
#ifdef DEBUG_QR_FINDER
# define DEBUG_LEVEL (DEBUG_QR_FINDER)
#endif
#include "debug.h"
/* at this point lengths are all decode unit offsets from the decode edge
* NB owned by finder
*/
qr_finder_line *_zbar_decoder_get_qr_finder_line (zbar_decoder_t *dcode)
{
return(&dcode->qrf.line);
}
zbar_symbol_type_t _zbar_find_qr (zbar_decoder_t *dcode)
{
unsigned s = 0;
int ei = 0;
unsigned qz = 0;
unsigned w = 0;
qr_finder_t *qrf = &dcode->qrf;
/* update latest finder pattern width */
qrf->s5 -= get_width(dcode, 6);
qrf->s5 += get_width(dcode, 1);
s = qrf->s5;
if(get_color(dcode) != ZBAR_SPACE || s < 7)
return(0);
dprintf(2, " qrf: s=%d", s);
ei = decode_e(pair_width(dcode, 1), s, 7);
dprintf(2, " %d", ei);
if(ei)
goto invalid;
ei = decode_e(pair_width(dcode, 2), s, 7);
dprintf(2, "%d", ei);
if(ei != 2)
goto invalid;
ei = decode_e(pair_width(dcode, 3), s, 7);
dprintf(2, "%d", ei);
if(ei != 2)
goto invalid;
ei = decode_e(pair_width(dcode, 4), s, 7);
dprintf(2, "%d", ei);
if(ei)
goto invalid;
/* valid QR finder symbol
* mark positions needed by decoder
*/
qz = get_width(dcode, 0);
w = get_width(dcode, 1);
qrf->line.eoffs = qz + (w + 1) / 2;
qrf->line.len = qz + w + get_width(dcode, 2);
qrf->line.pos[0] = qrf->line.len + get_width(dcode, 3);
qrf->line.pos[1] = qrf->line.pos[0];
w = get_width(dcode, 5);
qrf->line.boffs = qrf->line.pos[0] + get_width(dcode, 4) + (w + 1) / 2;
dprintf(2, " boff=%d pos=%d len=%d eoff=%d [valid]\n",
qrf->line.boffs, qrf->line.pos[0], qrf->line.len,
qrf->line.eoffs);
return(ZBAR_QRCODE);
invalid:
dprintf(2, " [invalid]\n");
return(0);
}