2021SC@SDUSC
decoder.h分析
decoder结构体组成zbar_decoder_s:
struct zbar_decoder_s {
unsigned char idx;
unsigned w[DECODE_WINDOW];
zbar_symbol_type_t type;
zbar_symbol_type_t lock;
unsigned modifiers;
int direction;
unsigned s6;
unsigned buf_alloc;
unsigned buflen;
unsigned char *buf;
void *userdata;
zbar_decoder_handler_t *handler;
#ifdef ENABLE_EAN
ean_decoder_t ean;
#endif
#ifdef ENABLE_I25
i25_decoder_t i25;
#endif
#ifdef ENABLE_DATABAR
databar_decoder_t databar;
#endif
#ifdef ENABLE_CODABAR
codabar_decoder_t codabar;
#endif
#ifdef ENABLE_CODE39
code39_decoder_t code39;
#endif
#ifdef ENABLE_CODE93
code93_decoder_t code93;
#endif
#ifdef ENABLE_CODE128
code128_decoder_t code128;
#endif
#ifdef ENABLE_PDF417
pdf417_decoder_t pdf417;
#endif
#ifdef ENABLE_QRCODE
qr_finder_t qrf;
#endif
};
unsigned char idx; /* 当前宽度索引 */
unsigned w[DECODE_WINDOW]; /* 最后N条宽度的窗口 */
zbar_symbol_type_t type; /* 上次解码数据的类型 */
zbar_symbol_type_t lock; /* 缓冲锁 */
unsigned modifiers; /* 符号修饰符 */
int direction; /* 最后解码数据的方向 */
unsigned s6; /* 六元字符宽度 */
以上变量都会自动重置
unsigned buf_alloc; /* 动态缓冲区分配 */
unsigned buflen; /* 二进制数据长度 */
unsigned char *buf; /* 解码字符 */
void *userdata; /* 应用数据 */
zbar_decoder_handler_t *handler; /* 应用程序回调 */
以下定义符号特定状态
#ifdef ENABLE_EAN ean_decoder_t ean; /* EAN/UPC并行解码尝试*/ #endif
#ifdef ENABLE_I25 i25_decoder_t i25; /* Interleaved 2 of 5解码状态 */ #endif 以下同为各符号的解码状态。
返回当前元素颜色函数:
static inline char get_color (const zbar_decoder_t *dcode)
{
return(dcode->idx & 1);
}
检索前一个元素的第i个宽度:
static inline unsigned get_width (const zbar_decoder_t *dcode,
unsigned char offset)
{
return(dcode->w[(dcode->idx - offset) & (DECODE_WINDOW - 1)]);
}
从偏移量i开始检索条+空间对宽度:
static inline unsigned pair_width (const zbar_decoder_t *dcode,
unsigned char offset)
{
return(get_width(dcode, offset) + get_width(dcode, offset + 1));
}
计算字符总宽度“s”,由上下文相关偏移量标识的字符开头,字符大小为n个元素:
static inline unsigned calc_s (const zbar_decoder_t *dcode,
unsigned char offset,
unsigned char n)
{
/* FIXME check that this gets unrolled for constant n */
unsigned s = 0;
while(n--)
s += get_width(dcode, offset++);
return(s);
}