[zbar-commits] push rev [285]: add support for EAN/UPC 2 and 5 digit add-on symbols (draft)
Status: Beta
Brought to you by:
spadix
|
From: <sp...@us...> - 2010-12-31 19:35:53
|
changeset: 285:7e180f902691 user: sp...@us... date: Sat Dec 11 19:02:17 2010 -0800 details: http://zbar.hg.sourceforge.net:8000/hgroot/zbar/zbarzbar/rev/7e180f902691 description: add support for EAN/UPC 2 and 5 digit add-on symbols (draft) - deprecate original, unfinished add-on APIs - add self-checking to test_decode diffstat: ChangeLog | 3 + TODO | 1 - gtk/zbargtk.c | 1 - include/zbar.h | 31 +++++- include/zbar/Decoder.h | 1 + include/zbar/Symbol.h | 5 +- qt/QZBarThread.cpp | 3 +- test/test_decode.c | 162 +++++++++++++++++++++++++++---- test/test_gtk.c | 1 - zbar/config.c | 13 +- zbar/decoder.c | 34 ++++-- zbar/decoder/code39.c | 2 +- zbar/decoder/ean.c | 250 +++++++++++++++++++++++++++++++----------------- zbar/decoder/ean.h | 17 +- zbar/decoder/i25.c | 24 +++- zbar/decoder/i25.h | 1 + zbar/img_scanner.c | 78 ++++++++++++-- zbar/processor.c | 3 +- zbar/symbol.c | 9 +- 19 files changed, 459 insertions(+), 180 deletions(-) diffs (truncated from 1231 to 300 lines): diff -r a18f09ad6025 -r 7e180f902691 ChangeLog --- a/ChangeLog Wed Jan 06 13:37:17 2010 -0500 +++ b/ChangeLog Sat Dec 11 19:02:17 2010 -0800 @@ -1,4 +1,7 @@ current: + * add support for EAN/UPC 2 and 5 digit add-on symbols + - deprecate original, unfinished add-on APIs + - add self-checking to test_decode * add coarse symbol orientation information (patch #2913094) - thanks to Anssi for a patch! - add decode direction feedback to decoder diff -r a18f09ad6025 -r 7e180f902691 TODO --- a/TODO Wed Jan 06 13:37:17 2010 -0500 +++ b/TODO Sat Dec 11 19:02:17 2010 -0800 @@ -25,7 +25,6 @@ * Code 39, i25 optional features (check digit and ASCII escapes) * handle Code 128 function characters (FNC1-4) * Code 128 trailing quiet zone checks - * finish addon decoding decoder: * start/stop/abort and location detail APIs (PDF417, OMR) diff -r a18f09ad6025 -r 7e180f902691 gtk/zbargtk.c --- a/gtk/zbargtk.c Wed Jan 06 13:37:17 2010 -0500 +++ b/gtk/zbargtk.c Sat Dec 11 19:02:17 2010 -0800 @@ -231,7 +231,6 @@ /* FIXME skip this when unconnected? */ gchar *text = g_strconcat(zbar_get_symbol_name(type), - zbar_get_addon_name(type), ":", data, NULL); diff -r a18f09ad6025 -r 7e180f902691 include/zbar.h --- a/include/zbar.h Wed Jan 06 13:37:17 2010 -0500 +++ b/include/zbar.h Sat Dec 11 19:02:17 2010 -0800 @@ -86,21 +86,41 @@ typedef enum zbar_symbol_type_e { ZBAR_NONE = 0, /**< no symbol decoded */ ZBAR_PARTIAL = 1, /**< intermediate status */ + ZBAR_EAN2 = 2, /**< GS1 2-digit add-on */ + ZBAR_EAN5 = 5, /**< GS1 5-digit add-on */ ZBAR_EAN8 = 8, /**< EAN-8 */ ZBAR_UPCE = 9, /**< UPC-E */ ZBAR_ISBN10 = 10, /**< ISBN-10 (from EAN-13). @since 0.4 */ ZBAR_UPCA = 12, /**< UPC-A */ ZBAR_EAN13 = 13, /**< EAN-13 */ ZBAR_ISBN13 = 14, /**< ISBN-13 (from EAN-13). @since 0.4 */ + ZBAR_EANUPC = 15, /**< EAN/UPC composite */ ZBAR_I25 = 25, /**< Interleaved 2 of 5. @since 0.4 */ ZBAR_CODE39 = 39, /**< Code 39. @since 0.4 */ ZBAR_PDF417 = 57, /**< PDF417. @since 0.6 */ ZBAR_QRCODE = 64, /**< QR Code. @since 0.10 */ ZBAR_CODE128 = 128, /**< Code 128 */ - ZBAR_SYMBOL = 0x00ff, /**< mask for base symbol type */ - ZBAR_ADDON2 = 0x0200, /**< 2-digit add-on flag */ - ZBAR_ADDON5 = 0x0500, /**< 5-digit add-on flag */ - ZBAR_ADDON = 0x0700, /**< add-on flag mask */ + + /** mask for base symbol type. + * @deprecated in 0.11, remove this from existing code + */ + ZBAR_SYMBOL = 0x00ff, + /** 2-digit add-on flag. + * @deprecated in 0.11, a ::ZBAR_EAN2 component is used for + * 2-digit GS1 add-ons + */ + ZBAR_ADDON2 = 0x0200, + /** 5-digit add-on flag. + * @deprecated in 0.11, a ::ZBAR_EAN5 component is used for + * 5-digit GS1 add-ons + */ + ZBAR_ADDON5 = 0x0500, + /** add-on flag mask. + * @deprecated in 0.11, GS1 add-ons are represented using composite + * symbols of type ::ZBAR_EANUPC; add-on components use ::ZBAR_EAN2 + * or ::ZBAR_EAN5 + */ + ZBAR_ADDON = 0x0700, } zbar_symbol_type_t; /** decoded symbol coarse orientation. @@ -179,6 +199,7 @@ * @param sym symbol type encoding * @returns static string name for any addon, or the empty string * if no addons were decoded + * @deprecated in 0.11 */ extern const char *zbar_get_addon_name(zbar_symbol_type_t sym); @@ -329,7 +350,7 @@ /** retrieve general orientation of decoded symbol. * @returns a coarse, axis-aligned indication of symbol orientation or - * ZBAR_ORIENT_UNKNOWN if unknown + * ::ZBAR_ORIENT_UNKNOWN if unknown * @since 0.11 */ extern zbar_orientation_t diff -r a18f09ad6025 -r 7e180f902691 include/zbar/Decoder.h --- a/include/zbar/Decoder.h Wed Jan 06 13:37:17 2010 -0500 +++ b/include/zbar/Decoder.h Sat Dec 11 19:02:17 2010 -0800 @@ -115,6 +115,7 @@ /// retrieve string name for last decode addon. /// see zbar_get_addon_name() + /// @deprecated in 0.11 const char *get_addon_name () const { return(zbar_get_addon_name(zbar_decoder_get_type(_decoder))); diff -r a18f09ad6025 -r 7e180f902691 include/zbar/Symbol.h --- a/include/zbar/Symbol.h Wed Jan 06 13:37:17 2010 -0500 +++ b/include/zbar/Symbol.h Sat Dec 11 19:02:17 2010 -0800 @@ -250,6 +250,7 @@ } /// retrieve the string name for any addon. + /// @deprecated in 0.11 const std::string get_addon_name () const { return(zbar_get_addon_name(_type)); @@ -447,9 +448,7 @@ static inline std::ostream& operator<< (std::ostream& out, const Symbol& sym) { - out << sym.get_type_name() - << sym.get_addon_name() - << ":" << sym.get_data(); + out << sym.get_type_name() << ":" << sym.get_data(); return(out); } diff -r a18f09ad6025 -r 7e180f902691 qt/QZBarThread.cpp --- a/qt/QZBarThread.cpp Wed Jan 06 13:37:17 2010 -0500 +++ b/qt/QZBarThread.cpp Sat Dec 11 19:02:17 2010 -0800 @@ -26,7 +26,7 @@ using namespace zbar; -static const QString textFormat("%1%2:%3"); +static const QString textFormat("%1:%2"); QZBarThread::QZBarThread () : _videoOpened(false), @@ -52,7 +52,6 @@ emit decodedText(textFormat.arg( QString::fromStdString(sym->get_type_name()), - QString::fromStdString(sym->get_addon_name()), data)); } } diff -r a18f09ad6025 -r 7e180f902691 test/test_decode.c --- a/test/test_decode.c Wed Jan 06 13:37:17 2010 -0500 +++ b/test/test_decode.c Sat Dec 11 19:02:17 2010 -0800 @@ -31,16 +31,40 @@ zbar_decoder_t *decoder; +zbar_symbol_type_t expect_sym; +char *expect_data = NULL; + static void symbol_handler (zbar_decoder_t *decoder) { zbar_symbol_type_t sym = zbar_decoder_get_type(decoder); - if(sym <= ZBAR_PARTIAL) + if(sym <= ZBAR_PARTIAL || sym == ZBAR_QRCODE) return; - printf("%s%s:%s\n", - zbar_get_symbol_name(sym), - zbar_get_addon_name(sym), - zbar_decoder_get_data(decoder)); - /* FIXME add check! */ + const char *data = zbar_decoder_get_data(decoder); + printf("decode %s:%s\n", zbar_get_symbol_name(sym), data); + + if(!expect_sym) { + printf("UNEXPECTED!\n"); + abort(); + } + printf("expect %s:%s\n", zbar_get_symbol_name(expect_sym), expect_data); + if(sym != expect_sym || strcmp(data, expect_data)) + abort(); + + expect_sym = ZBAR_NONE; + free(expect_data); + expect_data = NULL; +} + +static void expect (zbar_symbol_type_t sym, + const char *data) +{ + if(expect_sym) { + printf("MISSING %s:%s\n", + zbar_get_symbol_name(expect_sym), expect_data); + abort(); + } + expect_sym = sym; + expect_data = (data) ? strdup(data) : NULL; } static void encode_junk (int n) @@ -122,8 +146,9 @@ 0x2331112a, /* STOP (6a) */ }; -static void encode_code128b (unsigned char *data) +static void encode_code128b (char *data) { + assert(zbar_decoder_get_color(decoder) == ZBAR_SPACE); printf("------------------------------------------------------------\n" "encode CODE-128(B): %s\n" " encode START_B: %02x", data, START_B); @@ -142,8 +167,9 @@ printf("------------------------------------------------------------\n"); } -static void encode_code128c (unsigned char *data) +static void encode_code128c (char *data) { + assert(zbar_decoder_get_color(decoder) == ZBAR_SPACE); printf("------------------------------------------------------------\n" "encode CODE-128(C): %s\n" " encode START_C: %02x", data, START_C); @@ -182,14 +208,29 @@ /* FIXME configurable/randomized ratio, ics */ /* FIXME check digit option, ASCII escapes */ +static void convert_code39 (char *data) +{ + char *src, *dst; + for(src = data, dst = data; *src; src++) { + char c = *src; + if(c >= 'a' && c <= 'z') + *(dst++) = c - ('a' - 'A'); + else if(c == ' ' || + c == '$' || c == '%' || + c == '+' || c == '-' || + (c >= '.' && c <= '9') || + (c >= 'A' && c <= 'Z')) + *(dst++) = c; + else + /* skip (FIXME) */; + } + *dst = 0; +} + static void encode_char39 (unsigned char c, unsigned ics) { - if(c >= 'a' && c <= 'z') - c -= 'a' - 'A'; - else if(c < 0x20 || c > 0x5a) - return; /* skip (FIXME) */ - + assert(0x20 <= c && c <= 0x5a); unsigned int raw = code39[c - 0x20]; if(!raw) return; /* skip (FIXME) */ @@ -206,8 +247,9 @@ encode(enc, REV); } -static void encode_code39 (unsigned char *data) +static void encode_code39 (char *data) { + assert(zbar_decoder_get_color(decoder) == ZBAR_SPACE); printf("------------------------------------------------------------\n" "encode CODE-39: %s\n", data); encode(0xa, 0); /* leading quiet */ @@ -280,8 +322,9 @@ encode((dir) ? PDF417_START : PDF417_STOP, dir); } -static void encode_pdf417 (unsigned char *data) +static void encode_pdf417 (char *data) { + assert(zbar_decoder_get_color(decoder) == ZBAR_SPACE); printf("------------------------------------------------------------\n" "encode PDF417: hello world\n"); encode(0xa, 0); @@ -303,9 +346,10 @@ 0x06, 0x11, 0x09, 0x18, 0x05, 0x14, 0x0c, 0x03, 0x12, 0x0a, }; -static void encode_i25 (unsigned char *data, +static void encode_i25 (char *data, int dir) { + assert(zbar_decoder_get_color(decoder) == ZBAR_SPACE); printf("------------------------------------------------------------\n" "encode Interleaved 2 of 5: %s\n" " encode start:", data); @@ -313,7 +357,7 @@ /* FIXME rev case data reversal */ int i; - for(i = (strlen((char*)data) & 1) ? -1 : 0; i < 0 || data[i]; i += 2) { + for(i = (strlen(data) & 1) ? -1 : 0; i < 0 || data[i]; i += 2) { /* encode 2 digits */ |