From 2a19b883a57e91c4b66abfdeb7388e29416ff539 Mon Sep 17 00:00:00 2001 From: gitlost Date: Wed, 15 Jul 2020 19:00:12 +0100 Subject: [PATCH] UPC/EAN, ITF14: quiet zones, addongap; raster/vector: sync code, use double --- backend/2of5.c | 7 + backend/code128.c | 25 +- backend/common.c | 36 +- backend/composite.c | 9 +- backend/large.c | 2 +- backend/library.c | 8 - backend/output.c | 485 +++++++++++++- backend/output.h | 8 +- backend/raster.c | 589 +++++++---------- backend/tests/README | 8 + .../data/png/ean13_2addon_ggs_5.2.2.5.1-2.png | Bin 0 -> 746 bytes .../data/png/ean13_5addon_ggs_5.2.2.5.2-2.png | Bin 0 -> 845 bytes backend/tests/data/png/ean2.png | Bin 0 -> 267 bytes backend/tests/data/png/ean5.png | Bin 0 -> 398 bytes backend/tests/data/png/ean8_2addon.png | Bin 0 -> 645 bytes backend/tests/data/png/ean8_5addon.png | Bin 0 -> 735 bytes .../data/png/upca_2addon_ggs_5.2.6.6-5.png | Bin 0 -> 764 bytes backend/tests/data/png/upca_5addon.png | Bin 0 -> 777 bytes backend/tests/data/png/upce_2addon.png | Bin 0 -> 599 bytes backend/tests/data/png/upce_5addon.png | Bin 0 -> 710 bytes .../data/svg/ean13_2addon_ggs_5.2.2.5.1-2.svg | 65 ++ .../data/svg/ean13_5addon_ggs_5.2.2.5.2-2.svg | 74 +++ backend/tests/data/svg/ean2.svg | 23 + backend/tests/data/svg/ean5.svg | 32 + backend/tests/data/svg/ean8_2addon.svg | 53 ++ backend/tests/data/svg/ean8_5addon.svg | 62 ++ .../data/svg/upca_2addon_ggs_5.2.6.6-5.svg | 69 ++ backend/tests/data/svg/upca_5addon.svg | 78 +++ backend/tests/data/svg/upce_2addon.svg | 52 ++ backend/tests/data/svg/upce_5addon.svg | 61 ++ backend/tests/test_2of5.c | 29 +- backend/tests/test_codablock.c | 4 +- backend/tests/test_code128.c | 108 +-- backend/tests/test_composite.c | 121 +++- backend/tests/test_png.c | 10 + backend/tests/test_raster.c | 293 +++++---- backend/tests/test_svg.c | 10 + backend/tests/test_upcean.c | 230 +++++-- backend/tests/test_vector.c | 309 +++++---- backend/tests/testcommon.c | 148 +++-- .../tests/tools/bwipp_dump-barcode.ps.diff | 219 ++++--- backend/tests/tools/bwipp_dump.ps.tar.xz | Bin 114172 -> 114156 bytes backend/tests/tools/run_bwipp_tests.sh | 11 + backend/tools/gen_pwr928_table.php | 46 ++ backend/upcean.c | 26 +- backend/vector.c | 614 +++++++----------- docs/manual.txt | 50 +- frontend/main.c | 41 ++ frontend_qt/CMakeLists.txt | 6 +- frontend_qt/frontend_qt.pro | 2 + frontend_qt/grpUPCA.ui | 81 +++ frontend_qt/grpUPCEAN.ui | 91 +++ frontend_qt/mainwindow.cpp | 70 +- frontend_qt/mainwindow.h | 1 + frontend_qt/resources.qrc | 2 + 55 files changed, 2917 insertions(+), 1351 deletions(-) create mode 100644 backend/tests/data/png/ean13_2addon_ggs_5.2.2.5.1-2.png create mode 100644 backend/tests/data/png/ean13_5addon_ggs_5.2.2.5.2-2.png create mode 100644 backend/tests/data/png/ean2.png create mode 100644 backend/tests/data/png/ean5.png create mode 100644 backend/tests/data/png/ean8_2addon.png create mode 100644 backend/tests/data/png/ean8_5addon.png create mode 100644 backend/tests/data/png/upca_2addon_ggs_5.2.6.6-5.png create mode 100644 backend/tests/data/png/upca_5addon.png create mode 100644 backend/tests/data/png/upce_2addon.png create mode 100644 backend/tests/data/png/upce_5addon.png create mode 100644 backend/tests/data/svg/ean13_2addon_ggs_5.2.2.5.1-2.svg create mode 100644 backend/tests/data/svg/ean13_5addon_ggs_5.2.2.5.2-2.svg create mode 100644 backend/tests/data/svg/ean2.svg create mode 100644 backend/tests/data/svg/ean5.svg create mode 100644 backend/tests/data/svg/ean8_2addon.svg create mode 100644 backend/tests/data/svg/ean8_5addon.svg create mode 100644 backend/tests/data/svg/upca_2addon_ggs_5.2.6.6-5.svg create mode 100644 backend/tests/data/svg/upca_5addon.svg create mode 100644 backend/tests/data/svg/upce_2addon.svg create mode 100644 backend/tests/data/svg/upce_5addon.svg create mode 100755 backend/tests/tools/run_bwipp_tests.sh create mode 100644 backend/tools/gen_pwr928_table.php create mode 100644 frontend_qt/grpUPCA.ui create mode 100644 frontend_qt/grpUPCEAN.ui diff --git a/backend/2of5.c b/backend/2of5.c index c3c795d7..26ef5e4e 100644 --- a/backend/2of5.c +++ b/backend/2of5.c @@ -279,6 +279,13 @@ INTERNAL int itf14(struct zint_symbol *symbol, unsigned char source[], int lengt localstr[14] = '\0'; error_number = interleaved_two_of_five(symbol, (unsigned char *) localstr, strlen(localstr)); ustrcpy(symbol->text, localstr); + + symbol->output_options |= BARCODE_BOX; + if (symbol->border_width == 0) { /* Allow override if non-zero */ + /* GS1 General Specifications 20.0 Sections 5.3.2.4 & 5.3.6 (4.83 / 1.016 ~ 4.75) */ + symbol->border_width = 5; /* Note change from previous value 8 */ + } + return error_number; } diff --git a/backend/code128.c b/backend/code128.c index 814d96b8..65dae265 100644 --- a/backend/code128.c +++ b/backend/code128.c @@ -45,19 +45,18 @@ static const char *C128Table[107] = { /* Code 128 character encodation - Table 1 */ - "212222", "222122", "222221", "121223", "121322", "131222", "122213", - "122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222", - "123122", "123221", "223211", "221132", "221231", "213212", "223112", "312131", "311222", - "321122", "321221", "312212", "322112", "322211", "212123", "212321", "232121", "111323", - "131123", "131321", "112313", "132113", "132311", "211313", "231113", "231311", "112133", - "112331", "132131", "113123", "113321", "133121", "313121", "211331", "231131", "213113", - "213311", "213131", "311123", "311321", "331121", "312113", "312311", "332111", "314111", - "221411", "431111", "111224", "111422", "121124", "121421", "141122", "141221", "112214", - "112412", "122114", "122411", "142112", "142211", "241211", "221114", "413111", "241112", - "134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112", - "421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311", - "411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232", - "2331112" + /* 0 1 2 3 4 5 6 7 8 9 */ + "212222", "222122", "222221", "121223", "121322", "131222", "122213", "122312", "132212", "221213", /* 0 */ + "221312", "231212", "112232", "122132", "122231", "113222", "123122", "123221", "223211", "221132", /* 10 */ + "221231", "213212", "223112", "312131", "311222", "321122", "321221", "312212", "322112", "322211", /* 20 */ + "212123", "212321", "232121", "111323", "131123", "131321", "112313", "132113", "132311", "211313", /* 30 */ + "231113", "231311", "112133", "112331", "132131", "113123", "113321", "133121", "313121", "211331", /* 40 */ + "231131", "213113", "213311", "213131", "311123", "311321", "331121", "312113", "312311", "332111", /* 50 */ + "314111", "221411", "431111", "111224", "111422", "121124", "121421", "141122", "141221", "112214", /* 60 */ + "112412", "122114", "122411", "142112", "142211", "241211", "221114", "413111", "241112", "134111", /* 70 */ + "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112", "421211", "212141", /* 80 */ + "214121", "412121", "111143", "111341", "131141", "114113", "114311", "411113", "411311", "113141", /* 90 */ + "114131", "311141", "411131", "211412", "211214", "211232", "2331112" /*100 */ }; /* Determine appropriate mode for a given character */ diff --git a/backend/common.c b/backend/common.c index 8050bcfa..87ca6649 100644 --- a/backend/common.c +++ b/backend/common.c @@ -218,28 +218,22 @@ INTERNAL int is_stackable(const int symbology) { return 0; } -/* Indicates which symbols can have addon (EAN-2 and EAN-5) */ +/* Indicates which symbols can have addon (EAN-2 and EAN-5) + * Note: if change this must also change version in frontend/main.c */ INTERNAL int is_extendable(const int symbology) { - if (symbology == BARCODE_EANX || symbology == BARCODE_EANX_CHK) { - return 1; - } - if (symbology == BARCODE_UPCA || symbology == BARCODE_UPCA_CHK) { - return 1; - } - if (symbology == BARCODE_UPCE || symbology == BARCODE_UPCE_CHK) { - return 1; - } - if (symbology == BARCODE_ISBNX) { - return 1; - } - if (symbology == BARCODE_UPCA_CC) { - return 1; - } - if (symbology == BARCODE_UPCE_CC) { - return 1; - } - if (symbology == BARCODE_EANX_CC) { - return 1; + + switch (symbology) { + case BARCODE_EANX: + case BARCODE_EANX_CHK: + case BARCODE_UPCA: + case BARCODE_UPCA_CHK: + case BARCODE_UPCE: + case BARCODE_UPCE_CHK: + case BARCODE_ISBNX: + case BARCODE_EANX_CC: + case BARCODE_UPCA_CC: + case BARCODE_UPCE_CC: + return 1; } return 0; diff --git a/backend/composite.c b/backend/composite.c index 49f9f780..a7ecabc6 100644 --- a/backend/composite.c +++ b/backend/composite.c @@ -328,6 +328,7 @@ static int cc_b(struct zint_symbol *symbol, char source[], int cc_width) { char pattern[580]; int variant, LeftRAPStart, CentreRAPStart, RightRAPStart, StartCluster; int LeftRAP, CentreRAP, RightRAP, Cluster, loop; + int columns; length = strlen(source) / 8; @@ -445,10 +446,10 @@ static int cc_b(struct zint_symbol *symbol, char source[], int cc_width) { /* Now we have the variant we can load the data - from here on the same as MicroPDF417 code */ variant--; assert(variant >= 0); - symbol->option_2 = MicroVariants[variant]; /* columns */ + columns = MicroVariants[variant]; /* columns */ symbol->rows = MicroVariants[variant + 34]; /* rows */ k = MicroVariants[variant + 68]; /* number of EC CWs */ - longueur = (symbol->option_2 * symbol->rows) - k; /* number of non-EC CWs */ + longueur = (columns * symbol->rows) - k; /* number of non-EC CWs */ i = longueur - mclength; /* amount of padding required */ offset = MicroVariants[variant + 102]; /* coefficient offset */ @@ -506,8 +507,8 @@ static int cc_b(struct zint_symbol *symbol, char source[], int cc_width) { for (j = 0; j < 5; j++) { dummy[j] = 0; } - for (j = 0; j < symbol->option_2; j++) { - dummy[j + 1] = chainemc[i * symbol->option_2 + j]; + for (j = 0; j < columns; j++) { + dummy[j + 1] = chainemc[i * columns + j]; } /* Copy the data into codebarre */ bin_append(rap_side[LeftRAP - 1], 10, pattern); diff --git a/backend/large.c b/backend/large.c index 6f7d7af5..45b53f8b 100644 --- a/backend/large.c +++ b/backend/large.c @@ -244,7 +244,7 @@ INTERNAL void large_unset_bit(large_int *t, int bit) { } } -/* Ouput large_int into an unsigned int array of size `size`, each element containing `bits` bits */ +/* Output large_int into an unsigned int array of size `size`, each element containing `bits` bits */ INTERNAL void large_uint_array(const large_int *t, unsigned int *uint_array, int size, int bits) { int i, j; uint64_t mask; diff --git a/backend/library.c b/backend/library.c index a9714af0..3576b6ee 100644 --- a/backend/library.c +++ b/backend/library.c @@ -672,14 +672,6 @@ static int reduced_charset(struct zint_symbol *symbol, const unsigned char *sour unsigned char* preprocessed = (unsigned char*) _alloca(in_length + 1); #endif - if (symbol->symbology == BARCODE_ITF14) { - symbol->whitespace_width = 20; - symbol->border_width = 8; - if (!(symbol->output_options & BARCODE_BOX)) { - symbol->output_options += BARCODE_BOX; - } - } - switch (symbol->input_mode & 0x07) { case DATA_MODE: case GS1_MODE: diff --git a/backend/output.c b/backend/output.c index 07c98858..b7bd48e8 100644 --- a/backend/output.c +++ b/backend/output.c @@ -30,14 +30,13 @@ */ /* vim: set ts=4 sw=4 et : */ -#include #include "common.h" #include "output.h" #define SSET "0123456789ABCDEF" /* Check colour options are good. Note: using raster.c error nos 651-654 */ -INTERNAL int check_colour_options(struct zint_symbol *symbol) { +INTERNAL int output_check_colour_options(struct zint_symbol *symbol) { int error_number; if (strlen(symbol->fgcolour) != 6) { @@ -68,32 +67,346 @@ INTERNAL int check_colour_options(struct zint_symbol *symbol) { } /* Return minimum quiet zones for each symbology */ -static void quiet_zones(struct zint_symbol *symbol, int *left, int *right, int *top, int *bottom) { +static int quiet_zones(struct zint_symbol *symbol, int *left, int *right, int *top, int *bottom) { + int done = 0; + *left = *right = *top = *bottom = 0; + /* These always have quiet zones set (previously used whitespace_width) */ switch (symbol->symbology) { case BARCODE_CODE16K: - /* BS EN 12323:2005 Section 4.5 c) */ + /* BS EN 12323:2005 Section 4.5 (c) */ *left = 10; *right = 1; + done = 1; break; case BARCODE_CODE49: /* ANSI/AIM BC6-2000 Section 2.4 */ *left = 10; *right = 1; + done = 1; break; case BARCODE_CODABLOCKF: case BARCODE_HIBC_BLOCKF: /* AIM ISS-X-24 Section 4.6.1 */ *left = 10; *right = 10; + done = 1; + break; + case BARCODE_ITF14: + /* GS1 General Specifications 20.0 Section 5.3.2.2 */ + *left = 10; + *right = 10; + done = 1; + break; + case BARCODE_EANX: + case BARCODE_EANX_CHK: + case BARCODE_EANX_CC: + case BARCODE_ISBNX: + /* GS1 General Specifications 20.0 Section 5.2.3.4 */ + switch (ustrlen(symbol->text)) { + case 13: /* EAN-13 */ + *left = 11; + *right = 7; + break; + case 16: /* EAN-13/ISBN + 2 digit addon */ + case 19: /* EAN-13/ISBN + 5 digit addon */ + *left = 11; + *right = 5; + break; + case 5: /* EAN-5 addon */ + case 2: /* EAN-2 addon */ + *left = 7; + *right = 5; + break; + default: /* EAN-8 (+/- 2/5 digit addon) */ + *left = 7; + *right = 7; + break; + } + done = 1; + break; + case BARCODE_UPCA: + case BARCODE_UPCA_CHK: + case BARCODE_UPCA_CC: + /* GS1 General Specifications 20.0 Section 5.2.3.4 */ + *left = 9; + if (ustrlen(symbol->text) > 12) { /* UPC-A + addon */ + *right = 5; + } else { + *right = 9; + } + done = 1; + break; + case BARCODE_UPCE: + case BARCODE_UPCE_CHK: + case BARCODE_UPCE_CC: + /* GS1 General Specifications 20.0 Section 5.2.3.4 */ + *left = 9; + if (ustrlen(symbol->text) > 8) { /* UPC-E + addon */ + *right = 5; + } else { + *right = 7; + } + done = 1; break; - /* TODO: others */ } + + if (done) { + return done; + } + + /* Only do others if flag set TODO: finish */ +#if 0 + if (!(symbol->output_options & BARCODE_QUIET_ZONES)) { + return done; + } +#else + return done; +#endif + + switch (symbol->symbology) { + case BARCODE_CODE11: + /* TODO */ + break; + + case BARCODE_C25MATRIX: + case BARCODE_C25INTER: + case BARCODE_C25IATA: + case BARCODE_C25LOGIC: + case BARCODE_C25IND: + *left = *right = 10; // Probably this TODO: check + done = 1; + break; + + case BARCODE_CODE39: + case BARCODE_EXCODE39: + case BARCODE_LOGMARS: + case BARCODE_PZN: + case BARCODE_VIN: + case BARCODE_HIBC_39: + case BARCODE_CODE32: + /* ISO/IEC 16388:2007 Section 4.4 (d) */ + *left = *right = 10; + done = 1; + break; + case BARCODE_EAN128: /* GS1-128 */ + case BARCODE_EAN128_CC: + case BARCODE_EAN14: + /* GS1 General Specifications 20.0 Section 5.4.4.2 */ + *left = *right = 10; + done = 1; + break; + case BARCODE_CODABAR: + /* BS EN 798:1995 Section 4.4.1 (d) */ + *left = *right = 10; + done = 1; + break; + case BARCODE_CODE128: + case BARCODE_CODE128B: + case BARCODE_HIBC_128: + case BARCODE_NVE18: + /* ISO/IEC 15417:2007 4.4.2 */ + *left = *right = 10; + done = 1; + break; + + case BARCODE_DPLEIT: + case BARCODE_DPIDENT: + /* TODO */ + break; + + case BARCODE_CODE93: + /* TODO */ + break; + + case BARCODE_FLAT: + /* TODO */ + break; + + case BARCODE_RSS14: /* GS1 Databar Omnidirectional */ + case BARCODE_RSS_LTD: /* GS1 Databar Limited */ + case BARCODE_RSS_EXP: /* GS1 Databar Expanded */ + case BARCODE_RSS14STACK: /* GS1 DataBar Stacked */ + case BARCODE_RSS14STACK_OMNI: /* GS1 DataBar Stacked Omnidirectional */ + case BARCODE_RSS_EXPSTACK: /* GS1 Databar Expanded Stacked */ + /* GS1 General Specifications 20.0 Section 5.5.1.1 - Quiet Zones: None required */ + *left = *right = 0; + done = 1; + break; + case BARCODE_RSS14_CC: + case BARCODE_RSS_LTD_CC: + case BARCODE_RSS_EXP_CC: + case BARCODE_RSS14STACK_CC: + case BARCODE_RSS14_OMNI_CC: + case BARCODE_RSS_EXPSTACK_CC: + /* GS1 General Specifications 20.0 Sections 5.9.2.1 (CC-A) & 5.9.2.2 (CC-B) */ + *left = *right = 1; + done = 1; + break; + + case BARCODE_TELEPEN: + case BARCODE_TELEPEN_NUM: + /* TODO */ + break; + + case BARCODE_POSTNET: + case BARCODE_PLANET: + /* Archived DMM C840 (Dec 09, 2004) left/right 0.125" ~ 6X, top/bottom 0.04" ~ 2X */ + *left = *right = 6; // TODO: Proper inch to X calc + *top = *bottom = 2; // TODO: Proper inch to X calc + done = 1; + break; + + case BARCODE_MSI_PLESSEY: + /* TODO */ + break; + + case BARCODE_FIM: + /* TODO */ + break; + + case BARCODE_PHARMA: + case BARCODE_PHARMA_TWO: + /* TODO */ + break; + + case BARCODE_PDF417: + case BARCODE_PDF417TRUNC: + case BARCODE_HIBC_PDF: + /* ISO/IEC 15438:2015 Section 5.8.3 */ + *left = *right = *top = *bottom = 2; + done = 1; + break; + case BARCODE_MICROPDF417: + case BARCODE_HIBC_MICPDF: + /* ISO/IEC 24728:2006 Section 5.8.3 */ + *left = *right = *top = *bottom = 1; + done = 1; + break; + case BARCODE_MAXICODE: + /* ISO/IEC 16023:2000 Section 4.11.5 */ + *left = *right = *top = *bottom = 1; + done = 1; + break; + case BARCODE_QRCODE: + case BARCODE_UPNQR: + case BARCODE_HIBC_QR: + /* ISO/IEC 18004:2015 Section 9.1 */ + *left = *right = *top = *bottom = 4; + done = 1; + break; + case BARCODE_MICROQR: + /* ISO/IEC 18004:2015 Section 9.1 */ + *left = *right = *top = *bottom = 2; + done = 1; + break; + case BARCODE_RMQR: + /* ISO/IEC JTC1/SC31N000 Section 6.3.10 */ + *left = *right = *top = *bottom = 2; + done = 1; + break; + case BARCODE_AUSPOST: + case BARCODE_AUSREPLY: + case BARCODE_AUSROUTE: + case BARCODE_AUSREDIRECT: + /* Customer Barcode Technical Specifications (2012) left/right 6mm ~ 6X, top/bottom 2mm ~ 2X */ + *left = *right = 6; // TODO: Proper mm to X calc + *top = *bottom = 2; // TODO: Proper mm to X calc + done = 1; + break; + + case BARCODE_RM4SCC: + /* TODO */ + break; + + case BARCODE_DATAMATRIX: + case BARCODE_HIBC_DM: + /* ISO/IEC 16022:2006 Section 7.1 */ + *left = *right = *top = *bottom = 1; + done = 1; + break; + + case BARCODE_JAPANPOST: + /* TODO */ + break; + + case BARCODE_KOREAPOST: + /* TODO */ + break; + + case BARCODE_ONECODE: + /* USPS-B-3200 (2015) Section 2.3.2 left/right 0.125" ~ 6X, top/bottom 0.026" ~ 1X */ + *left = *right = 6; // TODO: Proper inch to X calc + *top = *bottom = 1; // TODO: Proper inch to X calc + done = 1; + break; + + case BARCODE_PLESSEY: + /* TODO */ + break; + + case BARCODE_KIX: + /* Handleiding KIX code brochure left/right/top/bottom 2mm ~ 2X */ + *left = *right = *top = *bottom = 2; // TODO: Proper mm to X calc + done = 1; + break; + case BARCODE_AZTEC: + case BARCODE_HIBC_AZTEC: + case BARCODE_AZRUNE: + /* ISO/IEC 24778:2008 Section 4.1 (c) & Annex A.1 (Rune) - no quiet zone required */ + done = 1; + break; + + case BARCODE_DAFT: + /* TODO */ + break; + + case BARCODE_DOTCODE: + /* ISS DotCode Rev. 4.0 Section 4.1 (3) (c) */ + *left = *right = *top = *bottom = 3; + done = 1; + break; + case BARCODE_HANXIN: + /* ISO/IEC DIS 20830:2019 Section 4.2.8 (also Section 6.2) */ + *left = *right = *top = *bottom = 3; + done = 1; + break; + + case BARCODE_MAILMARK: + /* User Guide left/right/top/bottom 2mm ~ 2X */ + *left = *right = *top = *bottom = 2; // TODO: Proper mm to X calc + done = 1; + break; + + case BARCODE_CHANNEL: + /* ANSI/AIM BC12-1998 Section 4.4 (c) */ + *left = 1; + *right = 2; + done = 1; + break; + + case BARCODE_CODEONE: + /* TODO */ + break; + + case BARCODE_GRIDMATRIX: + /* AIMD014 (v 1.63) Section 7.1 */ + *left = *right = *top = *bottom = 6; + done = 1; + break; + case BARCODE_ULTRA: + /* AIMD/TSC15032-43 (v 0.99c) Section 9.2 */ + *left = *right = *top = *bottom = 1; + done = 1; + break; + } + + return done; /* For self-checking */ } /* Set left (x), top (y), right and bottom offsets for whitespace */ -INTERNAL void set_whitespace_offsets(struct zint_symbol *symbol, int *xoffset, int *yoffset, int *roffset, int *boffset) { +INTERNAL void output_set_whitespace_offsets(struct zint_symbol *symbol, int *xoffset, int *yoffset, int *roffset, int *boffset) { int qz_left, qz_right, qz_top, qz_bottom; quiet_zones(symbol, &qz_left, &qz_right, &qz_top, &qz_bottom); @@ -112,3 +425,163 @@ INTERNAL void set_whitespace_offsets(struct zint_symbol *symbol, int *xoffset, i *boffset += symbol->border_width; } } + +/* Set composite offset and main width excluding addon (for start of addon calc) and addon text, returning UPC/EAN type */ +INTERNAL int output_process_upcean(struct zint_symbol *symbol, int *p_main_width, int *p_comp_offset, unsigned char addon[6], int *p_addon_gap) { + int main_width; /* Width of main linear symbol, excluding addon */ + int comp_offset; /* Whitespace offset (if any) of main linear symbol due to having composite */ + int upceanflag; /* UPC/EAN type flag */ + int i, j, latch; + int text_length = ustrlen(symbol->text); + + latch = 0; + j = 0; + /* Isolate add-on text */ + for (i = 6; i < text_length && j < 5; i++) { + if (latch == 1) { + addon[j] = symbol->show_hrt ? symbol->text[i] : ' '; /* Use dummy space-filled addon if no hrt */ + j++; + } else if (symbol->text[i] == '+') { + latch = 1; + } + } + addon[j] = '\0'; + if (latch) { + if (symbol->symbology == BARCODE_UPCA || symbol->symbology == BARCODE_UPCA_CHK || symbol->symbology == BARCODE_UPCA_CC) { + *p_addon_gap = symbol->option_2 >= 9 && symbol->option_2 <= 12 ? symbol->option_2 : 9; + } else { + *p_addon_gap = symbol->option_2 >= 7 && symbol->option_2 <= 12 ? symbol->option_2 : 7; + } + } + + /* Calculate composite offset */ + comp_offset = 0; + if (is_composite(symbol->symbology)) { + while (!(module_is_set(symbol, symbol->rows - 1, comp_offset))) { + comp_offset++; + } + } + + upceanflag = 0; + main_width = symbol->width; + if ((symbol->symbology == BARCODE_EANX) || (symbol->symbology == BARCODE_EANX_CHK) + || (symbol->symbology == BARCODE_EANX_CC) || (symbol->symbology == BARCODE_ISBNX)) { + switch (text_length) { + case 13: /* EAN-13 */ + case 16: /* EAN-13 + EAN-2 */ + case 19: /* EAN-13 + EAN-5 */ + main_width = 95 + comp_offset; /* EAN-13 main symbol 95 modules wide */ + upceanflag = 13; + break; + case 2: + /* EAN-2 can't have addon or be composite */ + upceanflag = 2; + break; + case 5: + /* EAN-5 can't have addon or be composite */ + upceanflag = 5; + break; + default: + main_width = 68 + comp_offset; /* EAN-8 main symbol 68 modules wide */ + upceanflag = 8; + break; + } + } else if ((symbol->symbology == BARCODE_UPCA) || (symbol->symbology == BARCODE_UPCA_CHK) + || (symbol->symbology == BARCODE_UPCA_CC)) { + main_width = 95 + comp_offset; /* UPC-A main symbol 95 modules wide */ + upceanflag = 12; + } else if ((symbol->symbology == BARCODE_UPCE) || (symbol->symbology == BARCODE_UPCE_CHK) + || (symbol->symbology == BARCODE_UPCE_CC)) { + main_width = 51 + comp_offset; /* UPC-E main symbol 51 modules wide */ + upceanflag = 6; + } + + *p_comp_offset = comp_offset; + *p_main_width = main_width; + + return upceanflag; +} + +/* Calculate large bar height i.e. linear bars */ +INTERNAL double output_large_bar_height(struct zint_symbol *symbol) { + int i, large_bar_count, preset_height; + double large_bar_height; + + large_bar_count = 0; + preset_height = 0; + for (i = 0; i < symbol->rows; i++) { + preset_height += symbol->row_height[i]; + if (symbol->row_height[i] == 0) { + large_bar_count++; + } + } + + if (large_bar_count) { + large_bar_height = (double) (symbol->height - preset_height) / large_bar_count; + } else { + large_bar_height = 0.0; /* Not used if large_bar_count zero */ + } + + return large_bar_height; +} + +/* Split UPC/EAN add-on text into various constituents */ +INTERNAL void output_upcean_split_text(int upceanflag, unsigned char text[], + unsigned char textpart1[5], unsigned char textpart2[7], unsigned char textpart3[7], unsigned char textpart4[2]) { + int i; + + if (upceanflag == 6) { /* UPC-E */ + textpart1[0] = text[0]; + textpart1[1] = '\0'; + + for (i = 0; i < 6; i++) { + textpart2[i] = text[i + 1]; + } + textpart2[6] = '\0'; + + textpart3[0] = text[7]; + textpart3[1] = '\0'; + + } else if (upceanflag == 8) { /* EAN-8 */ + for (i = 0; i < 4; i++) { + textpart1[i] = text[i]; + } + textpart1[4] = '\0'; + + for (i = 0; i < 4; i++) { + textpart2[i] = text[i + 4]; + } + textpart2[4] = '\0'; + + } else if (upceanflag == 12) { /* UPC-A */ + textpart1[0] = text[0]; + textpart1[1] = '\0'; + + for (i = 0; i < 5; i++) { + textpart2[i] = text[i + 1]; + } + textpart2[5] = '\0'; + + for (i = 0; i < 5; i++) { + textpart3[i] = text[i + 6]; + } + textpart3[5] = '\0'; + + textpart4[0] = text[11]; + textpart4[1] = '\0'; + + } else if (upceanflag == 13) { /* EAN-13 */ + textpart1[0] = text[0]; + textpart1[1] = '\0'; + + for (i = 0; i < 6; i++) { + textpart2[i] = text[i + 1]; + } + textpart2[6] = '\0'; + + for (i = 0; i < 6; i++) { + textpart3[i] = text[i + 7]; + } + textpart3[6] = '\0'; + } +} diff --git a/backend/output.h b/backend/output.h index 7e5ecd6c..0bb05988 100644 --- a/backend/output.h +++ b/backend/output.h @@ -37,8 +37,12 @@ extern "C" { #endif /* __cplusplus */ -INTERNAL int check_colour_options(struct zint_symbol *symbol); -INTERNAL void set_whitespace_offsets(struct zint_symbol *symbol, int *xoffset, int *yoffset, int *roffset, int *boffset); +INTERNAL int output_check_colour_options(struct zint_symbol *symbol); +INTERNAL void output_set_whitespace_offsets(struct zint_symbol *symbol, int *xoffset, int *yoffset, int *roffset, int *boffset); +INTERNAL int output_process_upcean(struct zint_symbol *symbol, int *p_main_width, int *p_comp_offset, unsigned char addon[6], int *p_addon_gap); +INTERNAL double output_large_bar_height(struct zint_symbol *symbol); +INTERNAL void output_upcean_split_text(int upceanflag, unsigned char text[], + unsigned char textpart1[], unsigned char textpart2[], unsigned char textpart3[], unsigned char textpart4[]); #ifdef __cplusplus } diff --git a/backend/raster.c b/backend/raster.c index 434ab8f5..3af6ba2d 100644 --- a/backend/raster.c +++ b/backend/raster.c @@ -36,7 +36,7 @@ #include #include #endif -#include +#include #include "common.h" #include "output.h" @@ -46,7 +46,7 @@ #include "font.h" /* Font for human readable text */ -#define SSET "0123456789ABCDEF" +#define SSET "0123456789ABCDEF" #define DEFAULT_INK '1' #define DEFAULT_PAPER '0' @@ -66,6 +66,7 @@ static int buffer_plot(struct zint_symbol *symbol, char *pixelbuf) { int fgred, fggrn, fgblu, bgred, bggrn, bgblu; int row, column, i; + /* Free any previous bitmap */ if (symbol->bitmap != NULL) { free(symbol->bitmap); symbol->bitmap = NULL; @@ -137,7 +138,6 @@ static int buffer_plot(struct zint_symbol *symbol, char *pixelbuf) { symbol->bitmap[i + 1] = bggrn; symbol->bitmap[i + 2] = bgblu; break; - } } } @@ -251,7 +251,7 @@ static void draw_bar(char *pixelbuf, int xpos, int xlen, int ypos, int ylen, int } } -static void draw_circle(char *pixelbuf, int image_width, int image_height, int x0, int y0, float radius, char fill) { +static void draw_circle(char *pixelbuf, int image_width, int image_height, int x0, int y0, double radius, char fill) { int x, y; int radius_i = (int) radius; @@ -269,8 +269,8 @@ static void draw_circle(char *pixelbuf, int image_width, int image_height, int x static void draw_bullseye(char *pixelbuf, int image_width, int image_height, int xoffset, int yoffset, int scaler) { /* Central bullseye in Maxicode symbols */ - float x = 14.5 * scaler; - float y = 15.0 * scaler; + double x = 14.5 * scaler; + double y = 15.0 * scaler; if(scaler < 10) { x = 16.0 * scaler; y = 16.5 * scaler; @@ -415,7 +415,7 @@ static void draw_letter(char *pixelbuf, unsigned char letter, int xposn, int ypo } /* Plot a string into the pixel buffer */ -static void draw_string(char *pixbuf, char input_string[], int xposn, int yposn, int textflags, int image_width, int image_height) { +static void draw_string(char *pixbuf, unsigned char input_string[], int xposn, int yposn, int textflags, int image_width, int image_height) { int i, string_length, string_left_hand, letter_width = 7; switch (textflags) { @@ -432,27 +432,25 @@ static void draw_string(char *pixbuf, char input_string[], int xposn, int yposn, break; } - string_length = strlen(input_string); + string_length = ustrlen(input_string); string_left_hand = xposn - ((letter_width * string_length) / 2); for (i = 0; i < string_length; i++) { - // NOLINTNEXTLINE(clang-analyzer-core.CallAndMessage) suppress false positive about 2nd arg input_string[i] being uninitialized draw_letter(pixbuf, input_string[i], string_left_hand + (i * letter_width), yposn, textflags, image_width, image_height); } - } -static void plot_hexline(char *scaled_hexagon, int hexagon_size, float start_x, float start_y, float end_x, float end_y) { +static void plot_hexline(char *scaled_hexagon, int hexagon_size, double start_x, double start_y, double end_x, double end_y) { /* Draw a straight line from start to end */ int i; - float inc_x, inc_y; + double inc_x, inc_y; inc_x = (end_x - start_x) / hexagon_size; inc_y = (end_y - start_y) / hexagon_size; for (i = 0; i < hexagon_size; i++) { - float this_x = start_x + ((float)i * inc_x); - float this_y = start_y + ((float)i * inc_y); + double this_x = start_x + (i * inc_x); + double this_y = start_y + (i * inc_y); if (((this_x >= 0) && (this_x < hexagon_size)) && ((this_y >= 0) && (this_y < hexagon_size))) { scaled_hexagon[(hexagon_size * (int)this_y) + (int)this_x] = DEFAULT_INK; } @@ -463,10 +461,10 @@ static void plot_hexagon(char *scaled_hexagon, int hexagon_size) { /* Create a hexagon shape and fill it */ int line, i; - float x_offset[6]; - float y_offset[6]; - float start_x, start_y; - float end_x, end_y; + double x_offset[6]; + double y_offset[6]; + double start_x, start_y; + double end_x, end_y; x_offset[0] = 0.0; x_offset[1] = 0.86; @@ -484,16 +482,16 @@ static void plot_hexagon(char *scaled_hexagon, int hexagon_size) { /* Plot hexagon outline */ for (line = 0; line < 5; line++) { - start_x = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * x_offset[line]); - start_y = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * y_offset[line]); - end_x = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * x_offset[line + 1]); - end_y = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * y_offset[line + 1]); + start_x = (hexagon_size / 2.0) + ((hexagon_size / 2.0) * x_offset[line]); + start_y = (hexagon_size / 2.0) + ((hexagon_size / 2.0) * y_offset[line]); + end_x = (hexagon_size / 2.0) + ((hexagon_size / 2.0) * x_offset[line + 1]); + end_y = (hexagon_size / 2.0) + ((hexagon_size / 2.0) * y_offset[line + 1]); plot_hexline(scaled_hexagon, hexagon_size, start_x, start_y, end_x, end_y); } - start_x = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * x_offset[line]); - start_y = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * y_offset[line]); - end_x = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * x_offset[0]); - end_y = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * y_offset[0]); + start_x = (hexagon_size / 2.0) + ((hexagon_size / 2.0) * x_offset[line]); + start_y = (hexagon_size / 2.0) + ((hexagon_size / 2.0) * y_offset[line]); + end_x = (hexagon_size / 2.0) + ((hexagon_size / 2.0) * x_offset[0]); + end_y = (hexagon_size / 2.0) + ((hexagon_size / 2.0) * y_offset[0]); plot_hexline(scaled_hexagon, hexagon_size, start_x, start_y, end_x, end_y); /* Fill hexagon */ @@ -523,7 +521,7 @@ static int plot_raster_maxicode(struct zint_symbol *symbol, int rotate_angle, in int error_number; int xoffset, yoffset; int roffset, boffset; - float scaler = symbol->scale; + double scaler = symbol->scale; char *scaled_hexagon; int hexagon_size; @@ -531,10 +529,10 @@ static int plot_raster_maxicode(struct zint_symbol *symbol, int rotate_angle, in scaler = 0.5; } - set_whitespace_offsets(symbol, &xoffset, &yoffset, &roffset, &boffset); + output_set_whitespace_offsets(symbol, &xoffset, &yoffset, &roffset, &boffset); - image_width = (300 + 2 * (xoffset + roffset)) * scaler; - image_height = (300 + 2 * (yoffset + boffset)) * scaler; + image_width = ceil((300 + 2 * (xoffset + roffset)) * scaler); + image_height = ceil((300 + 2 * (yoffset + boffset)) * scaler); if (!(pixelbuf = (char *) malloc(image_width * image_height))) { strcpy(symbol->errtxt, "655: Insufficient memory for pixel buffer"); @@ -542,7 +540,7 @@ static int plot_raster_maxicode(struct zint_symbol *symbol, int rotate_angle, in } memset(pixelbuf, DEFAULT_PAPER, image_width * image_height); - hexagon_size = (int)(scaler * 10); + hexagon_size = ceil(scaler * 10); if (!(scaled_hexagon = (char *) malloc(hexagon_size * hexagon_size))) { strcpy(symbol->errtxt, "656: Insufficient memory for pixel buffer"); @@ -593,47 +591,9 @@ static int plot_raster_maxicode(struct zint_symbol *symbol, int rotate_angle, in return error_number; } -/* Convert UTF-8 to Latin1 Codepage for the interpretation line */ -static void to_latin1(unsigned char source[], unsigned char preprocessed[]) { - int j, i, input_length; - - input_length = ustrlen(source); - - j = 0; - i = 0; - while (i < input_length) { - switch (source[i]) { - case 0xC2: - /* UTF-8 C2xxh */ - /* Character range: C280h (latin: 80h) to C2BFh (latin: BFh) */ - i++; - preprocessed[j] = source[i]; - j++; - break; - case 0xC3: - /* UTF-8 C3xx */ - /* Character range: C380h (latin: C0h) to C3BFh (latin: FFh) */ - i++; - preprocessed[j] = source[i] + 64; - j++; - break; - default: - /* Process ASCII (< 80h), all other unicode points are ignored */ - if (source[i] < 128) { - preprocessed[j] = source[i]; - j++; - } - break; - } - i++; - } - preprocessed[j] = '\0'; - - return; -} - static int plot_raster_dotty(struct zint_symbol *symbol, int rotate_angle, int data_type) { - float scaler = 2 * symbol->scale; + double scaler = 2 * symbol->scale; + double half_scaler, dot_size_scaled; char *scaled_pixelbuf; int r, i; int scale_width, scale_height; @@ -643,7 +603,7 @@ static int plot_raster_dotty(struct zint_symbol *symbol, int rotate_angle, int d symbol->height = symbol->rows; // This is true because only 2d matrix symbols are processed here - set_whitespace_offsets(symbol, &xoffset, &yoffset, &roffset, &boffset); + output_set_whitespace_offsets(symbol, &xoffset, &yoffset, &roffset, &boffset); image_width = symbol->width + xoffset + roffset; image_height = symbol->height + yoffset + boffset; @@ -662,13 +622,16 @@ static int plot_raster_dotty(struct zint_symbol *symbol, int rotate_angle, int d memset(scaled_pixelbuf, DEFAULT_PAPER, scale_width * scale_height); /* Plot the body of the symbol to the pixel buffer */ + half_scaler = scaler / 2.0; + dot_size_scaled = (symbol->dot_size * scaler) / 2.0; for (r = 0; r < symbol->rows; r++) { + double row_scaled = (r + yoffset) * scaler + half_scaler; for (i = 0; i < symbol->width; i++) { if (module_is_set(symbol, r, i)) { draw_circle(scaled_pixelbuf, scale_width, scale_height, - (int) ((i + xoffset) * scaler) + (scaler / 2.0), - (int) ((r + yoffset) * scaler) + (scaler / 2.0), - (symbol->dot_size / 2.0) * scaler, + (i + xoffset) * scaler + half_scaler, + row_scaled, + dot_size_scaled, DEFAULT_INK); } } @@ -681,139 +644,61 @@ static int plot_raster_dotty(struct zint_symbol *symbol, int rotate_angle, int d } static int plot_raster_default(struct zint_symbol *symbol, int rotate_angle, int data_type) { - int textdone, main_width, comp_offset, large_bar_count; - char textpart[10], addon[6]; - float addon_text_posn, preset_height, large_bar_height; - int i, r, textoffset, yoffset, xoffset, latch, image_width, image_height; - int roffset, boffset; - char *pixelbuf; - int addon_latch = 0, textflags = 0; - int block_width, textpos; - float row_height, row_posn; int error_number; + double large_bar_height; + int textdone; + int main_width, comp_offset, addon_gap; + unsigned char addon[6]; + int xoffset, yoffset, roffset, boffset; + double addon_text_posn; + int textoffset; int default_text_posn; + double row_height, row_posn; + int upceanflag = 0; + int addon_latch = 0; + unsigned char textpart1[5], textpart2[7], textpart3[7], textpart4[2]; + int textpos; + int hide_text = 0; + int i, r; + + int textflags = 0; + int image_width, image_height; + char *pixelbuf; int next_yposn; - float scaler = symbol->scale; + int latch; + int block_width; + double scaler = symbol->scale; + int scale_width, scale_height; char *scaled_pixelbuf; int horiz, vert; - int scale_width, scale_height; -#ifndef _MSC_VER - unsigned char local_text[ustrlen(symbol->text) + 1]; -#else - unsigned char* local_text = (unsigned char*) _alloca(ustrlen(symbol->text) + 1); -#endif - - if (symbol->show_hrt != 0) { - /* Copy text from symbol */ - to_latin1(symbol->text, local_text); - } else { - /* No text needed */ - if (is_extendable(symbol->symbology)) { - /* For these symbols use dummy text to ensure formatting is done - * properly even if no text is required */ - for (i = 0; i < (int) ustrlen(symbol->text); i++) { - if (symbol->text[i] == '+') { - local_text[i] = '+'; - } else { - local_text[i] = ' '; - } - } - local_text[ustrlen(symbol->text)] = '\0'; - } else { - /* For everything else, just remove the text */ - memset(local_text, 0, ustrlen(symbol->text) + 1); /* Note using memset() here to suppress clang-tidy false positives */ - } - } + large_bar_height = output_large_bar_height(symbol); textdone = 0; + main_width = symbol->width; comp_offset = 0; + + if (is_extendable(symbol->symbology)) { + upceanflag = output_process_upcean(symbol, &main_width, &comp_offset, addon, &addon_gap); + } + + output_set_whitespace_offsets(symbol, &xoffset, &yoffset, &roffset, &boffset); + addon_text_posn = 0.0; + hide_text = ((!symbol->show_hrt) || (ustrlen(symbol->text) == 0)); + if (symbol->output_options & SMALL_TEXT) { textflags = 1; } else if (symbol->output_options & BOLD_TEXT) { textflags = 2; } - if (symbol->height == 0) { - symbol->height = 50; - } - - large_bar_count = 0; - preset_height = 0.0; - for (i = 0; i < symbol->rows; i++) { - preset_height += symbol->row_height[i]; - if (symbol->row_height[i] == 0) { - large_bar_count++; - } - } - - if (large_bar_count == 0) { - symbol->height = preset_height; - large_bar_height = 10; - } else { - large_bar_height = (symbol->height - preset_height) / large_bar_count; - } - - if (is_composite(symbol->symbology)) { - while (!(module_is_set(symbol, symbol->rows - 1, comp_offset))) { - comp_offset++; - } - } - - /* Certain symbols need whitespace otherwise characters get chopped off the sides */ - if ((symbol->symbology == BARCODE_EANX) || (symbol->symbology == BARCODE_EANX_CHK) - || (symbol->symbology == BARCODE_EANX_CC) || (symbol->symbology == BARCODE_ISBNX)) { - switch (ustrlen(local_text)) { - case 13: /* EAN 13 */ - case 16: - case 19: - if (symbol->whitespace_width == 0) { - symbol->whitespace_width = 10; - } - main_width = 96 + comp_offset; - break; - default: - main_width = 68 + comp_offset; - } - } else if ((symbol->symbology == BARCODE_UPCA) || (symbol->symbology == BARCODE_UPCA_CHK) - || (symbol->symbology == BARCODE_UPCA_CC)) { - if (symbol->whitespace_width == 0) { - symbol->whitespace_width = 10; - } - main_width = 96 + comp_offset; - } else if ((symbol->symbology == BARCODE_UPCE) || (symbol->symbology == BARCODE_UPCE_CHK) - || (symbol->symbology == BARCODE_UPCE_CC)) { - if (symbol->whitespace_width == 0) { - symbol->whitespace_width = 10; - } - main_width = 51 + comp_offset; - } - - latch = 0; - r = 0; - /* Isolate add-on text */ - if (is_extendable(symbol->symbology)) { - for (i = 0; i < (int) ustrlen(local_text); i++) { - if (latch == 1) { - addon[r] = local_text[i]; - r++; - } - if (symbol->text[i] == '+') { - latch = 1; - } - } - } - addon[r] = '\0'; - - if (ustrlen(local_text) != 0) { + if (ustrlen(symbol->text) != 0) { textoffset = 9; } else { textoffset = 0; } - set_whitespace_offsets(symbol, &xoffset, &yoffset, &roffset, &boffset); - image_width = 2 * (symbol->width + xoffset + roffset); image_height = 2 * (symbol->height + textoffset + yoffset + boffset); @@ -825,9 +710,9 @@ static int plot_raster_default(struct zint_symbol *symbol, int rotate_angle, int default_text_posn = image_height - 17; + row_height = 0.0; row_posn = textoffset + yoffset; next_yposn = textoffset + yoffset; - row_height = 0; /* Plot the body of the symbol to the pixel buffer */ for (r = 0; r < symbol->rows; r++) { @@ -855,9 +740,13 @@ static int plot_raster_default(struct zint_symbol *symbol, int rotate_angle, int } while ((i + block_width < symbol->width) && module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i)); if ((addon_latch == 0) && (r == 0) && (i > main_width)) { - plot_height = (int) (row_height - 5.0); - plot_yposn = (int) (row_posn - 5.0); - addon_text_posn = row_posn + row_height - 8.0; + if (upceanflag == 12 || upceanflag == 6) { /* UPC-A/E add-ons don't descend */ + plot_height = row_height > 8.0 ? row_height - 8.0 : 1; + plot_yposn = row_posn; + } else { + plot_height = row_height > 3.0 ? row_height - 3.0 : 1; + plot_yposn = row_posn - 5; + } addon_latch = 1; } if (module_fill) { @@ -875,193 +764,161 @@ static int plot_raster_default(struct zint_symbol *symbol, int rotate_angle, int xoffset += comp_offset; - if ((symbol->symbology == BARCODE_EANX) || (symbol->symbology == BARCODE_EANX_CHK) - || (symbol->symbology == BARCODE_EANX_CC) || (symbol->symbology == BARCODE_ISBNX)) { - /* guard bar extensions and text formatting for EAN8 and EAN13 */ - switch (ustrlen(local_text)) { - case 8: /* EAN-8 */ - case 11: - case 14: - draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - draw_bar(pixelbuf, (32 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - draw_bar(pixelbuf, (34 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - draw_bar(pixelbuf, (64 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - draw_bar(pixelbuf, (66 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - for (i = 0; i < 4; i++) { - textpart[i] = local_text[i]; - } - textpart[4] = '\0'; - textpos = 2 * (17 + xoffset); + if (upceanflag) { + /* Guard bar extension */ - draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); - for (i = 0; i < 4; i++) { - textpart[i] = local_text[i + 4]; - } - textpart[4] = '\0'; - textpos = 2 * (50 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); - textdone = 1; - switch (strlen(addon)) { - case 2: - textpos = 2 * (xoffset + 86); - draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height); - break; - case 5: - textpos = 2 * (xoffset + 100); - draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height); - break; - } + if (upceanflag == 6) { /* UPC-E */ + draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + draw_bar(pixelbuf, (50 + xoffset) * 2, 1 * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - break; - case 13: /* EAN 13 */ - case 16: - case 19: - draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - draw_bar(pixelbuf, (92 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - draw_bar(pixelbuf, (94 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + } else if (upceanflag == 8) { /* EAN-8 */ + draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + draw_bar(pixelbuf, (32 + xoffset) * 2, 1 * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + draw_bar(pixelbuf, (34 + xoffset) * 2, 1 * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + draw_bar(pixelbuf, (64 + xoffset) * 2, 1 * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + draw_bar(pixelbuf, (66 + xoffset) * 2, 1 * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - textpart[0] = local_text[0]; - textpart[1] = '\0'; - textpos = 2 * (-7 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); - for (i = 0; i < 6; i++) { - textpart[i] = local_text[i + 1]; + } else if (upceanflag == 12) { /* UPC-A */ + latch = 1; + + i = 0 + comp_offset; + do { + block_width = 0; + do { + block_width++; + } while ((i + block_width < symbol->width) && module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); + if (latch == 1) { + /* a bar */ + draw_bar(pixelbuf, (i + xoffset - comp_offset) * 2, block_width * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + latch = 0; + } else { + /* a space */ + latch = 1; } - textpart[6] = '\0'; + i += block_width; + } while (i < 11 + comp_offset); + draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + latch = 1; + i = 85 + comp_offset; + do { + block_width = 0; + do { + block_width++; + } while ((i + block_width < symbol->width) && module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); + if (latch == 1) { + /* a bar */ + draw_bar(pixelbuf, (i + xoffset - comp_offset) * 2, block_width * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + latch = 0; + } else { + /* a space */ + latch = 1; + } + i += block_width; + } while (i < 96 + comp_offset); + + } else if (upceanflag == 13) { /* EAN-13 */ + draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + draw_bar(pixelbuf, (92 + xoffset) * 2, 1 * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + draw_bar(pixelbuf, (94 + xoffset) * 2, 1 * 2, (4 + yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); + } + } + + if (!hide_text) { + + if (upceanflag) { + output_upcean_split_text(upceanflag, symbol->text, textpart1, textpart2, textpart3, textpart4); + + if (upceanflag == 6) { /* UPC-E */ + textpos = 2 * (-5 + xoffset); + draw_string(pixelbuf, textpart1, textpos, default_text_posn, textflags, image_width, image_height); textpos = 2 * (24 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); - for (i = 0; i < 6; i++) { - textpart[i] = local_text[i + 7]; - } - textpart[6] = '\0'; - textpos = 2 * (71 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); + draw_string(pixelbuf, textpart2, textpos, default_text_posn, textflags, image_width, image_height); + textpos = 2 * (55 + xoffset); + draw_string(pixelbuf, textpart3, textpos, default_text_posn, textflags, image_width, image_height); textdone = 1; - switch (strlen(addon)) { + switch (ustrlen(addon)) { case 2: - textpos = 2 * (xoffset + 114); - draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height); + textpos = 2 * (61 + xoffset + addon_gap); + draw_string(pixelbuf, addon, textpos, addon_text_posn, textflags, image_width, image_height); break; case 5: - textpos = 2 * (xoffset + 128); - draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height); + textpos = 2 * (75 + xoffset + addon_gap); + draw_string(pixelbuf, addon, textpos, addon_text_posn, textflags, image_width, image_height); break; } - break; - } + } else if (upceanflag == 8) { /* EAN-8 */ + textpos = 2 * (17 + xoffset); + draw_string(pixelbuf, textpart1, textpos, default_text_posn, textflags, image_width, image_height); + textpos = 2 * (50 + xoffset); + draw_string(pixelbuf, textpart2, textpos, default_text_posn, textflags, image_width, image_height); + textdone = 1; + switch (ustrlen(addon)) { + case 2: + textpos = 2 * (77 + xoffset + addon_gap); + draw_string(pixelbuf, addon, textpos, addon_text_posn, textflags, image_width, image_height); + break; + case 5: + textpos = 2 * (91 + xoffset + addon_gap); + draw_string(pixelbuf, addon, textpos, addon_text_posn, textflags, image_width, image_height); + break; + } - } else if ((symbol->symbology == BARCODE_UPCA) || (symbol->symbology == BARCODE_UPCA_CHK) - || (symbol->symbology == BARCODE_UPCA_CC)) { - /* guard bar extensions and text formatting for UPCA */ - latch = 1; + } else if (upceanflag == 12) { /* UPC-A */ + textpos = 2 * (-5 + xoffset); + draw_string(pixelbuf, textpart1, textpos, default_text_posn, textflags, image_width, image_height); + textpos = 2 * (27 + xoffset); + draw_string(pixelbuf, textpart2, textpos, default_text_posn, textflags, image_width, image_height); + textpos = 2 * (68 + xoffset); + draw_string(pixelbuf, textpart3, textpos, default_text_posn, textflags, image_width, image_height); + textpos = 2 * (100 + xoffset); + draw_string(pixelbuf, textpart4, textpos, default_text_posn, textflags, image_width, image_height); + textdone = 1; + switch (ustrlen(addon)) { + case 2: + textpos = 2 * (107 + xoffset + addon_gap); + draw_string(pixelbuf, addon, textpos, addon_text_posn, textflags, image_width, image_height); + break; + case 5: + textpos = 2 * (121 + xoffset + addon_gap); + draw_string(pixelbuf, addon, textpos, addon_text_posn, textflags, image_width, image_height); + break; + } - i = 0 + comp_offset; - do { - block_width = 0; - do { - block_width++; - } while ((i + block_width < symbol->width) && module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); - if (latch == 1) { - /* a bar */ - draw_bar(pixelbuf, (i + xoffset - comp_offset) * 2, block_width * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - latch = 0; - } else { - /* a space */ - latch = 1; + } else if (upceanflag == 13) { /* EAN-13 */ + textpos = 2 * (-7 + xoffset); + draw_string(pixelbuf, textpart1, textpos, default_text_posn, textflags, image_width, image_height); + textpos = 2 * (24 + xoffset); + draw_string(pixelbuf, textpart2, textpos, default_text_posn, textflags, image_width, image_height); + textpos = 2 * (71 + xoffset); + draw_string(pixelbuf, textpart3, textpos, default_text_posn, textflags, image_width, image_height); + textdone = 1; + switch (ustrlen(addon)) { + case 2: + textpos = 2 * (105 + xoffset + addon_gap); + draw_string(pixelbuf, addon, textpos, addon_text_posn, textflags, image_width, image_height); + break; + case 5: + textpos = 2 * (119 + xoffset + addon_gap); + draw_string(pixelbuf, addon, textpos, addon_text_posn, textflags, image_width, image_height); + break; + } } - i += block_width; - } while (i < 11 + comp_offset); - draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - latch = 1; - i = 85 + comp_offset; - do { - block_width = 0; - do { - block_width++; - } while ((i + block_width < symbol->width) && module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); - if (latch == 1) { - /* a bar */ - draw_bar(pixelbuf, (i + xoffset - comp_offset) * 2, block_width * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - latch = 0; - } else { - /* a space */ - latch = 1; - } - i += block_width; - } while (i < 96 + comp_offset); - textpart[0] = local_text[0]; - textpart[1] = '\0'; - textpos = 2 * (-5 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); - for (i = 0; i < 5; i++) { - textpart[i] = local_text[i + 1]; - } - textpart[5] = '\0'; - textpos = 2 * (27 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); - for (i = 0; i < 5; i++) { - textpart[i] = local_text[i + 6]; - } - textpart[6] = '\0'; - textpos = 2 * (68 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); - textpart[0] = local_text[11]; - textpart[1] = '\0'; - textpos = 2 * (100 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); - textdone = 1; - switch (strlen(addon)) { - case 2: - textpos = 2 * (xoffset + 116); - draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height); - break; - case 5: - textpos = 2 * (xoffset + 130); - draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height); - break; } - } else if ((symbol->symbology == BARCODE_UPCE) || (symbol->symbology == BARCODE_UPCE_CHK) - || (symbol->symbology == BARCODE_UPCE_CC)) { - /* guard bar extensions and text formatting for UPCE */ - draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - draw_bar(pixelbuf, (50 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height, DEFAULT_INK); - - textpart[0] = local_text[0]; - textpart[1] = '\0'; - textpos = 2 * (-5 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); - for (i = 0; i < 6; i++) { - textpart[i] = local_text[i + 1]; + if (!textdone) { + /* Put the human readable text at the bottom */ + textpos = 2 * (main_width / 2 + xoffset); + draw_string(pixelbuf, symbol->text, textpos, default_text_posn, textflags, image_width, image_height); } - textpart[6] = '\0'; - textpos = 2 * (24 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); - textpart[0] = local_text[7]; - textpart[1] = '\0'; - textpos = 2 * (55 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); - textdone = 1; - switch (strlen(addon)) { - case 2: - textpos = 2 * (xoffset + 70); - draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height); - break; - case 5: - textpos = 2 * (xoffset + 84); - draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height); - break; - } - } xoffset -= comp_offset; @@ -1103,13 +960,6 @@ static int plot_raster_default(struct zint_symbol *symbol, int rotate_angle, int draw_bar(pixelbuf, (symbol->width + xoffset + roffset - symbol->border_width) * 2, symbol->border_width * 2, textoffset * 2, (symbol->height + (2 * symbol->border_width)) * 2, image_width, image_height, DEFAULT_INK); } - /* Put the human readable text at the bottom */ - if ((textdone == 0) && (ustrlen(local_text) != 0)) { - textpos = (image_width / 2); - draw_string(pixelbuf, (char*) local_text, textpos, default_text_posn, textflags, image_width, image_height); - } - - if (scaler <= 0) { scaler = 0.5; } @@ -1127,8 +977,9 @@ static int plot_raster_default(struct zint_symbol *symbol, int rotate_angle, int memset(scaled_pixelbuf, DEFAULT_PAPER, scale_width * scale_height); for (vert = 0; vert < scale_height; vert++) { + double vert_scaled = (vert * image_width) / scaler; for (horiz = 0; horiz < scale_width; horiz++) { - *(scaled_pixelbuf + (vert * scale_width) + horiz) = *(pixelbuf + ((int) (vert / scaler) * image_width) + (int) (horiz / scaler)); + *(scaled_pixelbuf + (vert * scale_width) + horiz) = *(pixelbuf + (int) (vert_scaled + (horiz / scaler))); } } @@ -1151,7 +1002,7 @@ INTERNAL int plot_raster(struct zint_symbol *symbol, int rotate_angle, int file_ } #endif /* NO_PNG */ - error = check_colour_options(symbol); + error = output_check_colour_options(symbol); if (error != 0) { return error; } diff --git a/backend/tests/README b/backend/tests/README index eed43866..b348bbe1 100644 --- a/backend/tests/README +++ b/backend/tests/README @@ -44,10 +44,18 @@ To show debug info (if any), use '-d ': ./test_dotcode -f input -i 2 -d 1 +(for other flags see /backend/tests/testcommon.h) + To generate test data, use '-g': ./test_dotcode -f encode -g +To run a test against BWIPP (if any), use '-d 128': + + ./test_composite -d 128 + +(see also /backend/tests/tools/run_bwipp_tests.sh) + ------------------------------------------------------------------------------ To make with gcc sanitize, first set for libzint and make: diff --git a/backend/tests/data/png/ean13_2addon_ggs_5.2.2.5.1-2.png b/backend/tests/data/png/ean13_2addon_ggs_5.2.2.5.1-2.png new file mode 100644 index 0000000000000000000000000000000000000000..bb63e837d485c328852f820c66dfb9036a1fa91b GIT binary patch literal 746 zcmeAS@N?(olHy`uVBq!ia0y~yU=#te%Q%>TWLxC#(+mtu8$DedLn>~)y?xQI*+8P< z;?*Dj*2m~i)8XB+zxB|9Cv#S>Jh0$#bYj*i%l*feOo>~6z1sTq@ugqCpHA1m-n;#N z)b_7BYim2^YuoMm8nyQA@#q)wOXn44=jzt2`&ej~rSkmKXQr~BrYtu8UYhd^jxwM9 z-J!5#@vp+0$0k3Q`EGL|JN8_qZYTTaNfi%vA8F2XxA}0i=ty(Xx6jpb^R9XRRCxZU zuHe{v&!dMI|5zcVrXVN4Uo*X0ZrM+XgxCM2wqEP~-@WGlVpe1R9XZS&8!8-ZKp3Q| zgB^sAFh64a$Nbq1#dp_~imxvzJ^5qDwdbdDzittfx%GVc$E1T9#%EKbx86Hioid@^|4;B4%l4kQ zpQ)BJ`}-HpO!u0*{@3rAmHS@$T|fNj#_@hv>Ep+Xf2RC>zvc7$bK&>1_4n)9zH*6w zU-N&C%_pIN{^fJduHOFg^4yfyoay(34^`HDpZQ#E{e=@-E?07X->^OO^0}iQ-$<)^>pCAb#9zGED;p?`la eBz`}n)VpiDO+Wj+Bodg089ZJ6T-G@yGywpcEOZ$F literal 0 HcmV?d00001 diff --git a/backend/tests/data/png/ean13_5addon_ggs_5.2.2.5.2-2.png b/backend/tests/data/png/ean13_5addon_ggs_5.2.2.5.2-2.png new file mode 100644 index 0000000000000000000000000000000000000000..c9f5b36a5fb3a57dc9b9b086a815c4c2af5b81da GIT binary patch literal 845 zcmeAS@N?(olHy`uVBq!ia0y~yVDtjA%Q%>Tq+*M&0RscGh^LEVNX4zUw=Wj0G7xbH zy!7#Z{Y*QH$0;hE#}^14it^vulqls(=1m zJ#p)mXKU7O-}ddtu3Pr*_eyhPtDmir{dmHW98F zE{UIDR~LS-pvSH8ZOL}V=l}22$?ULbZ)E#+Y;nuC4K;6eF+N%rUd4-W$F zZ4g<%F8gr)$5}OV1f%a=us`!``?co(_vcmT|2Q-EbHmot(yGgEecAn|>5oh9Zi{yF zcgN0O-L@w&^1A7dCwnZOmnGEyT6enf{(-6HdouLvORb-u_;2{^p7b)+{0Zg-X7Bb| zHr~3wsQ&T#%a7~#%HKTq?f&iU*F$G7-)6Gde1`@56W$Zj6U-Iz9qxf}!yd*;=1*)O zL4-uZ9!H`iCYZyF0vXecFbY)yXg!r2XRd27>c>TWm zqv+SRZSQ4k%d+b?v;TV5^Pas2=*q?iM=QNv-Z;IshWXRk6}dNRf0cQ?EtkKXtu1ve zx>{|AaMo{w`S(M=t5hzZGSBMg--WvKQnvDD|Cw+;GA8Y9j$ByH`6J~{xz}ZjUhKSf zwDPyg>3H3~V;@uJz00|`^Wf1X^1lOafBN_Jz*gDZvU8P@Wv5Hu?>)XVqSlIA{_Z{- zQ|aP!wk6{HH!mOg@#D?C>TP>IFVwHw`TKG4ucs>|=NB^_b-rfNcW`(1_lL!O_nKu+ z9CP0HcJbnGyp_LA<|e$*%lm)MeCcz}&+ja**XF;xQ7iQSjMca1obz@se?Lq5UH*ID z+wIS1*Uz6Nbichm*{*?e-LJLFGr}tp?tPTA?VJgTe~DWM4f-5I`D literal 0 HcmV?d00001 diff --git a/backend/tests/data/png/ean2.png b/backend/tests/data/png/ean2.png new file mode 100644 index 0000000000000000000000000000000000000000..b631d74cd5dddcb64366c7ea6eb41f63aa28fd79 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^4nSPS!2~3~YcN>?sY{+Njv*Dd-rjNKYgQ0o4QTuF zFMOWfjSE@5h6_|H>r(^NZ3IhPQ_?J_cW5l#^7?k6cl^U0d-s38e)F-_?JJuqfJRUU zxT&9ezcH1C;oGNKKg!%gGLf^t36f(OK;8-@mKm xeLkyC)U0PBfB$f#JPSX4p!DQ<8HNLoDw*{rdfXG=xBW24U7oIfF6*2UngHDkQuF`- literal 0 HcmV?d00001 diff --git a/backend/tests/data/png/ean5.png b/backend/tests/data/png/ean5.png new file mode 100644 index 0000000000000000000000000000000000000000..8ecf3461bad793b83c8445afe1d5e79f7e1115c8 GIT binary patch literal 398 zcmeAS@N?(olHy`uVBq!ia0vp^WgyJK1SBUN{ouyHz!>W3;uunK>+Ow;c}$7|4uNTx z|Nl>|QOJDJ=Y8=;%9`hPnu%|}wQR`va_@GW;KeBE&&OY1yn3Q0bl%M8Z{nvuU;nghg**K< zX72tz&rv-8wM}wg)9dd$RpY3JMDw_x56XQ$9G)ba&b>@#htxxW(59^34Ao~)5LGDb|3yVr=W^W?B=Y$JWtHI ffS&)syo=F6VCnm>%cawS;mqLa>gTe~DWM4fm20=u literal 0 HcmV?d00001 diff --git a/backend/tests/data/png/ean8_2addon.png b/backend/tests/data/png/ean8_2addon.png new file mode 100644 index 0000000000000000000000000000000000000000..c61739828f2461da0f390317117e25e4d5a6ea81 GIT binary patch literal 645 zcmeAS@N?(olHy`uVBq!ia0vp^H-NZ|g9%8ghMZDiU|{m`ba4!+xb^nd?V=_F5r@D_ zAOF`|)+QYD^lV~e?Mq#&&K}LPVQ1DUOaJ5`ugfN9>*M$7-Jg5)viq_r|D*jhug;G< zpIbXmxp;+r?VsZ6(-xcFyw1-5b9w*8^DK-uYnW!af0=lBu7KsXLti!eGcK;2xixuV zw#&M}@Cv`_PAW$}26eP3xH!ewaZMC3Hv|f--SWIcXSR0ylR3}D-R&=nDb-ihH1AFm zP})#5%g=oNgTsF7l0Kl-b7u8V2-5O5*IarubH$uXHnzIY z3O+rkPOjefwMg^X_IJhSdLeQd+cyC0@~laEu*+f}Bc&h~Osc}rZ3GTZ&REjuc! z+iy+SJCWs1VvMp}^-R&4?LXHg*1r}k{8Qbk{LbT4_vTvZAAdi_OJB2oT>pIcim(6g zR=t$}a>Zsx=HvU;{W`a5mcRMvTU|PLo0XWq_N?>zua+PD`eEJOma`kbs;!f`6gTe~DWM4fuo4`4 literal 0 HcmV?d00001 diff --git a/backend/tests/data/png/ean8_5addon.png b/backend/tests/data/png/ean8_5addon.png new file mode 100644 index 0000000000000000000000000000000000000000..650f46b83ce29867693d592762b2b6f93aecd73e GIT binary patch literal 735 zcmeAS@N?(olHy`uVBq!ia0y~yVB`a`%Q%>TZ_oHyt{L=j=F;%bd8>;m)1v!-ro6K44Eb?e>y&=cxvx() z{EJnsh}Ew1U-{wG++Xh=$npRB6jtBV5&hkf&OLvTUUx=IL39F8;S#1G#+3{}+z{db6@m+cgb>0Ym0;B{AtVDDLKu(? zSi%G~7orkoE-6<1KlXeT`zcHI{`uCIcANg&^U=89ChZT;`l_WfLLIac7|Z;;R>p)Z znPS%6`^lqNa8qT=Z2x`bdG}|R#UHJjJauXaAJ0~+*>j3zk5z2Ax5o0w>#FMYkE+kJ zH>ZDNz0rB_Vov6^@`CScW>r3!BY%FLXZqB|;`PgTl`H;vJl$vOQ&}*nsA}__wDm@n zANE*GJ*ZYOZ{aoT$()m)9j%_~J?;18_P^^cKf9r^_vigha<-56{{Hp$o#>P0VV$pc z@`k1E);}w-g<*G^o#cCgW&c#K>}qTWLxC#(+mtuhdo^!Ln>~)y?wiHl>vjp z#iT#~cdqJ zpO|RKP1AjznRqiUJ!;#*)3KfGay1XnwN(6AyYktpOm`avxgYPg2;a$leEl8olJ7VD zwyDU~t(bG{Z1%?khj}jln{#CoFBf01<^4(0YzlG${5}Uw`7g)(-M&BZ>i^#L;rlPA zK4Uy>CcxjpeuNo>A2EJp0OE!U2cXFyj3U)g@rDT^@Q4wt7NicM79>m~Dejv|J@5DA zAOiE&`IwaOvNw~zZZna8eXC>rcKk!riI(0Jg&3-{H6GxxBa|KR&U9U z#-Hm}*jhaJan4BW_{Syf*8^^U*wX!ZLQ+qqR&RZuz0*$t5%Uc@w7dBEtoIqmao?3% zyp{jJhW3lnm#@Sqm;7k+e>ZvIvGTd8w;Mh!e)6X=H2SKK`rPzo*6wGl#lD-KV?3I@ z@XNtRil#^Rd?`5_Tz&ZeWsgGbWAhW!Vw81+{Bu>L4jUZ(AoK11jwPPqsm<#zsLlNr z-tk=cI$N`RXz%HrC7jz|E#Fdn{PUKC9Z$5Lu429YaM#ib<5#zsYg-n7D_-97Z{piK z>XYZ)%{%ISKGJOEXW3&%n4Uj2Hoy5y>i$LcMTPU^emc*4q_pp2Vd7h@qz|d(Zx^4R y_uuozzMBT0ew>@MrITq+*M&0Rscm1y2{pkcwMx?_4Zetia$9 z`0~mB`k8hXa}&E1wA`)~&kMS~#C0$0XY$O)Z+bt(U?h?groc zaCO`3mB%GM&(M~SEA>t)8`nziV%||j;XKr7=mwZ|}%G*!= zh{R{lihn!HAOC*%w)&LxxvT%0H&(59x&PNzF^78%dmcW$Q(esL{;$sN{^oz?-@c~H z{+#`1+W+_kc9$+aH>z$vYN?P9QpZ@y{D}>OpYWcLo?s3VM3Q*Ii&Nr+G(tzi9!Ho_ zAVHiG6U{tie7=_JD;}*EX$lVKe~R-?eCKL1sdGPAKp}6n_qw4 z(6Ab)zUoIvSUj`dQm2T0vrlZ7zh68jwV+DxQ}n!P4|(ifU3I*u`#w?s`=zrr`~Loz z$6TjB+y0Dptn9fTi`VgY<#m6ac)RZEp1r&O@9zKgPW|ZK^7i}>@%M@kD84`EV3U8| z`p?emU%o!DRGh!!ziyKB@^{DQ1X$gvw!YKs|HeW-zqU+&t9r7wCkmwwnKk<6i(A04+YUw8ed3>r$^b9c)dIncYl7Mp5*TH@fUxcIoe}-YOPxT*{NsqzCD|LR_f_9;pG8*Gjgo- z-`@LL|Lo{0`TqXch#r`Jm}gQ)A!`}orkUWr6<4F__Xmt%%%8lnST!H z;ajgAe|$`_ug1R6P4%q8ulcF7y02aMwJo<`t?~c88&6Gn9CCJ6cO*D0S_JACjgLh> VKK|&z2VjC>@O1TaS?83{1OVUv2$lc< literal 0 HcmV?d00001 diff --git a/backend/tests/data/png/upce_5addon.png b/backend/tests/data/png/upce_5addon.png new file mode 100644 index 0000000000000000000000000000000000000000..2dc34601431781e553cff257fc580f04ee90cfa7 GIT binary patch literal 710 zcmeAS@N?(olHy`uVBq!ia0vp^?|`_Bg9%7F?6inxU|{O?ba4!+xb^nd?V@G{5r@DR zU;fw6v@>{Yu&AR`d{wrs>2dN$vlcrZcnSfK7HErl&5R6zSds*eyx7~ zTlcSLjkE5rdj7F^jr{C}^dDO}?`a;}QNG>s_C}xY8!CM@i<6GOT@&n8x}$fpa*sb- z&-V4l=j%RX?)w+^^!iHeobsE(dA9RCW(uai_;lvzCijTVOMR{j-Qy^kka&2_nZC%R zGn$d7a{9%(!%v_3csNo1f10gay4p0O&ri#Kx$TXM`TYFU-1**L;)74kDN@-k8E<{+ zQ&9ZGhAEDxY$iokUO2qzmwS5l^D}(U4him8e*bgn*L(NVzyDdk_2lm7=J&%=c_b84 zCm4B1YBmFPD5Ngo31R~?JtV6hNx1pw z>Y(OhsN+y<5eW90e@Ew-fYZL*pWj!TKRso(v33p6w0qCDZ`{47V*ZTsBau6^_0Gy& z`l29xeU9F%J?D3)3Hf>MtlO(!5qLV>Wd54NxpQK87S%a#d;fXb@|wS^K2BpyKBK$) z#;!a+~C!s&5g@6D3?A1>e=3@oiAKn0?;rg{VH`mzwIM?pJ^o~VC zba(#SKWEJu{O3(=kD9b!rl4Br`PJ1$HxD-YmdM?nnq0W=97pE5T;caKuk%XGwS4zi zCi#r&&YIshU1cu&?-i`JTW`Dg@zIpq^SyQC?zJv`?{1a;?)Ck>)7}aPv$fZPBVgw9 aAIu^@4?V394l)C#PX + + + Zint Generated Symbol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 9 + + + 771384 + + + 524017 + + + 12 + + + diff --git a/backend/tests/data/svg/ean13_5addon_ggs_5.2.2.5.2-2.svg b/backend/tests/data/svg/ean13_5addon_ggs_5.2.2.5.2-2.svg new file mode 100644 index 00000000..70e75e89 --- /dev/null +++ b/backend/tests/data/svg/ean13_5addon_ggs_5.2.2.5.2-2.svg @@ -0,0 +1,74 @@ + + + + Zint Generated Symbol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 9 + + + 780877 + + + 799306 + + + 54321 + + + diff --git a/backend/tests/data/svg/ean2.svg b/backend/tests/data/svg/ean2.svg new file mode 100644 index 00000000..de4f02d4 --- /dev/null +++ b/backend/tests/data/svg/ean2.svg @@ -0,0 +1,23 @@ + + + + Zint Generated Symbol + + + + + + + + + + + + + 12 + + + diff --git a/backend/tests/data/svg/ean5.svg b/backend/tests/data/svg/ean5.svg new file mode 100644 index 00000000..156038d0 --- /dev/null +++ b/backend/tests/data/svg/ean5.svg @@ -0,0 +1,32 @@ + + + + Zint Generated Symbol + + + + + + + + + + + + + + + + + + + + + + 12345 + + + diff --git a/backend/tests/data/svg/ean8_2addon.svg b/backend/tests/data/svg/ean8_2addon.svg new file mode 100644 index 00000000..9693a44e --- /dev/null +++ b/backend/tests/data/svg/ean8_2addon.svg @@ -0,0 +1,53 @@ + + + + Zint Generated Symbol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1234 + + + 5670 + + + 12 + + + diff --git a/backend/tests/data/svg/ean8_5addon.svg b/backend/tests/data/svg/ean8_5addon.svg new file mode 100644 index 00000000..5d1a2833 --- /dev/null +++ b/backend/tests/data/svg/ean8_5addon.svg @@ -0,0 +1,62 @@ + + + + Zint Generated Symbol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1234 + + + 5670 + + + 12345 + + + diff --git a/backend/tests/data/svg/upca_2addon_ggs_5.2.6.6-5.svg b/backend/tests/data/svg/upca_2addon_ggs_5.2.6.6-5.svg new file mode 100644 index 00000000..6f1dc0b6 --- /dev/null +++ b/backend/tests/data/svg/upca_2addon_ggs_5.2.6.6-5.svg @@ -0,0 +1,69 @@ + + + + Zint Generated Symbol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 12345 + + + 67890 + + + 5 + + + 24 + + + diff --git a/backend/tests/data/svg/upca_5addon.svg b/backend/tests/data/svg/upca_5addon.svg new file mode 100644 index 00000000..218af826 --- /dev/null +++ b/backend/tests/data/svg/upca_5addon.svg @@ -0,0 +1,78 @@ + + + + Zint Generated Symbol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + + + 14141 + + + 23441 + + + 7 + + + 12345 + + + diff --git a/backend/tests/data/svg/upce_2addon.svg b/backend/tests/data/svg/upce_2addon.svg new file mode 100644 index 00000000..05f298ec --- /dev/null +++ b/backend/tests/data/svg/upce_2addon.svg @@ -0,0 +1,52 @@ + + + + Zint Generated Symbol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 234567 + + + 0 + + + 12 + + + diff --git a/backend/tests/data/svg/upce_5addon.svg b/backend/tests/data/svg/upce_5addon.svg new file mode 100644 index 00000000..4aac7c00 --- /dev/null +++ b/backend/tests/data/svg/upce_5addon.svg @@ -0,0 +1,61 @@ + + + + Zint Generated Symbol + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 234567 + + + 0 + + + 12345 + + + diff --git a/backend/tests/test_2of5.c b/backend/tests/test_2of5.c index 85afc5dc..bfb752c1 100644 --- a/backend/tests/test_2of5.c +++ b/backend/tests/test_2of5.c @@ -193,6 +193,8 @@ static void test_encode(int index, int generate, int debug) { testStart(""); + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + int ret; struct item { int symbology; @@ -206,37 +208,37 @@ static void test_encode(int index, int generate, int debug) { }; // BARCODE_ITF14 examples verified manually against GS1 General Specifications 20.0 struct item data[] = { - /* 0*/ { BARCODE_C25MATRIX, "87654321", 0, 1, 97, "Standard Code 2 of 5; verified manually against bwipp and tec-it", + /* 0*/ { BARCODE_C25MATRIX, "87654321", 0, 1, 97, "Standard Code 2 of 5; note zint uses 4X start/end wides while BWIPP uses 3X", "1111010101110100010101000111010001110101110111010101110111011100010101000101110111010111011110101" }, - /* 1*/ { BARCODE_C25INTER, "87654321", 0, 1, 81, "Interleaved Code 2 of 5; verified manually against bwipp and tec-it", + /* 1*/ { BARCODE_C25INTER, "87654321", 0, 1, 81, "Interleaved Code 2 of 5; verified manually against tec-it", "101011101010111000100010001110111000101010001000111010111010001110101011100011101" }, /* 2*/ { BARCODE_C25INTER, "602003", 0, 1, 63, "DX cartridge barcode https://en.wikipedia.org/wiki/Interleaved_2_of_5 example", "101010111011100010001010111010001000111010001000111011101011101" }, - /* 3*/ { BARCODE_C25IATA, "87654321", 0, 1, 121, "IATA Code 2 of 5; verified manually against bwipp and tec-it", + /* 3*/ { BARCODE_C25IATA, "87654321", 0, 1, 121, "IATA Code 2 of 5; verified manually against tec-it", "1010111010101110101010101110111010111011101010111010111010101010111010111011101110101010101110101011101110101010111011101" }, - /* 4*/ { BARCODE_C25LOGIC, "87654321", 0, 1, 89, "Code 2 of 5 Data Logic; verified manually against bwipp and tec-it", + /* 4*/ { BARCODE_C25LOGIC, "87654321", 0, 1, 89, "Code 2 of 5 Data Logic; verified manually against tec-it", "10101110100010101000111010001110101110111010101110111011100010101000101110111010111011101" }, - /* 5*/ { BARCODE_C25IND, "87654321", 0, 1, 131, "Industrial Code 2 of 5; verified manually against bwipp and tec-it", + /* 5*/ { BARCODE_C25IND, "87654321", 0, 1, 131, "Industrial Code 2 of 5; verified manually against tec-it", "11101110101110101011101010101011101110101110111010101110101110101010101110101110111011101010101011101010111011101010101110111010111" }, - /* 6*/ { BARCODE_DPLEIT, "87654321", 0, 1, 135, "Deutsche Post Leitcode; verified manually against bwipp and tec-it (0000087654321)", + /* 6*/ { BARCODE_DPLEIT, "0000087654321", 0, 1, 135, "Deutsche Post Leitcode; verified manually against tec-it", "101010101110001110001010101110001110001010001011101110001010100010001110111011101011100010100011101110001010100011101000100010111011101" }, /* 7*/ { BARCODE_DPLEIT, "5082300702800", 0, 1, 135, "Deutsche Post Leitcode https://de.wikipedia.org/wiki/Leitcode example", "101011101011100010001011101000101110100011101110100010001010101110111000100010100011101110100011101010001110001010001011100011101011101" }, - /* 8*/ { BARCODE_DPIDENT, "87654321", 0, 1, 117, "Deutsche Post Identcode; verified manually against bwipp and tec-it (00087654321)", + /* 8*/ { BARCODE_DPIDENT, "00087654321", 0, 1, 117, "Deutsche Post Identcode; verified manually against tec-it", "101010101110001110001010001011101110001010100010001110111011101011100010100011101110001010100011101000100010111011101" }, /* 9*/ { BARCODE_DPIDENT, "39601313414", 0, 1, 117, "Deutsche Post Identcode https://de.wikipedia.org/wiki/Leitcode example", "101011101110001010001010111011100010001011100010001010111011100010001010111010001011101011100010101110001000111011101" }, - /* 10*/ { BARCODE_ITF14, "87654321", 0, 1, 135, "ITF-14; verified manually against bwipp and tec-it (0000087654321)", + /* 10*/ { BARCODE_ITF14, "0000087654321", 0, 1, 135, "ITF-14; verified manually against tec-it", "101010101110001110001010101110001110001010001011101110001010100010001110111011101011100010100011101110001010100011101000101011100011101" }, /* 11*/ { BARCODE_ITF14, "0950110153000", 0, 1, 135, "GS1 General Specifications Figure 5.1-2", @@ -252,6 +254,8 @@ static void test_encode(int index, int generate, int debug) { int data_size = ARRAY_SIZE(data); char escaped[1024]; + char bwipp_buf[4096]; + char bwipp_msg[1024]; for (int i = 0; i < data_size; i++) { @@ -281,6 +285,15 @@ static void test_encode(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); } + + if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, -1, -1, debug)) { + ret = testUtilBwipp(symbol, -1, -1, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } } } diff --git a/backend/tests/test_codablock.c b/backend/tests/test_codablock.c index 83ddbf89..b9b8cb80 100644 --- a/backend/tests/test_codablock.c +++ b/backend/tests/test_codablock.c @@ -432,7 +432,7 @@ static void test_encode(int index, int generate, int debug) { if (generate) { printf(" /*%3d*/ { %s, %d, %d, \"%s\", %s, %d, %d, %d, \"%s\",\n", i, testUtilBarcodeName(data[i].symbology), data[i].option_1, data[i].option_2, testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), - testUtilErrorName(data[i].ret), symbol->rows, data[i].bwipp_cmp, symbol->width, data[i].comment); + testUtilErrorName(data[i].ret), symbol->rows, symbol->width, data[i].bwipp_cmp, data[i].comment); testUtilModulesDump(symbol, " ", "\n"); printf(" },\n"); } else { @@ -448,7 +448,7 @@ static void test_encode(int index, int generate, int debug) { if (do_bwipp && testUtilCanBwipp(symbol->symbology, data[i].option_1, data[i].option_2, -1, debug)) { if (!data[i].bwipp_cmp) { - if (debug & ZINT_DEBUG_TEST_PRINT) printf("%d: %s skipped, not BWIPP compatible\n", i, testUtilBarcodeName(symbol->symbology)); + if (debug & ZINT_DEBUG_TEST_PRINT) printf("%d: %s not BWIPP compatible (%s)\n", i, testUtilBarcodeName(symbol->symbology), data[i].comment); } else { ret = testUtilBwipp(symbol, data[i].option_1, data[i].option_2, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), ret); diff --git a/backend/tests/test_code128.c b/backend/tests/test_code128.c index a3e41743..acbb2a31 100644 --- a/backend/tests/test_code128.c +++ b/backend/tests/test_code128.c @@ -443,99 +443,127 @@ static void test_encode(int index, int generate, int debug) { int expected_rows; int expected_width; + int bwipp_cmp; char *comment; char *expected; }; - // BARCODE_EAN128 examples verified manually against GS1 General Specifications 20.0 + // BARCODE_EAN128 examples verified manually against GS1 General Specifications 20.0 (GGS) struct item data[] = { - /* 0*/ { BARCODE_CODE128, UNICODE_MODE, "AIM", 0, 1, 68, "ISO/IEC 15417:2007 Figure 1", + /* 0*/ { BARCODE_CODE128, UNICODE_MODE, "AIM", 0, 1, 68, 1, "ISO/IEC 15417:2007 Figure 1", "11010010000101000110001100010001010111011000101110110001100011101011" }, - /* 1*/ { BARCODE_CODE128B, UNICODE_MODE, "AIM", 0, 1, 68, "128B same", + /* 1*/ { BARCODE_CODE128B, UNICODE_MODE, "AIM", 0, 1, 68, 1, "128B same", "11010010000101000110001100010001010111011000101110110001100011101011" }, - /* 2*/ { BARCODE_CODE128, UNICODE_MODE, "1234567890", 0, 1, 90, "", + /* 2*/ { BARCODE_CODE128, UNICODE_MODE, "1234567890", 0, 1, 90, 1, "", "110100111001011001110010001011000111000101101100001010011011110110100111100101100011101011" }, - /* 3*/ { BARCODE_CODE128B, UNICODE_MODE, "1234567890", 0, 1, 145, "", + /* 3*/ { BARCODE_CODE128B, UNICODE_MODE, "1234567890", 0, 1, 145, 1, "", "1101001000010011100110110011100101100101110011001001110110111001001100111010011101101110111010011001110010110010011101100101000110001100011101011" }, - /* 4*/ { BARCODE_EAN128, GS1_MODE, "[8018]950110153123456781", 0, 1, 167, "GS1 General Specifications Figure 2.5.2-1", + /* 4*/ { BARCODE_EAN128, GS1_MODE, "[8018]950110153123456781", 0, 1, 167, 1, "GGS Figure 2.5.2-1", "11010011100111101011101010011110011001110010101111010001100110110011001000100101110011001101100011011101101110101110110001000010110010010111100101111001001100011101011" }, - /* 5*/ { BARCODE_EAN128, GS1_MODE, "[415]5412345678908[3911]710125", 0, 1, 189, "GS1 General Specifications Figure 2.6.6-1 top", + /* 5*/ { BARCODE_EAN128, GS1_MODE, "[415]5412345678908[3911]710125", 0, 1, 189, 1, "GGS Figure 2.6.6-1 top", "110100111001111010111011000100010111010001101100010001011101101110101110110001000010110011011011110100011001001101000100011000100100100110100001100110110011100101100100001001101100011101011" }, - /* 6*/ { BARCODE_EAN128, GS1_MODE, "[12]010425[8020]ABC123", 0, 1, 189, "GS1 General Specifications Figure 2.6.6-1 bottom", + /* 6*/ { BARCODE_EAN128, GS1_MODE, "[12]010425[8020]ABC123", 0, 1, 189, 1, "GGS Figure 2.6.6-1 bottom", "110100111001111010111010110011100110011011001001000110011100101100101001111001100100111010111101110101000110001000101100010001000110100111001101100111001011001011100110010111001100011101011" }, - /* 7*/ { BARCODE_EAN128, GS1_MODE, "[253]950110153005812345678901", 0, 1, 211, "GS1 General Specifications Figure 2.6.9-1", + /* 7*/ { BARCODE_EAN128, GS1_MODE, "[253]950110153005812345678901", 0, 1, 211, 1, "GGS Figure 2.6.9-1", "1101001110011110101110111001011001101000100011000101110110001001001100110110011011101110110110011001110110001010110011100100010110001110001011011000010100110111101101011110111010011100110101110110001100011101011" }, - /* 8*/ { BARCODE_EAN128, GS1_MODE, "[253]950110153006567890543210987", 0, 1, 211, "GS1 General Specifications Figure 2.6.9-2", + /* 8*/ { BARCODE_EAN128, GS1_MODE, "[253]950110153006567890543210987", 0, 1, 211, 1, "GGS Figure 2.6.9-2", "1101001110011110101110111001011001101000100011000101110110001001001100110110011011101110110110011001001011000010000101100110110111101000100110010110001110110111001001100100100011110010100101110011001100011101011" }, - /* 9*/ { BARCODE_EAN128, GS1_MODE, "[253]95011015300657654321", 0, 1, 189, "GS1 General Specifications Figure 2.6.9-3", + /* 9*/ { BARCODE_EAN128, GS1_MODE, "[253]95011015300657654321", 0, 1, 189, 1, "GGS Figure 2.6.9-3", "110100111001111010111011100101100110100010001100010111011000100100110011011001101110111011011001100100101100001100101000011101011000110001101101011110111010011100110111001001101100011101011" }, - /* 10*/ { BARCODE_EAN128, GS1_MODE, "[253]9501101530065123456", 0, 1, 167, "GS1 General Specifications Figure 2.6.9-4", + /* 10*/ { BARCODE_EAN128, GS1_MODE, "[253]9501101530065123456", 0, 1, 167, 1, "GGS Figure 2.6.9-4", "11010011100111101011101110010110011010001000110001011101100010010011001101100110111011101101100110010010110000101100111001000101100011100010110100011110101100011101011" }, - /* 11*/ { BARCODE_EAN128, GS1_MODE, "[01]10857674002017[10]1152KMB", 0, 1, 211, "GS1 General Specifications Figure 4.15.1-1", + /* 11*/ { BARCODE_EAN128, GS1_MODE, "[01]10857674002017[10]1152KMB", 0, 1, 211, 1, "GGS Figure 4.15.1-1", "1101001110011110101110110011011001100100010010011110010110010100001000011001011011001100110010011101001110011011001000100110001001001101110001010111101110101100011101011101100010001011000100111001101100011101011" }, - /* 12*/ { BARCODE_EAN128, GS1_MODE, "[01]09501101530003", 0, 1, 134, "GS1 General Specifications Figure 5.1-3", + /* 12*/ { BARCODE_EAN128, GS1_MODE, "[01]09501101530003", 0, 1, 134, 1, "GGS Figure 5.1-3", "11010011100111101011101100110110011001001000110001011101100010010011001101100110111011101101100110010010011000100110100001100011101011" }, - /* 13*/ { BARCODE_EAN128, GS1_MODE, "[00]395123451234567895", 0, 1, 156, "GS1 General Specifications Figure 5.4.2-1", + /* 13*/ { BARCODE_EAN128, GS1_MODE, "[00]395123451234567895", 0, 1, 156, 1, "GGS Figure 5.4.2-1", "110100111001111010111011011001100110100010001101110100011101101110101110110001011001110010001011000111000101101100001010010111101000101111000101100011101011" }, - /* 14*/ { BARCODE_EAN128, GS1_MODE, "[00]395011010013000129", 0, 1, 156, "GS1 General Specifications Figure 6.6.5-6", + /* 14*/ { BARCODE_EAN128, GS1_MODE, "[00]006141411234567890", 0, 1, 156, 1, "GGS Figure 6.6.5-1. (and Figures 6.6.5-3 bottom, 6.6.5-4 bottom)", + "110100111001111010111011011001100110110011001100100001011000100010110001000101011001110010001011000111000101101100001010011011110110110110110001100011101011" + }, + /* 15*/ { BARCODE_EAN128, GS1_MODE, "[403]402621[401]950110153B01001", 0, 1, 266, 0, "GGS Figure 6.6.5-2 top **NOT SAME**, different encodation for zint, BWIPP & standard, same codeword count", + "11010011100111101011101100010100010001011000110011001101111000101010111101110100111001101011101111011110101110110001010001100101110011000101110110001001001100110110011011101110101111011101000101100010011101100101110111101100100010011001101100101001111001100011101011" + }, + /* 16*/ { BARCODE_EAN128, GS1_MODE, "[00]395011015300000011", 0, 1, 156, 1, "GGS Figure 6.6.5-2 bottom", + "110100111001111010111011011001100110100010001100010111011000100100110011011001101110111011011001100110110011001101100110011000100100100011101101100011101011" + }, + /* 17*/ { BARCODE_EAN128, GS1_MODE, "[420]45458", 0, 1, 90, 1, "GGS Figure 6.6.5-3 top", + "110100111001111010111010110111000100100011001110101100011101100010111100100101100011101011" + }, + /* 18*/ { BARCODE_EAN128, GS1_MODE, "[02]00614141000418[15]210228[10]451214[37]20", 0, 1, 255, 1, "GGS Figure 6.6.5-4 top", + "110100111001111010111011001100110110110011001100100001011000100010110001000101101100110010010001100110011100101011100110011011100100110011001101110011010011001000100101110110001011001110010011001110111101011101000110100011001001110100011110101100011101011" + }, + /* 19*/ { BARCODE_EAN128, GS1_MODE, "[420]87109", 0, 1, 90, 1, "GGS Figure 6.6.5-5 top", + "110100111001111010111010110111000100011001001001101000011001001000111001001101100011101011" + }, + /* 20*/ { BARCODE_EAN128, GS1_MODE, "[90]1528", 0, 1, 79, 1, "GGS Figure 6.6.5-5 middle", + "1101001110011110101110110111101101011100110011100110100111001100101100011101011" + }, + /* 21*/ { BARCODE_EAN128, GS1_MODE, "[00]000521775138957172", 0, 1, 156, 1, "GGS Figure 6.6.5-5 bottom", + "110100111001111010111011011001100110110011001000100110011011100100111101110101101110100010001100010101111010001001101000010011000010110011011001100011101011" + }, + /* 22*/ { BARCODE_EAN128, GS1_MODE, "[00]395011010013000129", 0, 1, 156, 1, "GGS Figure 6.6.5-6", "110100111001111010111011011001100110100010001100010111011000100100110011011001101100110010011011100110110011001100110110011100110010111101101101100011101011" }, - /* 15*/ { BARCODE_EAN128, GS1_MODE, "[401]931234518430GR", 0, 1, 167, "GS1 General Specifications Figure 6.6.5-7 top", + /* 23*/ { BARCODE_EAN128, GS1_MODE, "[00]395011010013000129", 0, 1, 156, 1, "GGS Figure 6.6.5-6", + "110100111001111010111011011001100110100010001100010111011000100100110011011001101100110010011011100110110011001100110110011100110010111101101101100011101011" + }, + /* 24*/ { BARCODE_EAN128, GS1_MODE, "[401]931234518430GR", 0, 1, 167, 1, "GGS Figure 6.6.5-7 top", "11010011100111101011101100010100011001011100110110001101110110111010111011000110011100101011000111010111101110100111011001101000100011000101110100110111001100011101011" }, - /* 16*/ { BARCODE_EAN128, GS1_MODE, "[00]093123450000000012", 0, 1, 156, "GS1 General Specifications Figure 6.6.5-7 bottom", + /* 25*/ { BARCODE_EAN128, GS1_MODE, "[00]093123450000000012", 0, 1, 156, 1, "GGS Figure 6.6.5-7 bottom", "110100111001111010111011011001100110010010001101100011011101101110101110110001101100110011011001100110110011001101100110010110011100110111010001100011101011" }, - /* 17*/ { BARCODE_EAN128, GS1_MODE, "[01]95012345678903", 0, 1, 134, "GS1 General Specifications Figure 7.8.5.1-1 1st", + /* 26*/ { BARCODE_EAN128, GS1_MODE, "[01]95012345678903", 0, 1, 134, 1, "GGS Figure 7.8.5.1-1 1st", "11010011100111101011101100110110010111101000110011011001110110111010111011000100001011001101101111010010011000110110001101100011101011" }, - /* 18*/ { BARCODE_EAN128, GS1_MODE, "[3102]000400", 0, 1, 101, "GS1 General Specifications Figure 7.8.5.1-1 2nd", + /* 27*/ { BARCODE_EAN128, GS1_MODE, "[3102]000400", 0, 1, 101, 1, "GGS Figure 7.8.5.1-1 2nd", "11010011100111101011101101100011011001100110110110011001001000110011011001100110110111101100011101011" }, - /* 19*/ { BARCODE_EAN128, GS1_MODE, "[01]95012345678903[3102]000400", 0, 1, 189, "GS1 General Specifications Figure 7.8.5.1-2", + /* 28*/ { BARCODE_EAN128, GS1_MODE, "[01]95012345678903[3102]000400", 0, 1, 189, 1, "GGS Figure 7.8.5.1-2", "110100111001111010111011001101100101111010001100110110011101101110101110110001000010110011011011110100100110001101100011011001100110110110011001001000110011011001100100100110001100011101011" }, - /* 20*/ { BARCODE_EAN128, GS1_MODE, "[8005]000365", 0, 1, 101, "GS1 General Specifications Figure 7.8.5.2-1 1st", + /* 29*/ { BARCODE_EAN128, GS1_MODE, "[8005]000365", 0, 1, 101, 1, "GGS Figure 7.8.5.2-1 1st", "11010011100111101011101010011110010001001100110110011001001001100010010110000100100001101100011101011" }, - /* 21*/ { BARCODE_EAN128, GS1_MODE, "[10]123456", 0, 1, 90, "GS1 General Specifications Figure 7.8.5.2-1 2nd", + /* 30*/ { BARCODE_EAN128, GS1_MODE, "[10]123456", 0, 1, 90, 1, "GGS Figure 7.8.5.2-1 2nd", "110100111001111010111011001000100101100111001000101100011100010110110010000101100011101011" }, - /* 22*/ { BARCODE_EAN128, GS1_MODE, "[8005]000365[10]123456", 0, 1, 156, "GS1 General Specifications Figure 7.8.5.2-2", + /* 31*/ { BARCODE_EAN128, GS1_MODE, "[8005]000365[10]123456", 0, 1, 156, 1, "GGS Figure 7.8.5.2-2", "110100111001111010111010100111100100010011001101100110010010011000100101100001111010111011001000100101100111001000101100011100010110101100001001100011101011" }, - /* 23*/ { BARCODE_EAN128, GS1_MODE, "[403]27653113+99000900090010", 0, 1, 222, "DHL Leitcode https://www.dhl.de/de/geschaeftskunden/paket/information/geschaeftskunden/abrechnung/leitcodierung.html", + /* 32*/ { BARCODE_EAN128, GS1_MODE, "[403]27653113+99000900090010", 0, 1, 222, 1, "DHL Leitcode https://www.dhl.de/de/geschaeftskunden/paket/information/geschaeftskunden/abrechnung/leitcodierung.html", "110100111001111010111011000101000110001101101100101000011011101110110001001001011110111011001011100110001001001011101111010111011110110110011001100100100011011001100110010010001101100110011001000100110001000101100011101011" }, - /* 24*/ { BARCODE_EAN128, GS1_MODE, "[00]340433935039756615", 0, 1, 156, "DHL Identcode https://www.dhl.de/de/geschaeftskunden/paket/information/geschaeftskunden/abrechnung/leitcodierung.html", + /* 33*/ { BARCODE_EAN128, GS1_MODE, "[00]340433935039756615", 0, 1, 156, 1, "DHL Identcode https://www.dhl.de/de/geschaeftskunden/paket/information/geschaeftskunden/abrechnung/leitcodierung.html", "110100111001111010111011011001100100010110001001000110010100011000101000111101100010111011010001000110000100101001000011010111001100100111001101100011101011" }, - /* 25*/ { BARCODE_EAN14, GS1_MODE, "4070071967072", 0, 1, 134, "Verified manually against tec-it", + /* 34*/ { BARCODE_EAN14, GS1_MODE, "4070071967072", 0, 1, 134, 1, "Verified manually against tec-it", "11010011100111101011101100110110011000101000101100001001001100010011001011100100001011001001100010011001001110110111001001100011101011" }, - /* 26*/ { BARCODE_NVE18, GS1_MODE, "40700000071967072", 0, 1, 156, "Verified manually against tec-it", + /* 35*/ { BARCODE_NVE18, GS1_MODE, "40700000071967072", 0, 1, 156, 1, "Verified manually against tec-it", "110100111001111010111011011001100110001010001011000010011011001100110110011001001100010011001011100100001011001001100010011001001110110111011101100011101011" }, - /* 27*/ { BARCODE_HIBC_128, UNICODE_MODE, "83278F8G9H0J2G", 0, 1, 211, "ANSI/HIBC 2.6 - 2016 Section 4.1, not same, uses different encoding (eg begins StartA instead of StartB)", + /* 36*/ { BARCODE_HIBC_128, UNICODE_MODE, "83278F8G9H0J2G", 0, 1, 211, 1, "ANSI/HIBC 2.6 - 2016 Section 4.1, not same, uses different encoding (eg begins StartA instead of StartB)", "1101001000011000100100111010011001011101111011000110110110000101001011110111010001100010111010011001101000100011100101100110001010001001110110010110111000110011100101101000100010001001100111101010001100011101011" }, - /* 28*/ { BARCODE_HIBC_128, UNICODE_MODE, "A123BJC5D6E71", 0, 1, 200, "ANSI/HIBC 2.6 - 2016 Figure 1, same", + /* 37*/ { BARCODE_HIBC_128, UNICODE_MODE, "A123BJC5D6E71", 0, 1, 200, 1, "ANSI/HIBC 2.6 - 2016 Figure 1, same", "11010010000110001001001010001100010011100110110011100101100101110010001011000101101110001000100011011011100100101100010001100111010010001101000111011011101001110011011010001000110001101101100011101011" }, - /* 29*/ { BARCODE_HIBC_128, UNICODE_MODE, "$$52001510X3G", 0, 1, 178, "ANSI/HIBC 2.6 - 2016 Figure 5, same", + /* 38*/ { BARCODE_HIBC_128, UNICODE_MODE, "$$52001510X3G", 0, 1, 178, 1, "ANSI/HIBC 2.6 - 2016 Figure 5, same", "1101001000011000100100100100011001001000110010111011110110111000101101100110010111001100110010001001011110111011100010110110010111001101000100010110001000100011110101100011101011" }, }; @@ -558,9 +586,9 @@ static void test_encode(int index, int generate, int debug) { assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); if (generate) { - printf(" /*%3d*/ { %s, %s, \"%s\", %s, %d, %d, \"%s\",\n", + printf(" /*%3d*/ { %s, %s, \"%s\", %s, %d, %d, %d, \"%s\",\n", i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), - testUtilErrorName(data[i].ret), symbol->rows, symbol->width, data[i].comment); + testUtilErrorName(data[i].ret), symbol->rows, symbol->width, data[i].bwipp_cmp, data[i].comment); testUtilModulesDump(symbol, " ", "\n"); printf(" },\n"); } else { @@ -575,12 +603,16 @@ static void test_encode(int index, int generate, int debug) { } if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, -1, -1, debug)) { - ret = testUtilBwipp(symbol, -1, -1, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); - assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), ret); + if (!data[i].bwipp_cmp) { + if (debug & ZINT_DEBUG_TEST_PRINT) printf("%d: %s not BWIPP compatible (%s)\n", i, testUtilBarcodeName(symbol->symbology), data[i].comment); + } else { + ret = testUtilBwipp(symbol, -1, -1, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), ret); - ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); - assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", - i, testUtilBarcodeName(data[i].symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } } } } diff --git a/backend/tests/test_composite.c b/backend/tests/test_composite.c index c98eec27..1a9d7813 100644 --- a/backend/tests/test_composite.c +++ b/backend/tests/test_composite.c @@ -55,22 +55,22 @@ static void test_eanx_leading_zeroes(int index, int debug) { /* 5*/ { BARCODE_EANX_CC, "123456", "[21]A12345678", 0, 8, 72 }, /* 6*/ { BARCODE_EANX_CC, "1234567", "[21]A12345678", 0, 8, 72 }, /* 7*/ { BARCODE_EANX_CC, "12345678", "[21]A12345678", 0, 7, 99 }, // EAN-13 - /* 8*/ { BARCODE_EANX_CC, "1+12", "[21]A12345678", 0, 8, 101 }, // EAN-8 + EAN-2 - /* 9*/ { BARCODE_EANX_CC, "12+12", "[21]A12345678", 0, 8, 101 }, - /*10*/ { BARCODE_EANX_CC, "123+12", "[21]A12345678", 0, 8, 101 }, - /*11*/ { BARCODE_EANX_CC, "1234+12", "[21]A12345678", 0, 8, 101 }, - /*12*/ { BARCODE_EANX_CC, "12345+12", "[21]A12345678", 0, 8, 101 }, - /*13*/ { BARCODE_EANX_CC, "123456+12", "[21]A12345678", 0, 8, 101 }, - /*14*/ { BARCODE_EANX_CC, "1234567+12", "[21]A12345678", 0, 8, 101 }, - /*15*/ { BARCODE_EANX_CC, "12345678+12", "[21]A12345678", 0, 7, 128 }, // EAN-13 + EAN-2 - /*16*/ { BARCODE_EANX_CC, "1+123", "[21]A12345678", 0, 8, 128 }, // EAN-8 + EAN-5 - /*17*/ { BARCODE_EANX_CC, "12+123", "[21]A12345678", 0, 8, 128 }, - /*18*/ { BARCODE_EANX_CC, "123+123", "[21]A12345678", 0, 8, 128 }, - /*19*/ { BARCODE_EANX_CC, "1234+123", "[21]A12345678", 0, 8, 128 }, - /*20*/ { BARCODE_EANX_CC, "12345+123", "[21]A12345678", 0, 8, 128 }, - /*21*/ { BARCODE_EANX_CC, "123456+123", "[21]A12345678", 0, 8, 128 }, - /*22*/ { BARCODE_EANX_CC, "1234567+123", "[21]A12345678", 0, 8, 128 }, - /*23*/ { BARCODE_EANX_CC, "12345678+123", "[21]A12345678", 0, 7, 155 }, // EAN-13 + EAN-5 + /* 8*/ { BARCODE_EANX_CC, "1+12", "[21]A12345678", 0, 8, 99 }, // EAN-8 + EAN-2 + /* 9*/ { BARCODE_EANX_CC, "12+12", "[21]A12345678", 0, 8, 99 }, + /*10*/ { BARCODE_EANX_CC, "123+12", "[21]A12345678", 0, 8, 99 }, + /*11*/ { BARCODE_EANX_CC, "1234+12", "[21]A12345678", 0, 8, 99 }, + /*12*/ { BARCODE_EANX_CC, "12345+12", "[21]A12345678", 0, 8, 99 }, + /*13*/ { BARCODE_EANX_CC, "123456+12", "[21]A12345678", 0, 8, 99 }, + /*14*/ { BARCODE_EANX_CC, "1234567+12", "[21]A12345678", 0, 8, 99 }, + /*15*/ { BARCODE_EANX_CC, "12345678+12", "[21]A12345678", 0, 7, 126 }, // EAN-13 + EAN-2 + /*16*/ { BARCODE_EANX_CC, "1+123", "[21]A12345678", 0, 8, 126 }, // EAN-8 + EAN-5 + /*17*/ { BARCODE_EANX_CC, "12+123", "[21]A12345678", 0, 8, 126 }, + /*18*/ { BARCODE_EANX_CC, "123+123", "[21]A12345678", 0, 8, 126 }, + /*19*/ { BARCODE_EANX_CC, "1234+123", "[21]A12345678", 0, 8, 126 }, + /*20*/ { BARCODE_EANX_CC, "12345+123", "[21]A12345678", 0, 8, 126 }, + /*21*/ { BARCODE_EANX_CC, "123456+123", "[21]A12345678", 0, 8, 126 }, + /*22*/ { BARCODE_EANX_CC, "1234567+123", "[21]A12345678", 0, 8, 126 }, + /*23*/ { BARCODE_EANX_CC, "12345678+123", "[21]A12345678", 0, 7, 153 }, // EAN-13 + EAN-5 }; int data_size = sizeof(data) / sizeof(struct item); @@ -1129,6 +1129,93 @@ static void test_examples(int index, int generate, int debug) { "000000000101100011000010100010011001001101001100011011101001110001110100100111101011001000010010100110001100100111001010000100010111001000100111000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "000000011010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110011011000110101111011101000110111011000111010110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }, + /*56*/ { BARCODE_EANX_CC, 1, "123456789012+12", "[91]123456789012345678901", 0, 8, 126, "Example of EAN-13 with 2-digit addon, CC-A 4 cols, 4 rows", + "110100100011110011010011100101110111000100001001000110101110111001000001100000100110111011101100101000000000000000000000000000" + "110101100011101011001000000110011110101111101001000010110010111101100001100100111000001011001100101000000000000000000000000000" + "110101110011101011111010000111111001101110101011000010111110101111001101001101001110000011011100101000000000000000000000000000" + "110101111010001100110000100100001011100011101011100010100011100111000101101000100011000011011110101000000000000000000000000000" + "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000" + "001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000" + "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000" + "000101001001101111010011101011000100001010010001010101001000111010011100101100110110110010010001010000000101100110010100100110" + }, + /*57*/ { BARCODE_EANX_CC, 1, "123456789012+54321", "[91]1234567890", 0, 7, 153, "Example of EAN-13 with 5-digit addon, CC-B 4 cols, 3 rows", + "110110111011110011010011100101110111000100001001110100101110111001000001100000100110111011011000101000000000000000000000000000000000000000000000000000000" + "110110110011111101010011100111110001001001101001100100110100011100010001001011111100111011001000101000000000000000000000000000000000000000000000000000000" + "110110100010100000101111000111001111001011101001100110110011111010010001001111101101000011101000101000000000000000000000000000000000000000000000000000000" + "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000" + "001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000" + "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000" + "000101001001101111010011101011000100001010010001010101001000111010011100101100110110110010010001010000000101101110010101000110101000010100100110100110010" + }, + /*58*/ { BARCODE_UPCA_CC, 1, "12345678901+12", "[91]123456789", 0, 7, 128, "Example of UPC-A with 2-digit addon, CC-A 4 cols, 3 rows", + "11011011101111001101001110010111011100010000100111010010111011100100000110000010011011101101100010100000000000000000000000000000" + "11011011001110011100111101011000010001110010100110010011101011001000000100101111110011101100100010100000000000000000000000000000" + "11011010001000011110010001010111101000000100100110011010001110000101100110111000100011101110100010100000000000000000000000000000" + "00010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000" + "00100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000" + "00010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000" + "00010100110010010011011110101000110110001010111101010100010010010001110100111001011001101101100101000000000101100110010100100110" + }, + /*59*/ { BARCODE_UPCA_CC, 2, "12345678901+12121", "[91]1234567890123", 0, 8, 155, "Example of UPC-A with 5-digit addon, CC-B 4 cols, 4 rows", + "11010011101000111110100111011011111101011100100111011011010000111101100110010111000010001101001000100000000000000000000000000000000000000000000000000000000" + "11010011001011001001110000010111110110000010100111010011011111100110100111010011111001001101011000100000000000000000000000000000000000000000000000000000000" + "11010001001110011010000110011001000001011000100110010010011110111101000111000111010001001101011100100000000000000000000000000000000000000000000000000000000" + "11010001101100010111000001011101101110010000100110011011111000101011000111100010010100001101011110100000000000000000000000000000000000000000000000000000000" + "00010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000" + "00100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000" + "00010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000" + "00010100110010010011011110101000110110001010111101010100010010010001110100111001011001101101100101000000000101100110010100100110101100110100110110100110010" + }, + /*60*/ { BARCODE_UPCE_CC, 1, "0654321+89", "[91]1", 0, 9, 82, "Example of UPC-E with 2-digit addon, CC-A 2 cols, 5 rows", + "1101100110111101110101111101010001000111100011110101001000000000000000000000000000" + "1101101110111011000010001101110010101110000011100101001000000000000000000000000000" + "1101101100110001011111011101111010000100100011101101001000000000000000000000000000" + "1101101000100111011100111101110011110101110011101001001000000000000000000000000000" + "1101001000110011001000000101110100011011110011101001101000000000000000000000000000" + "0001000000000000000000000000000000000000000000000000010000000000000000000000000000" + "0010000000000000000000000000000000000000000000000000001000000000000000000000000000" + "0001000000000000000000000000000000000000000000000000010000000000000000000000000000" + "0001010000101011000100111010111101001101100110010101010000000101101101110100101110" + }, + /*61*/ { BARCODE_UPCE_CC, 2, "1876543+56789", "[91]12345", 0, 12, 109, "Example of UPC-E with 5-digit addon, CC-B 2 cols, 8 rows", + "1100100010111011111011101001000001000010001011001000101000000000000000000000000000000000000000000000000000000" + "1110100010110100001111011001100101110000100011101000101000000000000000000000000000000000000000000000000000000" + "1110110010111011001001111101000111100100001011101100101000000000000000000000000000000000000000000000000000000" + "1100110010110011101100010001010111110111110011001100101000000000000000000000000000000000000000000000000000000" + "1101110010111110010011011101001111110100110011011100101000000000000000000000000000000000000000000000000000000" + "1101111010110011100001011101001101000011100011011110101000000000000000000000000000000000000000000000000000000" + "1100111010101000100000100001011110111110110011001110101000000000000000000000000000000000000000000000000000000" + "1110111010101111001011110001011110001001111011101110101000000000000000000000000000000000000000000000000000000" + "0001000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000" + "0010000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000" + "0001000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000" + "0001010110111001000100001010110001010001101000010101010000000101101100010101011110100100010101101110100101110" + }, + /*62*/ { BARCODE_EANX_CC, 1, "9876543+65", "[91]1234567", 0, 8, 99, "Example of EAN-8 with 2-digit addon, CC-A 3 cols, 4 rows", + "100100011111001101010011000111000101110011001100010111010000011101001101000000000000000000000000000" + "110111111001101001010111000110111100101100001111000100111101011101011101000000000000000000000000000" + "100001011000001101010110000101011111011111001110100100001110011101011001000000000000000000000000000" + "111100100011001101010010000110010011111011101010011111000110011101010001000000000000000000000000000" + "000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000" + "000100000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000" + "000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000" + "000010100010110110111011101101011110101010011101011100100001011100101010000000101101011110101110010" + }, + /*63*/ { BARCODE_EANX_CC, 2, "9876543+74083", "[91]123456789012345678", 0, 12, 136, "Example of EAN-8 with 5-digit addon, CC-B 3 cols, 8 rows", + "1100111010111011111011101001000010110100000100001000101111101101001111011001110101000000000000000000000000000000000000000000000000000000" + "1110111010110010111000010001000010010111001011001000001110001101110100011101110101000000000000000000000000000000000000000000000000000000" + "1110011010110111111001101001000011010101000101111000001100100110111111011100110101000000000000000000000000000000000000000000000000000000" + "1111011010111011010000110001000111010110000110110011001110011010011000011110110101000000000000000000000000000000000000000000000000000000" + "1111001010111011011100100001000110010111011101111001001010011110000100011110010101000000000000000000000000000000000000000000000000000000" + "1110001010111111010110001001000100010111001011111101101001111000011011011100010101000000000000000000000000000000000000000000000000000000" + "1100001010111100100010111101001100010111001111001100101001110001110010011000010101000000000000000000000000000000000000000000000000000000" + "1100011010110011001111010001001110010111110111101110101011100111111001011000110101000000000000000000000000000000000000000000000000000000" + "0000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000" + "0000000000000100000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000" + "0000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000" + "0000000000000010100010110110111011101101011110101010011101011100100001011100101010000000101101110110100111010100011010101101110101000010" + }, }; int data_size = sizeof(data) / sizeof(struct item); @@ -1469,7 +1556,7 @@ static void test_ean128_cc_shift(int index, int generate, int debug) { if (do_bwipp && testUtilCanBwipp(symbol->symbology, data[i].option_1, -1, -1, debug)) { if (!data[i].bwipp_cmp) { - if (debug & ZINT_DEBUG_TEST_PRINT) printf("%d: %s skipped, not BWIPP compatible\n", i, testUtilBarcodeName(symbol->symbology)); + if (debug & ZINT_DEBUG_TEST_PRINT) printf("%d: %s not BWIPP compatible (%s)\n", i, testUtilBarcodeName(symbol->symbology), data[i].comment); } else { ret = testUtilBwipp(symbol, data[i].option_1, -1, -1, data[i].composite, composite_length, symbol->primary, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), ret); diff --git a/backend/tests/test_png.c b/backend/tests/test_png.c index d54fcf8a..8c66b4bd 100644 --- a/backend/tests/test_png.c +++ b/backend/tests/test_png.c @@ -125,6 +125,16 @@ static void test_print(int index, int generate, int debug) { }; struct item data[] = { /* 0*/ { BARCODE_CODABLOCKF, 3, -1, "AAAAAAAAA", "../data/png/codablockf_3rows.png" }, + /* 1*/ { BARCODE_EANX, -1, -1, "9771384524017+12", "../data/png/ean13_2addon_ggs_5.2.2.5.1-2.png" }, + /* 2*/ { BARCODE_EANX, -1, -1, "9780877799306+54321", "../data/png/ean13_5addon_ggs_5.2.2.5.2-2.png" }, + /* 3*/ { BARCODE_UPCA, -1, -1, "012345678905+24", "../data/png/upca_2addon_ggs_5.2.6.6-5.png" }, + /* 4*/ { BARCODE_UPCA, -1, -1, "614141234417+12345", "../data/png/upca_5addon.png" }, + /* 5*/ { BARCODE_UPCE, -1, -1, "1234567+12", "../data/png/upce_2addon.png" }, + /* 6*/ { BARCODE_UPCE, -1, -1, "1234567+12345", "../data/png/upce_5addon.png" }, + /* 7*/ { BARCODE_EANX, -1, -1, "1234567+12", "../data/png/ean8_2addon.png" }, + /* 8*/ { BARCODE_EANX, -1, -1, "1234567+12345", "../data/png/ean8_5addon.png" }, + /* 9*/ { BARCODE_EANX, -1, -1, "12345", "../data/png/ean5.png" }, + /* 10*/ { BARCODE_EANX, -1, -1, "12", "../data/png/ean2.png" }, }; int data_size = ARRAY_SIZE(data); diff --git a/backend/tests/test_raster.c b/backend/tests/test_raster.c index 1d8b9a91..113b10db 100644 --- a/backend/tests/test_raster.c +++ b/backend/tests/test_raster.c @@ -124,111 +124,122 @@ static void test_buffer(int index, int generate, int debug) { /* 5*/ { BARCODE_C25IND, "0000000000", "", 50, 1, 159, 318, 118 }, /* 6*/ { BARCODE_CODE39, "0000000000", "", 50, 1, 155, 310, 118 }, /* 7*/ { BARCODE_EXCODE39, "0000000000", "", 50, 1, 155, 310, 118 }, - /* 8*/ { BARCODE_EANX, "123456789012", "", 50, 1, 95, 230, 118 }, - /* 9*/ { BARCODE_EANX_CHK, "1234567890128", "", 50, 1, 95, 230, 118 }, - /* 10*/ { BARCODE_EANX, "123456789012+12", "", 50, 1, 124, 288, 118 }, - /* 11*/ { BARCODE_EANX, "123456789012+12345", "", 50, 1, 151, 342, 118 }, - /* 12*/ { BARCODE_EANX, "1234567", "", 50, 1, 67, 134, 118 }, - /* 13*/ { BARCODE_EANX, "1234567+12", "", 50, 1, 96, 192, 118 }, - /* 14*/ { BARCODE_EANX, "1234567+12345", "", 50, 1, 123, 246, 118 }, - /* 15*/ { BARCODE_EANX, "1234", "", 50, 1, 47, 94, 118 }, - /* 16*/ { BARCODE_EANX, "12", "", 50, 1, 20, 40, 118 }, - /* 17*/ { BARCODE_EAN128, "[01]12345678901234", "", 50, 1, 134, 268, 118 }, - /* 18*/ { BARCODE_CODABAR, "A00000000B", "", 50, 1, 102, 204, 118 }, - /* 19*/ { BARCODE_CODE128, "0000000000", "", 50, 1, 90, 180, 118 }, - /* 20*/ { BARCODE_DPLEIT, "1234567890123", "", 50, 1, 135, 270, 118 }, - /* 21*/ { BARCODE_DPIDENT, "12345678901", "", 50, 1, 117, 234, 118 }, - /* 22*/ { BARCODE_CODE16K, "0000000000", "", 20, 2, 70, 162, 44 }, - /* 23*/ { BARCODE_CODE49, "0000000000", "", 20, 2, 70, 162, 44 }, - /* 24*/ { BARCODE_CODE93, "0000000000", "", 50, 1, 127, 254, 118 }, - /* 25*/ { BARCODE_FLAT, "1234567890", "", 50, 1, 90, 180, 100 }, - /* 26*/ { BARCODE_RSS14, "1234567890123", "", 50, 1, 96, 192, 118 }, - /* 27*/ { BARCODE_RSS_LTD, "1234567890123", "", 50, 1, 74, 148, 118 }, - /* 28*/ { BARCODE_RSS_EXP, "[01]12345678901234", "", 34, 1, 134, 268, 86 }, - /* 29*/ { BARCODE_TELEPEN, "0000000000", "", 50, 1, 208, 416, 118 }, - /* 30*/ { BARCODE_UPCA, "12345678904", "", 50, 1, 95, 230, 118 }, - /* 31*/ { BARCODE_UPCA_CHK, "12345678905", "", 50, 1, 95, 230, 118 }, - /* 32*/ { BARCODE_UPCA, "12345678904+12", "", 50, 1, 124, 288, 118 }, - /* 33*/ { BARCODE_UPCA, "12345678904+12345", "", 50, 1, 151, 342, 118 }, - /* 34*/ { BARCODE_UPCE, "1234567", "", 50, 1, 51, 142, 118 }, - /* 35*/ { BARCODE_UPCE_CHK, "12345670", "", 50, 1, 51, 142, 118 }, - /* 36*/ { BARCODE_UPCE, "1234567+12", "", 50, 1, 80, 200, 118 }, - /* 37*/ { BARCODE_UPCE, "1234567+12345", "", 50, 1, 107, 254, 118 }, - /* 38*/ { BARCODE_POSTNET, "00000000000", "", 12, 2, 185, 370, 24 }, - /* 39*/ { BARCODE_MSI_PLESSEY, "0000000000", "", 50, 1, 127, 254, 118 }, - /* 40*/ { BARCODE_FIM, "A", "", 50, 1, 17, 34, 100 }, - /* 41*/ { BARCODE_LOGMARS, "0000000000", "", 50, 1, 191, 382, 118 }, - /* 42*/ { BARCODE_PHARMA, "123456", "", 50, 1, 58, 116, 100 }, - /* 43*/ { BARCODE_PZN, "123456", "", 50, 1, 142, 284, 118 }, - /* 44*/ { BARCODE_PHARMA_TWO, "12345678", "", 10, 2, 29, 58, 20 }, - /* 45*/ { BARCODE_PDF417, "0000000000", "", 21, 7, 103, 206, 42 }, - /* 46*/ { BARCODE_PDF417TRUNC, "0000000000", "", 21, 7, 68, 136, 42 }, - /* 47*/ { BARCODE_MAXICODE, "0000000000", "", 165, 33, 30, 300, 300 }, - /* 48*/ { BARCODE_QRCODE, "1234567890AB", "", 21, 21, 21, 42, 42 }, - /* 49*/ { BARCODE_CODE128B, "0000000000", "", 50, 1, 145, 290, 118 }, - /* 50*/ { BARCODE_AUSPOST, "12345678901234567890123", "", 8, 3, 133, 266, 16 }, - /* 51*/ { BARCODE_AUSREPLY, "12345678", "", 8, 3, 73, 146, 16 }, - /* 52*/ { BARCODE_AUSROUTE, "12345678", "", 8, 3, 73, 146, 16 }, - /* 53*/ { BARCODE_AUSREDIRECT, "12345678", "", 8, 3, 73, 146, 16 }, - /* 54*/ { BARCODE_ISBNX, "123456789", "", 50, 1, 95, 230, 118 }, - /* 55*/ { BARCODE_ISBNX, "123456789+12", "", 50, 1, 124, 288, 118 }, - /* 56*/ { BARCODE_ISBNX, "123456789+12345", "", 50, 1, 151, 342, 118 }, - /* 57*/ { BARCODE_RM4SCC, "0000000000", "", 8, 3, 91, 182, 16 }, - /* 58*/ { BARCODE_DATAMATRIX, "ABC", "", 10, 10, 10, 20, 20 }, - /* 59*/ { BARCODE_EAN14, "1234567890123", "", 50, 1, 134, 268, 118 }, - /* 60*/ { BARCODE_VIN, "00000000000000000", "", 50, 1, 246, 492, 118 }, - /* 61*/ { BARCODE_CODABLOCKF, "0000000000", "", 20, 2, 101, 242, 44 }, - /* 62*/ { BARCODE_NVE18, "12345678901234567", "", 50, 1, 156, 312, 118 }, - /* 63*/ { BARCODE_JAPANPOST, "0000000000", "", 8, 3, 133, 266, 16 }, - /* 64*/ { BARCODE_KOREAPOST, "123456", "", 50, 1, 167, 334, 118 }, - /* 65*/ { BARCODE_RSS14STACK, "0000000000000", "", 13, 3, 50, 100, 26 }, - /* 66*/ { BARCODE_RSS14STACK_OMNI, "0000000000000", "", 69, 5, 50, 100, 138 }, - /* 67*/ { BARCODE_RSS_EXPSTACK, "[01]12345678901234", "", 71, 5, 102, 204, 142 }, - /* 68*/ { BARCODE_PLANET, "00000000000", "", 12, 2, 185, 370, 24 }, - /* 69*/ { BARCODE_MICROPDF417, "0000000000", "", 12, 6, 82, 164, 24 }, - /* 70*/ { BARCODE_ONECODE, "12345678901234567890", "", 8, 3, 129, 258, 16 }, - /* 71*/ { BARCODE_PLESSEY, "0000000000", "", 50, 1, 227, 454, 118 }, - /* 72*/ { BARCODE_TELEPEN_NUM, "0000000000", "", 50, 1, 128, 256, 118 }, - /* 73*/ { BARCODE_ITF14, "0000000000", "", 50, 1, 135, 382, 150 }, - /* 74*/ { BARCODE_KIX, "123456ABCDE", "", 8, 3, 87, 174, 16 }, - /* 75*/ { BARCODE_AZTEC, "1234567890AB", "", 15, 15, 15, 30, 30 }, - /* 76*/ { BARCODE_DAFT, "DAFTDAFTDAFTDAFT", "", 8, 3, 31, 62, 16 }, - /* 77*/ { BARCODE_MICROQR, "12345", "", 11, 11, 11, 22, 22 }, - /* 78*/ { BARCODE_HIBC_128, "0000000000", "", 50, 1, 134, 268, 118 }, - /* 79*/ { BARCODE_HIBC_39, "0000000000", "", 50, 1, 223, 446, 118 }, - /* 80*/ { BARCODE_HIBC_DM, "ABC", "", 12, 12, 12, 24, 24 }, - /* 81*/ { BARCODE_HIBC_QR, "1234567890AB", "", 21, 21, 21, 42, 42 }, - /* 82*/ { BARCODE_HIBC_PDF, "0000000000", "", 27, 9, 103, 206, 54 }, - /* 83*/ { BARCODE_HIBC_MICPDF, "0000000000", "", 34, 17, 38, 76, 68 }, - /* 84*/ { BARCODE_HIBC_BLOCKF, "0000000000", "", 30, 3, 101, 242, 64 }, - /* 85*/ { BARCODE_HIBC_AZTEC, "1234567890AB", "", 19, 19, 19, 38, 38 }, - /* 86*/ { BARCODE_DOTCODE, "ABC", "", 11, 11, 16, 33, 23 }, - /* 87*/ { BARCODE_HANXIN, "1234567890AB", "", 23, 23, 23, 46, 46 }, - /* 88*/ { BARCODE_MAILMARK, "01000000000000000AA00AA0A", "", 10, 3, 155, 310, 20 }, - /* 89*/ { BARCODE_AZRUNE, "255", "", 11, 11, 11, 22, 22 }, - /* 90*/ { BARCODE_CODE32, "12345678", "", 50, 1, 103, 206, 118 }, - /* 91*/ { BARCODE_EANX_CC, "123456789012", "[20]01", 50, 7, 99, 238, 118 }, - /* 92*/ { BARCODE_EANX_CC, "123456789012+12", "[20]01", 50, 7, 128, 296, 118 }, - /* 93*/ { BARCODE_EANX_CC, "123456789012+12345", "[20]01", 50, 7, 155, 350, 118 }, - /* 94*/ { BARCODE_EAN128_CC, "[01]12345678901234", "[20]01", 50, 5, 145, 290, 118 }, - /* 95*/ { BARCODE_RSS14_CC, "1234567890123", "[20]01", 21, 5, 100, 200, 60 }, - /* 96*/ { BARCODE_RSS_LTD_CC, "1234567890123", "[20]01", 19, 6, 74, 148, 56 }, - /* 97*/ { BARCODE_RSS_EXP_CC, "[01]12345678901234", "[20]01", 41, 5, 134, 268, 100 }, - /* 98*/ { BARCODE_UPCA_CC, "12345678901", "[20]01", 50, 7, 99, 238, 118 }, - /* 99*/ { BARCODE_UPCA_CC, "12345678901+12", "[20]01", 50, 7, 128, 296, 118 }, - /*100*/ { BARCODE_UPCA_CC, "12345678901+12345", "[20]01", 50, 7, 155, 350, 118 }, - /*101*/ { BARCODE_UPCE_CC, "1234567", "[20]01", 50, 9, 55, 150, 118 }, - /*102*/ { BARCODE_UPCE_CC, "1234567+12", "[20]01", 50, 9, 84, 208, 118 }, - /*103*/ { BARCODE_UPCE_CC, "1234567+12345", "[20]01", 50, 9, 111, 262, 118 }, - /*104*/ { BARCODE_RSS14STACK_CC, "0000000000000", "[20]01", 24, 9, 56, 112, 48 }, - /*105*/ { BARCODE_RSS14_OMNI_CC, "0000000000000", "[20]01", 80, 11, 56, 112, 160 }, - /*106*/ { BARCODE_RSS_EXPSTACK_CC, "[01]12345678901234", "[20]01", 78, 9, 102, 204, 156 }, - /*107*/ { BARCODE_CHANNEL, "00", "", 50, 1, 19, 38, 118 }, - /*108*/ { BARCODE_CODEONE, "12345678901234567890", "", 22, 22, 22, 44, 44 }, - /*109*/ { BARCODE_GRIDMATRIX, "ABC", "", 18, 18, 18, 36, 36 }, - /*110*/ { BARCODE_UPNQR, "1234567890AB", "", 77, 77, 77, 154, 154 }, - /*111*/ { BARCODE_ULTRA, "0000000000", "", 13, 13, 18, 36, 26 }, - /*112*/ { BARCODE_RMQR, "12345", "", 11, 11, 27, 54, 22 }, + /* 8*/ { BARCODE_EANX, "123456789012", "", 50, 1, 95, 226, 118 }, + /* 9*/ { BARCODE_EANX_CHK, "1234567890128", "", 50, 1, 95, 226, 118 }, + /* 10*/ { BARCODE_EANX, "123456789012+12", "", 50, 1, 122, 276, 118 }, + /* 11*/ { BARCODE_EANX_CHK, "1234567890128+12", "", 50, 1, 122, 276, 118 }, + /* 12*/ { BARCODE_EANX, "123456789012+12345", "", 50, 1, 149, 330, 118 }, + /* 13*/ { BARCODE_EANX_CHK, "1234567890128+12345", "", 50, 1, 149, 330, 118 }, + /* 14*/ { BARCODE_EANX, "1234567", "", 50, 1, 67, 162, 118 }, + /* 15*/ { BARCODE_EANX_CHK, "12345670", "", 50, 1, 67, 162, 118 }, + /* 16*/ { BARCODE_EANX, "1234567+12", "", 50, 1, 94, 216, 118 }, + /* 17*/ { BARCODE_EANX_CHK, "12345670+12", "", 50, 1, 94, 216, 118 }, + /* 18*/ { BARCODE_EANX, "1234567+12345", "", 50, 1, 121, 270, 118 }, + /* 19*/ { BARCODE_EANX_CHK, "12345670+12345", "", 50, 1, 121, 270, 118 }, + /* 20*/ { BARCODE_EANX, "1234", "", 50, 1, 47, 118, 118 }, + /* 21*/ { BARCODE_EANX_CHK, "1234", "", 50, 1, 47, 118, 118 }, + /* 22*/ { BARCODE_EANX, "12", "", 50, 1, 20, 64, 118 }, + /* 23*/ { BARCODE_EANX_CHK, "12", "", 50, 1, 20, 64, 118 }, + /* 24*/ { BARCODE_EAN128, "[01]12345678901234", "", 50, 1, 134, 268, 118 }, + /* 25*/ { BARCODE_CODABAR, "A00000000B", "", 50, 1, 102, 204, 118 }, + /* 26*/ { BARCODE_CODE128, "0000000000", "", 50, 1, 90, 180, 118 }, + /* 27*/ { BARCODE_DPLEIT, "1234567890123", "", 50, 1, 135, 270, 118 }, + /* 28*/ { BARCODE_DPIDENT, "12345678901", "", 50, 1, 117, 234, 118 }, + /* 29*/ { BARCODE_CODE16K, "0000000000", "", 20, 2, 70, 162, 44 }, + /* 30*/ { BARCODE_CODE49, "0000000000", "", 20, 2, 70, 162, 44 }, + /* 31*/ { BARCODE_CODE93, "0000000000", "", 50, 1, 127, 254, 118 }, + /* 32*/ { BARCODE_FLAT, "1234567890", "", 50, 1, 90, 180, 100 }, + /* 33*/ { BARCODE_RSS14, "1234567890123", "", 50, 1, 96, 192, 118 }, + /* 34*/ { BARCODE_RSS_LTD, "1234567890123", "", 50, 1, 74, 148, 118 }, + /* 35*/ { BARCODE_RSS_EXP, "[01]12345678901234", "", 34, 1, 134, 268, 86 }, + /* 36*/ { BARCODE_TELEPEN, "0000000000", "", 50, 1, 208, 416, 118 }, + /* 37*/ { BARCODE_UPCA, "12345678904", "", 50, 1, 95, 226, 118 }, + /* 38*/ { BARCODE_UPCA_CHK, "123456789043", "", 50, 1, 95, 226, 118 }, + /* 39*/ { BARCODE_UPCA, "12345678904+12", "", 50, 1, 124, 276, 118 }, + /* 40*/ { BARCODE_UPCA_CHK, "123456789043+12", "", 50, 1, 124, 276, 118 }, + /* 41*/ { BARCODE_UPCA, "12345678904+12345", "", 50, 1, 151, 330, 118 }, + /* 42*/ { BARCODE_UPCA_CHK, "123456789043+12345", "", 50, 1, 151, 330, 118 }, + /* 43*/ { BARCODE_UPCE, "1234567", "", 50, 1, 51, 134, 118 }, + /* 44*/ { BARCODE_UPCE_CHK, "12345670", "", 50, 1, 51, 134, 118 }, + /* 45*/ { BARCODE_UPCE, "1234567+12", "", 50, 1, 78, 184, 118 }, + /* 46*/ { BARCODE_UPCE_CHK, "12345670+12", "", 50, 1, 78, 184, 118 }, + /* 47*/ { BARCODE_UPCE, "1234567+12345", "", 50, 1, 105, 238, 118 }, + /* 48*/ { BARCODE_UPCE_CHK, "12345670+12345", "", 50, 1, 105, 238, 118 }, + /* 49*/ { BARCODE_POSTNET, "00000000000", "", 12, 2, 185, 370, 24 }, + /* 50*/ { BARCODE_MSI_PLESSEY, "0000000000", "", 50, 1, 127, 254, 118 }, + /* 51*/ { BARCODE_FIM, "A", "", 50, 1, 17, 34, 100 }, + /* 52*/ { BARCODE_LOGMARS, "0000000000", "", 50, 1, 191, 382, 118 }, + /* 53*/ { BARCODE_PHARMA, "123456", "", 50, 1, 58, 116, 100 }, + /* 54*/ { BARCODE_PZN, "123456", "", 50, 1, 142, 284, 118 }, + /* 55*/ { BARCODE_PHARMA_TWO, "12345678", "", 10, 2, 29, 58, 20 }, + /* 56*/ { BARCODE_PDF417, "0000000000", "", 21, 7, 103, 206, 42 }, + /* 57*/ { BARCODE_PDF417TRUNC, "0000000000", "", 21, 7, 68, 136, 42 }, + /* 58*/ { BARCODE_MAXICODE, "0000000000", "", 165, 33, 30, 300, 300 }, // Differs from vector + /* 59*/ { BARCODE_QRCODE, "1234567890AB", "", 21, 21, 21, 42, 42 }, + /* 60*/ { BARCODE_CODE128B, "0000000000", "", 50, 1, 145, 290, 118 }, + /* 61*/ { BARCODE_AUSPOST, "12345678901234567890123", "", 8, 3, 133, 266, 16 }, + /* 62*/ { BARCODE_AUSREPLY, "12345678", "", 8, 3, 73, 146, 16 }, + /* 63*/ { BARCODE_AUSROUTE, "12345678", "", 8, 3, 73, 146, 16 }, + /* 64*/ { BARCODE_AUSREDIRECT, "12345678", "", 8, 3, 73, 146, 16 }, + /* 65*/ { BARCODE_ISBNX, "123456789", "", 50, 1, 95, 226, 118 }, + /* 66*/ { BARCODE_ISBNX, "123456789+12", "", 50, 1, 122, 276, 118 }, + /* 67*/ { BARCODE_ISBNX, "123456789+12345", "", 50, 1, 149, 330, 118 }, + /* 68*/ { BARCODE_RM4SCC, "0000000000", "", 8, 3, 91, 182, 16 }, + /* 69*/ { BARCODE_DATAMATRIX, "ABC", "", 10, 10, 10, 20, 20 }, + /* 70*/ { BARCODE_EAN14, "1234567890123", "", 50, 1, 134, 268, 118 }, + /* 71*/ { BARCODE_VIN, "00000000000000000", "", 50, 1, 246, 492, 118 }, + /* 72*/ { BARCODE_CODABLOCKF, "0000000000", "", 20, 2, 101, 242, 44 }, + /* 73*/ { BARCODE_NVE18, "12345678901234567", "", 50, 1, 156, 312, 118 }, + /* 74*/ { BARCODE_JAPANPOST, "0000000000", "", 8, 3, 133, 266, 16 }, + /* 75*/ { BARCODE_KOREAPOST, "123456", "", 50, 1, 167, 334, 118 }, + /* 76*/ { BARCODE_RSS14STACK, "0000000000000", "", 13, 3, 50, 100, 26 }, + /* 77*/ { BARCODE_RSS14STACK_OMNI, "0000000000000", "", 69, 5, 50, 100, 138 }, + /* 78*/ { BARCODE_RSS_EXPSTACK, "[01]12345678901234", "", 71, 5, 102, 204, 142 }, + /* 79*/ { BARCODE_PLANET, "00000000000", "", 12, 2, 185, 370, 24 }, + /* 80*/ { BARCODE_MICROPDF417, "0000000000", "", 12, 6, 82, 164, 24 }, + /* 81*/ { BARCODE_ONECODE, "12345678901234567890", "", 8, 3, 129, 258, 16 }, + /* 82*/ { BARCODE_PLESSEY, "0000000000", "", 50, 1, 227, 454, 118 }, + /* 83*/ { BARCODE_TELEPEN_NUM, "0000000000", "", 50, 1, 128, 256, 118 }, + /* 84*/ { BARCODE_ITF14, "0000000000", "", 50, 1, 135, 330, 138 }, + /* 85*/ { BARCODE_KIX, "123456ABCDE", "", 8, 3, 87, 174, 16 }, + /* 86*/ { BARCODE_AZTEC, "1234567890AB", "", 15, 15, 15, 30, 30 }, + /* 87*/ { BARCODE_DAFT, "DAFTDAFTDAFTDAFT", "", 8, 3, 31, 62, 16 }, + /* 88*/ { BARCODE_MICROQR, "12345", "", 11, 11, 11, 22, 22 }, + /* 89*/ { BARCODE_HIBC_128, "0000000000", "", 50, 1, 134, 268, 118 }, + /* 90*/ { BARCODE_HIBC_39, "0000000000", "", 50, 1, 223, 446, 118 }, + /* 91*/ { BARCODE_HIBC_DM, "ABC", "", 12, 12, 12, 24, 24 }, + /* 92*/ { BARCODE_HIBC_QR, "1234567890AB", "", 21, 21, 21, 42, 42 }, + /* 93*/ { BARCODE_HIBC_PDF, "0000000000", "", 27, 9, 103, 206, 54 }, + /* 94*/ { BARCODE_HIBC_MICPDF, "0000000000", "", 34, 17, 38, 76, 68 }, + /* 95*/ { BARCODE_HIBC_BLOCKF, "0000000000", "", 30, 3, 101, 242, 64 }, + /* 96*/ { BARCODE_HIBC_AZTEC, "1234567890AB", "", 19, 19, 19, 38, 38 }, + /* 97*/ { BARCODE_DOTCODE, "ABC", "", 11, 11, 16, 33, 23 }, // Differs from vector + /* 98*/ { BARCODE_HANXIN, "1234567890AB", "", 23, 23, 23, 46, 46 }, + /* 99*/ { BARCODE_MAILMARK, "01000000000000000AA00AA0A", "", 10, 3, 155, 310, 20 }, + /*100*/ { BARCODE_AZRUNE, "255", "", 11, 11, 11, 22, 22 }, + /*101*/ { BARCODE_CODE32, "12345678", "", 50, 1, 103, 206, 118 }, + /*102*/ { BARCODE_EANX_CC, "123456789012", "[20]01", 50, 7, 99, 234, 118 }, + /*103*/ { BARCODE_EANX_CC, "123456789012+12", "[20]01", 50, 7, 126, 284, 118 }, + /*104*/ { BARCODE_EANX_CC, "123456789012+12345", "[20]01", 50, 7, 153, 338, 118 }, + /*105*/ { BARCODE_EAN128_CC, "[01]12345678901234", "[20]01", 50, 5, 145, 290, 118 }, + /*106*/ { BARCODE_RSS14_CC, "1234567890123", "[20]01", 21, 5, 100, 200, 60 }, + /*107*/ { BARCODE_RSS_LTD_CC, "1234567890123", "[20]01", 19, 6, 74, 148, 56 }, + /*108*/ { BARCODE_RSS_EXP_CC, "[01]12345678901234", "[20]01", 41, 5, 134, 268, 100 }, + /*109*/ { BARCODE_UPCA_CC, "12345678901", "[20]01", 50, 7, 99, 234, 118 }, + /*110*/ { BARCODE_UPCA_CC, "12345678901+12", "[20]01", 50, 7, 128, 284, 118 }, + /*111*/ { BARCODE_UPCA_CC, "12345678901+12345", "[20]01", 50, 7, 155, 338, 118 }, + /*112*/ { BARCODE_UPCE_CC, "1234567", "[20]01", 50, 9, 55, 142, 118 }, + /*113*/ { BARCODE_UPCE_CC, "1234567+12", "[20]01", 50, 9, 82, 192, 118 }, + /*114*/ { BARCODE_UPCE_CC, "1234567+12345", "[20]01", 50, 9, 109, 246, 118 }, + /*115*/ { BARCODE_RSS14STACK_CC, "0000000000000", "[20]01", 24, 9, 56, 112, 48 }, + /*116*/ { BARCODE_RSS14_OMNI_CC, "0000000000000", "[20]01", 80, 11, 56, 112, 160 }, + /*117*/ { BARCODE_RSS_EXPSTACK_CC, "[01]12345678901234", "[20]01", 78, 9, 102, 204, 156 }, + /*118*/ { BARCODE_CHANNEL, "00", "", 50, 1, 19, 38, 118 }, + /*119*/ { BARCODE_CODEONE, "12345678901234567890", "", 22, 22, 22, 44, 44 }, + /*120*/ { BARCODE_GRIDMATRIX, "ABC", "", 18, 18, 18, 36, 36 }, + /*121*/ { BARCODE_UPNQR, "1234567890AB", "", 77, 77, 77, 154, 154 }, + /*122*/ { BARCODE_ULTRA, "0000000000", "", 13, 13, 18, 36, 26 }, + /*123*/ { BARCODE_RMQR, "12345", "", 11, 11, 27, 54, 22 }, }; int data_size = ARRAY_SIZE(data); @@ -305,34 +316,38 @@ static void test_upcean_hrt(int index, int debug) { }; // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) struct item data[] = { - /* 0*/ { BARCODE_EANX, -1, "123456789012", 0, 50, 1, 95, 230, 118, 103 /*text_row*/, 0, 20, -1, -1, -1 }, // EAN-13 - /* 1*/ { BARCODE_EANX, 0, "123456789012", 0, 50, 1, 95, 230, 118, 103 /*text_row*/, 0, 20, -1, -1, -1 }, // EAN-13 - /* 2*/ { BARCODE_EANX_CHK, -1, "1234567890128", 0, 50, 1, 95, 230, 118, 103 /*text_row*/, 0, 20, -1, -1, -1 }, // EAN-13 - /* 3*/ { BARCODE_EANX_CHK, 0, "1234567890128", 0, 50, 1, 95, 230, 118, 103 /*text_row*/, 0, 20, -1, -1, -1 }, // EAN-13 - /* 4*/ { BARCODE_EANX_CHK, -1, "1234567890128+12", 0, 50, 1, 124, 288, 118, 103 /*text_row*/, 0, 20, 5, 210, 78 }, // EAN-13 + EAN-2 - /* 5*/ { BARCODE_EANX_CHK, 0, "1234567890128+12", 0, 50, 1, 124, 288, 118, 103 /*text_row*/, 0, 20, 5, 210, 78 }, // EAN-13 + EAN-2 - /* 6*/ { BARCODE_EANX, -1, "1234567890128+12345", 0, 50, 1, 151, 342, 118, 103 /*text_row*/, 0, 20, 5, 210, 130 }, // EAN-13 + EAN-5 - /* 7*/ { BARCODE_EANX, 0, "1234567890128+12345", 0, 50, 1, 151, 342, 118, 103 /*text_row*/, 0, 20, 5, 210, 130 }, // EAN-13 + EAN-5 - /* 8*/ { BARCODE_ISBNX, -1, "9784567890120+12345", 0, 50, 1, 151, 342, 118, 103 /*text_row*/, 0, 20, 5, 210, 130 }, // ISBNX + EAN-5 - /* 9*/ { BARCODE_ISBNX, 0, "9784567890120+12345", 0, 50, 1, 151, 342, 118, 103 /*text_row*/, 0, 20, 5, 210, 130 }, // ISBNX + EAN-5 - /* 10*/ { BARCODE_EANX, -1, "123456", 0, 50, 1, 67, 134, 118, 103 /*text_row*/, 6, 58, -1, -1, -1 }, // EAN-8 - /* 11*/ { BARCODE_EANX, 0, "123456", 0, 50, 1, 67, 134, 118, 103 /*text_row*/, 6, 58, -1, -1, -1 }, // EAN-8 - /* 12*/ { BARCODE_EANX, -1, "123456+12", 0, 50, 1, 96, 192, 118, 103 /*text_row*/, 6, 58, 5, 134, 58 }, // EAN-8 + EAN-2 - /* 13*/ { BARCODE_EANX, 0, "123456+12", 0, 50, 1, 96, 192, 118, 103 /*text_row*/, 6, 58, 5, 134, 58 }, // EAN-8 + EAN-2 - /* 14*/ { BARCODE_EANX, -1, "123456+12345", 0, 50, 1, 123, 246, 118, 103 /*text_row*/, 6, 58, 5, 134, 112 }, // EAN-8 + EAN-5 - /* 15*/ { BARCODE_EANX, 0, "123456+12345", 0, 50, 1, 123, 246, 118, 103 /*text_row*/, 6, 58, 5, 134, 112 }, // EAN-8 + EAN-5 - /* 16*/ { BARCODE_UPCA, -1, "123456789012", 0, 50, 1, 95, 230, 118, 103 /*text_row*/, 0, 20, -1, -1, -1 }, - /* 17*/ { BARCODE_UPCA, 0, "123456789012", 0, 50, 1, 95, 230, 118, 103 /*text_row*/, 0, 20, -1, -1, -1 }, - /* 18*/ { BARCODE_UPCA, -1, "123456789012+12", 0, 50, 1, 124, 288, 118, 103 /*text_row*/, 0, 20, 5, 210, 78 }, - /* 19*/ { BARCODE_UPCA, 0, "123456789012+12", 0, 50, 1, 124, 288, 118, 103 /*text_row*/, 0, 20, 5, 210, 78 }, - /* 20*/ { BARCODE_UPCA_CHK, -1, "123456789012+12345", 0, 50, 1, 151, 342, 118, 103 /*text_row*/, 0, 20, 5, 210, 130 }, - /* 21*/ { BARCODE_UPCA_CHK, 0, "123456789012+12345", 0, 50, 1, 151, 342, 118, 103 /*text_row*/, 0, 20, 5, 210, 130 }, - /* 22*/ { BARCODE_UPCE, -1, "1234567", 0, 50, 1, 51, 142, 118, 103 /*text_row*/, 0, 20, -1, -1, -1 }, - /* 23*/ { BARCODE_UPCE, 0, "1234567", 0, 50, 1, 51, 142, 118, 103 /*text_row*/, 0, 20, -1, -1, -1 }, - /* 24*/ { BARCODE_UPCE_CHK, -1, "12345670+12", 0, 50, 1, 80, 200, 118, 103 /*text_row*/, 0, 20, 5, 122, 78 }, - /* 25*/ { BARCODE_UPCE_CHK, 0, "12345670+12", 0, 50, 1, 80, 200, 118, 103 /*text_row*/, 0, 20, 5, 122, 78 }, - /* 26*/ { BARCODE_UPCE, -1, "1234567+12345", 0, 50, 1, 107, 254, 118, 103 /*text_row*/, 0, 20, 5, 122, 130 }, - /* 27*/ { BARCODE_UPCE, 0, "1234567+12345", 0, 50, 1, 107, 254, 118, 103 /*text_row*/, 0, 20, 5, 122, 130 }, + /* 0*/ { BARCODE_EANX, -1, "123456789012", 0, 50, 1, 95, 226, 118, 103 /*text_row*/, 0, 20, -1, -1, -1 }, // EAN-13 + /* 1*/ { BARCODE_EANX, 0, "123456789012", 0, 50, 1, 95, 226, 118, 103 /*text_row*/, 0, 20, -1, -1, -1 }, // EAN-13 + /* 2*/ { BARCODE_EANX_CHK, -1, "1234567890128", 0, 50, 1, 95, 226, 118, 103 /*text_row*/, 0, 20, -1, -1, -1 }, // EAN-13 + /* 3*/ { BARCODE_EANX_CHK, 0, "1234567890128", 0, 50, 1, 95, 226, 118, 103 /*text_row*/, 0, 20, -1, -1, -1 }, // EAN-13 + /* 4*/ { BARCODE_EANX_CHK, -1, "1234567890128+12", 0, 50, 1, 122, 276, 118, 103 /*text_row*/, 0, 20, 5, 212, 64 }, // EAN-13 + EAN-2 + /* 5*/ { BARCODE_EANX_CHK, 0, "1234567890128+12", 0, 50, 1, 122, 276, 118, 103 /*text_row*/, 0, 20, 5, 212, 64 }, // EAN-13 + EAN-2 + /* 6*/ { BARCODE_EANX, -1, "1234567890128+12345", 0, 50, 1, 149, 330, 118, 103 /*text_row*/, 0, 20, 5, 212, 118 }, // EAN-13 + EAN-5 + /* 7*/ { BARCODE_EANX, 0, "1234567890128+12345", 0, 50, 1, 149, 330, 118, 103 /*text_row*/, 0, 20, 5, 212, 118 }, // EAN-13 + EAN-5 + /* 8*/ { BARCODE_ISBNX, -1, "9784567890120+12345", 0, 50, 1, 149, 330, 118, 103 /*text_row*/, 0, 20, 5, 212, 118 }, // ISBNX + EAN-5 + /* 9*/ { BARCODE_ISBNX, 0, "9784567890120+12345", 0, 50, 1, 149, 330, 118, 103 /*text_row*/, 0, 20, 5, 212, 118 }, // ISBNX + EAN-5 + /* 10*/ { BARCODE_EANX, -1, "123456", 0, 50, 1, 67, 162, 118, 103 /*text_row*/, 20, 58, -1, -1, -1 }, // EAN-8 + /* 11*/ { BARCODE_EANX, 0, "123456", 0, 50, 1, 67, 162, 118, 103 /*text_row*/, 20, 58, -1, -1, -1 }, // EAN-8 + /* 12*/ { BARCODE_EANX, -1, "123456+12", 0, 50, 1, 94, 216, 118, 103 /*text_row*/, 20, 58, 5, 148, 68 }, // EAN-8 + EAN-2 + /* 13*/ { BARCODE_EANX, 0, "123456+12", 0, 50, 1, 94, 216, 118, 103 /*text_row*/, 20, 58, 5, 148, 68 }, // EAN-8 + EAN-2 + /* 14*/ { BARCODE_EANX, -1, "123456+12345", 0, 50, 1, 121, 270, 118, 103 /*text_row*/, 20, 58, 5, 148, 122 }, // EAN-8 + EAN-5 + /* 15*/ { BARCODE_EANX, 0, "123456+12345", 0, 50, 1, 121, 270, 118, 103 /*text_row*/, 20, 58, 5, 148, 122 }, // EAN-8 + EAN-5 + /* 16*/ { BARCODE_EANX, -1, "1234", 0, 50, 1, 47, 118, 118, 103 /*text_row*/, 40, 36, -1, -1, -1 }, // EAN-5 + /* 17*/ { BARCODE_EANX, 0, "1234", 0, 50, 1, 47, 118, 118, 103 /*text_row*/, 40, 36, -1, -1, -1 }, // EAN-5 + /* 18*/ { BARCODE_EANX, -1, "12", 0, 50, 1, 20, 64, 118, 103 /*text_row*/, 20, 20, -1, -1, -1 }, // EAN-2 + /* 19*/ { BARCODE_EANX, 0, "12", 0, 50, 1, 20, 64, 118, 103 /*text_row*/, 20, 20, -1, -1, -1 }, // EAN-2 + /* 20*/ { BARCODE_UPCA, -1, "123456789012", 0, 50, 1, 95, 226, 118, 103 /*text_row*/, 0, 18, -1, -1, -1 }, + /* 21*/ { BARCODE_UPCA, 0, "123456789012", 0, 50, 1, 95, 226, 118, 103 /*text_row*/, 0, 18, -1, -1, -1 }, + /* 22*/ { BARCODE_UPCA, -1, "123456789012+12", 0, 50, 1, 124, 276, 118, 103 /*text_row*/, 0, 18, 5, 208, 68 }, + /* 23*/ { BARCODE_UPCA, 0, "123456789012+12", 0, 50, 1, 124, 276, 118, 103 /*text_row*/, 0, 18, 5, 208, 68 }, + /* 24*/ { BARCODE_UPCA_CHK, -1, "123456789012+12345", 0, 50, 1, 151, 330, 118, 103 /*text_row*/, 0, 18, 5, 208, 122 }, + /* 25*/ { BARCODE_UPCA_CHK, 0, "123456789012+12345", 0, 50, 1, 151, 330, 118, 103 /*text_row*/, 0, 18, 5, 208, 122 }, + /* 26*/ { BARCODE_UPCE, -1, "1234567", 0, 50, 1, 51, 134, 118, 103 /*text_row*/, 0, 18, -1, -1, -1 }, + /* 27*/ { BARCODE_UPCE, 0, "1234567", 0, 50, 1, 51, 134, 118, 103 /*text_row*/, 0, 18, -1, -1, -1 }, + /* 28*/ { BARCODE_UPCE_CHK, -1, "12345670+12", 0, 50, 1, 78, 184, 118, 103 /*text_row*/, 0, 18, 5, 120, 64 }, + /* 29*/ { BARCODE_UPCE_CHK, 0, "12345670+12", 0, 50, 1, 78, 184, 118, 103 /*text_row*/, 0, 18, 5, 120, 64 }, + /* 30*/ { BARCODE_UPCE, -1, "1234567+12345", 0, 50, 1, 105, 238, 118, 103 /*text_row*/, 0, 18, 5, 120, 118 }, + /* 31*/ { BARCODE_UPCE, 0, "1234567+12345", 0, 50, 1, 105, 238, 118, 103 /*text_row*/, 0, 18, 5, 120, 118 }, }; int data_size = ARRAY_SIZE(data); @@ -357,11 +372,13 @@ static void test_upcean_hrt(int index, int debug) { if (index != -1) testUtilBitmapPrint(symbol); - assert_equal(symbol->height, data[i].expected_height, "i:%d (%d) symbol->height %d != %d\n", i, data[i].symbology, symbol->height, data[i].expected_height); - assert_equal(symbol->rows, data[i].expected_rows, "i:%d (%d) symbol->rows %d != %d\n", i, data[i].symbology, symbol->rows, data[i].expected_rows); - assert_equal(symbol->width, data[i].expected_width, "i:%d (%d) symbol->width %d != %d\n", i, data[i].symbology, symbol->width, data[i].expected_width); - assert_equal(symbol->bitmap_width, data[i].expected_bitmap_width, "i:%d (%d) symbol->bitmap_width %d != %d\n", i, data[i].symbology, symbol->bitmap_width, data[i].expected_bitmap_width); - assert_equal(symbol->bitmap_height, data[i].expected_bitmap_height, "i:%d (%d) symbol->bitmap_height %d != %d\n", i, data[i].symbology, symbol->bitmap_height, data[i].expected_bitmap_height); + assert_equal(symbol->height, data[i].expected_height, "i:%d (%s) symbol->height %d != %d\n", i, testUtilBarcodeName(data[i].symbology), symbol->height, data[i].expected_height); + assert_equal(symbol->rows, data[i].expected_rows, "i:%d (%s) symbol->rows %d != %d\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows); + assert_equal(symbol->width, data[i].expected_width, "i:%d (%s) symbol->width %d != %d\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width); + assert_equal(symbol->bitmap_width, data[i].expected_bitmap_width, "i:%d (%s) symbol->bitmap_width %d != %d\n", + i, testUtilBarcodeName(data[i].symbology), symbol->bitmap_width, data[i].expected_bitmap_width); + assert_equal(symbol->bitmap_height, data[i].expected_bitmap_height, "i:%d (%s) symbol->bitmap_height %d != %d\n", + i, testUtilBarcodeName(data[i].symbology), symbol->bitmap_height, data[i].expected_bitmap_height); if (data[i].expected_text_row != -1) { int text_bits_set = 0; diff --git a/backend/tests/test_svg.c b/backend/tests/test_svg.c index 59297df9..4a473365 100644 --- a/backend/tests/test_svg.c +++ b/backend/tests/test_svg.c @@ -49,6 +49,16 @@ static void test_print(int index, int generate, int debug) { struct item data[] = { /* 0*/ { BARCODE_CODE128, -1, -1, "<>\"&'", "../data/svg/code128_amperands.svg" }, /* 1*/ { BARCODE_CODABLOCKF, 3, -1, "AAAAAAAAA", "../data/svg/codablockf_3rows.svg"}, + /* 2*/ { BARCODE_EANX, -1, -1, "9771384524017+12", "../data/svg/ean13_2addon_ggs_5.2.2.5.1-2.svg" }, + /* 3*/ { BARCODE_EANX, -1, -1, "9780877799306+54321", "../data/svg/ean13_5addon_ggs_5.2.2.5.2-2.svg" }, + /* 4*/ { BARCODE_UPCA, -1, -1, "012345678905+24", "../data/svg/upca_2addon_ggs_5.2.6.6-5.svg" }, + /* 5*/ { BARCODE_UPCA, -1, -1, "614141234417+12345", "../data/svg/upca_5addon.svg" }, + /* 6*/ { BARCODE_UPCE, -1, -1, "1234567+12", "../data/svg/upce_2addon.svg" }, + /* 7*/ { BARCODE_UPCE, -1, -1, "1234567+12345", "../data/svg/upce_5addon.svg" }, + /* 8*/ { BARCODE_EANX, -1, -1, "1234567+12", "../data/svg/ean8_2addon.svg" }, + /* 9*/ { BARCODE_EANX, -1, -1, "1234567+12345", "../data/svg/ean8_5addon.svg" }, + /* 10*/ { BARCODE_EANX, -1, -1, "12345", "../data/svg/ean5.svg" }, + /* 11*/ { BARCODE_EANX, -1, -1, "12", "../data/svg/ean2.svg" }, }; int data_size = sizeof(data) / sizeof(struct item); diff --git a/backend/tests/test_upcean.c b/backend/tests/test_upcean.c index cbc886fe..73bde64d 100644 --- a/backend/tests/test_upcean.c +++ b/backend/tests/test_upcean.c @@ -74,7 +74,7 @@ static void test_upce_length(int index, int debug) { int length = strlen(data[i].data); ret = ZBarcode_Encode(symbol, data[i].data, length); - assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret); + assert_equal(ret, data[i].ret, "i:%d ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); ZBarcode_Delete(symbol); } @@ -112,11 +112,11 @@ static void test_upca_print(int index, int debug) { int length = strlen(data[i].data); ret = ZBarcode_Encode(symbol, data[i].data, length); - assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret); + assert_equal(ret, data[i].ret, "i:%d ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); strcpy(symbol->outfile, "out.gif"); ret = ZBarcode_Print(symbol, 0); - assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret); + assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0 (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret, symbol->errtxt); assert_zero(remove(symbol->outfile), "i:%d remove(%s) != 0\n", i, symbol->outfile); @@ -136,48 +136,51 @@ static void test_isbn(int index, int debug) { int ret_encode; int ret_vector; }; - // s/\/\*[ 0-9]*\*\//\=printf("\/*%2d*\/", line(".") - line("'<")) + // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) struct item data[] = { - /* 0*/ { "0", 0, 0 }, // Left zero-padded if < 10 chars - /* 1*/ { "12345678", ZINT_ERROR_INVALID_CHECK, -1 }, - /* 2*/ { "12345679", 0, 0 }, // 9 is correct check digit - /* 3*/ { "123456789", 0, 0 }, - /* 4*/ { "0123456789", 0, 0 }, - /* 5*/ { "1234567890", ZINT_ERROR_INVALID_CHECK, -1 }, - /* 6*/ { "123456789X", 0, 0 }, // X is correct check digit - /* 7*/ { "8175257660", 0, 0 }, // 0 is correct check digit - /* 8*/ { "0590764845", 0, 0 }, // 5 is correct check digit - /* 9*/ { "0906495741", 0, 0 }, // 1 is correct check digit - /*10*/ { "0140430016", 0, 0 }, // 6 is correct check digit - /*11*/ { "0571086187", 0, 0 }, // 7 is correct check digit - /*12*/ { "0486600882", 0, 0 }, // 2 is correct check digit - /*13*/ { "12345678901", ZINT_ERROR_TOO_LONG, -1 }, - /*14*/ { "123456789012", ZINT_ERROR_TOO_LONG, -1 }, - /*15*/ { "1234567890123", ZINT_ERROR_INVALID_DATA, -1 }, - /*16*/ { "9784567890120", 0, 0 }, // 0 is correct check digit - /*17*/ { "9783161484100", 0, 0 }, // 0 is correct check digit - /*18*/ { "9781846688225", 0, 0 }, // 5 is correct check digit - /*19*/ { "9781847657954", 0, 0 }, // 4 is correct check digit - /*20*/ { "9781846688188", 0, 0 }, // 8 is correct check digit - /*21*/ { "9781847659293", 0, 0 }, // 3 is correct check digit - /*22*/ { "97845678901201", ZINT_ERROR_TOO_LONG, -1 }, - /*23*/ { "3954994+12", 0, 0 }, - /*24*/ { "3954994+12345", 0, 0 }, - /*25*/ { "3954994+123456", ZINT_ERROR_TOO_LONG, -1 }, - /*26*/ { "3954994+", 0, 0 }, - /*27*/ { "61954993+1", 0, 0 }, - /*28*/ { "61954993+123", 0, 0 }, - /*29*/ { "361954999+12", 0, 0 }, - /*30*/ { "361954999+1234", 0, 0 }, - /*31*/ { "361954999+12", 0, 0 }, - /*32*/ { "199900003X+12", 0, 0 }, - /*33*/ { "199900003X+12345", 0, 0 }, - /*34*/ { "9791234567896+12", 0, 0 }, - /*35*/ { "9791234567896+12345", 0, 0 }, - /*36*/ { "9791234567896+", 0, 0 }, - /*37*/ { "97912345678961+", ZINT_ERROR_TOO_LONG, -1 }, - /*38*/ { "97912345678961+12345", ZINT_ERROR_TOO_LONG, -1 }, - /*39*/ { "9791234567896+123456", ZINT_ERROR_TOO_LONG, -1 }, + /* 0*/ { "0", 0, 0 }, // Left zero-padded if < 10 chars + /* 1*/ { "12345678", ZINT_ERROR_INVALID_CHECK, -1 }, + /* 2*/ { "12345679", 0, 0 }, // 9 is correct check digit + /* 3*/ { "123456789", 0, 0 }, + /* 4*/ { "0123456789", 0, 0 }, + /* 5*/ { "1234567890", ZINT_ERROR_INVALID_CHECK, -1 }, + /* 6*/ { "123456789X", 0, 0 }, // X is correct check digit + /* 7*/ { "123456789x", 0, 0 }, // x is correct check digit + /* 8*/ { "8175257660", 0, 0 }, // 0 is correct check digit + /* 9*/ { "0590764845", 0, 0 }, // 5 is correct check digit + /* 10*/ { "0906495741", 0, 0 }, // 1 is correct check digit + /* 11*/ { "0140430016", 0, 0 }, // 6 is correct check digit + /* 12*/ { "0571086187", 0, 0 }, // 7 is correct check digit + /* 13*/ { "0486600882", 0, 0 }, // 2 is correct check digit + /* 14*/ { "12345678901", ZINT_ERROR_TOO_LONG, -1 }, + /* 15*/ { "123456789012", ZINT_ERROR_TOO_LONG, -1 }, + /* 16*/ { "1234567890123", ZINT_ERROR_INVALID_DATA, -1 }, + /* 17*/ { "9784567890120", 0, 0 }, // 0 is correct check digit + /* 18*/ { "9783161484100", 0, 0 }, // 0 is correct check digit + /* 19*/ { "9781846688225", 0, 0 }, // 5 is correct check digit + /* 20*/ { "9781847657954", 0, 0 }, // 4 is correct check digit + /* 21*/ { "9781846688188", 0, 0 }, // 8 is correct check digit + /* 22*/ { "9781847659293", 0, 0 }, // 3 is correct check digit + /* 23*/ { "97845678901201", ZINT_ERROR_TOO_LONG, -1 }, + /* 24*/ { "3954994+12", 0, 0 }, + /* 25*/ { "3954994+12345", 0, 0 }, + /* 26*/ { "3954994+123456", ZINT_ERROR_TOO_LONG, -1 }, + /* 27*/ { "3954994+", 0, 0 }, + /* 28*/ { "61954993+1", 0, 0 }, + /* 29*/ { "61954993+123", 0, 0 }, + /* 30*/ { "361954999+12", 0, 0 }, + /* 31*/ { "361954999+1234", 0, 0 }, + /* 32*/ { "361954999+12", 0, 0 }, + /* 33*/ { "199900003X+12", 0, 0 }, + /* 34*/ { "199900003x+12", 0, 0 }, + /* 35*/ { "199900003X+12345", 0, 0 }, + /* 36*/ { "199900003x+12345", 0, 0 }, + /* 37*/ { "9791234567896+12", 0, 0 }, + /* 38*/ { "9791234567896+12345", 0, 0 }, + /* 39*/ { "9791234567896+", 0, 0 }, + /* 40*/ { "97912345678961+", ZINT_ERROR_TOO_LONG, -1 }, + /* 41*/ { "97912345678961+12345", ZINT_ERROR_TOO_LONG, -1 }, + /* 42*/ { "9791234567896+123456", ZINT_ERROR_TOO_LONG, -1 }, }; int data_size = sizeof(data) / sizeof(struct item); @@ -194,11 +197,11 @@ static void test_isbn(int index, int debug) { int length = strlen(data[i].data); ret = ZBarcode_Encode(symbol, data[i].data, length); - assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d, errtxt %s\n", i, ret, data[i].ret_encode, symbol->errtxt); + assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret_encode, symbol->errtxt); if (data[i].ret_vector != -1) { ret = ZBarcode_Buffer_Vector(symbol, 0); - assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d\n", i, ret, data[i].ret_vector); + assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d (%s)\n", i, ret, data[i].ret_vector, symbol->errtxt); } ZBarcode_Delete(symbol); @@ -242,10 +245,10 @@ static void test_vector_same(int index, int debug) { int length = strlen(data[i].data); ret = ZBarcode_Encode(symbol, data[i].data, length); - assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret_encode); + assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret_encode, symbol->errtxt); ret = ZBarcode_Buffer_Vector(symbol, 0); - assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d\n", i, ret, data[i].ret_vector); + assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d (%s)\n", i, ret, data[i].ret_vector, symbol->errtxt); assert_nonnull(symbol->vector, "i:%d symbol->vector NULL\n", i); vectors[j] = testUtilVectorCpy(symbol->vector); @@ -268,13 +271,18 @@ static void test_vector_same(int index, int debug) { testFinish(); } +// https://www.isbn-international.org/content/isbn-users-manual ISBN Users' Manual +// https://bisg.org/page/BarcodingGuidelines BISG Barcode Guidelines for the US Book Industry (BISG BGUSBI) static void test_encode(int index, int generate, int debug) { testStart(""); + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + int ret; struct item { int symbology; + int option_2; unsigned char *data; int ret; @@ -284,15 +292,120 @@ static void test_encode(int index, int generate, int debug) { char *expected; }; struct item data[] = { - /* 0*/ { BARCODE_UPCA, "1234567890", 0, 1, 95, "GS1 General Specifications 20.0 Figure 5.1-1 left", + /* 0*/ { BARCODE_UPCA, -1, "01234567890", 0, 1, 95, "GGS Figure 5.1-1 UPC-A (also Figure 5.2.2.3-1., 5.2.6.6-2., 6.4.9-1. and BS EN 797:1996 Figure 3)", "10100011010011001001001101111010100011011000101010101000010001001001000111010011100101001110101" }, - /* 1*/ { BARCODE_EANX, "4512345678906", 0, 1, 95, "GS1 General Specifications 20.0 Figure 5.1-1 right", + /* 1*/ { BARCODE_EANX, -1, "4512345678906", 0, 1, 95, "GGS Figure 5.1-1 EAN-13", "10101100010110011001001101111010011101011100101010101000010001001001000111010011100101010000101" }, + /* 2*/ { BARCODE_EANX_CHK, -1, "9501101531000", 0, 1, 95, "GGS Figure 5.2.2.1-2. EAN-13 (also Figure 6.5.2.2-1., 6.5.3.2-1., 6.5.3.2-2., 6.5.6.4-1.)", + "10101100010100111011001100110010100111001100101010100111010000101100110111001011100101110010101" + }, + /* 3*/ { BARCODE_EANX, -1, "9501234", 0, 1, 67, "GGS Figure 5.2.2.2-1. EAN-8", + "1010001011011000100011010011001010101101100100001010111001010000101" + }, + /* 4*/ { BARCODE_UPCE, -1, "0012345", 0, 1, 51, "GGS Figure 5.2.2.4-1. UPC-E (also BS EN 797:1996 Figure 4)", + "101010011100110010011011011110100111010110001010101" + }, + /* 5*/ { BARCODE_EANX, -1, "9771384524017+12", 0, 1, 122, "GGS Figure 5.2.2.5.1-2. EAN-13 barcode with two-digit add-on", + "10101110110010001011001101111010001001010001101010100111011011001011100111001011001101000100101000000010110011001010010011" + }, + /* 6*/ { BARCODE_EANX, -1, "9780877799306+54321", 0, 1, 149, "GGS Figure 5.2.2.5.2-2. EAN-13 barcode with five-digit add-on", + "10101110110001001010011101101110010001011101101010100010011101001110100100001011100101010000101000000010110111001010100011010100001010010011010011001" + }, + /* 7*/ { BARCODE_EANX, -1, "501234567890", 0, 1, 95, "GGS Figure 5.2.6.6-1. EAN-13 (also BS EN 797:1996 Figure 1)", + "10100011010110011001101101111010100011011100101010101000010001001001000111010011100101110010101" + }, + /* 8*/ { BARCODE_EANX, -1, "2012345", 0, 1, 67, "GGS Figure 5.2.6.6-3. EAN-8", + "1010010011000110100110010010011010101000010101110010011101100110101" + }, + /* 9*/ { BARCODE_UPCE_CHK, -1, "00783491", 0, 1, 51, "GGS Figure 5.2.6.6-4. UPC-E", + "101010011100100010110111010000101000110001011010101" + }, + /* 10*/ { BARCODE_UPCA, -1, "01234567890+24", 0, 1, 124, "GGS Figure 5.2.6.6-5. UPC-A barcode with two-digit add-on", + "1010001101001100100100110111101010001101100010101010100001000100100100011101001110010100111010100000000010110010011010100011" + }, + /* 11*/ { BARCODE_EANX, -1, "1234567891019+45678", 0, 1, 149, "GGS Figure 5.2.6.6-6. EAN-13 barcode with five-digit add-on", + "10100100110111101001110101100010000101001000101010100100011101001100110111001011001101110100101000000010110011101010110001010101111010010001010110111" + }, + /* 12*/ { BARCODE_EANX, -1, "5024425377399", 0, 1, 95, "GGS Figure 5.10.5.12-1. EAN-13", + "10100011010011011001110101000110010011011100101010100001010001001000100100001011101001110100101" + }, + /* 13*/ { BARCODE_UPCA_CHK, -1, "614141000302", 0, 1, 95, "GGS Figure 5.10.6.3-1. UPC-A", + "10101011110011001010001100110010100011001100101010111001011100101110010100001011100101101100101" + }, + /* 14*/ { BARCODE_UPCA, -1, "61414123440", 0, 1, 95, "GGS Figure 6.4.17-2. UPC-A Daisy 5pc Set", + "10101011110011001010001100110010100011001100101010110110010000101011100101110011100101110010101" + }, + /* 15*/ { BARCODE_EANX, -1, "5410038302178", 0, 1, 95, "GGS Figure 6.5.5.3-1. EAN-13", + "10101000110110011010011100011010111101000100101010100001011100101101100110011010001001001000101" + }, + /* 16*/ { BARCODE_EANX, -1, "501234567890+12", 0, 1, 122, "BS EN 797:1996 Figure 5 EAN-13 with 2-digit add-on", + "10100011010110011001101101111010100011011100101010101000010001001001000111010011100101110010101000000010110011001010010011" + }, + /* 17*/ { BARCODE_EANX, -1, "501234567890+86104", 0, 1, 149, "BS EN 797:1996 Figure 6 EAN-13 with 5-digit add-on", + "10100011010110011001101101111010100011011100101010101000010001001001000111010011100101110010101000000010110001001010101111010011001010001101010011101" + }, + /* 18*/ { BARCODE_UPCA_CHK, -1, "614141234417+12345", 0, 1, 151, "Example of UPC-A with 5-digit add-on", + "1010101111001100101000110011001010001100110010101011011001000010101110010111001100110100010010100000000010110110011010010011010100001010100011010110001" + }, + /* 19*/ { BARCODE_UPCE, -1, "1234567+12", 0, 1, 78, "Example of UPC-E with 2-digit add-on", + "101001001101111010100011011100100001010010001010101000000010110011001010010011" + }, + /* 20*/ { BARCODE_UPCE_CHK, -1, "12345670+12345", 0, 1, 105, "Example of UPC-E with 5-digit add-on", + "101001001101111010100011011100100001010010001010101000000010110110011010010011010100001010100011010110001" + }, + /* 21*/ { BARCODE_EANX, -1, "1234567+12", 0, 1, 94, "Example of EAN-8 with 2-digit add-on", + "1010011001001001101111010100011010101001110101000010001001110010101000000010110011001010010011" + }, + /* 22*/ { BARCODE_EANX_CHK, -1, "12345670+12345", 0, 1, 121, "Example of EAN-8 with 5-digit add-on", + "1010011001001001101111010100011010101001110101000010001001110010101000000010110110011010010011010100001010100011010110001" + }, + /* 23*/ { BARCODE_EANX, -1, "54321", 0, 1, 47, "Example of EAN-5", + "10110111001010100011010100001010010011010011001" + }, + /* 24*/ { BARCODE_EANX, -1, "21", 0, 1, 20, "Example of EAN-2", + "10110010011010110011" + }, + /* 25*/ { BARCODE_EANX_CHK, 9, "76543210+21", 0, 1, 96, "Example of EAN-8 barcode with two-digit add-on, addon_gap 9", + "101011101101011110110001010001101010100001011011001100110111001010100000000010110010011010110011" + }, + /* 26*/ { BARCODE_EANX, 12, "7654321+54321", 0, 1, 126, "Example of EAN-8 barcode with five-digit add-on, addon_gap 12", + "101011101101011110110001010001101010100001011011001100110111001010100000000000010110111001010100011010100001010010011010011001" + }, + /* 27*/ { BARCODE_UPCA_CHK, 10, "210987654329+21", 0, 1, 125, "Example of UPC-A with 2-digit add-on, addon_gap 10", + "10100100110011001000110100010110110111011101101010101000010011101011100100001011011001110100101000000000010110010011010110011" + }, + /* 28*/ { BARCODE_UPCA, 12, "21098765432+12121", 0, 1, 154, "Example of UPC-A with 5-digit add-on, addon_gap 12", + "1010010011001100100011010001011011011101110110101010100001001110101110010000101101100111010010100000000000010110011001010010011010110011010011011010011001" + }, + /* 29*/ { BARCODE_UPCE_CHK, 8, "06543217+21", 0, 1, 79, "Example of UPC-A with 2-digit add-on, addon_gap 8", + "1010000101011000100111010111101001101100110010101010000000010110010011010110011" + }, + /* 30*/ { BARCODE_UPCE, 11, "1654321+12121", 0, 1, 109, "Example of UPC-A with 5-digit add-on, addon_gap 11", + "1010101111011100101000110111101001101101100110101010000000000010110011001010010011010110011010011011010011001" + }, + /* 31*/ { BARCODE_ISBNX, -1, "9789295055124", 0, 1, 95, "ISBN Users' Manual 7th Ed. 13.2", + "10101110110001001001011100100110010111011000101010111001010011101001110110011011011001011100101" + }, + /* 32*/ { BARCODE_ISBNX, -1, "9780123456786+50995", 0, 1, 149, "BISG BGUSBI Figure 1: Bookland EAN (with Price Add-On) (and Figures 4, 5, 6)", + "10101110110001001010011100110010011011011110101010101110010011101010000100010010010001010000101000000010110110001010100111010001011010001011010111001" + }, + /* 33*/ { BARCODE_ISBNX, -1, "9781402894626+50495", 0, 1, 149, "BISG BGUSBI Figure 2", + "10101110110001001011001101000110100111001001101010100100011101001011100101000011011001010000101000000010110111001010001101010100011010001011010111001" + }, + /* 34*/ { BARCODE_ISBNX, 10, "9780940016644+50750", 0, 1, 152, "BISG BGUSBI Figure 3, addon_gap 10", + "10101110110001001010011100010110011101000110101010111001011001101010000101000010111001011100101000000000010110111001010001101010010001010110001010001101" + }, + /* 35*/ { BARCODE_ISBNX, -1, "9791234567896+12", 0, 1, 122, "Example of ISBN with 2-digit add-on", + "10101110110010111011001100100110100001010001101010100111010100001000100100100011101001010000101000000010110011001010010011" + }, }; int data_size = ARRAY_SIZE(data); + char bwipp_buf[4096]; + char bwipp_msg[1024]; + for (int i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; @@ -300,14 +413,14 @@ static void test_encode(int index, int generate, int debug) { struct zint_symbol *symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - int length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, -1, -1, -1 /*output_options*/, data[i].data, -1, debug); + int length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, data[i].option_2, -1, -1 /*output_options*/, data[i].data, -1, debug); ret = ZBarcode_Encode(symbol, data[i].data, length); - assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret); + assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); if (generate) { - printf(" /*%3d*/ { %s, \"%s\", %s, %d, %d, \"%s\",\n", - i, testUtilBarcodeName(data[i].symbology), data[i].data, testUtilErrorName(data[i].ret), symbol->rows, symbol->width, data[i].comment); + printf(" /*%3d*/ { %s, %d, \"%s\", %s, %d, %d, \"%s\",\n", + i, testUtilBarcodeName(data[i].symbology), data[i].option_2, data[i].data, testUtilErrorName(data[i].ret), symbol->rows, symbol->width, data[i].comment); testUtilModulesDump(symbol, " ", "\n"); printf(" },\n"); } else { @@ -320,6 +433,15 @@ static void test_encode(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); } + + if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, data[i].option_2, -1, debug)) { + ret = testUtilBwipp(symbol, -1, data[i].option_2, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(data[i].symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } } } diff --git a/backend/tests/test_vector.c b/backend/tests/test_vector.c index c8a5bb4c..bddf4b89 100644 --- a/backend/tests/test_vector.c +++ b/backend/tests/test_vector.c @@ -138,119 +138,130 @@ static void test_buffer_vector(int index, int generate, int debug) { float expected_vector_height; }; struct item data[] = { - /* 0*/ { BARCODE_CODE11, "0000000000", "", 50, 1, 99, 198.0, 118.0 }, - /* 1*/ { BARCODE_C25MATRIX, "0000000000", "", 50, 1, 117, 234.0, 118.0 }, - /* 2*/ { BARCODE_C25INTER, "0000000000", "", 50, 1, 99, 198.0, 118.0 }, - /* 3*/ { BARCODE_C25IATA, "0000000000", "", 50, 1, 149, 298.0, 118.0 }, - /* 4*/ { BARCODE_C25LOGIC, "0000000000", "", 50, 1, 109, 218.0, 118.0 }, - /* 5*/ { BARCODE_C25IND, "0000000000", "", 50, 1, 159, 318.0, 118.0 }, - /* 6*/ { BARCODE_CODE39, "0000000000", "", 50, 1, 155, 310.0, 118.0 }, - /* 7*/ { BARCODE_EXCODE39, "0000000000", "", 50, 1, 155, 310.0, 118.0 }, - /* 8*/ { BARCODE_EANX, "123456789012", "", 50, 1, 95, 230.0, 118.0 }, - /* 9*/ { BARCODE_EANX_CHK, "1234567890128", "", 50, 1, 95, 230.0, 118.0 }, - /* 10*/ { BARCODE_EANX, "123456789012+12", "", 50, 1, 124, 288.0, 118.0 }, - /* 11*/ { BARCODE_EANX, "123456789012+12345", "", 50, 1, 151, 342.0, 118.0 }, - /* 12*/ { BARCODE_EANX, "1234567", "", 50, 1, 67, 134.0, 118.0 }, - /* 13*/ { BARCODE_EANX, "1234567+12", "", 50, 1, 96, 192.0, 118.0 }, - /* 14*/ { BARCODE_EANX, "1234567+12345", "", 50, 1, 123, 246.0, 118.0 }, - /* 15*/ { BARCODE_EANX, "1234", "", 50, 1, 47, 94.0, 118.0 }, - /* 16*/ { BARCODE_EANX, "12", "", 50, 1, 20, 40.0, 118.0 }, - /* 17*/ { BARCODE_EAN128, "[01]12345678901234", "", 50, 1, 134, 268.0, 118.0 }, - /* 18*/ { BARCODE_CODABAR, "A00000000B", "", 50, 1, 102, 204.0, 118.0 }, - /* 19*/ { BARCODE_CODE128, "0000000000", "", 50, 1, 90, 180.0, 118.0 }, - /* 20*/ { BARCODE_DPLEIT, "1234567890123", "", 50, 1, 135, 270.0, 118.0 }, - /* 21*/ { BARCODE_DPIDENT, "12345678901", "", 50, 1, 117, 234.0, 118.0 }, - /* 22*/ { BARCODE_CODE16K, "0000000000", "", 20, 2, 70, 162.0, 44.0 }, - /* 23*/ { BARCODE_CODE49, "0000000000", "", 20, 2, 70, 162.0, 44.0 }, - /* 24*/ { BARCODE_CODE93, "0000000000", "", 50, 1, 127, 254.0, 118.0 }, - /* 25*/ { BARCODE_FLAT, "1234567890", "", 50, 1, 90, 180.0, 100.0 }, - /* 26*/ { BARCODE_RSS14, "1234567890123", "", 50, 1, 96, 192.0, 118.0 }, - /* 27*/ { BARCODE_RSS_LTD, "1234567890123", "", 50, 1, 74, 148.0, 118.0 }, - /* 28*/ { BARCODE_RSS_EXP, "[01]12345678901234", "", 34, 1, 134, 268.0, 86.0 }, - /* 29*/ { BARCODE_TELEPEN, "0000000000", "", 50, 1, 208, 416.0, 118.0 }, - /* 30*/ { BARCODE_UPCA, "12345678904", "", 50, 1, 95, 230.0, 118.0 }, - /* 31*/ { BARCODE_UPCA_CHK, "12345678905", "", 50, 1, 95, 230.0, 118.0 }, - /* 32*/ { BARCODE_UPCA, "12345678904+12", "", 50, 1, 124, 288.0, 118.0 }, - /* 33*/ { BARCODE_UPCA, "12345678904+12345", "", 50, 1, 151, 342.0, 118.0 }, - /* 34*/ { BARCODE_UPCE, "1234567", "", 50, 1, 51, 142.0, 118.0 }, - /* 35*/ { BARCODE_UPCE_CHK, "12345670", "", 50, 1, 51, 142.0, 118.0 }, - /* 36*/ { BARCODE_UPCE, "1234567+12", "", 50, 1, 80, 200.0, 118.0 }, - /* 37*/ { BARCODE_UPCE, "1234567+12345", "", 50, 1, 107, 254.0, 118.0 }, - /* 38*/ { BARCODE_POSTNET, "00000000000", "", 12, 2, 185, 370.0, 24.0 }, - /* 39*/ { BARCODE_MSI_PLESSEY, "0000000000", "", 50, 1, 127, 254.0, 118.0 }, - /* 40*/ { BARCODE_FIM, "A", "", 50, 1, 17, 34.0, 100.0 }, - /* 41*/ { BARCODE_LOGMARS, "0000000000", "", 50, 1, 191, 382.0, 118.0 }, - /* 42*/ { BARCODE_PHARMA, "123456", "", 50, 1, 58, 116.0, 100.0 }, - /* 43*/ { BARCODE_PZN, "123456", "", 50, 1, 142, 284.0, 118.0 }, - /* 44*/ { BARCODE_PHARMA_TWO, "12345678", "", 10, 2, 29, 58.0, 20.0 }, - /* 45*/ { BARCODE_PDF417, "0000000000", "", 21, 7, 103, 206.0, 42.0 }, - /* 46*/ { BARCODE_PDF417TRUNC, "0000000000", "", 21, 7, 68, 136.0, 42.0 }, - /* 47*/ { BARCODE_MAXICODE, "0000000000", "", 165, 33, 30, 74.0, 72.0 }, - /* 48*/ { BARCODE_QRCODE, "1234567890AB", "", 21, 21, 21, 42.0, 42.0 }, - /* 49*/ { BARCODE_CODE128B, "0000000000", "", 50, 1, 145, 290.0, 118.0 }, - /* 50*/ { BARCODE_AUSPOST, "12345678901234567890123", "", 8, 3, 133, 266.0, 16.0 }, - /* 51*/ { BARCODE_AUSREPLY, "12345678", "", 8, 3, 73, 146.0, 16.0 }, - /* 52*/ { BARCODE_AUSROUTE, "12345678", "", 8, 3, 73, 146.0, 16.0 }, - /* 53*/ { BARCODE_AUSREDIRECT, "12345678", "", 8, 3, 73, 146.0, 16.0 }, - /* 54*/ { BARCODE_ISBNX, "123456789", "", 50, 1, 95, 230.0, 118.0 }, - /* 55*/ { BARCODE_ISBNX, "123456789+12", "", 50, 1, 124, 288.0, 118.0 }, - /* 56*/ { BARCODE_ISBNX, "123456789+12345", "", 50, 1, 151, 342.0, 118.0 }, - /* 57*/ { BARCODE_RM4SCC, "0000000000", "", 8, 3, 91, 182.0, 16.0 }, - /* 58*/ { BARCODE_DATAMATRIX, "ABC", "", 10, 10, 10, 20.0, 20.0 }, - /* 59*/ { BARCODE_EAN14, "1234567890123", "", 50, 1, 134, 268.0, 118.0 }, - /* 60*/ { BARCODE_VIN, "00000000000000000", "", 50, 1, 246, 492.0, 118.0 }, - /* 61*/ { BARCODE_CODABLOCKF, "0000000000", "", 20, 2, 101, 242.0, 44.0 }, - /* 62*/ { BARCODE_NVE18, "12345678901234567", "", 50, 1, 156, 312.0, 118.0 }, - /* 63*/ { BARCODE_JAPANPOST, "0000000000", "", 8, 3, 133, 266.0, 16.0 }, - /* 64*/ { BARCODE_KOREAPOST, "123456", "", 50, 1, 167, 334.0, 118.0 }, - /* 65*/ { BARCODE_RSS14STACK, "0000000000000", "", 13, 3, 50, 100.0, 26.0 }, - /* 66*/ { BARCODE_RSS14STACK_OMNI, "0000000000000", "", 69, 5, 50, 100.0, 138.0 }, - /* 67*/ { BARCODE_RSS_EXPSTACK, "[01]12345678901234", "", 71, 5, 102, 204.0, 142.0 }, - /* 68*/ { BARCODE_PLANET, "00000000000", "", 12, 2, 185, 370.0, 24.0 }, - /* 69*/ { BARCODE_MICROPDF417, "0000000000", "", 12, 6, 82, 164.0, 24.0 }, - /* 70*/ { BARCODE_ONECODE, "12345678901234567890", "", 8, 3, 129, 258.0, 16.0 }, - /* 71*/ { BARCODE_PLESSEY, "0000000000", "", 50, 1, 227, 454.0, 118.0 }, - /* 72*/ { BARCODE_TELEPEN_NUM, "0000000000", "", 50, 1, 128, 256.0, 118.0 }, - /* 73*/ { BARCODE_ITF14, "0000000000", "", 50, 1, 135, 382.0, 150.0 }, - /* 74*/ { BARCODE_KIX, "123456ABCDE", "", 8, 3, 87, 174.0, 16.0 }, - /* 75*/ { BARCODE_AZTEC, "1234567890AB", "", 15, 15, 15, 30.0, 30.0 }, - /* 76*/ { BARCODE_DAFT, "DAFTDAFTDAFTDAFT", "", 8, 3, 31, 62.0, 16.0 }, - /* 77*/ { BARCODE_MICROQR, "12345", "", 11, 11, 11, 22.0, 22.0 }, - /* 78*/ { BARCODE_HIBC_128, "0000000000", "", 50, 1, 134, 268.0, 118.0 }, - /* 79*/ { BARCODE_HIBC_39, "0000000000", "", 50, 1, 223, 446.0, 118.0 }, - /* 80*/ { BARCODE_HIBC_DM, "ABC", "", 12, 12, 12, 24.0, 24.0 }, - /* 81*/ { BARCODE_HIBC_QR, "1234567890AB", "", 21, 21, 21, 42.0, 42.0 }, - /* 82*/ { BARCODE_HIBC_PDF, "0000000000", "", 27, 9, 103, 206.0, 54.0 }, - /* 83*/ { BARCODE_HIBC_MICPDF, "0000000000", "", 34, 17, 38, 76.0, 68.0 }, - /* 84*/ { BARCODE_HIBC_BLOCKF, "0000000000", "", 30, 3, 101, 242.0, 64.0 }, - /* 85*/ { BARCODE_HIBC_AZTEC, "1234567890AB", "", 19, 19, 19, 38.0, 38.0 }, - /* 86*/ { BARCODE_DOTCODE, "ABC", "", 11, 11, 16, 32.0, 22.0 }, - /* 87*/ { BARCODE_HANXIN, "1234567890AB", "", 23, 23, 23, 46.0, 46.0 }, - /* 88*/ { BARCODE_MAILMARK, "01000000000000000AA00AA0A", "", 10, 3, 155, 310.0, 20.0 }, - /* 89*/ { BARCODE_AZRUNE, "255", "", 11, 11, 11, 22.0, 22.0 }, - /* 90*/ { BARCODE_CODE32, "12345678", "", 50, 1, 103, 206.0, 118.0 }, - /* 91*/ { BARCODE_EANX_CC, "123456789012", "[20]01", 50, 7, 99, 238.0, 118.0 }, - /* 92*/ { BARCODE_EANX_CC, "123456789012+12", "[20]01", 50, 7, 128, 296.0, 118.0 }, - /* 93*/ { BARCODE_EANX_CC, "123456789012+12345", "[20]01", 50, 7, 155, 350.0, 118.0 }, - /* 94*/ { BARCODE_EAN128_CC, "[01]12345678901234", "[20]01", 50, 5, 145, 290.0, 118.0 }, - /* 95*/ { BARCODE_RSS14_CC, "1234567890123", "[20]01", 21, 5, 100, 200.0, 60.0 }, - /* 96*/ { BARCODE_RSS_LTD_CC, "1234567890123", "[20]01", 19, 6, 74, 148.0, 56.0 }, - /* 97*/ { BARCODE_RSS_EXP_CC, "[01]12345678901234", "[20]01", 41, 5, 134, 268.0, 100.0 }, - /* 98*/ { BARCODE_UPCA_CC, "12345678901", "[20]01", 50, 7, 99, 238.0, 118.0 }, - /* 99*/ { BARCODE_UPCA_CC, "12345678901+12", "[20]01", 50, 7, 128, 296.0, 118.0 }, - /*100*/ { BARCODE_UPCA_CC, "12345678901+12345", "[20]01", 50, 7, 155, 350.0, 118.0 }, - /*101*/ { BARCODE_UPCE_CC, "1234567", "[20]01", 50, 9, 55, 150.0, 118.0 }, - /*102*/ { BARCODE_UPCE_CC, "1234567+12", "[20]01", 50, 9, 84, 208.0, 118.0 }, - /*103*/ { BARCODE_UPCE_CC, "1234567+12345", "[20]01", 50, 9, 111, 262.0, 118.0 }, - /*104*/ { BARCODE_RSS14STACK_CC, "0000000000000", "[20]01", 24, 9, 56, 112.0, 48.0 }, - /*105*/ { BARCODE_RSS14_OMNI_CC, "0000000000000", "[20]01", 80, 11, 56, 112.0, 160.0 }, - /*106*/ { BARCODE_RSS_EXPSTACK_CC, "[01]12345678901234", "[20]01", 78, 9, 102, 204.0, 156.0 }, - /*107*/ { BARCODE_CHANNEL, "00", "", 50, 1, 19, 38.0, 118.0 }, - /*108*/ { BARCODE_CODEONE, "12345678901234567890", "", 22, 22, 22, 44.0, 44.0 }, - /*109*/ { BARCODE_GRIDMATRIX, "ABC", "", 18, 18, 18, 36.0, 36.0 }, - /*110*/ { BARCODE_UPNQR, "1234567890AB", "", 77, 77, 77, 154.0, 154.0 }, - /*111*/ { BARCODE_ULTRA, "0000000000", "", 13, 13, 18, 36.0, 26.0 }, - /*112*/ { BARCODE_RMQR, "12345", "", 11, 11, 27, 54.0, 22.0 }, + /* 0*/ { BARCODE_CODE11, "0000000000", "", 50, 1, 99, 198, 118 }, + /* 1*/ { BARCODE_C25MATRIX, "0000000000", "", 50, 1, 117, 234, 118 }, + /* 2*/ { BARCODE_C25INTER, "0000000000", "", 50, 1, 99, 198, 118 }, + /* 3*/ { BARCODE_C25IATA, "0000000000", "", 50, 1, 149, 298, 118 }, + /* 4*/ { BARCODE_C25LOGIC, "0000000000", "", 50, 1, 109, 218, 118 }, + /* 5*/ { BARCODE_C25IND, "0000000000", "", 50, 1, 159, 318, 118 }, + /* 6*/ { BARCODE_CODE39, "0000000000", "", 50, 1, 155, 310, 118 }, + /* 7*/ { BARCODE_EXCODE39, "0000000000", "", 50, 1, 155, 310, 118 }, + /* 8*/ { BARCODE_EANX, "123456789012", "", 50, 1, 95, 226, 118 }, + /* 9*/ { BARCODE_EANX_CHK, "1234567890128", "", 50, 1, 95, 226, 118 }, + /* 10*/ { BARCODE_EANX, "123456789012+12", "", 50, 1, 122, 276, 118 }, + /* 11*/ { BARCODE_EANX_CHK, "1234567890128+12", "", 50, 1, 122, 276, 118 }, + /* 12*/ { BARCODE_EANX, "123456789012+12345", "", 50, 1, 149, 330, 118 }, + /* 13*/ { BARCODE_EANX_CHK, "1234567890128+12345", "", 50, 1, 149, 330, 118 }, + /* 14*/ { BARCODE_EANX, "1234567", "", 50, 1, 67, 162, 118 }, + /* 15*/ { BARCODE_EANX_CHK, "12345670", "", 50, 1, 67, 162, 118 }, + /* 16*/ { BARCODE_EANX, "1234567+12", "", 50, 1, 94, 216, 118 }, + /* 17*/ { BARCODE_EANX_CHK, "12345670+12", "", 50, 1, 94, 216, 118 }, + /* 18*/ { BARCODE_EANX, "1234567+12345", "", 50, 1, 121, 270, 118 }, + /* 19*/ { BARCODE_EANX_CHK, "12345670+12345", "", 50, 1, 121, 270, 118 }, + /* 20*/ { BARCODE_EANX, "1234", "", 50, 1, 47, 118, 118 }, + /* 21*/ { BARCODE_EANX_CHK, "1234", "", 50, 1, 47, 118, 118 }, + /* 22*/ { BARCODE_EANX, "12", "", 50, 1, 20, 64, 118 }, + /* 23*/ { BARCODE_EANX_CHK, "12", "", 50, 1, 20, 64, 118 }, + /* 24*/ { BARCODE_EAN128, "[01]12345678901234", "", 50, 1, 134, 268, 118 }, + /* 25*/ { BARCODE_CODABAR, "A00000000B", "", 50, 1, 102, 204, 118 }, + /* 26*/ { BARCODE_CODE128, "0000000000", "", 50, 1, 90, 180, 118 }, + /* 27*/ { BARCODE_DPLEIT, "1234567890123", "", 50, 1, 135, 270, 118 }, + /* 28*/ { BARCODE_DPIDENT, "12345678901", "", 50, 1, 117, 234, 118 }, + /* 29*/ { BARCODE_CODE16K, "0000000000", "", 20, 2, 70, 162, 44 }, + /* 30*/ { BARCODE_CODE49, "0000000000", "", 20, 2, 70, 162, 44 }, + /* 31*/ { BARCODE_CODE93, "0000000000", "", 50, 1, 127, 254, 118 }, + /* 32*/ { BARCODE_FLAT, "1234567890", "", 50, 1, 90, 180, 100 }, + /* 33*/ { BARCODE_RSS14, "1234567890123", "", 50, 1, 96, 192, 118 }, + /* 34*/ { BARCODE_RSS_LTD, "1234567890123", "", 50, 1, 74, 148, 118 }, + /* 35*/ { BARCODE_RSS_EXP, "[01]12345678901234", "", 34, 1, 134, 268, 86 }, + /* 36*/ { BARCODE_TELEPEN, "0000000000", "", 50, 1, 208, 416, 118 }, + /* 37*/ { BARCODE_UPCA, "12345678904", "", 50, 1, 95, 226, 118 }, + /* 38*/ { BARCODE_UPCA_CHK, "123456789043", "", 50, 1, 95, 226, 118 }, + /* 39*/ { BARCODE_UPCA, "12345678904+12", "", 50, 1, 124, 276, 118 }, + /* 40*/ { BARCODE_UPCA_CHK, "123456789043+12", "", 50, 1, 124, 276, 118 }, + /* 41*/ { BARCODE_UPCA, "12345678904+12345", "", 50, 1, 151, 330, 118 }, + /* 42*/ { BARCODE_UPCA_CHK, "123456789043+12345", "", 50, 1, 151, 330, 118 }, + /* 43*/ { BARCODE_UPCE, "1234567", "", 50, 1, 51, 134, 118 }, + /* 44*/ { BARCODE_UPCE_CHK, "12345670", "", 50, 1, 51, 134, 118 }, + /* 45*/ { BARCODE_UPCE, "1234567+12", "", 50, 1, 78, 184, 118 }, + /* 46*/ { BARCODE_UPCE_CHK, "12345670+12", "", 50, 1, 78, 184, 118 }, + /* 47*/ { BARCODE_UPCE, "1234567+12345", "", 50, 1, 105, 238, 118 }, + /* 48*/ { BARCODE_UPCE_CHK, "12345670+12345", "", 50, 1, 105, 238, 118 }, + /* 49*/ { BARCODE_POSTNET, "00000000000", "", 12, 2, 185, 370, 24 }, + /* 50*/ { BARCODE_MSI_PLESSEY, "0000000000", "", 50, 1, 127, 254, 118 }, + /* 51*/ { BARCODE_FIM, "A", "", 50, 1, 17, 34, 100 }, + /* 52*/ { BARCODE_LOGMARS, "0000000000", "", 50, 1, 191, 382, 118 }, + /* 53*/ { BARCODE_PHARMA, "123456", "", 50, 1, 58, 116, 100 }, + /* 54*/ { BARCODE_PZN, "123456", "", 50, 1, 142, 284, 118 }, + /* 55*/ { BARCODE_PHARMA_TWO, "12345678", "", 10, 2, 29, 58, 20 }, + /* 56*/ { BARCODE_PDF417, "0000000000", "", 21, 7, 103, 206, 42 }, + /* 57*/ { BARCODE_PDF417TRUNC, "0000000000", "", 21, 7, 68, 136, 42 }, + /* 58*/ { BARCODE_MAXICODE, "0000000000", "", 165, 33, 30, 74, 72 }, // Differs from raster + /* 59*/ { BARCODE_QRCODE, "1234567890AB", "", 21, 21, 21, 42, 42 }, + /* 60*/ { BARCODE_CODE128B, "0000000000", "", 50, 1, 145, 290, 118 }, + /* 61*/ { BARCODE_AUSPOST, "12345678901234567890123", "", 8, 3, 133, 266, 16 }, + /* 62*/ { BARCODE_AUSREPLY, "12345678", "", 8, 3, 73, 146, 16 }, + /* 63*/ { BARCODE_AUSROUTE, "12345678", "", 8, 3, 73, 146, 16 }, + /* 64*/ { BARCODE_AUSREDIRECT, "12345678", "", 8, 3, 73, 146, 16 }, + /* 65*/ { BARCODE_ISBNX, "123456789", "", 50, 1, 95, 226, 118 }, + /* 66*/ { BARCODE_ISBNX, "123456789+12", "", 50, 1, 122, 276, 118 }, + /* 67*/ { BARCODE_ISBNX, "123456789+12345", "", 50, 1, 149, 330, 118 }, + /* 68*/ { BARCODE_RM4SCC, "0000000000", "", 8, 3, 91, 182, 16 }, + /* 69*/ { BARCODE_DATAMATRIX, "ABC", "", 10, 10, 10, 20, 20 }, + /* 70*/ { BARCODE_EAN14, "1234567890123", "", 50, 1, 134, 268, 118 }, + /* 71*/ { BARCODE_VIN, "00000000000000000", "", 50, 1, 246, 492, 118 }, + /* 72*/ { BARCODE_CODABLOCKF, "0000000000", "", 20, 2, 101, 242, 44 }, + /* 73*/ { BARCODE_NVE18, "12345678901234567", "", 50, 1, 156, 312, 118 }, + /* 74*/ { BARCODE_JAPANPOST, "0000000000", "", 8, 3, 133, 266, 16 }, + /* 75*/ { BARCODE_KOREAPOST, "123456", "", 50, 1, 167, 334, 118 }, + /* 76*/ { BARCODE_RSS14STACK, "0000000000000", "", 13, 3, 50, 100, 26 }, + /* 77*/ { BARCODE_RSS14STACK_OMNI, "0000000000000", "", 69, 5, 50, 100, 138 }, + /* 78*/ { BARCODE_RSS_EXPSTACK, "[01]12345678901234", "", 71, 5, 102, 204, 142 }, + /* 79*/ { BARCODE_PLANET, "00000000000", "", 12, 2, 185, 370, 24 }, + /* 80*/ { BARCODE_MICROPDF417, "0000000000", "", 12, 6, 82, 164, 24 }, + /* 81*/ { BARCODE_ONECODE, "12345678901234567890", "", 8, 3, 129, 258, 16 }, + /* 82*/ { BARCODE_PLESSEY, "0000000000", "", 50, 1, 227, 454, 118 }, + /* 83*/ { BARCODE_TELEPEN_NUM, "0000000000", "", 50, 1, 128, 256, 118 }, + /* 84*/ { BARCODE_ITF14, "0000000000", "", 50, 1, 135, 330, 138 }, + /* 85*/ { BARCODE_KIX, "123456ABCDE", "", 8, 3, 87, 174, 16 }, + /* 86*/ { BARCODE_AZTEC, "1234567890AB", "", 15, 15, 15, 30, 30 }, + /* 87*/ { BARCODE_DAFT, "DAFTDAFTDAFTDAFT", "", 8, 3, 31, 62, 16 }, + /* 88*/ { BARCODE_MICROQR, "12345", "", 11, 11, 11, 22, 22 }, + /* 89*/ { BARCODE_HIBC_128, "0000000000", "", 50, 1, 134, 268, 118 }, + /* 90*/ { BARCODE_HIBC_39, "0000000000", "", 50, 1, 223, 446, 118 }, + /* 91*/ { BARCODE_HIBC_DM, "ABC", "", 12, 12, 12, 24, 24 }, + /* 92*/ { BARCODE_HIBC_QR, "1234567890AB", "", 21, 21, 21, 42, 42 }, + /* 93*/ { BARCODE_HIBC_PDF, "0000000000", "", 27, 9, 103, 206, 54 }, + /* 94*/ { BARCODE_HIBC_MICPDF, "0000000000", "", 34, 17, 38, 76, 68 }, + /* 95*/ { BARCODE_HIBC_BLOCKF, "0000000000", "", 30, 3, 101, 242, 64 }, + /* 96*/ { BARCODE_HIBC_AZTEC, "1234567890AB", "", 19, 19, 19, 38, 38 }, + /* 97*/ { BARCODE_DOTCODE, "ABC", "", 11, 11, 16, 32, 22 }, // Differs from raster + /* 98*/ { BARCODE_HANXIN, "1234567890AB", "", 23, 23, 23, 46, 46 }, + /* 99*/ { BARCODE_MAILMARK, "01000000000000000AA00AA0A", "", 10, 3, 155, 310, 20 }, + /*100*/ { BARCODE_AZRUNE, "255", "", 11, 11, 11, 22, 22 }, + /*101*/ { BARCODE_CODE32, "12345678", "", 50, 1, 103, 206, 118 }, + /*102*/ { BARCODE_EANX_CC, "123456789012", "[20]01", 50, 7, 99, 234, 118 }, + /*103*/ { BARCODE_EANX_CC, "123456789012+12", "[20]01", 50, 7, 126, 284, 118 }, + /*104*/ { BARCODE_EANX_CC, "123456789012+12345", "[20]01", 50, 7, 153, 338, 118 }, + /*105*/ { BARCODE_EAN128_CC, "[01]12345678901234", "[20]01", 50, 5, 145, 290, 118 }, + /*106*/ { BARCODE_RSS14_CC, "1234567890123", "[20]01", 21, 5, 100, 200, 60 }, + /*107*/ { BARCODE_RSS_LTD_CC, "1234567890123", "[20]01", 19, 6, 74, 148, 56 }, + /*108*/ { BARCODE_RSS_EXP_CC, "[01]12345678901234", "[20]01", 41, 5, 134, 268, 100 }, + /*109*/ { BARCODE_UPCA_CC, "12345678901", "[20]01", 50, 7, 99, 234, 118 }, + /*110*/ { BARCODE_UPCA_CC, "12345678901+12", "[20]01", 50, 7, 128, 284, 118 }, + /*111*/ { BARCODE_UPCA_CC, "12345678901+12345", "[20]01", 50, 7, 155, 338, 118 }, + /*112*/ { BARCODE_UPCE_CC, "1234567", "[20]01", 50, 9, 55, 142, 118 }, + /*113*/ { BARCODE_UPCE_CC, "1234567+12", "[20]01", 50, 9, 82, 192, 118 }, + /*114*/ { BARCODE_UPCE_CC, "1234567+12345", "[20]01", 50, 9, 109, 246, 118 }, + /*115*/ { BARCODE_RSS14STACK_CC, "0000000000000", "[20]01", 24, 9, 56, 112, 48 }, + /*116*/ { BARCODE_RSS14_OMNI_CC, "0000000000000", "[20]01", 80, 11, 56, 112, 160 }, + /*117*/ { BARCODE_RSS_EXPSTACK_CC, "[01]12345678901234", "[20]01", 78, 9, 102, 204, 156 }, + /*118*/ { BARCODE_CHANNEL, "00", "", 50, 1, 19, 38, 118 }, + /*119*/ { BARCODE_CODEONE, "12345678901234567890", "", 22, 22, 22, 44, 44 }, + /*120*/ { BARCODE_GRIDMATRIX, "ABC", "", 18, 18, 18, 36, 36 }, + /*121*/ { BARCODE_UPNQR, "1234567890AB", "", 77, 77, 77, 154, 154 }, + /*122*/ { BARCODE_ULTRA, "0000000000", "", 13, 13, 18, 36, 26 }, + /*123*/ { BARCODE_RMQR, "12345", "", 11, 11, 27, 54, 22 }, }; int data_size = sizeof(data) / sizeof(struct item); @@ -323,34 +334,46 @@ static void test_upcean_hrt(int index, int debug) { }; // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) struct item data[] = { - /* 0*/ { BARCODE_EANX, -1, "123456789012", 0, 50, 1, 95, 230.0, 118.0, 10, -1 }, // EAN-13 + /* 0*/ { BARCODE_EANX, -1, "123456789012", 0, 50, 1, 95, 230.0, 118.0, 8, -1 }, // EAN-13 /* 1*/ { BARCODE_EANX, 0, "123456789012", 0, 50, 1, 95, 230.0, 118.0, -1, -1 }, // EAN-13 - /* 2*/ { BARCODE_EANX_CHK, -1, "1234567890128", 0, 50, 1, 95, 230.0, 118.0, 10, -1 }, // EAN-13 + /* 2*/ { BARCODE_EANX_CHK, -1, "1234567890128", 0, 50, 1, 95, 230.0, 118.0, 8, -1 }, // EAN-13 /* 3*/ { BARCODE_EANX_CHK, 0, "1234567890128", 0, 50, 1, 95, 230.0, 118.0, -1, -1 }, // EAN-13 - /* 4*/ { BARCODE_EANX, -1, "123456789012+12", 0, 50, 1, 124, 288.0, 118.0, 10, 70 }, // EAN-13 + EAN-2 - /* 5*/ { BARCODE_EANX, 0, "123456789012+12", 0, 50, 1, 124, 288.0, 118.0, -1, -1 }, // EAN-13 + EAN-2 - /* 6*/ { BARCODE_EANX, -1, "123456789012+12345", 0, 50, 1, 151, 342.0, 118.0, 10, 70 }, // EAN-13 + EAN-5 - /* 7*/ { BARCODE_EANX, 0, "123456789012+12345", 0, 50, 1, 151, 342.0, 118.0, -1, -1 }, // EAN-13 + EAN-5 - /* 8*/ { BARCODE_ISBNX, -1, "9784567890120+12345", 0, 50, 1, 151, 342.0, 118.0, 10, 70 }, // ISBNX + EAN-5 - /* 9*/ { BARCODE_ISBNX, 0, "9784567890120+12345", 0, 50, 1, 151, 342.0, 118.0, -1, -1 }, // ISBNX + EAN-5 - /* 10*/ { BARCODE_EANX, -1, "1234567", 0, 50, 1, 67, 134.0, 118.0, 34, -1 }, // EAN-8 - /* 11*/ { BARCODE_EANX, 0, "1234567", 0, 50, 1, 67, 134.0, 118.0, -1, -1 }, // EAN-8 - /* 12*/ { BARCODE_EANX, -1, "1234567+12", 0, 50, 1, 96, 192.0, 118.0, 34, 100 }, // EAN-8 + EAN-2 - /* 13*/ { BARCODE_EANX, 0, "1234567+12", 0, 50, 1, 96, 192.0, 118.0, -1, -1 }, // EAN-8 + EAN-2 - /* 14*/ { BARCODE_EANX, -1, "1234567+12345", 0, 50, 1, 123, 246.0, 118.0, 34, 100 }, // EAN-8 + EAN-5 - /* 15*/ { BARCODE_EANX, 0, "1234567+12345", 0, 50, 1, 123, 246.0, 118.0, -1, -1 }, // EAN-8 + EAN-5 - /* 16*/ { BARCODE_UPCA, -1, "12345678901", 0, 50, 1, 95, 230.0, 118.0, 10, -1 }, - /* 17*/ { BARCODE_UPCA, 0, "12345678901", 0, 50, 1, 95, 230.0, 118.0, -1, -1 }, - /* 18*/ { BARCODE_UPCA, -1, "12345678901+12", 0, 50, 1, 124, 288.0, 118.0, 10, 74 }, - /* 19*/ { BARCODE_UPCA, 0, "12345678901+12", 0, 50, 1, 124, 288.0, 118.0, -1, -1 }, - /* 20*/ { BARCODE_UPCA_CHK, -1, "123456789012+12345", 0, 50, 1, 151, 342.0, 118.0, 10, 74 }, - /* 21*/ { BARCODE_UPCA_CHK, 0, "123456789012+12345", 0, 50, 1, 151, 342.0, 118.0, -1, -1 }, - /* 22*/ { BARCODE_UPCE, -1, "1234567", 0, 50, 1, 51, 142.0, 118.0, 10, -1 }, - /* 23*/ { BARCODE_UPCE, 0, "1234567", 0, 50, 1, 51, 142.0, 118.0, -1, -1 }, - /* 24*/ { BARCODE_UPCE_CHK, -1, "12345670+12", 0, 50, 1, 80, 200.0, 118.0, 10, 68 }, - /* 25*/ { BARCODE_UPCE_CHK, 0, "12345670+12", 0, 50, 1, 80, 200.0, 118.0, -1, -1 }, - /* 26*/ { BARCODE_UPCE, -1, "1234567+12345", 0, 50, 1, 107, 254.0, 118.0, 10, 68 }, - /* 27*/ { BARCODE_UPCE, 0, "1234567+12345", 0, 50, 1, 107, 254.0, 118.0, -1, -1 }, + /* 4*/ { BARCODE_ISBNX, -1, "9784567890120", 0, 50, 1, 95, 230.0, 118.0, 8, -1 }, + /* 5*/ { BARCODE_ISBNX, 0, "9784567890120", 0, 50, 1, 95, 230.0, 118.0, -1, -1 }, + /* 6*/ { BARCODE_EANX, -1, "1234567", 0, 50, 1, 67, 134.0, 118.0, 48, -1 }, // EAN-8 + /* 7*/ { BARCODE_EANX, 0, "1234567", 0, 50, 1, 67, 134.0, 118.0, -1, -1 }, // EAN-8 + /* 8*/ { BARCODE_EANX, -1, "1234", 0, 50, 1, 47, 94.0, 118.0, 61, -1 }, // EAN-5 + /* 9*/ { BARCODE_EANX, 0, "1234", 0, 50, 1, 47, 94.0, 118.0, -1, -1 }, // EAN-5 + /* 10*/ { BARCODE_EANX, -1, "12", 0, 50, 1, 20, 40.0, 118.0, 34, -1 }, // EAN-2 + /* 11*/ { BARCODE_EANX, 0, "12", 0, 50, 1, 20, 40.0, 118.0, -1, -1 }, // EAN-2 + /* 12*/ { BARCODE_UPCA, -1, "12345678901", 0, 50, 1, 95, 230.0, 118.0, 8, -1 }, + /* 13*/ { BARCODE_UPCA, 0, "12345678901", 0, 50, 1, 95, 230.0, 118.0, -1, -1 }, + /* 14*/ { BARCODE_UPCA_CHK, -1, "123456789012", 0, 50, 1, 95, 230.0, 118.0, 8, -1 }, + /* 15*/ { BARCODE_UPCA_CHK, 0, "123456789012", 0, 50, 1, 95, 230.0, 118.0, -1, -1 }, + /* 16*/ { BARCODE_UPCE, -1, "1234567", 0, 50, 1, 51, 142.0, 118.0, 8, -1 }, + /* 17*/ { BARCODE_UPCE, 0, "1234567", 0, 50, 1, 51, 142.0, 118.0, -1, -1 }, + /* 18*/ { BARCODE_UPCE_CHK, -1, "12345670", 0, 50, 1, 51, 142.0, 118.0, 8, -1 }, + /* 19*/ { BARCODE_UPCE_CHK, 0, "12345670", 0, 50, 1, 51, 142.0, 118.0, -1, -1 }, + /* 20*/ { BARCODE_EANX, -1, "123456789012+12", 0, 50, 1, 122, 276.0, 118.0, 8, 70 }, // EAN-13 + EAN-2 + /* 21*/ { BARCODE_EANX, 0, "123456789012+12", 0, 50, 1, 122, 276.0, 118.0, -1, -1 }, // EAN-13 + EAN-2 + /* 22*/ { BARCODE_ISBNX, -1, "9784567890120+12", 0, 50, 1, 122, 276.0, 118.0, 8, 70 }, // ISBN + EAN-2 + /* 23*/ { BARCODE_ISBNX, 0, "9784567890120+12", 0, 50, 1, 122, 276.0, 118.0, -1, -1 }, // ISBN + EAN-2 + /* 24*/ { BARCODE_EANX, -1, "123456789012+12345", 0, 50, 1, 149, 330.0, 118.0, 8, 70 }, // EAN-13 + EAN-5 + /* 25*/ { BARCODE_EANX, 0, "123456789012+12345", 0, 50, 1, 149, 330.0, 118.0, -1, -1 }, // EAN-13 + EAN-5 + /* 26*/ { BARCODE_ISBNX, -1, "9784567890120+12345", 0, 50, 1, 149, 330.0, 118.0, 8, 70 }, // ISBN + EAN-5 + /* 27*/ { BARCODE_ISBNX, 0, "9784567890120+12345", 0, 50, 1, 149, 330.0, 118.0, -1, -1 }, // ISBN + EAN-5 + /* 28*/ { BARCODE_EANX, -1, "1234567+12", 0, 50, 1, 94, 216.0, 118.0, 48, 114 }, // EAN-8 + EAN-2 + /* 29*/ { BARCODE_EANX, 0, "1234567+12", 0, 50, 1, 94, 216.0, 118.0, -1, -1 }, // EAN-8 + EAN-2 + /* 30*/ { BARCODE_EANX, -1, "1234567+12345", 0, 50, 1, 121, 270.0, 118.0, 48, 114 }, // EAN-8 + EAN-5 + /* 31*/ { BARCODE_EANX, 0, "1234567+12345", 0, 50, 1, 121, 270.0, 118.0, -1, -1 }, // EAN-8 + EAN-5 + /* 32*/ { BARCODE_UPCA, -1, "12345678901+12", 0, 50, 1, 124, 288.0, 118.0, 8, 72 }, + /* 33*/ { BARCODE_UPCA, 0, "12345678901+12", 0, 50, 1, 124, 288.0, 118.0, -1, -1 }, + /* 34*/ { BARCODE_UPCA, -1, "12345678901+12345", 0, 50, 1, 151, 342.0, 118.0, 8, 72 }, + /* 35*/ { BARCODE_UPCA, 0, "12345678901+12345", 0, 50, 1, 151, 342.0, 118.0, -1, -1 }, + /* 36*/ { BARCODE_UPCE, -1, "1234567+12", 0, 50, 1, 78, 184.0, 118.0, 8, 66 }, + /* 37*/ { BARCODE_UPCE, 0, "1234567+12", 0, 50, 1, 78, 184.0, 118.0, -1, -1 }, + /* 38*/ { BARCODE_UPCE, -1, "1234567+12345", 0, 50, 1, 105, 238.0, 118.0, 8, 66 }, + /* 39*/ { BARCODE_UPCE, 0, "1234567+12345", 0, 50, 1, 105, 238.0, 118.0, -1, -1 }, }; int data_size = sizeof(data) / sizeof(struct item); @@ -647,10 +670,10 @@ static void test_upcean_whitespace_width(int index, int debug) { }; // s/\/\*[ 0-9]*\*\//\=printf("\/*%2d*\/", line(".") - line("'<")) struct item data[] = { - /* 0*/ { BARCODE_UPCA, "12345678904+12345", 0, 151, 342.0, 5, 16.0 }, - /* 1*/ { BARCODE_UPCA, "12345678904+12345", 11, 151, 342.0 + 4 * (11 - 10), 5, 16.0 }, - /* 2*/ { BARCODE_UPCE, "1234567+12", 0, 80, 200.0, 4, 16.0 }, - /* 3*/ { BARCODE_UPCE, "1234567+12", 8, 80, 200.0 + 4 * (8 - 10), 4, 16.0 }, // Note: change from previous behaviour where if whitespace < 10 then set to 10 + /* 0*/ { BARCODE_UPCA, "12345678904+12345", 0, 151, 330.0, 5, 16.0 }, + /* 1*/ { BARCODE_UPCA, "12345678904+12345", 11, 151, 330.0 + 4 * 11, 5, 16.0 }, + /* 2*/ { BARCODE_UPCE, "1234567+12", 0, 78, 184.0, 4, 16.0 }, + /* 3*/ { BARCODE_UPCE, "1234567+12", 8, 78, 184.0 + 4 * 8, 4, 16.0 }, // Note: change from previous behaviour where if whitespace < 10 then set to 10 }; int data_size = sizeof(data) / sizeof(struct item); diff --git a/backend/tests/testcommon.c b/backend/tests/testcommon.c index bbc13c83..62d456ea 100644 --- a/backend/tests/testcommon.c +++ b/backend/tests/testcommon.c @@ -383,7 +383,7 @@ char *testUtilBarcodeName(int symbology) { return ""; } if (data[symbology].val != symbology || (data[symbology].define != -1 && data[symbology].define != symbology)) { // Self-check - fprintf(stderr, "testUtilBarcodeName data table out of sync (%d)\n", symbology); + fprintf(stderr, "testUtilBarcodeName: data table out of sync (%d)\n", symbology); abort(); } return data[symbology].name; @@ -443,7 +443,7 @@ char *testUtilErrorName(int error_number) { return ""; } if (data[error_number].val != error_number || (data[error_number].define != -1 && data[error_number].define != error_number)) { // Self-check - fprintf(stderr, "testUtilErrorName data table out of sync (%d)\n", error_number); + fprintf(stderr, "testUtilErrorName: data table out of sync (%d)\n", error_number); abort(); } return data[error_number].name; @@ -474,7 +474,7 @@ char *testUtilInputModeName(int input_mode) { return input_mode == -1 ? "-1" : ""; } if (data[input_mode].val != input_mode || (data[input_mode].define != -1 && data[input_mode].define != input_mode)) { // Self-check - fprintf(stderr, "testUtilInputModeName data table out of sync (%d)\n", input_mode); + fprintf(stderr, "testUtilInputModeName: data table out of sync (%d)\n", input_mode); abort(); } return data[input_mode].name; @@ -487,7 +487,11 @@ char *testUtilOption3Name(int option_3) { case ZINT_FULL_MULTIBYTE: return "ZINT_FULL_MULTIBYTE"; case ULTRA_COMPRESSION: return "ULTRA_COMPRESSION"; } - return "-1"; + if (option_3 != -1 && option_3 != 0) { + fprintf(stderr, "testUtilOption3Name: unknown value (%d)\n", option_3); + abort(); + } + return option_3 ? "-1" : "0"; } char *testUtilOutputOptionsName(int output_options) { @@ -523,7 +527,7 @@ char *testUtilOutputOptionsName(int output_options) { buf[0] = '\0'; for (i = 0; i < data_size; i++) { if (data[i].define != data[i].val) { // Self-check - fprintf(stderr, "testUtilOutputOptionsName data table out of sync (%d)\n", i); + fprintf(stderr, "testUtilOutputOptionsName: data table out of sync (%d)\n", i); abort(); } if (output_options & data[i].define) { @@ -531,9 +535,13 @@ char *testUtilOutputOptionsName(int output_options) { strcat(buf, " | "); } strcat(buf, data[i].name); - set = 1; + set |= data[i].define; } } + if (set != output_options) { + fprintf(stderr, "testUtilOutputOptionsName: unknown output option(s) %d (%d)\n", output_options & set, output_options); + abort(); + } return buf; } @@ -1472,10 +1480,10 @@ static char *testUtilBwippName(int symbology, int option_1, int option_2, int op { "", -1, 10, 0, 0, 0, 0, 0, }, { "", -1, 11, 0, 0, 0, 0, 0, }, { "", -1, 12, 0, 0, 0, 0, 0, }, - { "ean13", BARCODE_EANX, 13, 0, 0, 0, 0, 0, }, - { "ean13", BARCODE_EANX_CHK, 14, 0, 0, 0, 0, 0, }, + { "ean13", BARCODE_EANX, 13, 0, 1, 0, 0, 1 /*gs1_cvt*/, }, + { "ean13", BARCODE_EANX_CHK, 14, 0, 1, 0, 0, 1, }, { "", -1, 15, 0, 0, 0, 0, 0, }, - { "gs1-128", BARCODE_EAN128, 16, 0, 0, 0, 0, 1 /*gs1_cnt*/, }, + { "gs1-128", BARCODE_EAN128, 16, 0, 0, 0, 0, 1 /*gs1_cvt*/, }, { "", -1, 17, 0, 0, 0, 0, 0, }, { "rationalizedCodabar", BARCODE_CODABAR, 18, 0, 0, 0, 0, 0, }, { "", -1, 19, 0, 0, 0, 0, 0, }, @@ -1493,11 +1501,11 @@ static char *testUtilBwippName(int symbology, int option_1, int option_2, int op { "databarexpanded", BARCODE_RSS_EXP, 31, 0, 1, 0, 1 /*linear_row_height*/, 1, }, { "telepen", BARCODE_TELEPEN, 32, 0, 0, 0, 0, 0, }, { "", -1, 33, 0, 0, 0, 0, 0, }, - { "upca", BARCODE_UPCA, 34, 0, 0, 0, 0, 0, }, - { "upca", BARCODE_UPCA_CHK, 35, 0, 0, 0, 0, 0, }, + { "upca", BARCODE_UPCA, 34, 0, 1, 0, 0, 1 /*gs1_cvt*/, }, + { "upca", BARCODE_UPCA_CHK, 35, 0, 1, 0, 0, 1, }, { "", -1, 36, 0, 0, 0, 0, 0, }, - { "upce", BARCODE_UPCE, 37, 0, 0, 0, 0, 0, }, - { "upce", BARCODE_UPCE_CHK, 38, 0, 0, 0, 0, 0, }, + { "upce", BARCODE_UPCE, 37, 0, 1, 0, 0, 1 /*gs1_cvt*/, }, + { "upce", BARCODE_UPCE_CHK, 38, 0, 1, 0, 0, 1, }, { "", -1, 39, 0, 0, 0, 0, 0, }, { "postnet", BARCODE_POSTNET, 40, 0, 0, 0, 0, 0, }, { "", -1, 41, 0, 0, 0, 0, 0, }, @@ -1528,7 +1536,7 @@ static char *testUtilBwippName(int symbology, int option_1, int option_2, int op { "", BARCODE_AUSREPLY, 66, 0, 0, 0, 0, 0, }, { "", BARCODE_AUSROUTE, 67, 0, 0, 0, 0, 0, }, { "", BARCODE_AUSREDIRECT, 68, 0, 0, 0, 0, 0, }, - { "isbn", BARCODE_ISBNX, 69, 0, 0, 0, 0, 0, }, + { "isbn", BARCODE_ISBNX, 69, 0, 1, 0, 0, 1 /*gs1_cvt*/, }, { "royalmail", BARCODE_RM4SCC, 70, 0, 0, 0, 0, 0, }, { "datamatrix", BARCODE_DATAMATRIX, 71, 0, 0, 0, 0, 0, }, { "ean14", BARCODE_EAN14, 72, 0, 0, 0, 0, 1 /*gs1_cvt*/, }, @@ -1612,7 +1620,7 @@ static char *testUtilBwippName(int symbology, int option_1, int option_2, int op return NULL; } if (data[symbology].val != symbology || (data[symbology].define != -1 && data[symbology].define != symbology)) { // Self-check - fprintf(stderr, "testUtilBarcodeName data table out of sync (%d)\n", symbology); + fprintf(stderr, "testUtilBwippName: data table out of sync (%d)\n", symbology); abort(); } if (data[symbology].name[0] == '\0') { @@ -1654,14 +1662,22 @@ int testUtilCanBwipp(int symbology, int option_1, int option_2, int option_3, in return 0; } -static void testUtilBwippCvtGS1Data(char *bwipp_data) { +static void testUtilBwippCvtGS1Data(char *bwipp_data, int upcean, int *addon_posn) { char *b; + int pipe = 0; + *addon_posn = 0; for (b = bwipp_data; *b; b++) { + if (upcean && *b == '|') { + pipe = 1; + } if (*b == '[') { *b = '('; } else if (*b == ']') { *b = ')'; + } else if (*b == '+' && upcean && !pipe) { + *b = ' '; + *addon_posn = b - bwipp_data; } } } @@ -1693,6 +1709,24 @@ static char *testUtilBwippEscape(char *bwipp_data, int bwipp_data_size, const ch return bwipp_data; } +static void testUtilISBNHyphenate(char *bwipp_data, int addon_posn) { + /* Hack in 4 hyphens in fixed format, wrong for many ISBNs */ + char temp[13 + 4 + 1 + 5 + 1]; + int len = strlen(bwipp_data); + int i, j; + + if (len < 13 || (addon_posn && addon_posn < 13 ) || len >= (int) sizeof(temp)) { + return; + } + for (i = 0, j = 0; i <= len; i++, j++) { + if (i == 3 || i == 5 || i == 10 || i == 12) { + temp[j++] = '-'; + } + temp[j] = bwipp_data[i]; + } + strcpy(bwipp_data, temp); +} + #define GS_INITIAL_LEN 35 /* Length of cmd up to -q */ int testUtilBwipp(const struct zint_symbol *symbol, int option_1, int option_2, int option_3, const char *data, int length, const char *primary, char *buffer, int buffer_size) { @@ -1704,7 +1738,7 @@ int testUtilBwipp(const struct zint_symbol *symbol, int option_1, int option_2, int symbology = symbol->symbology; int data_len = length == -1 ? (int) strlen(data) : length; int primary_len = primary ? (int) strlen(primary) : 0; - int max_data_len = 4 + primary_len + 1 + 1 + data_len * 4; /* 4 AI prefix + primary + '|' + leading zero + escaped data */ + int max_data_len = 4 + primary_len + 1 + 1 + data_len * 4 + 32; /* 4 AI prefix + primary + '|' + leading zero + escaped data + fudge */ char cmd[max_data_len + 1024]; char *bwipp_barcode = NULL; @@ -1723,6 +1757,10 @@ int testUtilBwipp(const struct zint_symbol *symbol, int option_1, int option_2, int r, h; int parse; + int upcean = is_extendable(symbology); + int upca = symbology == BARCODE_UPCA || symbology == BARCODE_UPCA_CHK || symbology == BARCODE_UPCA_CC; + int addon_posn; + bwipp_data[0] = bwipp_opts_buf[0] = '\0'; bwipp_barcode = testUtilBwippName(symbology, option_1, option_2, option_3, &linear_row_height, &gs1_cvt); @@ -1739,20 +1777,27 @@ int testUtilBwipp(const struct zint_symbol *symbol, int option_1, int option_2, } if (is_composite(symbology)) { - if (symbology == BARCODE_EANX_CC && primary_len <= 7) { - bwipp_barcode = "ean8composite"; - } if (!primary) { fprintf(stderr, "testUtilBwipp: no primary data given %s\n", testUtilBarcodeName(symbology)); return -1; } - if (*primary != '[' && symbology != BARCODE_EANX_CC && symbology != BARCODE_UPCE_CC && symbology != BARCODE_UPCA_CC) { + if (*primary != '[' && !upcean) { strcat(bwipp_data, "(01)"); } strcat(bwipp_data, primary); strcat(bwipp_data, "|"); strcat(bwipp_data, data); - testUtilBwippCvtGS1Data(bwipp_data); + testUtilBwippCvtGS1Data(bwipp_data, upcean, &addon_posn); + + if (upcean) { + if (symbology == BARCODE_EANX_CC && (primary_len <= 8 || (addon_posn && addon_posn <= 8))) { + bwipp_barcode = "ean8composite"; + } + if (addon_posn) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%saddongap=%d", strlen(bwipp_opts_buf) ? " " : "", option_2 > 0 ? option_2 : upca ? 9 : 7); + bwipp_opts = bwipp_opts_buf; + } + } if (option_1 > 0) { sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%sccversion=%c", strlen(bwipp_opts_buf) ? " " : "", option_1 == 1 ? 'a' : option_1 == 2 ? 'b' : 'c'); @@ -1764,11 +1809,24 @@ int testUtilBwipp(const struct zint_symbol *symbol, int option_1, int option_2, } } else { if (gs1_cvt) { - if (*data != '[') { + if (*data != '[' && !upcean) { strcat(bwipp_data, symbology == BARCODE_NVE18 ? "(00)" : "(01)"); } strcat(bwipp_data, data); - testUtilBwippCvtGS1Data(bwipp_data); + testUtilBwippCvtGS1Data(bwipp_data, upcean, &addon_posn); + + if (upcean) { + if ((symbology == BARCODE_EANX || symbology == BARCODE_EANX_CHK) && (data_len <= 8 || (addon_posn && addon_posn <= 8))) { + bwipp_barcode = data_len <= 3 ? "ean2" : data_len <= 5 ? "ean5" : "ean8"; + } + if (symbology == BARCODE_ISBNX) { + testUtilISBNHyphenate(bwipp_data, addon_posn); + } + if (addon_posn) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%saddongap=%d", strlen(bwipp_opts_buf) ? " " : "", option_2 > 0 ? option_2 : upca ? 9 : 7); + bwipp_opts = bwipp_opts_buf; + } + } if (option_2 > 0) { if (symbology == BARCODE_RSS_EXP || symbology == BARCODE_RSS_EXPSTACK) { @@ -1802,13 +1860,11 @@ int testUtilBwipp(const struct zint_symbol *symbol, int option_1, int option_2, if (option_1 > 0) { sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%srows=%d", strlen(bwipp_opts_buf) ? " " : "", option_1); } - //} else { /* BWIPP does not really support both row and column given */ - if (option_2 > 0) { - sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%scolumns=%d", strlen(bwipp_opts_buf) ? " " : "", option_2 - 5); - } else { - sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%scolumns=%d", strlen(bwipp_opts_buf) ? " " : "", (symbol->width - 57) / 11); - } - //} + if (option_2 > 0) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%scolumns=%d", strlen(bwipp_opts_buf) ? " " : "", option_2 - 5); + } else { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%scolumns=%d", strlen(bwipp_opts_buf) ? " " : "", (symbol->width - 57) / 11); + } bwipp_opts = bwipp_opts_buf; } else if (symbology == BARCODE_CODE11 || symbology == BARCODE_CODE39 || symbology == BARCODE_EXCODE39 || symbology == BARCODE_LOGMARS) { if (option_2 > 0) { @@ -1843,19 +1899,35 @@ int testUtilBwipp(const struct zint_symbol *symbol, int option_1, int option_2, /* Hack in various adjustments */ if (symbology == BARCODE_RSS14 || symbology == BARCODE_RSS_LTD || symbology == BARCODE_RSS_EXP) { /* Begin with space */ - memmove(cmd + GS_INITIAL_LEN + 5, cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN); - memcpy(cmd + GS_INITIAL_LEN, " -sbs", 5); + char adj[5] = " -sbs"; + memmove(cmd + GS_INITIAL_LEN + sizeof(adj), cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN); + memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj)); } if (symbology == BARCODE_CODE11 || symbology == BARCODE_CODE39 || symbology == BARCODE_EXCODE39 || symbology == BARCODE_PZN || symbology == BARCODE_VIN) { /* Ratio 3 width bar/space -> 2 width */ - memmove(cmd + GS_INITIAL_LEN + 8, cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN); - memcpy(cmd + GS_INITIAL_LEN, " -sr=0.6", 8); + char adj[8] = " -sr=0.6"; + memmove(cmd + GS_INITIAL_LEN + sizeof(adj), cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN); + memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj)); + } + if (symbology == BARCODE_C25INTER || symbology == BARCODE_DPLEIT || symbology == BARCODE_DPIDENT || symbology == BARCODE_ITF14) { + /* Ratio 2 width bar/space -> 3 width */ + char adj[8] = " -sr=1.3"; + memmove(cmd + GS_INITIAL_LEN + sizeof(adj), cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN); + memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj)); } if (symbology == BARCODE_CODE11 || symbology == BARCODE_CODE39 || symbology == BARCODE_EXCODE39 || symbology == BARCODE_HIBC_39 - || symbology == BARCODE_LOGMARS || symbology == BARCODE_PZN || symbology == BARCODE_VIN) { + || symbology == BARCODE_LOGMARS || symbology == BARCODE_PZN || symbology == BARCODE_VIN + || symbology == BARCODE_C25INTER || symbology == BARCODE_DPLEIT || symbology == BARCODE_DPIDENT || symbology == BARCODE_ITF14) { /* End sbs loop on bar */ - memmove(cmd + GS_INITIAL_LEN + 6, cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN); - memcpy(cmd + GS_INITIAL_LEN, " -selb", 6); + char adj[6] = " -selb"; + memmove(cmd + GS_INITIAL_LEN + sizeof(adj), cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN); + memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj)); + } + if (symbology == BARCODE_C25MATRIX) { + /* Zint uses 4X start/stop wides while BWIPP uses 3X - convert */ + char adj[91] = " -sp='i 0 eq i limit 4 sub eq or sbs i get 3 eq and { (1111) print true } { false } ifelse'"; + memmove(cmd + GS_INITIAL_LEN + sizeof(adj), cmd + GS_INITIAL_LEN, strlen(cmd) + 1 - GS_INITIAL_LEN); + memcpy(cmd + GS_INITIAL_LEN, adj, sizeof(adj)); } if (symbol->debug & ZINT_DEBUG_TEST_PRINT) { diff --git a/backend/tests/tools/bwipp_dump-barcode.ps.diff b/backend/tests/tools/bwipp_dump-barcode.ps.diff index fb044787..7baa0503 100644 --- a/backend/tests/tools/bwipp_dump-barcode.ps.diff +++ b/backend/tests/tools/bwipp_dump-barcode.ps.diff @@ -1,5 +1,5 @@ ---- ../../../../postscriptbarcode/build/monolithic/barcode.ps 2020-07-10 13:08:57.215118693 +0100 -+++ ../tools/bwipp_dump.ps 2020-07-10 13:44:00.892056648 +0100 +--- ../../../../postscriptbarcode/build/monolithic/barcode.ps 2020-07-14 14:52:24.208222925 +0100 ++++ ../tools/bwipp_dump.ps 2020-07-14 17:29:15.314238749 +0100 @@ -29,6 +29,8 @@ % CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS % IN THE SOFTWARE. @@ -9,7 +9,7 @@ % --BEGIN TEMPLATE-- % --BEGIN RESOURCE preamble-- -@@ -24484,34 +24486,72 @@ +@@ -24485,34 +24487,80 @@ pop } ifelse @@ -64,7 +64,7 @@ + } { + /linsym exch def + /linpixs [ -+ linsym /sbs get { 1 index 1 eq {{0}} {{1}} ifelse repeat } forall % Alternates x 1/0's ++ linsym /sbs get { cvi 1 index 1 eq {{0}} {{1}} ifelse repeat } forall % Alternates x 1/0's + ] def + /linheight linsym /bhs get 0 get 72 mul cvi def @@ -75,18 +75,26 @@ + + /linpad [ ccpixx 97 sub {0} repeat ] def + ++ /diff linpixs length linpad length add 2 add ccpixx sub def % An add-on can make linear wider than composite ++ diff 0 gt { % Left align composite ++ /ccrpad [ diff {0} repeat ] def ++ /pixx ccpixx diff add def ++ } { ++ /ccrpad 0 array def ++ /pixx ccpixx def ++ } ifelse ++ + /pixs [ + 0 ccpixx ccpixs length 1 sub { + /i exch def -+ 2 { ccpixs i ccpixx getinterval aload pop } repeat ++ 2 { ccpixs i ccpixx getinterval aload pop ccrpad aload pop } repeat + } for -+ 2 { linpad aload pop 0 1 93 {0} repeat 1 0 } repeat -+ 2 { linpad aload pop 1 0 93 {0} repeat 0 1 } repeat -+ 2 { linpad aload pop 0 1 93 {0} repeat 1 0 } repeat ++ 2 { linpad aload pop 0 1 93 {0} repeat 1 0 ccrpad aload pop } repeat ++ 2 { linpad aload pop 1 0 93 {0} repeat 0 1 ccrpad aload pop } repeat ++ 2 { linpad aload pop 0 1 93 {0} repeat 1 0 ccrpad aload pop } repeat + linheight { linpad aload pop 0 linpixs aload pop 0 } repeat + ] def + -+ /pixx ccpixx def + /pixy pixs length pixx idiv def + << + /ren //renmatrix @@ -101,7 +109,7 @@ end -@@ -24570,7 +24610,7 @@ +@@ -24571,7 +24619,7 @@ pop } ifelse @@ -110,7 +118,7 @@ % Get the result of encoding with ean8 and gs1-cc options (lintype) (ean8) put -@@ -24578,29 +24618,67 @@ +@@ -24579,29 +24627,75 @@ options (dontdraw) true put % Plot the linear part @@ -157,7 +165,7 @@ + } { + /linsym exch def + /linpixs [ -+ linsym /sbs get { 1 index 1 eq {{0}} {{1}} ifelse repeat } forall % Alternates x 1/0's ++ linsym /sbs get { cvi 1 index 1 eq {{0}} {{1}} ifelse repeat } forall % Alternates x 1/0's + ] def + /linheight linsym /bhs get 0 get 72 mul cvi def @@ -172,18 +180,26 @@ - grestore + /linpad [ ccpixx 69 sub {0} repeat ] def + ++ /diff linpixs length linpad length add 2 add ccpixx sub def % An add-on can make linear wider than composite ++ diff 0 gt { % Left align composite ++ /ccrpad [ diff {0} repeat ] def ++ /pixx ccpixx diff add def ++ } { ++ /ccrpad 0 array def ++ /pixx ccpixx def ++ } ifelse ++ + /pixs [ + 0 ccpixx ccpixs length 1 sub { + /i exch def -+ 2 { ccpixs i ccpixx getinterval aload pop } repeat ++ 2 { ccpixs i ccpixx getinterval aload pop ccrpad aload pop } repeat + } for -+ 2 { linpad aload pop 0 1 65 {0} repeat 1 0 } repeat -+ 2 { linpad aload pop 1 0 65 {0} repeat 0 1 } repeat -+ 2 { linpad aload pop 0 1 65 {0} repeat 1 0 } repeat ++ 2 { linpad aload pop 0 1 65 {0} repeat 1 0 ccrpad aload pop } repeat ++ 2 { linpad aload pop 1 0 65 {0} repeat 0 1 ccrpad aload pop } repeat ++ 2 { linpad aload pop 0 1 65 {0} repeat 1 0 ccrpad aload pop } repeat + linheight { linpad aload pop 0 linpixs aload pop 0 } repeat + ] def + -+ /pixx ccpixx def + /pixy pixs length pixx idiv def + << + /ren //renmatrix @@ -198,7 +214,7 @@ end -@@ -24659,34 +24737,72 @@ +@@ -24660,34 +24754,80 @@ pop } ifelse @@ -253,7 +269,7 @@ + } { + /linsym exch def + /linpixs [ -+ linsym /sbs get { 1 index 1 eq {{0}} {{1}} ifelse repeat } forall % Alternates x 1/0's ++ linsym /sbs get { cvi 1 index 1 eq {{0}} {{1}} ifelse repeat } forall % Alternates x 1/0's + ] def + /linheight linsym /bhs get 0 get 72 mul cvi def @@ -264,18 +280,26 @@ + + /linpad [ ccpixx 97 sub {0} repeat ] def + ++ /diff linpixs length linpad length add 2 add ccpixx sub def % An add-on can make linear wider than composite ++ diff 0 gt { % Left align composite ++ /ccrpad [ diff {0} repeat ] def ++ /pixx ccpixx diff add def ++ } { ++ /ccrpad 0 array def ++ /pixx ccpixx def ++ } ifelse ++ + /pixs [ + 0 ccpixx ccpixs length 1 sub { + /i exch def -+ 2 { ccpixs i ccpixx getinterval aload pop } repeat ++ 2 { ccpixs i ccpixx getinterval aload pop ccrpad aload pop } repeat + } for -+ 2 { linpad aload pop 0 1 93 {0} repeat 1 0 } repeat -+ 2 { linpad aload pop 1 0 93 {0} repeat 0 1 } repeat -+ 2 { linpad aload pop 0 1 93 {0} repeat 1 0 } repeat ++ 2 { linpad aload pop 0 1 93 {0} repeat 1 0 ccrpad aload pop } repeat ++ 2 { linpad aload pop 1 0 93 {0} repeat 0 1 ccrpad aload pop } repeat ++ 2 { linpad aload pop 0 1 93 {0} repeat 1 0 ccrpad aload pop } repeat + linheight { linpad aload pop 0 linpixs aload pop 0 } repeat + ] def + -+ /pixx ccpixx def + /pixy pixs length pixx idiv def + << + /ren //renmatrix @@ -290,7 +314,7 @@ end -@@ -24760,34 +24876,72 @@ +@@ -24761,34 +24901,80 @@ /opt options >> def @@ -345,7 +369,7 @@ + } { + /linsym exch def + /linpixs [ -+ linsym /sbs get { 1 index 1 eq {{0}} {{1}} ifelse repeat } forall % Alternates x 1/0's ++ linsym /sbs get { cvi 1 index 1 eq {{0}} {{1}} ifelse repeat } forall % Alternates x 1/0's + ] def + /linheight linsym /bhs get 0 get 72 mul cvi def @@ -356,18 +380,26 @@ + + /linpad [ ccpixx 53 sub {0} repeat ] def + ++ /diff linpixs length linpad length add 2 add ccpixx sub def % An add-on can make linear wider than composite ++ diff 0 gt { % Left align composite ++ /ccrpad [ diff {0} repeat ] def ++ /pixx ccpixx diff add def ++ } { ++ /ccrpad 0 array def ++ /pixx ccpixx def ++ } ifelse ++ + /pixs [ + 0 ccpixx ccpixs length 1 sub { + /i exch def -+ 2 { ccpixs i ccpixx getinterval aload pop } repeat ++ 2 { ccpixs i ccpixx getinterval aload pop ccrpad aload pop } repeat + } for -+ 2 { linpad aload pop 0 1 49 {0} repeat 1 0 } repeat -+ 2 { linpad aload pop 1 0 49 {0} repeat 0 1 } repeat -+ 2 { linpad aload pop 0 1 49 {0} repeat 1 0 } repeat ++ 2 { linpad aload pop 0 1 49 {0} repeat 1 0 ccrpad aload pop } repeat ++ 2 { linpad aload pop 1 0 49 {0} repeat 0 1 ccrpad aload pop } repeat ++ 2 { linpad aload pop 0 1 49 {0} repeat 1 0 ccrpad aload pop } repeat + linheight { linpad aload pop 0 linpixs aload pop 0 } repeat + ] def + -+ /pixx ccpixx def + /pixy pixs length pixx idiv def + << + /ren //renmatrix @@ -382,7 +414,7 @@ end -@@ -24846,7 +25000,7 @@ +@@ -24847,7 +25033,7 @@ pop } ifelse @@ -391,7 +423,7 @@ options (lintype) (databaromni) put options (linkage) true put -@@ -24857,7 +25011,7 @@ +@@ -24858,7 +25044,7 @@ linear options //databaromni exec dup (sbs) get /linsbs exch def dup (bhs) get 0 get 72 mul /linheight exch def @@ -400,7 +432,7 @@ % Plot the separator /sepfinder { -@@ -24888,20 +25042,66 @@ +@@ -24889,20 +25075,66 @@ sep 0 [0 0 0] putinterval sep sep length 4 sub [0 0 0 0] putinterval 18 sepfinder 64 sepfinder @@ -436,14 +468,14 @@ + /ccpixs compsym /pixs get def + /ccpixx compsym /pixx get def + -+ /linpixs [ 0 % Begin with left guard space -+ linsbs { 1 index 0 eq {{1}} {{0}} ifelse repeat } forall % Alternates x 1/0's ++ /linpixs [ 0 % Begin with left guard space ++ linsbs { cvi 1 index 0 eq {{1}} {{0}} ifelse repeat } forall % Alternates x 1/0's + ] def -+ /sep [ 0 sep aload pop ] def % Pad with left guard space ++ /sep [ 0 sep aload pop ] def % Pad with left guard space + + /linheight linheight cvi def + /diff linpixs length ccpixx sub def -+ diff 0 gt { % Centre align composite, doubling up rows ++ diff 0 gt { % Centre align composite, doubling up rows + /ccpad [ diff 2 idiv {0} repeat ] def + /pixs [ + 0 ccpixx ccpixs length 1 sub { @@ -453,10 +485,10 @@ + sep aload pop linheight { linpixs aload pop } repeat + ] def + /pixx linpixs length def -+ } { % Right pad composite, doubling up rows, and left pad (right align) separator/linear ++ } { % Right pad composite, doubling up rows, and left pad (right align) separator/linear + /linpad [ diff neg 1 add {0} repeat ] def + /pixs [ -+ 0 ccpixx ccpixs length 1 sub { % Right pad composite with 1 space ++ 0 ccpixx ccpixs length 1 sub { % Right pad composite with 1 space + /i exch def + 2 { ccpixs i ccpixx getinterval aload pop 0 } repeat + } for @@ -479,7 +511,7 @@ end -@@ -24959,7 +25159,7 @@ +@@ -24960,7 +25192,7 @@ pop } ifelse @@ -488,7 +520,7 @@ options (lintype) (databarstacked) put options (linkage) true put -@@ -24970,7 +25170,7 @@ +@@ -24971,7 +25203,7 @@ linear options //databarstacked exec dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def dup (pixy) get /linheight exch def @@ -497,7 +529,7 @@ % Plot the separator /sepfinder { -@@ -24998,20 +25198,52 @@ +@@ -24999,20 +25231,52 @@ sep 0 [ 0 0 0 0 ] putinterval sep sep length 4 sub [ 0 0 0 0 ] putinterval 18 sepfinder @@ -537,12 +569,12 @@ + /pixx ccpixx 1 add def + /linpad [ pixx linwidth sub {0} repeat ] def + /pixs [ -+ 0 ccpixx ccpixs length 1 sub { % Left pad composite with 1 space, doubling up rows ++ 0 ccpixx ccpixs length 1 sub { % Left pad composite with 1 space, doubling up rows + /i exch def + 2 { 0 ccpixs i ccpixx getinterval aload pop } repeat + } for + sep aload pop linpad aload pop -+ 0 linwidth linpixs length 1 sub { % Right pad linear ++ 0 linwidth linpixs length 1 sub { % Right pad linear + /i exch def + linpixs i linwidth getinterval aload pop linpad aload pop + } for @@ -562,7 +594,7 @@ end -@@ -25069,7 +25301,7 @@ +@@ -25070,7 +25334,7 @@ pop } ifelse @@ -571,7 +603,7 @@ options (lintype) (databarstackedomni) put options (linkage) true put -@@ -25080,7 +25312,7 @@ +@@ -25081,7 +25345,7 @@ linear options //databarstackedomni exec dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def dup (pixy) get /linheight exch def @@ -580,7 +612,7 @@ % Plot the separator /sepfinder { -@@ -25108,20 +25340,52 @@ +@@ -25109,20 +25373,52 @@ sep 0 [ 0 0 0 0 ] putinterval sep sep length 4 sub [ 0 0 0 0 ] putinterval 18 sepfinder @@ -620,12 +652,12 @@ + /pixx ccpixx 1 add def + /linpad [ pixx linwidth sub {0} repeat ] def + /pixs [ -+ 0 ccpixx ccpixs length 1 sub { % Left pad composite with 1 space, doubling up rows ++ 0 ccpixx ccpixs length 1 sub { % Left pad composite with 1 space, doubling up rows + /i exch def + 2 { 0 ccpixs i ccpixx getinterval aload pop } repeat + } for + sep aload pop linpad aload pop -+ 0 linwidth linpixs length 1 sub { % Right pad linear ++ 0 linwidth linpixs length 1 sub { % Right pad linear + /i exch def + linpixs i linwidth getinterval aload pop linpad aload pop + } for @@ -645,7 +677,7 @@ end -@@ -25294,7 +25558,7 @@ +@@ -25295,7 +25591,7 @@ pop } ifelse @@ -654,7 +686,7 @@ options (lintype) (databarlimited) put options (linkage) true put -@@ -25305,7 +25569,7 @@ +@@ -25306,7 +25602,7 @@ linear options //databarlimited exec dup (sbs) get /linsbs exch def dup (bhs) get 0 get 72 mul /linheight exch def @@ -663,7 +695,7 @@ % Plot the separator mark -@@ -25313,22 +25577,68 @@ +@@ -25314,22 +25610,68 @@ counttomark 1 sub array astore /sep exch def pop pop sep 0 [0 0 0] putinterval sep sep length 4 sub [0 0 0 0] putinterval @@ -703,14 +735,14 @@ + /ccpixx compsym /pixx get def - grestore -+ /linpixs [ 0 % Begin with left guard space -+ linsbs { 1 index 0 eq {{1}} {{0}} ifelse repeat } forall % Alternates x 1/0's ++ /linpixs [ 0 % Begin with left guard space ++ linsbs { cvi 1 index 0 eq {{1}} {{0}} ifelse repeat } forall % Alternates x 1/0's + ] def -+ /sep [ 0 sep aload pop ] def % Offset by 1 ++ /sep [ 0 sep aload pop ] def % Offset by 1 + + /linheight linheight cvi def + /diff linpixs length ccpixx sub def -+ diff 0 gt { % 2 column - centre align ++ diff 0 gt { % 2 column - centre align + /ccpad [ diff 2 idiv {0} repeat ] def + /pixs [ + 0 ccpixx ccpixs length 1 sub { @@ -720,10 +752,10 @@ + sep aload pop linheight { linpixs aload pop } repeat + ] def + /pixx linpixs length def -+ } { % 3/4 column - right pad 1 and right align separator/linear ++ } { % 3/4 column - right pad 1 and right align separator/linear + /linpad [ diff neg 1 add {0} repeat ] def + /pixs [ -+ 0 ccpixx ccpixs length 1 sub { % Right pad composite with 1 space ++ 0 ccpixx ccpixs length 1 sub { % Right pad composite with 1 space + /i exch def + 2 { ccpixs i ccpixx getinterval aload pop 0 } repeat + } for @@ -746,7 +778,7 @@ end -@@ -25387,7 +25697,7 @@ +@@ -25388,7 +25730,7 @@ pop } ifelse @@ -755,7 +787,7 @@ options (lintype) (databarexpanded) put options (linkage) true put -@@ -25398,7 +25708,7 @@ +@@ -25399,7 +25741,7 @@ linear options //databarexpanded exec dup (sbs) get /linsbs exch def dup (bhs) get 0 get 72 mul /linheight exch def @@ -764,7 +796,7 @@ % Plot the separator /sepfinder { -@@ -25427,20 +25737,60 @@ +@@ -25428,20 +25770,60 @@ 18 98 bot length 13 sub {} for 69 98 bot length 13 sub {} for ] {sepfinder} forall @@ -800,10 +832,10 @@ + /ccpixs compsym /pixs get def + /ccpixx compsym /pixx get def + -+ /linpixs [ 0 % Begin with left guard space -+ linsbs { 1 index 0 eq {{1}} {{0}} ifelse repeat } forall % Alternates x 1/0's ++ /linpixs [ 0 % Begin with left guard space ++ linsbs { cvi 1 index 0 eq {{1}} {{0}} ifelse repeat } forall % Alternates x 1/0's + ] def -+ /sep [ 0 sep aload pop ] def % Offset by 1 ++ /sep [ 0 sep aload pop ] def % Offset by 1 + + /linheight linheight cvi def + /diff linpixs length ccpixx sub def @@ -837,7 +869,7 @@ end -@@ -25498,7 +25848,7 @@ +@@ -25499,7 +25881,7 @@ pop } ifelse @@ -846,7 +878,7 @@ options (lintype) (databarexpandedstacked) put options (linkage) true put -@@ -25509,7 +25859,7 @@ +@@ -25510,7 +25892,7 @@ linear options //databarexpandedstacked exec dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def dup (pixy) get /linheight exch def @@ -855,7 +887,7 @@ % Plot the separator /sepfinder { -@@ -25529,27 +25879,55 @@ +@@ -25530,27 +25912,55 @@ } for } bind def /sep [ bot {1 exch sub} forall ] def @@ -900,10 +932,10 @@ + /ccpixx compsym /pixx get def + + /pixx sep length def -+ /cclpad [ pixx ccpixx sub 1 add 2 idiv {0} repeat ] def % Add 1 to allow for odd difference ++ /cclpad [ pixx ccpixx sub 1 add 2 idiv {0} repeat ] def % Add 1 to allow for odd difference + /ccrpad [ pixx ccpixx sub 2 idiv {0} repeat ] def + /pixs [ -+ 0 ccpixx ccpixs length 1 sub { % Centre align composite ++ 0 ccpixx ccpixs length 1 sub { % Centre align composite + /i exch def + 2 { cclpad aload pop ccpixs i ccpixx getinterval aload pop ccrpad aload pop } repeat + } for @@ -925,7 +957,7 @@ end -@@ -25608,7 +25986,7 @@ +@@ -25609,7 +26019,7 @@ pop } ifelse @@ -934,7 +966,7 @@ options (inkspread) (0) put options (dontdraw) true put -@@ -25635,35 +26013,87 @@ +@@ -25636,35 +26046,87 @@ linear << options {} forall >> //gs1-128 exec dup (sbs) get /linsbs exch def dup (bhs) get 0 get 72 mul /linheight exch def @@ -989,23 +1021,23 @@ + /ccpixx compsym /pixx get def + + /linpixs [ -+ linsbs { 1 index 1 eq {{0}} {{1}} ifelse repeat } forall % Alternates x 1/0's ++ linsbs { cvi 1 index 1 eq {{0}} {{1}} ifelse repeat } forall % Alternates x 1/0's + ] def + -+ x 0 gt { % Left pad composite ++ x 0 gt { % Left pad composite + /cclpad [ x {0} repeat ] def + /linlpad 0 array def + /diff linwidth ccpixx x add sub def -+ } { % Left pad linear ++ } { % Left pad linear + /cclpad 0 array def + /linlpad [ x neg {0} repeat ] def + /diff linwidth x sub ccpixx sub def + } ifelse + -+ diff 0 gt { % Right pad composite ++ diff 0 gt { % Right pad composite + /ccrpad [ diff {0} repeat ] def + /linrpad 0 array def -+ } { % Right pad linear ++ } { % Right pad linear + /ccrpad 0 array def + /linrpad [ diff neg {0} repeat ] def + } ifelse @@ -1036,7 +1068,7 @@ end -@@ -26961,3 +27391,115 @@ +@@ -26962,3 +27424,124 @@ % --END ENCODER hibcazteccode-- % --END TEMPLATE-- @@ -1099,15 +1131,15 @@ +ret /pixs known { + /pixs ret /pixs get def + -+ n ret /pixx known and { % If newlines requested and have row width ++ n ret /pixx known and { % If newlines requested and have row width + /pixx ret /pixx get def -+ 0 pixx pixs length 1 sub { % For i = 0; i < pixs length; i += pixx -+ pixs exch pixx getinterval { % For j = i; j < i + pixx; j++ ++ 0 pixx pixs length 1 sub { % For i = 0; i < pixs length; i += pixx ++ pixs exch pixx getinterval { % For j = i; j < i + pixx; j++ + 1 string cvs print + } forall + (\n) print + } for -+ } { % Else dump the whole thing, no newlines ++ } { % Else dump the whole thing, no newlines + pixs { 1 string cvs print } forall + } ifelse +} { @@ -1115,10 +1147,17 @@ + ret /sbs known { + /sbs ret /sbs get def + -+ % Check if given ratio arg to adjust width of bars/spaces (eg "0.6" reduces 3 -> 2) ++ % Check if given preprocessor override ++ systemdict /p known { ++ /p systemdict /p get cvx def ++ } { ++ /p { false } def ++ } ifelse ++ ++ % Check if given ratio arg to adjust width of bars/spaces (e.g. "0.6" reduces 3 -> 2, "1.3" increases 2 -> 3) + systemdict /r known { + /r systemdict /r get cvr def -+ /f { r mul ceiling cvi } def ++ /f { r mul round cvi } def + } { + /f {} def + } ifelse @@ -1135,11 +1174,13 @@ + + 0 1 limit { + /i exch def -+ i 2 mod 0 eq { % i is even -+ sbs i get f { (1) print } repeat -+ } { -+ sbs i get f { (0) print } repeat -+ } ifelse ++ p not { % If not preprocessed ++ i 2 mod 0 eq { % i is even ++ sbs i get f cvi { (1) print } repeat ++ } { ++ sbs i get f cvi { (0) print } repeat ++ } ifelse ++ } if + } for + n { (\n) print } if + } if diff --git a/backend/tests/tools/bwipp_dump.ps.tar.xz b/backend/tests/tools/bwipp_dump.ps.tar.xz index 447a11c9b18d95bd4cb631707517e3f2b297363c..53f5f9fb3436b18778740412c16c3c7ef3bf6293 100644 GIT binary patch literal 114156 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⪻DN7f>vU|if7GpG)XCJw^An8$(DfoOk zTa55J_rw+`LK=MA-5c|=cJ;3-jBV19g9l&QNHYd(|DWXHQX7|o!M^~g0EzYM7Ont) zh6ll_b`E@ z^@7?a^cXk#`R~a$t;Za#!}^tL$EG7-kq=-wjFfQ<+>eYTl|dokRTZ9mbGG{|E2!d{ z`hP1D7DOe1CH{jB#v}1garocg9$}m1vBnCs<;CYO_ zwc8K-q6_83&tr&Y(gk+D^B^-w=!kXJ2d8L2A?Xz3W0uc-GVj{6X1QAbP1TBJyv)$k zBDk({=R4=!16bE(Y)t$N?$ZZS12!M%!~gfcLO-dEH7(*p=+CXc%FtPhWX4C!EceR7 zXdC39$33oU6cacMOxH_K*F|*NP48~;YLZFJlsBZ+gRfUvkft!1%uzt`Zp<+6;So7+ zO_zUj=jBB+2_~KaqW(#uTC@7tvEvxhjMqhnD~>xK6Yv-n9*72sOq+21c7AYO;k7u6=RT|N;2KU?6-?`|xY5-2kcpZYK7z^L zylq{`Na0U<*F;ICgDv)*+rh3TuMKyh)^wm={*>;Ac9XcUG)qZe3wM9m1Kdq#F_|RX z`!}yE;AdeQGv9$=xRmX_15h+c-V^4`6mZF}#-JVV$K7nI9(h!|cZa2eWIj^mL6;zc zp)J>{BuyAjov`H`vL#}000D8 ES_mObod5s; literal 114172 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 qBj#R`|m=AA%vXEd1!v}lGY_$)-an$CLE_vxpN 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 +*/ +/* vim: set ts=4 sw=4 et : */ + +/* The functions "getBit", "init928" and "encode928" are copyright BSI and are + released with permission under the following terms: + + "Copyright subsists in all BSI publications. BSI also holds the copyright, in the + UK, of the international standardisation bodies. Except as + permitted under the Copyright, Designs and Patents Act 1988 no extract may be + reproduced, stored in a retrieval system or transmitted in any form or by any + means - electronic, photocopying, recording or otherwise - without prior written + permission from BSI. + + "This does not preclude the free use, in the course of implementing the standard, + of necessary details such as symbols, and size, type or grade designations. If these + details are to be used for any other purpose than implementation then the prior + written permission of BSI must be obtained." + + The date of publication for these functions is 31 May 2006 + */ + +$cw = array(0, 0, 0, 0, 0, 0, 1); +$pwr928 = array( $cw ); + +for ($j = 1; $j < 69; $j++) { + for ($v = 0, $i = 6; $i >= 1; $i--) { + $v = (2 * $cw[$i]) + (int)($v / 928); + $pwr928[$j][$i] = $cw[$i] = $v % 928; + } + $pwr928[$j][0] = $cw[0] = (2 * $cw[0]) + (int)($v / 928); +} + +printf("static UINT pwr928[69][7] = {\n"); +for ($i = 0; $i < 69; $i++) { + printf(" { "); + for ($j = 0; $j < 7; $j++) { + printf("%3d, ", $pwr928[$i][$j]); + } + printf("},\n"); +} +printf("};\n"); diff --git a/backend/upcean.c b/backend/upcean.c index 5355fc6e..b8b5c29f 100644 --- a/backend/upcean.c +++ b/backend/upcean.c @@ -305,13 +305,15 @@ static int upce(struct zint_symbol *symbol, unsigned char source[], char dest[]) } /* EAN-2 and EAN-5 add-on codes */ -static void add_on(unsigned char source[], char dest[], int mode) { +static void add_on(unsigned char source[], char dest[], int addon_gap) { char parity[6]; unsigned int i, code_type; /* If an add-on then append with space */ - if (mode != 0) { - strcat(dest, "9"); + if (addon_gap != 0) { + i = strlen(dest); + dest[i] = itoc(addon_gap); + dest[i + 1] = '\0'; } /* Start character */ @@ -704,6 +706,7 @@ INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_le unsigned char local_source[20] = {0}; unsigned int latch, reader, writer, with_addon; int error_number, i, plus_count; + int addon_gap = 0; with_addon = FALSE; latch = FALSE; @@ -714,7 +717,7 @@ INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_le return ZINT_ERROR_TOO_LONG; } if (symbol->symbology != BARCODE_ISBNX) { - /* ISBN has it's own checking routine */ + /* ISBN has its own checking routine */ error_number = is_sane("0123456789+", source, src_len); if (error_number == ZINT_ERROR_INVALID_DATA) { strcpy(symbol->errtxt, "284: Invalid characters in data"); @@ -741,11 +744,6 @@ INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_le } /* Add leading zeroes */ - ustrcpy(local_source, (unsigned char *) ""); - if (symbol->symbology == BARCODE_ISBNX) { - to_upper(local_source); - } - ean_leading_zeroes(symbol, source, local_source); for (reader = 0; reader < ustrlen(local_source); reader++) { @@ -774,6 +772,12 @@ INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_le writer++; } } while (reader <= ustrlen(local_source)); + + if (symbol->symbology == BARCODE_UPCA || symbol->symbology == BARCODE_UPCA_CHK || symbol->symbology == BARCODE_UPCA_CC) { + addon_gap = symbol->option_2 >= 9 && symbol->option_2 <= 12 ? symbol->option_2 : 9; + } else { + addon_gap = symbol->option_2 >= 7 && symbol->option_2 <= 12 ? symbol->option_2 : 7; + } } else { strcpy((char*) first_part, (char*) local_source); } @@ -894,12 +898,12 @@ INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_le switch (ustrlen(second_part)) { case 0: break; case 2: - add_on(second_part, (char*) dest, 1); + add_on(second_part, (char*) dest, addon_gap); strcat((char*) symbol->text, "+"); strcat((char*) symbol->text, (char*) second_part); break; case 5: - add_on(second_part, (char*) dest, 1); + add_on(second_part, (char*) dest, addon_gap); strcat((char*) symbol->text, "+"); strcat((char*) symbol->text, (char*) second_part); break; diff --git a/backend/vector.c b/backend/vector.c index 5313b60a..2c1a91bd 100644 --- a/backend/vector.c +++ b/backend/vector.c @@ -31,7 +31,6 @@ /* vim: set ts=4 sw=4 et : */ #include -#include #include #ifdef _MSC_VER @@ -45,7 +44,7 @@ INTERNAL int ps_plot(struct zint_symbol *symbol); INTERNAL int svg_plot(struct zint_symbol *symbol); INTERNAL int emf_plot(struct zint_symbol *symbol); -static struct zint_vector_rect *vector_plot_create_rect(float x, float y, float width, float height) { +static struct zint_vector_rect *vector_plot_create_rect(double x, double y, double width, double height) { struct zint_vector_rect *rect; rect = (struct zint_vector_rect*) malloc(sizeof (struct zint_vector_rect)); @@ -72,7 +71,7 @@ static int vector_plot_add_rect(struct zint_symbol *symbol, struct zint_vector_r return 1; } -static struct zint_vector_hexagon *vector_plot_create_hexagon(float x, float y, float diameter) { +static struct zint_vector_hexagon *vector_plot_create_hexagon(double x, double y, double diameter) { struct zint_vector_hexagon *hexagon; hexagon = (struct zint_vector_hexagon*) malloc(sizeof (struct zint_vector_hexagon)); @@ -80,7 +79,7 @@ static struct zint_vector_hexagon *vector_plot_create_hexagon(float x, float y, hexagon->next = NULL; hexagon->x = x; hexagon->y = y; - hexagon->diameter = (float)((diameter * 5.0) / 4.0); // Ugly kludge for legacy support + hexagon->diameter = (diameter * 5.0) / 4.0; // Ugly kludge for legacy support return hexagon; } @@ -96,7 +95,7 @@ static int vector_plot_add_hexagon(struct zint_symbol *symbol, struct zint_vecto return 1; } -static struct zint_vector_circle *vector_plot_create_circle(float x, float y, float diameter, int colour) { +static struct zint_vector_circle *vector_plot_create_circle(double x, double y, double diameter, int colour) { struct zint_vector_circle *circle; circle = (struct zint_vector_circle *) malloc(sizeof (struct zint_vector_circle)); @@ -122,7 +121,7 @@ static int vector_plot_add_circle(struct zint_symbol *symbol, struct zint_vector } static int vector_plot_add_string(struct zint_symbol *symbol, - unsigned char *text, float x, float y, float fsize, float width, + unsigned char *text, double x, double y, double fsize, double width, struct zint_vector_string **last_string) { struct zint_vector_string *string; @@ -196,7 +195,7 @@ static void vector_scale(struct zint_symbol *symbol, int file_type) { struct zint_vector_hexagon *hex; struct zint_vector_circle *circle; struct zint_vector_string *string; - float scale = symbol->scale * 2.0f; + double scale = symbol->scale * 2.0; if ((file_type == OUT_EMF_FILE) && (symbol->symbology == BARCODE_MAXICODE)) { // Increase size to overcome limitations in EMF file format @@ -270,39 +269,44 @@ static void vector_reduce_rectangles(struct zint_symbol *symbol) { INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_type) { int error_number; + double large_bar_height; + int textdone; + int main_width, comp_offset, addon_gap; + unsigned char addon[6]; + int xoffset, yoffset, roffset, boffset; + double addon_text_posn; + int textoffset; + int default_text_posn; + double row_height, row_posn; + int upceanflag = 0; + int addon_latch = 0; + unsigned char textpart1[5], textpart2[7], textpart3[7], textpart4[2]; + int textpos; + int hide_text = 0; + int i, r; + + double text_height; + int rect_count, last_row_start; + int this_row; + struct zint_vector *vector; struct zint_vector_rect *rectangle, *rect, *last_rectangle = NULL; struct zint_vector_hexagon *last_hexagon = NULL; struct zint_vector_string *last_string = NULL; struct zint_vector_circle *last_circle = NULL; - - int i, r, latch; - float textpos, large_bar_height, preset_height, row_height, row_posn = 0.0; - float text_offset, text_height; - int xoffset, yoffset, textdone, main_symbol_width_x; - int roffset, boffset; - char addon[6]; - int large_bar_count, symbol_lead_in; - float addon_text_posn; - float default_text_posn; - int hide_text = 0; - int upceanflag = 0; - int rect_count, last_row_start; - int this_row; - int addon_latch = 0; struct zint_vector_string *string; (void)rotate_angle; /* Not currently implemented */ + // Free any previous rendering structures + vector_free(symbol); + // Sanity check colours - error_number = check_colour_options(symbol); + error_number = output_check_colour_options(symbol); if (error_number != 0) { return error_number; } - // Free any previous rendering structures - vector_free(symbol); - // Allocate memory vector = symbol->vector = (struct zint_vector *) malloc(sizeof (struct zint_vector)); if (!vector) return ZINT_ERROR_MEMORY; @@ -311,121 +315,44 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ vector->circles = NULL; vector->strings = NULL; - row_height = 0; + large_bar_height = output_large_bar_height(symbol); textdone = 0; - main_symbol_width_x = symbol->width; - strcpy(addon, ""); - symbol_lead_in = 0; - addon_text_posn = 0.0; - rect_count = 0; - last_row_start = 0; - /* - * Determine if there will be any addon texts and text height - */ - latch = 0; - r = 0; - /* Isolate add-on text */ + main_width = symbol->width; + comp_offset = 0; + if (is_extendable(symbol->symbology)) { - for (i = 0; i < (int) ustrlen(symbol->text); i++) { - if (latch == 1) { - addon[r] = symbol->text[i]; - r++; - } - if (symbol->text[i] == '+') { - latch = 1; - } - } - } - addon[r] = '\0'; - - - /* - * Calculate the width of the barcode, especially if there are any extra - * borders or white space to add. - */ - - if (is_composite(symbol->symbology)) { - while (!(module_is_set(symbol, symbol->rows - 1, symbol_lead_in))) { - symbol_lead_in++; - } + upceanflag = output_process_upcean(symbol, &main_width, &comp_offset, addon, &addon_gap); } - /* Certain symbols need whitespace otherwise characters get chopped off the sides */ - if ((symbol->symbology == BARCODE_EANX) || (symbol->symbology == BARCODE_EANX_CHK) - || (symbol->symbology == BARCODE_EANX_CC) || (symbol->symbology == BARCODE_ISBNX)) { - switch (ustrlen(symbol->text)) { - case 13: /* EAN 13 */ - case 16: - case 19: - if (symbol->whitespace_width == 0) { - symbol->whitespace_width = 10; - } - main_symbol_width_x = 96 + symbol_lead_in; - upceanflag = 13; - break; - case 2: - main_symbol_width_x = 22 + symbol_lead_in; - upceanflag = 2; - break; - case 5: - main_symbol_width_x = 49 + symbol_lead_in; - upceanflag = 5; - break; - default: - main_symbol_width_x = 68 + symbol_lead_in; - upceanflag = 8; - } - } else if ((symbol->symbology == BARCODE_UPCA) || (symbol->symbology == BARCODE_UPCA_CHK) - || (symbol->symbology == BARCODE_UPCA_CC)) { - upceanflag = 12; - if (symbol->whitespace_width == 0) { - symbol->whitespace_width = 10; - } - main_symbol_width_x = 96 + symbol_lead_in; - } else if ((symbol->symbology == BARCODE_UPCE) || (symbol->symbology == BARCODE_UPCE_CHK) - || (symbol->symbology == BARCODE_UPCE_CC)) { - upceanflag = 6; - if (symbol->whitespace_width == 0) { - symbol->whitespace_width = 10; - } - main_symbol_width_x = 51 + symbol_lead_in; - } + output_set_whitespace_offsets(symbol, &xoffset, &yoffset, &roffset, &boffset); - if ((!symbol->show_hrt) || (ustrlen(symbol->text) == 0)) { - hide_text = 1; + addon_text_posn = 0.0; + hide_text = ((!symbol->show_hrt) || (ustrlen(symbol->text) == 0)); + + if (hide_text) { text_height = 0.0; - text_offset = upceanflag ? 9.0f : 0.0f; + textoffset = upceanflag ? 9.0 : 0.0; } else { - text_height = upceanflag ? 11.0f : 9.0f; - text_offset = 9.0; + text_height = upceanflag ? 11.0 : 9.0; + textoffset = 9.0; } if (symbol->output_options & SMALL_TEXT) - text_height *= 0.8f; + text_height *= 0.8; - set_whitespace_offsets(symbol, &xoffset, &yoffset, &roffset, &boffset); - - // Determine if height should be overridden - large_bar_count = 0; - preset_height = 0.0; - for (i = 0; i < symbol->rows; i++) { - preset_height += symbol->row_height[i]; - if (symbol->row_height[i] == 0) { - large_bar_count++; - } - } - - vector->width = (float)ceil(symbol->width + (xoffset + roffset)); - vector->height = (float)ceil(symbol->height + text_offset + (yoffset + boffset)); - - large_bar_height = large_bar_count ? (symbol->height - preset_height) / large_bar_count : 0 /*Not used if large_bar_count zero*/; + vector->width = ceil(symbol->width + (xoffset + roffset)); + vector->height = ceil(symbol->height + textoffset + (yoffset + boffset)); if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) { - default_text_posn = symbol->height + text_offset + symbol->border_width + symbol->border_width; + default_text_posn = symbol->height + textoffset + symbol->border_width + symbol->border_width; } else { - default_text_posn = symbol->height + text_offset; + default_text_posn = symbol->height + textoffset; } + row_height = 0.0; + rect_count = 0; + last_row_start = 0; + // Plot rectangles - most symbols created here if ((symbol->symbology != BARCODE_MAXICODE) && ((symbol->output_options & BARCODE_DOTTY_MODE) == 0)) { for (r = 0; r < symbol->rows; r++) { @@ -434,7 +361,7 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ if (symbol->row_height[this_row] == 0) { row_height = large_bar_height; } else { - row_height = (float)symbol->row_height[this_row]; + row_height = symbol->row_height[this_row]; } row_posn = 0; for (i = 0; i < r; i++) { @@ -453,19 +380,23 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ do { block_width++; } while (i + block_width < symbol->width && module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i)); - if ((addon_latch == 0) && (r == (symbol->rows - 1)) && (i > main_symbol_width_x)) { - addon_text_posn = row_posn + 8.0f; + if ((addon_latch == 0) && (r == (symbol->rows - 1)) && (i > main_width)) { + addon_text_posn = row_posn + 8.0; addon_latch = 1; } if (module_is_set(symbol, this_row, i)) { /* a bar or colour block */ if (addon_latch == 0) { - rectangle = vector_plot_create_rect((float)(i + xoffset), row_posn, (float)block_width, row_height); + rectangle = vector_plot_create_rect(i + xoffset, row_posn, block_width, row_height); if (symbol->symbology == BARCODE_ULTRA) { rectangle->colour = module_is_set(symbol, this_row, i); } } else { - rectangle = vector_plot_create_rect((float)(i + xoffset), row_posn + 10.0f, (float)block_width, row_height - 5.0f); + if (upceanflag == 12 || upceanflag == 6) { /* UPC-A/E don't descend */ + rectangle = vector_plot_create_rect(i + xoffset, row_posn + 10.0, block_width, row_height > 10.0 ? row_height - 10.0 : 1.0); + } else { + rectangle = vector_plot_create_rect(i + xoffset, row_posn + 10.0, block_width, row_height > 5.0 ? row_height - 5.0 : 1.0); + } } vector_plot_add_rect(symbol, rectangle, &last_rectangle); rect_count++; @@ -479,21 +410,21 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ // Plot Maxicode symbols if (symbol->symbology == BARCODE_MAXICODE) { struct zint_vector_circle *circle; - vector->width = 37.0f + (xoffset + roffset); - vector->height = 36.0f + (yoffset + boffset); + vector->width = 37.0 + (xoffset + roffset); + vector->height = 36.0 + (yoffset + boffset); // Bullseye - circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 10.85f, 0); + circle = vector_plot_create_circle(17.88 + xoffset, 17.8 + yoffset, 10.85, 0); vector_plot_add_circle(symbol, circle, &last_circle); - circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 8.97f, 1); + circle = vector_plot_create_circle(17.88 + xoffset, 17.8 + yoffset, 8.97, 1); vector_plot_add_circle(symbol, circle, &last_circle); - circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 7.10f, 0); + circle = vector_plot_create_circle(17.88 + xoffset, 17.8 + yoffset, 7.10, 0); vector_plot_add_circle(symbol, circle, &last_circle); - circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 5.22f, 1); + circle = vector_plot_create_circle(17.88 + xoffset, 17.8 + yoffset, 5.22, 1); vector_plot_add_circle(symbol, circle, &last_circle); - circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 3.31f, 0); + circle = vector_plot_create_circle(17.88 + xoffset, 17.8 + yoffset, 3.31, 0); vector_plot_add_circle(symbol, circle, &last_circle); - circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 1.43f, 1); + circle = vector_plot_create_circle(17.88 + xoffset, 17.8 + yoffset, 1.43, 1); vector_plot_add_circle(symbol, circle, &last_circle); /* Hexagons */ @@ -501,8 +432,8 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ for (i = 0; i < symbol->width; i++) { if (module_is_set(symbol, r, i)) { //struct zint_vector_hexagon *hexagon = vector_plot_create_hexagon(((i * 0.88) + ((r & 1) ? 1.76 : 1.32)), ((r * 0.76) + 0.76), symbol->dot_size); - struct zint_vector_hexagon *hexagon = vector_plot_create_hexagon(((i * 1.23f) + 0.615f + ((r & 1) ? 0.615f : 0.0f)) + xoffset, - ((r * 1.067f) + 0.715f) + yoffset, symbol->dot_size); + struct zint_vector_hexagon *hexagon = vector_plot_create_hexagon(((i * 1.23) + 0.615 + ((r & 1) ? 0.615 : 0.0)) + xoffset, + ((r * 1.067) + 0.715) + yoffset, symbol->dot_size); vector_plot_add_hexagon(symbol, hexagon, &last_hexagon); } } @@ -514,247 +445,204 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ for (r = 0; r < symbol->rows; r++) { for (i = 0; i < symbol->width; i++) { if (module_is_set(symbol, r, i)) { - struct zint_vector_circle *circle = vector_plot_create_circle(i + 0.5f + xoffset, r + 0.5f + yoffset, 1.0f, 0); + struct zint_vector_circle *circle = vector_plot_create_circle(i + 0.5 + xoffset, r + 0.5 + yoffset, 1.0, 0); vector_plot_add_circle(symbol, circle, &last_circle); } } } } - /* Guard bar extension */ - if (upceanflag == 6) { - i = 0; - for (rect = symbol->vector->rectangles; rect != NULL; rect = rect->next) { - switch (i - last_row_start) { - case 0: - case 1: - case 14: - case 15: - case 16: - rect->height += 5.0; - break; + if (upceanflag) { + /* Guard bar extension */ + if (upceanflag == 6) { /* UPC-E */ + i = 0; + for (rect = symbol->vector->rectangles; rect != NULL; rect = rect->next) { + switch (i - last_row_start) { + case 0: + case 1: + case 14: + case 15: + case 16: + rect->height += 5.0; + break; + } + i++; } - i++; - } - } - - if (upceanflag == 8) { - i = 0; - for (rect = symbol->vector->rectangles; rect != NULL; rect = rect->next) { - switch (i - last_row_start) { - case 0: - case 1: - case 10: - case 11: - case 20: - case 21: - rect->height += 5.0; - break; + } else if (upceanflag == 8) { /* EAN-8 */ + i = 0; + for (rect = symbol->vector->rectangles; rect != NULL; rect = rect->next) { + switch (i - last_row_start) { + case 0: + case 1: + case 10: + case 11: + case 20: + case 21: + rect->height += 5.0; + break; + } + i++; } - i++; - } - } - - if (upceanflag == 12) { - i = 0; - for (rect = symbol->vector->rectangles; rect != NULL; rect = rect->next) { - switch (i - last_row_start) { - case 0: - case 1: - case 2: - case 3: - case 14: - case 15: - case 26: - case 27: - case 28: - case 29: - rect->height += 5.0; - break; + } else if (upceanflag == 12) { /* UPC-A */ + i = 0; + for (rect = symbol->vector->rectangles; rect != NULL; rect = rect->next) { + switch (i - last_row_start) { + case 0: + case 1: + case 2: + case 3: + case 14: + case 15: + case 26: + case 27: + case 28: + case 29: + rect->height += 5.0; + break; + } + i++; } - i++; - } - } - - if (upceanflag == 13) { - i = 0; - for (rect = symbol->vector->rectangles; rect != NULL; rect = rect->next) { - switch (i - last_row_start) { - case 0: - case 1: - case 14: - case 15: - case 28: - case 29: - rect->height += 5.0; - break; + } else if (upceanflag == 13) { /* EAN-13 */ + i = 0; + for (rect = symbol->vector->rectangles; rect != NULL; rect = rect->next) { + switch (i - last_row_start) { + case 0: + case 1: + case 14: + case 15: + case 28: + case 29: + rect->height += 5.0; + break; + } + i++; } - i++; } } /* Add the text */ if (!hide_text) { - char textpart[10]; - float textwidth; - xoffset += symbol_lead_in; + xoffset += comp_offset; - if (upceanflag == 8) { - for (i = 0; i < 4; i++) { - textpart[i] = symbol->text[i]; - } - textpart[4] = '\0'; - textpos = 17; - textwidth = 4.0 * 8.5; - vector_plot_add_string(symbol, (unsigned char *) textpart, textpos + xoffset, default_text_posn, text_height, textwidth, &last_string); - for (i = 0; i < 4; i++) { - textpart[i] = symbol->text[i + 4]; - } - textpart[4] = '\0'; - textpos = 50; - vector_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset), default_text_posn, text_height, textwidth, &last_string); - textdone = 1; - switch (strlen(addon)) { - case 2: - textpos = (float)(xoffset + 86); - textwidth = 2.0f * 8.5f; - vector_plot_add_string(symbol, (unsigned char *) addon, textpos, addon_text_posn, text_height, textwidth, &last_string); - break; - case 5: - textpos = (float)(xoffset + 100); - textwidth = 5.0f * 8.5f; - vector_plot_add_string(symbol, (unsigned char *) addon, textpos, addon_text_posn, text_height, textwidth, &last_string); - break; - } + if (upceanflag) { + double textwidth; + output_upcean_split_text(upceanflag, symbol->text, textpart1, textpart2, textpart3, textpart4); - } + if (upceanflag == 6) { /* UPC-E */ + textpos = -5 + xoffset; + textwidth = 6.2; + vector_plot_add_string(symbol, textpart1, textpos, default_text_posn - 2.0, text_height * (8.0 / 11.0), textwidth, &last_string); + textpos = 24 + xoffset; + textwidth = 6.0 * 8.5; + vector_plot_add_string(symbol, textpart2, textpos, default_text_posn, text_height, textwidth, &last_string); + textpos = 55 + xoffset; + textwidth = 6.2; + vector_plot_add_string(symbol, textpart3, textpos, default_text_posn - 2.0, text_height * (8.0 / 11.0), textwidth, &last_string); + textdone = 1; + switch (ustrlen(addon)) { + case 2: + textpos = 61 + xoffset + addon_gap; + textwidth = 2.0 * 8.5; + vector_plot_add_string(symbol, addon, textpos, addon_text_posn, text_height, textwidth, &last_string); + break; + case 5: + textpos = 75 + xoffset + addon_gap; + textwidth = 5.0 * 8.5; + vector_plot_add_string(symbol, addon, textpos, addon_text_posn, text_height, textwidth, &last_string); + break; + } - if (upceanflag == 13) { - textpart[0] = symbol->text[0]; - textpart[1] = '\0'; - textpos = -5; // 7 - textwidth = 8.5; - vector_plot_add_string(symbol, (unsigned char *) textpart, textpos + xoffset, default_text_posn, text_height, textwidth, &last_string); + } else if (upceanflag == 8) { /* EAN-8 */ + textpos = 17 + xoffset; + textwidth = 4.0 * 8.5; + vector_plot_add_string(symbol, textpart1, textpos, default_text_posn, text_height, textwidth, &last_string); + textpos = 50 + xoffset; + vector_plot_add_string(symbol, textpart2, textpos, default_text_posn, text_height, textwidth, &last_string); + textdone = 1; + switch (ustrlen(addon)) { + case 2: + textpos = 77 + xoffset + addon_gap; + textwidth = 2.0 * 8.5; + vector_plot_add_string(symbol, addon, textpos, addon_text_posn, text_height, textwidth, &last_string); + break; + case 5: + textpos = 91 + xoffset + addon_gap; + textwidth = 5.0 * 8.5; + vector_plot_add_string(symbol, addon, textpos, addon_text_posn, text_height, textwidth, &last_string); + break; + } - for (i = 0; i < 6; i++) { - textpart[i] = symbol->text[i + 1]; - } - textpart[6] = '\0'; - textpos = 25; - textwidth = 6.0 * 8.5; - vector_plot_add_string(symbol, (unsigned char *) textpart, textpos + xoffset, default_text_posn, text_height, textwidth, &last_string); - for (i = 0; i < 6; i++) { - textpart[i] = symbol->text[i + 7]; - } - textpart[6] = '\0'; - textpos = 72; - vector_plot_add_string(symbol, (unsigned char *) textpart, textpos + xoffset, default_text_posn, text_height, textwidth, &last_string); - textdone = 1; - switch (strlen(addon)) { - case 2: - textpos = (float)(xoffset + 114); - textwidth = 2.0f * 8.5f; - vector_plot_add_string(symbol, (unsigned char *) addon, textpos, addon_text_posn, text_height, textwidth, &last_string); - break; - case 5: - textpos = (float)(xoffset + 128); - textwidth = 5.0f * 8.5f; - vector_plot_add_string(symbol, (unsigned char *) addon, textpos, addon_text_posn, text_height, textwidth, &last_string); - break; + } else if (upceanflag == 12) { /* UPC-A */ + textpos = -5 + xoffset; + textwidth = 6.2; + vector_plot_add_string(symbol, textpart1, textpos, default_text_posn - 2.0, text_height * (8.0 / 11.0), textwidth, &last_string); + textpos = 27 + xoffset; + textwidth = 5.0 * 8.5; + vector_plot_add_string(symbol, textpart2, textpos, default_text_posn, text_height, textwidth, &last_string); + textpos = 68 + xoffset; + vector_plot_add_string(symbol, textpart3, textpos, default_text_posn, text_height, textwidth, &last_string); + textpos = 100 + xoffset; + textwidth = 6.2; + vector_plot_add_string(symbol, textpart4, textpos, default_text_posn - 2.0, text_height * (8.0 / 11.0), textwidth, &last_string); + textdone = 1; + switch (ustrlen(addon)) { + case 2: + textpos = 107 + xoffset + addon_gap; + textwidth = 2.0 * 8.5; + vector_plot_add_string(symbol, addon, textpos, addon_text_posn, text_height, textwidth, &last_string); + break; + case 5: + textpos = 121 + xoffset + addon_gap; + textwidth = 5.0 * 8.5; + vector_plot_add_string(symbol, addon, textpos, addon_text_posn, text_height, textwidth, &last_string); + break; + } + + } else if (upceanflag == 13) { /* EAN-13 */ + textpos = -7 + xoffset; + textwidth = 8.5; + vector_plot_add_string(symbol, textpart1, textpos, default_text_posn, text_height, textwidth, &last_string); + textpos = 24 + xoffset; + textwidth = 6.0 * 8.5; + vector_plot_add_string(symbol, textpart2, textpos, default_text_posn, text_height, textwidth, &last_string); + textpos = 71 + xoffset; + vector_plot_add_string(symbol, textpart3, textpos, default_text_posn, text_height, textwidth, &last_string); + textdone = 1; + switch (ustrlen(addon)) { + case 2: + textpos = 105 + xoffset + addon_gap; + textwidth = 2.0 * 8.5; + vector_plot_add_string(symbol, addon, textpos, addon_text_posn, text_height, textwidth, &last_string); + break; + case 5: + textpos = 119 + xoffset + addon_gap; + textwidth = 5.0 * 8.5; + vector_plot_add_string(symbol, addon, textpos, addon_text_posn, text_height, textwidth, &last_string); + break; + } } } - if (upceanflag == 12) { - textpart[0] = symbol->text[0]; - textpart[1] = '\0'; - textpos = -5; - textwidth = 6.2f; - vector_plot_add_string(symbol, (unsigned char *) textpart, textpos + xoffset, default_text_posn - 2.0f, text_height * (8.0f / 11.0f), textwidth, &last_string); - for (i = 0; i < 5; i++) { - textpart[i] = symbol->text[i + 1]; - } - textpart[5] = '\0'; - textpos = 27; - textwidth = 5.0f * 8.5f; - vector_plot_add_string(symbol, (unsigned char *) textpart, textpos + xoffset, default_text_posn, text_height, textwidth, &last_string); - for (i = 0; i < 5; i++) { - textpart[i] = symbol->text[i + 6]; - } - textpos = 68; - vector_plot_add_string(symbol, (unsigned char *) textpart, textpos + xoffset, default_text_posn, text_height, textwidth, &last_string); - textpart[0] = symbol->text[11]; - textpart[1] = '\0'; - textpos = 100; - textwidth = 6.2f; - vector_plot_add_string(symbol, (unsigned char *) textpart, textpos + xoffset, default_text_posn - 2.0f, text_height * (8.0f / 11.0f), textwidth, &last_string); - textdone = 1; - switch (strlen(addon)) { - case 2: - textpos = (float)(xoffset + 116); - textwidth = 2.0f * 8.5f; - vector_plot_add_string(symbol, (unsigned char *) addon, textpos, addon_text_posn, text_height, textwidth, &last_string); - break; - case 5: - textpos = (float)(xoffset + 130); - textwidth = 5.0f * 8.5f; - vector_plot_add_string(symbol, (unsigned char *) addon, textpos, addon_text_posn, text_height, textwidth, &last_string); - break; + if (!textdone) { + /* Put normal human readable text at the bottom (and centered) */ + // calculate start xoffset to center text + vector_plot_add_string(symbol, symbol->text, main_width / 2.0 + xoffset, default_text_posn, text_height, symbol->width, &last_string); + + // Remove control characters from readable text + // This only applies to Code 128 + string = symbol->vector->strings; + if (string) { + for (i = 0; i < string->length; i++) { + if (string->text[i] < ' ') { + string->text[i] = ' '; + } + } } } - if (upceanflag == 6) { - textpart[0] = symbol->text[0]; - textpart[1] = '\0'; - textpos = -5; - textwidth = 6.2f; - vector_plot_add_string(symbol, (unsigned char *) textpart, textpos + xoffset, default_text_posn - 2.0f, text_height * (8.0f / 11.0f), textwidth, &last_string); - for (i = 0; i < 6; i++) { - textpart[i] = symbol->text[i + 1]; - } - textpart[6] = '\0'; - textpos = 24; - textwidth = 6.0 * 8.5; - vector_plot_add_string(symbol, (unsigned char *) textpart, textpos + xoffset, default_text_posn, text_height, textwidth, &last_string); - textpart[0] = symbol->text[7]; - textpart[1] = '\0'; - textpos = 55; - textwidth = 6.2f; - vector_plot_add_string(symbol, (unsigned char *) textpart, textpos + xoffset, default_text_posn - 2.0f, text_height * (8.0f / 11.0f), textwidth, &last_string); - textdone = 1; - switch (strlen(addon)) { - case 2: - textpos = (float)(xoffset + 70); - textwidth = 2.0f * 8.5f; - vector_plot_add_string(symbol, (unsigned char *) addon, textpos, addon_text_posn, text_height, textwidth, &last_string); - break; - case 5: - textpos = (float)(xoffset + 84); - textwidth = 5.0f * 8.5f; - vector_plot_add_string(symbol, (unsigned char *) addon, textpos, addon_text_posn, text_height, textwidth, &last_string); - break; - } - } - - /* Put normal human readable text at the bottom (and centered) */ - if (textdone == 0) { - // caculate start xoffset to center text - vector_plot_add_string(symbol, symbol->text, (symbol->width / 2.0f) + xoffset, default_text_posn, text_height, (float)symbol->width, &last_string); - } - - xoffset -= symbol_lead_in; // Restore xoffset - } - - //Remove control characters from readable text - // This only applies to Code 128 - string = symbol->vector->strings; - if (string) { - for (i = 0; i < string->length; i++) { - if (string->text[i] < ' ') { - string->text[i] = ' '; - } - } + xoffset -= comp_offset; // Restore xoffset } // Binding and boxes @@ -767,7 +655,7 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ /* row binding */ for (r = 1; r < symbol->rows; r++) { if (symbol->symbology != BARCODE_CODABLOCKF && symbol->symbology != BARCODE_HIBC_BLOCKF) { - rectangle = vector_plot_create_rect((float)xoffset, (r * row_height) + yoffset - sep_height / 2, (float)symbol->width, sep_height); + rectangle = vector_plot_create_rect(xoffset, (r * row_height) + yoffset - sep_height / 2, symbol->width, sep_height); vector_plot_add_rect(symbol, rectangle, &last_rectangle); } else { /* Avoid 11-module start and 13-module stop chars */ @@ -779,26 +667,26 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ } if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) { // Top - rectangle = vector_plot_create_rect(0.0f, 0.0f, vector->width, (float)symbol->border_width); + rectangle = vector_plot_create_rect(0.0, 0.0, vector->width, symbol->border_width); if (!(symbol->output_options & BARCODE_BOX) && (symbol->symbology == BARCODE_CODABLOCKF || symbol->symbology == BARCODE_HIBC_BLOCKF)) { - rectangle->x = (float)xoffset; - rectangle->width -= (2.0f * xoffset); + rectangle->x = xoffset; + rectangle->width -= (2.0 * xoffset); } vector_plot_add_rect(symbol, rectangle, &last_rectangle); // Bottom - rectangle = vector_plot_create_rect(0.0f, vector->height - symbol->border_width - text_offset, vector->width, (float)symbol->border_width); + rectangle = vector_plot_create_rect(0.0, vector->height - symbol->border_width - textoffset, vector->width, symbol->border_width); if (!(symbol->output_options & BARCODE_BOX) && (symbol->symbology == BARCODE_CODABLOCKF || symbol->symbology == BARCODE_HIBC_BLOCKF)) { - rectangle->x = (float)xoffset; - rectangle->width -= (2.0f * xoffset); + rectangle->x = xoffset; + rectangle->width -= (2.0 * xoffset); } vector_plot_add_rect(symbol, rectangle, &last_rectangle); } if (symbol->output_options & BARCODE_BOX) { // Left - rectangle = vector_plot_create_rect(0.0f, 0.0f, (float)symbol->border_width, vector->height - text_offset); + rectangle = vector_plot_create_rect(0.0, 0.0, symbol->border_width, vector->height - textoffset); vector_plot_add_rect(symbol, rectangle, &last_rectangle); // Right - rectangle = vector_plot_create_rect(vector->width - symbol->border_width, 0.0f, (float)symbol->border_width, vector->height - text_offset); + rectangle = vector_plot_create_rect(vector->width - symbol->border_width, 0.0, symbol->border_width, vector->height - textoffset); vector_plot_add_rect(symbol, rectangle, &last_rectangle); } diff --git a/docs/manual.txt b/docs/manual.txt index 5c4de702..daddb9b0 100644 --- a/docs/manual.txt +++ b/docs/manual.txt @@ -297,7 +297,7 @@ Numeric Value | Barcode Name 72 | EAN-14 73 | Vehicle Identification Number 74 | Codablock-F -75 | NVE-18 +75 | NVE-18 (SSCC-18) 76 | Japanese Postal Code 77 | Korea Post 79 | GS1 DataBar Stacked (stacked version of GS1 DataBar Truncated) @@ -352,7 +352,7 @@ example: zint --height=100 -d "This Text" -This specifies a symbol height of 100 times the x-resolution of the symbol. +This specifies a symbol height of 100 times the X-dimension of the symbol. 4.5 Adjusting whitespace ------------------------ @@ -361,7 +361,7 @@ altered using the –w switch. For example: zint -w 10 -d "This Text" -This specifies a whitespace width of 10 times the x-resolution of the symbol. +This specifies a whitespace width of 10 times the X-dimension of the symbol. 4.6 Adding boundary bars and boxes ---------------------------------- @@ -376,7 +376,7 @@ For example: zint --box --border=10 -d "This" -gives a box with a width 10 times the x-resolution of the symbol. +gives a box with a width 10 times the X-dimension of the symbol. 4.7 Using colour ---------------- @@ -1031,7 +1031,7 @@ Value | 72 | BARCODE_EAN14 | EAN-14 73 | BARCODE_VIN | Vehicle Identification Number 74 | BARCODE_CODABLOCKF | Codablock-F -75 | BARCODE_NVE18 | NVE-18 +75 | BARCODE_NVE18 | NVE-18 (SSCC-18) 76 | BARCODE_JAPANPOST | Japanese Postal Code 77 | BARCODE_KOREAPOST | Korea Post 79 | BARCODE_RSS14STACK | GS1 DataBar Stacked @@ -1245,8 +1245,13 @@ my_symbol->symbology = BARCODE_UPCA; error = ZBarcode_Encode_and_Print(my_symbol, "72527270270+12345"); -If your input data already includes the check digit symbology 35 can be used -which takes a 12 digit input and validates the check digit before encoding. +If your input data already includes the check digit symbology BARCODE_UPCA_CHK +(35) can be used which takes a 12 digit input and validates the check digit +before encoding. + +You can adjust the gap between the main symbol and an add-on in multiples of +the X-dimension by setting --addongap= (option_2) to a value between 9 (default) +and 12. 6.1.3.2 UPC Version E --------------------- @@ -1265,8 +1270,13 @@ my_symbol->symbology = BARCODE_UPCE; error = ZBarcode_Encode_and_Print(my_symbol, "1123456"); -If your input data already includes the check digit symbology 38 can be used -which takes a 7 or 8 digit input and validates the check digit before encoding. +If your input data already includes the check digit symbology BARCODE_UPCE_CHK +(38) can be used which takes a 7 or 8 digit input and validates the check digit +before encoding. + +You can adjust the gap between the main symbol and an add-on in multiples of +the X-dimension by setting --addongap= (option_2) to a value between 7 (default) +and 12. 6.1.4 European Article Number (EN 797) -------------------------------------- @@ -1296,8 +1306,12 @@ error = ZBarcode_Encode_and_Print(my_symbol, "7432365+54321"); All of the EAN symbols include check digits which are added by Zint. If you are encoding an EAN-8 or EAN-13 symbol and your data already includes -the check digit then you can use symbology 14 which takes an 8 or 13 digit input -and validates the check digit before encoding. +the check digit then you can use symbology BARCODE_EANX_CHK (14) which takes an +8 or 13 digit input and validates the check digit before encoding. + +You can adjust the gap between the main symbol and an add-on in multiples of +the X-dimension by setting --addongap= (option_2) to a value between 7 (default) +and 12. 6.1.4.2 SBN, ISBN and ISBN-13 ----------------------------- @@ -1305,7 +1319,8 @@ EAN-13 symbols (also known as Bookland EAN-13) can also be produced from 9-digit SBN, 10-digit ISBN or 13-digit ISBN-13 data. The relevant check digit needs to be present in the input data and will be verified before the symbol is generated. In addition EAN-2 and EAN-5 add-on symbols can be added using the + -symbol as with UPC symbols. +symbol as with UPC symbols, and the gap set with --addongap= (option_2) to +between 7 (default) and 12. 6.1.5 Plessey ------------- @@ -1454,11 +1469,12 @@ zint --barcode=16 -d "[01]98898765432106[3202]012345[15]991231" A shorter version of GS1-128 which encodes GTIN data only. A 13 digit number is required. The GTIN check digit and AI (01) are added by Zint. -6.1.11.5 NVE-18 ---------------- -A variation of Code 128 the "Nummer der Versandeinheit" standard includes both -modulo-10 and modulo-103 check digits. NVE-18 requires a 17 digit numerical -input and check digits are added by Zint. +6.1.11.5 NVE-18 (SSCC-18) +------------------------- +A variation of Code 128 the "Nummer der Versandeinheit" standard, also known as +SSCC-18 (Serial Shipping Container Code), includes both modulo-10 and modulo-103 +check digits. NVE-18 requires a 17 digit numerical input. Check digits and AI +(00) are added by Zint. 6.1.11.6 HIBC Code 128 ---------------------- diff --git a/frontend/main.c b/frontend/main.c index ef47fa92..eb6aacd1 100644 --- a/frontend/main.c +++ b/frontend/main.c @@ -78,6 +78,7 @@ static void usage(void) { printf( "Zint version %d.%d.%d\n" "Encode input data in a barcode and save as BMP/EMF/EPS/GIF/PCX/PNG/SVG/TIF/TXT\n\n" " -b, --barcode=NUMBER Number of barcode type. Default is 20 (Code 128)\n" + " --addongap=NUMBER Set add-on gap in multiples of X-dimension for UPC/EAN\n" " --batch Treat each line of input file as a separate data set\n" " --bg=COLOUR Specify a background colour (in hex)\n" " --binary Treat input as raw binary data\n" @@ -420,6 +421,27 @@ static int is_stackable(const int symbology) { return 0; } +/* Indicates which symbols can have addon (EAN-2 and EAN-5) + * Note: if change this must also change version in backend/common.c */ +static int is_extendable(const int symbology) { + + switch (symbology) { + case BARCODE_EANX: + case BARCODE_EANX_CHK: + case BARCODE_UPCA: + case BARCODE_UPCA_CHK: + case BARCODE_UPCE: + case BARCODE_UPCE_CHK: + case BARCODE_ISBNX: + case BARCODE_EANX_CC: + case BARCODE_UPCA_CC: + case BARCODE_UPCE_CC: + return 1; + } + + return 0; +} + int main(int argc, char **argv) { struct zint_symbol *my_symbol; int error_number; @@ -429,6 +451,7 @@ int main(int argc, char **argv) { int mirror_mode; int fullmultibyte; int separator; + int addon_gap; char filetype[4]; int i; @@ -441,6 +464,7 @@ int main(int argc, char **argv) { mirror_mode = 0; fullmultibyte = 0; separator = 0; + addon_gap = 0; for (i = 0; i < 4; i++) { filetype[i] = '\0'; @@ -491,6 +515,7 @@ int main(int argc, char **argv) { {"small", 0, 0, 0}, {"bold", 0, 0, 0}, {"cmyk", 0, 0, 0}, + {"addongap", 1, 0, 0}, {"batch", 0, 0, 0}, {"mirror", 0, 0, 0}, {"dotty", 0, 0, 0}, @@ -591,6 +616,19 @@ int main(int argc, char **argv) { separator = 0; } } + if (!strcmp(long_options[option_index].name, "addongap")) { + error_number = validator(NESET, optarg); + if (error_number == ZINT_ERROR_INVALID_DATA) { + fprintf(stderr, "Error 139: Invalid add-on gap value\n"); + exit(1); + } + addon_gap = atoi(optarg); + if (addon_gap < 7 || addon_gap > 12) { + fprintf(stderr, "Warning 140: Invalid add-on gap value\n"); + fflush(stderr); + addon_gap = 0; + } + } if (!strcmp(long_options[option_index].name, "dotsize")) { my_symbol->dot_size = (float) (atof(optarg)); if (my_symbol->dot_size < 0.01) { @@ -816,6 +854,9 @@ int main(int argc, char **argv) { } else if (separator && is_stackable(my_symbol->symbology)) { my_symbol->option_3 = separator; } + if (addon_gap && is_extendable(my_symbol->symbology)) { + my_symbol->option_2 = addon_gap; + } error_number = ZBarcode_Encode(my_symbol, (unsigned char*) optarg, strlen(optarg)); generated = 1; if (error_number != 0) { diff --git a/frontend_qt/CMakeLists.txt b/frontend_qt/CMakeLists.txt index 920a15f8..cf8090e6 100644 --- a/frontend_qt/CMakeLists.txt +++ b/frontend_qt/CMakeLists.txt @@ -8,9 +8,9 @@ set(zint-qt_SRCS barcodeitem.cpp main.cpp mainwindow.cpp datawindow.cpp sequen QT5_WRAP_CPP(zint-qt_SRCS mainwindow.h datawindow.h sequencewindow.h exportwindow.h) QT5_WRAP_UI(zint-qt_SRCS mainWindow.ui extData.ui extSequence.ui extExport.ui) -# grpAztec.ui grpC49.ui grpDBExtend.ui grpLOGMARS.ui grpPDF417.ui grpVIN.ui -# grpC11.ui grpChannel.ui grpDM.ui grpMaxicode.ui grpPZN.ui -# grpC128.ui grpCodabar.ui grpDotCode.ui grpMicroPDF.ui grpQR.ui +# grpAztec.ui grpC49.ui grpDBExtend.ui grpLOGMARS.ui grpPDF417.ui grpUPCA.ui +# grpC11.ui grpChannel.ui grpDM.ui grpMaxicode.ui grpPZN.ui grpUPCEAN.ui +# grpC128.ui grpCodabar.ui grpDotCode.ui grpMicroPDF.ui grpQR.ui grpVIN.ui # grpC16k.ui grpCodablockF.ui grpGrid.ui grpMQR.ui grpRMQR.ui # grpC39.ui grpCodeOne.ui grpHX.ui grpMSICheck.ui grpUltra.ui diff --git a/frontend_qt/frontend_qt.pro b/frontend_qt/frontend_qt.pro index 48ef0cef..ba5f88fa 100644 --- a/frontend_qt/frontend_qt.pro +++ b/frontend_qt/frontend_qt.pro @@ -39,6 +39,8 @@ FORMS += extData.ui \ grpPDF417.ui \ grpQR.ui \ grpRMQR.ui \ + grpUPCA.ui \ + grpUPCEAN.ui \ grpVIN.ui \ mainWindow.ui \ grpDotCode.ui diff --git a/frontend_qt/grpUPCA.ui b/frontend_qt/grpUPCA.ui new file mode 100644 index 00000000..3e9361f6 --- /dev/null +++ b/frontend_qt/grpUPCA.ui @@ -0,0 +1,81 @@ + + + grpUPCA + + + + 0 + 0 + 310 + 78 + + + + + 600 + 16777215 + + + + Form + + + + + + + + &Add-on Gap: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + cmbUPCAAddonGap + + + + + + + + 9 X (default) + + + + + 10 X + + + + + 11 X + + + + + 12 X + + + + + + + + + + Qt::Vertical + + + + 20 + 30 + + + + + + + + + diff --git a/frontend_qt/grpUPCEAN.ui b/frontend_qt/grpUPCEAN.ui new file mode 100644 index 00000000..d520fa9f --- /dev/null +++ b/frontend_qt/grpUPCEAN.ui @@ -0,0 +1,91 @@ + + + grpUPCEAN + + + + 0 + 0 + 310 + 78 + + + + + 600 + 16777215 + + + + Form + + + + + + + + &Add-on Gap: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + cmbUPCEANAddonGap + + + + + + + + 7 X (default) + + + + + 8 X + + + + + 9 X + + + + + 10 X + + + + + 11 X + + + + + 12 X + + + + + + + + + + Qt::Vertical + + + + 20 + 30 + + + + + + + + + diff --git a/frontend_qt/mainwindow.cpp b/frontend_qt/mainwindow.cpp index 8d9a24ac..61dcb1ea 100644 --- a/frontend_qt/mainwindow.cpp +++ b/frontend_qt/mainwindow.cpp @@ -96,7 +96,7 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags fl) "MicroPDF417 (ISO 24728)", "Micro QR Code", "MSI Plessey", - "NVE-18", + "NVE-18 (SSCC-18)", "PDF417 (ISO 15438)", "Pharmacode", "Pharmacode 2-track", @@ -722,7 +722,7 @@ void MainWindow::change_options() tabMain->insertTab(1,m_optionWidget,tr("GS1 DataBar Stacked")); connect(m_optionWidget->findChild("cmbCols"), SIGNAL(currentIndexChanged ( int )), SLOT(update_preview())); } - + if (symbology == BARCODE_ULTRA) { QFile file(":/grpUltra.ui"); @@ -738,6 +738,36 @@ void MainWindow::change_options() connect(m_optionWidget->findChild("radUltraGS1"), SIGNAL(clicked( bool )), SLOT(update_preview())); } + if (symbology == BARCODE_UPCA || symbology == BARCODE_UPCA_CHK || symbology == BARCODE_UPCA_CC) + { + QFile file(":/grpUPCA.ui"); + if (!file.open(QIODevice::ReadOnly)) + return; + m_optionWidget=uiload.load(&file); + file.close(); + tabMain->insertTab(1, m_optionWidget, tr("UPC-A")); + connect(m_optionWidget->findChild("cmbUPCAAddonGap"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview())); + } + + if (symbology == BARCODE_EANX || symbology == BARCODE_EANX_CHK || symbology == BARCODE_EANX_CC + || symbology == BARCODE_UPCE || symbology == BARCODE_UPCE_CHK || symbology == BARCODE_UPCE_CC + || symbology == BARCODE_ISBNX) + { + QFile file(":/grpUPCEAN.ui"); + if (!file.open(QIODevice::ReadOnly)) + return; + m_optionWidget=uiload.load(&file); + file.close(); + if (symbology == BARCODE_UPCE || symbology == BARCODE_UPCE_CHK || symbology == BARCODE_UPCE_CC) { + tabMain->insertTab(1, m_optionWidget, tr("UPC-E")); + } else if (symbology == BARCODE_ISBNX) { + tabMain->insertTab(1, m_optionWidget, tr("ISBN")); + } else { + tabMain->insertTab(1, m_optionWidget, tr("EAN")); + } + connect(m_optionWidget->findChild("cmbUPCEANAddonGap"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview())); + } + if (symbology == BARCODE_VIN) { QFile file(":/grpVIN.ui"); @@ -812,8 +842,27 @@ void MainWindow::maxi_primary() } } +void MainWindow::upcean_addon_gap(QComboBox *comboBox, QLabel* label, int base) +{ + const QRegularExpression addonRE("^[0-9X]+[+][0-9]+$"); + int item_val; + + if (txtData->text().contains(addonRE)) { + comboBox->setEnabled(true); + label->setEnabled(true); + item_val = comboBox->currentIndex(); + if (item_val) { + m_bc.bc.setOption2(item_val + base); + } + } else { + comboBox->setEnabled(false); + label->setEnabled(false); + } +} + void MainWindow::update_preview() { + int symbology = metaObject()->enumerator(0).value(bstyle->currentIndex()); int width = view->geometry().width(); int height = view->geometry().height(); int item_val; @@ -838,8 +887,9 @@ void MainWindow::update_preview() m_bc.bc.setHideText(1); } m_bc.bc.setGSSep(false); - switch(metaObject()->enumerator(0).value(bstyle->currentIndex())) - { + + switch (symbology) { + case BARCODE_CODE128: if(m_optionWidget->findChild("radC128Stand")->isChecked()) m_bc.bc.setSymbol(BARCODE_CODE128); @@ -864,6 +914,12 @@ void MainWindow::update_preview() m_bc.bc.setSymbol(BARCODE_EANX_CC); else m_bc.bc.setSymbol(BARCODE_EANX); + upcean_addon_gap(m_optionWidget->findChild("cmbUPCEANAddonGap"), m_optionWidget->findChild("lblUPCEANAddonGap"), 7 /*base*/); + break; + + case BARCODE_ISBNX: + m_bc.bc.setSymbol(symbology); + upcean_addon_gap(m_optionWidget->findChild("cmbUPCEANAddonGap"), m_optionWidget->findChild("lblUPCEANAddonGap"), 7 /*base*/); break; case BARCODE_UPCA: @@ -871,6 +927,7 @@ void MainWindow::update_preview() m_bc.bc.setSymbol(BARCODE_UPCA_CC); else m_bc.bc.setSymbol(BARCODE_UPCA); + upcean_addon_gap(m_optionWidget->findChild("cmbUPCAAddonGap"), m_optionWidget->findChild("lblUPCAAddonGap"), 9 /*base*/); break; case BARCODE_UPCE: @@ -878,6 +935,7 @@ void MainWindow::update_preview() m_bc.bc.setSymbol(BARCODE_UPCE_CC); else m_bc.bc.setSymbol(BARCODE_UPCE); + upcean_addon_gap(m_optionWidget->findChild("cmbUPCEANAddonGap"), m_optionWidget->findChild("lblUPCEANAddonGap"), 7 /*base*/); break; case BARCODE_RSS14: @@ -1196,7 +1254,7 @@ void MainWindow::update_preview() m_bc.bc.setSecurityLevel(item_val); } break; - + case BARCODE_ULTRA: m_bc.bc.setSymbol(BARCODE_ULTRA); if(m_optionWidget->findChild("radUltraEcc")->isChecked()) @@ -1213,7 +1271,7 @@ void MainWindow::update_preview() break; default: - m_bc.bc.setSymbol(metaObject()->enumerator(0).value(bstyle->currentIndex())); + m_bc.bc.setSymbol(symbology); break; } diff --git a/frontend_qt/mainwindow.h b/frontend_qt/mainwindow.h index f8123fea..8c71eb9b 100644 --- a/frontend_qt/mainwindow.h +++ b/frontend_qt/mainwindow.h @@ -129,6 +129,7 @@ public slots: protected: void resizeEvent(QResizeEvent *event); + void upcean_addon_gap(QComboBox *comboBox, QLabel* label, int base); private slots: bool save(); diff --git a/frontend_qt/resources.qrc b/frontend_qt/resources.qrc index 926cffd6..0c4fe5ac 100644 --- a/frontend_qt/resources.qrc +++ b/frontend_qt/resources.qrc @@ -29,6 +29,8 @@ grpCodablockF.ui grpRMQR.ui grpUltra.ui + grpUPCA.ui + grpUPCEAN.ui grpVIN.ui