[zbar-commits] push rev [162]: add result query interfaces to image scanner and processor
Status: Beta
Brought to you by:
spadix
From: <sp...@us...> - 2009-10-21 14:35:02
|
changeset: 162:112fd7233b01 user: sp...@us... date: Wed Oct 21 10:34:43 2009 -0400 details: http://zbar.hg.sourceforge.net:8000/hgroot/zbar/zbarzbar/rev/112fd7233b01 description: add result query interfaces to image scanner and processor - move result filtering into image scanner (from user) - abort output blockers when window closed diffs (truncated from 580 to 300 lines): diff -r d299232d429b -r 112fd7233b01 ChangeLog --- a/ChangeLog Tue Oct 20 15:13:00 2009 -0400 +++ b/ChangeLog Wed Oct 21 10:34:43 2009 -0400 @@ -1,4 +1,7 @@ current: + * add result query interfaces to image scanner and processor + - move result filtering into image scanner (from user) + - abort output blockers when window closed * Windows updates - update installer and README for distribution of dependency libraries - fix applications to use binary output for xml and raw modes diff -r d299232d429b -r 112fd7233b01 include/zbar.h --- a/include/zbar.h Tue Oct 20 15:13:00 2009 -0400 +++ b/include/zbar.h Wed Oct 21 10:34:43 2009 -0400 @@ -221,7 +221,7 @@ * destroyed or reused. * @since 0.9 */ -extern void zbar_symbol_ref(zbar_symbol_t *symbol, +extern void zbar_symbol_ref(const zbar_symbol_t *symbol, int refs); /** retrieve type of decoded symbol. @@ -340,7 +340,7 @@ * the object any longer once references have been released. * @since 0.10 */ -extern void zbar_symbol_set_ref(zbar_symbol_set_t *symbols, +extern void zbar_symbol_set_ref(const zbar_symbol_set_t *symbols, int refs); /** retrieve set size. @@ -713,6 +713,16 @@ extern int zbar_processor_set_active(zbar_processor_t *processor, int active); +/** retrieve decode results for last scanned image/frame. + * @returns the symbol set result container or NULL if no results are + * available + * @note the returned symbol set has its reference count incremented; + * ensure that the count is decremented after use + * @since 0.10 + */ +extern const zbar_symbol_set_t* +zbar_processor_get_results(const zbar_processor_t *processor); + /** wait for input to the display window from the user * (via mouse or keyboard). * @returns >0 when input is received, 0 if timeout ms expired @@ -1065,6 +1075,17 @@ extern void zbar_image_scanner_recycle_image(zbar_image_scanner_t *scanner, zbar_image_t *image); +/** retrieve decode results for last scanned image. + * @returns the symbol set result container or NULL if no results are + * available + * @note the symbol set does not have its reference count adjusted; + * ensure that the count is incremented if the results may be kept + * after the next image is scanned + * @since 0.10 + */ +extern const zbar_symbol_set_t* +zbar_image_scanner_get_results(const zbar_image_scanner_t *scanner); + /** scan for symbols in provided image. The image format must be * "Y800" or "GRAY". * @returns >0 if symbols were successfully decoded from the image, diff -r d299232d429b -r 112fd7233b01 include/zbar/ImageScanner.h --- a/include/zbar/ImageScanner.h Tue Oct 20 15:13:00 2009 -0400 +++ b/include/zbar/ImageScanner.h Wed Oct 21 10:34:43 2009 -0400 @@ -91,11 +91,21 @@ zbar_image_scanner_enable_cache(_scanner, enable); } + /// remove previous results from scanner and image. + /// @see zbar_image_scanner_recycle_image() + /// @since 0.10 void recycle_image (Image &image) { zbar_image_scanner_recycle_image(_scanner, image); } + /// retrieve decode results for last scanned image. + /// @see zbar_image_scanner_get_results() + /// @since 0.10 + const SymbolSet get_results () const { + return(SymbolSet(zbar_image_scanner_get_results(_scanner))); + } + /// scan for symbols in provided image. /// see zbar_scan_image() int scan (Image& image) diff -r d299232d429b -r 112fd7233b01 include/zbar/Processor.h --- a/include/zbar/Processor.h Tue Oct 20 15:13:00 2009 -0400 +++ b/include/zbar/Processor.h Wed Oct 21 10:34:43 2009 -0400 @@ -127,6 +127,13 @@ throw_exception(_processor); } + /// retrieve decode results for last scanned image. + /// @see zbar_processor_get_results() + /// @since 0.10 + const SymbolSet get_results () const { + return(SymbolSet(zbar_processor_get_results(_processor))); + } + /// wait for input to the display window from the user. /// see zbar_processor_user_wait() int user_wait (int timeout = FOREVER) diff -r d299232d429b -r 112fd7233b01 perl/ZBar.xs --- a/perl/ZBar.xs Tue Oct 20 15:13:00 2009 -0400 +++ b/perl/ZBar.xs Wed Oct 21 10:34:43 2009 -0400 @@ -537,6 +537,14 @@ check_error(zbar_processor_set_active(processor, active), processor); +SV * +get_results(processor) + Barcode::ZBar::Processor processor + PPCODE: + zbar_symbol_set_t *syms = zbar_processor_get_results(processor); + PUSH_SYMS(zbar_symbol_set_first_symbol(syms)); + zbar_symbol_set_ref(syms, -1); + int zbar_processor_user_wait(processor, timeout=-1) Barcode::ZBar::Processor processor @@ -620,6 +628,13 @@ Barcode::ZBar::ImageScanner scanner Barcode::ZBar::Image image +SV * +get_results(scanner) + Barcode::ZBar::ImageScanner scanner + PPCODE: + zbar_symbol_set_t *syms = zbar_image_scanner_get_results(scanner); + PUSH_SYMS(zbar_symbol_set_first_symbol(syms)); + int scan_image(scanner, image) Barcode::ZBar::ImageScanner scanner diff -r d299232d429b -r 112fd7233b01 python/imagescanner.c --- a/python/imagescanner.c Tue Oct 20 15:13:00 2009 -0400 +++ b/python/imagescanner.c Wed Oct 21 10:34:43 2009 -0400 @@ -57,6 +57,19 @@ ((PyObject*)self)->ob_type->tp_free((PyObject*)self); } +static zbarSymbolSet* +imagescanner_get_results (zbarImageScanner *self, + void *closure) +{ + const zbar_symbol_set_t *zsyms = + zbar_image_scanner_get_results(self->zscn); + return(zbarSymbolSet_FromSymbolSet(zsyms)); +} + +static PyGetSetDef imagescanner_getset[] = { + { "results", (getter)imagescanner_get_results, }, +}; + static PyObject* imagescanner_set_config (zbarImageScanner *self, PyObject *args, @@ -169,5 +182,6 @@ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, .tp_new = (newfunc)imagescanner_new, .tp_dealloc = (destructor)imagescanner_dealloc, + .tp_getset = imagescanner_getset, .tp_methods = imagescanner_methods, }; diff -r d299232d429b -r 112fd7233b01 python/processor.c --- a/python/processor.c Tue Oct 20 15:13:00 2009 -0400 +++ b/python/processor.c Wed Oct 21 10:34:43 2009 -0400 @@ -129,11 +129,21 @@ return(0); } +static zbarSymbolSet* +processor_get_results (zbarProcessor *self, + void *closure) +{ + const zbar_symbol_set_t *zsyms = + zbar_processor_get_results(self->zproc); + return(zbarSymbolSet_FromSymbolSet(zsyms)); +} + static PyGetSetDef processor_getset[] = { { "visible", (getter)processor_get_bool, (setter)processor_set_bool, NULL, (void*)0 }, { "active", NULL, (setter)processor_set_bool, NULL, (void*)1 }, + { "results", (getter)processor_get_results, }, { NULL, }, }; diff -r d299232d429b -r 112fd7233b01 zbar/img_scanner.c --- a/zbar/img_scanner.c Tue Oct 20 15:13:00 2009 -0400 +++ b/zbar/img_scanner.c Wed Oct 21 10:34:43 2009 -0400 @@ -176,7 +176,7 @@ return(1); _zbar_image_scanner_recycle_syms(iscn, syms->head); - syms->head = NULL; + syms->head = syms->tail = NULL; syms->nsyms = 0; return(0); } @@ -291,8 +291,8 @@ return(*entry); } -inline void _zbar_image_scanner_cache_sym (zbar_image_scanner_t *iscn, - zbar_symbol_t *sym) +static inline void cache_sym (zbar_image_scanner_t *iscn, + zbar_symbol_t *sym) { if(iscn->enable_cache) { zbar_symbol_t *entry = cache_lookup(iscn, sym); @@ -325,6 +325,29 @@ sym->cache_count = 0; } +void _zbar_image_scanner_add_sym(zbar_image_scanner_t *iscn, + zbar_symbol_t *sym) +{ + cache_sym(iscn, sym); + + zbar_symbol_set_t *syms = iscn->syms; + if(sym->cache_count || !syms->tail) { + sym->next = syms->head; + syms->head = sym; + } + else { + sym->next = syms->tail->next; + syms->tail->next = sym; + } + + if(!sym->cache_count) + syms->nsyms++; + else if(!syms->tail) + syms->tail = sym; + + _zbar_symbol_refcnt(sym, 1); +} + #ifdef ENABLE_QRCODE extern qr_finder_line *_zbar_decoder_get_qr_finder_line(zbar_decoder_t*); @@ -420,9 +443,7 @@ if(TEST_CFG(iscn, ZBAR_CFG_POSITION)) sym_add_point(sym, x, y); - /* add to current result set */ - _zbar_symbol_set_add(iscn->syms, sym); - _zbar_image_scanner_cache_sym(iscn, sym); + _zbar_image_scanner_add_sym(iscn, sym); } zbar_image_scanner_t *zbar_image_scanner_create () @@ -541,8 +562,8 @@ return(0); } -void zbar_image_scanner_enable_cache(zbar_image_scanner_t *iscn, - int enable) +void zbar_image_scanner_enable_cache (zbar_image_scanner_t *iscn, + int enable) { if(iscn->cache) { /* recycle all cached syms */ @@ -552,6 +573,12 @@ iscn->enable_cache = (enable) ? 1 : 0; } +const zbar_symbol_set_t * +zbar_image_scanner_get_results (const zbar_image_scanner_t *iscn) +{ + return(iscn->syms); +} + static inline void quiet_border (zbar_image_scanner_t *iscn) { /* flush scanner pipeline */ @@ -743,7 +770,6 @@ } } - /* FIXME option to only report count == 0 */ if(syms->nsyms && iscn->handler) iscn->handler(img, iscn->userdata); diff -r d299232d429b -r 112fd7233b01 zbar/img_scanner.h --- a/zbar/img_scanner.h Tue Oct 20 15:13:00 2009 -0400 +++ b/zbar/img_scanner.h Wed Oct 21 10:34:43 2009 -0400 @@ -30,8 +30,8 @@ extern zbar_symbol_t *_zbar_image_scanner_alloc_sym(zbar_image_scanner_t*, zbar_symbol_type_t, int); -extern void _zbar_image_scanner_cache_sym(zbar_image_scanner_t*, |