Example #1
0
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);
}
Example #2
0
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));
}
Example #3
0
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));
}
Example #4
0
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));
}
Example #5
0
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);
}
Example #6
0
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);
}