static void symbol_handler (zbar_decoder_t *dcode) { zbar_image_scanner_t *iscn = zbar_decoder_get_userdata(dcode); zbar_symbol_type_t type = zbar_decoder_get_type(dcode); /* FIXME assert(type == ZBAR_PARTIAL) */ /* FIXME debug flag to save/display all PARTIALs */ if(type <= ZBAR_PARTIAL) return; #ifdef ENABLE_QRCODE if(type == ZBAR_QRCODE) { qr_handler(iscn); return; } #else assert(type != ZBAR_QRCODE); #endif const char *data = zbar_decoder_get_data(dcode); unsigned datalen = zbar_decoder_get_data_length(dcode); int x = 0, y = 0; if(TEST_CFG(iscn, ZBAR_CFG_POSITION)) { /* tmp position fixup */ int w = zbar_scanner_get_width(iscn->scn); int u = iscn->umin + iscn->du * zbar_scanner_get_edge(iscn->scn, w, 0); if(iscn->dx) { x = u; y = iscn->v; } else { x = iscn->v; y = u; } } /* FIXME need better symbol matching */ zbar_symbol_t *sym; for(sym = iscn->syms->head; sym; sym = sym->next) if(sym->type == type && sym->datalen == datalen && !memcmp(sym->data, data, datalen)) { sym->quality++; if(TEST_CFG(iscn, ZBAR_CFG_POSITION)) /* add new point to existing set */ /* FIXME should be polygon */ sym_add_point(sym, x, y); return; } sym = _zbar_image_scanner_alloc_sym(iscn, type, datalen + 1); /* FIXME grab decoder buffer */ memcpy(sym->data, data, datalen + 1); /* initialize first point */ if(TEST_CFG(iscn, ZBAR_CFG_POSITION)) sym_add_point(sym, x, y); _zbar_image_scanner_add_sym(iscn, sym); }
static PyObject* decoder_get_configs (zbarDecoder *self, void *closure) { unsigned int sym = zbar_decoder_get_type(self->zdcode); unsigned int mask = zbar_decoder_get_configs(self->zdcode, sym); return(zbarEnum_SetFromMask(config_enum, mask)); }
static zbarEnumItem* decoder_get_type (zbarDecoder *self, void *closure) { zbar_symbol_type_t sym = zbar_decoder_get_type(self->zdcode); if(sym == ZBAR_NONE) { /* hardcode most common case */ Py_INCREF((PyObject*)symbol_NONE); return(symbol_NONE); } return(zbarSymbol_LookupEnum(sym)); }
static PyObject* decoder_get_configs_meth (zbarDecoder *self, PyObject *args, PyObject *kwds) { zbar_symbol_type_t sym = ZBAR_NONE; static char *kwlist[] = { "symbology", NULL }; if(!PyArg_ParseTupleAndKeywords(args, kwds, "|i", kwlist, &sym)) return(NULL); if(sym == ZBAR_NONE) sym = zbar_decoder_get_type(self->zdcode); unsigned int mask = zbar_decoder_get_configs(self->zdcode, sym); return(zbarEnum_SetFromMask(config_enum, mask)); }
static void symbol_handler (zbar_decoder_t *dcode) { zbar_image_scanner_t *iscn = zbar_decoder_get_userdata(dcode); zbar_symbol_type_t type = zbar_decoder_get_type(dcode); int x = 0, y = 0, dir; const char *data; unsigned datalen; zbar_symbol_t *sym; #ifdef ENABLE_QRCODE if(type == ZBAR_QRCODE) { qr_handler(iscn); return; } #else assert(type != ZBAR_QRCODE); #endif if(TEST_CFG(iscn, ZBAR_CFG_POSITION)) { /* tmp position fixup */ int w = zbar_scanner_get_width(iscn->scn); int u = iscn->umin + iscn->du * zbar_scanner_get_edge(iscn->scn, w, 0); if(iscn->dx) { x = u; y = iscn->v; } else { x = iscn->v; y = u; } } /* FIXME debug flag to save/display all PARTIALs */ if(type <= ZBAR_PARTIAL) { zprintf(256, "partial symbol @(%d,%d)\n", x, y); return; } data = zbar_decoder_get_data(dcode); datalen = zbar_decoder_get_data_length(dcode); /* FIXME need better symbol matching */ for(sym = iscn->syms->head; sym; sym = sym->next) if(sym->type == type && sym->datalen == datalen && !memcmp(sym->data, data, datalen)) { sym->quality++; zprintf(224, "dup symbol @(%d,%d): dup %s: %.20s\n", x, y, zbar_get_symbol_name(type), data); if(TEST_CFG(iscn, ZBAR_CFG_POSITION)) /* add new point to existing set */ /* FIXME should be polygon */ sym_add_point(sym, x, y); return; } sym = _zbar_image_scanner_alloc_sym(iscn, type, datalen + 1); sym->configs = zbar_decoder_get_configs(dcode, type); sym->modifiers = zbar_decoder_get_modifiers(dcode); /* FIXME grab decoder buffer */ memcpy(sym->data, data, datalen + 1); /* initialize first point */ if(TEST_CFG(iscn, ZBAR_CFG_POSITION)) { zprintf(192, "new symbol @(%d,%d): %s: %.20s\n", x, y, zbar_get_symbol_name(type), data); sym_add_point(sym, x, y); } dir = zbar_decoder_get_direction(dcode); if(dir) sym->orient = (iscn->dy != 0) + ((iscn->du ^ dir) & 2); _zbar_image_scanner_add_sym(iscn, sym); }
static void symbol_handler (zbar_image_scanner_t *iscn, int x, int y) { zbar_symbol_type_t type = zbar_decoder_get_type(iscn->dcode); /* FIXME assert(type == ZBAR_PARTIAL) */ /* FIXME debug flag to save/display all PARTIALs */ if(type <= ZBAR_PARTIAL) return; const char *data = zbar_decoder_get_data(iscn->dcode); /* FIXME deprecate - instead check (x, y) inside existing polygon */ zbar_symbol_t *sym; for(sym = iscn->img->syms; sym; sym = sym->next) if(sym->type == type && !strcmp(sym->data, data)) { /* add new point to existing set */ /* FIXME should be polygon */ sym_add_point(sym, x, y); return; } sym = alloc_sym(iscn, type, data); /* timestamp symbol */ #if _POSIX_TIMERS > 0 struct timespec abstime; clock_gettime(CLOCK_REALTIME, &abstime); sym->time = (abstime.tv_sec * 1000) + ((abstime.tv_nsec / 500000) + 1) / 2; #else struct timeval abstime; gettimeofday(&abstime, NULL); sym->time = (abstime.tv_sec * 1000) + ((abstime.tv_usec / 500) + 1) / 2; #endif /* initialize first point */ sym->npts = 0; sym_add_point(sym, x, y); /* attach to current root image */ sym->next = iscn->img->syms; iscn->img->syms = sym; iscn->img->nsyms++; if(iscn->enable_cache) { zbar_symbol_t *entry = cache_lookup(iscn, sym); if(!entry) { entry = alloc_sym(iscn, sym->type, sym->data); entry->time = sym->time - CACHE_HYSTERESIS; entry->cache_count = -CACHE_CONSISTENCY; /* add to cache */ entry->next = iscn->cache; iscn->cache = entry; } /* consistency check and hysteresis */ uint32_t age = sym->time - entry->time; entry->time = sym->time; int near = (age < CACHE_PROXIMITY); int far = (age >= CACHE_HYSTERESIS); int dup = (entry->cache_count >= 0); if((!dup && !near) || far) entry->cache_count = -CACHE_CONSISTENCY; else if(dup || near) entry->cache_count++; sym->cache_count = entry->cache_count; } else sym->cache_count = 0; if(iscn->handler) iscn->handler(iscn->img, iscn->userdata); }