From 323b34502b5cf255a1bef7c27d8880394a590dca Mon Sep 17 00:00:00 2001 From: gitlost Date: Sun, 19 Nov 2023 19:39:54 +0000 Subject: [PATCH] zint.h: increase `symbol->text` size 160 -> 200; rename `ZINT_CAP_EXTENDABLE` -> `ZINT_CAP_EANUPC` (`ZINT_CAP_EXTENDABLE` marked as legacy) CODE128: increase no. symbol chars max 60 -> 99 EAN-2/EAN-5: fix `BARCODE_BIND_TOP/BIND/BOX` output GS1_128: warn if data > 48 (GS1 General Specifications max) common: `is_extendable()` -> `is_ucpean()` raster: add `ZFONT_HALIGN_CENTRE/LEFT/RIGHT` flags and process in `draw_string()` (for drawing EAN/UPC outside digits), and for `ZFONT_HALIGN_CENTRE` round when calculating centre (shifts some texts 1 pixel left) raster/vector: use offsets into `symbol->text` for EAN/UPC instead of `out_upcean_split_text()` (removed) BMP/EMF/GIF/PCX/PNG/PS/SVG/TIF: use new `out_colour_get_rgb()` routine (replaces `colour_to_XXX()`) general: simplify/fix some `error_number` handling/returning frontend: truncate overlong `--primary` instead of ignoring; negative floating pt option (for `--textgap`) man page: list size detail for matrix symbols (`--vers`) manual: further fiddling with scaling text; some typos --- ChangeLog | 12 +- backend/2of5.c | 6 +- backend/CMakeLists.txt | 2 + backend/bmp.c | 47 +- backend/codablock.c | 8 +- backend/code128.c | 183 +++--- backend/code128.h | 3 +- backend/common.c | 52 +- backend/common.h | 14 +- backend/composite.c | 17 +- backend/emf.c | 20 +- backend/gif.c | 31 +- backend/imail.c | 7 +- backend/library.c | 9 +- backend/output.c | 147 ++--- backend/output.h | 17 +- backend/pcx.c | 69 +-- backend/png.c | 20 +- backend/postal.c | 2 +- backend/ps.c | 22 +- backend/qr.c | 19 +- backend/raster.c | 328 +++++----- backend/rss.c | 10 +- backend/svg.c | 24 +- backend/tests/data/gif/dpd_compliant.gif | Bin 5501 -> 5467 bytes .../tests/data/gif/itf14_height0.5_1.1.gif | Bin 548 -> 548 bytes .../gif/itf14_height61.8_bind4_wsp24_3.gif | Bin 17536 -> 17536 bytes backend/tests/data/pcx/code11_fgbgtrans.pcx | Bin 33748 -> 33748 bytes .../tests/data/png/code128_egrave_bold.png | Bin 220 -> 223 bytes .../data/png/code128_egrave_bold_box3.png | Bin 235 -> 237 bytes .../png/code128_egrave_bold_hvwsp2_box2.png | Bin 233 -> 236 bytes backend/tests/data/png/code39_small.png | Bin 151 -> 152 bytes backend/tests/data/png/dbar_ltd.png | Bin 289 -> 289 bytes backend/tests/data/png/dpd_compliant.png | Bin 457 -> 459 bytes .../data/png/ean13_2addon_ggs_5.2.2.5.1-2.png | Bin 434 -> 432 bytes .../png/ean13_2addon_ggs_5.2.2.5.1-2_gws.png | Bin 448 -> 447 bytes .../data/png/ean13_5addon_ggs_5.2.2.5.2-2.png | Bin 488 -> 490 bytes .../png/ean13_5addon_ggs_5.2.2.5.2-2_gws.png | Bin 512 -> 514 bytes .../data/png/ean13_cc_2addon_cca_4x4.png | Bin 535 -> 533 bytes .../data/png/ean13_cc_2addon_cca_4x4_gws.png | Bin 548 -> 546 bytes .../data/png/ean13_cc_5addon_ccb_3x4.png | Bin 574 -> 573 bytes .../data/png/ean13_cc_5addon_ccb_3x4_gws.png | Bin 599 -> 597 bytes backend/tests/data/png/ean13_cc_cca_5x4.png | Bin 487 -> 485 bytes .../tests/data/png/ean13_cc_cca_5x4_gws.png | Bin 511 -> 507 bytes .../tests/data/png/ean13_ggs_5.2.2.1-1.png | Bin 371 -> 371 bytes .../data/png/ean13_ggs_5.2.2.1-1_gws.png | Bin 384 -> 383 bytes backend/tests/data/png/ean2_box1.png | Bin 0 -> 169 bytes backend/tests/data/png/ean5_bind2.png | Bin 0 -> 227 bytes backend/tests/data/png/ean8_5addon.png | Bin 392 -> 391 bytes backend/tests/data/png/ean8_5addon_gws.png | Bin 440 -> 440 bytes .../tests/data/png/ean8_cc_5addon_ccb_8x3.png | Bin 473 -> 526 bytes .../data/png/ean8_cc_5addon_ccb_8x3_gws.png | Bin 517 -> 574 bytes .../png/ultra_fgalpha_hvwsp1_bindtop1.png | Bin 245 -> 243 bytes .../data/png/upca_2addon_ggs_5.2.6.6-5.png | Bin 442 -> 443 bytes .../png/upca_2addon_ggs_5.2.6.6-5_gws.png | Bin 464 -> 461 bytes backend/tests/data/png/upca_5addon.png | Bin 460 -> 457 bytes backend/tests/data/png/upca_5addon_bind3.png | Bin 460 -> 461 bytes backend/tests/data/png/upca_5addon_gws.png | Bin 485 -> 485 bytes .../tests/data/png/upca_cc_2addon_cca_3x4.png | Bin 526 -> 526 bytes .../data/png/upca_cc_2addon_cca_3x4_gws.png | Bin 540 -> 540 bytes .../tests/data/png/upca_cc_5addon_ccb_4x4.png | Bin 586 -> 585 bytes .../data/png/upca_cc_5addon_ccb_4x4_bind3.png | Bin 585 -> 586 bytes backend/tests/data/png/upce_5addon.png | Bin 357 -> 385 bytes .../tests/data/png/upce_5addon_small_gws.png | Bin 393 -> 393 bytes .../tests/data/png/upce_cc_5addon_ccb_8x2.png | Bin 481 -> 482 bytes .../data/png/upce_cc_5addon_ccb_8x2_gws.png | Bin 502 -> 505 bytes backend/tests/data/print/bmp/code128_aim.bmp | Bin 2382 -> 2382 bytes backend/tests/data/print/gif/code128_aim.gif | Bin 1362 -> 1362 bytes backend/tests/data/print/pcx/code128_aim.pcx | Bin 22976 -> 22976 bytes backend/tests/data/print/png/code128_aim.png | Bin 147 -> 147 bytes backend/tests/data/print/tif/code128_aim.tif | Bin 470 -> 470 bytes backend/tests/data/svg/dpd_compliant.svg | 6 +- backend/tests/data/svg/ean2_box1.svg | 12 + backend/tests/data/svg/ean5_bind2.svg | 12 + backend/tests/data/tif/code128_bgalpha.tif | Bin 3772 -> 3772 bytes backend/tests/data/tif/code128_cmyk.tif | Bin 3962 -> 3966 bytes backend/tests/data/tif/code128_cmyk_fgbg.tif | Bin 4052 -> 4052 bytes .../tests/data/tif/code128_cmyk_fgbgalpha.tif | Bin 4850 -> 4852 bytes .../tests/data/tif/code128_cmyk_fgbgcmyk.tif | Bin 4052 -> 4052 bytes backend/tests/data/tif/code128_fgalpha.tif | Bin 3772 -> 3772 bytes backend/tests/data/tif/code128_fgbg.tif | Bin 952 -> 948 bytes backend/tests/data/tif/code128_fgbgalpha.tif | Bin 3772 -> 3772 bytes backend/tests/data/tif/code128_reverse.tif | Bin 374 -> 374 bytes backend/tests/test_codablock.c | 30 +- backend/tests/test_code128.c | 152 +++-- backend/tests/test_common.c | 30 +- backend/tests/test_composite.c | 10 +- backend/tests/test_library.c | 6 +- backend/tests/test_output.c | 4 + backend/tests/test_pcx.c | 4 +- backend/tests/test_png.c | 184 +++--- backend/tests/test_raster.c | 198 +++--- backend/tests/test_svg.c | 43 +- backend/tests/test_vector.c | 137 +++-- backend/tests/testcommon.c | 12 +- backend/vector.c | 207 +++---- backend/zint.h | 11 +- backend_qt/qzint.cpp | 26 +- backend_qt/qzint.h | 5 +- backend_qt/tests/test_qzint.cpp | 64 +- docs/README | 10 +- docs/images/dpd.svg | 4 +- docs/images/gui_appearance.png | Bin 339141 -> 339115 bytes docs/manual.html | 267 ++++++-- docs/manual.pmd | 82 ++- docs/manual.txt | 192 ++++-- docs/zint.1 | 580 ++++++++++-------- docs/zint.1.pmd | 110 +++- frontend/main.c | 52 +- frontend/tests/test_args.c | 10 +- frontend_qt/mainWindow.ui | 9 +- frontend_qt/mainwindow.cpp | 27 +- frontend_qt/mainwindow.h | 1 - 113 files changed, 2016 insertions(+), 1550 deletions(-) create mode 100644 backend/tests/data/png/ean2_box1.png create mode 100644 backend/tests/data/png/ean5_bind2.png create mode 100644 backend/tests/data/svg/ean2_box1.svg create mode 100644 backend/tests/data/svg/ean5_bind2.svg diff --git a/ChangeLog b/ChangeLog index 850b2ac8..22d1ebc6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16,7 +16,7 @@ Version 2.12.0.9 (dev) not released yet - For Windows, filenames are now assumed to be UTF-8 encoded. Affects `outfile` in `zint_symbol` and all API filename arguments - Never-used `fontsize` member removed from `zint_symbol` -- Buffer length of member `text` (HRT) in `zint_symbol` extended 128 -> 160 +- Buffer length of member `text` (HRT) in `zint_symbol` extended 128 -> 200 (client buffers may need checking/extending) - Font of text of SVG vector output now "OCRB, monospace" (EAN/UPC) or "Arimo, Arial, sans-serif" (all others) @@ -27,6 +27,7 @@ Version 2.12.0.9 (dev) not released yet - Unlikely-to-be-used `bitmap_byte_length` member removed from `zint_symbol` (was only set on BMP output to length of BMP pixel array) - EXCODE39 now defaults to displaying check digit in Human Readable Text (HRT) +- GS1_128 now warns if data > 48 (GS1 General Specifications max) Changes ------- @@ -66,8 +67,7 @@ Changes - GUI: use "OCRB" font for EAN/UPC and "Arimo" for all others (was "Helvetica" for both); add preview background colour option (default light grey) so as whitespace will show up in contrast (access via preview context menu) -- CODE128/common: move `c128_hrt_cpy_iso8859_1()` to `hrt_cpy_iso8859_1()` and - add `ZINT_WARN_HRT_TRUNCATED` warning (for future use) +- CODE128/common: add `ZINT_WARN_HRT_TRUNCATED` warning - QRCODE: better assert(), removing a NOLINT (2 left) - CLI: add some more barcode synonyms for DBAR - CMake: don't include png.c unless ZINT_USE_PNG (avoids clang warning) @@ -80,7 +80,12 @@ Changes - CODE39/EXCODE39/LOGMARS: new hidden check digit option - GUI: move some symbology-specific options into Data Tab so separate tab unnecessary +- DATAMATRIX: add `DM_ISO_144` (--dmiso144) option for ISO placement of ECC + codewords instead of default "de facto" - manual: add annexes on Qt and Tcl backends +- CODE128: increase no. symbol chars max 60 -> 99 +- frontend: truncate overlong `--primary` instead of ignoring +- man page: list size detail for matrix symbols (`--vers`) Bugs ---- @@ -103,6 +108,7 @@ Bugs shifting - GUI: fix not enabling font combo "Small Bold (vector only)" by default - CODEONE: fix S/T quiet zone 1X bottom (props BWIPP issue #245 doc) +- EAN-2/EAN-5: fix `BARCODE_BIND_TOP/BIND/BOX` output Version 2.12.0 (2022-12-12) diff --git a/backend/2of5.c b/backend/2of5.c index 49324e39..4a8fc458 100644 --- a/backend/2of5.c +++ b/backend/2of5.c @@ -232,7 +232,7 @@ INTERNAL int c25inter(struct zint_symbol *symbol, unsigned char source[], int le /* Interleaved 2-of-5 (ITF-14) */ INTERNAL int itf14(struct zint_symbol *symbol, unsigned char source[], int length) { - int i, error_number, warn_number = 0, zeroes; + int i, error_number, zeroes; unsigned char localstr[16] = {0}; if (length > 13) { @@ -272,13 +272,13 @@ INTERNAL int itf14(struct zint_symbol *symbol, unsigned char source[], int lengt /* GS1 General Specifications 21.0.1 5.12.3.2 table 2, including footnote (**): (note bind/box additional to symbol->height), same as GS1-128: "in case of further space constraints" height 5.8mm / 1.016mm (X max) ~ 5.7; default 31.75mm / 0.495mm ~ 64.14 */ - warn_number = set_height(symbol, stripf(5.8f / 1.016f), stripf(31.75f / 0.495f), 0.0f, 0 /*no_errtxt*/); + error_number = set_height(symbol, stripf(5.8f / 1.016f), stripf(31.75f / 0.495f), 0.0f, 0 /*no_errtxt*/); } else { (void) set_height(symbol, 0.0f, 50.0f, 0.0f, 1 /*no_errtxt*/); } } - return error_number ? error_number : warn_number; + return error_number; } /* Deutsche Post Leitcode */ diff --git a/backend/CMakeLists.txt b/backend/CMakeLists.txt index 277164c4..7ab2b365 100644 --- a/backend/CMakeLists.txt +++ b/backend/CMakeLists.txt @@ -70,8 +70,10 @@ endif() if(ZINT_USE_PNG AND PNG_FOUND) zint_target_link_libraries(PNG::PNG) + message(STATUS "Using PNG") else() zint_target_compile_definitions(PRIVATE ZINT_NO_PNG) + message(STATUS "Not using PNG") endif() if(ZINT_TEST) diff --git a/backend/bmp.c b/backend/bmp.c index 28855061..8f0093d1 100644 --- a/backend/bmp.c +++ b/backend/bmp.c @@ -53,29 +53,25 @@ INTERNAL int bmp_pixel_plot(struct zint_symbol *symbol, const unsigned char *pix FILE *bmp_file; bitmap_file_header_t file_header; bitmap_info_header_t info_header; - color_ref_t bg_color_ref; - color_ref_t fg_color_ref; - color_ref_t ultra_color_ref[8]; + color_ref_t bg; + color_ref_t fg; + color_ref_t palette[8]; int ultra_fg_index = 9; unsigned char map[128]; const int output_to_stdout = symbol->output_options & BARCODE_STDOUT; /* Suppress gcc -fanalyzer warning */ - (void) out_colour_get_rgb(symbol->fgcolour, &fg_color_ref.red, &fg_color_ref.green, &fg_color_ref.blue, - NULL /*alpha*/); - fg_color_ref.reserved = 0x00; + (void) out_colour_get_rgb(symbol->fgcolour, &fg.red, &fg.green, &fg.blue, NULL /*alpha*/); + fg.reserved = 0x00; - (void) out_colour_get_rgb(symbol->bgcolour, &bg_color_ref.red, &bg_color_ref.green, &bg_color_ref.blue, - NULL /*alpha*/); - bg_color_ref.reserved = 0x00; + (void) out_colour_get_rgb(symbol->bgcolour, &bg.red, &bg.green, &bg.blue, NULL /*alpha*/); + bg.reserved = 0x00; if (symbol->symbology == BARCODE_ULTRA) { - static const int ultra_chars[8] = { 'C', 'B', 'M', 'R', 'Y', 'G', 'K', 'W' }; + static const unsigned char ultra_chars[8] = { 'C', 'B', 'M', 'R', 'Y', 'G', 'K', 'W' }; for (i = 0; i < 8; i++) { - ultra_color_ref[i].red = colour_to_red(i + 1); - ultra_color_ref[i].green = colour_to_green(i + 1); - ultra_color_ref[i].blue = colour_to_blue(i + 1); - ultra_color_ref[i].reserved = 0x00; - if (memcmp(&ultra_color_ref[i], &fg_color_ref, sizeof(fg_color_ref)) == 0) { + out_colour_char_to_rgb(ultra_chars[i], &palette[i].red, &palette[i].green, &palette[i].blue); + palette[i].reserved = 0x00; + if (memcmp(&palette[i], &fg, sizeof(fg)) == 0) { ultra_fg_index = i + 1; } map[ultra_chars[i]] = i + 1; @@ -106,14 +102,14 @@ INTERNAL int bmp_pixel_plot(struct zint_symbol *symbol, const unsigned char *pix bitmap = bitmap_file_start + data_offset; /* Pixel Plotting */ - if (symbol->symbology == BARCODE_ULTRA) { + if (bits_per_pixel == 4) { for (row = 0; row < symbol->bitmap_height; row++) { const unsigned char *pb = pixelbuf + (symbol->bitmap_width * (symbol->bitmap_height - row - 1)); for (column = 0; column < symbol->bitmap_width; column++) { bitmap[(column >> 1) + (row * row_size)] |= map[pb[column]] << (!(column & 1) << 2); } } - } else { + } else { /* bits_per_pixel == 1 */ for (row = 0; row < symbol->bitmap_height; row++) { const unsigned char *pb = pixelbuf + (symbol->bitmap_width * (symbol->bitmap_height - row - 1)); for (column = 0; column < symbol->bitmap_width; column++) { @@ -144,21 +140,22 @@ INTERNAL int bmp_pixel_plot(struct zint_symbol *symbol, const unsigned char *pix memcpy(bitmap_file_start, &file_header, sizeof(bitmap_file_header_t)); bmp_posn += sizeof(bitmap_file_header_t); memcpy(bmp_posn, &info_header, sizeof(bitmap_info_header_t)); - bmp_posn += sizeof(bitmap_info_header_t); - memcpy(bmp_posn, &bg_color_ref, sizeof(color_ref_t)); - if (symbol->symbology == BARCODE_ULTRA) { + + memcpy(bmp_posn, &bg, sizeof(color_ref_t)); + bmp_posn += sizeof(color_ref_t); + if (bits_per_pixel == 4) { for (i = 0; i < 8; i++) { + memcpy(bmp_posn, &palette[i], sizeof(color_ref_t)); bmp_posn += sizeof(color_ref_t); - memcpy(bmp_posn, &ultra_color_ref[i], sizeof(color_ref_t)); } if (ultra_fg_index == 9) { - bmp_posn += sizeof(color_ref_t); - memcpy(bmp_posn, &fg_color_ref, sizeof(color_ref_t)); + memcpy(bmp_posn, &fg, sizeof(color_ref_t)); + /* bmp_posn += sizeof(color_ref_t); */ /* Not needed as long as last */ } } else { - bmp_posn += sizeof(color_ref_t); - memcpy(bmp_posn, &fg_color_ref, sizeof(color_ref_t)); + memcpy(bmp_posn, &fg, sizeof(color_ref_t)); + /* bmp_posn += sizeof(color_ref_t); */ /* Not needed as long as last */ } /* Open output file in binary mode */ diff --git a/backend/codablock.c b/backend/codablock.c index 5c0857cf..f71c8b6c 100644 --- a/backend/codablock.c +++ b/backend/codablock.c @@ -555,7 +555,7 @@ INTERNAL int codablockf(struct zint_symbol *symbol, unsigned char source[], int /* option1: rows <= 0: automatic, 1..44 */ rows = symbol->option_1; if (rows == 1) { - error_number = code128(symbol, source, length); /* Only returns errors, not warnings */ + error_number = code128(symbol, source, length); if (error_number < ZINT_ERROR) { symbol->output_options |= BARCODE_BIND; if (symbol->border_width == 0) { /* Allow override if non-zero */ @@ -565,7 +565,11 @@ INTERNAL int codablockf(struct zint_symbol *symbol, unsigned char source[], int if (symbol->output_options & COMPLIANT_HEIGHT) { /* AIM ISS-X-24 Section 4.6.1 minimum row height 8X (for compatibility with CODABLOCKF, not specced for CODE128) */ - error_number = set_height(symbol, 8.0f, 10.0f, 0.0f, 0 /*no_errtxt*/); + if (error_number == 0) { + error_number = set_height(symbol, 8.0f, 10.0f, 0.0f, 0 /*no_errtxt*/); + } else { + (void) set_height(symbol, 8.0f, 10.0f, 0.0f, 1 /*no_errtxt*/); + } } else { (void) set_height(symbol, 0.0f, 5.0f, 0.0f, 1 /*no_errtxt*/); } diff --git a/backend/code128.c b/backend/code128.c index 9104b72c..f4cc3284 100644 --- a/backend/code128.c +++ b/backend/code128.c @@ -37,6 +37,8 @@ #include "code128.h" #include "gs1.h" +#define C128_SYMBOL_MAX 99 + static const char KRSET[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; #define KRSET_F (IS_NUM_F | IS_UPR_F) @@ -343,7 +345,7 @@ INTERNAL void c128_put_in_set(int list[2][C128_MAX], const int indexliste, char /* Handle Code 128, 128B and HIBC 128 */ INTERNAL int code128(struct zint_symbol *symbol, unsigned char source[], int length) { int i, j, k, values[C128_MAX] = {0}, bar_characters = 0, read, total_sum; - int error_number = 0, indexchaine, indexliste, f_state = 0; + int error_number, indexchaine, indexliste, f_state = 0; unsigned char src_buf[C128_MAX + 1]; unsigned char *src = source; char manual_set[C128_MAX] = {0}; @@ -555,8 +557,8 @@ INTERNAL int code128(struct zint_symbol *symbol, unsigned char source[], int len glyph_count += 2; } } - if (glyph_count > 120) { /* 60 * 2 */ - strcpy(symbol->errtxt, "341: Input too long (60 symbol character maximum)"); + if (glyph_count > C128_SYMBOL_MAX * 2) { + sprintf(symbol->errtxt, "341: Input too long (%d symbol character maximum)", C128_SYMBOL_MAX); return ZINT_ERROR_TOO_LONG; } @@ -709,7 +711,7 @@ INTERNAL int code128(struct zint_symbol *symbol, unsigned char source[], int len for (i = 1; i < bar_characters; i++, d += 6) { memcpy(d, C128Table[values[i]], 6); - total_sum += values[i] * i; /* Note can't overflow as 106 * 60 * 60 = 381600 */ + total_sum += values[i] * i; /* Note can't overflow as 106 * C128_SYMBOL_MAX * C128_SYMBOL_MAX = 1038906 */ } total_sum %= 103; memcpy(d, C128Table[total_sum], 6); @@ -740,7 +742,7 @@ INTERNAL int code128(struct zint_symbol *symbol, unsigned char source[], int len /* ISO/IEC 15417:2007 leaves dimensions/height as application specification */ - (void) hrt_cpy_iso8859_1(symbol, src, length); /* Truncation can't happen */ + error_number = hrt_cpy_iso8859_1(symbol, src, length); return error_number; } @@ -749,7 +751,7 @@ INTERNAL int code128(struct zint_symbol *symbol, unsigned char source[], int len INTERNAL int gs1_128_cc(struct zint_symbol *symbol, unsigned char source[], int length, const int cc_mode, const int cc_rows) { int i, values[C128_MAX] = {0}, bar_characters = 0, read, total_sum; - int error_number, warn_number = 0, indexchaine, indexliste; + int error_number, indexchaine, indexliste; int list[2][C128_MAX] = {{0}}; char set[C128_MAX] = {0}, mode, last_set; int glyph_count = 0; /* Codeword estimate times 2 */ @@ -831,8 +833,8 @@ INTERNAL int gs1_128_cc(struct zint_symbol *symbol, unsigned char source[], int glyph_count += 2; } } - if (glyph_count > 120) { /* 60 * 2 */ - strcpy(symbol->errtxt, "344: Input too long (60 symbol character maximum)"); + if (glyph_count > C128_SYMBOL_MAX * 2) { + sprintf(symbol->errtxt, "344: Input too long (%d symbol character maximum)", C128_SYMBOL_MAX); return ZINT_ERROR_TOO_LONG; } @@ -939,7 +941,7 @@ INTERNAL int gs1_128_cc(struct zint_symbol *symbol, unsigned char source[], int for (i = 1; i < bar_characters; i++, d += 6) { memcpy(d, C128Table[values[i]], 6); - total_sum += values[i] * i; /* Note can't overflow as 106 * 60 * 60 = 381600 */ + total_sum += values[i] * i; /* Note can't overflow as 106 * C128_SYMBOL_MAX * C128_SYMBOL_MAX = 1038906 */ } total_sum %= 103; memcpy(d, C128Table[total_sum], 6); @@ -976,6 +978,13 @@ INTERNAL int gs1_128_cc(struct zint_symbol *symbol, unsigned char source[], int } } + if (reduced_length > 48) { /* GS1 General Specifications 5.4.4.3 */ + if (error_number == 0) { /* Don't overwrite any `gs1_verify()` warning */ + strcpy(symbol->errtxt, "843: GS1-128 input too long (48 character maximum)"); + error_number = ZINT_WARN_NONCOMPLIANT; + } + } + if (symbol->output_options & COMPLIANT_HEIGHT) { /* GS1 General Specifications 21.0.1 5.12.3.2 table 2, including footnote (**): same as ITF-14: "in case of further space constraints" height 5.8mm / 1.016mm (X max) ~ 5.7; @@ -986,7 +995,11 @@ INTERNAL int gs1_128_cc(struct zint_symbol *symbol, unsigned char source[], int /* Pass back via temporary linear structure */ symbol->height = symbol->height ? min_height : default_height; } else { - warn_number = set_height(symbol, min_height, default_height, 0.0f, 0 /*no_errtxt*/); + if (error_number == 0) { /* Don't overwrite any `gs1_verify()` warning */ + error_number = set_height(symbol, min_height, default_height, 0.0f, 0 /*no_errtxt*/); + } else { + (void) set_height(symbol, min_height, default_height, 0.0f, 1 /*no_errtxt*/); + } } } else { const float height = 50.0f; @@ -997,7 +1010,7 @@ INTERNAL int gs1_128_cc(struct zint_symbol *symbol, unsigned char source[], int } } - for (i = 0; i < length; i++) { + for (i = 0; i < length && i < (int) sizeof(symbol->text); i++) { if (source[i] == '[') { symbol->text[i] = '('; } else if (source[i] == ']') { @@ -1006,8 +1019,15 @@ INTERNAL int gs1_128_cc(struct zint_symbol *symbol, unsigned char source[], int symbol->text[i] = source[i]; } } + if (i == sizeof(symbol->text)) { + /* Trumps all other warnings */ + strcpy(symbol->errtxt, "844: Human Readable Text truncated"); + error_number = ZINT_WARN_HRT_TRUNCATED; + i--; + } + symbol->text[i] = '\0'; - return error_number ? error_number : warn_number; + return error_number; } /* Handle EAN-128 (Now known as GS1-128) */ @@ -1119,84 +1139,80 @@ INTERNAL int dpd(struct zint_symbol *symbol, unsigned char source[], int length) return ZINT_ERROR_INVALID_DATA; } - error_number = code128(symbol, local_source, length); /* Only returns errors, not warnings */ + (void) code128(symbol, local_source, length); /* Only error returned is for large text which can't happen */ - if (error_number < ZINT_ERROR) { - if (!(symbol->output_options & (BARCODE_BOX | BARCODE_BIND | BARCODE_BIND_TOP))) { - /* If no option has been selected then uses default bind top option */ - symbol->output_options |= BARCODE_BIND_TOP; /* Note won't extend over quiet zones for DPD */ - if (symbol->border_width == 0) { /* Allow override if non-zero */ - symbol->border_width = 3; /* From examples, not mentioned in spec */ - } + if (!(symbol->output_options & (BARCODE_BOX | BARCODE_BIND | BARCODE_BIND_TOP))) { + /* If no option has been selected then uses default bind top option */ + symbol->output_options |= BARCODE_BIND_TOP; /* Note won't extend over quiet zones for DPD */ + if (symbol->border_width == 0) { /* Allow override if non-zero */ + symbol->border_width = 3; /* From examples, not mentioned in spec */ } + } - if (symbol->output_options & COMPLIANT_HEIGHT) { - /* DPD Parcel Label Specification Version 2.4.1 (19.01.2021) Section 4.6.1.2 - 25mm / 0.4mm (X max) = 62.5 min, 25mm / 0.375 (X) ~ 66.66 default */ - if (relabel) { /* If relabel then half-size */ - error_number = set_height(symbol, 31.25f, stripf(12.5f / 0.375f), 0.0f, 0 /*no_errtxt*/); - } else { - error_number = set_height(symbol, 62.5f, stripf(25.0f / 0.375f), 0.0f, 0 /*no_errtxt*/); - } + if (symbol->output_options & COMPLIANT_HEIGHT) { + /* DPD Parcel Label Specification Version 2.4.1 (19.01.2021) Section 4.6.1.2 + 25mm / 0.4mm (X max) = 62.5 min, 25mm / 0.375 (X) ~ 66.66 default */ + if (relabel) { /* If relabel then half-size */ + error_number = set_height(symbol, 31.25f, stripf(12.5f / 0.375f), 0.0f, 0 /*no_errtxt*/); } else { - (void) set_height(symbol, 0.0f, relabel ? 25.0f : 50.0f, 0.0f, 1 /*no_errtxt*/); + error_number = set_height(symbol, 62.5f, stripf(25.0f / 0.375f), 0.0f, 0 /*no_errtxt*/); } + } else { + (void) set_height(symbol, 0.0f, relabel ? 25.0f : 50.0f, 0.0f, 1 /*no_errtxt*/); + } - cd = mod; + cd = mod; - p = 0; - for (i = !relabel; i < length; i++) { - symbol->text[p] = local_source[i]; - p++; - - cd += posn(KRSET, local_source[i]); - if (cd > mod) cd -= mod; - cd *= 2; - if (cd >= (mod + 1)) cd -= mod + 1; - - switch (i + relabel) { - case 4: - case 7: - case 11: - case 15: - case 19: - case 21: - case 24: - case 27: - symbol->text[p] = ' '; - p++; - break; - } - } - - cd = mod + 1 - cd; - if (cd == mod) cd = 0; - - if (cd < 10) { - symbol->text[p] = cd + '0'; - } else { - symbol->text[p] = (cd - 10) + 'A'; - } + p = 0; + for (i = !relabel; i < length; i++) { + symbol->text[p] = local_source[i]; p++; - symbol->text[p] = '\0'; + cd += posn(KRSET, local_source[i]); + if (cd > mod) cd -= mod; + cd *= 2; + if (cd >= (mod + 1)) cd -= mod + 1; - if (error_number == 0) { - /* Some compliance checks */ - if (!is_sane(NEON_F, local_source + length - 16, 16)) { - if (!is_sane(NEON_F, local_source + length - 3, 3)) { /* 3-digit Country Code (ISO 3166-1) */ - strcpy(symbol->errtxt, "831: Destination Country Code (last 3 characters) should be numeric"); - } else if (!is_sane(NEON_F, local_source + length - 6, 3)) { /* 3-digit Service Code */ - strcpy(symbol->errtxt, "832: Service Code (characters 6-4 from end) should be numeric"); - } else { /* Last 10 characters of Tracking No. */ - strcpy(symbol->errtxt, - "833: Last 10 characters of Tracking Number (characters 16-7 from end) should be numeric"); - } - error_number = ZINT_WARN_NONCOMPLIANT; - } + switch (i + relabel) { + case 4: + case 7: + case 11: + case 15: + case 19: + case 21: + case 24: + case 27: + symbol->text[p] = ' '; + p++; + break; } } + cd = mod + 1 - cd; + if (cd == mod) cd = 0; + + if (cd < 10) { + symbol->text[p] = cd + '0'; + } else { + symbol->text[p] = (cd - 10) + 'A'; + } + p++; + + symbol->text[p] = '\0'; + + /* Some compliance checks */ + if (!is_sane(NEON_F, local_source + length - 16, 16)) { + if (!is_sane(NEON_F, local_source + length - 3, 3)) { /* 3-digit Country Code (ISO 3166-1) */ + strcpy(symbol->errtxt, "831: Destination Country Code (last 3 characters) should be numeric"); + } else if (!is_sane(NEON_F, local_source + length - 6, 3)) { /* 3-digit Service Code */ + strcpy(symbol->errtxt, "832: Service Code (characters 6-4 from end) should be numeric"); + } else { /* Last 10 characters of Tracking No. */ + strcpy(symbol->errtxt, + "833: Last 10 characters of Tracking Number (characters 16-7 from end) should be numeric"); + } + error_number = ZINT_WARN_NONCOMPLIANT; + } + return error_number; } @@ -1208,7 +1224,7 @@ INTERNAL int upu_s10(struct zint_symbol *symbol, unsigned char source[], int len unsigned char have_check_digit = '\0'; int check_digit; static const char weights[8] = { 8, 6, 4, 2, 3, 5, 9, 7 }; - int error_number = 0, warn_number = 0; + int error_number = 0; if (length != 12 && length != 13) { strcpy(symbol->errtxt, "834: Input must be 12 or 13 characters long"); @@ -1270,7 +1286,7 @@ INTERNAL int upu_s10(struct zint_symbol *symbol, unsigned char source[], int len error_number = ZINT_WARN_NONCOMPLIANT; } - (void) code128(symbol, local_source, 13); /* Only error returned is TOO_LONG which can't happen */ + (void) code128(symbol, local_source, 13); /* Only error returned is for large text which can't happen */ j = 0; for (i = 0; i < 13; i++) { @@ -1289,12 +1305,17 @@ INTERNAL int upu_s10(struct zint_symbol *symbol, unsigned char source[], int len min_height = min_height_min; } /* Using 50 as default as none recommended */ - warn_number = set_height(symbol, min_height, min_height > 50.0f ? min_height : 50.0f, 0.0f, 0 /*no_errtxt*/); + if (error_number == 0) { + error_number = set_height(symbol, min_height, min_height > 50.0f ? min_height : 50.0f, 0.0f, + 0 /*no_errtxt*/); + } else { + (void) set_height(symbol, min_height, min_height > 50.0f ? min_height : 50.0f, 0.0f, 1 /*no_errtxt*/); + } } else { (void) set_height(symbol, 0.0f, 50.0f, 0.0f, 1 /*no_errtxt*/); } - return error_number ? error_number : warn_number; + return error_number; } /* vim: set ts=4 sw=4 et : */ diff --git a/backend/code128.h b/backend/code128.h index aebcfe54..4b1c573c 100644 --- a/backend/code128.h +++ b/backend/code128.h @@ -36,7 +36,8 @@ extern "C" { #endif /* __cplusplus */ -#define C128_MAX 160 +/* Allow for a reasonable number of special Code Set escapes and for GS1 AI delimiters */ +#define C128_MAX 256 #define C128_LATCHA 'A' #define C128_LATCHB 'B' diff --git a/backend/common.c b/backend/common.c index a3054a74..9a8fee60 100644 --- a/backend/common.c +++ b/backend/common.c @@ -269,8 +269,8 @@ INTERNAL int is_stackable(const int symbology) { return 0; } -/* Whether `symbology` can have add-on (EAN-2 and EAN-5) */ -INTERNAL int is_extendable(const int symbology) { +/* Whether `symbology` is EAN/UPC */ +INTERNAL int is_upcean(const int symbology) { switch (symbology) { case BARCODE_EANX: @@ -592,54 +592,6 @@ INTERNAL void segs_cpy(const struct zint_symbol *symbol, const struct zint_seg s } } -/* Returns red component if any of ultra colour indexing "0CBMRYGKW" */ -INTERNAL int colour_to_red(const int colour) { - int return_val = 0; - - switch (colour) { - case 8: /* White */ - case 3: /* Magenta */ - case 4: /* Red */ - case 5: /* Yellow */ - return_val = 255; - break; - } - - return return_val; -} - -/* Returns green component if any of ultra colour indexing "0CBMRYGKW" */ -INTERNAL int colour_to_green(const int colour) { - int return_val = 0; - - switch (colour) { - case 8: /* White */ - case 1: /* Cyan */ - case 5: /* Yellow */ - case 6: /* Green */ - return_val = 255; - break; - } - - return return_val; -} - -/* Returns blue component if any of ultra colour indexing "0CBMRYGKW" */ -INTERNAL int colour_to_blue(const int colour) { - int return_val = 0; - - switch (colour) { - case 8: /* White */ - case 1: /* Cyan */ - case 2: /* Blue */ - case 3: /* Magenta */ - return_val = 255; - break; - } - - return return_val; -} - #ifdef ZINT_TEST /* Dumps hex-formatted codewords in symbol->errtxt (for use in testing) */ INTERNAL void debug_test_codeword_dump(struct zint_symbol *symbol, const unsigned char *codewords, const int length) { diff --git a/backend/common.h b/backend/common.h index decc77b5..12043c4f 100644 --- a/backend/common.h +++ b/backend/common.h @@ -218,8 +218,8 @@ INTERNAL void expand(struct zint_symbol *symbol, const char data[], const int le /* Whether `symbology` can have row binding */ INTERNAL int is_stackable(const int symbology); -/* Whether `symbology` can have add-on (EAN-2 and EAN-5) */ -INTERNAL int is_extendable(const int symbology); +/* Whether `symbology` is EAN/UPC */ +INTERNAL int is_upcean(const int symbology); /* Whether `symbology` can have composite 2D component data */ INTERNAL int is_composite(const int symbology); @@ -272,16 +272,6 @@ INTERNAL void segs_cpy(const struct zint_symbol *symbol, const struct zint_seg s struct zint_seg local_segs[]); -/* Returns red component if any of ultra colour indexing "0CBMRYGKW" */ -INTERNAL int colour_to_red(const int colour); - -/* Returns green component if any of ultra colour indexing "0CBMRYGKW" */ -INTERNAL int colour_to_green(const int colour); - -/* Returns blue component if any of ultra colour indexing "0CBMRYGKW" */ -INTERNAL int colour_to_blue(const int colour); - - #ifdef ZINT_TEST /* Dumps hex-formatted codewords in symbol->errtxt (for use in testing) */ INTERNAL void debug_test_codeword_dump(struct zint_symbol *symbol, const unsigned char *codewords, const int length); diff --git a/backend/composite.c b/backend/composite.c index 5220d60d..2646ac59 100644 --- a/backend/composite.c +++ b/backend/composite.c @@ -1249,7 +1249,7 @@ static int linear_dummy_run(int input_mode, unsigned char *source, const int len static const char in_linear_comp[] = " in linear component"; INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int length) { - int error_number, warn_number = 0, cc_mode, cc_width = 0, ecc_level = 0; + int error_number, cc_mode, cc_width = 0, ecc_level = 0; int j, i, k; /* Allow for 8 bits + 5-bit latch per char + 1000 bits overhead/padding */ const unsigned int bs = 13 * length + 1000 + 1; @@ -1581,10 +1581,19 @@ INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int l if (symbol->output_options & COMPLIANT_HEIGHT) { if (symbol->symbology == BARCODE_DBAR_STK_CC) { /* Databar Stacked needs special treatment due to asymmetric rows */ - warn_number = dbar_omnstk_set_height(symbol, symbol->rows - linear->rows + 1 /*first_row*/); + error_number = dbar_omnstk_set_height(symbol, symbol->rows - linear->rows + 1 /*first_row*/); + } else if (symbol->symbology == BARCODE_DBAR_EXP_CC || symbol->symbology == BARCODE_DBAR_EXPSTK_CC) { + /* If symbol->height given then min row height was returned, else default height */ + if (error_number == 0) { /* Avoid overwriting any `gs1_verify()` warning */ + error_number = set_height(symbol, symbol->height ? linear->height : 0.0f, + symbol->height ? 0.0f : linear->height, 0.0f, 0 /*no_errtxt*/); + } else { + (void) set_height(symbol, symbol->height ? linear->height : 0.0f, + symbol->height ? 0.0f : linear->height, 0.0f, 1 /*no_errtxt*/); + } } else { /* If symbol->height given then min row height was returned, else default height */ - warn_number = set_height(symbol, symbol->height ? linear->height : 0.0f, + error_number = set_height(symbol, symbol->height ? linear->height : 0.0f, symbol->height ? 0.0f : linear->height, 0.0f, 0 /*no_errtxt*/); } } else { @@ -1600,7 +1609,7 @@ INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int l ZBarcode_Delete(linear); - return error_number ? error_number : warn_number; + return error_number; } /* vim: set ts=4 sw=4 et : */ diff --git a/backend/emf.c b/backend/emf.c index 94ae47ae..384ea42f 100644 --- a/backend/emf.c +++ b/backend/emf.c @@ -46,7 +46,7 @@ #include "emf.h" /* Multiply truncating to 3 decimal places (avoids rounding differences on various platforms) */ -#define mul3dpf(m, arg) stripf(roundf((m) * (arg) * 1000.0) / 1000.0f) +#define mul3dpf(m, arg) stripf(roundf((m) * (arg) * 1000.0f) / 1000.0f) static int emf_count_rectangles(const struct zint_symbol *symbol) { int rectangles = 0; @@ -367,6 +367,7 @@ INTERNAL int emf_plot(struct zint_symbol *symbol, int rotate_angle) { recordcount++; if (symbol->symbology == BARCODE_ULTRA) { + static const char ultra_chars[] = "0CBMRYGKW"; for (i = 0; i < 9; i++) { emr_createbrushindirect_colour[i].type = 0x00000027; /* EMR_CREATEBRUSHINDIRECT */ emr_createbrushindirect_colour[i].size = 24; @@ -377,9 +378,10 @@ INTERNAL int emf_plot(struct zint_symbol *symbol, int rotate_angle) { emr_createbrushindirect_colour[i].log_brush.color.green = fggrn; emr_createbrushindirect_colour[i].log_brush.color.blue = fgblu; } else { - emr_createbrushindirect_colour[i].log_brush.color.red = colour_to_red(i); - emr_createbrushindirect_colour[i].log_brush.color.green = colour_to_green(i); - emr_createbrushindirect_colour[i].log_brush.color.blue = colour_to_blue(i); + out_colour_char_to_rgb(ultra_chars[i], + &emr_createbrushindirect_colour[i].log_brush.color.red, + &emr_createbrushindirect_colour[i].log_brush.color.green, + &emr_createbrushindirect_colour[i].log_brush.color.blue); } emr_createbrushindirect_colour[i].log_brush.color.reserved = 0; emr_createbrushindirect_colour[i].log_brush.brush_hatch = 0x0006; /* HS_SOLIDCLR */ @@ -479,7 +481,7 @@ INTERNAL int emf_plot(struct zint_symbol *symbol, int rotate_angle) { causes various different rendering issues for LibreOffice Draw and Inkscape, so using following hack */ if (previous_diameter != circ->diameter + circ->width) { /* Drawing MaxiCode bullseye using overlayed discs */ previous_diameter = circ->diameter + circ->width; - radius = mul3dpf(0.5, previous_diameter); + radius = mul3dpf(0.5f, previous_diameter); } circle[this_circle].type = 0x0000002a; /* EMR_ELLIPSE */ circle[this_circle].size = 24; @@ -518,9 +520,9 @@ INTERNAL int emf_plot(struct zint_symbol *symbol, int rotate_angle) { if (previous_diameter != hex->diameter) { previous_diameter = hex->diameter; - radius = mul3dpf(0.5, previous_diameter); - half_radius = mul3dpf(0.25, previous_diameter); - half_sqrt3_radius = mul3dpf(0.43301270189221932338, previous_diameter); + radius = mul3dpf(0.5f, previous_diameter); + half_radius = mul3dpf(0.25f, previous_diameter); + half_sqrt3_radius = mul3dpf(0.43301270189221932338f, previous_diameter); } /* Note rotation done via world transform */ @@ -549,7 +551,7 @@ INTERNAL int emf_plot(struct zint_symbol *symbol, int rotate_angle) { /* Create font records, alignment records and text color */ if (symbol->vector->strings) { - bold = (symbol->output_options & BOLD_TEXT) && !is_extendable(symbol->symbology); + bold = (symbol->output_options & BOLD_TEXT) && !is_upcean(symbol->symbology); memset(&emr_extcreatefontindirectw, 0, sizeof(emr_extcreatefontindirectw)); emr_extcreatefontindirectw.type = 0x00000052; /* EMR_EXTCREATEFONTINDIRECTW */ emr_extcreatefontindirectw.size = 104; diff --git a/backend/gif.c b/backend/gif.c index e6b52a19..64dbcd8c 100644 --- a/backend/gif.c +++ b/backend/gif.c @@ -376,33 +376,12 @@ INTERNAL int gif_pixel_plot(struct zint_symbol *symbol, unsigned char *pixelbuf) case '1': /* standard foreground */ RGBCur[0] = RGBfg[0]; RGBCur[1] = RGBfg[1]; RGBCur[2] = RGBfg[2]; break; - case 'W': /* white */ - RGBCur[0] = 255; RGBCur[1] = 255; RGBCur[2] = 255; + default: /* Colour or error case */ + if (!out_colour_char_to_rgb(pixelColour, &RGBCur[0], &RGBCur[1], &RGBCur[2])) { + strcpy(symbol->errtxt, "612: unknown pixel colour"); + return ZINT_ERROR_INVALID_DATA; + } break; - case 'C': /* cyan */ - RGBCur[0] = 0; RGBCur[1] = 255; RGBCur[2] = 255; - break; - case 'B': /* blue */ - RGBCur[0] = 0; RGBCur[1] = 0; RGBCur[2] = 255; - break; - case 'M': /* magenta */ - RGBCur[0] = 255; RGBCur[1] = 0; RGBCur[2] = 255; - break; - case 'R': /* red */ - RGBCur[0] = 255; RGBCur[1] = 0; RGBCur[2] = 0; - break; - case 'Y': /* yellow */ - RGBCur[0] = 255; RGBCur[1] = 255; RGBCur[2] = 0; - break; - case 'G': /* green */ - RGBCur[0] = 0; RGBCur[1] = 255; RGBCur[2] = 0; - break; - case 'K': /* black */ - RGBCur[0] = 0; RGBCur[1] = 0; RGBCur[2] = 0; - break; - default: /* error case - return */ - strcpy(symbol->errtxt, "612: unknown pixel colour"); - return ZINT_ERROR_INVALID_DATA; } /* Search, if RGB value is already present */ fFound = 0; diff --git a/backend/imail.c b/backend/imail.c index 01b5a8b6..4dd2e7a5 100644 --- a/backend/imail.c +++ b/backend/imail.c @@ -33,7 +33,6 @@ /* The function "USPS_MSB_Math_CRC11GenerateFrameCheckSequence" is Copyright (C) 2006 United States Postal Service */ -#include #include "common.h" #include "large.h" @@ -266,11 +265,9 @@ INTERNAL int usps_imail(struct zint_symbol *symbol, unsigned char source[], int return ZINT_ERROR_INVALID_DATA; } - strcpy(zip, ""); - strcpy(tracker, ""); - /* separate the tracking code from the routing code */ + tracker[0] = zip[0] = '\0'; read = 0; j = 0; for (i = 0; i < length; i++) { @@ -407,7 +404,7 @@ INTERNAL int usps_imail(struct zint_symbol *symbol, unsigned char source[], int } } - strcpy(data_pattern, ""); + data_pattern[0] = '\0'; temp[1] = '\0'; for (i = 0; i < 65; i++) { j = 0; diff --git a/backend/library.c b/backend/library.c index 1181f4c9..9960a455 100644 --- a/backend/library.c +++ b/backend/library.c @@ -73,6 +73,7 @@ struct zint_symbol *ZBarcode_Create(void) { symbol->input_mode = DATA_MODE; symbol->eci = 0; /* Default 0 uses ECI 3 */ symbol->dot_size = 4.0f / 5.0f; + symbol->text_gap = 1.0f; symbol->guard_descent = 5.0f; symbol->warn_level = WARN_DEFAULT; symbol->bitmap = NULL; @@ -1100,8 +1101,8 @@ int ZBarcode_Encode_Segs(struct zint_symbol *symbol, const struct zint_seg segs[ if ((symbol->guard_descent < 0.0f) || (symbol->guard_descent > 50.0f)) { return error_tag(symbol, ZINT_ERROR_INVALID_OPTION, "769: Guard bar descent out of range (0 to 50)"); } - if ((symbol->text_gap < 0.0f) || (symbol->text_gap > 10.0f)) { - return error_tag(symbol, ZINT_ERROR_INVALID_OPTION, "219: Text gap out of range (0 to 10)"); + if ((symbol->text_gap < -5.0f) || (symbol->text_gap > 10.0f)) { + return error_tag(symbol, ZINT_ERROR_INVALID_OPTION, "219: Text gap out of range (-5 to 10)"); } if ((symbol->whitespace_width < 0) || (symbol->whitespace_width > 100)) { return error_tag(symbol, ZINT_ERROR_INVALID_OPTION, "766: Whitespace width out of range (0 to 100)"); @@ -1786,8 +1787,8 @@ unsigned int ZBarcode_Cap(int symbol_id, unsigned int cap_flag) { if ((cap_flag & ZINT_CAP_STACKABLE) && is_stackable(symbol_id)) { result |= ZINT_CAP_STACKABLE; } - if ((cap_flag & ZINT_CAP_EXTENDABLE) && is_extendable(symbol_id)) { - result |= ZINT_CAP_EXTENDABLE; + if ((cap_flag & ZINT_CAP_EANUPC) && is_upcean(symbol_id)) { + result |= ZINT_CAP_EANUPC; } if ((cap_flag & ZINT_CAP_COMPOSITE) && is_composite(symbol_id)) { result |= ZINT_CAP_COMPOSITE; diff --git a/backend/output.c b/backend/output.c index d30712d2..665dcf56 100644 --- a/backend/output.c +++ b/backend/output.c @@ -189,6 +189,38 @@ INTERNAL int out_colour_get_cmyk(const char *colour, int *cyan, int *magenta, in return 1 + have_alpha; } +/* Convert internal colour chars "WCBMRYGK" to RGB */ +INTERNAL int out_colour_char_to_rgb(const char ch, unsigned char *red, unsigned char *green, unsigned char *blue) { + static const char chars[] = "WCBMRYGK"; + static const unsigned char colours[8][3] = { + { 0xff, 0xff, 0xff, }, /* White */ + { 0, 0xff, 0xff, }, /* Cyan */ + { 0, 0, 0xff, }, /* Blue */ + { 0xff, 0, 0xff, }, /* Magenta */ + { 0xff, 0, 0, }, /* Red */ + { 0xff, 0xff, 0, }, /* Yellow */ + { 0, 0xff, 0, }, /* Green */ + { 0, 0, 0, }, /* Black */ + }; + int i = posn(chars, ch); + int ret = i != -1; + + if (i == -1) { + i = 7; /* Black (zeroize) */ + } + if (red) { + *red = colours[i][0]; + } + if (green) { + *green = colours[i][1]; + } + if (blue) { + *blue = colours[i][2]; + } + + return ret; +} + /* Return minimum quiet zones for each symbology */ static int out_quiet_zones(const struct zint_symbol *symbol, const int hide_text, const int comp_xoffset, float *left, float *right, float *top, float *bottom) { @@ -654,50 +686,60 @@ INTERNAL int out_quiet_zones_test(const struct zint_symbol *symbol, const int hi } #endif -/* Set left (x), top (y), right and bottom offsets for whitespace */ +/* Set left (x), top (y), right and bottom offsets for whitespace, also right quiet zone */ INTERNAL void out_set_whitespace_offsets(const struct zint_symbol *symbol, const int hide_text, - const int comp_xoffset, float *xoffset, float *yoffset, float *roffset, float *boffset, - const float scaler, int *xoffset_si, int *yoffset_si, int *roffset_si, int *boffset_si) { + const int comp_xoffset, float *p_xoffset, float *p_yoffset, float *p_roffset, float *p_boffset, + float *p_qz_right, const float scaler, int *p_xoffset_si, int *p_yoffset_si, int *p_roffset_si, + int *p_boffset_si, int *p_qz_right_si) { float qz_left, qz_right, qz_top, qz_bottom; out_quiet_zones(symbol, hide_text, comp_xoffset, &qz_left, &qz_right, &qz_top, &qz_bottom); - *xoffset = symbol->whitespace_width + qz_left; - *roffset = symbol->whitespace_width + qz_right; + *p_xoffset = symbol->whitespace_width + qz_left; + *p_roffset = symbol->whitespace_width + qz_right; if (symbol->output_options & BARCODE_BOX) { - *xoffset += symbol->border_width; - *roffset += symbol->border_width; + *p_xoffset += symbol->border_width; + *p_roffset += symbol->border_width; } - *yoffset = symbol->whitespace_height + qz_top; - *boffset = symbol->whitespace_height + qz_bottom; + *p_yoffset = symbol->whitespace_height + qz_top; + *p_boffset = symbol->whitespace_height + qz_bottom; if (symbol->output_options & (BARCODE_BOX | BARCODE_BIND | BARCODE_BIND_TOP)) { - *yoffset += symbol->border_width; - *boffset += symbol->border_width; + *p_yoffset += symbol->border_width; + if (symbol->output_options & (BARCODE_BOX | BARCODE_BIND)) { + *p_boffset += symbol->border_width; + } + } + + if (p_qz_right) { + *p_qz_right = qz_right; } if (scaler) { - if (xoffset_si) { - *xoffset_si = (int) (*xoffset * scaler); + if (p_xoffset_si) { + *p_xoffset_si = (int) (*p_xoffset * scaler); } - if (yoffset_si) { - *yoffset_si = (int) (*yoffset * scaler); + if (p_yoffset_si) { + *p_yoffset_si = (int) (*p_yoffset * scaler); } - if (roffset_si) { - *roffset_si = (int) (*roffset * scaler); + if (p_roffset_si) { + *p_roffset_si = (int) (*p_roffset * scaler); } - if (boffset_si) { - *boffset_si = (int) (*boffset * scaler); + if (p_boffset_si) { + *p_boffset_si = (int) (*p_boffset * scaler); + } + if (p_qz_right_si) { + *p_qz_right_si = (int) (qz_right * scaler); } } } /* Set composite offset and main width excluding add-on (for start of add-on calc) and add-on text, returning - UPC/EAN type */ + EAN/UPC type */ INTERNAL int out_process_upcean(const struct zint_symbol *symbol, const int comp_xoffset, int *p_main_width, - unsigned char addon[6], int *p_addon_gap) { + unsigned char addon[6], int *p_addon_len, int *p_addon_gap) { int main_width; /* Width of main linear symbol, excluding add-on */ - int upceanflag; /* UPC/EAN type flag */ + int upceanflag; /* EAN/UPC type flag */ int i, j, latch; const int text_length = (int) ustrlen(symbol->text); @@ -715,6 +757,7 @@ INTERNAL int out_process_upcean(const struct zint_symbol *symbol, const int comp } addon[j] = '\0'; if (latch) { + *p_addon_len = (int) ustrlen(addon); 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; @@ -836,66 +879,6 @@ INTERNAL float out_large_bar_height(struct zint_symbol *symbol, const int si, in return large_bar_height; } -/* Split UPC/EAN add-on text into various constituents */ -INTERNAL void out_upcean_split_text(const int upceanflag, const unsigned char text[], unsigned char textparts[4][7]) { - int i; - - if (upceanflag == 6) { /* UPC-E */ - textparts[0][0] = text[0]; - textparts[0][1] = '\0'; - - for (i = 0; i < 6; i++) { - textparts[1][i] = text[i + 1]; - } - textparts[1][6] = '\0'; - - textparts[2][0] = text[7]; - textparts[2][1] = '\0'; - - } else if (upceanflag == 8) { /* EAN-8 */ - for (i = 0; i < 4; i++) { - textparts[0][i] = text[i]; - } - textparts[0][4] = '\0'; - - for (i = 0; i < 4; i++) { - textparts[1][i] = text[i + 4]; - } - textparts[1][4] = '\0'; - - } else if (upceanflag == 12) { /* UPC-A */ - textparts[0][0] = text[0]; - textparts[0][1] = '\0'; - - for (i = 0; i < 5; i++) { - textparts[1][i] = text[i + 1]; - } - textparts[1][5] = '\0'; - - for (i = 0; i < 5; i++) { - textparts[2][i] = text[i + 6]; - } - textparts[2][5] = '\0'; - - textparts[3][0] = text[11]; - textparts[3][1] = '\0'; - - } else if (upceanflag == 13) { /* EAN-13 */ - textparts[0][0] = text[0]; - textparts[0][1] = '\0'; - - for (i = 0; i < 6; i++) { - textparts[1][i] = text[i + 1]; - } - textparts[1][6] = '\0'; - - for (i = 0; i < 6; i++) { - textparts[2][i] = text[i + 7]; - } - textparts[2][6] = '\0'; - } -} - #ifdef _WIN32 /* Convert UTF-8 to Windows wide chars. Ticket #288, props Marcel */ #define utf8_to_wide(u, w, r) \ diff --git a/backend/output.h b/backend/output.h index a6cd1b19..03080b43 100644 --- a/backend/output.h +++ b/backend/output.h @@ -49,15 +49,19 @@ INTERNAL int out_colour_get_rgb(const char *colour, unsigned char *red, unsigned INTERNAL int out_colour_get_cmyk(const char *colour, int *cyan, int *magenta, int *yellow, int *black, unsigned char *rgb_alpha); -/* Set left (x), top (y), right and bottom offsets for whitespace */ +/* Convert internal colour chars "WCBMRYGK" to RGB */ +INTERNAL int out_colour_char_to_rgb(const char ch, unsigned char *red, unsigned char *green, unsigned char *blue); + +/* Set left (x), top (y), right and bottom offsets for whitespace, also right quiet zone */ INTERNAL void out_set_whitespace_offsets(const struct zint_symbol *symbol, const int hide_text, - const int comp_xoffset, float *xoffset, float *yoffset, float *roffset, float *boffset, - const float scaler, int *xoffset_si, int *yoffset_si, int *roffset_si, int *boffset_si); + const int comp_xoffset, float *p_xoffset, float *p_yoffset, float *p_roffset, float *p_boffset, + float *p_qz_right, const float scaler, int *p_xoffset_si, int *p_yoffset_si, int *p_roffset_si, + int *p_boffset_si, int *p_qz_right_si); /* Set composite offset and main width excluding add-on (for start of add-on calc) and add-on text, returning - UPC/EAN type */ + EAN/UPC type */ INTERNAL int out_process_upcean(const struct zint_symbol *symbol, const int comp_xoffset, int *p_main_width, - unsigned char addon[6], int *p_addon_gap); + unsigned char addon[6], int *p_addon_len, int *p_addon_gap); /* Calculate large bar height i.e. linear bars with zero row height that respond to the symbol height. If scaler `si` non-zero (raster), then large_bar_height if non-zero or else row heights will be rounded @@ -65,9 +69,6 @@ INTERNAL int out_process_upcean(const struct zint_symbol *symbol, const int comp INTERNAL float out_large_bar_height(struct zint_symbol *symbol, const int si, int *row_heights_si, int *symbol_height_si); -/* Split UPC/EAN add-on text into various constituents */ -INTERNAL void out_upcean_split_text(const int upceanflag, const unsigned char text[], unsigned char textparts[4][7]); - /* Create output file, creating sub-directories if necessary. Returns `fopen()` FILE pointer */ INTERNAL FILE *out_fopen(const char filename[256], const char *mode); diff --git a/backend/pcx.c b/backend/pcx.c index 6c73a1f5..8a286e95 100644 --- a/backend/pcx.c +++ b/backend/pcx.c @@ -111,69 +111,24 @@ INTERNAL int pcx_pixel_plot(struct zint_symbol *symbol, const unsigned char *pix const unsigned char ch = pb[column]; switch (colour) { case 0: - switch (ch) { - case 'W': /* White */ - case 'M': /* Magenta */ - case 'R': /* Red */ - case 'Y': /* Yellow */ - rle_row[column] = 255; - break; - case 'C': /* Cyan */ - case 'B': /* Blue */ - case 'G': /* Green */ - case 'K': /* Black */ - rle_row[column] = 0; - break; - case '1': - rle_row[column] = fgred; - break; - default: - rle_row[column] = bgred; - break; + if (ch == '0' || ch == '1') { + rle_row[column] = ch != '0' ? fgred : bgred; + } else { + out_colour_char_to_rgb(ch, &rle_row[column], NULL, NULL); } break; case 1: - switch (ch) { - case 'W': /* White */ - case 'C': /* Cyan */ - case 'Y': /* Yellow */ - case 'G': /* Green */ - rle_row[column] = 255; - break; - case 'B': /* Blue */ - case 'M': /* Magenta */ - case 'R': /* Red */ - case 'K': /* Black */ - rle_row[column] = 0; - break; - case '1': - rle_row[column] = fggrn; - break; - default: - rle_row[column] = bggrn; - break; + if (ch == '0' || ch == '1') { + rle_row[column] = ch != '0' ? fggrn : bggrn; + } else { + out_colour_char_to_rgb(ch, NULL, &rle_row[column], NULL); } break; case 2: - switch (ch) { - case 'W': /* White */ - case 'C': /* Cyan */ - case 'B': /* Blue */ - case 'M': /* Magenta */ - rle_row[column] = 255; - break; - case 'R': /* Red */ - case 'Y': /* Yellow */ - case 'G': /* Green */ - case 'K': /* Black */ - rle_row[column] = 0; - break; - case '1': - rle_row[column] = fgblu; - break; - default: - rle_row[column] = bgblu; - break; + if (ch == '0' || ch == '1') { + rle_row[column] = ch != '0' ? fgblu : bgblu; + } else { + out_colour_char_to_rgb(ch, NULL, NULL, &rle_row[column]); } break; case 3: diff --git a/backend/png.c b/backend/png.c index 950e2931..f028a72e 100644 --- a/backend/png.c +++ b/backend/png.c @@ -105,7 +105,7 @@ INTERNAL int png_pixel_plot(struct zint_symbol *symbol, const unsigned char *pix png_color palette[32]; int num_palette; unsigned char trans_alpha[32]; - int num_trans; + int num_trans = 0; int bit_depth; int compression_strategy; const unsigned char *pb; @@ -117,22 +117,11 @@ INTERNAL int png_pixel_plot(struct zint_symbol *symbol, const unsigned char *pix (void) out_colour_get_rgb(symbol->fgcolour, &fg.red, &fg.green, &fg.blue, &fg_alpha); (void) out_colour_get_rgb(symbol->bgcolour, &bg.red, &bg.green, &bg.blue, &bg_alpha); - num_trans = 0; if (symbol->symbology == BARCODE_ULTRA) { - static const int ultra_chars[8] = { 'W', 'C', 'B', 'M', 'R', 'Y', 'G', 'K' }; - static const png_color ultra_colours[8] = { - { 0xff, 0xff, 0xff, }, /* White */ - { 0, 0xff, 0xff, }, /* Cyan */ - { 0, 0, 0xff, }, /* Blue */ - { 0xff, 0, 0xff, }, /* Magenta */ - { 0xff, 0, 0, }, /* Red */ - { 0xff, 0xff, 0, }, /* Yellow */ - { 0, 0xff, 0, }, /* Green */ - { 0, 0, 0, }, /* Black */ - }; + static const unsigned char ultra_chars[8] = { 'W', 'C', 'B', 'M', 'R', 'Y', 'G', 'K' }; for (i = 0; i < 8; i++) { map[ultra_chars[i]] = i; - palette[i] = ultra_colours[i]; + out_colour_char_to_rgb(ultra_chars[i], &palette[i].red, &palette[i].green, &palette[i].blue); if (fg_alpha != 0xff) { trans_alpha[i] = fg_alpha; } @@ -170,10 +159,11 @@ INTERNAL int png_pixel_plot(struct zint_symbol *symbol, const unsigned char *pix palette[num_palette++] = bg; } else { /* Alpha and no foreground alpha - add to front & move white to end */ + png_color white = palette[0]; /* Take copy */ map['0'] = 0; palette[0] = bg; map['W'] = num_palette; - palette[num_palette++] = ultra_colours[0]; + palette[num_palette++] = white; } if (bg_alpha != 0xff) { trans_alpha[num_trans++] = bg_alpha; diff --git a/backend/postal.c b/backend/postal.c index 5ca6dc61..51ef1b67 100644 --- a/backend/postal.c +++ b/backend/postal.c @@ -593,7 +593,7 @@ INTERNAL int daft(struct zint_symbol *symbol, unsigned char source[], int length symbol->height = 8.0f; } symbol->row_height[1] = stripf(symbol->height * t_ratio); - symbol->row_height[0] = stripf((symbol->height - symbol->row_height[1]) / 2.0); + symbol->row_height[0] = stripf((symbol->height - symbol->row_height[1]) / 2.0f); } else { symbol->row_height[0] = 3.0f; symbol->row_height[1] = 2.0f; diff --git a/backend/ps.c b/backend/ps.c index 48a16822..8e9ac42d 100644 --- a/backend/ps.c +++ b/backend/ps.c @@ -83,14 +83,14 @@ static void ps_convert(const unsigned char *string, unsigned char *ps_string) { *p++ = '\\'; *p++ = *s; break; - case 0xC2: /* See `to_iso8859_1()` in raster.c */ - *p++ = *++s; + case 0xC2: + *p++ = *++s; /* C2 80-BF -> 80-BF */ break; case 0xC3: - *p++ = *++s + 64; + *p++ = *++s + 0x40; /* C3 80-BF -> C0-FF */ break; default: - if (*s < 0x80) { + if (*s < 0x80) { /* ASCII - all other Unicode points > U+00FF ignored */ *p++ = *s; } break; @@ -189,7 +189,7 @@ INTERNAL int ps_plot(struct zint_symbol *symbol) { int ps_len = 0; int iso_latin1 = 0; int have_circles_with_width = 0, have_circles_without_width = 0; - const int extendable = is_extendable(symbol->symbology); + const int upcean = is_upcean(symbol->symbology); const int output_to_stdout = symbol->output_options & BARCODE_STDOUT; const int is_rgb = (symbol->output_options & CMYK_COLOUR) == 0; @@ -400,9 +400,9 @@ INTERNAL int ps_plot(struct zint_symbol *symbol) { float hy = symbol->vector->height - hex->y; if (previous_diameter != hex->diameter) { previous_diameter = hex->diameter; - out_putsf("", 4, (float) (0.5 * previous_diameter) /*radius*/, feps); - out_putsf(" ", 4, (float) (0.43301270189221932338 * previous_diameter) /*half_sqrt3_radius*/, feps); - out_putsf(" ", 4, (float) (0.25 * previous_diameter) /*half_radius*/, feps); + out_putsf("", 4, 0.5f * previous_diameter /*radius*/, feps); + out_putsf(" ", 4, 0.43301270189221932338f * previous_diameter /*half_sqrt3_radius*/, feps); + out_putsf(" ", 4, 0.25f * previous_diameter /*half_radius*/, feps); fputc('\n', feps); } if (hex->next) { @@ -420,7 +420,7 @@ INTERNAL int ps_plot(struct zint_symbol *symbol) { for (circle = symbol->vector->circles; circle; circle = circle->next) { if (previous_diameter != circle->diameter - circle->width) { previous_diameter = circle->diameter - circle->width; - radius = (float) (0.5 * previous_diameter); + radius = 0.5f * previous_diameter; } if (circle->colour) { /* Legacy - no longer used */ /* A 'white' circle */ @@ -458,7 +458,7 @@ INTERNAL int ps_plot(struct zint_symbol *symbol) { const char *font; unsigned char *ps_string = (unsigned char *) z_alloca(ps_len + 1); - if ((symbol->output_options & BOLD_TEXT) && !extendable) { + if ((symbol->output_options & BOLD_TEXT) && !upcean) { font = "Helvetica-Bold"; } else { font = "Helvetica"; @@ -479,7 +479,7 @@ INTERNAL int ps_plot(struct zint_symbol *symbol) { if (string->fsize != previous_fsize) { fprintf(feps, "/%s findfont", font); /* Compensate for Helvetica being smaller than Zint's OCR-B */ - out_putsf( " ", 2, extendable ? string->fsize * 1.07f : string->fsize, feps); + out_putsf( " ", 2, upcean ? string->fsize * 1.07f : string->fsize, feps); fputs(" scalefont setfont\n", feps); previous_fsize = string->fsize; } diff --git a/backend/qr.c b/backend/qr.c index bc70c1aa..2c9834bf 100644 --- a/backend/qr.c +++ b/backend/qr.c @@ -1014,12 +1014,11 @@ static void qr_populate_grid(unsigned char *grid, const int h_size, const int v_ } #ifdef ZINTLOG - -static int append_log(char log) { +static int append_log(unsigned char log) { FILE *file; file = fopen("zintlog.txt", "a+"); - fprintf(file, "%c", log); + fprintf(file, "%02X", log); (void) fclose(file); return 0; } @@ -1028,8 +1027,7 @@ static int write_log(char log[]) { FILE *file; file = fopen("zintlog.txt", "a+"); - fprintf(file, log); /*writes*/ - fprintf(file, "\r\n"); /*writes*/ + fprintf(file, "%s\n", log); /*writes*/ (void) fclose(file); return 0; } @@ -1055,14 +1053,11 @@ static int qr_evaluate(unsigned char *local, const int size) { #ifdef ZINTLOG /* bitmask output */ for (y = 0; y < size; y++) { - strcpy(str, ""); for (x = 0; x < size; x++) { - state = local[(y * size) + x]; - append_log(state); + append_log(local[(y * size) + x]); } write_log(""); } - write_log(""); #endif /* Test 1: Adjacent modules in row/column in same colour */ @@ -1297,6 +1292,9 @@ static int qr_apply_bitmask(unsigned char *grid, const int size, const int ecc_l int size_squared = size * size; unsigned char *mask = (unsigned char *) z_alloca(size_squared); unsigned char *local = (unsigned char *) z_alloca(size_squared); +#ifdef ZINTLOG + char str[15]; +#endif /* Perform data masking */ memset(mask, 0, size_squared); @@ -1382,8 +1380,7 @@ static int qr_apply_bitmask(unsigned char *grid, const int size, const int ecc_l } #ifdef ZINTLOG - char str[15]; - sprintf(str, "%d", best_val); + sprintf(str, "%d", best_pattern); write_log("chose pattern:"); write_log(str); #endif diff --git a/backend/raster.c b/backend/raster.c index 192fe533..9c1f0681 100644 --- a/backend/raster.c +++ b/backend/raster.c @@ -47,7 +47,11 @@ #define DEFAULT_INK '1' /* Black */ #define DEFAULT_PAPER '0' /* White */ -#define UPCEAN_TEXT 1 /* Helper flag for `draw_string()`/`draw_letter()` to indicate dealing with UPC/EAN */ +/* Flags for `draw_string()`/`draw_letter()` */ +#define ZFONT_HALIGN_CENTRE 0 +#define ZFONT_HALIGN_LEFT 1 +#define ZFONT_HALIGN_RIGHT 2 +#define ZFONT_UPCEAN_TEXT 4 /* Helper flag to indicate dealing with EAN/UPC */ #ifndef ZINT_NO_PNG INTERNAL int png_pixel_plot(struct zint_symbol *symbol, const unsigned char *pixelbuf); @@ -260,7 +264,7 @@ static void draw_pt(unsigned char *buf, const int buf_width, const int buf_heigh /* Draw the first line of a bar, to be completed by `copy_bar_line()`; more performant than multiple `draw_bar()`s */ static void draw_bar_line(unsigned char *pixelbuf, const int xpos, const int xlen, const int ypos, - const int image_width, const char fill) { + const int image_width, const int fill) { unsigned char *pb = pixelbuf + ((size_t) image_width * ypos) + xpos; memset(pb, fill, xlen); @@ -282,7 +286,7 @@ static void copy_bar_line(unsigned char *pixelbuf, const int xpos, const int xle /* Draw a rectangle */ static void draw_bar(unsigned char *pixelbuf, const int xpos, const int xlen, const int ypos, const int ylen, - const int image_width, const int image_height, const char fill) { + const int image_width, const int image_height, const int fill) { int y; const int ye = ypos + ylen > image_height ? image_height : ypos + ylen; /* Defensive, should never happen */ unsigned char *pb = pixelbuf + ((size_t) image_width * ypos) + xpos; @@ -306,7 +310,7 @@ static void draw_letter(unsigned char *pixelbuf, const unsigned char letter, int int font_y; int half_si; int odd_si; - unsigned char *linePtr, *maxPtr; + unsigned char *linePtr; int x_start = 0; if (letter < 33) { @@ -330,7 +334,7 @@ static void draw_letter(unsigned char *pixelbuf, const unsigned char letter, int glyph_no = letter - 33; } - if (textflags & UPCEAN_TEXT) { /* Needs to be before SMALL_TEXT check */ + if (textflags & ZFONT_UPCEAN_TEXT) { /* Needs to be before SMALL_TEXT check */ /* No bold for UPCEAN */ if (textflags & SMALL_TEXT) { font_table = upcean_small_font; @@ -375,8 +379,8 @@ static void draw_letter(unsigned char *pixelbuf, const unsigned char letter, int unsigned char *pixelPtr = linePtr; /* Avoid warning */ for (y_si = 0; y_si < half_si; y_si++) { int extra_dot = 0; + unsigned char *const maxPtr = linePtr + image_width - xposn; pixelPtr = linePtr; - maxPtr = linePtr + image_width - xposn; for (x = x_start; x < max_x && pixelPtr < maxPtr; x++) { unsigned set = font_table[font_y + y] & (glyph_mask >> x); for (x_si = 0; x_si < half_si && pixelPtr < maxPtr; x_si++) { @@ -409,12 +413,13 @@ static void draw_letter(unsigned char *pixelbuf, const unsigned char letter, int } /* Plot a string into the pixel buffer */ -static void draw_string(unsigned char *pixbuf, const unsigned char input_string[], const int xposn, const int yposn, - const int textflags, const int image_width, const int image_height, const int si) { - int i, string_length, string_left_hand, letter_width, letter_gap; - int half_si = si / 2, odd_si = si & 1, x_incr; +static void draw_string(unsigned char *pixelbuf, const unsigned char input_string[], int length, const int xposn, + const int yposn, const int textflags, const int image_width, const int image_height, const int si) { + int i, string_left_hand, letter_width, letter_gap; + const int half_si = si / 2, odd_si = si & 1; + int x_incr; - if (textflags & UPCEAN_TEXT) { /* Needs to be before SMALL_TEXT check */ + if (textflags & ZFONT_UPCEAN_TEXT) { /* Needs to be before SMALL_TEXT check */ /* No bold for UPCEAN */ letter_width = textflags & SMALL_TEXT ? UPCEAN_SMALL_FONT_WIDTH : UPCEAN_FONT_WIDTH; letter_gap = 4; @@ -431,18 +436,26 @@ static void draw_string(unsigned char *pixbuf, const unsigned char input_string[ } letter_width += letter_gap; - string_length = (int) ustrlen(input_string); - - string_left_hand = xposn - ((letter_width * string_length - letter_gap) * half_si) / 2; - if (odd_si) { - string_left_hand -= (letter_width * string_length - letter_gap) / 4; + if (length == -1) { + length = (int) ustrlen(input_string); } - for (i = 0; i < string_length; i++) { + + if (textflags & ZFONT_HALIGN_LEFT) { + string_left_hand = xposn; + } else if (textflags & ZFONT_HALIGN_RIGHT) { + string_left_hand = xposn - ((letter_width * length - letter_gap) * half_si); + } else { + string_left_hand = xposn - (int) roundf(((letter_width * length - letter_gap) * half_si) / 2.0f); + } + if (odd_si) { + string_left_hand -= (letter_width * length - letter_gap) / 4; + } + for (i = 0; i < length; i++) { x_incr = i * letter_width * half_si; if (odd_si) { x_incr += i * letter_width / 2; } - draw_letter(pixbuf, input_string[i], string_left_hand + x_incr, yposn, textflags, image_width, image_height, + draw_letter(pixelbuf, input_string[i], string_left_hand + x_incr, yposn, textflags, image_width, image_height, si); } } @@ -647,7 +660,8 @@ static void plot_hexagon(unsigned char *scaled_hexagon, const int hex_width, con /* Draw binding or box */ static void draw_bind_box(const struct zint_symbol *symbol, unsigned char *pixelbuf, const int xoffset_si, const int yoffset_si, const int symbol_height_si, const int dot_overspill_si, - const int image_width, const int image_height, const int si) { + const int upceanflag, const int textoffset_si, const int image_width, const int image_height, + const int si) { if (symbol->border_width > 0 && (symbol->output_options & (BARCODE_BOX | BARCODE_BIND | BARCODE_BIND_TOP))) { const int no_extend = symbol->symbology == BARCODE_CODABLOCKF || symbol->symbology == BARCODE_HIBC_BLOCKF || symbol->symbology == BARCODE_DPD; @@ -658,6 +672,9 @@ static void draw_bind_box(const struct zint_symbol *symbol, unsigned char *pixel if (horz_outside) { ybind_top = 0; ybind_bot = image_height - bwidth_si; + } else if (upceanflag == 2 || upceanflag == 5) { + ybind_top += textoffset_si; + ybind_bot += textoffset_si; } /* Horizontal boundary bars */ if ((symbol->output_options & BARCODE_BOX) || !no_extend) { @@ -683,6 +700,8 @@ static void draw_bind_box(const struct zint_symbol *symbol, unsigned char *pixel if (horz_outside) { box_top = bwidth_si; box_height = image_height - bwidth_si * 2; + } else if (upceanflag == 2 || upceanflag == 5) { + box_top += textoffset_si; } draw_bar(pixelbuf, 0, bwidth_si, box_top, box_height, image_width, image_height, DEFAULT_INK); draw_bar(pixelbuf, xbox_right, bwidth_si, box_top, box_height, image_width, image_height, DEFAULT_INK); @@ -714,7 +733,7 @@ static int plot_raster_maxicode(struct zint_symbol *symbol, const int rotate_ang scaler *= 10.0f; out_set_whitespace_offsets(symbol, 0 /*hide_text*/, 0 /*comp_xoffset*/, &xoffset, &yoffset, &roffset, &boffset, - scaler, &xoffset_si, &yoffset_si, &roffset_si, &boffset_si); + NULL /*qz_right*/, scaler, &xoffset_si, &yoffset_si, &roffset_si, &boffset_si, NULL /*qz_right_si*/); hex_width = (int) roundf(scaler); /* Short diameter, X in ISO/IEC 16023:2000 Figure 8 (same as W) */ hex_height = (int) roundf(scaler * two_div_sqrt3); /* Long diameter, V in Figure 8 */ @@ -772,7 +791,7 @@ static int plot_raster_maxicode(struct zint_symbol *symbol, const int rotate_ang xoffset_si, yoffset_si); draw_bind_box(symbol, pixelbuf, xoffset_si, yoffset_si, hex_image_height, 0 /*dot_overspill_si*/, - image_width, image_height, (int) scaler); + 0 /*upceanflag*/, 0 /*textoffset_si*/, image_width, image_height, (int) scaler); error_number = save_raster_image_to_file(symbol, image_height, image_width, pixelbuf, rotate_angle, file_type); free(scaled_hexagon); @@ -812,7 +831,7 @@ static int plot_raster_dotty(struct zint_symbol *symbol, const int rotate_angle, dot_radius_si = (int) dot_radius_s; out_set_whitespace_offsets(symbol, 0 /*hide_text*/, 0 /*comp_xoffset*/, &xoffset, &yoffset, &roffset, &boffset, - scaler, &xoffset_si, &yoffset_si, &roffset_si, &boffset_si); + NULL /*qz_right*/, scaler, &xoffset_si, &yoffset_si, &roffset_si, &boffset_si, NULL /*qz_right_si*/); /* TODO: Revisit this overspill stuff, it's hacky */ if (symbol->dot_size < 1.0f) { @@ -850,7 +869,7 @@ static int plot_raster_dotty(struct zint_symbol *symbol, const int rotate_angle, } draw_bind_box(symbol, scaled_pixelbuf, xoffset_si, yoffset_si, symbol_height_si, dot_overspill_si, - scale_width, scale_height, (int) scaler); + 0 /*upceanflag*/, 0 /*textoffset_si*/, scale_width, scale_height, (int) scaler); error_number = save_raster_image_to_file(symbol, scale_height, scale_width, scaled_pixelbuf, rotate_angle, file_type); @@ -905,26 +924,25 @@ static int plot_raster_default(struct zint_symbol *symbol, const int rotate_angl int main_width; int comp_xoffset = 0; unsigned char addon[6]; + int addon_len = 0; int addon_gap = 0; float addon_text_yposn = 0.0f; float xoffset, yoffset, roffset, boffset; float textoffset; int upceanflag = 0; int addon_latch = 0; - unsigned char textparts[4][7]; int hide_text; int i, r; int block_width = 0; int font_height; /* Font pixel size (so whole integers) */ - float text_gap; /* Gap between barcode and text */ float guard_descent; const int upcean_guard_whitespace = !(symbol->output_options & BARCODE_NO_QUIET_ZONES) && (symbol->output_options & EANUPC_GUARD_WHITESPACE); const int is_codablockf = symbol->symbology == BARCODE_CODABLOCKF || symbol->symbology == BARCODE_HIBC_BLOCKF; int textflags = 0; - int xoffset_si, yoffset_si, roffset_si, boffset_si; - int comp_xoffset_si; + int xoffset_si, yoffset_si, roffset_si, boffset_si, qz_right_si; + int xoffset_comp_si; int row_heights_si[200]; int symbol_height_si; int image_width, image_height; @@ -955,28 +973,28 @@ static int plot_raster_default(struct zint_symbol *symbol, const int rotate_angl comp_xoffset++; } } - if (is_extendable(symbol->symbology)) { - upceanflag = out_process_upcean(symbol, comp_xoffset, &main_width, addon, &addon_gap); + if (is_upcean(symbol->symbology)) { + upceanflag = out_process_upcean(symbol, comp_xoffset, &main_width, addon, &addon_len, &addon_gap); } hide_text = ((!symbol->show_hrt) || (ustrlen(symbol->text) == 0) || scaler < 1.0f); - out_set_whitespace_offsets(symbol, hide_text, comp_xoffset, &xoffset, &yoffset, &roffset, &boffset, si, - &xoffset_si, &yoffset_si, &roffset_si, &boffset_si); + out_set_whitespace_offsets(symbol, hide_text, comp_xoffset, &xoffset, &yoffset, &roffset, &boffset, + NULL /*qz_right*/, si, &xoffset_si, &yoffset_si, &roffset_si, &boffset_si, &qz_right_si); - comp_xoffset_si = xoffset_si + comp_xoffset * si; + xoffset_comp_si = xoffset_si + comp_xoffset * si; + + image_width = symbol->width * si + xoffset_si + roffset_si; /* Note font sizes halved as in pixels */ if (upceanflag) { - textflags = UPCEAN_TEXT | (symbol->output_options & SMALL_TEXT); /* Bold not available for UPC/EAN */ + textflags = ZFONT_UPCEAN_TEXT | (symbol->output_options & SMALL_TEXT); /* Bold not available for EAN/UPC */ font_height = (UPCEAN_FONT_HEIGHT + 1) / 2; - text_gap = symbol->text_gap ? symbol->text_gap : 1.0f; /* Height of guard bar descent (none for EAN-2 and EAN-5) */ guard_descent = upceanflag >= 6 ? symbol->guard_descent : 0.0f; } else { textflags = symbol->output_options & (SMALL_TEXT | BOLD_TEXT); font_height = textflags & SMALL_TEXT ? (SMALL_FONT_HEIGHT + 1) / 2 : (NORMAL_FONT_HEIGHT + 1) / 2; - text_gap = symbol->text_gap ? symbol->text_gap : 1.0f; guard_descent = 0.0f; } @@ -984,17 +1002,16 @@ static int plot_raster_default(struct zint_symbol *symbol, const int rotate_angl textoffset = guard_descent; } else { if (upceanflag) { - textoffset = font_height + text_gap; + textoffset = font_height + symbol->text_gap; if (textoffset < guard_descent) { textoffset = guard_descent; } } else { - textoffset = font_height + text_gap; + textoffset = font_height + symbol->text_gap; } } - image_width = symbol->width * si + xoffset_si + roffset_si; - image_height = symbol_height_si + textoffset * si + yoffset_si + boffset_si; + image_height = symbol_height_si + (int) ceilf(textoffset * si) + yoffset_si + boffset_si; assert(image_width && image_height); if (!(pixelbuf = (unsigned char *) malloc((size_t) image_width * image_height))) { @@ -1035,12 +1052,12 @@ static int plot_raster_default(struct zint_symbol *symbol, const int rotate_angl && module_is_set(symbol, r, i + block_width) == fill; block_width++); if ((r == (symbol->rows - 1)) && (i > main_width) && (addon_latch == 0)) { int addon_row_height_si; - const int text_offset_si = (font_height + text_gap) * si; + const int addon_row_adj_si = (int) ceilf((font_height + symbol->text_gap) * si); copy_bar_line(pixelbuf, xoffset_si, main_width * si, yposn_si, row_height_si, image_width, image_height); addon_text_yposn = yposn_si; - yposn_si += text_offset_si; - addon_row_height_si = row_height_si - text_offset_si; + yposn_si += addon_row_adj_si; + addon_row_height_si = row_height_si - addon_row_adj_si; if (upceanflag != 12 && upceanflag != 6) { /* UPC-A/E add-ons don't descend */ addon_row_height_si += guard_descent * si; } @@ -1069,10 +1086,13 @@ static int plot_raster_default(struct zint_symbol *symbol, const int rotate_angl } else { if (upceanflag && !hide_text) { /* EAN-2, EAN-5 (standalone add-ons) */ - yposn_si += (int) (font_height + text_gap) * si; + yposn_si += (int) ceilf((font_height + symbol->text_gap) * si); } for (r = 0; r < symbol->rows; r++) { - const int row_height_si = row_heights_si[r]; + int row_height_si = row_heights_si[r]; + if (upceanflag && !hide_text) { /* EAN-2, EAN-5 (standalone add-ons) */ + row_height_si += textoffset * si - (yposn_si - yoffset_si); + } for (i = 0; i < symbol->width; i += block_width) { const int fill = module_is_set(symbol, r, i); @@ -1096,19 +1116,19 @@ static int plot_raster_default(struct zint_symbol *symbol, const int rotate_angl const int guard_descent_si = guard_descent * si; if (upceanflag == 6) { /* UPC-E */ - draw_bar_line(pixelbuf, 0 * si + comp_xoffset_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); - draw_bar_line(pixelbuf, 2 * si + comp_xoffset_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); - draw_bar_line(pixelbuf, 46 * si + comp_xoffset_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); - draw_bar_line(pixelbuf, 48 * si + comp_xoffset_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); - draw_bar_line(pixelbuf, 50 * si + comp_xoffset_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); + draw_bar_line(pixelbuf, 0 * si + xoffset_comp_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); + draw_bar_line(pixelbuf, 2 * si + xoffset_comp_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); + draw_bar_line(pixelbuf, 46 * si + xoffset_comp_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); + draw_bar_line(pixelbuf, 48 * si + xoffset_comp_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); + draw_bar_line(pixelbuf, 50 * si + xoffset_comp_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); } else if (upceanflag == 8) { /* EAN-8 */ - draw_bar_line(pixelbuf, 0 * si + comp_xoffset_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); - draw_bar_line(pixelbuf, 2 * si + comp_xoffset_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); - draw_bar_line(pixelbuf, 32 * si + comp_xoffset_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); - draw_bar_line(pixelbuf, 34 * si + comp_xoffset_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); - draw_bar_line(pixelbuf, 64 * si + comp_xoffset_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); - draw_bar_line(pixelbuf, 66 * si + comp_xoffset_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); + draw_bar_line(pixelbuf, 0 * si + xoffset_comp_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); + draw_bar_line(pixelbuf, 2 * si + xoffset_comp_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); + draw_bar_line(pixelbuf, 32 * si + xoffset_comp_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); + draw_bar_line(pixelbuf, 34 * si + xoffset_comp_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); + draw_bar_line(pixelbuf, 64 * si + xoffset_comp_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); + draw_bar_line(pixelbuf, 66 * si + xoffset_comp_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); } else if (upceanflag == 12) { /* UPC-A */ for (i = 0 + comp_xoffset; i < 11 + comp_xoffset; i += block_width) { @@ -1121,8 +1141,8 @@ static int plot_raster_default(struct zint_symbol *symbol, const int rotate_angl DEFAULT_INK); } } - draw_bar_line(pixelbuf, 46 * si + comp_xoffset_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); - draw_bar_line(pixelbuf, 48 * si + comp_xoffset_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); + draw_bar_line(pixelbuf, 46 * si + xoffset_comp_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); + draw_bar_line(pixelbuf, 48 * si + xoffset_comp_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); for (i = 85 + comp_xoffset; i < 96 + comp_xoffset; i += block_width) { const int fill = module_is_set(symbol, symbol->rows - 1, i); for (block_width = 1; (i + block_width < symbol->width) @@ -1135,150 +1155,154 @@ static int plot_raster_default(struct zint_symbol *symbol, const int rotate_angl } } else { /* EAN-13 */ - draw_bar_line(pixelbuf, 0 * si + comp_xoffset_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); - draw_bar_line(pixelbuf, 2 * si + comp_xoffset_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); - draw_bar_line(pixelbuf, 46 * si + comp_xoffset_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); - draw_bar_line(pixelbuf, 48 * si + comp_xoffset_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); - draw_bar_line(pixelbuf, 92 * si + comp_xoffset_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); - draw_bar_line(pixelbuf, 94 * si + comp_xoffset_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); + draw_bar_line(pixelbuf, 0 * si + xoffset_comp_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); + draw_bar_line(pixelbuf, 2 * si + xoffset_comp_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); + draw_bar_line(pixelbuf, 46 * si + xoffset_comp_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); + draw_bar_line(pixelbuf, 48 * si + xoffset_comp_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); + draw_bar_line(pixelbuf, 92 * si + xoffset_comp_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); + draw_bar_line(pixelbuf, 94 * si + xoffset_comp_si, 1 * si, guard_yoffset_si, image_width, DEFAULT_INK); } - copy_bar_line(pixelbuf, comp_xoffset_si, image_width - comp_xoffset_si - roffset_si, guard_yoffset_si, + copy_bar_line(pixelbuf, xoffset_comp_si, image_width - xoffset_comp_si - roffset_si, guard_yoffset_si, guard_descent_si, image_width, image_height); } /* Add the text */ if (!hide_text) { - int text_yposn = yoffset_si + symbol_height_si + (int) (text_gap * si); /* Calculated to top of text */ - if (upceanflag == 2 || upceanflag == 5) { /* EAN-2/5 */ - text_yposn = yoffset_si; - } - if (symbol->border_width > 0 && (symbol->output_options & (BARCODE_BOX | BARCODE_BIND))) { - text_yposn += symbol->border_width * si; /* Note not needed for BARCODE_BIND_TOP */ - } if (upceanflag >= 6) { /* UPC-E, EAN-8, UPC-A, EAN-13 */ - const int addon_len = (int) ustrlen(addon); /* Note font sizes halved as in pixels */ - - /* Halved again to get middle position that draw_string() expects */ - const int upcea_width_adj = (UPCEAN_SMALL_FONT_WIDTH + 3) / 4; const int upcea_height_adj = ((UPCEAN_FONT_HEIGHT - UPCEAN_SMALL_FONT_HEIGHT) * si + 1) / 2; - /* Halved again to get middle position that draw_string() expects */ - const int ean_width_adj = (UPCEAN_FONT_WIDTH + 3) / 4; - out_upcean_split_text(upceanflag, symbol->text, textparts); + int text_yposn = yoffset_si + symbol_height_si + (int) (symbol->text_gap * si); + if (symbol->border_width > 0 && (symbol->output_options & (BARCODE_BOX | BARCODE_BIND))) { + text_yposn += symbol->border_width * si; /* Note not needed for BARCODE_BIND_TOP */ + } if (upceanflag == 6) { /* UPC-E */ - int text_xposn = -(5 + upcea_width_adj) * si + comp_xoffset_si; - draw_string(pixelbuf, textparts[0], text_xposn, text_yposn + upcea_height_adj, textflags | SMALL_TEXT, - image_width, image_height, si); - text_xposn = 24 * si + comp_xoffset_si; - draw_string(pixelbuf, textparts[1], text_xposn, text_yposn, textflags, image_width, image_height, si); - text_xposn = (51 + 3 + upcea_width_adj) * si + comp_xoffset_si; - draw_string(pixelbuf, textparts[2], text_xposn, text_yposn + upcea_height_adj, textflags | SMALL_TEXT, - image_width, image_height, si); + int text_xposn = -5 * si + xoffset_comp_si; + draw_string(pixelbuf, symbol->text, 1, text_xposn, text_yposn + upcea_height_adj, + textflags | SMALL_TEXT | ZFONT_HALIGN_RIGHT, image_width, image_height, si); + text_xposn = 24 * si + xoffset_comp_si; + draw_string(pixelbuf, symbol->text + 1, 6, text_xposn, text_yposn, textflags, image_width, + image_height, si); + text_xposn = (51 + 3) * si + xoffset_comp_si; + draw_string(pixelbuf, symbol->text + 7, 1, text_xposn, text_yposn + upcea_height_adj, + textflags | SMALL_TEXT | ZFONT_HALIGN_LEFT, image_width, image_height, si); if (addon_len) { - text_xposn = ((addon_len == 2 ? 61 : 75) + addon_gap) * si + comp_xoffset_si; - draw_string(pixelbuf, addon, text_xposn, addon_text_yposn, textflags, + text_xposn = ((addon_len == 2 ? 61 : 75) + addon_gap) * si + xoffset_comp_si; + draw_string(pixelbuf, addon, addon_len, text_xposn, addon_text_yposn, textflags, image_width, image_height, si); if (upcean_guard_whitespace) { - text_xposn = (int) (((addon_len == 2 ? 70 : 97) + 1.5f + upcea_width_adj + addon_gap) * si) - + comp_xoffset_si; - draw_string(pixelbuf, (const unsigned char *) ">", text_xposn, addon_text_yposn, textflags, - image_width, image_height, si); + text_xposn = symbol->width * si + qz_right_si + xoffset_si; + draw_string(pixelbuf, (const unsigned char *) ">", 1, text_xposn, addon_text_yposn, + textflags | ZFONT_HALIGN_RIGHT, image_width, image_height, si); } } } else if (upceanflag == 8) { /* EAN-8 */ int text_xposn; if (upcean_guard_whitespace) { - text_xposn = -(ean_width_adj + 2) * si + comp_xoffset_si; - draw_string(pixelbuf, (const unsigned char *) "<", text_xposn, text_yposn, textflags, - image_width, image_height, si); + text_xposn = -7 * si + xoffset_comp_si; + draw_string(pixelbuf, (const unsigned char *) "<", 1, text_xposn, text_yposn, + textflags | ZFONT_HALIGN_LEFT, image_width, image_height, si); } - text_xposn = 17 * si + comp_xoffset_si; - draw_string(pixelbuf, textparts[0], text_xposn, text_yposn, textflags, image_width, image_height, si); - text_xposn = 50 * si + comp_xoffset_si; - draw_string(pixelbuf, textparts[1], text_xposn, text_yposn, textflags, image_width, image_height, si); + text_xposn = 17 * si + xoffset_comp_si; + draw_string(pixelbuf, symbol->text, 4, text_xposn, text_yposn, textflags, image_width, image_height, + si); + text_xposn = 50 * si + xoffset_comp_si; + draw_string(pixelbuf, symbol->text + 4, 4, text_xposn, text_yposn, textflags, image_width, + image_height, si); if (addon_len) { - text_xposn = ((addon_len == 2 ? 77 : 91) + addon_gap) * si + comp_xoffset_si; - draw_string(pixelbuf, addon, text_xposn, addon_text_yposn, textflags, + text_xposn = ((addon_len == 2 ? 77 : 91) + addon_gap) * si + xoffset_comp_si; + draw_string(pixelbuf, addon, addon_len, text_xposn, addon_text_yposn, textflags, image_width, image_height, si); if (upcean_guard_whitespace) { - text_xposn = (int) (((addon_len == 2 ? 86 : 113) + 0.5f + ean_width_adj + addon_gap) * si) - + comp_xoffset_si; - draw_string(pixelbuf, (const unsigned char *) ">", text_xposn, addon_text_yposn, textflags, - image_width, image_height, si); + text_xposn = symbol->width * si + qz_right_si + xoffset_si; + draw_string(pixelbuf, (const unsigned char *) ">", 1, text_xposn, addon_text_yposn, + textflags | ZFONT_HALIGN_RIGHT, image_width, image_height, si); } } else if (upcean_guard_whitespace) { - text_xposn = (int) ((68 + 0.5f + ean_width_adj) * si) + comp_xoffset_si; - draw_string(pixelbuf, (const unsigned char *) ">", text_xposn, text_yposn, textflags, - image_width, image_height, si); + text_xposn = symbol->width * si + qz_right_si + xoffset_si; + draw_string(pixelbuf, (const unsigned char *) ">", 1, text_xposn, text_yposn, + textflags | ZFONT_HALIGN_RIGHT, image_width, image_height, si); } } else if (upceanflag == 12) { /* UPC-A */ - int text_xposn = (-(5 + upcea_width_adj)) * si + comp_xoffset_si; - draw_string(pixelbuf, textparts[0], text_xposn, text_yposn + upcea_height_adj, textflags | SMALL_TEXT, - image_width, image_height, si); - text_xposn = 27 * si + comp_xoffset_si; - draw_string(pixelbuf, textparts[1], text_xposn, text_yposn, textflags, image_width, image_height, si); - text_xposn = 67 * si + comp_xoffset_si; - draw_string(pixelbuf, textparts[2], text_xposn, text_yposn, textflags, image_width, image_height, si); - text_xposn = (95 + 5 + upcea_width_adj) * si + comp_xoffset_si; - draw_string(pixelbuf, textparts[3], text_xposn, text_yposn + upcea_height_adj, textflags | SMALL_TEXT, - image_width, image_height, si); + int text_xposn = -5 * si + xoffset_comp_si; + draw_string(pixelbuf, symbol->text, 1, text_xposn, text_yposn + upcea_height_adj, + textflags | SMALL_TEXT | ZFONT_HALIGN_RIGHT, image_width, image_height, si); + text_xposn = 28 * si + xoffset_comp_si; + draw_string(pixelbuf, symbol->text + 1, 5, text_xposn, text_yposn, textflags, image_width, + image_height, si); + text_xposn = 67 * si + xoffset_comp_si; + draw_string(pixelbuf, symbol->text + 6, 5, text_xposn, text_yposn, textflags, image_width, + image_height, si); + text_xposn = (95 + 5) * si + xoffset_comp_si; + draw_string(pixelbuf, symbol->text + 11, 1, text_xposn, text_yposn + upcea_height_adj, + textflags | SMALL_TEXT | ZFONT_HALIGN_LEFT, image_width, image_height, si); if (addon_len) { - text_xposn = ((addon_len == 2 ? 105 : 119) + addon_gap) * si + comp_xoffset_si; - draw_string(pixelbuf, addon, text_xposn, addon_text_yposn, textflags, + text_xposn = ((addon_len == 2 ? 105 : 119) + addon_gap) * si + xoffset_comp_si; + draw_string(pixelbuf, addon, addon_len, text_xposn, addon_text_yposn, textflags, image_width, image_height, si); if (upcean_guard_whitespace) { - text_xposn = (int) (((addon_len == 2 ? 114 : 141) + 0.5f + ean_width_adj + addon_gap) * si) - + comp_xoffset_si; - draw_string(pixelbuf, (const unsigned char *) ">", text_xposn, addon_text_yposn, textflags, - image_width, image_height, si); + text_xposn = symbol->width * si + qz_right_si + xoffset_si; + draw_string(pixelbuf, (const unsigned char *) ">", 1, text_xposn, addon_text_yposn, + textflags | ZFONT_HALIGN_RIGHT, image_width, image_height, si); } } } else { /* EAN-13 */ - int text_xposn = (-(5 + ean_width_adj)) * si + comp_xoffset_si; - draw_string(pixelbuf, textparts[0], text_xposn, text_yposn, textflags, image_width, image_height, si); - text_xposn = 24 * si + comp_xoffset_si; - draw_string(pixelbuf, textparts[1], text_xposn, text_yposn, textflags, image_width, image_height, si); - text_xposn = 71 * si + comp_xoffset_si; - draw_string(pixelbuf, textparts[2], text_xposn, text_yposn, textflags, image_width, image_height, si); + int text_xposn = -5 * si + xoffset_comp_si; + draw_string(pixelbuf, symbol->text, 1, text_xposn, text_yposn, textflags | ZFONT_HALIGN_RIGHT, + image_width, image_height, si); + text_xposn = 24 * si + xoffset_comp_si; + draw_string(pixelbuf, symbol->text + 1, 6, text_xposn, text_yposn, textflags, image_width, + image_height, si); + text_xposn = 71 * si + xoffset_comp_si; + draw_string(pixelbuf, symbol->text + 7, 6, text_xposn, text_yposn, textflags, image_width, + image_height, si); if (addon_len) { - text_xposn = ((addon_len == 2 ? 105 : 119) + addon_gap) * si + comp_xoffset_si; - draw_string(pixelbuf, addon, text_xposn, addon_text_yposn, textflags, + text_xposn = ((addon_len == 2 ? 105 : 119) + addon_gap) * si + xoffset_comp_si; + draw_string(pixelbuf, addon, addon_len, text_xposn, addon_text_yposn, textflags, image_width, image_height, si); if (upcean_guard_whitespace) { - text_xposn = (int) (((addon_len == 2 ? 114 : 141) + 0.5f + ean_width_adj + addon_gap) * si) - + comp_xoffset_si; - draw_string(pixelbuf, (const unsigned char *) ">", text_xposn, addon_text_yposn, textflags, - image_width, image_height, si); + text_xposn = symbol->width * si + qz_right_si + xoffset_si; + draw_string(pixelbuf, (const unsigned char *) ">", 1, text_xposn, addon_text_yposn, + textflags | ZFONT_HALIGN_RIGHT, image_width, image_height, si); } } else if (upcean_guard_whitespace) { - text_xposn = (int) ((96 + 0.5f + ean_width_adj) * si) + comp_xoffset_si; - draw_string(pixelbuf, (const unsigned char *) ">", text_xposn, text_yposn, textflags, - image_width, image_height, si); + text_xposn = symbol->width * si + qz_right_si + xoffset_si; + draw_string(pixelbuf, (const unsigned char *) ">", 1, text_xposn, text_yposn, + textflags | ZFONT_HALIGN_RIGHT, image_width, image_height, si); } } + } else if (upceanflag) { /* EAN-2, EAN-5 (standalone add-ons) */ + int text_xposn = (int) ((main_width / 2.0f) * si) + xoffset_si; + int text_yposn = yoffset_si; + if (symbol->border_width > 0 + && (symbol->output_options & (BARCODE_BOX | BARCODE_BIND | BARCODE_BIND_TOP))) { + text_yposn -= symbol->border_width * si; + } + /* Put the human readable text at the top */ + draw_string(pixelbuf, symbol->text, -1, text_xposn, text_yposn, textflags, image_width, image_height, si); + if (upcean_guard_whitespace) { + text_xposn = symbol->width * si + qz_right_si + xoffset_comp_si; + draw_string(pixelbuf, (const unsigned char *) ">", 1, text_xposn, text_yposn, + textflags | ZFONT_HALIGN_RIGHT, image_width, image_height, si); + } } else { - int text_xposn = (main_width / 2) * si + xoffset_si; /* Suppress clang-analyzer-core.CallAndMessage warning */ unsigned char local_text[sizeof(symbol->text)] = {0}; - to_iso8859_1(symbol->text, local_text); - /* Put the human readable text at the bottom (or top if EAN-2/5) */ - draw_string(pixelbuf, local_text, text_xposn, text_yposn, textflags, image_width, image_height, si); - /* EAN-2/5 */ - if (upceanflag && upcean_guard_whitespace) { - const int ean_width_adj = (UPCEAN_FONT_WIDTH + 3) / 4; - const int addon_len = (int) ustrlen(symbol->text); - text_xposn = (int) (((addon_len == 2 ? 19 : 46) + 0.5f + ean_width_adj) * si) + xoffset_si; - draw_string(pixelbuf, (const unsigned char *) ">", text_xposn, text_yposn, textflags, - image_width, image_height, si); + int text_xposn = (int) ((main_width / 2.0f) * si) + xoffset_si; + int text_yposn = yoffset_si + symbol_height_si + (int) (symbol->text_gap * si); + if (symbol->border_width > 0 && (symbol->output_options & (BARCODE_BOX | BARCODE_BIND))) { + text_yposn += symbol->border_width * si; /* Note not needed for BARCODE_BIND_TOP */ } + to_iso8859_1(symbol->text, local_text); + /* Put the human readable text at the bottom */ + draw_string(pixelbuf, local_text, -1, text_xposn, text_yposn, textflags, image_width, image_height, si); } } @@ -1306,7 +1330,7 @@ static int plot_raster_default(struct zint_symbol *symbol, const int rotate_angl } draw_bind_box(symbol, pixelbuf, xoffset_si, yoffset_si, symbol_height_si, 0 /*dot_overspill_si*/, - image_width, image_height, si); + upceanflag, (int) (textoffset * si), image_width, image_height, si); if (!half_int_scaling) { size_t prev_image_row; @@ -1317,7 +1341,7 @@ static int plot_raster_default(struct zint_symbol *symbol, const int rotate_angl /* Apply scale options by creating another pixel buffer */ if (!(scaled_pixelbuf = (unsigned char *) malloc((size_t) scale_width * scale_height))) { free(pixelbuf); - strcpy(symbol->errtxt, "659: Insufficient memory for pixel buffer"); + strcpy(symbol->errtxt, "659: Insufficient memory for scaled pixel buffer"); return ZINT_ERROR_MEMORY; } memset(scaled_pixelbuf, DEFAULT_PAPER, (size_t) scale_width * scale_height); diff --git a/backend/rss.c b/backend/rss.c index 8c34cbdb..4c54d2c1 100644 --- a/backend/rss.c +++ b/backend/rss.c @@ -1260,7 +1260,7 @@ static void dbar_exp_hrt(struct zint_symbol *symbol, unsigned char source[], con /* GS1 DataBar Expanded, setting linkage for composite if `cc_rows` set */ INTERNAL int dbar_exp_cc(struct zint_symbol *symbol, unsigned char source[], int length, const int cc_rows) { - int error_number, warn_number = 0; + int error_number, warn_number; int i, j, k, p, codeblocks, data_chars, vs, group, v_odd, v_even; int latch; int char_widths[21][8], checksum, check_widths[8], c_group; @@ -1592,17 +1592,17 @@ INTERNAL int dbar_exp_cc(struct zint_symbol *symbol, unsigned char source[], int symbol->height = symbol->height ? 34.0f : 34.0f * stack_rows; /* Pass back min row or default height */ } else { if (symbol->output_options & COMPLIANT_HEIGHT) { - if (warn_number) { - (void) set_height(symbol, 34.0f, 34.0f * stack_rows, 0.0f, 0 /*no_errtxt*/); - } else { + if (warn_number == 0) { warn_number = set_height(symbol, 34.0f, 34.0f * stack_rows, 0.0f, 0 /*no_errtxt*/); + } else { + (void) set_height(symbol, 34.0f, 34.0f * stack_rows, 0.0f, 1 /*no_errtxt*/); } } else { (void) set_height(symbol, 0.0f, 34.0f * stack_rows, 0.0f, 1 /*no_errtxt*/); } } - return error_number ? error_number : warn_number; + return warn_number; } /* GS1 DataBar Expanded */ diff --git a/backend/svg.c b/backend/svg.c index e3b1c47e..ebd396f7 100644 --- a/backend/svg.c +++ b/backend/svg.c @@ -112,8 +112,8 @@ static void svg_put_opacity_close(const unsigned char alpha, const float val, co } INTERNAL int svg_plot(struct zint_symbol *symbol) { - static const char normal_font_family[] = "Arimo, Arial, sans-serif"; - static const char upcean_font_family[] = "OCRB, monospace"; + static const char normal_font_family[] = "Arimo"; + static const char upcean_font_family[] = "OCRB"; FILE *fsvg; int error_number = 0; float previous_diameter; @@ -134,7 +134,7 @@ INTERNAL int svg_plot(struct zint_symbol *symbol) { char colour_code[7]; int len, html_len; - const int extendable = is_extendable(symbol->symbology); + const int upcean = is_upcean(symbol->symbology); const int output_to_stdout = symbol->output_options & BARCODE_STDOUT; char *html_string; @@ -193,7 +193,7 @@ INTERNAL int svg_plot(struct zint_symbol *symbol) { fputs(" Zint Generated Symbol\n", fsvg); if ((symbol->output_options & EMBED_VECTOR_FONT) && symbol->vector->strings) { fprintf(fsvg, " \n", - extendable ? "OCRB" : "Arimo", extendable ? upcean_woff2 : normal_woff2); + upcean ? "OCRB" : "Arimo", upcean ? upcean_woff2 : normal_woff2); } fprintf(fsvg, " \n", fgcolour_string); @@ -241,9 +241,9 @@ INTERNAL int svg_plot(struct zint_symbol *symbol) { while (hex) { if (previous_diameter != hex->diameter) { previous_diameter = hex->diameter; - radius = (float) (0.5 * previous_diameter); - half_radius = (float) (0.25 * previous_diameter); - half_sqrt3_radius = (float) (0.43301270189221932338 * previous_diameter); + radius = 0.5f * previous_diameter; + half_radius = 0.25f * previous_diameter; + half_sqrt3_radius = 0.43301270189221932338f * previous_diameter; } if ((hex->rotation == 0) || (hex->rotation == 180)) { out_putsf("M", 2, hex->x, fsvg); @@ -284,7 +284,7 @@ INTERNAL int svg_plot(struct zint_symbol *symbol) { while (circle) { if (previous_diameter != circle->diameter) { previous_diameter = circle->diameter; - radius = (float) (0.5 * previous_diameter); + radius = 0.5f * previous_diameter; } fputs(" x, fsvg); @@ -312,7 +312,7 @@ INTERNAL int svg_plot(struct zint_symbol *symbol) { circle = circle->next; } - bold = (symbol->output_options & BOLD_TEXT) && !extendable; + bold = (symbol->output_options & BOLD_TEXT) && !upcean; string = symbol->vector->strings; while (string) { const char *const halign = string->halign == 2 ? "end" : string->halign == 1 ? "start" : "middle"; @@ -320,7 +320,11 @@ INTERNAL int svg_plot(struct zint_symbol *symbol) { svg_put_fattrib(" x=\"", 2, string->x, fsvg); svg_put_fattrib(" y=\"", 2, string->y, fsvg); fprintf(fsvg, " text-anchor=\"%s\"", halign); - fprintf(fsvg, " font-family=\"%s\"", extendable ? upcean_font_family : normal_font_family); + if (upcean) { + fprintf(fsvg, " font-family=\"%s, monospace\"", upcean_font_family); + } else { + fprintf(fsvg, " font-family=\"%s, Arial, sans-serif\"", normal_font_family); + } svg_put_fattrib(" font-size=\"", 1, string->fsize, fsvg); if (bold) { fputs(" font-weight=\"bold\"", fsvg); diff --git a/backend/tests/data/gif/dpd_compliant.gif b/backend/tests/data/gif/dpd_compliant.gif index c269549d761e3c5b8188c15d98ceb8d5c6d8680f..1cacc7ed3b60415b71f00cf1fc914d4c04000599 100644 GIT binary patch delta 56 zcmeyXbz4i?-P6s&Jn;tOY=#dE4FCWCXJBB^0b&NA$VTZ{VMe{pmBLFI8LcMEi<+_d K^RqHASOWkYiVzzB delta 90 zcmcbu^;b*U-P6s&Jn;tOLWU0v4FCWCXJBB^0b&NA$VTZ{VMg7}mBLFI8Dl2Pi<)Vi u|CamyTR#8yLjCW>{@+XUznAxauU!AV`uz9W_uuRJe>Cdk=%-LnizW$W zHdK$#m&BIpdcIC1qtJEgat5t>deGGYGU9y1>RepMFnDF4RoR5B8BTH}O z(WD7ZW_mg6+r*iN(oM|zGoa9=Yuh#r8};f;mziQV`g-@>;l736K8~EIQoy@a7p4rS z?dHGBDI+$XJbQMYt2G~9tYVjHjl~ox)}>+F ze%(|St=_#I)zYnACiuvCTdeGGY`TC0e$S|)nSR<7K`fD0$aoHDZL z(G4em?R?qr;LTnCsxC&gX=u{4YY#N76}4Nor;o1gEmoT4+^=mLKMu+-aNfJe(skq3 zHE}`GITuHc9eeB5U3te%RyDQP%*`5Jn}JKm{&>T9Dic*hwdkHNZ@3bE|A~AT0UtunB*<< zzVG|}<@^2R>*utzu40cW^sMe(wce_ZHR@2azE|C9^CtReg3speP4ms!=%NiS+q<*P z?LDYf7%F#lV`+V_L9c?*x#}BBtGf?o6_Ux`+*q35U9hWLpxNx~jjg$@t8+haNpP~Z zzEyp$2Qmp#)>b!f{6S4ZWov$O*1;8Q5-eMD99hO2IdKrVvWyol964azS;hmo^0>1M z3RfP8iy&5Y?bw>8F2Y##wc=~Kx(H)6SC6r2>mroZULDTnQ{XV6C%)yG1uoPitS21A z;FI85aHfNEl73YFNU4|v8lQz*qQvLQ^=f29u6f2Sts?Wt7#hkv)tKCTM4pUW_KQ zS0_9(M5Qpu_r3)$T`?act1PDanz$WRr}dg3DEc%@23 zKFf)WjO3LHS!GXZWGXhYWV8X7v5~RZ$l%D_-iQ+$5m)B+!U0D%81BsNfw=O#GdBvZ zJP{)!yqGF%byFiVyqpSrbyp)ZyqYYGbz37-yq*l4^{0S?aW&!_t}NhOiOjm-Ky)@T z?m`6AnaIR{DD2}z48mwB!aYvJAc__v%;Q1~f@nEHdmivLUriF6BS=g}9X9R)bR$Ph zMjIH`$%Kp+qZ1OkCT;3fWL zLJOsxwW@GwVe2MSy{&yb|I8-Z#cBA8b{ZQ=9qF*s_|#DB;wp9p-(_C=P3g%z=3t^$ fV)4Q3+i(8@+GVTvYuLxs00000NkvXXu0mjfr@m8? delta 174 zcmV;f08#(n0o(zQHh+;xL_t(Y$L-Lu3By1P1<*4p(ipr!W;mnDV7OIoj1(bw40{_@ zadU7hWQ4#qDFjKGN^;}!tNT3uFBDo&saB%cg3KJhJ?q?5-Yi-J5C{YUfj}S-2t347 zE_#^#E}7D)hl{h>EsskYN;a_2v|0EmG_Fq5!5fWhc^Q~#+9!4cRXGh}{prau6btXy c7V@DF6Tf07*qoM6N<$f~W6F^8f$< diff --git a/backend/tests/data/png/code128_egrave_bold_box3.png b/backend/tests/data/png/code128_egrave_bold_box3.png index ac9fb05d1137d9890825740945f3479e6ab733ae..ee6949ef48279f36f09a1367f21e1eba4c116624 100644 GIT binary patch delta 191 zcmaFO_?B^kS^XkU7sn8fq#y*iEer_ zv)E$k&wf>pZ!(8hOV2m?%y@EMvc=0COC?p#&)IxD^ZVy^_qZtC3 z48B64kXhiRLm*wdNL@O#^w+2lJZf=0Y*;5I2fK6dkK>k3+6I9lucOM{JvQ<(nAH~h8!y9I=ZV*` rS7$dVThebwhmuL1?Yvww^{<&HZyY7&SNk8_00000NkvXXu0mjfjJH@$ diff --git a/backend/tests/data/png/code128_egrave_bold_hvwsp2_box2.png b/backend/tests/data/png/code128_egrave_bold_hvwsp2_box2.png index 2149dbb41a4b024dec3bc2e9a60e35b0e73b5e47..0c6382e4d52cdff5150502a356f20af9aabfdb1d 100644 GIT binary patch delta 190 zcmaFK_=a(US^Yv!7sn8f<8QAY2Op^O0e%8@HP4#E+v7NCe oZm)d)V#;#==rzHwnXaGUI~DM6(|-$XX9ghfboFyt=akR{0AZ?HjsO4v delta 187 zcmV;s07U=n0qFsdHh-Q;L_t(Y$L-g#3By1Pg<%;LX$-ePW;k<|!Emd1j1(bw411fa z;^yF1$OwjOQV5(0q%;W*aLOt({Xc~m)bzv%qT+%(PRw8J58Kdt+b1id@bIwmUOIflm;4t9)p|OBt1GkCjf>i<{PN4_0YSkKY*clo0 X8kqJb-&r=F0SG)@{an^LB{Ts5M<`zSy~{Df68%?(O89>0()z4*}Q$iB}OS>3$ diff --git a/backend/tests/data/png/dbar_ltd.png b/backend/tests/data/png/dbar_ltd.png index 0f2b2a76a8d592a1de261ba6943f694f0b4840dc..4aaa73104e33b349e8025a63053eb337b621c3f6 100644 GIT binary patch delta 193 zcmZ3;w2)~+M*Ri@gG8<(6$_)y8*ls({8#aB&m5Pd>}(*=$jKgMRXHc3XNClm*s3i> z1|YyuWL3iAQ}~D@DRIVz3!GXjPCR@dc;S$Wz@L_d!53GiGEGwGKB{uDIp>t0E$4|Q z9pNJ)mZ@{SCWIDk;OfxeG_l&KG+Xn+FK-u5hP;UfSghKo`H8iPDGG`G@7j-Wea0z($!P!i1 sx4rz7{_+!%5;iRsaSe@~68o7M)bL!wwScAKtH9IM3CjjpwD% z`=kRswG0;vGC27zxv%Kn=VWZEnf@q1l$i)vAe_RytR- z>|Ef!^qOqL>X-GiuFn)Po5sa6pNs9x+F8|J2a{qx$F;Z0dax=jYHF;Dy|;bF=^bTd z);A-MFK=qR_bjwl)#L8<9sA#|UecuP$I85}!ZqH%>B+ymaQ~pjM!ZI4|{Q z7>FH}f0^fC;>XLjG3;Mj#FE7?{wOQGeE7{wZ*5qvsl8O(gwnM&65;!&>#vg0+i<4b RJ`ETx44$rjF6*2Ung9!f$NRX zwwAm&!E6w-{>YW152UZS#xn{jZ(qnNEa~-VL9@yc^}wp~WM^3L|L5m53f#Bf-@bQ&!~O8BExTe^?|%OI$Vm3q)CKkNzV3@x=H4#Lw~PPc zc6e_6tD1{@4dlXF3oKJlPt%RwmUD9xPDcI4zxxf@R9oI1pB=g>TEK>X!Hq1oYu(4X z3@(M=J+(Q_TGH8vY4Xe_&&6xMPo2L&y*ux+h@QzOovOLk9VZu_^O4-0>VGZN=f%lQ zuVx%-ui9tp_@N#se&*~NN#Pw*QyCuS&#vydATsIPJgu2WXFT8t;4H}d{5!3llS+F#ScmDHM5v=|?XWpA6zu}GlcQpEp> zkJZ&YOIj0y{>|=nT*JwZgAeE7ph4*)KLte}jT N;OXk;vd$@?2>{2^&7lAQ 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 index 3d8a4377b8e5a8f1bd978f2f05534a8d2f27c3c1..dd3ec1e9e8ac004b37422aa2620233850a9c1b8a 100644 GIT binary patch delta 387 zcmV-}0et?l1F!>-Hh*PFL_t(o!|m5GO7%b#1>kc%j~k1@*NzZe!^kuikKe5bZs09I z$bg`Y3$na2?Z1dDAz+gty!^%Q!$ibHY%J#1Uvp1&4gkj2%-wDb;qNwv;Wb}x^KNH3 z0I)v*@TC!J77gtsEg3agG#lfhfmK*GXDdv-!d$H|`xT~LVSj9e8CRHQIm6@q%*32S zwqlAYrkG-iDW;fWiYew7n@PEklbZiMQyD{(53o@>BI3YS(Zk03ce8C7ntTu&*%J|m zs#6(cX55|urZmzkBFuRwPc)er9~dM#H9a|1L>RoIs*!WURBz1DJ46_+JauE$M*|P5 zrE`ervG-J%PJB!q7!(0^A)QYV1KLX}%yIsg!wrmlK2H%U7O5~l&8Gz%Zea3QUnW4A zZmBRoSyr&4d2rV)pcR_@iSe*^bN1g%7n-CuLv@k>=RkRy8{*B3>?J{lZATgAMvvxB hI!QoZ^+Z22{{XR8_dU`6Z~y=R002ovPDHLkV1lGntfBw_ delta 389 zcmV;00eb$h1F{2usc{X#*%U3peue!{pf!HjK|FVehA@Z6GMN@x0}4* zTMhv11^_-ZV)d+{{Yi61O=iu?IBQ@P=FNJ6*)A}<1?FynX@3?NTVRF-rk>C6d|xv$ z=a8+KVu~rIm|}`4rkG-i`Nn2c?&GNDf6i#75D1ASk!vIqn=@k*?ypv~|j7&H%NOEd=@k0?|@Q$iRP7Tv`WscqjfvhLVG3l(s?a8QOH>V6d-Z*bB@7 z3~E@|O?)7SWjggCbOeDD1!CmDf6`*yESqf56@NkfB(DH4K4l&bO9+o`4D(aIZu8+_ zIRLOL0Qk~~^+iK_NL|6GN!l08&X}5nLeCAvN@fp?CDQ@Nl7G2`3?*{}i#-o$Q8I?E zXcqXQ=~L-m@AYpc<{YwBQ%yD1R8vhg)l^eWHUF_$h5NXQ`G02`W9ah-_8^f2Jfh9 zsW89Z&j2{wz~py#kpN}-L52C%X9asRzuffzXoEg~Vm$1_>|f0KLzDDss7?~#94L2N xL%f=WlO)L8j+A+8^v&GLC<&OFiI_I#8R-!Fwl5Ocv@x?unS delta 404 zcmV;F0c-xh1Hc22Hh*jeHOO1nOCvCxCU!g@O8!XmU7JPv{ zfM6O7cA^70EYYbBF-I6sGQqIpKw4|Y7&pd=gRb}s>L+;xfblu=cw9nwYGat6^Ie;d zN6P_#eFA_#8nM1;XpgBY7&S@zg4r2UlThfnfmq4xfw5#d;D1~)2gpz|XRz4wfEFcV z=!#~6FPc7;?)9_&&BUBTwrZ-WrkZN1sivB0s;TBbHmh(SS26$ZOq&?`e1R=85)l^; ziV3!Sc{3l4q0bkwg%c5RX-1V5`TD1w{Zy8+M!eg2K{us5@RF`Ew!uZHR*0nUN) yur+!$3nxjCxg9C<*0`&=mr)WhH4`yy%nuDM`}0`qzYPlj0000MD z3Ux^lcq`nRoN0t0l|dIsvB4L3phm?5r;rE^&ms$P6?Wgadytdc%up4Zc59W@WpD!MQqPV2g`vZt~rRR{bzuR`NtAL+p&-|Y8|Hri;TjW*h7 zqm4G&Xrqn(*YsImjL$0LztCW$y`6%s!niKcJyBWE7|c&;S4jKa*p>c5!?3;^yE2J76n{Z}`PP`zd`d-0-S&;>I|wYovm_Hyd70AoUi21AXAv`&WGbpxC{Cg) zsLK(|l58XTbxP+->d!P0B4j2T`y$%EoB+EYqMu6A%>z&x z7TJsL^0f0Cz~n`D7m7rW^7g%ZRK!B!Lb3kMZ=kdz?+mH+?%07*qoM6N<$f+_mgZU6uP delta 444 zcmV;t0Ym=k1Ly;gHh-N-L_t(o!|m9yY8yci2H=00u-6QC?Gz^JQjb{(DvU(lWI->W zE-nIh!maT$&7szy7jUt`FL0nn#X?d@1c$T8LQ;jD`YUGs?jHaYj<(l)oa}H2s(F88 zTJtk0fM)WP8}m5NA8D7`0_wqF(T{~xpr4DVK(YN)va1QUNPk6VrCZ#)q6DA;OhXyn zz&9wPz4^AB-jvZuU@4+qBFc-hu#DW)O+^d*KL3Pcn1-{$wE3LHBN-M3j(n>3> zw9-l|{jcepz8KzA#=oK6K-$}>u~n1TDYze$7L*(FbGk6ne#~9!FSMD~54lV2oJu0a z_{ebsMhqaoyni+3cr&LON!{*)=obhqz_UaXQF))z?oo7urL%yRC7O!r6^fJS3hIUc zW{I{H{Whn|Nb1it5(1=^t=)_E?ER7aey41Bllt0TA*We^K*bjy2!s)B_NgyVScgbpuoGQa^uB mFaW`+vDJkV#7&K@X7VT3EOc`=9@(J)00004H z{qDfD;zv>dP2q5CGUGI(bY{~lC_^Bc7Qp%%sz_ge`8ZW1lz)%F`_Z>%MRCSJ7^U_J z9c2c{Mkvx}NB{$FoIZdjU?AjC`kZ+R1}3nGeU6F_6Y{^;Bl% znsfPU{t1oyU8F~gyx8q3t+digE3LHBN-M3j(n>4+ujz}v7++Mzx6ojutsR3cL%%A~ zJyV%cAIuMFQ-4U?ZQqpkOhdQ2>zgteQeKl{d(Y_>j1)nB{=t~jbVx->-R7O>4Fne9 zS(1sUyiRFzFM5l)vxo^xG8NSe6i3k|)a3|fNwyaKKBQA6^(UGL5i*greG_e8Pk`M| z(XTL%2o2pTv*^>^FxLVw{SbZ1<^d>mv+PB;dD!_4U{CU*+cQNXT&6-^bi2t6AYG;| z145qDA8H=V>DQ1F0C9a&T6dx@GxberhxY5oO3>F9eKj=dia$!ypk zg;w%R1|arKLv+S@CTUY6gmn5JuR1Ou^~q^d!eykJq}Hojj0wg?4BgAA;<~Di#r#|H)CpD!dHPiku{f+x&GvzwZ|Lvd1D!a|oIqS-fUU&nNj$@ok&Awg%l@dvf`?F1xzSNj5I zBv|ZMov6J$j&pTD=$qP0=M2E8pLeXb>qeD7bbt`6?M*HeneaYUVzu4269D;rN&u8t z@^9)4k^Ey!8GweNDQ!5@&2fKsxbH!bf|G*yq7l-+zYtN z6-!pcFOkO?Be*mR+ooK&J_xqCLfC0cyyr{UO%o@uQ-8(G&%g|TUg^~9SeArHP0p5B zZE{WxF7;Qa?M#S*6>VQa7iDPO)uTw7E^awtpG@4NappB3jNZH##QQ zD2+bf$`F2C_C`ki#;6;ae=Q%fvF&w}tcv6;=a^c(Ns%l7-i{i<^{62}gfSyojG8;9 zFy3=9VXnmlvz%bo6U=Uc=_VMSU``WEJ)Yr|-5576MjLrHvzg6oW;2`F{Ey~x>)r6| z|CwR3E6O6&uzzLeP*JynDR?_Dg2|TqEJBT4**P4GRED+g>VY99>sb*zI(Ua?xxNoi z#y$>=WU^pG@L;gRXJtHpgZ(ftcT85WmGB}6c6e6C^B3$MuX?7ilc=Z@!J$&dvq87L zG6kO0!zX$rI8+Pc*$BQi3n;}@EF~Pi7s<1s@bQfSmST{GNh%45uarES0xx0kYB8{e zT&1(w!+SOh9InjnY}8M)d}llqSQcl)_raKVrru}pkzN&mqX=a%tFFddQyvny5=jB5 f2rC$!wiodOvV*nj`E%!ITqBH^J}(bDm)8@eHT@#<;N|n81r!%wiU^n8hsSe>B&wx5L_h zl@XrIhLZ3#On=c?RMc&tbKVaOc{0Tz316cuI*U^t3%^xeJutZ^<5&_LIyj5RY_>o7)n*7IS24q+x(@dGn0P&TgW1Zu>zs4y% zutm0s7juAftXDYRnDS!eFSCAO93(i)FNW{D)-OzbNZ=DaNdPC|3$Hg_jpwE~MsOvf h1W*w+&?@e)i3vZI;2h*JOn002ovPDHLkV1hZr>B|5B diff --git a/backend/tests/data/png/ean13_cc_2addon_cca_4x4_gws.png b/backend/tests/data/png/ean13_cc_2addon_cca_4x4_gws.png index 301cf7eac0fbf26a0cdd1fce56bb09f64fe58a1f..da07981207c1b5f5f4a5e1525e3c92970ce31e1f 100644 GIT binary patch delta 472 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 delta 556 zcmV+{0@MA~1lI(RHh&CBL_t(o!|m3;YTQ5&2JmkgSP__<+AR)WmwJzdaE0(DZ?fPQ zP!|_RZi!zak27Y$X%5t;6r>Le+qe*R8j}Qchh)-RKvVyU`B!`ZN`0({RJv!EQ|WA7 zQu2_(j8Rnz0|FOU*Wm%TvBXDDAF{h#(qHg%;wX3L43l_BM>ZgL_EpvsztO7vV>_p2FHgTcmL z0qq=WVBZ6~X=-56z5}i%dliEgy#}gD+HY~IL<1xf6xM+$YCuiX8|VresNy6&h+aVh zE6ky5XrP&-fq%dTdd3Oro@m(g8VJ*SC6((u=Ura$gtMvZlB1(IZc7UHy{*GV&Kvg8Wp+Ut1tnVH6)Nf!axgJxBWc}Ts;sLGi9iFP}3qT23f2=AVu=k_GsVzQk^>`o)fP`!iCIpNK z4lm92E;T{g&Qn~+v#QQR5lS`JoHCy~VyayJg0i-iWbh>?hV!XIDs_G(u77@-WGXdhjX_hP%I~MR%$9)cO}uHi!Qq8qKhv2 zKkDrhaJTpesv_A9RTU4gest(*+`zQ5BMX2cS%0i59KJkZuNK|3!sf;gD@dr zL~wX&ws-Nt*nfMn0NzKk5JLzMh{G2)L0(`#k_GTCl2u|G1QnGyJh2J#75n>ZD~kID zJ&h_l^lX9{jJvD0c;FA8>6PHnuS^i5X}Lq z)8bpiMYm`+<)TM~AZCTftL`t#S6#o+0ERT}MddCU^E5^e#|k;oD+4&G=%d+;2mDn3 lSRlPB44@}$V0765zz^ZL&B1JiW-$N&002ovPDHLkV1n5s&Taqz diff --git a/backend/tests/data/png/ean13_cc_cca_5x4_gws.png b/backend/tests/data/png/ean13_cc_cca_5x4_gws.png index 5baea87d3d43a09a7411d0461906542ae5768651..75a604e3a888d1532b9fb0a7e99d16de2d481957 100644 GIT binary patch delta 463 zcmV;=0Wkjm1N#GzHh-{5L_t(Y$L-d!irYXC2H=00AT@*4ZeikAm_v;V;Z5FT;a)&p zt`PAOzeFBq%)+G+Y@1S$J}juYVzE=$sFLicm~e!+sl`Ck4z|_<2>_!c?o>=TqIXk^OPyWVH`9>>04a%ACU{Kn zEuO3WLwK_CNPp4;m6AX$!9$@fKC$)s74n{B54=$lqf)_}V6??ETd$wdKa#w?wW82h z7-%w~#lY69#dIL4Z(8Gt-+iPPLW^Nzy;`FO5>h}(Hegn&w-s7^ud`Q6;RA_LK!GhP zt5k6Xm@kyQ+8W;i>HsLPN43j$J;8gm8=M0+02Ju&%1A$Ti*rDCQxAq#^{2n00UtM+vEcP`~ZeJ)fc8>#W?@~002ovPDHLk FV1iw4-VXo( delta 467 zcmV;^0WALe1OEe%Hh;89L_t(Y$L-d!irYXC2H<}gkO*w7b_)}~!W?Q`2ygNx3-kuKTz9nAsu~A(W3RSL(FA)C4XD|JnNiGN)5(_a>KcF z%WKkH;+3L}$u^^(V@c(@xDtMUys+9os9jk9*Iwe7=4Q-nBekq0=G1gK(yFVjy6UQ{ zuKF7F0r{y@A3-UzW#t`LkEZSiPb&@brkiQnB? zk@OV?nvApSxtE zaSmref79csKri%U0bGoDal7dVgq!+vh7KlM00UtM*W?2L`~;Wj(X;%C$P54g002ov JPDHLkV1jKq<2nEU diff --git a/backend/tests/data/png/ean13_ggs_5.2.2.1-1.png b/backend/tests/data/png/ean13_ggs_5.2.2.1-1.png index e199d482c36b650bb83c35e4c7502d715f701b2e..f9335ec69128631f1a7b7b603fdace17dc7c46cd 100644 GIT binary patch delta 316 zcmV-C0mJ_D0`mfpK!1uGK@f%EzxA`I<8VI5P=KyoyLRo`wQJX| zUAz7#x&;9BUiEK1gvw>O601$3a@FX}#QIu*nj z6yl3bxm6a%M>&zS-<)_Rq+g#~#Vx9w$lJdoB%TTTd3tQ%YTx8U-ZqI{f25}o{J>@S zOEYoTPn&M@S~a_=JXwR3kiG3HZn|o=hAqcQw(RP=ez(aQ%!gUbH~jyq7wxRy2^qt-~$M@L0~63kivpV zeTY56fRYJ@9S6I^;>f9kj_SdeyjOtg=b-(5DdqRJmicpd*$(@C32BZSIs9C!WB|> zDv@%scZIzbpd3`JB@h2{?^J@EP9{PUOqpfW(2YU%RIUuJ&C{WB{zK`ZK+pz&9L+ zzcdp!{d&>smo>SnJXwR3kiDUk1OEb$Hh(lpL_t(Y$L+~6Y8ycmhw*RnH*Zr6-gW}QXLx2B7Yn|Mz!%T~ z0va$RjSrOa!L~WX9$~@F7D7rP8JBKTO!a;6161E5i+F)EQuPH&3z>IWz;Pc2*6x9>(JC|PD9`O{U^c6X6gGL_(|$nIj0Kirf;?9!U4 zY#fS=F!=yGmm5wzq_woliRDp7WVwQIk!SXV^yf#bSc)nmiaZ6w0+~ILe(xR|nA(es zC@?gL5B-&&7fY~#<9yY7AfOPRdVf`i2~xYMET;xJqx42N96;RkqAfMjXLgRErd3OBwVIVG1d3M4^aJ>wA-!jf5z(PkLh)scDtAy=-Rbw z*REZ=cJ11=>wlux08l?y|JJd|kJE)%(<~|%os5N8-yC=j`G0Y`q*%3x%4L`>ozqRr zNlutTDn=!8$?08@-uwW*m#3C3?8{f95|k{nkbHYpwar6hl}shr7TH4#@~4|ph)tR^ zm4!o*5hfpCyO$eIJf*p`%9+!PjL32Y&mqt33F-H@RP8NWV5O4NUF3 zj3_WPQoHNV{7iZR8#qo^eT3AY5TE*ZRfipjo62%(kTXi}gu?;suB(>RNat}@Iuj0i l$anpb=G0&r7O@Zx@E3!kr>+TI*;)Vq002ovPDHLkV1g|erH}vs diff --git a/backend/tests/data/png/ean2_box1.png b/backend/tests/data/png/ean2_box1.png new file mode 100644 index 0000000000000000000000000000000000000000..08e27c6db7605ab4e4e49b79180a4835eb686915 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^WGR)?@f%hIXFI~yh6dWsdYM?Z{yqO8$3;rg6+rQ#Qu94@dq zT$#rZ)yi@~Lyh4|pv;|%bMIcYjoJAu@9A?}W8=-QKc1;P^=kFiSN-$j^19w$K0kY! RKrqlI22WQ%mvv4FO#rFKLZ<)# literal 0 HcmV?d00001 diff --git a/backend/tests/data/png/ean5_bind2.png b/backend/tests/data/png/ean5_bind2.png new file mode 100644 index 0000000000000000000000000000000000000000..5449192aa17fbef480f7b8c2925b64ead9d7e8a9 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^89-da$P6U+PfgDUQfvV}A+G=b{|7Qd4_&SUQZqbV z978NlzrA9}b;v;C=*M~v74HqJn_oPO5je8&!s;dFA2=)<+J8A5Zwh}Q$Q5hFQF@_8 zhmR|-@^(M_{q42~R&1QQRhBVf>2sgx#}jVtIUu;)>C(L3WA2iEV)?4Cat@#63uL|& zynkuSyGcu!?@mfNnd%^8S5~aOuFL#ua(nlGyY!QvTi^K>ujTtFMl>m=5VtsWC_=ec`{xn z3U9<^$*GEFo!@A+8I5G`@+-HIc2{#hXv@z#Dx{D?3Mr(JLJBFQkV5{AoPY42dK0l` z->D~V)YY*`k_p9cGOc5`Ns$NZpiJyBho2?M6Pyty_F!=6Q{)j-LLl}CSf+`^yh0#u z5D_ksWhL*#jZ++* zXjHuRp)R=4#gJFXBN)1PFlm>jP%0}BI_h6;xQ~Ch=>X!PD_t)ib=eE^R5Jj0OOpya z0Kg16y7mH5M=yrp6NEgZN|PI}gmsd@Q)o1{NmAg+JU%DM0)NH`CCL)HxfiQ7}HL6vV+{38A#1$CqyBN8{lHiFecrJM0@2H<8P4`=*PKoDx>ErA60&duV3|03_!kj7 zrq*MyFA;ApsmGu%kq;(mj2LW61Pe@&453U`T-tO6u_9U1et%3JT$%L5ZSoLOk?e`X z@T1spP+r*Bks#ei!lXGFU6xS!{B*NLG?x$hyhHVMgSj8y_(hZRu&Za}q>96J1i# z7DdO?jBG?dv3V9o(Uy_@0_jCPeP9&r$czi*BI?s|q3D_57E0LYL_KmLQb zOSB+F7;;1+)(8>09QhEPsVBlN+e?%*cn(nINyTIM`~}3aWPd{lCgAd9i*HPzN?Fq3 z+eu)P?`3!)_jwWtn15q*#HaC!-5};kf1I$xTWkC)-beP&wVuwl*ZXHFq>w@iDWs4> z3Mr(JLjD_hy}|$FcM&iG zXFPlZj-yM_7QfFHyd)le54wtKAr0000g1C9hCiBL{Q4GJ0x0000DNk~Le0003R0001V0RsR40ATcQXOSTlf5S;c zK~z}7?b5M|95D<4P#J+Qg}^CYT$o?b;bseS&Zi6s$&EdVlmugpe|a=ew@1;9DT3sbQjT0fDs7I?)jqRGilK}q8(%g@ z9$jHqqNG^7Gg3HjkBp14NX)6!;DV`?{niKo@Ogo^N3>daee@RhgzQoXK8?=wg{e3O zfF_g5W`9~kI5o#*1Z>e-(aWf{n%;k;Wi+rRD|Q(PYckz#5vlHzCe!&ve}wQw(}$J8 z5gs+|23$e)J8`>=^kqn+cCWjfsDieGKXn<~{dC~q04Y;KP$<)P?00000NkvXX Hu0mjfuz==1 delta 464 zcmV;>0WbcJ1la>2iBL{Q4GJ0x0000DNk~Le0003B0001V0RsR407qKxkC7o2e~w8+ zK~zY`?bR`A9Wf9F;9m@AT?|pH;*re}=Ap*LlD&$+7w`cLZ=Kh^1ErKvAdO(Ju)e{9 zn=OPlMVu7QS{qV$Q|vT?Utb|+1_WZ0o79-l#~AvA91~vE`w^2HN!hqKN6N&x-;iW+ zIgKVEK1E|f?s+@Hm^q1QX1KWtf1J~H1oS$P?Fg?1???WpzL2=SZJYkdnUsaI698t? zn5rj0_OS%e&5(!7rRrpvSs&k}23{)gHqz|{M zE0I&wR!W5M7lhQsO6e^GS{nd?Fje8M)R*;TSS7CSB`4#WoMu?!wYH8OXTKk;jc+71ae#?4_~ej)UZrW^i`|xBnSzzM1ZzBXmtkgaDnv!3#B!`khws3 zg|KE;5l|gNj@=TmG%=omCbnZUwu?m6$hZS)a24u5u73dZbe9}dj=`(|0000(A~bEt74qCCoyKcnq`1Ap(+rHhVwf2aLiEEJS$q#+KZaCG?Qtib7{%yQgb3#pm`bQp zmq*s;(XxbIa-n2ntzmJL{m_$0f6W+DDucziJW77Z2~u*-CGiLu&Ekms*cTSbDb~Rj z8|vaHkgx1(lALPrRw|d}k@YE6NhQ}Y`e;W}!qNx;-7WC)$UInhdh{IUMC@~nArId6 zl}+^wpeaTbyFERG=-BM%5!jJ)qJfVysCC-BdTW5q3_7qjP8@JGgM_uQf87RHokyyB zr;Y6bKynrlK4|k=G@$0tPi-~_0#@A&8owHD33z$FC;bnFIi$&PJ3mYfeY=)+7O7&p zfA}wI+cbf$i1$0Eq$PG}A(LoByx$hp9f=#XY8n;d-`hes z5jWirb(lm4;v4#|)h}X551vGyfVf&~wF9vK2G`2O@45!GHn(UzgDjx6G4qHz7;TJ7 zfa(nRx|=|%gQKIt35cDsB~Bp#tct;Bpn+LQbMN^NsC%tUXTz5<3;+NC07*qoM6N<$ Ef~juqR_~06WU%~eV zhBPije8p|9h(7{XWUsIq!OX7^GXo;CMubBiNLZtvm@XzON2?^ebK;vmK-c;b_{H1iL<1$umQ4J5_Y7sumvd0 z5akQf_bmZxo;;A=9F#}qXUVbFR+Pv6+*=55q?{+D&Q_L6N1$s1+yX(Le}%`T9(_Cv zACjVJBt=t{Dbh+-vXYgoWF;%PDS6x1fA4=HUsYGNOp*s{x_puxsju42l~kt@p_4qE zEZm;NLLj>_$w)5W?-1k00p^6RN1yprVp zhiWHCOLC-Vt$vaqM92jBQU+AnMynHm%Nf>%(LZSeXw6qLOcDcV&Add&gEh0N0p%I8 y^CO}>EcJ|6pz>_GYD@r#>KKne4$eY8O8*82g`Z_HzI?U-0000Q}|en#S}~- z6h>ieciPmhjW*}@4v`Y;@f}^|`JFqNbM8eM6-t0b#v{9N+b$wT4Nky|Oh;*GQx=g& z#7UeiGCIs6>WH-Px$7ds$TfEBMbuFs1!s}*2&XiMkDWz~TCn@xbCEy#`rZ2r!uib+ UGcbJo4gdfE07*qoM6N<$g6uCzMF0Q* delta 168 zcmV;Z09XI>0rdfp7YZT-0{{R3$Y~bwks(5VeMv+?R4C7l(ZLPFPz(Z4R$vxpVFgxT zg|3ioduo;Be=EVacd%rG&plY>xMwH5W-o9NGBn9SszQpDB!hrOOxdIcX$r?o91a2% zv~0^Bq&UqWNI@s$|E@*KLJ_4zgCK=Thm;4Y3d&)8`q)*#A|a*x_AK(EuQ$Cv%NGq3 Wy5WU1%GJsM0000{!m5`aMMT-ML8GVekVX3@>M zYwG~ODFeWlrb>C^#b*spF-ystls86ivWDVq);K(6%>=ucGk?<)jEBwEnx(v{y1Y5Y z_e@wE=Jl=)(1cEeX-q>B4j)Ge@A-=xT2q zZL74Req`7x>#i9e)y|Ct1Kd{fC*L^KnB`M{)Wxn9C1l3jZTok~?iCX=R6g-VFfgHTWu8 zpwVW!tStk8iDR<_*J&_b>|pT0q@&T#W_V;(;Z0;D%PDHLkV1mm!#Uua# delta 398 zcmV;90dfAj1G)o{Hh*tPL_t(o!|m6xN(3p&|=b3%)`gAz*XG;aTi?x{Bt&#v)UN;e$z-<_`eJ!$SJ!7g;3d#25+NJ`Ifn zpo0N`UriPB#){1v9Aj3JH!*K0TxSjYW!7jsWz7sbpEDOn7=H_uomI!YsZ!n?>TkyN zmE%xMF~t;9Ofkh2Q%o_%{A=?b?OEPW=3C}J#*n|QlA!OYQ?C&$c@~42 zlD#>{XG4BQ!GBU>sbM(&U@jM1Jt3_$a70dcn%mudg zy+BqWkms7Pkjju((7k~njf-XX3U4;>G!^QfMj_A82O&W&n8Vmb`s_;breVTg$TB z_Fe4(7_k5_Ys#25jvcCm0Xq~a(=tp*n8;8vZTpJdG$J(*Qvf{{I>KY*<_PVHrZs8O*YwNlg+m_uctln>&t$)`9Ec3 zWd_2Ym}qZgrTU3k!c(VYb2NtbW!%s(F}Lv4kvs;cA;bl=ZEo(JtvwduXx8x5X;FbS zgxJEKUp+q9iGSI`Q+Fm58VezIsBCjI7x>pe45GzAyn-|GA5)-rVMkmCHu7gQm+wpk z_akWH-_jIuqsM;U3;@Va*z2HyMw+UvwFLkbrly6h<7gb~(cqnlCnF!tdNcy3f(2R; z$CljWuiMca%%JXeKpmuvjs^gz-|_+g+1y7J24Dd(!WyavaGL!uoibZ0WSs|2H<~~AQ4dPD^)D|^(nOcYSqHWWSqY1^6j|9mw(%sREhWn~`Vc+$fOV#u>-u#)?yN7Fhq{%VeJJbmzt z&X8wOQ19-#QGcz>2*=ZVuMsSH7K2L3)!gA%L%yP5DX}y#9RFZ;6z}QG(ge$~U(Cnf z%pT%kSoTqL-=3CwUJU^9J?v)~Ksu@R%}Fh%YZGC=hQ%1mynNr*W(YUay*0r!q(c|i_hs8YCiTMmPq0`CG1pwODya14&bzn+B?HxOg7H0srxBmnX@lkYFeJKL~ O00005l1IYuBHh+FeL_t(o!|m8HP6I&<1<*e-nlu))6Dbl`Fq$UCisb+tBBG$8 z*pdPfqg;q1I9dssNV&ouVapUNpcp6?5*Q>ZG_G8{!v38NAjYAJ)V5MpF>aY+zirzM zM*x7GPj-YCr239JTjo--wFVE%px&HH9z8PB1!qy%1RZ0SMSqXc2OYBL3}LE1i_XDk znY01dT^{Z7sUbM!Ec!axxre+2maEQbR<7gv6B@TC(rzqDwWUG}Ews==3oW$JLJKXl z&_e$?{WudzJ~}>hM*fBxLkLWAN`q5|9Hh<|4Pi!7uLh@#W*=q5IFJSO9u>*Lm=Mr2 zN7Oc^GsHM}3xDp>qkCvXkjQ@X$J!N2xTgnU_d@f!Ct_j z0%Nst>I3*VEoNa8fl`Na1ceTU*$sLfj4j!1*l6jBe(;k2vjU(xv`SqkZL7Lx(!;*% zcB}vZThid-2Khdv{pzuhy515Ktbmdsg)(|(E{QLqFp9SxcYj56hBe>Z7tu>FCn}-~ z_)th2_~oID-j-7XBl#k_c^r_&BD&fhkcxJl-anzbpG&t(D(#*st+digE3LHBN-M3j z(n>4+&*|HnNb;8W)EoH?>SBO-1d{o~h~yDYQi=h+M?H+vSd)l( z7a412#VSqd0)MK*MHDi|3ki%}WV{@s0@dL>+L;ABlb{cTfM;d}j!_p477$2WY6v0M za&b!UGW`j=Mj)Zs`m5_q>0PZc(;Z9^NM`WfG*kbM{sI8^@C5sT09=ANCw!n?roUmE z6o3V2{<=va@AxTgzNC?1ga8Qq-}I5*Pw8qqo}}%RE*bmRQ}hoKDdgu<;}WR=0000< KMNUMnLSTaU@WSN) diff --git a/backend/tests/data/png/upca_5addon_bind3.png b/backend/tests/data/png/upca_5addon_bind3.png index b6b976ffb9114a7aed99e78a5c457f607f1f7689..76d9f8dca5d7db85952bcfb7811f6c114d93c881 100644 GIT binary patch delta 417 zcmV;S0bc&h1I+`FHh+RiL_t(o!|m8HYFj}N#_|8MVbu&yy9R-;FlHMUkGvcphY&7Y zrBIn7L~C>*A7RV`r!nXXI>IYeJfajE2V|a-4Wu&rRm<{gX1e(}*2Z|F6jGYH84X zX!&*dlzuJr7L8e8!58^>Td03ERw=;j4!z6*7l_zhq2U$%Ug#5goduSJXixKW_|?Q@ z?e_vVgsbtG_4gjn)AiqJKwTDCAy{CRemkX`?R1uQry8_>9M9387%SSBi}Ka600000 LNkvXXu0mjfv!2p0 delta 416 zcmV;R0bl;j1Iz=EHh+OhL_t(o!|m8HY8ycm#_|99!HB@vYNrq=M;J5B77NNz9^?Wp zRTyiGTOT0D8L*S+DTG>H#NA%tTWr0;## zg|N304*R~}*#Lkp<=DgxIe(Y#@Agt@rIl7% zX{D7`T4|+~R$A%DrS&%lLO8x2%Hm&}ojRodfi}^h1}A=gKavb?l1g+8hF1J?JCY3T zd(;BVqHhMv8h^Z+CR)}2t8_{i0GH8=T7Cd(o0!`f^#GruUZ~?6FgPJMc#k$wQHO&j zwSvRt=_$RH=J2c>6hB3K;c|)H7n)^reD-Ny@o7*|wWAI;XzO z5yCWGpw~GAASz7nx^Z`F68|?{=iZE6PmUk ztb6oi%~lF6w9rBeEws==3oW$JLJR%R>Fb&(_WIIuYvkWhS4>c`D;Yvo>?{qgw8C6$ zxfw!M+EY|XX@3x}=_8HU%2lZ8RTE1;q;palqSxUr@>LA4g*x1wqDD%?g`pU4j9ne2X+mAccyJPrho;%P2!Jl6 zGigg-AJTUDa3wXZW+y1D#;7RS3kua3y-|~cMd8b6uPSL}*?+)foK9G~Z+9ShlumIj z3z%^_$NDTVNu#vFE{+1z@m^Oiv>vC5Bik#!0Np-xUoqv z>jlrFa}mx_lN9xM2_{#9@5eG}NH;zGiQeKRNUH7E+n&msu}(eRqY*D*g0&iZYTwXb z0OtM&`W+8b#Px}HwCU+@belcQk=gS$`~Dq2q}3=*4k{Hq1nf(CPw$3wxjS8?^^h*w b=S%btj;iR{1MdFJ00000NkvXXu0mjfh_%l@ diff --git a/backend/tests/data/png/upca_cc_2addon_cca_3x4.png b/backend/tests/data/png/upca_cc_2addon_cca_3x4.png index 9ac85d775ae42345a4d31d2f6afbb9d137d614c7..2cde13bb17d3bf3f136a42d75dc445591326d63a 100644 GIT binary patch delta 473 zcmV;~0Ve*A1dardKYy``+%OOZ;9tz)ZNw_23UlsKPY{GF#QIeh?gjP%4y+}RG)JB# zk1)nXngzW;3O~ZaHd}~uiuF2ia$pzXHicCQ%~#9}DrNxVQ)f82(~)(_F*fjMV)R-t zoVPW{RGO0~IvzZysKK!_QQyvplnuEgq`j9!-Y0G1;Z_EWSAP%TMn+yYqxZKo|66~Y z(R@k=<8?ea(p++KP4o@`WHV`$RFj6J4pSx*HEHgI!gS878Fj5^n0$tLm|=D^OgqEK z4Aadp)pQT%{EcbjnuZ%$%wiU^n8hq+F^l;JW|(97*JkqPOftu;q{FrlOXUp~elF!w=hcg;&u0nw`G2v{v4r7zS8Li}=-WB16IKw%= z8Z|N$h#2*EVy%9dwl~9OkO9C7>NBJM1ZeuYYU{v5Xi~VWp}wTvWRTwIk;w;Re=~Mu zEC{Uj4PYr#;qkJ&@W>Qx2QI@4U{xYimvA{U=J*6I@B~<#Gi)xV=xhH8`$><|QzTf> P00000NkvXXu0mjf>sI36 delta 473 zcmV;~0Ve*A1dardKYuZ++b|FZ@V~gCEFxMxJnBxJF9?bU5q%YXgg15wL~WpB=YE_E zhSw$FwWB{lF=WYLk`8g)x_w{|kCzUS8N%KO+)Ka;=c@URv_LHMTn3%YgB05P$AuIp_B zn9BsS9k1b(zcFrHS#l|}naylwGn?7WW;QQi`aYI_PbPo&BvXw2bcTeK5r=w1b&l*` zlkd-vkP6~ZpMMukNQLzd%bQrjS;JAQ#CRk|eA2}#eYD;oznQmi)*u>{7?BwA*Eh*jE{EJ`*o8qOL@UcU>fB_?c^ zH=_n-0j;CjeI?fTxoA4mPX_v$9GR$g8qn%HHBqwus8U}%fb6L=JH*bIfhl@p{xI3V zFf=03m#dLg$_4|B27s_XBW_g-7@SoKR}%&%uTO|;oB)FjA-`Uece(!pj!=v>FR!3- P00000NkvXXu0mjfZED-; diff --git a/backend/tests/data/png/upca_cc_2addon_cca_3x4_gws.png b/backend/tests/data/png/upca_cc_2addon_cca_3x4_gws.png index 83c9b2df1ea972ad45a38398cd78dfb541af73f1..9c94f8552761a2681479446e225e6ed1ad3735f2 100644 GIT binary patch delta 485 zcmVF)Yet{Hz1j9C4h;xeFb>ieeSA^RXRwXoFG191*0gR8M;ph$n>x#Rsg-6?UUJIu6 zzGjG(Ie4OB?>TlF+>NHw*E1qjOD+m&?Bd?p;`FooG?R}il ze29DFb$4*2x#H;B&N~2*bCwYs> zWyGcwOT5ik z401MlW{Sz!-;A9Z3j(WM3s}ljcsR{2JTqlKf~)WXSQQENDO}Br86LqU9s!GEhV{vm b=ez#|8PSwW)3Q~700000NkvXXu0mjf!%gGw delta 485 zcmVtl_9tVyuY~A9b}%AFX#NZ{{tW zHHbzfMkI!OHbs;l);lcI)qH@n25muL2(gk!Q$+b@y#sFMJ)AX4D#A*2#42q}5v3Rz z4QCA{uipjL6B9P`n^7Y(gVs@PzY=TwoOM?-bO!no9A25Iwi?jtJ9SZtVQZKyK=ybw zTg0m|BU25={9%fbVQ566FBc=rRE!!J4FF+xLVQp?U~p0?Tud05vOOZMa0CoCgz|Ds bd5!%StjUnB2UNH?00000NkvXXu0mjfZ(`nG diff --git a/backend/tests/data/png/upca_cc_5addon_ccb_4x4.png b/backend/tests/data/png/upca_cc_5addon_ccb_4x4.png index e29f97d7f6e691938a2aee5c4158252306674341..ec9c175e514faf5080bc12d122374529b812e7ff 100644 GIT binary patch delta 542 zcmV+(0^$A21jz)DHh=y}L_t(o!|m5GirYXG2H<~qi`)#Jlv9XRm--I_!NuUYKn`Kp zHiZwcV2MD|EIG>_VT6h_245hBjv!FuLab7FW3omIvuWahUODp>^B%95A21x^xDS5p zgATsO=)LQ-VT`z}E1=y$2e{E=AJ~u0K5%S|yH3i%NAD?Kdw({=$RNEK*Igy`o$Dm{ zf!g~q?z<2h8aG@a1uIACd z4%;H;2~=WTcHH;`nnhJTV)HqH-bAU0_ES<@3s6O!M3`(K)HMy8eb*b`G&7y)OlLaNna*^kGyMyCjt%EHVP5-^ zy@4*`h)of-a2Jn@xCURPrX8^ds%|Xn>d|woI>)(iR`&S?! zPSOm{XcceeT~R&>GaU2ZR83JSMTq)`P^+J&eWsT=E(3rC)K{YZ0%-ZZXzP;at4q3s z`Zhe%4Dp%jDVm?D{e#*mY9XMi8o)}X%DYnvLJP6^|61+?8O4?8&QJaV$sp zOZEY(zZ{W#G{nByP*cLZOUvgYl8+U!Z;nOlW2K$NVgwhkT5*sfGS6AaT4E75 z%7kR5sD#yuqLZJ!=!prN#cwL6XaOmM*nTIL_*t}PI_`1u6a%Rswi1xy2el!Y%h8xF zLHcl}TZA)JQ?$BJ^#?Umlpzs_zMW`VMKe`JB>?#6Bf_KT0fnQ8{zUy0Et>k6p>-=O3B+Odcq})rLJkD*>}D1O|#I2E_9&_UFbp=y3o_; z@|y$B=$GR3QmD*ZkJ1z9DvWIMpq1>xVHK{CH>qhyHhIXD?CQa^JGRC<)<NYE`4PRG`e9122qe{omAbkI_*A~8p8?qFq<^$*Kvj2E>S|i=h<*g1&5|f@wt^x1nSy?^$u9VZv$AWhvLCG~yX z%iu?+y`S>754m-w9*>aXm>tOx(mYS+)<2y7OS#rYyJ6fKukVLiY8TvCxA(pVAXeB_ zRwc9xsWIKUfQl~WOY1%tP#MV&xUU8DQxy4zi_@ZG$z_(rkbg$3Eu>e;R)t}OY)xN8-*E{`Y2CK2-S&g=ZM)EgE_9&_UFbp=y3qI0 zArP!R)6BiAo88IG2Z}iKu-ZgZY1ZT z2az_~#%$-P0+7k8FF}kT*{q+bn4>F{isJewD1NW{Cwkaq)jkHPqqtU}#4q_w)f_!R zn#U)4O?;wyjy5k;|3&Q_bts~gKlU`AB|BHf6+pP%5wFAunw>~tPs1Fox<}$UkD%E| gs{P*8>ld*80Ou%9#d39K!T}%DqOJR{^cU%*)xySb>meug?SDi%ZhPrU!!i5VLE?l_qf9LPnC{t7N7dAtq!3`p( zNtR=y!3|DM5*fxgBU+EvmKj!}Iga^;h&QRWc)UcjAM+iNxzJhybBW@|d`o2MXq~PJ zKiLx5y7cP$CQa4T+@l@!qqb9wQ8q8st+p`1lGvQ{?D%4xWDDwPx2kZN+k!hb>Z`s< m3YV=}kdFo4=>mm|&OZS|ui{IuSo{G100007sl>fFASIzCVLh62F?xk z069R8Gmw-Exq^?dkYQrZ4lBl@N>Uxc5YFMLzoe)t`!d!UozBH^$+q%zx5zxRlv*lO0$f7H?0T zg}dU*Ut1BnBWK!0iiQ4q%Q|8vAOuyHN75KWc(!Gn-O@G7s!0X%@nEM6dGj`Lt4 zX%=#YJ;Fj73yCQbkkwt&q|2N32gA%a%>XW49-X|GRMt5Fs5#XIOVO;&D2*_+ZD?SJJ!Y0eVgYv26#KfV#S%4Hb3APm|%xkyf{hQe2-%! z>J!}%E_s9_l}q|537Px#07*qoM6N<$g0=pkiU0rr delta 338 zcmV-Y0j>Ut1BnBWKz~XDK@`UE|75~Wgf*LT3rVc32L>cXAXk~f19*TSZ^;ELJTEi%-+66!rNG};!m z-76VbOl`Y0cFjO6s@l!5^P$Z9^_Q$y-ABG^w9`#z6DLlbIC0{{i4*^KKE91Q_DcT7 z%geke+S0Un(P>B5$0?52qAg8(Q*_#?U7zPTMtD2MVzpB*eZI#rQo)X~c1aDfBLu*C`F25EFC6*?V6e z_=u_NB(ojX=EODklMg*oTAMBBn!SYMWbN7OCj&T@(R;6L$MpOlBPldG6o1{~D+9g6)Mb&{lcYiNjcmD=E^Oty(_G87};b^b&;uraogYx zgdBGF8Vn{;Z^3 zIAi*$)h~Dflc;>oFk7vj;J-lwa5L7d)f4|2H<}(AYU<@S{F;o)CvRP3WHw7kQcZz zg~=`1m%375xN8i01wTO$Y~w=MDMH|~UhP)r5Li_b9}M#|paHB%UgF>wA&LZ?ocHBH zj#!#Tlh|Qvj*?TqINu}2t=US-$*Dgs)^5#Smfm`|9If@6^M8;sdv`>(e%P4pFbIO? zC0e^R$04SeG>eaMV}^TkXKc%%_;`Q*m$|jc&Pim~1XTcdg7ag?W04>II9I8_Ek?92 z=Ap;|;fK^Eragt1B6mE}zAN%~o*3PIiMiSt{493PMhw03MLwV{vs_?PiO}KC=vO@R zB$#Pm%1ueoaerxIR|a~Cxk;+IXN`lV8{hcGH~v5Q&6Yd&?OkC?ev~R1&S#k?Kkf>A z59J!|gMmO;Y5JQ#LO6^w9@lK3lo)e0e#SRe z8duEEhF;+m!b<6sQSA&J;J(5Ds8{@Z>A9z10NkBnxh}>%T85l0&XZuaBXb6L-5Mo9 fR|Td7oCNy?E$$*$1>a3L_t(Y$L-atlXFXRFVn&GVLCe3FMrNMsoaMns_Tb^*$smr zYMqjEOLH1hNkyylDJ{$hZ|;m`InF-bpZ{gu+SL#wapF>(TU>217}o*lT5MMLLcd%F)=d^K{9-fk zFv|uJ$TRHOAb)~mi)H0K8``(qLe&;el>yW2+Q`{sG;wU{cwnV`!TiI}PXvXqQbsvv*tMZ2gl{ka`~@2^^n|dB z2Ebi|l1NH-uHh-&0L_t(Y$L-azY8){T2H<}(pmi}=?G{JM)CvQ^#e!aC!7p&7 zizPmCFO^boU^feT1wBC!T(gC^b&MnKPP7}O1-3Q*&J$y}Z-K7H+-wYfH5u4c*@&T6&cM?m z@6iKkfra+y!GEE~rV*h%!osthcoLjw2UF#NvS8q)iCr1!-<{907*qoM6N<$g6|aB A(f|Me diff --git a/backend/tests/data/print/bmp/code128_aim.bmp b/backend/tests/data/print/bmp/code128_aim.bmp index 60469426977e41c3676d2e5ec2b55ee7bfbd117c..54af89bdc5e743dd3929346406d27e166e400713 100644 GIT binary patch literal 2382 zcmZ?r_2Xm!13Mt80mL0ZTmr<5K!^^QfC3==|Nnnn literal 2382 zcmZ?r_2Xm!13Mt80mL0ZTmr<5K!^^QfC3==|NnnV8hSMZ2bAa`SZ*N{+tIIG%7Y42BYaP7&D*aO7? diff --git a/backend/tests/data/print/gif/code128_aim.gif b/backend/tests/data/print/gif/code128_aim.gif index d51ac5a7b99c6202c5e5edd3d99d498fc302258c..c7e7f7b4e4015048f52b9b4c2aeedb4ff5152c3f 100644 GIT binary patch delta 20 ccmcb_b%|@kM;68@lRvRUu^D!=GB8*J09XqK*Z=?k delta 20 bcmcb_b%|@kM;6BL$)8xF*b2K?85pbqR;mWt diff --git a/backend/tests/data/print/pcx/code128_aim.pcx b/backend/tests/data/print/pcx/code128_aim.pcx index 899c3d352b6b085d29e6062e9edecd1f50cdc471..99df00f855f76aadf5fbb2af9081a9aed9aba070 100644 GIT binary patch literal 22976 zcmeI)L2AP=5QSlxQYbx3Zr4M!*Q(-}(i^2-s55ay+)Wx&0$qFpIinGZ%tW5|TLC>k z4o@Y@Yk4WVVK=0`sXV-u?Sn2ejHR|(#;6}r)1KORu4ym6+NS7Bf3~}w?X=T37T>gv z&Ds{HWldR6o|eoYvWlE(703m00e)JTk|Iz9ia-%40!5$*_6zJ6ED@jx6oDd81d2cr zC_+93a)Df6703m0L63lU1n&sm5pV%6zy-LVtD=9CZ~-pB1-Jkg-~wEL3wi`_0WQD= zxBwU60$k8l(S89gzy-Jf7vKV1fD3Rzj{q*f1-Jkg-~wEL3%V-WFTe%302kl_T!0I3 z0WRnfzy-Jf7vKV1fD7)&1ue>FUjBHU<2=f-9m;!)k21I4+FvaWyDf)S_NQZSYYe%~ zbv#WFb6f^)cEw%Rywka@hThvbWnlK_@Eqg7-)qh6{L%lP9Ch_OF9E#nxn*^I1BVUt Am;e9( literal 22976 zcmeI)VQRxL42EHcF&H~bZ?{8i*P5G#u_I*zPiktK{^=S{c0<~m%EMdPKIlBdSZb?fjQSBZ?Wv8Yn)c$WZHm71XS>_kPCI>L@lEU4 ztZi{x)|B<+X~_&CtH_yFfm|RL;HQNtDFQ{H2o!-LPy~u#zrcRM5&?=p5hwyhpa>L! zBIHvb7sv%xfm|RL^ayxI@Q&ae0T_eVyCj5mLJm)n~&fPkl~ KpUXO@geCw;SriBW delta 56 zcmbQtIGJ%mlA%qRZibSRO!@^Ek&PWWiW*7hFE%Y~(-Gtmf5gmS8vZX^dS{Cd0}yz+ L`njxgN@xNADIOCG diff --git a/backend/tests/data/print/tif/code128_aim.tif b/backend/tests/data/print/tif/code128_aim.tif index 5cc663a50dcd6c3d249348bbf861b5462c9ab534..a8f640a418589123958af9b6036f6779e58e85a4 100644 GIT binary patch delta 50 zcmV-20L}l_1J(nu904X^`Uv`Zgn<;tVCuyf`i IK9fQLlr=dP*#H0l delta 50 zcmV-20L}l_1J(nu904XUe1!UXfVCuyf`R IzLP=$lrIt&0ssI2 diff --git a/backend/tests/data/svg/dpd_compliant.svg b/backend/tests/data/svg/dpd_compliant.svg index 3f469a00..d9088fad 100644 --- a/backend/tests/data/svg/dpd_compliant.svg +++ b/backend/tests/data/svg/dpd_compliant.svg @@ -1,11 +1,11 @@ - + Zint Generated Symbol - + - + 0081 827 0998 0000 0200 28 101 276 B diff --git a/backend/tests/data/svg/ean2_box1.svg b/backend/tests/data/svg/ean2_box1.svg new file mode 100644 index 00000000..8c27a140 --- /dev/null +++ b/backend/tests/data/svg/ean2_box1.svg @@ -0,0 +1,12 @@ + + + + Zint Generated Symbol + + + + + 12 + + + diff --git a/backend/tests/data/svg/ean5_bind2.svg b/backend/tests/data/svg/ean5_bind2.svg new file mode 100644 index 00000000..d59570e1 --- /dev/null +++ b/backend/tests/data/svg/ean5_bind2.svg @@ -0,0 +1,12 @@ + + + + Zint Generated Symbol + + + + + 12345 + + + diff --git a/backend/tests/data/tif/code128_bgalpha.tif b/backend/tests/data/tif/code128_bgalpha.tif index 43f69622f9505b0abae0f81b8755a64a494ca6ff..f995a98b5255afe49cd73c02402ba4e18eb7d2ac 100644 GIT binary patch delta 95 zcmV-l0HFW89lRZ|k_S@Bu-wrz&68Z*$fEOn)2#J8%dxEaJU(+xnB z6$3-i&7})OQIs_2KT))e9Z1p?oh?aF6s<8!)01U2PSh0LMNrh09ZgcVXtU%8*alky BF600J delta 95 zcmV-l0HFW89lRZ|k_S@CFx=5I&68Z*$fEOn)2#J8%dxEaJUn?F!A zEd@hCjid=f(Ue5rLQ%Ah9YWF+oh3`ol&vvM($f_+PSceQK~dCIElE?S=(FSp*aj#< BF0KFo diff --git a/backend/tests/data/tif/code128_cmyk.tif b/backend/tests/data/tif/code128_cmyk.tif index cbd44513c8b1949be838017e9192384d00227f4e..600c2b1b89be462c520b6b0ebf7bdf7e330b6b45 100644 GIT binary patch delta 278 zcmew*_fL+)(^HFK0Uray=0FZM*3EpZ6F9j3+)REF$>-ab;4ygxuNIR68(f7K2_X>oi{KRIqO}V=vV)s8|=H3&@pCW9^f)08eO)0u*v##89-nsNI z5r59?_nv(v!_>+)u03|`4cC%SvGX>EZoi#Zs`|V4-mCRn`#zXizkSYMef)7z#h!iY z<`d66|GYC+uiby~^(zM)7$(o*Q(`omyq`~*(Qfi%K4r-;eg+09Mpgz!1_p*aAX^&B UE}JaR?=JEUDCz;kAXyj<0L;2`#sB~S delta 274 zcmew-_e+k$(^HFK4j%)<=0FZM*3EpZ6F9j3`e#3})U%wJpfPy`uNISv<>V{88ubk# zvrPHsdM&%6@#R-<*z%xNp|7sadYZJ?XNi~g)!njLXJa=-<$Q~FU3WEiN6;GK)pIw! z&EI`{eYo_|Z{I8T#XtWtN41+6wdflrhH4ciQ8|z-llkacHboHeRm7WrT3|GR~~=#;m4hM z?)r02y(q4-Ik((?DdXe?d`gT)lMnMLGg?i4&ZjIH#LvJW#mLIQ$iTpm1!PM@*+r9; Q`Q1f614TW67$gg$0gz{K4*&oF diff --git a/backend/tests/data/tif/code128_cmyk_fgbg.tif b/backend/tests/data/tif/code128_cmyk_fgbg.tif index 6c5c0389baf8e4fce7aae250f0131c3d5f19f9a6..2e7b3a053891c155d0b64cf13104b1158be55116 100644 GIT binary patch delta 235 zcmV_ zP3Kcd+}e3RpHOEs3LOf2MTJV`G&)rpiAShY>Qw5bBBNES)v9%>#cs1-ic@KldR>CM zXRcao)~fZk(QCL{t(N)yig$LoTyB@Uo%Z#9yx?z_{3X`OO2lFDQp^Sq1&zpIaoIeM zQ9mV>gkB~2tj2dQpUY@+nhhR{JQB`G^*U`PpG&XTY<0UmW}?YH)$BH#t*-NZvfl7B ldwU);cf#ax`CJ}e|C`C?ba~w_hfl55>~s5FPF$1q4&MP>c!&T1 delta 235 zcmVAU8Z5KLZw(Cy0TW*&N-RAjvz+doJ>?FdKho<5sHe3!D8-2)Q@>o2M zQBx<5k>e+Mtj2dMp3CR-S{)`^OcKsvta@DrpGU6NYxTQ5l&@Et+wC?xy@vO7zS{3A lx|x>~fx_VN`CI;HC!5IVa{1jpk3Xf=>UH~FZ0wWu4&Onbb{+r# diff --git a/backend/tests/data/tif/code128_cmyk_fgbgalpha.tif b/backend/tests/data/tif/code128_cmyk_fgbgalpha.tif index 4f592daf5a8d16b9893059f9944446b99fb7a500..921b00b36f236b1ed642950c5e054f46911cdfd6 100644 GIT binary patch delta 318 zcmeyQ`bCw)(^HFqL5P82^980gyqjZKPcTic5m;IuqW=3&!%T+g+;6*GFI`R9bx-eG z_T6Vc%MQeCF#jVab~A5>_qvEVYG!}?_dO}7pxx%+r!6S+#uk zWtX0rO6?8XuDW3D8`E30^Ojp~zm;cpd+xLMwe34^m_@Hm7tTI<@00nTx^(Hei_Vu6 zip$OSZa(#78l^W`@memnH%4o~{=hu^>c-XEWT z{`0*TR(T>!fA{nM;bpSlpd-k<|D^Y`c?Um)NOK+vSR>4RaKaX29>;<=ntaY5?zr+h z2dX#<9Whj5n*3K#nQ_r%MImLzHIrS1lqF99gFuRrm4T6gf#C^|Ee&PAncOH8D-s42 L_5jL&WMMP_jH`;; delta 301 zcmV+|0n+~TCGsT*Nl7XI{t*BGv(N&p4YOPY$O4mm5T$=rxBL8nnE+dD_Pa&W)nvNf zF7|8P=J|HOUa&X(78ZqaxJ$7ZJN7pFkH%y$*zAs1Cz8Tua+VBUa@~o|W;1#mwv#WV z(du+sy+*SIowjH7yFEVFO}Eu;HyZ8U>vNvD@H89!?%RpS-f}nGo@XzeN5%AZT`Qi$ zmB!}wIs9E-=U=^uVnK@eOe2*Qv&EeJyJOf?C^Fyt{0!*HxY4@5BRMGYVzlm8JT z0ics35+ebslSdLG8O9O-02%=W009610OAq=02=`X009610P2&25?ujQli?B*Y)_3j diff --git a/backend/tests/data/tif/code128_cmyk_fgbgcmyk.tif b/backend/tests/data/tif/code128_cmyk_fgbgcmyk.tif index 4d1f1ff80f53f352b7f964f0a2667c72e1dd23a0..0c46ac722d7f7f8c84be63a78b6e3e71a8b4cabb 100644 GIT binary patch delta 235 zcmV_ zP3Kcd+}e3RpHOEs3LOf2MTJV`G&)rpiAShY>Qw5bBBNES)v9%>#cs1-ic@KldR>CM zXRcao)~fZk(QCL{t(N)yig$LoTyB@Uo%Z#9yx?z_{3X`OO2lFDQp^Sq1&zpIaoIeM zQ9mV>gkB~2tj2dQpUY@+nhhR{JPpoB^*U`PpG&XTY<0UmW}?YH)$BH#t*-NZvfl7B ldwU);cf#ax`CJ}e|C`C?ba~w_hfl55>~s5FPF$1q4&TJicsl?9 delta 235 zcmVAU8Z5KLZw(Cy0TW*&N-RAjvz+doJ>?FdKho<5sHe3!D8-2)Q@>o2M zQBx<5k>e+Mtj2dMp3CR-S{)`^ObyOqta@DrpGU6NYxTQ5l&@Et+wC?xy@vO7zS{3A lx|x>~fx_VN`CI;HC!5IVa{1jpk3Xf=>UH~FZ0wWu4&Nf;b@c!M diff --git a/backend/tests/data/tif/code128_fgalpha.tif b/backend/tests/data/tif/code128_fgalpha.tif index e2a6b2327c5af95a990b5d206096dfd7453af229..369cc0714cb957017e2fdd4bbe870c76a81b979e 100644 GIT binary patch delta 95 zcmV-l0HFW89lRZ|k_S@Bu-wrz&68Z*$fEOn)2#J8%dxEaJU(+xnB z6$3-i&7})OQIs_2KT))e9Z1p?oh?aF6s<8!)01U2PSh0LMNrh09ZgcVXtU%8*alky BF600J delta 95 zcmV-l0HFW89lRZ|k_S@CFx=5I&68Z*$fEOn)2#J8%dxEaJUn?F!A zEd@hCjid=f(Ue5rLQ%Ah9YWF+oh3`ol&vvM($f_+PSceQK~dCIElE?S=(FSp*aj#< BF0KFo diff --git a/backend/tests/data/tif/code128_fgbg.tif b/backend/tests/data/tif/code128_fgbg.tif index 77c66a684c6153429eb68ebb67174c60994d5f42..962e3169b1bace2c2abb5dcbd3cdc80ec2f80444 100644 GIT binary patch delta 121 zcmdnNzJ;CD(^HFK-A2|*CIdCbjz--_&KY(mTlAUtJwCu@IU(`%G0*nopLWty zo<_t)PJ3usmpJp;j73ZglQ%KN87^gFV31;DWng4rU~pk(V33BgeSmBYMrN=$Pzi$r OkZk~@Lnb>imjeJZFdno3 delta 125 zcmdnOzJs0B(^HFK(?-@xCKClFjwFj!0vrq$+q8QcB$k=BKc4Z;zU_&noD9Q)N-^Ko zl$~+n)1Kb&OPulG=e*3>&n1eOCa+_PGhD^Qz#zrQ%D~9Lz~I5mz#t7}2LRa`jLcwh Spb`cLAlm>)M@+V5E(ZXle;>pE diff --git a/backend/tests/data/tif/code128_fgbgalpha.tif b/backend/tests/data/tif/code128_fgbgalpha.tif index 194e8a43a8c1db59b767516048ff394c22f2b49a..fa2a6cad19131964d080a841e095ba5c70acdb91 100644 GIT binary patch delta 95 zcmV-l0HFW89lRZ|k_S@Bu-wrz&68Z*$fEOn)2#J8%dxEaJU(+xnB z6$3-i&7})OQIs_2KT))e9Z1p?oh?aF6s<8!)01U2PSh0LMNrh09ZgcVXtU%8*alky BF600J delta 95 zcmV-l0HFW89lRZ|k_S@CFx=5I&68Z*$fEOn)2#J8%dxEaJUn?F!A zEd@hCjid=f(Ue5rLQ%Ah9YWF+oh3`ol&vvM($f_+PSceQK~dCIElE?S=(FSp*aj#< BF0KFo diff --git a/backend/tests/data/tif/code128_reverse.tif b/backend/tests/data/tif/code128_reverse.tif index 3d4f03932a67e498b170a7ea5272b1b101dc3f0d..1b062f578ff75ccf4d09c49164185d7ad1d9db22 100644 GIT binary patch delta 37 vcmV+=0NVfd0`>xs%o_)-009sh&_M%fw$^QRp!NpeeYxCf_gfAoqLJs1EyWR7 delta 37 vcmV+=0NVfd0`>xs%o_rL)_{l_&>(|pw$^QRpmzq}eYxCf_gda2s*&f9UZfMM diff --git a/backend/tests/test_codablock.c b/backend/tests/test_codablock.c index 911a0c4c..e7f0c3c9 100644 --- a/backend/tests/test_codablock.c +++ b/backend/tests/test_codablock.c @@ -1,6 +1,6 @@ /* libzint - the open source barcode library - Copyright (C) 2019-2022 Robin Stuart + Copyright (C) 2019-2023 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -57,8 +57,8 @@ static void test_large(const testCtx *const p_ctx) { /* 6*/ { -1, -1, "12", 2726 * 2 + 1, ZINT_ERROR_TOO_LONG, -1, -1 }, /* 7*/ { -1, -1, "\351", 2726 / 2, 0, 44, 739 }, /* 8*/ { -1, -1, "\351", 2726 / 2 + 1, ZINT_ERROR_TOO_LONG, -1, -1 }, - /* 9*/ { 1, -1, "A", 60, 0, 1, 695 }, /* CODE128 60 max */ - /* 10*/ { 1, -1, "A", 61, ZINT_ERROR_TOO_LONG, -1, -1 }, + /* 9*/ { 1, -1, "A", 99, 0, 1, 1124 }, /* CODE128 99 max */ + /* 10*/ { 1, -1, "A", 100, ZINT_ERROR_TOO_LONG, -1, -1 }, /* 11*/ { 2, -1, "A", 122, 0, 2, 739 }, /* 12*/ { 2, 10, "A", 122, 0, 2, 739 }, /* Cols 10 -> 67 */ /* 13*/ { 2, 67, "A", 122, 0, 2, 739 }, @@ -85,11 +85,11 @@ static void test_large(const testCtx *const p_ctx) { }; int data_size = ARRAY_SIZE(data); int i, length, ret; - struct zint_symbol *symbol; + struct zint_symbol *symbol = NULL; char data_buf[ZINT_MAX_DATA_LEN + 2]; - testStart("test_large"); + testStartSymbol("test_large", &symbol); for (i = 0; i < data_size; i++) { @@ -159,9 +159,9 @@ static void test_options(const testCtx *const p_ctx) { }; int data_size = ARRAY_SIZE(data); int i, length, ret; - struct zint_symbol *symbol; + struct zint_symbol *symbol = NULL; - testStart("test_options"); + testStartSymbol("test_options", &symbol); for (i = 0; i < data_size; i++) { @@ -207,11 +207,11 @@ static void test_reader_init(const testCtx *const p_ctx) { }; int data_size = ARRAY_SIZE(data); int i, length, ret; - struct zint_symbol *symbol; + struct zint_symbol *symbol = NULL; char escaped[1024]; - testStart("test_reader_init"); + testStartSymbol("test_reader_init", &symbol); for (i = 0; i < data_size; i++) { @@ -328,7 +328,7 @@ static void test_input(const testCtx *const p_ctx) { }; int data_size = ARRAY_SIZE(data); int i, length, ret; - struct zint_symbol *symbol; + struct zint_symbol *symbol = NULL; char escaped[16834]; char cmp_buf[32768]; @@ -337,7 +337,7 @@ static void test_input(const testCtx *const p_ctx) { int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); /* Only do BWIPP test if asked, too slow otherwise */ int do_zxingcpp = (debug & ZINT_DEBUG_TEST_ZXINGCPP) && testUtilHaveZXingCPPDecoder(); /* Only do ZXing-C++ test if asked, too slow otherwise */ - testStart("test_input"); + testStartSymbol("test_input", &symbol); for (i = 0; i < data_size; i++) { @@ -504,7 +504,7 @@ static void test_encode(const testCtx *const p_ctx) { }; int data_size = ARRAY_SIZE(data); int i, length, ret; - struct zint_symbol *symbol; + struct zint_symbol *symbol = NULL; char escaped[1024]; char cmp_buf[8192]; @@ -513,7 +513,7 @@ static void test_encode(const testCtx *const p_ctx) { int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); /* Only do BWIPP test if asked, too slow otherwise */ int do_zxingcpp = (debug & ZINT_DEBUG_TEST_ZXINGCPP) && testUtilHaveZXingCPPDecoder(); /* Only do ZXing-C++ test if asked, too slow otherwise */ - testStart("test_encode"); + testStartSymbol("test_encode", &symbol); for (i = 0; i < data_size; i++) { @@ -590,9 +590,9 @@ static void test_fuzz(const testCtx *const p_ctx) { }; int data_size = ARRAY_SIZE(data); int i, length, ret; - struct zint_symbol *symbol; + struct zint_symbol *symbol = NULL; - testStart("test_fuzz"); + testStartSymbol("test_fuzz", &symbol); for (i = 0; i < data_size; i++) { diff --git a/backend/tests/test_code128.c b/backend/tests/test_code128.c index 4894a2ae..053dafdb 100644 --- a/backend/tests/test_code128.c +++ b/backend/tests/test_code128.c @@ -38,6 +38,7 @@ static void test_large(const testCtx *const p_ctx) { struct item { int symbology; + int output_options; char *pattern; int length; int ret; @@ -48,26 +49,31 @@ static void test_large(const testCtx *const p_ctx) { */ /* s/\/\*[ 0-9]*\*\//\=printf("\/\*%3d*\/", line(".") - line("'<")): */ struct item data[] = { - /* 0*/ { BARCODE_CODE128, "A", 60, 0, 695 }, - /* 1*/ { BARCODE_CODE128, "A", 61, ZINT_ERROR_TOO_LONG, -1 }, - /* 2*/ { BARCODE_CODE128, "A", 161, ZINT_ERROR_TOO_LONG, -1 }, - /* 3*/ { BARCODE_CODE128, "\351A", 40, 0, 695 }, - /* 4*/ { BARCODE_CODE128, "\351A", 41, ZINT_ERROR_TOO_LONG, -1 }, /* 41 chars (+ 20 shifts) */ - /* 5*/ { BARCODE_CODE128, "0", 120, 0, 695 }, - /* 6*/ { BARCODE_CODE128, "0", 121, ZINT_ERROR_TOO_LONG, -1 }, - /* 7*/ { BARCODE_CODE128AB, "A", 60, 0, 695 }, - /* 8*/ { BARCODE_CODE128AB, "A", 61, ZINT_ERROR_TOO_LONG, -1 }, - /* 9*/ { BARCODE_CODE128AB, "0", 60, 0, 695 }, - /* 10*/ { BARCODE_CODE128AB, "0", 61, ZINT_ERROR_TOO_LONG, -1 }, - /* 11*/ { BARCODE_GS1_128, "[90]123456789012345678901234567890[91]1234567890123456789012345678901234567890123456789012345678901234567890[92]1234567890", -1, 0, 706 }, /* 116 nos + 3 FNC1s */ - /* 12*/ { BARCODE_GS1_128, "[90]123456789012345678901234567890[91]1234567890123456789012345678901234567890123456789012345678901234567890[92]1234[93]1234", -1, ZINT_ERROR_TOO_LONG, -1 }, /* 116 nos + 4 FNC1s */ - /* 13*/ { BARCODE_GS1_128, "A", 161, ZINT_ERROR_TOO_LONG, -1 }, - /* 14*/ { BARCODE_EAN14, "1234567890123", -1, 0, 134 }, - /* 15*/ { BARCODE_EAN14, "12345678901234", -1, ZINT_ERROR_TOO_LONG, -1 }, - /* 16*/ { BARCODE_NVE18, "12345678901234567", -1, 0, 156 }, - /* 17*/ { BARCODE_NVE18, "123456789012345678", -1, ZINT_ERROR_TOO_LONG, -1 }, - /* 18*/ { BARCODE_HIBC_128, "1", 110, 0, 684 }, - /* 19*/ { BARCODE_HIBC_128, "1", 111, ZINT_ERROR_TOO_LONG, -1 }, + /* 0*/ { BARCODE_CODE128, -1, "A", 99, 0, 1124 }, + /* 1*/ { BARCODE_CODE128, -1, "A", 100, ZINT_ERROR_TOO_LONG, -1 }, + /* 2*/ { BARCODE_CODE128, -1, "A", 257, ZINT_ERROR_TOO_LONG, -1 }, + /* 3*/ { BARCODE_CODE128, READER_INIT, "A", 99, 0, 1135 }, + /* 4*/ { BARCODE_CODE128, READER_INIT, "A", 100, ZINT_ERROR_TOO_LONG, -1 }, + /* 5*/ { BARCODE_CODE128, READER_INIT, "A", 257, ZINT_ERROR_TOO_LONG, -1 }, + /* 6*/ { BARCODE_CODE128, -1, "\351A", 66, 0, 1124 }, + /* 7*/ { BARCODE_CODE128, -1, "\351A", 67, ZINT_ERROR_TOO_LONG, -1 }, /* 67 chars (+ 34 shifts) */ + /* 8*/ { BARCODE_CODE128, -1, "0", 198, 0, 1124 }, + /* 9*/ { BARCODE_CODE128, -1, "0", 199, ZINT_ERROR_TOO_LONG, -1 }, + /* 10*/ { BARCODE_CODE128, -1, "0", 257, ZINT_ERROR_TOO_LONG, -1 }, + /* 11*/ { BARCODE_CODE128AB, -1, "A", 99, 0, 1124 }, + /* 12*/ { BARCODE_CODE128AB, -1, "A", 100, ZINT_ERROR_TOO_LONG, -1 }, + /* 13*/ { BARCODE_CODE128AB, -1, "0", 99, 0, 1124 }, + /* 14*/ { BARCODE_CODE128AB, -1, "0", 100, ZINT_ERROR_TOO_LONG, -1 }, + /* 15*/ { BARCODE_GS1_128, -1, "[90]123456789012345678901234567890[91]1234567890123456789012345678901234567890123456789012345678901234567890[92]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678", -1, ZINT_WARN_HRT_TRUNCATED, 1135 }, /* 196 nos + 3 FNC1s */ + /* 16*/ { BARCODE_GS1_128, -1, "[90]123456789012345678901234567890[91]1234567890123456789012345678901234567890123456789012345678901234567890[92]12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789", -1, ZINT_ERROR_TOO_LONG, -1 }, /* 196 nos + CodeA + single no. + 3 FNC1s */ + /* 17*/ { BARCODE_GS1_128, -1, "[90]123456789012345678901234567890[91]1234567890123456789012345678901234567890123456789012345678901234567890[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", -1, ZINT_ERROR_TOO_LONG, -1 }, /* 198 nos + 3 FNC1s */ + /* 18*/ { BARCODE_GS1_128, -1, "A", 257, ZINT_ERROR_TOO_LONG, -1 }, + /* 19*/ { BARCODE_EAN14, -1, "1234567890123", -1, 0, 134 }, + /* 20*/ { BARCODE_EAN14, -1, "12345678901234", -1, ZINT_ERROR_TOO_LONG, -1 }, + /* 21*/ { BARCODE_NVE18, -1, "12345678901234567", -1, 0, 156 }, + /* 22*/ { BARCODE_NVE18, -1, "123456789012345678", -1, ZINT_ERROR_TOO_LONG, -1 }, + /* 23*/ { BARCODE_HIBC_128, -1, "1", 110, 0, 684 }, + /* 24*/ { BARCODE_HIBC_128, -1, "1", 111, ZINT_ERROR_TOO_LONG, -1 }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -91,7 +97,7 @@ static void test_large(const testCtx *const p_ctx) { strcpy(data_buf, data[i].pattern); } - length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, -1, -1, -1 /*output_options*/, data_buf, data[i].length, debug); + length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, -1 /*option_1*/, -1, -1, data[i].output_options, data_buf, data[i].length, debug); ret = ZBarcode_Encode(symbol, (unsigned char *) data_buf, length); assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); @@ -130,40 +136,41 @@ static void test_hrt(const testCtx *const p_ctx) { /* 4*/ { BARCODE_CODE128, UNICODE_MODE, -1, "abcdé", -1, "abcdé" }, /* 5*/ { BARCODE_CODE128, DATA_MODE, -1, "abcd\351", -1, "abcdé" }, /* 6*/ { BARCODE_CODE128, DATA_MODE, -1, "ab\240cd\351", -1, "ab\302\240cdé" }, /* NBSP */ - /* 7*/ { BARCODE_CODE128AB, UNICODE_MODE, -1, "abcdé", -1, "abcdé" }, - /* 8*/ { BARCODE_CODE128AB, DATA_MODE, -1, "abcd\351", -1, "abcdé" }, - /* 9*/ { BARCODE_HIBC_128, UNICODE_MODE, -1, "1234567890", -1, "*+12345678900*" }, - /* 10*/ { BARCODE_HIBC_128, UNICODE_MODE, -1, "a99912345", -1, "*+A999123457*" }, /* Converts to upper */ - /* 11*/ { BARCODE_DPD, UNICODE_MODE, -1, "000393206219912345678101040", -1, "0003 932 0621 9912 3456 78 101 040 9" }, /* DPDAPPD 4.0.2 - Illustration 7 */ - /* 12*/ { BARCODE_DPD, UNICODE_MODE, -1, "007110601782532948375101276", -1, "0071 106 0178 2532 9483 75 101 276 X" }, /* DPDAPPD 4.0.2 - Illustration 6, figure's HRT seems incorrect */ - /* 13*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020028101276", -1, "0081 827 0998 0000 0200 28 101 276 B" }, /* DPDPLS Section 4 */ - /* 14*/ { BARCODE_DPD, UNICODE_MODE, -1, "007110601632532948375179276", -1, "0071 106 0163 2532 9483 75 179 276 A" }, /* DPDPLS Section 4.6 */ - /* 15*/ { BARCODE_DPD, UNICODE_MODE, -1, "001990009980000020084109203", -1, "0019 900 0998 0000 0200 84 109 203 1" }, /* DPDPLS Section 5.1 */ - /* 16*/ { BARCODE_DPD, UNICODE_MODE, 1, "007110601632532948375101276", -1, "0071 106 0163 2532 9483 75 101 276 O" }, /* DPDPLS Section 6.1.2 relabel, figure is actually 8.7.2 with mislabelled HRT */ - /* 17*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020029136276", -1, "0081 827 0998 0000 0200 29 136 276 3" }, /* DPDPLS Section 8.1 */ - /* 18*/ { BARCODE_DPD, UNICODE_MODE, -1, "001234509980000020031105276", -1, "0012 345 0998 0000 0200 31 105 276 L" }, /* DPDPLS Section 8.2 */ - /* 19*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020032154276", -1, "0081 827 0998 0000 0200 32 154 276 J" }, /* DPDPLS Section 8.3 */ - /* 20*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020030109276", -1, "0081 827 0998 0000 0200 30 109 276 W" }, /* DPDPLS Section 8.4 */ - /* 21*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020033350276", -1, "0081 827 0998 0000 0200 33 350 276 C" }, /* DPDPLS Section 8.5.1 */ - /* 22*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020034179276", -1, "0081 827 0998 0000 0200 34 179 276 I" }, /* DPDPLS Section 8.5.2 */ - /* 23*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020035225276", -1, "0081 827 0998 0000 0200 35 225 276 H" }, /* DPDPLS Section 8.5.3 */ - /* 24*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020036155276", -1, "0081 827 0998 0000 0200 36 155 276 5" }, /* DPDPLS Section 8.5.4 */ - /* 25*/ { BARCODE_DPD, UNICODE_MODE, -1, "000280009980000020037155056", -1, "0002 800 0998 0000 0200 37 155 056 6" }, /* DPDPLS Section 8.5.5 */ - /* 26*/ { BARCODE_DPD, UNICODE_MODE, -1, "007855009980000020041302840", -1, "0078 550 0998 0000 0200 41 302 840 U" }, /* DPDPLS Section 8.5.6 */ - /* 27*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020042102276", -1, "0081 827 0998 0000 0200 42 102 276 R" }, /* DPDPLS Section 8.6.1 */ - /* 28*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020043113276", -1, "0081 827 0998 0000 0200 43 113 276 Y" }, /* DPDPLS Section 8.7.1 */ - /* 29*/ { BARCODE_DPD, UNICODE_MODE, 1, "006376209980000020044118276", -1, "0063 762 0998 0000 0200 44 118 276 I" }, /* DPDPLS Section 8.7.2 relabel */ - /* 30*/ { BARCODE_DPD, UNICODE_MODE, -1, "007160009980000020050294276", -1, "0071 600 0998 0000 0200 50 294 276 C" }, /* DPDPLS Section 8.8 */ - /* 31*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020045327276", -1, "0081 827 0998 0000 0200 45 327 276 N" }, /* DPDPLS Section 8.9.1 */ - /* 32*/ { BARCODE_DPD, UNICODE_MODE, -1, "006374309980000020047337276", -1, "0063 743 0998 0000 0200 47 337 276 O" }, /* DPDPLS Section 8.9.2 */ - /* 33*/ { BARCODE_DPD, UNICODE_MODE, 1, "006374109980978004757332276", -1, "0063 741 0998 0978 0047 57 332 276 M" }, /* DPDPLS Section 8.9.3 relabel, figure's HRT seems incorrect */ - /* 34*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020051106276", -1, "0081 827 0998 0000 0200 51 106 276 M" }, /* DPDPLS Section 9.1 */ - /* 35*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020052110276", -1, "0081 827 0998 0000 0200 52 110 276 W" }, /* DPDPLS Section 9.2 */ - /* 36*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020053161276", -1, "0081 827 0998 0000 0200 53 161 276 O" }, /* DPDPLS Section 9.3 */ - /* 37*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020054352276", -1, "0081 827 0998 0000 0200 54 352 276 B" }, /* DPDPLS Section 9.4 */ - /* 38*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020055191276", -1, "0081 827 0998 0000 0200 55 191 276 A" }, /* DPDPLS Section 9.5 */ - /* 39*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020056237276", -1, "0081 827 0998 0000 0200 56 237 276 K" }, /* DPDPLS Section 9.6 */ - /* 40*/ { BARCODE_UPU_S10, UNICODE_MODE, -1, "EE876543216CA", -1, "EE 876 543 216 CA" }, /* UPU S10 Annex A */ + /* 7*/ { BARCODE_CODE128, ESCAPE_MODE | EXTRA_ESCAPE_MODE, -1, "\\^C1234567890\\^C1234567890\\^C1234567890\\^C1234567890\\^C1234567890\\^C1234567890\\^C1234567890\\^C1234567890\\^C1234567890\\^C1234567890\\^C1234567890\\^C1234567890\\^C1234567890\\^C1234567890\\^C1234567890\\^C1234567890\\^C1234567890\\^C1234567890\\^C123456789012345678", -1, "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678" }, /* Max length 198 + 19 special escapes = 99 + 19*3 = 255 */ + /* 8*/ { BARCODE_CODE128AB, UNICODE_MODE, -1, "abcdé", -1, "abcdé" }, + /* 9*/ { BARCODE_CODE128AB, DATA_MODE, -1, "abcd\351", -1, "abcdé" }, + /* 10*/ { BARCODE_HIBC_128, UNICODE_MODE, -1, "1234567890", -1, "*+12345678900*" }, + /* 11*/ { BARCODE_HIBC_128, UNICODE_MODE, -1, "a99912345", -1, "*+A999123457*" }, /* Converts to upper */ + /* 12*/ { BARCODE_DPD, UNICODE_MODE, -1, "000393206219912345678101040", -1, "0003 932 0621 9912 3456 78 101 040 9" }, /* DPDAPPD 4.0.2 - Illustration 7 */ + /* 13*/ { BARCODE_DPD, UNICODE_MODE, -1, "007110601782532948375101276", -1, "0071 106 0178 2532 9483 75 101 276 X" }, /* DPDAPPD 4.0.2 - Illustration 6, figure's HRT seems incorrect */ + /* 14*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020028101276", -1, "0081 827 0998 0000 0200 28 101 276 B" }, /* DPDPLS Section 4 */ + /* 15*/ { BARCODE_DPD, UNICODE_MODE, -1, "007110601632532948375179276", -1, "0071 106 0163 2532 9483 75 179 276 A" }, /* DPDPLS Section 4.6 */ + /* 16*/ { BARCODE_DPD, UNICODE_MODE, -1, "001990009980000020084109203", -1, "0019 900 0998 0000 0200 84 109 203 1" }, /* DPDPLS Section 5.1 */ + /* 17*/ { BARCODE_DPD, UNICODE_MODE, 1, "007110601632532948375101276", -1, "0071 106 0163 2532 9483 75 101 276 O" }, /* DPDPLS Section 6.1.2 relabel, figure is actually 8.7.2 with mislabelled HRT */ + /* 18*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020029136276", -1, "0081 827 0998 0000 0200 29 136 276 3" }, /* DPDPLS Section 8.1 */ + /* 19*/ { BARCODE_DPD, UNICODE_MODE, -1, "001234509980000020031105276", -1, "0012 345 0998 0000 0200 31 105 276 L" }, /* DPDPLS Section 8.2 */ + /* 20*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020032154276", -1, "0081 827 0998 0000 0200 32 154 276 J" }, /* DPDPLS Section 8.3 */ + /* 21*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020030109276", -1, "0081 827 0998 0000 0200 30 109 276 W" }, /* DPDPLS Section 8.4 */ + /* 22*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020033350276", -1, "0081 827 0998 0000 0200 33 350 276 C" }, /* DPDPLS Section 8.5.1 */ + /* 23*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020034179276", -1, "0081 827 0998 0000 0200 34 179 276 I" }, /* DPDPLS Section 8.5.2 */ + /* 24*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020035225276", -1, "0081 827 0998 0000 0200 35 225 276 H" }, /* DPDPLS Section 8.5.3 */ + /* 25*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020036155276", -1, "0081 827 0998 0000 0200 36 155 276 5" }, /* DPDPLS Section 8.5.4 */ + /* 26*/ { BARCODE_DPD, UNICODE_MODE, -1, "000280009980000020037155056", -1, "0002 800 0998 0000 0200 37 155 056 6" }, /* DPDPLS Section 8.5.5 */ + /* 27*/ { BARCODE_DPD, UNICODE_MODE, -1, "007855009980000020041302840", -1, "0078 550 0998 0000 0200 41 302 840 U" }, /* DPDPLS Section 8.5.6 */ + /* 28*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020042102276", -1, "0081 827 0998 0000 0200 42 102 276 R" }, /* DPDPLS Section 8.6.1 */ + /* 29*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020043113276", -1, "0081 827 0998 0000 0200 43 113 276 Y" }, /* DPDPLS Section 8.7.1 */ + /* 30*/ { BARCODE_DPD, UNICODE_MODE, 1, "006376209980000020044118276", -1, "0063 762 0998 0000 0200 44 118 276 I" }, /* DPDPLS Section 8.7.2 relabel */ + /* 31*/ { BARCODE_DPD, UNICODE_MODE, -1, "007160009980000020050294276", -1, "0071 600 0998 0000 0200 50 294 276 C" }, /* DPDPLS Section 8.8 */ + /* 32*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020045327276", -1, "0081 827 0998 0000 0200 45 327 276 N" }, /* DPDPLS Section 8.9.1 */ + /* 33*/ { BARCODE_DPD, UNICODE_MODE, -1, "006374309980000020047337276", -1, "0063 743 0998 0000 0200 47 337 276 O" }, /* DPDPLS Section 8.9.2 */ + /* 34*/ { BARCODE_DPD, UNICODE_MODE, 1, "006374109980978004757332276", -1, "0063 741 0998 0978 0047 57 332 276 M" }, /* DPDPLS Section 8.9.3 relabel, figure's HRT seems incorrect */ + /* 35*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020051106276", -1, "0081 827 0998 0000 0200 51 106 276 M" }, /* DPDPLS Section 9.1 */ + /* 36*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020052110276", -1, "0081 827 0998 0000 0200 52 110 276 W" }, /* DPDPLS Section 9.2 */ + /* 37*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020053161276", -1, "0081 827 0998 0000 0200 53 161 276 O" }, /* DPDPLS Section 9.3 */ + /* 38*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020054352276", -1, "0081 827 0998 0000 0200 54 352 276 B" }, /* DPDPLS Section 9.4 */ + /* 39*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020055191276", -1, "0081 827 0998 0000 0200 55 191 276 A" }, /* DPDPLS Section 9.5 */ + /* 40*/ { BARCODE_DPD, UNICODE_MODE, -1, "008182709980000020056237276", -1, "0081 827 0998 0000 0200 56 237 276 K" }, /* DPDPLS Section 9.6 */ + /* 41*/ { BARCODE_UPU_S10, UNICODE_MODE, -1, "EE876543216CA", -1, "EE 876 543 216 CA" }, /* UPU S10 Annex A */ /* BARCODE_GS1_128, BARCODE_EAN14, BARCODE_NVE18 hrt tested in test_gs1.c */ }; int data_size = ARRAY_SIZE(data); @@ -179,6 +186,8 @@ static void test_hrt(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); + memset(symbol->text, 0xDD, sizeof(symbol->text)); /* Detect non-NUL terminated HRT */ + length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, -1 /*option_1*/, data[i].option_2, -1, -1 /*output_options*/, data[i].data, data[i].length, debug); ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length); @@ -430,7 +439,7 @@ static void test_input(const testCtx *const p_ctx) { testFinish(); } -static void test_ean128_input(const testCtx *const p_ctx) { +static void test_gs1_128_input(const testCtx *const p_ctx) { int debug = p_ctx->debug; struct item { @@ -466,8 +475,11 @@ static void test_ean128_input(const testCtx *const p_ctx) { /* 21*/ { GS1_MODE, "[90]12A[90]123", 0, 145, "(13) 105 102 90 12 100 33 102 25 99 1 23 25 106", "StartC FNC1 90 12 CodeB A FNC1 9 CodeC 01 23" }, /* 22*/ { GS1_MODE, "[90]123[90]A234[90]123", 0, 244, "(22) 105 102 90 12 100 19 99 102 90 100 33 18 99 34 102 100 25 99 1 23 37 106", "StartC FNC1 90 12 CodeB 3 CodeC FNC1 90 CodeB A 2 CodeC 34 FNC1 CodeB 9 CodeC 01 23" }, /* 23*/ { GS1_MODE, "[90]12345A12345A", 0, 178, "(16) 105 102 90 12 34 100 21 33 17 99 23 45 100 33 59 106", "StartC FNC1 90 12 34 CodeB 5 A 1 CodeC 23 45 CodeB A [" }, - /* 24*/ { GS1_MODE, "[01]12345678901231[90]123456789012345678901234567890[91]1234567890123456789012345678901234567890123456789012345678901234", 0, 684, "(62) 105 102 1 12 34 56 78 90 12 31 90 12 34 56 78 90 12 34 56 78 90 12 34 56 78 90 102 91", "Max length" }, - /* 25*/ { GS1_MODE, "[01]12345678901231[90]123456789012345678901234567890[91]12345678901234567890123456789012345678901234567890123456789012345", ZINT_ERROR_TOO_LONG, 0, "Error 344: Input too long (60 symbol character maximum)", "" }, + /* 24*/ { GS1_MODE, "[01]12345678901231[90]12345678901234567890123456789", 0, 321, "(29) 105 102 1 12 34 56 78 90 12 31 90 12 34 56 78 90 12 34 56 78 90 12 34 56 78 100 25 59", "Max length" }, + /* 25*/ { GS1_MODE, "[01]12345678901231[90]123456789012345678901234567890[91]1", ZINT_WARN_NONCOMPLIANT, 365, "Warning 843: GS1-128 input too long (48 character maximum)", "Over length" }, + /* 26*/ { GS1_MODE, "[90]123456789012345678901234567890[91]1234567890123456789012345678901234567890123456789012345678901234567890[92]12345678901234567890123456789012345678901234567890123456789012345678901234567890[93]1234", ZINT_WARN_HRT_TRUNCATED, 1135, "Warning 844: Human Readable Text truncated", "Max input" }, + /* 27*/ { GS1_MODE, "[00]345678901234567890[00]345678901234567890[00]345678901234567890[00]345678901234567890[00]345678901234567890[00]345678901234567890[00]345678901234567890[00]345678901234567890[00]345678901234567890[3100]567890[20]34[20]78", ZINT_WARN_HRT_TRUNCATED, 1135, "Warning 844: Human Readable Text truncated", "HRT truncation warning trumps non-compliant (3100) warning" }, + /* 28*/ { GS1_MODE, "[90]123456789012345678901234567890[91]1234567890123456789012345678901234567890123456789012345678901234567890[92]12345678901234567890123456789012345678901234567890123456789012345678901234567890[93]12345", ZINT_ERROR_TOO_LONG, 0, "Error 344: Input too long (99 symbol character maximum)", "" }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -475,7 +487,7 @@ static void test_ean128_input(const testCtx *const p_ctx) { char escaped[1024]; - testStartSymbol("test_ean128_input", &symbol); + testStartSymbol("test_gs1_128_input", &symbol); for (i = 0; i < data_size; i++) { @@ -484,6 +496,8 @@ static void test_ean128_input(const testCtx *const p_ctx) { symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); + memset(symbol->text, 0xDD, sizeof(symbol->text)); /* Detect non-NUL terminated HRT */ + symbol->debug = ZINT_DEBUG_TEST; /* Needed to get codeword dump in errtxt */ length = testUtilSetSymbol(symbol, BARCODE_GS1_128, data[i].input_mode, -1 /*eci*/, -1 /*option_1*/, -1, -1, -1 /*output_options*/, data[i].data, -1, debug); @@ -498,6 +512,13 @@ static void test_ean128_input(const testCtx *const p_ctx) { } else { if (ret < ZINT_ERROR) { assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data); + if (ret == ZINT_WARN_HRT_TRUNCATED) { + assert_nonzero((int) ustrlen(symbol->text) < (int) strlen(data[i].data), "i:%d len symbol->text(%s) %d >= %d (%s) (%s)\n", + i, symbol->text, (int) ustrlen(symbol->text), (int) strlen(data[i].data), data[i].data, symbol->errtxt); + } else { + assert_equal((int) ustrlen(symbol->text), (int) strlen(data[i].data), "i:%d len symbol->text(%s) %d != %d (%s, %s) (%s)\n", + i, symbol->text, (int) ustrlen(symbol->text), (int) strlen(data[i].data), testUtilErrorName(ret), data[i].data, symbol->errtxt); + } } assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected); } @@ -523,9 +544,10 @@ static void test_hibc_input(const testCtx *const p_ctx) { /* 1*/ { "A99912345/$$52001510X3", 0, 255, "(23) 104 11 33 99 99 91 23 45 100 15 4 4 99 52 0 15 10 100 56 19 19 53 106", "Check digit 3" }, /* 2*/ { "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%", 0, 497, "(45) 104 11 99 1 23 45 67 89 100 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51", "Check digit +" }, /* 3*/ { "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", 0, 695, "(63) 104 11 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5", "Check digit Q" }, - /* 4*/ { "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", ZINT_ERROR_TOO_LONG, -1, "Error 341: Input too long (60 symbol character maximum)", "" }, - /* 5*/ { "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0, 684, "(62) 104 11 99 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0", "Check digit %" }, - /* 6*/ { "09AZ-.19AZ-.29AZ-.39AZ-.49AZ-.59AZ-.69AZ-.79AZ-.89AZ-.99AZ", 0, 695, "(63) 104 11 16 25 33 58 13 14 17 25 33 58 13 14 18 25 33 58 13 14 19 25 33 58 13 14 20 25", "Check digit -" }, + /* 4*/ { "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", 0, 1124, "(102) 104 11 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5", "" }, + /* 5*/ { "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", ZINT_ERROR_TOO_LONG, -1, "Error 341: Input too long (99 symbol character maximum)", "" }, + /* 6*/ { "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 0, 684, "(62) 104 11 99 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0", "Check digit %" }, + /* 7*/ { "09AZ-.19AZ-.29AZ-.39AZ-.49AZ-.59AZ-.69AZ-.79AZ-.89AZ-.99AZ", 0, 695, "(63) 104 11 16 25 33 58 13 14 17 25 33 58 13 14 18 25 33 58 13 14 19 25 33 58 13 14 20 25", "Check digit -" }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -905,8 +927,8 @@ static void test_encode(const testCtx *const p_ctx) { /* 35*/ { BARCODE_GS1_128, GS1_MODE, -1, "[90]ABCDEfGHI", 0, 1, 167, 0, "Shift A; BWIPP different encodation, same codeword count", "11010010000111101011101110010110010011101100101000110001000101100010001000110101100010001000110100010110000100110100010001100010100011000100010110010011101100011101011" }, - /* 36*/ { BARCODE_GS1_128, GS1_MODE, -1, "[01]12345678901231[90]123456789012345678901234567890[91]1234567890123456789012345678901234567890123456789012345678901234", 0, 1, 684, 1, "Max length", - "110100111001111010111011001101100101100111001000101100011100010110110000101001101111011010110011100110110001101101111011010110011100100010110001110001011011000010100110111101101011001110010001011000111000101101100001010011011110110101100111001000101100011100010110110000101001101111011011110101110111101101101011001110010001011000111000101101100001010011011110110101100111001000101100011100010110110000101001101111011010110011100100010110001110001011011000010100110111101101011001110010001011000111000101101100001010011011110110101100111001000101100011100010110110000101001101111011010110011100100010110001110001011011000010100110111101101011001110010001011000100011110101100011101011" + /* 36*/ { BARCODE_GS1_128, GS1_MODE, -1, "[00]345678901234567890[00]345678901234567890[00]345678901234567890[00]345678901234567890[00]345678901234567890[00]345678901234567890[00]345678901234567890[00]345678901234567890[00]345678901234567890[3100]121212[20]34[20]78", ZINT_WARN_HRT_TRUNCATED, 1, 1135, 1, "Max length", + "1101001110011110101110110110011001000101100011100010110110000101001101111011010110011100100010110001110001011011000010100110111101101101100110010001011000111000101101100001010011011110110101100111001000101100011100010110110000101001101111011011011001100100010110001110001011011000010100110111101101011001110010001011000111000101101100001010011011110110110110011001000101100011100010110110000101001101111011010110011100100010110001110001011011000010100110111101101101100110010001011000111000101101100001010011011110110101100111001000101100011100010110110000101001101111011011011001100100010110001110001011011000010100110111101101011001110010001011000111000101101100001010011011110110110110011001000101100011100010110110000101001101111011010110011100100010110001110001011011000010100110111101101101100110010001011000111000101101100001010011011110110101100111001000101100011100010110110000101001101111011011011001100100010110001110001011011000010100110111101101011001110010001011000111000101101100001010011011110110110110001101101100110010110011100101100111001011001110011001001110100010110001100100111011000010100100100110001100011101011" }, /* 37*/ { BARCODE_EAN14, GS1_MODE, -1, "4070071967072", 0, 1, 134, 1, "Verified manually against TEC-IT", "11010011100111101011101100110110011000101000101100001001001100010011001011100100001011001001100010011001001110110111001001100011101011" @@ -1132,7 +1154,7 @@ int main(int argc, char *argv[]) { { "test_hrt", test_hrt }, { "test_reader_init", test_reader_init }, { "test_input", test_input }, - { "test_ean128_input", test_ean128_input }, + { "test_gs1_128_input", test_gs1_128_input }, { "test_hibc_input", test_hibc_input }, { "test_ean14_input", test_ean14_input }, { "test_dpd_input", test_dpd_input }, diff --git a/backend/tests/test_common.c b/backend/tests/test_common.c index 52df6d26..52bad579 100644 --- a/backend/tests/test_common.c +++ b/backend/tests/test_common.c @@ -485,21 +485,21 @@ static void test_hrt_cpy_iso8859_1(const testCtx *const p_ctx) { /* 4*/ { "\241\242\243\244\257\260", -1, 0, "¡¢£¤¯°", "" }, /* 5*/ { "\276\277\300\337\377", -1, 0, "¾¿Àßÿ", "" }, /* 6*/ { "\351", -1, 0, "é", "" }, - /* 7*/ { "\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241", -1, 0, "¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡", "79 \241" }, - /* 8*/ { "a\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241", -1, 0, "a¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡", "a + 79 \241" }, - /* 9*/ { "\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241a", -1, 0, "¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡a", "79 \241 + a" }, - /* 10*/ { "\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241", -1, 1, "¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡", "80 \241 (truncated)" }, - /* 11*/ { "a\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241", -1, 1, "a¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡", "a + 80 \241 (truncated)" }, - /* 12*/ { "\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241a", -1, 1, "¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡", "80 \241 + a (truncated)" }, - /* 13*/ { "\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241", -1, 1, "¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡", "81 \241 (truncated)" }, - /* 14*/ { "\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351", -1, 0, "ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé", "79 \351" }, - /* 15*/ { "a\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351", -1, 0, "aééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé", "a + 79 \351" }, - /* 16*/ { "\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351a", -1, 0, "éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééa", "79 \351 + a" }, - /* 17*/ { "\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351", -1, 1, "ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé", "80 \351 (truncated)" }, - /* 18*/ { "a\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351", -1, 1, "aééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé", "a + 80 \351 (truncated)" }, - /* 19*/ { "\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351a", -1, 1, "ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé", "80 \351 + a (truncated)" }, - /* 20*/ { "\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351", -1, 1, "ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé", "81 \351 (truncated)" }, - /* 21*/ { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", -1, 1, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "160 A (truncated)" }, + /* 7*/ { "\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241", -1, 0, "¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡", "99 \241" }, + /* 8*/ { "a\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241", -1, 0, "a¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡", "a + 99 \241" }, + /* 9*/ { "\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241a", -1, 0, "¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡a", "99 \241 + a" }, + /* 10*/ { "\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241", -1, 1, "¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡", "100 \241 (truncated)" }, + /* 11*/ { "a\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241", -1, 1, "a¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡", "a + 100 \241 (truncated)" }, + /* 12*/ { "\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241a", -1, 1, "¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡", "100 \241 + a (truncated)" }, + /* 13*/ { "\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241\241", -1, 1, "¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡", "101 \241 (truncated)" }, + /* 14*/ { "\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351", -1, 0, "ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé", "99 \351" }, + /* 15*/ { "a\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351", -1, 0, "aééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé", "a + 99 \351" }, + /* 16*/ { "\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351a", -1, 0, "éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééa", "99 \351 + a" }, + /* 17*/ { "\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351", -1, 1, "ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé", "100 \351 (truncated)" }, + /* 18*/ { "a\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351", -1, 1, "aééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé", "a + 100 \351 (truncated)" }, + /* 19*/ { "\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351a", -1, 1, "ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé", "100 \351 + a (truncated)" }, + /* 20*/ { "\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351\351", -1, 1, "ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé", "101 \351 (truncated)" }, + /* 21*/ { "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", -1, 1, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "200 A (truncated)" }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; diff --git a/backend/tests/test_composite.c b/backend/tests/test_composite.c index c5d74b53..1638e897 100644 --- a/backend/tests/test_composite.c +++ b/backend/tests/test_composite.c @@ -1396,21 +1396,21 @@ static void test_examples(const testCtx *const p_ctx) { "0000000001011000110000101000100110010011010011000110111010011100011101001001111010110010000100101001100011001001110010010000100101001100011010000100010011010001100010100001001000100010011100010100000000000" "0000000110100111001111010111011001101100101100111001000101100011100010110110000101001101111011010110011100110110001101101111011010110011100101111011101100101110011101011110110111011101100011101011000000000" }, - /* 66*/ { BARCODE_GS1_128_CC, -1, 3, "[01]12345678901231[90]123456789012345678901234567890[91]1234567890123456789012345678901234567890123456789012345678901234", "[20]12", 0, 5, 702, 1, "Example with max linear input and min CC-C input, CC-C 30 cols, 3 rows (bumped up from 1)", + /* 66*/ { BARCODE_GS1_128_CC, -1, 3, "[01]12345678901231[90]123456789012345678901234567890[91]1234567890123456789012345678901234567890123456789012345678901234", "[20]12", ZINT_WARN_NONCOMPLIANT, 5, 702, 1, "Example with overlarge linear input and min CC-C input, CC-C 30 cols, 3 rows (bumped up from 1)", "111111110101010001110101011100000010100010000010000111011111011101001000001000010001011101001101111000100110011110111001000011011100110011100010110111100100010111011100001010111000111000010000101100000110100100000010010001100001100010100011011000111001110110010011101111001000101111011110010100001110001110100011000011010001101111011100010010100110001100000101100011110111001111011110101000010000010001101100100011011001000001110101101111000010001100011100110111011010110000001110111010000100011000010110001110110100001000011001000010010000001010101111011110000111111101000101001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "111111110101010001111010100001000011110011011000100111100000100010101110010001100001011101011101100000111111011100101001111100100010011011100000010011010110010011100000101111001010000001010110011111001000111111010001011101110001100011101011111000110010100110101111101110001110010011110111011100011011101000110111110010111101110111001111001011110101101100000110011101111100101101000011100100011011000011110010100010001111101101010011110000100010011000111110100111100110110001001111000001000101011100100011000010111010111011000001111110111001010011111010101100000111111101000101001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "111111110101010001010111000111111011011101011100000110001111101000101100010111111001011001001111110010100010001001111001101000001011111011100011110101110110111110011001101101001000111110010011010011100000101111101100000101000000110010111010000110110111100110101101111110001011111000111011010110100001110000101110000100110001101111000010011010100110001111100110101100111111001001010011110000011110101111001000110101000111110001000110001001110010100011001111100100000111001001101000110011011110010011010000111000110111111001101001110101111101000010101000011110000111111101000101001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "000000000101100011000010100010011001001101001100011011101001110001110100100111101011001000010010100110001100100111001001000010010100110001101110100111000111010010011110101100100001001010011000110111010011100011101001001111010110010000100101001100011011101001110001110100100111101011001000010010000101000100001001001010011000110111010011100011101001001111010110010000100101001100011011101001110001110100100111101011001000010010100110001101110100111000111010010011110101100100001001010011000110111010011100011101001001111010110010000100101001100011011101001110001110100100111101011001000010010100110001101110100111000111010010011110101100100001001010011000110111010011101000010001001100110010011100010100" "000000011010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110011011000110110111101101011001110010001011000111000101101100001010011011110110101100111001000101100011100010110110000101001101111011010110011100100010110001110001011011000010100110111101101111010111011110110110101100111001000101100011100010110110000101001101111011010110011100100010110001110001011011000010100110111101101011001110010001011000111000101101100001010011011110110101100111001000101100011100010110110000101001101111011010110011100100010110001110001011011000010100110111101101011001110010001011000111000101101100001010011011110110101100111001000101100010111101110110011001101100011101011" }, - /* 67*/ { BARCODE_GS1_128_CC, -1, 3, "[01]12345678901231[90]123456789012345678901234567890[91]1234567890123456789012345678901234567890123456789012345678901234", "[20]01[90]123456789012345678901234567890[91]123456789012", 0, 5, 702, 1, "Example with max linear input and medium CC-C input, CC-C 30 cols, 3 rows (bumped up from 1 (before last digit) than 2)", + /* 67*/ { BARCODE_GS1_128_CC, -1, 3, "[01]12345678901231[90]123456789012345678901234567890[91]1234567890123456789012345678901234567890123456789012345678901234", "[20]01[90]123456789012345678901234567890[91]123456789012", ZINT_WARN_NONCOMPLIANT, 5, 702, 1, "Example with overlarge linear input and medium CC-C input, CC-C 30 cols, 3 rows (bumped up from 1 (before last digit) than 2)", "111111110101010001110101011100000010100010000010000111011111011101001000001000010001011101001101111000111000101000111001100100011101111010001011000001100101100000110000101101101100110000011010010000110000110000100011011101001110011101000011110111011011100111101100010011101111001001011110011101110001000010111000101001110001011000001100010011010010011000000110011100001101001100011011000011011101110001010000110100001000001101010011000110000010110001111011100111101111010100001000001000110110010001101100100000111010110111100001000110001110011010101111011110000111111101000101001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "111111110101010001111010100001000011010000111001000110110000111100101000100011111011010100111100001000100110001111101001111001101100010011110000010001010111001000110000101110101110110000011111101110010100111110010001001101110000001001101011001001110000010111100101000000101011001111100100011111101000101110111000110001110101111100011001010011010111110111000111001001111011101110001101110100011011111001011110111011100111100101111010110110000011001110111110010110100001110010001101100001111001010001000111110110101001111000010001001100011111010011111010101100000111111101000101001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "111111110101010001010111000111111010001100110111100101111110111000101001100101110000010101110011111100101111000010000101101110101110000011000111110100010110001011111100101100100111111001010001000100111100110100000101111101110001111010111011011111001100110110100100011111001001101001110000010111110110000010100000011001011101000011011011110010101000011110000101001100011111001101011001111110010010100111100000111111010011010001000110101110000011101111100100110110100011011111101100111110100001011001111100001010100001010011110001101011111100010010101000011110000111111101000101001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "000000000101100011000010100010011001001101001100011011101001110001110100100111101011001000010010100110001100100111001001000010010100110001101110100111000111010010011110101100100001001010011000110111010011100011101001001111010110010000100101001100011011101001110001110100100111101011001000010010000101000100001001001010011000110111010011100011101001001111010110010000100101001100011011101001110001110100100111101011001000010010100110001101110100111000111010010011110101100100001001010011000110111010011100011101001001111010110010000100101001100011011101001110001110100100111101011001000010010100110001101110100111000111010010011110101100100001001010011000110111010011101000010001001100110010011100010100" "000000011010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110011011000110110111101101011001110010001011000111000101101100001010011011110110101100111001000101100011100010110110000101001101111011010110011100100010110001110001011011000010100110111101101111010111011110110110101100111001000101100011100010110110000101001101111011010110011100100010110001110001011011000010100110111101101011001110010001011000111000101101100001010011011110110101100111001000101100011100010110110000101001101111011010110011100100010110001110001011011000010100110111101101011001110010001011000111000101101100001010011011110110101100111001000101100010111101110110011001101100011101011" }, - /* 68*/ { BARCODE_GS1_128_CC, -1, 3, "[01]12345678901231[90]123456789012345678901234567890[91]1234567890123456789012345678901234567890123456789012345678901234", "[20]01[90]123456789012345678901234567890[91]1234567890123", 0, 5, 702, 1, "Example with max linear input and medium CC-C input, CC-C 30 cols, 3 rows (bumped up from 2)", + /* 68*/ { BARCODE_GS1_128_CC, -1, 3, "[01]12345678901231[90]123456789012345678901234567890[91]1234567890123456789012345678901234567890123456789012345678901234", "[20]01[90]123456789012345678901234567890[91]1234567890123", ZINT_WARN_NONCOMPLIANT, 5, 702, 1, "Example with overlarge linear input and medium CC-C input, CC-C 30 cols, 3 rows (bumped up from 2)", "111111110101010001110101011100000010100010000010000111011111011101001000001000010001011101001101111000111000101000111001100100011101111010001011000001100101100000110000101101101100110000011010010000110000110000100011011101001110011101000011110111011011100111101100010011101111001001011110011101110001000010111000101001110001011000001100010011010010011000000110011100001101001100011011000011010111001111001100110100000100110001010011000110000010110001111011100111101111010100001000001000110110010001101100100000111010110111100001000110001110011010101111011110000111111101000101001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "111111110101010001111010100001000011010000111001000110110000111100101000100011111011010100111100001000100110001111101001111001101100010011110000010001010111001000110000101110101110110000011111101110010100111110010001001101110000001001101011001001110000010111100101000000101011001111100100011111101000101110111000110001110101111100011001010011010111110111000111001001111011101110001101110100011011111001011110111011100111100101111010110110000011001110111110010110100001110010001101100001111001010001000111110110101001111000010001001100011111010011111010101100000111111101000101001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "111111110101010001010111000111111010001100110111100101111110111000101001100101110000010101110011111100101111000010000101101110101110000011000111110100010110001011111100101100100111111001010001000100111100110100000101111101110001111010111011011111001100110110100100011111001001101001110000010111110110000010100000011001011101000011011011110010101000011110000101001100011111001101011001111110010010100111100000111011110001011101101111000001011010111100000100010110100100011111001011101000011000010001101011100000101111110001110101011110110011000010101000011110000111111101000101001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" @@ -3409,8 +3409,8 @@ static void test_input(const testCtx *const p_ctx) { /* 96*/ { BARCODE_DBAR_OMNSTK_CC, GS1NOCHECK_MODE, -1, -1, -1, "12345678901231", "[02]12345678901234", 0, 11, 56, "" }, /* 97*/ { BARCODE_GS1_128_CC, -1, -1, -1, -1, "", "[20]12", ZINT_ERROR_INVALID_OPTION, -1, -1, "Error 445: No primary (linear) message" }, /* 98*/ { BARCODE_GS1_128_CC, -1, -1, -1, -1, "[01]12345678901231", "[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[94]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[95]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[96]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[97]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[98]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[99]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, 31, 273, "" }, /* Tries CC-A then CC-B then CC-C - ensure errtxt empty */ - /* 99*/ { BARCODE_GS1_128_CC, -1, -1, -1, -1, "[01]12345678901231[90]123456789012345678901234567890[91]1234567890123456789012345678901234567890123456789012345678901234", "[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[94]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[95]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[96]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[97]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[98]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[99]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[94]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[95]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[96]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[97]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[98]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[99]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[94]123456789012345678901234567890123456789012345678901234567890123", 0, 29, 702, "" }, /* Max linear and CC-C input */ - /*100*/ { BARCODE_GS1_128_CC, -1, -1, -1, -1,"[01]12345678901231[90]123456789012345678901234567890[91]1234567890123456789012345678901234567890123456789012345678901234", "[91]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[92]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[94]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[95]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[96]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[97]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[98]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[99]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[91]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[92]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[94]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[95]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[96]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL", ZINT_ERROR_TOO_LONG, -1, -1, "Error 442: Input too long for selected 2D component" }, /* Max linear and oversized CC-C input */ + /* 99*/ { BARCODE_GS1_128_CC, -1, -1, -1, -1, "[01]12345678901231[90]123456789012345678901234567890[91]1234567890123456789012345678901234567890123456789012345678901234", "[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[94]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[95]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[96]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[97]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[98]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[99]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[94]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[95]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[96]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[97]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[98]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[99]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[94]123456789012345678901234567890123456789012345678901234567890123", ZINT_WARN_NONCOMPLIANT, 29, 702, "Warning 843: GS1-128 input too long (48 character maximum) in linear component" }, /* Overlarge linear and CC-C input */ + /*100*/ { BARCODE_GS1_128_CC, -1, -1, -1, -1,"[01]12345678901231[90]123456789012345678901234567890[91]1234567890123456789012345678901234567890123456789012345678901234", "[91]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[92]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[94]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[95]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[96]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[97]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[98]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[99]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[91]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[92]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[94]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[95]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[96]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL", ZINT_ERROR_TOO_LONG, -1, -1, "Error 442: Input too long for selected 2D component" }, /* Overlarge linear and oversized CC-C input */ /*101*/ { BARCODE_GS1_128_CC, -1, -1, -1, -1, "[01]12345678901231", "[91]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[92]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[94]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[95]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[96]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[97]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[98]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[99]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[91]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[92]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[94]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[95]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[96]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[91]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[92]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[91]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[92]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHI" "JKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL[93]ABCDEFGHIJKLM", ZINT_ERROR_TOO_LONG, -1, -1, "Error 446: 2D component input data too long" }, /* Reduced length 2291 */ /*102*/ { BARCODE_GS1_128_CC, -1, -1, -1, -1, "[01]12345678901231", "[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012" "345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[00]123456789012345675[11]121212[20]12", 0, 32, 579, "" }, /* Reduced length 2372 digits (no FNC1s) with not recommended ECC 4 > 2361 digit limit given in ISO/IEC 24723:2010 4.1 (d)(2)(iii) */ /*103*/ { BARCODE_DBAR_EXPSTK_CC, -1, -1, -1, -1, "[91]1234567890123456789012345678901234", "[20]12", 0, 13, 102, "" }, diff --git a/backend/tests/test_library.c b/backend/tests/test_library.c index 078b9e5f..925e3e33 100644 --- a/backend/tests/test_library.c +++ b/backend/tests/test_library.c @@ -79,8 +79,8 @@ static void test_checks(const testCtx *const p_ctx) { /* 14*/ { BARCODE_CODE128, -1, "1234", -1, -1, -1, 0, 0, 0, -1, -1, -1, 0, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 768: Border width out of range (0 to 100)", -1 }, /* 15*/ { BARCODE_CODE128, -1, "1234", -1, -1, -1, 0, 0, 0, 101, -1, -1, 0, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 768: Border width out of range (0 to 100)", -1 }, /* 16*/ { BARCODE_CODE128, -1, "1234", -1, GS1_MODE, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 220: Selected symbology does not support GS1 mode", -1 }, - /* 17*/ { BARCODE_EANX, -1, "123456789012", -1, -1, -1, 0, 0, 0, 101, -1, -1, -0.1, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 219: Text gap out of range (0 to 10)", -1 }, - /* 18*/ { BARCODE_EANX, -1, "123456789012", -1, -1, -1, 0, 0, 0, 101, -1, -1, 10.1, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 219: Text gap out of range (0 to 10)", -1 }, + /* 17*/ { BARCODE_EANX, -1, "123456789012", -1, -1, -1, 0, 0, 0, 101, -1, -1, -5.1, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 219: Text gap out of range (-5 to 10)", -1 }, + /* 18*/ { BARCODE_EANX, -1, "123456789012", -1, -1, -1, 0, 0, 0, 101, -1, -1, 10.1, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 219: Text gap out of range (-5 to 10)", -1 }, /* 19*/ { BARCODE_EANX, -1, "123456789012", -1, -1, -1, 0, 0, 0, 101, -1, -1, 0, -0.5, -1, ZINT_ERROR_INVALID_OPTION, "Error 769: Guard bar descent out of range (0 to 50)", -1 }, /* 20*/ { BARCODE_EANX, -1, "123456789012", -1, -1, -1, 0, 0, 0, 101, -1, -1, 0, 50.1, -1, ZINT_ERROR_INVALID_OPTION, "Error 769: Guard bar descent out of range (0 to 50)", -1 }, /* 21*/ { BARCODE_GS1_128, -1, "[21]12\0004", 8, GS1_MODE, -1, 0, 0, 0, 0, -1, -1, 0, -1, -1, ZINT_ERROR_INVALID_DATA, "Error 262: NUL characters not permitted in GS1 mode", -1 }, @@ -1505,7 +1505,7 @@ static void test_scale_from_xdimdp(const testCtx *const p_ctx) { assert_equal(ret, data[i].expected, "i:%d ZBarcode_Scale_From_XdimDp(%s, %g (dpi %d), %g, %s) %.8g != %.8g\n", i, testUtilBarcodeName(data[i].symbology), dpmm_from_dpi, data[i].dpi, data[i].x_dim, data[i].filetype, ret, data[i].expected); - if (data[i].expected > 0.1f && data[i].expected < 200.0f /* Can't round trip scales <= 0.1 or >= 200.0f */ + if (data[i].expected > 0.1f && data[i].expected < 200.0f /* Can't round trip scales <= 0.1 or >= 200.0 */ && (data[i].symbology == BARCODE_MAXICODE || strcmp(data[i].filetype, "gif") != 0)) { /* Non-MAXICODE raster rounds to half-increments */ x_dim_from_scale = ZBarcode_XdimDp_From_Scale(data[i].symbology, ret, data[i].dpmm, data[i].filetype); x_dim_from_scale = stripf(stripf(roundf(x_dim_from_scale * 100.0f)) / 100.0f); diff --git a/backend/tests/test_output.c b/backend/tests/test_output.c index 7b90dfe5..42fe3e12 100644 --- a/backend/tests/test_output.c +++ b/backend/tests/test_output.c @@ -328,6 +328,10 @@ static void test_fopen(const testCtx *const p_ctx) { testFinish(); } +#ifndef _WIN32 +extern FILE *fmemopen(void *buf, size_t size, const char *mode); +#endif + static void test_out_putsf(const testCtx *const p_ctx) { int debug = p_ctx->debug; diff --git a/backend/tests/test_pcx.c b/backend/tests/test_pcx.c index 2304467c..c75edf8b 100644 --- a/backend/tests/test_pcx.c +++ b/backend/tests/test_pcx.c @@ -117,10 +117,10 @@ static void test_print(const testCtx *const p_ctx) { assert_nonzero(testUtilDataPath(expected_file, sizeof(expected_file), data_dir, data[i].expected_file), "i:%d testUtilDataPath == 0\n", i); if (p_ctx->generate) { - printf(" /*%3d*/ { %s, %d, %s, %d, %d, %d, %d, \"%s\", \"%s\", \"%s\", \"%s\"},\n", + printf(" /*%3d*/ { %s, %d, %s, %d, %d, %d, %d, \"%s\", \"%s\", %.5g, \"%s\", \"%s\"},\n", i, testUtilBarcodeName(data[i].symbology), data[i].border_width, testUtilOutputOptionsName(data[i].output_options), data[i].whitespace_width, data[i].whitespace_height, - data[i].option_1, data[i].option_2, data[i].fgcolour, data[i].bgcolour, + data[i].option_1, data[i].option_2, data[i].fgcolour, data[i].bgcolour, data[i].scale, testUtilEscape(data[i].data, length, escaped, escaped_size), data[i].expected_file); ret = testUtilRename(symbol->outfile, expected_file); assert_zero(ret, "i:%d testUtilRename(%s, %s) ret %d != 0 (%d: %s)\n", i, symbol->outfile, expected_file, ret, errno, strerror(errno)); diff --git a/backend/tests/test_png.c b/backend/tests/test_png.c index 9caef6fe..0ffb54f2 100644 --- a/backend/tests/test_png.c +++ b/backend/tests/test_png.c @@ -57,7 +57,7 @@ static void test_pixel_plot(const testCtx *const p_ctx) { }; int data_size = ARRAY_SIZE(data); int i, ret; - struct zint_symbol *symbol; + struct zint_symbol *symbol = NULL; char *png = "out.png"; @@ -65,7 +65,7 @@ static void test_pixel_plot(const testCtx *const p_ctx) { const char *const have_identify = testUtilHaveIdentify(); - testStart("test_pixel_plot"); + testStartSymbol("test_pixel_plot", &symbol); for (i = 0; i < data_size; i++) { int size; @@ -144,93 +144,95 @@ static void test_print(const testCtx *const p_ctx) { char *comment; }; struct item data[] = { - /* 0*/ { BARCODE_CODE128, UNICODE_MODE, -1, BOLD_TEXT, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "Égjpqy", "", 0, "code128_egrave_bold.png", "" }, - /* 1*/ { BARCODE_CODE128, UNICODE_MODE, 3, BOLD_TEXT | BARCODE_BOX, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "Égjpqy", "", 0, "code128_egrave_bold_box3.png", "" }, - /* 2*/ { BARCODE_CODE128, UNICODE_MODE, 2, BOLD_TEXT | BARCODE_BOX, 2, 2, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "Égjpqy", "", 0, "code128_egrave_bold_hvwsp2_box2.png", "" }, - /* 3*/ { BARCODE_GS1_128_CC, -1, -1, -1, -1, -1, -1, 3, -1, 0, 0, { 0, 0, "" }, "", "", 0, "[00]030123456789012340", "[02]13012345678909[37]24[10]1234567ABCDEFG", 0, "gs1_128_cc_fig12.png", "" }, - /* 4*/ { BARCODE_CODABLOCKF, -1, 3, -1, -1, -1, -1, 3, -1, 0, 0, { 0, 0, "" }, "", "", 0, "AAAAAAAAA", "", 0, "codablockf_3rows.png", "" }, - /* 5*/ { BARCODE_CODABLOCKF, -1, -1, -1, 2, 2, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "AAAAAAAAA", "", 0, "codablockf_hvwsp2.png", "" }, - /* 6*/ { BARCODE_CODABLOCKF, -1, 2, BARCODE_BOX, 2, 2, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "AAAAAAAAA", "", 0, "codablockf_hvwsp2_box2.png", "" }, - /* 7*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "9771384524017", "", 0, "ean13_ggs_5.2.2.1-1.png", "" }, - /* 8*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "9771384524017", "", 0, "ean13_ggs_5.2.2.1-1_gws.png", "" }, - /* 9*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "9771384524017+12", "", 0, "ean13_2addon_ggs_5.2.2.5.1-2.png", "" }, - /* 10*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "9771384524017+12", "", 0, "ean13_2addon_ggs_5.2.2.5.1-2_gws.png", "" }, - /* 11*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "9780877799306+54321", "", 0, "ean13_5addon_ggs_5.2.2.5.2-2.png", "" }, - /* 12*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "9780877799306+54321", "", 0, "ean13_5addon_ggs_5.2.2.5.2-2_gws.png", "" }, - /* 13*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, -1, 1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "123456789012", "[91]12345678901234567890123456789", 0, "ean13_cc_cca_5x4.png", "" }, - /* 14*/ { BARCODE_EANX_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "123456789012", "[91]12345678901234567890123456789", 0, "ean13_cc_cca_5x4_gws.png", "" }, - /* 15*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, -1, 1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "123456789012+12", "[91]123456789012345678901", 0, "ean13_cc_2addon_cca_4x4.png", "" }, - /* 16*/ { BARCODE_EANX_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "123456789012+12", "[91]123456789012345678901", 0, "ean13_cc_2addon_cca_4x4_gws.png", "" }, - /* 17*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, -1, 2, -1, 0, 0, { 0, 0, "" }, "", "", 0, "123456789012+54321", "[91]1234567890", 0, "ean13_cc_5addon_ccb_3x4.png", "" }, - /* 18*/ { BARCODE_EANX_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 2, -1, 0, 0, { 0, 0, "" }, "", "", 0, "123456789012+54321", "[91]1234567890", 0, "ean13_cc_5addon_ccb_3x4_gws.png", "" }, - /* 19*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, 0, 2, -1, 0, 0, { 0, 0, "" }, "", "", 0, "123456789012+54321", "[91]1234567890", 0, "ean13_cc_5addon_ccb_3x4_notext.png", "" }, - /* 20*/ { BARCODE_UPCA, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "012345678905+24", "", 0, "upca_2addon_ggs_5.2.6.6-5.png", "" }, - /* 21*/ { BARCODE_UPCA, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "012345678905+24", "", 0, "upca_2addon_ggs_5.2.6.6-5_gws.png", "" }, - /* 22*/ { BARCODE_UPCA, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "614141234417+12345", "", 0, "upca_5addon.png", "" }, - /* 23*/ { BARCODE_UPCA, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "614141234417+12345", "", 0, "upca_5addon_gws.png", "" }, - /* 24*/ { BARCODE_UPCA, -1, -1, -1, -1, -1, 0, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "614141234417+12345", "", 0, "upca_5addon_notext.png", "" }, - /* 25*/ { BARCODE_UPCA, -1, 3, BARCODE_BIND, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "614141234417+12345", "", 0, "upca_5addon_bind3.png", "" }, - /* 26*/ { BARCODE_UPCA_CC, -1, -1, -1, -1, -1, -1, 1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "12345678901+12", "[91]123456789", 0, "upca_cc_2addon_cca_3x4.png", "" }, - /* 27*/ { BARCODE_UPCA_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "12345678901+12", "[91]123456789", 0, "upca_cc_2addon_cca_3x4_gws.png", "" }, - /* 28*/ { BARCODE_UPCA_CC, -1, -1, -1, -1, -1, -1, 2, -1, 0, 0, { 0, 0, "" }, "", "", 0, "12345678901+12121", "[91]1234567890123", 0, "upca_cc_5addon_ccb_4x4.png", "" }, - /* 29*/ { BARCODE_UPCA_CC, -1, -1, -1, -1, -1, 0, 2, -1, 0, 0, { 0, 0, "" }, "", "", 0, "12345678901+12121", "[91]1234567890123", 0, "upca_cc_5addon_ccb_4x4_notext.png", "" }, - /* 30*/ { BARCODE_UPCA_CC, -1, 3, BARCODE_BIND, -1, -1, -1, 2, -1, 0, 0, { 0, 0, "" }, "", "", 0, "12345678901+12121", "[91]1234567890123", 0, "upca_cc_5addon_ccb_4x4_bind3.png", "" }, - /* 31*/ { BARCODE_UPCE, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "1234567+12", "", 0, "upce_2addon.png", "" }, - /* 32*/ { BARCODE_UPCE, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "1234567+12", "", 0, "upce_2addon_gws.png", "" }, - /* 33*/ { BARCODE_UPCE, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "1234567+12345", "", 0, "upce_5addon.png", "" }, - /* 34*/ { BARCODE_UPCE, -1, -1, SMALL_TEXT, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "1234567+12345", "", 0, "upce_5addon_small.png", "" }, - /* 35*/ { BARCODE_UPCE, -1, -1, SMALL_TEXT | EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "1234567+12345", "", 0, "upce_5addon_small_gws.png", "" }, - /* 36*/ { BARCODE_UPCE_CC, -1, -1, -1, -1, -1, -1, 1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "0654321+89", "[91]1", 0, "upce_cc_2addon_cca_5x2.png", "" }, - /* 37*/ { BARCODE_UPCE_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "0654321+89", "[91]1", 0, "upce_cc_2addon_cca_5x2_gws.png", "" }, - /* 38*/ { BARCODE_UPCE_CC, -1, -1, -1, -1, -1, -1, 2, -1, 0, 0, { 0, 0, "" }, "", "", 0, "1876543+56789", "[91]12345", 0, "upce_cc_5addon_ccb_8x2.png", "" }, - /* 39*/ { BARCODE_UPCE_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 2, -1, 0, 0, { 0, 0, "" }, "", "", 0, "1876543+56789", "[91]12345", 0, "upce_cc_5addon_ccb_8x2_gws.png", "" }, - /* 40*/ { BARCODE_UPCE_CC, -1, -1, -1, -1, -1, 0, 2, -1, 0, 0, { 0, 0, "" }, "", "", 0, "1876543+56789", "[91]12345", 0, "upce_cc_5addon_ccb_8x2_notext.png", "" }, - /* 41*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "1234567", "", 0, "ean8_gss_5.2.2.2-1.png", "" }, - /* 42*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "1234567", "", 0, "ean8_gss_5.2.2.2-1_gws.png", "" }, - /* 43*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "1234567+12", "", 0, "ean8_2addon.png", "" }, - /* 44*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "1234567+12", "", 0, "ean8_2addon_gws.png", "" }, - /* 45*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "1234567+12345", "", 0, "ean8_5addon.png", "" }, - /* 46*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "1234567+12345", "", 0, "ean8_5addon_gws.png", "" }, - /* 47*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "9876543+65", "[91]1234567", 0, "ean8_cc_2addon_cca_4x3.png", "" }, - /* 48*/ { BARCODE_EANX_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "9876543+65", "[91]1234567", 0, "ean8_cc_2addon_cca_4x3_gws.png", "" }, - /* 49*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "9876543+74083", "[91]123456789012345678", 0, "ean8_cc_5addon_ccb_8x3.png", "" }, - /* 50*/ { BARCODE_EANX_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "9876543+74083", "[91]123456789012345678", 0, "ean8_cc_5addon_ccb_8x3_gws.png", "" }, - /* 51*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "12345", "", 0, "ean5.png", "" }, - /* 52*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "12345", "", 0, "ean5_gws.png", "" }, - /* 53*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "12", "", 0, "ean2.png", "" }, - /* 54*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "12", "", 0, "ean2_gws.png", "" }, - /* 55*/ { BARCODE_CODE39, -1, -1, SMALL_TEXT, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "123", "", 0, "code39_small.png", "" }, - /* 56*/ { BARCODE_POSTNET, -1, -1, -1, -1, -1, -1, -1, -1, 0, 3.5, { 0, 0, "" }, "", "", 0, "12345", "", 0, "postnet_zip.png", "300 dpi, using 1/43in X, 300 / 43 / 2 = ~3.5 scale" }, - /* 57*/ { BARCODE_PDF417, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "CFCECDCC", 0, "12345", "", 0, "pdf417_bgalpha.png", "" }, - /* 58*/ { BARCODE_PDF417, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "30313233", "", 0, "12345", "", 0, "pdf417_fgalpha.png", "" }, - /* 59*/ { BARCODE_PDF417, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "20212244", "CFCECDCC", 0, "12345", "", 0, "pdf417_bgfgalpha.png", "" }, - /* 60*/ { BARCODE_ULTRA, -1, -1, -1, 2, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "0000007F", "FF000033", 0, "12345", "", 0, "ultra_bgfgalpha.png", "" }, - /* 61*/ { BARCODE_ULTRA, -1, -1, -1, 2, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "FF000033", 0, "12345", "", 0, "ultra_bgalpha.png", "" }, - /* 62*/ { BARCODE_ULTRA, -1, -1, -1, 2, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "0000007F", "FF0000", 0, "12345", "", 0, "ultra_fgalpha.png", "" }, - /* 63*/ { BARCODE_ULTRA, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "0000007F", "", 0, "12345", "", 0, "ultra_fgalpha_nobg.png", "" }, - /* 64*/ { BARCODE_ULTRA, -1, 1, BARCODE_BOX, 1, 1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "12345", "", 0, "ultra_hvwsp1_box1.png", "" }, - /* 65*/ { BARCODE_ULTRA, -1, 1, BARCODE_BOX, 1, 1, -1, -1, -1, 0, 0, { 0, 0, "" }, "00FF007F", "BABDB6", 0, "12345", "", 0, "ultra_fgalpha_hvwsp1_box1.png", "" }, - /* 66*/ { BARCODE_ULTRA, -1, 1, BARCODE_BIND_TOP, 1, 1, -1, -1, -1, 0, 0, { 0, 0, "" }, "00FF007F", "BABDB6", 0, "12345", "", 0, "ultra_fgalpha_hvwsp1_bindtop1.png", "" }, - /* 67*/ { BARCODE_ULTRA, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0.5, { 0, 0, "" }, "", "", 0, "1", "", 0, "ultra_odd.png", "" }, - /* 68*/ { BARCODE_MAXICODE, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0.5, { 0, 0, "" }, "", "", 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "maxicode_0.5.png", "6 dpmm, 150 dpi" }, - /* 69*/ { BARCODE_MAXICODE, -1, 1, BARCODE_BOX, 3, -1, -1, -1, -1, 0, 0.7, { 0, 0, "" }, "", "", 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "maxicode_0.7_wsp3_box1.png", "8 dpmm, 200 dpi" }, - /* 70*/ { BARCODE_MAXICODE, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1.4, { 0, 0, "" }, "1111117F", "EEEEEEEE", 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "maxicode_1.4_bgfgalpha.png", "16 dpmm, 400 dpi" }, - /* 71*/ { BARCODE_MAXICODE, -1, -1, -1, -1, -1, -1, -1, -1, 0, 2.1, { 0, 0, "" }, "", "", 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "maxicode_2.1.png", "24 dpmm, 600 dpi" }, - /* 72*/ { BARCODE_MAXICODE, -1, 2, BARCODE_BOX, 1, 1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "maxicode_hvwsp1_box2.png", "" }, - /* 73*/ { BARCODE_MAXICODE, -1, 1, BARCODE_BIND, -1, 1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "maxicode_vwsp1_bind1.png", "" }, - /* 74*/ { BARCODE_DATAMATRIX, -1, 1, BARCODE_BIND | BARCODE_DOTTY_MODE, -1, -1, -1, -1, -1, 0, 2.0f, { 0, 0, "" }, "", "", 0, "1234", "", 0, "datamatrix_2.0_bind1_dotty.png", "" }, - /* 75*/ { BARCODE_DATAMATRIX, -1, 1, BARCODE_BIND | BARCODE_DOTTY_MODE, 1, 1, -1, -1, -1, 0, 2.0f, { 0, 0, "" }, "", "", 0, "1234", "", 0, "datamatrix_2.0_hvwsp1_bind1_dotty.png", "" }, - /* 76*/ { BARCODE_DBAR_LTD, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "12345678909", "", 0, "dbar_ltd.png", "" }, - /* 77*/ { BARCODE_PDF417, -1, -1, -1, -1, -1, -1, -1, -1, 5.0, 0, { 0, 0, "" }, "", "", 0, "Your Data Here!", "", ZINT_WARN_NONCOMPLIANT, "pdf417_height5.png", "" }, - /* 78*/ { BARCODE_USPS_IMAIL, -1, -1, -1, -1, -1, -1, -1, -1, 7.75, 0, { 0, 0, "" }, "", "", 0, "12345678901234567890", "", 0, "imail_height7.75.png", "" }, - /* 79*/ { BARCODE_AZTEC, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 4, 7, "Z1.txt" }, "", "", 0, "3456", "", 0, "aztec_z1_seq4of7.png", "" }, - /* 80*/ { BARCODE_PDF417, -1, -1, BARCODE_NO_QUIET_ZONES, -1, -1, -1, 5, 8, 16, 1.5, { 0, 0, "" }, "", "", 0, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", "", ZINT_WARN_NONCOMPLIANT, "pdf417_#204.png", "Ticket #204 Blank line in PDF417" }, - /* 81*/ { BARCODE_DPD, -1, -1, BARCODE_QUIET_ZONES | COMPLIANT_HEIGHT, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 0, "008182709980000020028101276", "", 0, "dpd_compliant.png", "Now with bind top 3X default" }, - /* 82*/ { BARCODE_CHANNEL, -1, -1, CMYK_COLOUR | COMPLIANT_HEIGHT, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "100,85,0,20", "FFFFFF00", 0, "123", "", 0, "channel_cmyk_nobg.png", "" }, + /* 0*/ { BARCODE_CODE128, UNICODE_MODE, -1, BOLD_TEXT, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "Égjpqy", "", 0, "code128_egrave_bold.png", "" }, + /* 1*/ { BARCODE_CODE128, UNICODE_MODE, 3, BOLD_TEXT | BARCODE_BOX, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "Égjpqy", "", 0, "code128_egrave_bold_box3.png", "" }, + /* 2*/ { BARCODE_CODE128, UNICODE_MODE, 2, BOLD_TEXT | BARCODE_BOX, 2, 2, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "Égjpqy", "", 0, "code128_egrave_bold_hvwsp2_box2.png", "" }, + /* 3*/ { BARCODE_GS1_128_CC, -1, -1, -1, -1, -1, -1, 3, -1, 0, 0, { 0, 0, "" }, "", "", 1, "[00]030123456789012340", "[02]13012345678909[37]24[10]1234567ABCDEFG", 0, "gs1_128_cc_fig12.png", "" }, + /* 4*/ { BARCODE_CODABLOCKF, -1, 3, -1, -1, -1, -1, 3, -1, 0, 0, { 0, 0, "" }, "", "", 1, "AAAAAAAAA", "", 0, "codablockf_3rows.png", "" }, + /* 5*/ { BARCODE_CODABLOCKF, -1, -1, -1, 2, 2, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "AAAAAAAAA", "", 0, "codablockf_hvwsp2.png", "" }, + /* 6*/ { BARCODE_CODABLOCKF, -1, 2, BARCODE_BOX, 2, 2, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "AAAAAAAAA", "", 0, "codablockf_hvwsp2_box2.png", "" }, + /* 7*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "9771384524017", "", 0, "ean13_ggs_5.2.2.1-1.png", "" }, + /* 8*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "9771384524017", "", 0, "ean13_ggs_5.2.2.1-1_gws.png", "" }, + /* 9*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "9771384524017+12", "", 0, "ean13_2addon_ggs_5.2.2.5.1-2.png", "" }, + /* 10*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "9771384524017+12", "", 0, "ean13_2addon_ggs_5.2.2.5.1-2_gws.png", "" }, + /* 11*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "9780877799306+54321", "", 0, "ean13_5addon_ggs_5.2.2.5.2-2.png", "" }, + /* 12*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "9780877799306+54321", "", 0, "ean13_5addon_ggs_5.2.2.5.2-2_gws.png", "" }, + /* 13*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, -1, 1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "123456789012", "[91]12345678901234567890123456789", 0, "ean13_cc_cca_5x4.png", "" }, + /* 14*/ { BARCODE_EANX_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "123456789012", "[91]12345678901234567890123456789", 0, "ean13_cc_cca_5x4_gws.png", "" }, + /* 15*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, -1, 1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "123456789012+12", "[91]123456789012345678901", 0, "ean13_cc_2addon_cca_4x4.png", "" }, + /* 16*/ { BARCODE_EANX_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "123456789012+12", "[91]123456789012345678901", 0, "ean13_cc_2addon_cca_4x4_gws.png", "" }, + /* 17*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, -1, 2, -1, 0, 0, { 0, 0, "" }, "", "", 1, "123456789012+54321", "[91]1234567890", 0, "ean13_cc_5addon_ccb_3x4.png", "" }, + /* 18*/ { BARCODE_EANX_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 2, -1, 0, 0, { 0, 0, "" }, "", "", 1, "123456789012+54321", "[91]1234567890", 0, "ean13_cc_5addon_ccb_3x4_gws.png", "" }, + /* 19*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, 0, 2, -1, 0, 0, { 0, 0, "" }, "", "", 1, "123456789012+54321", "[91]1234567890", 0, "ean13_cc_5addon_ccb_3x4_notext.png", "" }, + /* 20*/ { BARCODE_UPCA, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "012345678905+24", "", 0, "upca_2addon_ggs_5.2.6.6-5.png", "" }, + /* 21*/ { BARCODE_UPCA, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "012345678905+24", "", 0, "upca_2addon_ggs_5.2.6.6-5_gws.png", "" }, + /* 22*/ { BARCODE_UPCA, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "614141234417+12345", "", 0, "upca_5addon.png", "" }, + /* 23*/ { BARCODE_UPCA, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "614141234417+12345", "", 0, "upca_5addon_gws.png", "" }, + /* 24*/ { BARCODE_UPCA, -1, -1, -1, -1, -1, 0, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "614141234417+12345", "", 0, "upca_5addon_notext.png", "" }, + /* 25*/ { BARCODE_UPCA, -1, 3, BARCODE_BIND, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "614141234417+12345", "", 0, "upca_5addon_bind3.png", "" }, + /* 26*/ { BARCODE_UPCA_CC, -1, -1, -1, -1, -1, -1, 1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "12345678901+12", "[91]123456789", 0, "upca_cc_2addon_cca_3x4.png", "" }, + /* 27*/ { BARCODE_UPCA_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "12345678901+12", "[91]123456789", 0, "upca_cc_2addon_cca_3x4_gws.png", "" }, + /* 28*/ { BARCODE_UPCA_CC, -1, -1, -1, -1, -1, -1, 2, -1, 0, 0, { 0, 0, "" }, "", "", 1, "12345678901+12121", "[91]1234567890123", 0, "upca_cc_5addon_ccb_4x4.png", "" }, + /* 29*/ { BARCODE_UPCA_CC, -1, -1, -1, -1, -1, 0, 2, -1, 0, 0, { 0, 0, "" }, "", "", 1, "12345678901+12121", "[91]1234567890123", 0, "upca_cc_5addon_ccb_4x4_notext.png", "" }, + /* 30*/ { BARCODE_UPCA_CC, -1, 3, BARCODE_BIND, -1, -1, -1, 2, -1, 0, 0, { 0, 0, "" }, "", "", 1, "12345678901+12121", "[91]1234567890123", 0, "upca_cc_5addon_ccb_4x4_bind3.png", "" }, + /* 31*/ { BARCODE_UPCE, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567+12", "", 0, "upce_2addon.png", "" }, + /* 32*/ { BARCODE_UPCE, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567+12", "", 0, "upce_2addon_gws.png", "" }, + /* 33*/ { BARCODE_UPCE, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567+12345", "", 0, "upce_5addon.png", "" }, + /* 34*/ { BARCODE_UPCE, -1, -1, SMALL_TEXT, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567+12345", "", 0, "upce_5addon_small.png", "" }, + /* 35*/ { BARCODE_UPCE, -1, -1, SMALL_TEXT | EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567+12345", "", 0, "upce_5addon_small_gws.png", "" }, + /* 36*/ { BARCODE_UPCE_CC, -1, -1, -1, -1, -1, -1, 1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "0654321+89", "[91]1", 0, "upce_cc_2addon_cca_5x2.png", "" }, + /* 37*/ { BARCODE_UPCE_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "0654321+89", "[91]1", 0, "upce_cc_2addon_cca_5x2_gws.png", "" }, + /* 38*/ { BARCODE_UPCE_CC, -1, -1, -1, -1, -1, -1, 2, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1876543+56789", "[91]12345", 0, "upce_cc_5addon_ccb_8x2.png", "" }, + /* 39*/ { BARCODE_UPCE_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 2, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1876543+56789", "[91]12345", 0, "upce_cc_5addon_ccb_8x2_gws.png", "" }, + /* 40*/ { BARCODE_UPCE_CC, -1, -1, -1, -1, -1, 0, 2, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1876543+56789", "[91]12345", 0, "upce_cc_5addon_ccb_8x2_notext.png", "" }, + /* 41*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567", "", 0, "ean8_gss_5.2.2.2-1.png", "" }, + /* 42*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567", "", 0, "ean8_gss_5.2.2.2-1_gws.png", "" }, + /* 43*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567+12", "", 0, "ean8_2addon.png", "" }, + /* 44*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567+12", "", 0, "ean8_2addon_gws.png", "" }, + /* 45*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567+12345", "", 0, "ean8_5addon.png", "" }, + /* 46*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "1234567+12345", "", 0, "ean8_5addon_gws.png", "" }, + /* 47*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "9876543+65", "[91]1234567", 0, "ean8_cc_2addon_cca_4x3.png", "" }, + /* 48*/ { BARCODE_EANX_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "9876543+65", "[91]1234567", 0, "ean8_cc_2addon_cca_4x3_gws.png", "" }, + /* 49*/ { BARCODE_EANX_CC, -1, -1, -1, -1, -1, -1, 2, -1, 0, 0, { 0, 0, "" }, "", "", 1, "9876543+74083", "[91]123456789012345678", 0, "ean8_cc_5addon_ccb_8x3.png", "" }, + /* 50*/ { BARCODE_EANX_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 2, -1, 0, 0, { 0, 0, "" }, "", "", 1, "9876543+74083", "[91]123456789012345678", 0, "ean8_cc_5addon_ccb_8x3_gws.png", "" }, + /* 51*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "12345", "", 0, "ean5.png", "" }, + /* 52*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "12345", "", 0, "ean5_gws.png", "" }, + /* 53*/ { BARCODE_EANX, -1, 2, BARCODE_BIND, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "12345", "", 0, "ean5_bind2.png", "" }, + /* 54*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "12", "", 0, "ean2.png", "" }, + /* 55*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "12", "", 0, "ean2_gws.png", "" }, + /* 56*/ { BARCODE_EANX, -1, 1, BARCODE_BOX, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "12", "", 0, "ean2_box1.png", "" }, + /* 57*/ { BARCODE_CODE39, -1, -1, SMALL_TEXT, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "123", "", 0, "code39_small.png", "" }, + /* 58*/ { BARCODE_POSTNET, -1, -1, -1, -1, -1, -1, -1, -1, 0, 3.5, { 0, 0, "" }, "", "", 1, "12345", "", 0, "postnet_zip.png", "300 dpi, using 1/43in X, 300 / 43 / 2 = ~3.5 scale" }, + /* 59*/ { BARCODE_PDF417, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "CFCECDCC", 1, "12345", "", 0, "pdf417_bgalpha.png", "" }, + /* 60*/ { BARCODE_PDF417, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "30313233", "", 1, "12345", "", 0, "pdf417_fgalpha.png", "" }, + /* 61*/ { BARCODE_PDF417, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "20212244", "CFCECDCC", 1, "12345", "", 0, "pdf417_bgfgalpha.png", "" }, + /* 62*/ { BARCODE_ULTRA, -1, -1, -1, 2, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "0000007F", "FF000033", 1, "12345", "", 0, "ultra_bgfgalpha.png", "" }, + /* 63*/ { BARCODE_ULTRA, -1, -1, -1, 2, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "FF000033", 1, "12345", "", 0, "ultra_bgalpha.png", "" }, + /* 64*/ { BARCODE_ULTRA, -1, -1, -1, 2, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "0000007F", "FF0000", 1, "12345", "", 0, "ultra_fgalpha.png", "" }, + /* 65*/ { BARCODE_ULTRA, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "0000007F", "", 1, "12345", "", 0, "ultra_fgalpha_nobg.png", "" }, + /* 66*/ { BARCODE_ULTRA, -1, 1, BARCODE_BOX, 1, 1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "12345", "", 0, "ultra_hvwsp1_box1.png", "" }, + /* 67*/ { BARCODE_ULTRA, -1, 1, BARCODE_BOX, 1, 1, -1, -1, -1, 0, 0, { 0, 0, "" }, "00FF007F", "BABDB6", 1, "12345", "", 0, "ultra_fgalpha_hvwsp1_box1.png", "" }, + /* 68*/ { BARCODE_ULTRA, -1, 1, BARCODE_BIND_TOP, 1, 1, -1, -1, -1, 0, 0, { 0, 0, "" }, "00FF007F", "BABDB6", 1, "12345", "", 0, "ultra_fgalpha_hvwsp1_bindtop1.png", "" }, + /* 69*/ { BARCODE_ULTRA, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0.5, { 0, 0, "" }, "", "", 1, "1", "", 0, "ultra_odd.png", "" }, + /* 70*/ { BARCODE_MAXICODE, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0.5, { 0, 0, "" }, "", "", 1, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "maxicode_0.5.png", "6 dpmm, 150 dpi" }, + /* 71*/ { BARCODE_MAXICODE, -1, 1, BARCODE_BOX, 3, -1, -1, -1, -1, 0, 0.7, { 0, 0, "" }, "", "", 1, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "maxicode_0.7_wsp3_box1.png", "8 dpmm, 200 dpi" }, + /* 72*/ { BARCODE_MAXICODE, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1.4, { 0, 0, "" }, "1111117F", "EEEEEEEE", 1, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "maxicode_1.4_bgfgalpha.png", "16 dpmm, 400 dpi" }, + /* 73*/ { BARCODE_MAXICODE, -1, -1, -1, -1, -1, -1, -1, -1, 0, 2.1, { 0, 0, "" }, "", "", 1, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "maxicode_2.1.png", "24 dpmm, 600 dpi" }, + /* 74*/ { BARCODE_MAXICODE, -1, 2, BARCODE_BOX, 1, 1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "maxicode_hvwsp1_box2.png", "" }, + /* 75*/ { BARCODE_MAXICODE, -1, 1, BARCODE_BIND, -1, 1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "maxicode_vwsp1_bind1.png", "" }, + /* 76*/ { BARCODE_DATAMATRIX, -1, 1, BARCODE_BIND | BARCODE_DOTTY_MODE, -1, -1, -1, -1, -1, 0, 2.0, { 0, 0, "" }, "", "", 1, "1234", "", 0, "datamatrix_2.0_bind1_dotty.png", "" }, + /* 77*/ { BARCODE_DATAMATRIX, -1, 1, BARCODE_BIND | BARCODE_DOTTY_MODE, 1, 1, -1, -1, -1, 0, 2.0, { 0, 0, "" }, "", "", 1, "1234", "", 0, "datamatrix_2.0_hvwsp1_bind1_dotty.png", "" }, + /* 78*/ { BARCODE_DBAR_LTD, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "12345678909", "", 0, "dbar_ltd.png", "" }, + /* 79*/ { BARCODE_PDF417, -1, -1, -1, -1, -1, -1, -1, -1, 5.0, 0, { 0, 0, "" }, "", "", 1, "Your Data Here!", "", ZINT_WARN_NONCOMPLIANT, "pdf417_height5.png", "" }, + /* 80*/ { BARCODE_USPS_IMAIL, -1, -1, -1, -1, -1, -1, -1, -1, 7.75, 0, { 0, 0, "" }, "", "", 1, "12345678901234567890", "", 0, "imail_height7.75.png", "" }, + /* 81*/ { BARCODE_AZTEC, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, { 4, 7, "Z1.txt" }, "", "", 1, "3456", "", 0, "aztec_z1_seq4of7.png", "" }, + /* 82*/ { BARCODE_PDF417, -1, -1, BARCODE_NO_QUIET_ZONES, -1, -1, -1, 5, 8, 16, 1.5, { 0, 0, "" }, "", "", 1, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", "", ZINT_WARN_NONCOMPLIANT, "pdf417_#204.png", "Ticket #204 Blank line in PDF417" }, + /* 83*/ { BARCODE_DPD, -1, -1, BARCODE_QUIET_ZONES | COMPLIANT_HEIGHT, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "", "", 1, "008182709980000020028101276", "", 0, "dpd_compliant.png", "Now with bind top 3X default" }, + /* 84*/ { BARCODE_CHANNEL, -1, -1, CMYK_COLOUR | COMPLIANT_HEIGHT, -1, -1, -1, -1, -1, 0, 0, { 0, 0, "" }, "100,85,0,20", "FFFFFF00", 1, "123", "", 0, "channel_cmyk_nobg.png", "" }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; - struct zint_symbol *symbol; + struct zint_symbol *symbol = NULL; const char *data_dir = "/backend/tests/data/png"; const char *png = "out.png"; @@ -241,7 +243,7 @@ static void test_print(const testCtx *const p_ctx) { const char *const have_identify = testUtilHaveIdentify(); - testStart("test_print"); + testStartSymbol("test_print", &symbol); if (p_ctx->generate) { char data_dir_path[1024]; @@ -308,9 +310,11 @@ static void test_print(const testCtx *const p_ctx) { assert_nonzero(testUtilDataPath(expected_file, sizeof(expected_file), data_dir, data[i].expected_file), "i:%d testUtilDataPath == 0\n", i); if (p_ctx->generate) { - printf(" /*%3d*/ { %s, %s, %d, %s, %d, %d, %d, %d, %d, %.5g, %.5g, \"%s\", \"%s\", \"%s\", \"%s\", %s, \"%s\", \"%s\" },\n", + printf(" /*%3d*/ { %s, %s, %d, %s, %d, %d, %d, %d, %d, %.5g, %.5g, { %d, %d, \"%s\" }, \"%s\", \"%s\", %.5g, \"%s\", \"%s\", %s, \"%s\", \"%s\" },\n", i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), data[i].border_width, testUtilOutputOptionsName(data[i].output_options), - data[i].whitespace_width, data[i].whitespace_height, data[i].show_hrt, data[i].option_1, data[i].option_2, data[i].height, data[i].scale, data[i].fgcolour, data[i].bgcolour, + data[i].whitespace_width, data[i].whitespace_height, data[i].show_hrt, data[i].option_1, data[i].option_2, data[i].height, data[i].scale, + data[i].structapp.index, data[i].structapp.count, data[i].structapp.id, + data[i].fgcolour, data[i].bgcolour, data[i].text_gap, testUtilEscape(data[i].data, length, escaped, escaped_size), data[i].composite, testUtilErrorName(data[i].ret), data[i].expected_file, data[i].comment); ret = testUtilRename(symbol->outfile, expected_file); assert_zero(ret, "i:%d testUtilRename(%s, %s) ret %d != 0\n", i, symbol->outfile, expected_file, ret); @@ -441,7 +445,7 @@ static void test_large_compliant_height(const testCtx *const p_ctx) { (void)p_ctx; - testStart("test_large_compliant_height"); + testStartSymbol("test_large_compliant_height", &symbol); symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); diff --git a/backend/tests/test_raster.c b/backend/tests/test_raster.c index a9f092da..d22856ea 100644 --- a/backend/tests/test_raster.c +++ b/backend/tests/test_raster.c @@ -300,8 +300,8 @@ static void test_buffer(const testCtx *const p_ctx) { /*175*/ { BARCODE_AZTEC, COMPLIANT_HEIGHT, "1234567890AB", "", 15, 15, 15, 30, 30 }, /*176*/ { BARCODE_DAFT, -1, "DAFTDAFTDAFTDAFT", "", 8, 3, 31, 62, 16 }, /*177*/ { BARCODE_DAFT, COMPLIANT_HEIGHT, "DAFTDAFTDAFTDAFT", "", 8, 3, 31, 62, 16 }, - /*178*/ { BARCODE_DPD, -1, "0123456789012345678901234567", "", 50, 1, 189, 378, 128 }, - /*179*/ { BARCODE_DPD, COMPLIANT_HEIGHT, "0123456789012345678901234567", "", 66.5, 1, 189, 378, 161 }, + /*178*/ { BARCODE_DPD, -1, "0123456789012345678901234567", "", 50, 1, 189, 378, 122 }, + /*179*/ { BARCODE_DPD, COMPLIANT_HEIGHT, "0123456789012345678901234567", "", 66.5, 1, 189, 378, 155 }, /*180*/ { BARCODE_MICROQR, -1, "12345", "", 11, 11, 11, 22, 22 }, /*181*/ { BARCODE_MICROQR, COMPLIANT_HEIGHT, "12345", "", 11, 11, 11, 22, 22 }, /*182*/ { BARCODE_HIBC_128, -1, "1234567890", "", 50, 1, 123, 246, 116 }, @@ -1226,11 +1226,11 @@ static void test_scale(const testCtx *const p_ctx) { /* 50*/ { BARCODE_PDF417, -1, -1, -1, 45, 0.5, "1", "", 0, 45, 5, 103, 206 * 0.5, 45, 0 /*set_row*/, 45, 170 * 0.5, 14 * 0.5 }, /* Height specified */ /* 51*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 0, 0, "123456789012", "", 0, 50, 1, 79, 158, 116, 104 /*set_row*/, 114, 20, 2 }, /* With no scaling */ /* 52*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 0, 1.5, "123456789012", "", 0, 50, 1, 79, 158 * 1.5, 116 * 1.5, 104 * 1.5 /*set_row*/, 114 * 1.5, 20 * 1.5, 1 * 1.5 }, - /* 53*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 0, 2.0, "123456789012", "", 0, 50, 1, 79, 158 * 2.0, 116 * 2.0, 104 * 2.0 /*set_row*/, 114 * 2.0, 20 * 2.0, 1 * 2.0 }, - /* 54*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 0, 3.5, "123456789012", "", 0, 50, 1, 79, 158 * 3.5, 116 * 3.5, 104 * 3.5 /*set_row*/, 114 * 3.5, 20 * 3.5, 1 * 3.5 }, + /* 53*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 0, 2.0, "123456789012", "", 0, 50, 1, 79, 158 * 2.0, 116 * 2.0, 104 * 2.0 /*set_row*/, 114 * 2.0, 20 * 2.0 + 1, 1 * 2.0 + 1 }, + /* 54*/ { BARCODE_DBAR_LTD, -1, -1, BOLD_TEXT, 0, 3.5, "123456789012", "", 0, 50, 1, 79, 158 * 3.5, 116 * 3.5, 104 * 3.5 /*set_row*/, 114 * 3.5, 20 * 3.5 + 1, 1 * 3.5 + 0.5 }, /* 55*/ { BARCODE_UPCA, -1, -1, -1, 0, 0, "12345678904", "", 0, 50, 1, 95, 226, 116, 104 /*set_row*/, 114, 5, 2 }, /* With no scaling */ - /* 56*/ { BARCODE_UPCA, -1, -1, -1, 0, 2.5, "12345678904", "", 0, 50, 1, 95, 226 * 2.5, 116 * 2.5, 104 * 2.5 /*set_row*/, 114 * 2.5, 5 * 2.5, 2 * 2.5 }, - /* 57*/ { BARCODE_UPCA, -1, -1, -1, 0, 4.5, "12345678904", "", 0, 50, 1, 95, 226 * 4.5, 116 * 4.5, 104 * 4.5 /*set_row*/, 114 * 4.5, 5 * 4.5, 2 * 4.5 }, + /* 56*/ { BARCODE_UPCA, -1, -1, -1, 0, 2.5, "12345678904", "", 0, 50, 1, 95, 226 * 2.5, 116 * 2.5, 104 * 2.5 /*set_row*/, 114 * 2.5, 5 * 2.5 + 1.5, 2 * 2.5 }, + /* 57*/ { BARCODE_UPCA, -1, -1, -1, 0, 4.5, "12345678904", "", 0, 50, 1, 95, 226 * 4.5, 116 * 4.5, 104 * 4.5 /*set_row*/, 114 * 4.5, 5 * 4.5 + 1.5, 2 * 4.5 }, /* 58*/ { BARCODE_CODABLOCKF, -1, -1, -1, 0, 0, "1234567890123456", "", 0, 30, 3, 101, 242, 64, 0 /*set_row*/, 64, 42, 2 }, /* With no scaling */ /* 59*/ { BARCODE_CODABLOCKF, -1, -1, -1, 0, 0.5, "1234567890123456", "", 0, 30, 3, 101, 242 * 0.5, 64 * 0.5, 0 /*set_row*/, 64 * 0.5, 42 * 0.5, 2 * 0.5 }, /* 60*/ { BARCODE_CODABLOCKF, -1, -1, -1, 34, 0.5, "1234567890123456", "", 0, 33, 3, 101, 242 * 0.5, 35, 0 /*set_row*/, 35, 42 * 0.5, 2 * 0.5 }, /* Height specified */ @@ -1295,28 +1295,36 @@ static void test_scale(const testCtx *const p_ctx) { length = testUtilSetSymbol(symbol, data[i].symbology, UNICODE_MODE, -1 /*eci*/, -1 /*option_1*/, data[i].option_2, -1, data[i].output_options, text, -1, debug); ret = ZBarcode_Encode(symbol, (unsigned char *) text, length); - assert_nonzero(ret < ZINT_ERROR, "i:%d ZBarcode_Encode(%d) ret %d >= ZINT_ERROR (%s)\n", i, data[i].symbology, ret, symbol->errtxt); + assert_nonzero(ret < ZINT_ERROR, "i:%d ZBarcode_Encode(%s) ret %d >= ZINT_ERROR (%s)\n", + i, testUtilBarcodeName(data[i].symbology), ret, symbol->errtxt); ret = ZBarcode_Buffer(symbol, 0); - assert_equal(ret, data[i].ret_raster, "i:%d ZBarcode_Buffer(%d) ret %d != %d (%s)\n", i, data[i].symbology, ret, data[i].ret_raster, symbol->errtxt); - assert_nonnull(symbol->bitmap, "i:%d (%d) symbol->bitmap NULL\n", i, data[i].symbology); + assert_equal(ret, data[i].ret_raster, "i:%d ZBarcode_Buffer(%s) ret %d != %d (%s)\n", + i, testUtilBarcodeName(data[i].symbology), ret, data[i].ret_raster, symbol->errtxt); + assert_nonnull(symbol->bitmap, "i:%d (%s) symbol->bitmap NULL\n", i, testUtilBarcodeName(data[i].symbology)); if (p_ctx->index != -1 && (debug & ZINT_DEBUG_TEST_PRINT)) testUtilBitmapPrint(symbol, NULL, NULL); /* ZINT_DEBUG_TEST_PRINT 16 */ - assert_equal(symbol->height, data[i].expected_height, "i:%d (%d) symbol->height %.8g != %.8g\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 %.8g != %.8g\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); ret = ZBarcode_Print(symbol, 0); - assert_equal(ret, data[i].ret_raster, "i:%d ZBarcode_Print(%d) ret %d != %d (%s)\n", i, data[i].symbology, ret, data[i].ret_raster, symbol->errtxt); + assert_equal(ret, data[i].ret_raster, "i:%d ZBarcode_Print(%s) ret %d != %d (%s)\n", + i, testUtilBarcodeName(data[i].symbology), ret, data[i].ret_raster, symbol->errtxt); assert_zero(testUtilRemove(symbol->outfile), "i:%d testUtilRemove(%s) != 0\n", i, symbol->outfile); - assert_nonzero(symbol->bitmap_height >= data[i].expected_set_rows, "i:%d (%d) symbol->bitmap_height %d < expected_set_rows %d\n", - i, data[i].symbology, symbol->bitmap_height, data[i].expected_set_rows); - assert_nonzero(data[i].expected_set_rows > data[i].expected_set_row, "i:%d (%d) expected_set_rows %d <= expected_set_row %d\n", - i, data[i].symbology, data[i].expected_set_rows, data[i].expected_set_row); + assert_nonzero(symbol->bitmap_height >= data[i].expected_set_rows, "i:%d (%s) symbol->bitmap_height %d < expected_set_rows %d\n", + i, testUtilBarcodeName(data[i].symbology), symbol->bitmap_height, data[i].expected_set_rows); + assert_nonzero(data[i].expected_set_rows > data[i].expected_set_row, "i:%d (%s) expected_set_rows %d <= expected_set_row %d\n", + i, testUtilBarcodeName(data[i].symbology), data[i].expected_set_rows, data[i].expected_set_row); for (row = data[i].expected_set_row; row < data[i].expected_set_rows; row++) { int bits_set = 0; for (column = data[i].expected_set_col; column < data[i].expected_set_col + data[i].expected_set_len; column++) { @@ -1324,7 +1332,8 @@ static void test_scale(const testCtx *const p_ctx) { bits_set++; } } - assert_equal(bits_set, data[i].expected_set_len, "i:%d (%d) row %d bits_set %d != expected_set_len %d\n", i, data[i].symbology, row, bits_set, data[i].expected_set_len); + assert_equal(bits_set, data[i].expected_set_len, "i:%d (%s) row %d,%d bits_set %d != expected_set_len %d\n", + i, testUtilBarcodeName(data[i].symbology), row, data[i].expected_set_col, bits_set, data[i].expected_set_len); } ZBarcode_Delete(symbol); } @@ -1425,10 +1434,10 @@ static void test_guard_descent(const testCtx *const p_ctx) { assert_equal(ret, data[i].ret_raster, "i:%d ZBarcode_Print(%d) ret %d != %d (%s)\n", i, data[i].symbology, ret, data[i].ret_raster, symbol->errtxt); assert_zero(testUtilRemove(symbol->outfile), "i:%d testUtilRemove(%s) != 0\n", i, symbol->outfile); - assert_nonzero(symbol->bitmap_height >= data[i].expected_set_rows, "i:%d (%d) symbol->bitmap_height %d < expected_set_rows %d\n", - i, data[i].symbology, symbol->bitmap_height, data[i].expected_set_rows); - assert_nonzero(data[i].expected_set_rows > data[i].expected_set_row, "i:%d (%d) expected_set_rows %d < expected_set_row %d\n", - i, data[i].symbology, data[i].expected_set_rows, data[i].expected_set_row); + assert_nonzero(symbol->bitmap_height >= data[i].expected_set_rows, "i:%d (%s) symbol->bitmap_height %d < expected_set_rows %d\n", + i, testUtilBarcodeName(data[i].symbology), symbol->bitmap_height, data[i].expected_set_rows); + assert_nonzero(data[i].expected_set_rows > data[i].expected_set_row, "i:%d (%s) expected_set_rows %d < expected_set_row %d\n", + i, testUtilBarcodeName(data[i].symbology), data[i].expected_set_rows, data[i].expected_set_row); for (row = data[i].expected_set_row; row < data[i].expected_set_rows; row++) { int bits_set = 0; for (column = data[i].expected_set_col; column < data[i].expected_set_col + data[i].expected_set_len; column++) { @@ -1669,8 +1678,8 @@ static void test_quiet_zones(const testCtx *const p_ctx) { /*191*/ { BARCODE_DAFT, -1, -1, -1, -1, "FADT", "", 0, 8, 3, 7, 14, 16, 1 /*set*/, 0, 16, 0, 2 }, /*192*/ { BARCODE_DAFT, BARCODE_QUIET_ZONES, -1, -1, -1, "FADT", "", 0, 8, 3, 7, 14, 16, 1 /*set*/, 0, 16, 0, 2 }, /*193*/ { BARCODE_DAFT, BARCODE_NO_QUIET_ZONES, -1, -1, -1, "FADT", "", 0, 8, 3, 7, 14, 16, 1 /*set*/, 0, 16, 0, 2 }, - /*194*/ { BARCODE_DPD, -1, -1, -1, -1, "1234567890123456789012345678", "", 0, 50, 1, 189, 378, 128, 1 /*set*/, 0, 100, 0, 4 }, - /*195*/ { BARCODE_DPD, BARCODE_QUIET_ZONES, -1, -1, -1, "1234567890123456789012345678", "", 0, 50, 1, 189, 428, 128, 0 /*set*/, 0, 100, 0, 24 }, + /*194*/ { BARCODE_DPD, -1, -1, -1, -1, "1234567890123456789012345678", "", 0, 50, 1, 189, 378, 122, 1 /*set*/, 0, 100, 0, 4 }, + /*195*/ { BARCODE_DPD, BARCODE_QUIET_ZONES, -1, -1, -1, "1234567890123456789012345678", "", 0, 50, 1, 189, 428, 122, 0 /*set*/, 0, 100, 0, 24 }, /*196*/ { BARCODE_MICROQR, -1, -1, -1, -1, "1234", "", 0, 11, 11, 11, 22, 22, 1 /*set*/, 0, 14, 0, 2 }, /*197*/ { BARCODE_MICROQR, BARCODE_QUIET_ZONES, -1, -1, -1, "1234", "", 0, 11, 11, 11, 30, 30, 0 /*set*/, 0, 30, 0, 4 }, /*198*/ { BARCODE_HIBC_128, -1, -1, -1, -1, "1234", "", 0, 50, 1, 90, 180, 116, 1 /*set*/, 0, 100, 0, 4 }, @@ -1894,58 +1903,64 @@ static void test_text_gap(const testCtx *const p_ctx) { }; /* s/\/\*[ 0-9]*\*\//\=printf("\/\*%3d*\/", line(".") - line("'<")): */ struct item data[] = { - /* 0*/ { BARCODE_CODE11, -1, -1, -1, 0, 0, "1234", "", 0, 50, 1, 62, 124, 116, 1 /*set*/, 104, 105, 55, 6 }, /* Default */ - /* 1*/ { BARCODE_CODE11, -1, -1, -1, 0, 0, "1234", "", 0, 50, 1, 62, 124, 116, 0 /*set*/, 103, 104, 0, 124 }, /* Default */ - /* 2*/ { BARCODE_CODE11, -1, -1, -1, 0.1, 0, "1234", "", 0, 50, 1, 62, 124, 114, 1 /*set*/, 102, 103, 55, 6 }, - /* 3*/ { BARCODE_CODE11, -1, -1, -1, 0.4, 0, "1234", "", 0, 50, 1, 62, 124, 114, 1 /*set*/, 102, 103, 55, 6 }, - /* 4*/ { BARCODE_CODE11, -1, -1, -1, 0.5, 0, "1234", "", 0, 50, 1, 62, 124, 115, 1 /*set*/, 103, 104, 55, 6 }, - /* 5*/ { BARCODE_CODE11, -1, -1, -1, 0.5, 0, "1234", "", 0, 50, 1, 62, 124, 115, 0 /*set*/, 102, 103, 0, 124 }, - /* 6*/ { BARCODE_CODE11, -1, -1, -1, 0.6, 0, "1234", "", 0, 50, 1, 62, 124, 115, 1 /*set*/, 103, 104, 55, 6 }, - /* 7*/ { BARCODE_CODE11, -1, -1, -1, 1.0, 0, "1234", "", 0, 50, 1, 62, 124, 116, 1 /*set*/, 104, 105, 55, 6 }, /* Same as default */ - /* 8*/ { BARCODE_CODE11, -1, -1, -1, 1.0, 0, "1234", "", 0, 50, 1, 62, 124, 116, 0 /*set*/, 103, 104, 0, 124 }, /* Same as default */ - /* 9*/ { BARCODE_CODE11, -1, -1, -1, 1.5, 0, "1234", "", 0, 50, 1, 62, 124, 117, 1 /*set*/, 105, 106, 55, 6 }, - /* 10*/ { BARCODE_CODE11, -1, -1, -1, 1.5, 0, "1234", "", 0, 50, 1, 62, 124, 117, 0 /*set*/, 104, 105, 0, 124 }, - /* 11*/ { BARCODE_CODE11, -1, -1, -1, 2.0, 0, "1234", "", 0, 50, 1, 62, 124, 118, 1 /*set*/, 106, 107, 55, 6 }, - /* 12*/ { BARCODE_CODE11, -1, -1, -1, 2.0, 0, "1234", "", 0, 50, 1, 62, 124, 118, 0 /*set*/, 105, 106, 0, 124 }, - /* 13*/ { BARCODE_CODE11, -1, -1, -1, 3.0, 0, "1234", "", 0, 50, 1, 62, 124, 120, 1 /*set*/, 108, 109, 55, 6 }, - /* 14*/ { BARCODE_CODE11, -1, -1, -1, 3.0, 0, "1234", "", 0, 50, 1, 62, 124, 120, 0 /*set*/, 107, 108, 0, 124 }, - /* 15*/ { BARCODE_CODE11, -1, -1, -1, 4.0, 0, "1234", "", 0, 50, 1, 62, 124, 122, 1 /*set*/, 110, 111, 55, 6 }, - /* 16*/ { BARCODE_CODE11, -1, -1, -1, 4.0, 0, "1234", "", 0, 50, 1, 62, 124, 122, 0 /*set*/, 109, 110, 0, 124 }, - /* 17*/ { BARCODE_CODE11, -1, -1, -1, 5.0, 0, "1234", "", 0, 50, 1, 62, 124, 124, 1 /*set*/, 112, 113, 55, 6 }, - /* 18*/ { BARCODE_CODE11, -1, -1, -1, 5.0, 0, "1234", "", 0, 50, 1, 62, 124, 124, 0 /*set*/, 111, 112, 0, 124 }, - /* 19*/ { BARCODE_CODE11, -1, -1, -1, 0, 3.0, "1234", "", 0, 50, 1, 62, 372, 348, 1 /*set*/, 312, 315, 165, 18 }, /* Scale default */ - /* 20*/ { BARCODE_CODE11, -1, -1, -1, 0, 3.0, "1234", "", 0, 50, 1, 62, 372, 348, 0 /*set*/, 311, 312, 0, 372 }, /* Scale default */ - /* 21*/ { BARCODE_CODE11, -1, -1, -1, 1.5, 3.0, "1234", "", 0, 50, 1, 62, 372, 351, 1 /*set*/, 315, 318, 165, 18 }, /* Scale */ - /* 22*/ { BARCODE_CODE11, -1, -1, -1, 1.5, 3.0, "1234", "", 0, 50, 1, 62, 372, 351, 0 /*set*/, 314, 315, 0, 372 }, /* Scale */ - /* 23*/ { BARCODE_UPCA, -1, -1, -1, 0, 0, "01457130763", "", 0, 50, 1, 95, 226, 116, 1 /*set*/, 102, 104, 81, 9 }, /* Default */ - /* 24*/ { BARCODE_UPCA, -1, -1, -1, 0, 0, "01457130763", "", 0, 50, 1, 95, 226, 116, 0 /*set*/, 101, 102, 38, 72 }, /* Default */ - /* 25*/ { BARCODE_UPCA, -1, -1, -1, 0.5, 0, "01457130763", "", 0, 50, 1, 95, 226, 115, 1 /*set*/, 101, 103, 81, 9 }, - /* 26*/ { BARCODE_UPCA, -1, -1, -1, 0.75, 0, "01457130763", "", 0, 50, 1, 95, 226, 115, 1 /*set*/, 101, 103, 81, 9 }, - /* 27*/ { BARCODE_UPCA, -1, -1, -1, 1.0, 0, "01457130763", "", 0, 50, 1, 95, 226, 116, 1 /*set*/, 102, 104, 81, 9 }, /* Same as default */ - /* 28*/ { BARCODE_UPCA, -1, -1, -1, 1.0, 0, "01457130763", "", 0, 50, 1, 95, 226, 116, 0 /*set*/, 101, 102, 38, 72 }, /* Same as default */ - /* 29*/ { BARCODE_UPCA, -1, -1, -1, 2.0, 0, "01457130763", "", 0, 50, 1, 95, 226, 118, 1 /*set*/, 104, 106, 81, 9 }, - /* 30*/ { BARCODE_UPCA, -1, -1, -1, 2.0, 2.5, "01457130763", "", 0, 50, 1, 95, 565, 295, 1 /*set*/, 260, 265, 201, 22 }, /* Scale */ - /* 31*/ { BARCODE_UPCA, -1, -1, -1, 2.0, 2.5, "01457130763", "", 0, 50, 1, 95, 565, 295, 0 /*set*/, 259, 260, 95, 180 }, /* Scale */ - /* 32*/ { BARCODE_UPCA, -1, -1, -1, 0, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 116, 0 /*set*/, 14, 16, 208, 68 }, /* Default */ - /* 33*/ { BARCODE_UPCA, -1, -1, -1, 0, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 116, 1 /*set*/, 16, 100, 244, 4 }, /* Default */ - /* 34*/ { BARCODE_UPCA, -1, -1, -1, 0.5, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 115, 0 /*set*/, 14, 15, 208, 68 }, - /* 35*/ { BARCODE_UPCA, -1, -1, -1, 0.5, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 115, 1 /*set*/, 16, 100, 244, 4 }, - /* 36*/ { BARCODE_UPCA, -1, -1, -1, 1.0, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 116, 0 /*set*/, 14, 16, 208, 68 }, /* Same as default */ - /* 37*/ { BARCODE_UPCA, -1, -1, -1, 1.0, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 116, 1 /*set*/, 16, 100, 244, 4 }, /* Same as default */ - /* 38*/ { BARCODE_UPCA, -1, -1, -1, 1.5, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 117, 0 /*set*/, 14, 17, 208, 68 }, - /* 39*/ { BARCODE_UPCA, -1, -1, -1, 1.5, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 117, 1 /*set*/, 17, 100, 244, 4 }, - /* 40*/ { BARCODE_UPCA, -1, -1, -1, 2.5, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 119, 0 /*set*/, 14, 19, 208, 68 }, - /* 41*/ { BARCODE_UPCA, -1, -1, -1, 2.5, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 119, 1 /*set*/, 19, 100, 244, 4 }, - /* 42*/ { BARCODE_UPCA_CC, -1, -1, -1, 0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 116, 0 /*set*/, 38, 40, 208, 68 }, /* Default */ - /* 43*/ { BARCODE_UPCA_CC, -1, -1, -1, 0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 116, 1 /*set*/, 40, 100, 258, 4 }, /* Default */ - /* 44*/ { BARCODE_UPCA_CC, -1, -1, -1, 1.0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 116, 0 /*set*/, 38, 40, 208, 68 }, /* Same as default */ - /* 45*/ { BARCODE_UPCA_CC, -1, -1, -1, 1.0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 116, 1 /*set*/, 40, 100, 258, 4 }, - /* 46*/ { BARCODE_UPCA_CC, -1, -1, -1, 3.0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 120, 0 /*set*/, 38, 44, 208, 68 }, - /* 47*/ { BARCODE_UPCA_CC, -1, -1, -1, 3.0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 120, 1 /*set*/, 44, 100, 258, 4 }, - /* 48*/ { BARCODE_UPCA_CC, -1, -1, 0, 0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 110, 0 /*set*/, 38, 40, 208, 68 }, /* Hide text default */ - /* 49*/ { BARCODE_UPCA_CC, -1, -1, 0, 0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 110, 1 /*set*/, 40, 100, 258, 4 }, /* Hide text default */ - /* 50*/ { BARCODE_UPCA_CC, -1, -1, 0, 3.0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 110, 0 /*set*/, 38, 44, 208, 68 }, /* Hide text */ - /* 51*/ { BARCODE_UPCA_CC, -1, -1, 0, 3.0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 110, 1 /*set*/, 44, 100, 258, 4 }, /* Hide text */ + /* 0*/ { BARCODE_CODE11, -1, -1, -1, 1, 0, "1234", "", 0, 50, 1, 62, 124, 116, 1 /*set*/, 104, 105, 55, 6 }, /* Default */ + /* 1*/ { BARCODE_CODE11, -1, -1, -1, 1, 0, "1234", "", 0, 50, 1, 62, 124, 116, 0 /*set*/, 103, 104, 0, 124 }, /* Default */ + /* 2*/ { BARCODE_CODE11, -1, -1, -1, 0.1, 0, "1234", "", 0, 50, 1, 62, 124, 115, 1 /*set*/, 102, 103, 55, 6 }, + /* 3*/ { BARCODE_CODE11, -1, -1, -1, 0.3, 0, "1234", "", 0, 50, 1, 62, 124, 115, 1 /*set*/, 102, 103, 55, 6 }, + /* 4*/ { BARCODE_CODE11, -1, -1, -1, 0.4, 0, "1234", "", 0, 50, 1, 62, 124, 115, 1 /*set*/, 102, 103, 55, 6 }, + /* 5*/ { BARCODE_CODE11, -1, -1, -1, 0.5, 0, "1234", "", 0, 50, 1, 62, 124, 115, 1 /*set*/, 103, 104, 55, 6 }, + /* 6*/ { BARCODE_CODE11, -1, -1, -1, 0.5, 0, "1234", "", 0, 50, 1, 62, 124, 115, 0 /*set*/, 102, 103, 0, 124 }, + /* 7*/ { BARCODE_CODE11, -1, -1, -1, 0.6, 0, "1234", "", 0, 50, 1, 62, 124, 116, 1 /*set*/, 103, 104, 55, 6 }, + /* 8*/ { BARCODE_CODE11, -1, -1, -1, 0.9, 0, "1234", "", 0, 50, 1, 62, 124, 116, 1 /*set*/, 103, 104, 55, 6 }, + /* 9*/ { BARCODE_CODE11, -1, -1, -1, 0.9, 0, "1234", "", 0, 50, 1, 62, 124, 116, 0 /*set*/, 102, 103, 0, 124 }, + /* 10*/ { BARCODE_CODE11, -1, -1, -1, 1.5, 0, "1234", "", 0, 50, 1, 62, 124, 117, 1 /*set*/, 105, 106, 55, 6 }, + /* 11*/ { BARCODE_CODE11, -1, -1, -1, 1.5, 0, "1234", "", 0, 50, 1, 62, 124, 117, 0 /*set*/, 104, 105, 0, 124 }, + /* 12*/ { BARCODE_CODE11, -1, -1, -1, 2.0, 0, "1234", "", 0, 50, 1, 62, 124, 118, 1 /*set*/, 106, 107, 55, 6 }, + /* 13*/ { BARCODE_CODE11, -1, -1, -1, 2.0, 0, "1234", "", 0, 50, 1, 62, 124, 118, 0 /*set*/, 105, 106, 0, 124 }, + /* 14*/ { BARCODE_CODE11, -1, -1, -1, 3.0, 0, "1234", "", 0, 50, 1, 62, 124, 120, 1 /*set*/, 108, 109, 55, 6 }, + /* 15*/ { BARCODE_CODE11, -1, -1, -1, 3.0, 0, "1234", "", 0, 50, 1, 62, 124, 120, 0 /*set*/, 107, 108, 0, 124 }, + /* 16*/ { BARCODE_CODE11, -1, -1, -1, 4.0, 0, "1234", "", 0, 50, 1, 62, 124, 122, 1 /*set*/, 110, 111, 55, 6 }, + /* 17*/ { BARCODE_CODE11, -1, -1, -1, 4.0, 0, "1234", "", 0, 50, 1, 62, 124, 122, 0 /*set*/, 109, 110, 0, 124 }, + /* 18*/ { BARCODE_CODE11, -1, -1, -1, 5.0, 0, "1234", "", 0, 50, 1, 62, 124, 124, 1 /*set*/, 112, 113, 55, 6 }, + /* 19*/ { BARCODE_CODE11, -1, -1, -1, 5.0, 0, "1234", "", 0, 50, 1, 62, 124, 124, 0 /*set*/, 111, 112, 0, 124 }, + /* 20*/ { BARCODE_CODE11, -1, -1, -1, 10.0, 0, "1234", "", 0, 50, 1, 62, 124, 134, 1 /*set*/, 122, 123, 55, 6 }, + /* 21*/ { BARCODE_CODE11, -1, -1, -1, 10.0, 0, "1234", "", 0, 50, 1, 62, 124, 134, 0 /*set*/, 121, 122, 0, 124 }, + /* 22*/ { BARCODE_CODE11, -1, -1, -1, -1.0, 0, "1234", "", 0, 50, 1, 62, 124, 112, 1 /*set*/, 100, 101, 55, 6 }, + /* 23*/ { BARCODE_CODE11, -1, -1, -1, -0.5, 0, "1234", "", 0, 50, 1, 62, 124, 113, 1 /*set*/, 101, 102, 55, 6 }, + /* 24*/ { BARCODE_CODE11, -1, -1, -1, -0.5, 0, "1234", "", 0, 50, 1, 62, 124, 113, 0 /*set*/, 100, 101, 0, 124 }, + /* 25*/ { BARCODE_CODE11, -1, -1, -1, 1, 3.0, "1234", "", 0, 50, 1, 62, 372, 348, 1 /*set*/, 312, 315, 165, 18 }, /* Scale default */ + /* 26*/ { BARCODE_CODE11, -1, -1, -1, 1, 3.0, "1234", "", 0, 50, 1, 62, 372, 348, 0 /*set*/, 311, 312, 0, 372 }, /* Scale default */ + /* 27*/ { BARCODE_CODE11, -1, -1, -1, 1.5, 3.0, "1234", "", 0, 50, 1, 62, 372, 351, 1 /*set*/, 315, 318, 165, 18 }, /* Scale */ + /* 28*/ { BARCODE_CODE11, -1, -1, -1, 1.5, 3.0, "1234", "", 0, 50, 1, 62, 372, 351, 0 /*set*/, 314, 315, 0, 372 }, /* Scale */ + /* 29*/ { BARCODE_UPCA, -1, -1, -1, 1, 0, "01457130763", "", 0, 50, 1, 95, 226, 116, 1 /*set*/, 102, 104, 82, 9 }, /* Default */ + /* 30*/ { BARCODE_UPCA, -1, -1, -1, 1, 0, "01457130763", "", 0, 50, 1, 95, 226, 116, 0 /*set*/, 101, 102, 38, 72 }, /* Default */ + /* 31*/ { BARCODE_UPCA, -1, -1, -1, 0.5, 0, "01457130763", "", 0, 50, 1, 95, 226, 115, 1 /*set*/, 101, 103, 82, 9 }, + /* 32*/ { BARCODE_UPCA, -1, -1, -1, 0.75, 0, "01457130763", "", 0, 50, 1, 95, 226, 116, 1 /*set*/, 101, 103, 82, 9 }, + /* 33*/ { BARCODE_UPCA, -1, -1, -1, 0.9, 0, "01457130763", "", 0, 50, 1, 95, 226, 116, 1 /*set*/, 101, 103, 82, 9 }, + /* 34*/ { BARCODE_UPCA, -1, -1, -1, 0.9, 0, "01457130763", "", 0, 50, 1, 95, 226, 116, 0 /*set*/, 100, 101, 38, 72 }, + /* 35*/ { BARCODE_UPCA, -1, -1, -1, 2.0, 0, "01457130763", "", 0, 50, 1, 95, 226, 118, 1 /*set*/, 104, 106, 82, 9 }, + /* 36*/ { BARCODE_UPCA, -1, -1, -1, 2.0, 2.5, "01457130763", "", 0, 50, 1, 95, 565, 295, 1 /*set*/, 260, 265, 206, 22 }, /* Scale */ + /* 37*/ { BARCODE_UPCA, -1, -1, -1, 2.0, 2.5, "01457130763", "", 0, 50, 1, 95, 565, 295, 0 /*set*/, 259, 260, 95, 180 }, /* Scale */ + /* 38*/ { BARCODE_UPCA, -1, -1, -1, 1, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 116, 0 /*set*/, 14, 16, 208, 68 }, /* Default */ + /* 39*/ { BARCODE_UPCA, -1, -1, -1, 1, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 116, 1 /*set*/, 16, 100, 244, 4 }, /* Default */ + /* 40*/ { BARCODE_UPCA, -1, -1, -1, 0.5, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 115, 0 /*set*/, 14, 15, 208, 68 }, + /* 41*/ { BARCODE_UPCA, -1, -1, -1, 0.5, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 115, 1 /*set*/, 16, 100, 244, 4 }, + /* 42*/ { BARCODE_UPCA, -1, -1, -1, 0.9, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 116, 0 /*set*/, 14, 16, 208, 68 }, + /* 43*/ { BARCODE_UPCA, -1, -1, -1, 0.9, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 116, 1 /*set*/, 16, 100, 244, 4 }, + /* 44*/ { BARCODE_UPCA, -1, -1, -1, 1.5, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 117, 0 /*set*/, 14, 17, 208, 68 }, + /* 45*/ { BARCODE_UPCA, -1, -1, -1, 1.5, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 117, 1 /*set*/, 17, 100, 244, 4 }, + /* 46*/ { BARCODE_UPCA, -1, -1, -1, 2.5, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 119, 0 /*set*/, 14, 19, 208, 68 }, + /* 47*/ { BARCODE_UPCA, -1, -1, -1, 2.5, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 119, 1 /*set*/, 19, 100, 244, 4 }, + /* 48*/ { BARCODE_UPCA_CC, -1, -1, -1, 1, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 116, 0 /*set*/, 38, 40, 208, 68 }, /* Default */ + /* 49*/ { BARCODE_UPCA_CC, -1, -1, -1, 1, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 116, 1 /*set*/, 40, 100, 258, 4 }, /* Default */ + /* 50*/ { BARCODE_UPCA_CC, -1, -1, -1, 1.0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 116, 0 /*set*/, 38, 40, 208, 68 }, /* Same as default */ + /* 51*/ { BARCODE_UPCA_CC, -1, -1, -1, 1.0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 116, 1 /*set*/, 40, 100, 258, 4 }, + /* 52*/ { BARCODE_UPCA_CC, -1, -1, -1, 3.0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 120, 0 /*set*/, 38, 44, 208, 68 }, + /* 53*/ { BARCODE_UPCA_CC, -1, -1, -1, 3.0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 120, 1 /*set*/, 44, 100, 258, 4 }, + /* 54*/ { BARCODE_UPCA_CC, -1, -1, 0, 1, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 110, 0 /*set*/, 38, 40, 208, 68 }, /* Hide text default */ + /* 55*/ { BARCODE_UPCA_CC, -1, -1, 0, 1, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 110, 1 /*set*/, 40, 100, 258, 4 }, /* Hide text default */ + /* 56*/ { BARCODE_UPCA_CC, -1, -1, 0, 3.0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 110, 0 /*set*/, 38, 44, 208, 68 }, /* Hide text */ + /* 57*/ { BARCODE_UPCA_CC, -1, -1, 0, 3.0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 110, 1 /*set*/, 44, 100, 258, 4 }, /* Hide text */ }; int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -1998,13 +2013,13 @@ static void test_text_gap(const testCtx *const p_ctx) { assert_equal(ret, data[i].ret, "i:%d ZBarcode_Print(%d) ret %d != %d (%s)\n", i, data[i].symbology, ret, data[i].ret, symbol->errtxt); assert_zero(testUtilRemove(symbol->outfile), "i:%d testUtilRemove(%s) != 0\n", i, symbol->outfile); - assert_nonzero(symbol->bitmap_height >= data[i].expected_set_rows, "i:%d (%d) symbol->bitmap_height %d < expected_set_rows %d\n", - i, data[i].symbology, symbol->bitmap_height, data[i].expected_set_rows); - assert_nonzero(data[i].expected_set_rows > data[i].expected_set_row, "i:%d (%d) expected_set_rows %d < expected_set_row %d\n", - i, data[i].symbology, data[i].expected_set_rows, data[i].expected_set_row); + assert_nonzero(symbol->bitmap_height >= data[i].expected_set_rows, "i:%d (%s) symbol->bitmap_height %d < expected_set_rows %d\n", + i, testUtilBarcodeName(data[i].symbology), symbol->bitmap_height, data[i].expected_set_rows); + assert_nonzero(data[i].expected_set_rows > data[i].expected_set_row, "i:%d (%s) expected_set_rows %d < expected_set_row %d\n", + i, testUtilBarcodeName(data[i].symbology), data[i].expected_set_rows, data[i].expected_set_row); assert_nonzero(symbol->bitmap_width >= data[i].expected_set_col + data[i].expected_set_len, - "i:%d (%d) symbol->bitmap_width %d < expected_set_col %d + expected_set_len %d\n", - i, data[i].symbology, symbol->bitmap_width, data[i].expected_set_col, data[i].expected_set_len); + "i:%d (%s) symbol->bitmap_width %d < expected_set_col %d + expected_set_len %d\n", + i, testUtilBarcodeName(data[i].symbology), symbol->bitmap_width, data[i].expected_set_col, data[i].expected_set_len); for (row = data[i].expected_set_row; row < data[i].expected_set_rows; row++) { int bits_set = 0; for (column = data[i].expected_set_col; column < data[i].expected_set_col + data[i].expected_set_len; column++) { @@ -2013,7 +2028,8 @@ static void test_text_gap(const testCtx *const p_ctx) { } } if (data[i].expected_set) { - assert_equal(bits_set, data[i].expected_set_len, "i:%d (%d) row %d bits_set %d != expected_set_len %d\n", i, data[i].symbology, row, bits_set, data[i].expected_set_len); + assert_equal(bits_set, data[i].expected_set_len, "i:%d (%s) row %d,%d bits_set %d != expected_set_len %d\n", + i, testUtilBarcodeName(data[i].symbology), row, data[i].expected_set_col, bits_set, data[i].expected_set_len); } else { assert_zero(bits_set, "i:%d (%d) row %d bits_set %d != 0\n", i, data[i].symbology, row, bits_set); } @@ -2587,10 +2603,10 @@ static void test_height(const testCtx *const p_ctx) { /*348*/ { BARCODE_DAFT, -1, 12, "DAFTDAFTDAFTDAFT", "", 0, 12, 3, 31, 62, 24, "" }, /*349*/ { BARCODE_DAFT, -1, 16, "DAFTDAFTDAFTDAFT", "", 0, 16, 3, 31, 62, 32, "" }, /*350*/ { BARCODE_DAFT, COMPLIANT_HEIGHT, 16, "DAFTDAFTDAFTDAFT", "", 0, 16, 3, 31, 62, 32, "" }, - /*351*/ { BARCODE_DPD, -1, 1, "0123456789012345678901234567", "", 0, 1, 1, 189, 378, 14, "" }, - /*352*/ { BARCODE_DPD, -1, 62, "0123456789012345678901234567", "", 0, 62, 1, 189, 378, 136, "" }, - /*353*/ { BARCODE_DPD, COMPLIANT_HEIGHT, 62, "0123456789012345678901234567", "", ZINT_WARN_NONCOMPLIANT, 62, 1, 189, 378, 136, "" }, - /*354*/ { BARCODE_DPD, COMPLIANT_HEIGHT, 62.5, "0123456789012345678901234567", "", 0, 62.5, 1, 189, 378, 137, "" }, + /*351*/ { BARCODE_DPD, -1, 1, "0123456789012345678901234567", "", 0, 1, 1, 189, 378, 8, "" }, + /*352*/ { BARCODE_DPD, -1, 62, "0123456789012345678901234567", "", 0, 62, 1, 189, 378, 130, "" }, + /*353*/ { BARCODE_DPD, COMPLIANT_HEIGHT, 62, "0123456789012345678901234567", "", ZINT_WARN_NONCOMPLIANT, 62, 1, 189, 378, 130, "" }, + /*354*/ { BARCODE_DPD, COMPLIANT_HEIGHT, 62.5, "0123456789012345678901234567", "", 0, 62.5, 1, 189, 378, 131, "" }, /*355*/ { BARCODE_MICROQR, -1, 1, "12345", "", 0, 11, 11, 11, 22, 22, "Fixed width-to-height ratio, symbol->height ignored" }, /*356*/ { BARCODE_HIBC_128, -1, 1, "1234567890", "", 0, 1, 1, 123, 246, 2, "" }, /*357*/ { BARCODE_HIBC_128, COMPLIANT_HEIGHT, 1, "1234567890", "", 0, 1, 1, 123, 246, 2, "" }, @@ -2624,8 +2640,8 @@ static void test_height(const testCtx *const p_ctx) { /*385*/ { BARCODE_MAILMARK_2D, -1, 1, "012100123412345678AB19XY1A 0", "", 0, 24, 24, 24, 48, 48, "Fixed width-to-height ratio, symbol->height ignored" }, /*386*/ { BARCODE_UPU_S10, -1, 1, "EE876543216CA", "", 0, 1, 1, 156, 312, 2, "" }, /*387*/ { BARCODE_UPU_S10, COMPLIANT_HEIGHT, 1, "EE876543216CA", "", ZINT_WARN_NONCOMPLIANT, 1, 1, 156, 312, 2, "" }, - /*388*/ { BARCODE_UPU_S10, -1, 24.5f, "EE876543216CA", "", 0, 24.5f, 1, 156, 312, 49, "" }, - /*389*/ { BARCODE_UPU_S10, COMPLIANT_HEIGHT, 24.5f, "EE876543216CA", "", ZINT_WARN_NONCOMPLIANT, 24.5f, 1, 156, 312, 49, "" }, + /*388*/ { BARCODE_UPU_S10, -1, 24.5, "EE876543216CA", "", 0, 24.5, 1, 156, 312, 49, "" }, + /*389*/ { BARCODE_UPU_S10, COMPLIANT_HEIGHT, 24.5, "EE876543216CA", "", ZINT_WARN_NONCOMPLIANT, 24.5, 1, 156, 312, 49, "" }, /*390*/ { BARCODE_UPU_S10, -1, 25, "EE876543216CA", "", 0, 25, 1, 156, 312, 50, "" }, /*391*/ { BARCODE_UPU_S10, COMPLIANT_HEIGHT, 25, "EE876543216CA", "", 0, 25, 1, 156, 312, 50, "" }, /*392*/ { BARCODE_MAILMARK_4S, -1, -1, "01000000000000000AA00AA0A", "", 0, 10, 3, 155, 310, 20, "" }, diff --git a/backend/tests/test_svg.c b/backend/tests/test_svg.c index 8deec5b3..523d42c9 100644 --- a/backend/tests/test_svg.c +++ b/backend/tests/test_svg.c @@ -119,24 +119,26 @@ static void test_print(const testCtx *const p_ctx) { /* 59*/ { BARCODE_EANX_CC, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, 2, -1, -1, 0, "", "", 0, "9876543+74083", "[91]123456789012345678", 0, "ean8_cc_5addon_ccb_8x3_gws.svg", "" }, /* 60*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "12345", "", 0, "ean5.svg", "" }, /* 61*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "12345", "", 0, "ean5_gws.svg", "" }, - /* 62*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "12", "", 0, "ean2.svg", "" }, - /* 63*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "12", "", 0, "ean2_gws.svg", "" }, - /* 64*/ { BARCODE_CODE39, -1, -1, SMALL_TEXT, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "123", "", 0, "code39_small.svg", "" }, - /* 65*/ { BARCODE_POSTNET, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "12345", "", 0, "postnet_zip.svg", "" }, - /* 66*/ { BARCODE_MAXICODE, -1, 2, BARCODE_BOX, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "maxicode_box2.svg", "" }, - /* 67*/ { BARCODE_MAXICODE, -1, 1, BARCODE_BIND, -1, 1, -1, -1, -1, -1, 0, "", "", 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "maxicode_vwsp1_bind1.svg", "" }, - /* 68*/ { BARCODE_MAXICODE, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, "121212DD", "EEEEEE22", 90, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "maxicode_fgbg_rotate_90.svg", "" }, - /* 69*/ { BARCODE_DATAMATRIX, -1, 1, BARCODE_BIND | BARCODE_DOTTY_MODE, -1, 1, -1, -1, -1, -1, 0, "", "", 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "datamatrix_vwsp1_bind1_dotty.svg", "" }, - /* 70*/ { BARCODE_DATAMATRIX, -1, 1, BARCODE_BIND | BARCODE_DOTTY_MODE, 1, 1, -1, -1, -1, -1, 0, "", "", 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "datamatrix_hvwsp1_bind1_dotty.svg", "" }, - /* 71*/ { BARCODE_DBAR_LTD, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "12345678909", "", 0, "dbar_ltd.svg", "" }, - /* 72*/ { BARCODE_PDF417, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, "", "", 0, "Your Data Here!", "", ZINT_WARN_NONCOMPLIANT, "pdf417_height5.svg", "" }, - /* 73*/ { BARCODE_USPS_IMAIL, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7.75, "", "", 0, "12345678901234567890", "", 0, "imail_height7.75.svg", "" }, - /* 74*/ { BARCODE_ULTRA, -1, 3, BARCODE_BOX, 2, 2, -1, -1, -1, -1, 0, "FF0000", "0000FF", 0, "12345678901234567890", "", 0, "ultra_fgbg_hvwsp2_box3.svg", "" }, - /* 75*/ { BARCODE_TELEPEN, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0.4, "", "", 180, "A", "", 0, "telepen_height0.4_rotate_180.svg", "" }, - /* 76*/ { BARCODE_CODE49, -1, -1, COMPLIANT_HEIGHT, -1, -1, -1, -1, -1, -1, 0, "FF11157F", "", 0, "A", "", 0, "code49_comph_fgalpha.svg", "" }, - /* 77*/ { BARCODE_CODABLOCKF, -1, -1, COMPLIANT_HEIGHT, -1, -1, -1, -1, -1, 2, 0, "00000033", "FFFFFF66", 0, "1234567890123456789012345678901234", "", 0, "codablockf_comph_sep2_fgbgalpha.svg", "" }, - /* 78*/ { BARCODE_DPD, -1, -1, BARCODE_QUIET_ZONES | COMPLIANT_HEIGHT, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "008182709980000020028101276", "", 0, "dpd_compliant.svg", "" }, - /* 79*/ { BARCODE_CHANNEL, -1, -1, CMYK_COLOUR | COMPLIANT_HEIGHT, -1, -1, -1, -1, -1, -1, 0, "100,85,0,20", "FFFFFF00", 0, "123", "", 0, "channel_cmyk_nobg.svg", "" }, + /* 62*/ { BARCODE_EANX, -1, 2, BARCODE_BIND, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "12345", "", 0, "ean5_bind2.svg", "" }, + /* 63*/ { BARCODE_EANX, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "12", "", 0, "ean2.svg", "" }, + /* 64*/ { BARCODE_EANX, -1, -1, EANUPC_GUARD_WHITESPACE, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "12", "", 0, "ean2_gws.svg", "" }, + /* 65*/ { BARCODE_EANX, -1, 1, BARCODE_BOX, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "12", "", 0, "ean2_box1.svg", "" }, + /* 66*/ { BARCODE_CODE39, -1, -1, SMALL_TEXT, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "123", "", 0, "code39_small.svg", "" }, + /* 67*/ { BARCODE_POSTNET, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "12345", "", 0, "postnet_zip.svg", "" }, + /* 68*/ { BARCODE_MAXICODE, -1, 2, BARCODE_BOX, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "maxicode_box2.svg", "" }, + /* 69*/ { BARCODE_MAXICODE, -1, 1, BARCODE_BIND, -1, 1, -1, -1, -1, -1, 0, "", "", 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "maxicode_vwsp1_bind1.svg", "" }, + /* 70*/ { BARCODE_MAXICODE, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, "121212DD", "EEEEEE22", 90, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "maxicode_fgbg_rotate_90.svg", "" }, + /* 71*/ { BARCODE_DATAMATRIX, -1, 1, BARCODE_BIND | BARCODE_DOTTY_MODE, -1, 1, -1, -1, -1, -1, 0, "", "", 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "datamatrix_vwsp1_bind1_dotty.svg", "" }, + /* 72*/ { BARCODE_DATAMATRIX, -1, 1, BARCODE_BIND | BARCODE_DOTTY_MODE, 1, 1, -1, -1, -1, -1, 0, "", "", 0, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "", 0, "datamatrix_hvwsp1_bind1_dotty.svg", "" }, + /* 73*/ { BARCODE_DBAR_LTD, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "12345678909", "", 0, "dbar_ltd.svg", "" }, + /* 74*/ { BARCODE_PDF417, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, "", "", 0, "Your Data Here!", "", ZINT_WARN_NONCOMPLIANT, "pdf417_height5.svg", "" }, + /* 75*/ { BARCODE_USPS_IMAIL, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7.75, "", "", 0, "12345678901234567890", "", 0, "imail_height7.75.svg", "" }, + /* 76*/ { BARCODE_ULTRA, -1, 3, BARCODE_BOX, 2, 2, -1, -1, -1, -1, 0, "FF0000", "0000FF", 0, "12345678901234567890", "", 0, "ultra_fgbg_hvwsp2_box3.svg", "" }, + /* 77*/ { BARCODE_TELEPEN, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0.4, "", "", 180, "A", "", 0, "telepen_height0.4_rotate_180.svg", "" }, + /* 78*/ { BARCODE_CODE49, -1, -1, COMPLIANT_HEIGHT, -1, -1, -1, -1, -1, -1, 0, "FF11157F", "", 0, "A", "", 0, "code49_comph_fgalpha.svg", "" }, + /* 79*/ { BARCODE_CODABLOCKF, -1, -1, COMPLIANT_HEIGHT, -1, -1, -1, -1, -1, 2, 0, "00000033", "FFFFFF66", 0, "1234567890123456789012345678901234", "", 0, "codablockf_comph_sep2_fgbgalpha.svg", "" }, + /* 80*/ { BARCODE_DPD, -1, -1, BARCODE_QUIET_ZONES | COMPLIANT_HEIGHT, -1, -1, -1, -1, -1, -1, 0, "", "", 0, "008182709980000020028101276", "", 0, "dpd_compliant.svg", "" }, + /* 81*/ { BARCODE_CHANNEL, -1, -1, CMYK_COLOUR | COMPLIANT_HEIGHT, -1, -1, -1, -1, -1, -1, 0, "100,85,0,20", "FFFFFF00", 0, "123", "", 0, "channel_cmyk_nobg.svg", "" }, }; int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -216,11 +218,12 @@ static void test_print(const testCtx *const p_ctx) { assert_nonzero(testUtilDataPath(expected_file, sizeof(expected_file), data_dir, data[i].expected_file), "i:%d testUtilDataPath == 0\n", i); if (p_ctx->generate) { - printf(" /*%3d*/ { %s, %s, %d, %s, %d, %d, %d, %d, %d, %d, %.8g, \"%s\", \"%s\", %d, \"%s\", \"%s\", \"%s\", \"%s\" },\n", + printf(" /*%3d*/ { %s, %s, %d, %s, %d, %d, %d, %d, %d, %d, %.8g, \"%s\", \"%s\", %d, \"%s\", \"%s\", %s, \"%s\", \"%s\" },\n", i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), data[i].border_width, testUtilOutputOptionsName(data[i].output_options), data[i].whitespace_width, data[i].whitespace_height, data[i].show_hrt, data[i].option_1, data[i].option_2, data[i].option_3, data[i].height, data[i].fgcolour, data[i].bgcolour, data[i].rotate_angle, - testUtilEscape(data[i].data, length, escaped, escaped_size), data[i].composite, data[i].expected_file, data[i].comment); + testUtilEscape(data[i].data, length, escaped, escaped_size), data[i].composite, + testUtilErrorName(data[i].ret), data[i].expected_file, data[i].comment); ret = testUtilRename(symbol->outfile, expected_file); assert_zero(ret, "i:%d testUtilRename(%s, %s) ret %d != 0\n", i, symbol->outfile, expected_file, ret); if (have_libreoffice) { diff --git a/backend/tests/test_vector.c b/backend/tests/test_vector.c index 2159d30c..9ad6365a 100644 --- a/backend/tests/test_vector.c +++ b/backend/tests/test_vector.c @@ -167,7 +167,7 @@ static int check_vector_strings(const struct zint_symbol *symbol, char errmsg[12 return 0; } } - if (is_extendable(symbol->symbology)) { + if ((ZBarcode_Cap(symbol->symbology, ZINT_CAP_EANUPC) & ZINT_CAP_EANUPC) == ZINT_CAP_EANUPC) { const unsigned char *addon = (const unsigned char *) strchr((const char *) symbol->text, '+'); const int has_addon = addon != NULL; const int text_len = has_addon ? (int) (addon - symbol->text) : (int) ustrlen(symbol->text); @@ -640,7 +640,7 @@ static void test_buffer_vector(const testCtx *const p_ctx) { /* 86*/ { BARCODE_KIX, "123456ABCDE", "", 8, 3, 87, 174, 16 }, /* 87*/ { BARCODE_AZTEC, "1234567890AB", "", 15, 15, 15, 30, 30 }, /* 88*/ { BARCODE_DAFT, "DAFTDAFTDAFTDAFT", "", 8, 3, 31, 62, 16 }, - /* 89*/ { BARCODE_DPD, "0123456789012345678901234567", "", 50, 1, 189, 378, 128.28 }, + /* 89*/ { BARCODE_DPD, "0123456789012345678901234567", "", 50, 1, 189, 378, 122.28 }, /* 90*/ { BARCODE_MICROQR, "12345", "", 11, 11, 11, 22, 22 }, /* 91*/ { BARCODE_HIBC_128, "1234567890", "", 50, 1, 123, 246, 116.28 }, /* 92*/ { BARCODE_HIBC_39, "1234567890", "", 50, 1, 223, 446, 116.28 }, @@ -1029,14 +1029,14 @@ static void test_upcean_hrt(const testCtx *const p_ctx) { assert_nonnull(symbol->vector->strings, "i:%d (%s) vector->strings NULL\n", i, testUtilBarcodeName(data[i].symbology)); string = find_string(symbol, data[i].expected_string_x, data[i].expected_string_y); - assert_nonnull(string, "i:%d (%s) find_string(%g, %g) NULL\n", + assert_nonnull(string, "i:%d (%s) find_string(%.9g, %.9g) NULL\n", i, testUtilBarcodeName(data[i].symbology), data[i].expected_string_x, data[i].expected_string_y); if (data[i].expected_string2_x != -1) { assert_nonnull(symbol->vector->strings->next, "i:%d (%s) vector->strings->next NULL\n", i, testUtilBarcodeName(data[i].symbology)); string = find_string(symbol, data[i].expected_string2_x, data[i].expected_string2_y); - assert_nonnull(string, "i:%d (%s) find_string(%g, %g) NULL\n", + assert_nonnull(string, "i:%d (%s) find_string(%.9g, %.9g) NULL\n", i, testUtilBarcodeName(data[i].symbology), data[i].expected_string2_x, data[i].expected_string2_y); } } else { @@ -1675,8 +1675,9 @@ static void test_guard_descent(const testCtx *const p_ctx) { i, testUtilBarcodeName(data[i].symbology), symbol->vector->height, data[i].expected_vector_height); rect = find_rect(symbol, data[i].expected_set_x, data[i].expected_set_y, data[i].expected_set_width, data[i].expected_set_height); - assert_nonnull(rect, "i:%d (%d) find_rect(%g, %g, %g, %g) NULL\n", - i, data[i].symbology, data[i].expected_set_x, data[i].expected_set_y, data[i].expected_set_width, data[i].expected_set_height); + assert_nonnull(rect, "i:%d (%s) find_rect(%.9g, %.9g, %.9g, %.9g) NULL\n", + i, testUtilBarcodeName(data[i].symbology), data[i].expected_set_x, + data[i].expected_set_y, data[i].expected_set_width, data[i].expected_set_height); } ZBarcode_Delete(symbol); @@ -1903,8 +1904,8 @@ static void test_quiet_zones(const testCtx *const p_ctx) { /*190*/ { BARCODE_DAFT, -1, -1, -1, -1, "FADT", "", 0, 8, 3, 7, 14, 16, 0, 0, 2, 16 }, /*191*/ { BARCODE_DAFT, BARCODE_QUIET_ZONES, -1, -1, -1, "FADT", "", 0, 8, 3, 7, 14, 16, 0, 0, 2, 16 }, /*192*/ { BARCODE_DAFT, BARCODE_NO_QUIET_ZONES, -1, -1, -1, "FADT", "", 0, 8, 3, 7, 14, 16, 0, 0, 2, 16 }, - /*193*/ { BARCODE_DPD, -1, -1, -1, -1, "1234567890123456789012345678", "", 0, 50, 1, 189, 378, 128.28, 0, 6, 4, 100 }, - /*194*/ { BARCODE_DPD, BARCODE_QUIET_ZONES, -1, -1, -1, "1234567890123456789012345678", "", 0, 50, 1, 189, 428, 128.28, 25, 6, 4, 100 }, + /*193*/ { BARCODE_DPD, -1, -1, -1, -1, "1234567890123456789012345678", "", 0, 50, 1, 189, 378, 122.28, 0, 6, 4, 100 }, + /*194*/ { BARCODE_DPD, BARCODE_QUIET_ZONES, -1, -1, -1, "1234567890123456789012345678", "", 0, 50, 1, 189, 428, 122.28, 25, 6, 4, 100 }, /*195*/ { BARCODE_MICROQR, -1, -1, -1, -1, "1234", "", 0, 11, 11, 11, 22, 22, 0, 0, 14, 2 }, /*196*/ { BARCODE_MICROQR, BARCODE_QUIET_ZONES, -1, -1, -1, "1234", "", 0, 11, 11, 11, 30, 30, 4, 4, 14, 2 }, /*197*/ { BARCODE_HIBC_128, -1, -1, -1, -1, "1234", "", 0, 50, 1, 90, 180, 116.28, 0, 0, 4, 100 }, @@ -2065,12 +2066,14 @@ static void test_quiet_zones(const testCtx *const p_ctx) { if (symbol->symbology == BARCODE_MAXICODE || symbol->symbology == BARCODE_DOTCODE) { circle = find_circle(symbol, data[i].expected_set_x, data[i].expected_set_y, data[i].expected_set_width); - assert_nonnull(circle, "i:%d (%d) find_circle(%g, %g, %g) NULL\n", - i, data[i].symbology, data[i].expected_set_x, data[i].expected_set_y, data[i].expected_set_width); + assert_nonnull(circle, "i:%d (%s) find_circle(%.9g, %.9g, %.9g) NULL\n", + i, testUtilBarcodeName(data[i].symbology), data[i].expected_set_x, + data[i].expected_set_y, data[i].expected_set_width); } else { rect = find_rect(symbol, data[i].expected_set_x, data[i].expected_set_y, data[i].expected_set_width, data[i].expected_set_height); - assert_nonnull(rect, "i:%d (%d) find_rect(%g, %g, %g, %g) NULL\n", - i, data[i].symbology, data[i].expected_set_x, data[i].expected_set_y, data[i].expected_set_width, data[i].expected_set_height); + assert_nonnull(rect, "i:%d (%s) find_rect(%.9g, %.9g, %.9g, %.9g) NULL\n", + i, testUtilBarcodeName(data[i].symbology), data[i].expected_set_x, + data[i].expected_set_y, data[i].expected_set_width, data[i].expected_set_height); } } @@ -2106,18 +2109,18 @@ static void test_text_gap(const testCtx *const p_ctx) { }; /* s/\/\*[ 0-9]*\*\//\=printf("\/\*%3d*\/", line(".") - line("'<")): */ struct item data[] = { - /* 0*/ { BARCODE_CODE11, -1, -1, -1, 0, 0, "1234", "", 0, 50, 1, 62, 124, 116.28, 62.0, 113.3444, -1, -1 }, /* Default */ - /* 1*/ { BARCODE_CODE11, -1, -1, -1, 0.1, 0, "1234", "", 0, 50, 1, 62, 124, 114.479996, 62.0, 111.5444, -1, -1 }, - /* 2*/ { BARCODE_CODE11, -1, -1, -1, 0.2, 0, "1234", "", 0, 50, 1, 62, 124, 114.68, 62.0, 111.7444, -1, -1 }, - /* 3*/ { BARCODE_CODE11, -1, -1, -1, 0.3, 0, "1234", "", 0, 50, 1, 62, 124, 114.88, 62.0, 111.9444, -1, -1 }, - /* 4*/ { BARCODE_CODE11, -1, -1, -1, 0.4, 0, "1234", "", 0, 50, 1, 62, 124, 115.08, 62.0, 112.1444, -1, -1 }, - /* 5*/ { BARCODE_CODE11, -1, -1, -1, 0.5, 0, "1234", "", 0, 50, 1, 62, 124, 115.28, 62.0, 112.3444, -1, -1 }, - /* 6*/ { BARCODE_CODE11, -1, -1, -1, 0.6, 0, "1234", "", 0, 50, 1, 62, 124, 115.479996, 62.0, 112.5444, -1, -1 }, - /* 7*/ { BARCODE_CODE11, -1, -1, -1, 0.7, 0, "1234", "", 0, 50, 1, 62, 124, 115.68, 62.0, 112.7444, -1, -1 }, - /* 8*/ { BARCODE_CODE11, -1, -1, -1, 0.75, 0, "1234", "", 0, 50, 1, 62, 124, 115.78, 62.0, 112.8444, -1, -1 }, - /* 9*/ { BARCODE_CODE11, -1, -1, -1, 0.8, 0, "1234", "", 0, 50, 1, 62, 124, 115.88, 62.0, 112.9444, -1, -1 }, - /* 10*/ { BARCODE_CODE11, -1, -1, -1, 0.9, 0, "1234", "", 0, 50, 1, 62, 124, 116.08, 62.0, 113.1444, -1, -1 }, - /* 11*/ { BARCODE_CODE11, -1, -1, -1, 1.0, 0, "1234", "", 0, 50, 1, 62, 124, 116.28, 62.0, 113.3444, -1, -1 }, /* Same as default */ + /* 0*/ { BARCODE_CODE11, -1, -1, -1, 1, 0, "1234", "", 0, 50, 1, 62, 124, 116.28, 62.0, 113.3444, -1, -1 }, /* Default */ + /* 1*/ { BARCODE_CODE11, -1, -1, -1, 0, 0, "1234", "", 0, 50, 1, 62, 124, 114.28, 62.0, 111.3444, -1, -1 }, + /* 2*/ { BARCODE_CODE11, -1, -1, -1, 0.1, 0, "1234", "", 0, 50, 1, 62, 124, 114.479996, 62.0, 111.5444, -1, -1 }, + /* 3*/ { BARCODE_CODE11, -1, -1, -1, 0.2, 0, "1234", "", 0, 50, 1, 62, 124, 114.68, 62.0, 111.7444, -1, -1 }, + /* 4*/ { BARCODE_CODE11, -1, -1, -1, 0.3, 0, "1234", "", 0, 50, 1, 62, 124, 114.88, 62.0, 111.9444, -1, -1 }, + /* 5*/ { BARCODE_CODE11, -1, -1, -1, 0.4, 0, "1234", "", 0, 50, 1, 62, 124, 115.08, 62.0, 112.1444, -1, -1 }, + /* 6*/ { BARCODE_CODE11, -1, -1, -1, 0.5, 0, "1234", "", 0, 50, 1, 62, 124, 115.28, 62.0, 112.3444, -1, -1 }, + /* 7*/ { BARCODE_CODE11, -1, -1, -1, 0.6, 0, "1234", "", 0, 50, 1, 62, 124, 115.479996, 62.0, 112.5444, -1, -1 }, + /* 8*/ { BARCODE_CODE11, -1, -1, -1, 0.7, 0, "1234", "", 0, 50, 1, 62, 124, 115.68, 62.0, 112.7444, -1, -1 }, + /* 9*/ { BARCODE_CODE11, -1, -1, -1, 0.75, 0, "1234", "", 0, 50, 1, 62, 124, 115.78, 62.0, 112.8444, -1, -1 }, + /* 10*/ { BARCODE_CODE11, -1, -1, -1, 0.8, 0, "1234", "", 0, 50, 1, 62, 124, 115.88, 62.0, 112.9444, -1, -1 }, + /* 11*/ { BARCODE_CODE11, -1, -1, -1, 0.9, 0, "1234", "", 0, 50, 1, 62, 124, 116.08, 62.0, 113.1444, -1, -1 }, /* 12*/ { BARCODE_CODE11, -1, -1, -1, 1.1, 0, "1234", "", 0, 50, 1, 62, 124, 116.479996, 62.0, 113.5444, -1, -1 }, /* 13*/ { BARCODE_CODE11, -1, -1, -1, 1.2, 0, "1234", "", 0, 50, 1, 62, 124, 116.68, 62.0, 113.7444, -1, -1 }, /* 14*/ { BARCODE_CODE11, -1, -1, -1, 1.3, 0, "1234", "", 0, 50, 1, 62, 124, 116.88, 62.0, 113.9444, -1, -1 }, @@ -2130,38 +2133,43 @@ static void test_text_gap(const testCtx *const p_ctx) { /* 21*/ { BARCODE_CODE11, -1, -1, -1, 4.0, 0, "1234", "", 0, 50, 1, 62, 124, 122.28, 62.0, 119.3444, -1, -1 }, /* 22*/ { BARCODE_CODE11, -1, -1, -1, 5.0, 0, "1234", "", 0, 50, 1, 62, 124, 124.28, 62.0, 121.3444, -1, -1 }, /* 23*/ { BARCODE_CODE11, -1, -1, -1, 10.0, 0, "1234", "", 0, 50, 1, 62, 124, 134.28, 62.0, 131.3444, -1, -1 }, - /* 24*/ { BARCODE_CODE11, -1, -1, -1, 0, 3.0, "1234", "", 0, 50, 1, 62, 372, 348.84, 186.0, 340.0332, -1, -1 }, /* Scale default */ - /* 25*/ { BARCODE_CODE11, -1, -1, -1, 0.1, 3.0, "1234", "", 0, 50, 1, 62, 372, 343.44, 186.0, 334.6332, -1, -1 }, /* Scale */ - /* 26*/ { BARCODE_UPCA, -1, -1, -1, 0, 0, "01457130763", "", 0, 50, 1, 95, 226, 118, 74.0, 117.2, -1, -1 }, /* Default */ - /* 27*/ { BARCODE_UPCA, -1, -1, -1, 0.1, 0, "01457130763", "", 0, 50, 1, 95, 226, 116.2, 74.0, 115.4, -1, -1 }, - /* 28*/ { BARCODE_UPCA, -1, -1, -1, 0.6, 0, "01457130763", "", 0, 50, 1, 95, 226, 117.2, 74.0, 116.4, -1, -1 }, - /* 29*/ { BARCODE_UPCA, -1, -1, -1, 0.7, 0, "01457130763", "", 0, 50, 1, 95, 226, 117.4, 74.0, 116.6, -1, -1 }, - /* 30*/ { BARCODE_UPCA, -1, -1, -1, 0.75, 0, "01457130763", "", 0, 50, 1, 95, 226, 117.5, 74.0, 116.7, -1, -1 }, - /* 31*/ { BARCODE_UPCA, -1, -1, -1, 0.8, 0, "01457130763", "", 0, 50, 1, 95, 226, 117.6, 74.0, 116.8, -1, -1 }, - /* 32*/ { BARCODE_UPCA, -1, -1, -1, 1.0, 0, "01457130763", "", 0, 50, 1, 95, 226, 118, 74.0, 117.2, -1, -1 }, /* Same as default */ - /* 33*/ { BARCODE_UPCA, -1, -1, -1, 1.1, 0, "01457130763", "", 0, 50, 1, 95, 226, 118.2, 74.0, 117.4, -1, -1 }, - /* 34*/ { BARCODE_UPCA, -1, -1, -1, 1.6, 0, "01457130763", "", 0, 50, 1, 95, 226, 119.2, 74.0, 118.4, -1, -1 }, - /* 35*/ { BARCODE_UPCA, -1, -1, -1, 1.6, 2.5, "01457130763", "", 0, 50, 1, 95, 565, 298, 185.0, 296.0, -1, -1 }, /* Scale */ - /* 36*/ { BARCODE_UPCA, -1, -1, -1, 0, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 118, 74.0, 117.2, -1, -1 }, /* Default */ - /* 37*/ { BARCODE_UPCA, -1, -1, -1, 0, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 118, 230.0, 18, 4.0, 82 }, /* Default */ - /* 38*/ { BARCODE_UPCA, -1, -1, -1, 0.1, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 116.2, 230.0, 16.2, 4.0, 83.8 }, - /* 39*/ { BARCODE_UPCA, -1, -1, -1, 0.6, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 117.2, 230.0, 17.2, 4.0, 82.8 }, - /* 40*/ { BARCODE_UPCA, -1, -1, -1, 0.75, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 117.5, 230.0, 17.5, 4.0, 82.5 }, - /* 41*/ { BARCODE_UPCA, -1, -1, -1, 0.9, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 117.8, 230.0, 17.8, 4.0, 82.2 }, - /* 42*/ { BARCODE_UPCA, -1, -1, -1, 1.0, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 118, 74.0, 117.2, -1, -1 }, /* Same as default */ - /* 43*/ { BARCODE_UPCA, -1, -1, -1, 1.1, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 118.2, 74.0, 117.4, -1, -1 }, - /* 44*/ { BARCODE_UPCA, -1, -1, -1, 4.2, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 124.4, 230.0, 24.4, 4.0, 75.6 }, - /* 45*/ { BARCODE_UPCA_CC, -1, -1, -1, 0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 118, 74.0, 117.2, -1, -1 }, /* Default */ - /* 46*/ { BARCODE_UPCA_CC, -1, -1, -1, 0.1, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 116.2, 74.0, 115.4, -1, -1 }, - /* 47*/ { BARCODE_UPCA_CC, -1, -1, -1, 0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 118, 236.0, 42, 4.0, 58 }, /* Default */ - /* 48*/ { BARCODE_UPCA_CC, -1, -1, -1, 0.1, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 116.2, 236.0, 40.2, 4.0, 59.8 }, - /* 49*/ { BARCODE_UPCA_CC, -1, -1, -1, 0.6, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 117.2, 236.0, 41.2, 4.0, 58.8 }, - /* 50*/ { BARCODE_UPCA_CC, -1, -1, -1, 0.75, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 117.5, 236.0, 41.5, 4.0, 58.5 }, - /* 51*/ { BARCODE_UPCA_CC, -1, -1, -1, 1.0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 118, 236.0, 42, 4.0, 58 }, /* Same as default */ - /* 52*/ { BARCODE_UPCA_CC, -1, -1, -1, 1.1, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 118.2, 236.0, 42.2, 4.0, 57.8 }, - /* 53*/ { BARCODE_UPCA_CC, -1, -1, -1, 1.5, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 119.0, 236.0, 43.0, 4.0, 57.0 }, - /* 54*/ { BARCODE_UPCA_CC, -1, -1, 0, 0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 110, 236.0, 42, 4.0, 58 }, /* Hide text default */ - /* 55*/ { BARCODE_UPCA_CC, -1, -1, 0, 1.5, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 110, 236.0, 43.0, 4.0, 57.0 }, /* Hide text */ + /* 24*/ { BARCODE_CODE11, -1, -1, -1, -1.0, 0, "1234", "", 0, 50, 1, 62, 124, 112.28, 62.0, 109.344406, -1, -1 }, + /* 25*/ { BARCODE_CODE11, -1, -1, -1, -0.5, 0, "1234", "", 0, 50, 1, 62, 124, 113.28, 62.0, 110.344406, -1, -1 }, + /* 26*/ { BARCODE_CODE11, -1, -1, -1, 1, 3.0, "1234", "", 0, 50, 1, 62, 372, 348.84, 186.0, 340.0332, -1, -1 }, /* Scale default */ + /* 27*/ { BARCODE_CODE11, -1, -1, -1, 0, 3.0, "1234", "", 0, 50, 1, 62, 372, 342.84, 186.0, 334.0332, -1, -1 }, /* Scale */ + /* 28*/ { BARCODE_CODE11, -1, -1, -1, 0.1, 3.0, "1234", "", 0, 50, 1, 62, 372, 343.44, 186.0, 334.6332, -1, -1 }, /* Scale */ + /* 29*/ { BARCODE_UPCA, -1, -1, -1, 1, 0, "01457130763", "", 0, 50, 1, 95, 226, 118, 74.0, 117.2, -1, -1 }, /* Default */ + /* 30*/ { BARCODE_UPCA, -1, -1, -1, 0, 0, "01457130763", "", 0, 50, 1, 95, 226, 116, 74.0, 115.2, -1, -1 }, + /* 31*/ { BARCODE_UPCA, -1, -1, -1, 0.1, 0, "01457130763", "", 0, 50, 1, 95, 226, 116.2, 74.0, 115.4, -1, -1 }, + /* 32*/ { BARCODE_UPCA, -1, -1, -1, 0.6, 0, "01457130763", "", 0, 50, 1, 95, 226, 117.2, 74.0, 116.4, -1, -1 }, + /* 33*/ { BARCODE_UPCA, -1, -1, -1, 0.7, 0, "01457130763", "", 0, 50, 1, 95, 226, 117.4, 74.0, 116.6, -1, -1 }, + /* 34*/ { BARCODE_UPCA, -1, -1, -1, 0.75, 0, "01457130763", "", 0, 50, 1, 95, 226, 117.5, 74.0, 116.7, -1, -1 }, + /* 35*/ { BARCODE_UPCA, -1, -1, -1, 0.8, 0, "01457130763", "", 0, 50, 1, 95, 226, 117.6, 74.0, 116.8, -1, -1 }, + /* 36*/ { BARCODE_UPCA, -1, -1, -1, 1.1, 0, "01457130763", "", 0, 50, 1, 95, 226, 118.2, 74.0, 117.4, -1, -1 }, + /* 37*/ { BARCODE_UPCA, -1, -1, -1, 1.6, 0, "01457130763", "", 0, 50, 1, 95, 226, 119.2, 74.0, 118.4, -1, -1 }, + /* 38*/ { BARCODE_UPCA, -1, -1, -1, 1.6, 2.5, "01457130763", "", 0, 50, 1, 95, 565, 298, 185.0, 296.0, -1, -1 }, /* Scale */ + /* 39*/ { BARCODE_UPCA, -1, -1, -1, 1, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 118, 74.0, 117.2, -1, -1 }, /* Default */ + /* 40*/ { BARCODE_UPCA, -1, -1, -1, 1, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 118, 230.0, 18, 4.0, 82 }, /* Default */ + /* 41*/ { BARCODE_UPCA, -1, -1, -1, 0, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 116, 230.0, 16, 4.0, 84 }, + /* 42*/ { BARCODE_UPCA, -1, -1, -1, 0.1, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 116.2, 230.0, 16.2, 4.0, 83.8 }, + /* 43*/ { BARCODE_UPCA, -1, -1, -1, 0.6, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 117.2, 230.0, 17.2, 4.0, 82.8 }, + /* 44*/ { BARCODE_UPCA, -1, -1, -1, 0.75, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 117.5, 230.0, 17.5, 4.0, 82.5 }, + /* 45*/ { BARCODE_UPCA, -1, -1, -1, 0.9, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 117.8, 230.0, 17.8, 4.0, 82.2 }, + /* 46*/ { BARCODE_UPCA, -1, -1, -1, 1.1, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 118.2, 74.0, 117.4, -1, -1 }, + /* 47*/ { BARCODE_UPCA, -1, -1, -1, 4.2, 0, "01457130763+10", "", 0, 50, 1, 124, 276, 124.4, 230.0, 24.4, 4.0, 75.6 }, + /* 48*/ { BARCODE_UPCA_CC, -1, -1, -1, 1, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 118, 74.0, 117.2, -1, -1 }, /* Default */ + /* 49*/ { BARCODE_UPCA_CC, -1, -1, -1, 0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 116, 74.0, 115.2, -1, -1 }, + /* 50*/ { BARCODE_UPCA_CC, -1, -1, -1, 0.1, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 116.2, 74.0, 115.4, -1, -1 }, + /* 51*/ { BARCODE_UPCA_CC, -1, -1, -1, 1, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 118, 236.0, 42, 4.0, 58 }, /* Default */ + /* 52*/ { BARCODE_UPCA_CC, -1, -1, -1, 0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 116, 236.0, 40, 4.0, 60 }, + /* 53*/ { BARCODE_UPCA_CC, -1, -1, -1, 0.1, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 116.2, 236.0, 40.2, 4.0, 59.8 }, + /* 54*/ { BARCODE_UPCA_CC, -1, -1, -1, 0.6, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 117.2, 236.0, 41.2, 4.0, 58.8 }, + /* 55*/ { BARCODE_UPCA_CC, -1, -1, -1, 0.75, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 117.5, 236.0, 41.5, 4.0, 58.5 }, + /* 56*/ { BARCODE_UPCA_CC, -1, -1, -1, 1.1, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 118.2, 236.0, 42.2, 4.0, 57.8 }, + /* 57*/ { BARCODE_UPCA_CC, -1, -1, -1, 1.5, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 119.0, 236.0, 43.0, 4.0, 57.0 }, + /* 58*/ { BARCODE_UPCA_CC, -1, -1, 0, 1, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 110, 236.0, 42, 4.0, 58 }, /* Hide text default */ + /* 59*/ { BARCODE_UPCA_CC, -1, -1, 0, 0, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 110, 236.0, 40, 4.0, 60 }, /* Hide text */ + /* 60*/ { BARCODE_UPCA_CC, -1, -1, 0, 1.5, 0, "01457130763+10", "[91]12", 0, 50, 7, 127, 276, 110, 236.0, 43.0, 4.0, 57.0 }, /* Hide text */ }; int data_size = ARRAY_SIZE(data); int i, length, ret; @@ -2221,12 +2229,13 @@ static void test_text_gap(const testCtx *const p_ctx) { if (data[i].expected_set_width == -1.0f) { string = find_string(symbol, data[i].expected_set_x, data[i].expected_set_y); - assert_nonnull(string, "i:%d (%d) find_string(%g, %g) NULL\n", - i, data[i].symbology, data[i].expected_set_x, data[i].expected_set_y); + assert_nonnull(string, "i:%d (%s) find_string(%.9g, %.9g) NULL\n", + i, testUtilBarcodeName(data[i].symbology), data[i].expected_set_x, data[i].expected_set_y); } else { rect = find_rect(symbol, data[i].expected_set_x, data[i].expected_set_y, data[i].expected_set_width, data[i].expected_set_height); - assert_nonnull(rect, "i:%d (%d) find_rect(%g, %g, %g, %g) NULL\n", - i, data[i].symbology, data[i].expected_set_x, data[i].expected_set_y, data[i].expected_set_width, data[i].expected_set_height); + assert_nonnull(rect, "i:%d (%s) find_rect(%.9g, %.9g, %.9g, %.9g) NULL\n", + i, testUtilBarcodeName(data[i].symbology), data[i].expected_set_x, + data[i].expected_set_y, data[i].expected_set_width, data[i].expected_set_height); } } @@ -2607,10 +2616,10 @@ static void test_height(const testCtx *const p_ctx) { /*348*/ { BARCODE_DAFT, -1, 12, "DAFTDAFTDAFTDAFT", "", 0, 12, 3, 31, 62, 24, "" }, /*349*/ { BARCODE_DAFT, -1, 16, "DAFTDAFTDAFTDAFT", "", 0, 16, 3, 31, 62, 32, "" }, /*350*/ { BARCODE_DAFT, COMPLIANT_HEIGHT, 16, "DAFTDAFTDAFTDAFT", "", 0, 16, 3, 31, 62, 32, "" }, - /*351*/ { BARCODE_DPD, -1, 1, "0123456789012345678901234567", "", 0, 1, 1, 189, 378, 14, "" }, - /*352*/ { BARCODE_DPD, -1, 62, "0123456789012345678901234567", "", 0, 62, 1, 189, 378, 136, "" }, - /*353*/ { BARCODE_DPD, COMPLIANT_HEIGHT, 62, "0123456789012345678901234567", "", ZINT_WARN_NONCOMPLIANT, 62, 1, 189, 378, 136, "" }, - /*354*/ { BARCODE_DPD, COMPLIANT_HEIGHT, 62.5, "0123456789012345678901234567", "", 0, 62.5, 1, 189, 378, 137, "" }, + /*351*/ { BARCODE_DPD, -1, 1, "0123456789012345678901234567", "", 0, 1, 1, 189, 378, 8, "" }, + /*352*/ { BARCODE_DPD, -1, 62, "0123456789012345678901234567", "", 0, 62, 1, 189, 378, 130, "" }, + /*353*/ { BARCODE_DPD, COMPLIANT_HEIGHT, 62, "0123456789012345678901234567", "", ZINT_WARN_NONCOMPLIANT, 62, 1, 189, 378, 130, "" }, + /*354*/ { BARCODE_DPD, COMPLIANT_HEIGHT, 62.5, "0123456789012345678901234567", "", 0, 62.5, 1, 189, 378, 131, "" }, /*355*/ { BARCODE_MICROQR, -1, 1, "12345", "", 0, 11, 11, 11, 22, 22, "Fixed width-to-height ratio, symbol->height ignored" }, /*356*/ { BARCODE_HIBC_128, -1, 1, "1234567890", "", 0, 1, 1, 123, 246, 2, "" }, /*357*/ { BARCODE_HIBC_128, COMPLIANT_HEIGHT, 1, "1234567890", "", 0, 1, 1, 123, 246, 2, "" }, diff --git a/backend/tests/testcommon.c b/backend/tests/testcommon.c index ad90ccab..2e914a5d 100644 --- a/backend/tests/testcommon.c +++ b/backend/tests/testcommon.c @@ -2579,10 +2579,10 @@ int testUtilBwipp(int index, const struct zint_symbol *symbol, int option_1, int int r, h; int parse = 0, parsefnc = p_parsefnc ? *p_parsefnc : 0; - int upcean = is_extendable(symbology); - int upca = symbology == BARCODE_UPCA || symbology == BARCODE_UPCA_CHK || symbology == BARCODE_UPCA_CC; - char obracket = symbol->input_mode & GS1PARENS_MODE ? '(' : '['; - char cbracket = symbol->input_mode & GS1PARENS_MODE ? ')' : ']'; + const int upcean = (ZBarcode_Cap(symbology, ZINT_CAP_EANUPC) & ZINT_CAP_EANUPC) == ZINT_CAP_EANUPC; + const int upca = symbology == BARCODE_UPCA || symbology == BARCODE_UPCA_CHK || symbology == BARCODE_UPCA_CC; + const char obracket = symbol->input_mode & GS1PARENS_MODE ? '(' : '['; + const char cbracket = symbol->input_mode & GS1PARENS_MODE ? ')' : ']'; int addon_posn; int eci; int i, j, len; @@ -3652,7 +3652,7 @@ static const char *testUtilZXingCPPName(int index, const struct zint_symbol *sym } return NULL; } - } else if (is_extendable(symbology)) { + } else if ((ZBarcode_Cap(symbology, ZINT_CAP_EANUPC) & ZINT_CAP_EANUPC) == ZINT_CAP_EANUPC) { if (symbology == BARCODE_EANX || symbology == BARCODE_EANX_CHK) { if (length < 9) { if (length < 6) { @@ -3821,7 +3821,7 @@ int testUtilZXingCPPCmp(struct zint_symbol *symbol, char *msg, char *cmp_buf, in const int have_c25inter = (symbology == BARCODE_C25INTER && ((expected_len & 1) || have_c25checkdigit)) || symbology == BARCODE_ITF14 || symbology == BARCODE_DPLEIT || symbology == BARCODE_DPIDENT; - const int is_upcean = is_extendable(symbology); + const int is_upcean = (ZBarcode_Cap(symbology, ZINT_CAP_EANUPC) & ZINT_CAP_EANUPC) == ZINT_CAP_EANUPC; const int need_dpd_prefix = (symbology == BARCODE_DPD && expected_len == 27 && symbol->option_2 != 1); const int is_vin_international = symbology == BARCODE_VIN && (symbol->option_2 & 1); diff --git a/backend/vector.c b/backend/vector.c index 6f1944a8..c9d3eb56 100644 --- a/backend/vector.c +++ b/backend/vector.c @@ -385,13 +385,13 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ int comp_xoffset = 0; int comp_roffset = 0; unsigned char addon[6]; + int addon_len = 0; int addon_gap = 0; float addon_text_yposn = 0.0f; float xoffset, yoffset, roffset, boffset; float textoffset; int upceanflag = 0; int addon_latch = 0; - unsigned char textparts[4][7]; int hide_text; int i, r; int block_width = 0; @@ -404,6 +404,7 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ const int no_extend = is_codablockf || symbol->symbology == BARCODE_DPD; float large_bar_height; + int xoffset_comp; const float descent = 1.32779717f; /* Arimo value for normal text (font height 7) */ const float descent_small = 0.948426545f; /* Arimo value for SMALL_TEXT (font height 5) */ @@ -462,8 +463,8 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ comp_xoffset++; } } - if (is_extendable(symbol->symbology)) { - upceanflag = out_process_upcean(symbol, comp_xoffset, &main_width, addon, &addon_gap); + if (is_upcean(symbol->symbology)) { + upceanflag = out_process_upcean(symbol, comp_xoffset, &main_width, addon, &addon_len, &addon_gap); } else if (is_composite(symbol->symbology)) { int x; for (x = symbol->width - 1; x && !module_is_set(symbol, symbol->rows - 1, x); comp_roffset++, x--); @@ -472,42 +473,10 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ hide_text = ((!symbol->show_hrt) || (ustrlen(symbol->text) == 0)); - out_set_whitespace_offsets(symbol, hide_text, comp_xoffset, &xoffset, &yoffset, &roffset, &boffset, 0 /*scaler*/, - NULL, NULL, NULL, NULL); + out_set_whitespace_offsets(symbol, hide_text, comp_xoffset, &xoffset, &yoffset, &roffset, &boffset, NULL, + 0 /*scaler*/, NULL, NULL, NULL, NULL, NULL); - /* Note font sizes scaled by 2 so really twice these values */ - if (upceanflag) { - /* Note BOLD_TEXT ignored for UPCEAN by svg/emf/ps/qzint */ - font_height = symbol->output_options & SMALL_TEXT ? 7 : 10; - digit_ascender = font_height * digit_ascender_factor; - antialias_fudge = font_height * antialias_fudge_factor; - /* Although font size 7 (for normal) seems small it meets GS1 General Spec (GGS) Section 5.2.5: - "the size of the first and last digits should be reduced to a maximum width equivalent to four modules" */ - upcae_outside_font_height = symbol->output_options & SMALL_TEXT ? 6 : 7; - /* Note default now 1.0 (GGS 5.2.5 "Normally the minimum is one module") but was 0.5 (absolute minimum) */ - text_gap = (symbol->text_gap ? symbol->text_gap : 1.0f) - digit_ascender; - /* Guard bar height (none for EAN-2 and EAN-5) */ - guard_descent = upceanflag >= 6 ? symbol->guard_descent : 0.0f; - } else { - font_height = symbol->output_options & SMALL_TEXT ? 5 : 7; - antialias_fudge = font_height * antialias_fudge_factor; - text_gap = symbol->text_gap ? symbol->text_gap : 1.0f; - guard_descent = 0.0f; - } - - if (hide_text) { - textoffset = guard_descent; - } else { - if (upceanflag) { - /* Add fudge for anti-aliasing of digit bottoms */ - textoffset = font_height + text_gap + antialias_fudge; - if (textoffset < guard_descent) { - textoffset = guard_descent; - } - } else { - textoffset = font_height + stripf(text_gap + antialias_fudge); - } - } + xoffset_comp = xoffset + comp_xoffset; if ((symbol->symbology != BARCODE_MAXICODE) && (symbol->output_options & BARCODE_DOTTY_MODE)) { if (symbol->dot_size < 1.0f) { @@ -521,6 +490,38 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ } vector->width = symbol->width + dot_overspill + (xoffset + roffset); + + /* Note font sizes scaled by 2 so really twice these values */ + if (upceanflag) { + /* Note BOLD_TEXT ignored for UPCEAN by svg/emf/ps/qzint */ + font_height = symbol->output_options & SMALL_TEXT ? 7 : 10; + digit_ascender = font_height * digit_ascender_factor; + antialias_fudge = font_height * antialias_fudge_factor; + /* Although font size 7 (for normal) seems small it meets GS1 General Spec (GGS) Section 5.2.5: + "the size of the first and last digits should be reduced to a maximum width equivalent to four modules" */ + upcae_outside_font_height = symbol->output_options & SMALL_TEXT ? 6 : 7; + /* Note default now 1.0 (GGS 5.2.5 "Normally the minimum is one module") but was 0.5 (absolute minimum) */ + text_gap = symbol->text_gap - digit_ascender; + /* Guard bar height (none for EAN-2 and EAN-5) */ + guard_descent = upceanflag >= 6 ? symbol->guard_descent : 0.0f; + } else { + font_height = symbol->output_options & SMALL_TEXT ? 5 : 7; + antialias_fudge = font_height * antialias_fudge_factor; + text_gap = symbol->text_gap; + guard_descent = 0.0f; + } + + if (hide_text) { + textoffset = guard_descent; + } else { + textoffset = font_height + stripf(text_gap + antialias_fudge); + if (upceanflag) { + if (textoffset < guard_descent) { + textoffset = guard_descent; + } + } + } + vector->height = symbol->height + textoffset + dot_overspill + (yoffset + boffset); /* Plot Maxicode symbols */ @@ -734,54 +735,35 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ /* Add the text */ if (!hide_text) { - float text_xposn; - float text_yposn; float textwidth; - text_yposn = yoffset + symbol->height + font_height + text_gap; /* Calculated to bottom of text */ - if (upceanflag) { /* Allow for anti-aliasing if UPC/EAN */ - if (upceanflag >= 6) { - text_yposn -= antialias_fudge; - } else { /* EAN-2/5 */ - text_yposn = yoffset + font_height - digit_ascender; - if (text_yposn < 0.0f) { - text_yposn = 0.0f; - } - } - } else { /* Else adjust to baseline */ - text_yposn -= symbol->output_options & SMALL_TEXT ? descent_small : descent; - } - if (symbol->border_width > 0 && (symbol->output_options & (BARCODE_BOX | BARCODE_BIND))) { - text_yposn += symbol->border_width; /* Note not needed for BARCODE_BIND_TOP */ - } - if (upceanflag >= 6) { /* UPC-E, EAN-8, UPC-A, EAN-13 */ - const int addon_len = (int) ustrlen(addon); - xoffset += comp_xoffset; /* Hacky shortcut - restored at end */ - - out_upcean_split_text(upceanflag, symbol->text, textparts); + float text_yposn = yoffset + symbol->height + font_height + text_gap - antialias_fudge; /* Baseline */ + if (symbol->border_width > 0 && (symbol->output_options & (BARCODE_BOX | BARCODE_BIND))) { + text_yposn += symbol->border_width; /* Note not needed for BARCODE_BIND_TOP */ + } if (upceanflag == 6) { /* UPC-E */ - text_xposn = -(5.0f - 0.35f) + xoffset; + float text_xposn = -(5.0f - 0.35f) + xoffset_comp; textwidth = 6.2f; - if (!vector_add_string(symbol, textparts[0], 1, text_xposn, text_yposn, upcae_outside_font_height, + if (!vector_add_string(symbol, symbol->text, 1, text_xposn, text_yposn, upcae_outside_font_height, textwidth, 2 /*right align*/, &last_string)) return ZINT_ERROR_MEMORY; - text_xposn = (24.0f + 0.5f) + xoffset; + text_xposn = (24.0f + 0.5f) + xoffset_comp; textwidth = 6.0f * 8.5f; - if (!vector_add_string(symbol, textparts[1], 6, text_xposn, text_yposn, font_height, textwidth, + if (!vector_add_string(symbol, symbol->text + 1, 6, text_xposn, text_yposn, font_height, textwidth, 0 /*centre align*/, &last_string)) return ZINT_ERROR_MEMORY; - text_xposn = (51.0f - 0.35f) + 3.0f + xoffset; + text_xposn = (51.0f - 0.35f) + 3.0f + xoffset_comp; textwidth = 6.2f; - if (!vector_add_string(symbol, textparts[2], 1, text_xposn, text_yposn, upcae_outside_font_height, + if (!vector_add_string(symbol, symbol->text + 7, 1, text_xposn, text_yposn, upcae_outside_font_height, textwidth, 1 /*left align*/, &last_string)) return ZINT_ERROR_MEMORY; if (addon_len) { - text_xposn = (addon_len == 2 ? 61.0f : 75.0f) + xoffset + addon_gap; + text_xposn = (addon_len == 2 ? 61.0f : 75.0f) + xoffset_comp + addon_gap; textwidth = addon_len * 8.5f; if (!vector_add_string(symbol, addon, addon_len, text_xposn, addon_text_yposn, font_height, textwidth, 0 /*centre align*/, &last_string)) return ZINT_ERROR_MEMORY; if (upcean_guard_whitespace) { - text_xposn = (addon_len == 2 ? 70.0f : 97.0f) - 0.2f + xoffset + addon_gap; + text_xposn = (addon_len == 2 ? 70.0f : 97.0f) - 0.2f + xoffset_comp + addon_gap; textwidth = 8.5f; if (!vector_add_string(symbol, (const unsigned char *) ">", 1, text_xposn, addon_text_yposn, font_height, textwidth, 1 /*left align*/, &last_string)) return ZINT_ERROR_MEMORY; @@ -789,60 +771,63 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ } } else if (upceanflag == 8) { /* EAN-8 */ + float text_xposn; if (upcean_guard_whitespace) { - text_xposn = -0.75f + xoffset; + text_xposn = -0.75f + xoffset_comp; textwidth = 8.5f; if (!vector_add_string(symbol, (const unsigned char *) "<", 1, text_xposn, text_yposn, font_height, textwidth, 2 /*right align*/, &last_string)) return ZINT_ERROR_MEMORY; } - text_xposn = (17.0f + 0.5f) + xoffset; + text_xposn = (17.0f + 0.5f) + xoffset_comp; textwidth = 4.0f * 8.5f; - if (!vector_add_string(symbol, textparts[0], 4, text_xposn, text_yposn, font_height, textwidth, + if (!vector_add_string(symbol, symbol->text, 4, text_xposn, text_yposn, font_height, textwidth, 0 /*centre align*/, &last_string)) return ZINT_ERROR_MEMORY; - text_xposn = (50.0f - 0.5f) + xoffset; - if (!vector_add_string(symbol, textparts[1], 4, text_xposn, text_yposn, font_height, textwidth, + text_xposn = (50.0f - 0.5f) + xoffset_comp; + if (!vector_add_string(symbol, symbol->text + 4, 4, text_xposn, text_yposn, font_height, textwidth, 0 /*centre align*/, &last_string)) return ZINT_ERROR_MEMORY; if (addon_len) { - text_xposn = (addon_len == 2 ? 77.0f : 91.0f) + xoffset + addon_gap; + text_xposn = (addon_len == 2 ? 77.0f : 91.0f) + xoffset_comp + addon_gap; textwidth = addon_len * 8.5f; if (!vector_add_string(symbol, addon, addon_len, text_xposn, addon_text_yposn, font_height, textwidth, 0 /*centre align*/, &last_string)) return ZINT_ERROR_MEMORY; if (upcean_guard_whitespace) { - text_xposn = (addon_len == 2 ? 86.0f : 113.0f) - 0.2f + xoffset + addon_gap; + text_xposn = (addon_len == 2 ? 86.0f : 113.0f) - 0.2f + xoffset_comp + addon_gap; textwidth = 8.5f; if (!vector_add_string(symbol, (const unsigned char *) ">", 1, text_xposn, addon_text_yposn, font_height, textwidth, 1 /*left align*/, &last_string)) return ZINT_ERROR_MEMORY; } } else if (upcean_guard_whitespace) { - text_xposn = (68.0f - 0.2f) + xoffset; + text_xposn = (68.0f - 0.2f) + xoffset_comp; textwidth = 8.5f; if (!vector_add_string(symbol, (const unsigned char *) ">", 1, text_xposn, text_yposn, font_height, textwidth, 1 /*left align*/, &last_string)) return ZINT_ERROR_MEMORY; } } else if (upceanflag == 12) { /* UPC-A */ - text_xposn = -(5.0f - 0.35f) + xoffset; + float text_xposn = -(5.0f - 0.35f) + xoffset_comp; textwidth = 6.2f; - if (!vector_add_string(symbol, textparts[0], 1, text_xposn, text_yposn, upcae_outside_font_height, + if (!vector_add_string(symbol, symbol->text, 1, text_xposn, text_yposn, upcae_outside_font_height, textwidth, 2 /*right align*/, &last_string)) return ZINT_ERROR_MEMORY; - text_xposn = (27.0f + 1.0f) + xoffset; + text_xposn = 28.0f + xoffset_comp; textwidth = 5.0f * 8.5f; - if (!vector_add_string(symbol, textparts[1], 5, text_xposn, text_yposn, font_height, textwidth, + if (!vector_add_string(symbol, symbol->text + 1, 5, text_xposn, text_yposn, font_height, textwidth, 0 /*centre align*/, &last_string)) return ZINT_ERROR_MEMORY; - text_xposn = 67.0f + xoffset; - if (!vector_add_string(symbol, textparts[2], 5, text_xposn, text_yposn, font_height, textwidth, - 0 /*left align*/, &last_string)) return ZINT_ERROR_MEMORY; - text_xposn = (95.0f - 0.35f) + 5.0f + xoffset; + text_xposn = 67.0f + xoffset_comp; + if (!vector_add_string(symbol, symbol->text + 6, 5, text_xposn, text_yposn, font_height, textwidth, + 0 /*centre align*/, &last_string)) return ZINT_ERROR_MEMORY; + text_xposn = (95.0f - 0.35f) + 5.0f + xoffset_comp; textwidth = 6.2f; - if (!vector_add_string(symbol, textparts[3], 1, text_xposn, text_yposn, upcae_outside_font_height, - textwidth, 1 /*left align*/, &last_string)) return ZINT_ERROR_MEMORY; + if (!vector_add_string(symbol, symbol->text + 11, 1, text_xposn, text_yposn, + upcae_outside_font_height, textwidth, 1 /*left align*/, &last_string)) { + return ZINT_ERROR_MEMORY; + } if (addon_len) { - text_xposn = (addon_len == 2 ? 105.0f : 119.0f) + xoffset + addon_gap; + text_xposn = (addon_len == 2 ? 105.0f : 119.0f) + xoffset_comp + addon_gap; textwidth = addon_len * 8.5f; if (!vector_add_string(symbol, addon, addon_len, text_xposn, addon_text_yposn, font_height, textwidth, 0 /*centre align*/, &last_string)) return ZINT_ERROR_MEMORY; if (upcean_guard_whitespace) { - text_xposn = (addon_len == 2 ? 114.0f : 141.0f) - 0.2f + xoffset + addon_gap; + text_xposn = (addon_len == 2 ? 114.0f : 141.0f) - 0.2f + xoffset_comp + addon_gap; textwidth = 8.5f; if (!vector_add_string(symbol, (const unsigned char *) ">", 1, text_xposn, addon_text_yposn, font_height, textwidth, 1 /*left align*/, &last_string)) return ZINT_ERROR_MEMORY; @@ -850,42 +835,48 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ } } else { /* EAN-13 */ - text_xposn = -(5.0f - 0.1f) + xoffset; + float text_xposn = -(5.0f - 0.1f) + xoffset_comp; textwidth = 8.5f; - if (!vector_add_string(symbol, textparts[0], 1, text_xposn, text_yposn, font_height, textwidth, + if (!vector_add_string(symbol, symbol->text, 1, text_xposn, text_yposn, font_height, textwidth, 2 /*right align*/, &last_string)) return ZINT_ERROR_MEMORY; - text_xposn = (24.0f + 0.5f) + xoffset; + text_xposn = (24.0f + 0.5f) + xoffset_comp; textwidth = 6.0f * 8.5f; - if (!vector_add_string(symbol, textparts[1], 6, text_xposn, text_yposn, font_height, textwidth, + if (!vector_add_string(symbol, symbol->text + 1, 6, text_xposn, text_yposn, font_height, textwidth, 0 /*centre align*/, &last_string)) return ZINT_ERROR_MEMORY; - text_xposn = (71.0f - 0.5f) + xoffset; - if (!vector_add_string(symbol, textparts[2], 6, text_xposn, text_yposn, font_height, textwidth, + text_xposn = (71.0f - 0.5f) + xoffset_comp; + if (!vector_add_string(symbol, symbol->text + 7, 6, text_xposn, text_yposn, font_height, textwidth, 0 /*centre align*/, &last_string)) return ZINT_ERROR_MEMORY; if (addon_len) { - text_xposn = (addon_len == 2 ? 105.0f : 119.0f) + xoffset + addon_gap; + text_xposn = (addon_len == 2 ? 105.0f : 119.0f) + xoffset_comp + addon_gap; textwidth = addon_len * 8.5f; if (!vector_add_string(symbol, addon, addon_len, text_xposn, addon_text_yposn, font_height, textwidth, 0 /*centre align*/, &last_string)) return ZINT_ERROR_MEMORY; if (upcean_guard_whitespace) { - text_xposn = (addon_len == 2 ? 114.0f : 141.0f) + xoffset + addon_gap; + text_xposn = (addon_len == 2 ? 114.0f : 141.0f) + xoffset_comp + addon_gap; textwidth = 8.5f; if (!vector_add_string(symbol, (const unsigned char *) ">", 1, text_xposn, addon_text_yposn, font_height, textwidth, 1 /*left align*/, &last_string)) return ZINT_ERROR_MEMORY; } } else if (upcean_guard_whitespace) { - text_xposn = 96.0f + xoffset; + text_xposn = 96.0f + xoffset_comp; textwidth = 8.5f; if (!vector_add_string(symbol, (const unsigned char *) ">", 1, text_xposn, text_yposn, font_height, textwidth, 1 /*left align*/, &last_string)) return ZINT_ERROR_MEMORY; } } - xoffset -= comp_xoffset; /* Restore xoffset */ - } else if (upceanflag) { /* EAN-2, EAN-5 (standalone add-ons) */ - const int addon_len = (int) ustrlen(symbol->text); /* Put at top (and centered) */ - text_xposn = main_width / 2.0f + xoffset; + float text_xposn = main_width / 2.0f + xoffset; + float text_yposn = yoffset + font_height - digit_ascender; + if (symbol->border_width > 0 + && (symbol->output_options & (BARCODE_BOX | BARCODE_BIND | BARCODE_BIND_TOP))) { + text_yposn -= symbol->border_width; + } + if (text_yposn < 0.0f) { + text_yposn = 0.0f; + } + addon_len = (int) ustrlen(symbol->text); textwidth = addon_len * 8.5f; if (!vector_add_string(symbol, symbol->text, addon_len, text_xposn, text_yposn, font_height, textwidth, 0 /*centre align*/, &last_string)) return ZINT_ERROR_MEMORY; @@ -898,7 +889,12 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ } else { /* Put normal human readable text at the bottom (and centered) */ - text_xposn = main_width / 2.0f + xoffset + comp_xoffset; + float text_xposn = main_width / 2.0f + xoffset_comp; + float text_yposn = yoffset + symbol->height + font_height + text_gap; /* Calculated to bottom of text */ + text_yposn -= symbol->output_options & SMALL_TEXT ? descent_small : descent; + if (symbol->border_width > 0 && (symbol->output_options & (BARCODE_BOX | BARCODE_BIND))) { + text_yposn += symbol->border_width; /* Note not needed for BARCODE_BIND_TOP */ + } if (!vector_add_string(symbol, symbol->text, -1, text_xposn, text_yposn, font_height, symbol->width, 0, &last_string)) return ZINT_ERROR_MEMORY; } @@ -958,6 +954,9 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ if (horz_outside) { ybind_top = 0; ybind_bot = vector->height - symbol->border_width; + } else if (upceanflag == 2 || upceanflag == 5) { + ybind_top += textoffset; + ybind_bot += textoffset; } /* Top */ if (!vector_add_rect(symbol, 0.0f, ybind_top, vector->width, symbol->border_width, &last_rect)) @@ -985,6 +984,8 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ if (horz_outside) { box_top = symbol->border_width; box_height = vector->height - symbol->border_width * 2; + } else if (upceanflag == 2 || upceanflag == 5) { + box_top += textoffset; } /* Left */ if (!vector_add_rect(symbol, 0.0f, box_top, symbol->border_width, box_height, &last_rect)) diff --git a/backend/zint.h b/backend/zint.h index 5c45f676..6b61fabe 100644 --- a/backend/zint.h +++ b/backend/zint.h @@ -85,7 +85,7 @@ extern "C" { struct zint_vector_circle *circles; /* Pointer to first circle */ }; - /* Structured Append info - ignored unless `zint_structapp.count` is set to non-zero value */ + /* Structured Append info (see `symbol->structapp` below) - ignored unless `zint_structapp.count` is non-zero */ struct zint_structapp { int index; /* Position in Structured Append sequence, 1-based. Must be <= `count` */ int count; /* Number of symbols in Structured Append sequence. Set >= 2 to add SA Info */ @@ -115,12 +115,12 @@ extern "C" { int eci; /* Extended Channel Interpretation. Default 0 (none) */ float dpmm; /* Resolution of output in dots per mm (BMP/EMF/PCX/PNG/TIF only). Default 0 (none) */ float dot_size; /* Size of dots used in BARCODE_DOTTY_MODE. Default 0.8 */ - float text_gap; /* Gap between barcode and text (HRT). 0 means use default (font-specific) */ + float text_gap; /* Gap between barcode and text (HRT) in X-dimensions. Default 1 */ float guard_descent; /* Height in X-dimensions that EAN/UPC guard bars descend. Default 5 */ struct zint_structapp structapp; /* Structured Append info. Default structapp.count 0 (none) */ int warn_level; /* Affects error/warning value returned by Zint API (see WARN_XXX below) */ int debug; /* Debugging flags */ - unsigned char text[160]; /* Human Readable Text (HRT) (if any), UTF-8, NUL-terminated (output only) */ + unsigned char text[200]; /* Human Readable Text (HRT) (if any), UTF-8, NUL-terminated (output only) */ int rows; /* Number of rows used by the symbol (output only) */ int width; /* Width of the generated symbol (output only) */ unsigned char encoded_data[200][144]; /* Encoded data (output only). Allows for rows of 1152 modules */ @@ -319,7 +319,7 @@ extern "C" { #define ULTRA_COMPRESSION 128 /* Enable Ultracode compression (experimental) */ /* Warning and error conditions (API return values) */ -#define ZINT_WARN_HRT_TRUNCATED 1 /* Human Readable Text was truncated (max 159 bytes) */ +#define ZINT_WARN_HRT_TRUNCATED 1 /* Human Readable Text was truncated (max 199 bytes) */ #define ZINT_WARN_INVALID_OPTION 2 /* Invalid option given but overridden by Zint */ #define ZINT_WARN_USES_ECI 3 /* Automatic ECI inserted by Zint */ #define ZINT_WARN_NONCOMPLIANT 4 /* Symbol created not compliant with standards */ @@ -343,7 +343,8 @@ extern "C" { /* Capability flags (ZBarcode_Cap() `cap_flag`) */ #define ZINT_CAP_HRT 0x0001 /* Prints Human Readable Text? */ #define ZINT_CAP_STACKABLE 0x0002 /* Is stackable? */ -#define ZINT_CAP_EXTENDABLE 0x0004 /* Is extendable with add-on data? (Is EAN/UPC?) */ +#define ZINT_CAP_EANUPC 0x0004 /* Is EAN/UPC? */ +#define ZINT_CAP_EXTENDABLE 0x0004 /* Legacy */ #define ZINT_CAP_COMPOSITE 0x0008 /* Can have composite data? */ #define ZINT_CAP_ECI 0x0010 /* Supports Extended Channel Interpretations? */ #define ZINT_CAP_GS1 0x0020 /* Supports GS1 data? */ diff --git a/backend_qt/qzint.cpp b/backend_qt/qzint.cpp index d16801e4..7c4d79fe 100644 --- a/backend_qt/qzint.cpp +++ b/backend_qt/qzint.cpp @@ -175,7 +175,7 @@ namespace Zint { m_scale(1.0f), m_dotty(false), m_dot_size(4.0f / 5.0f), m_guardDescent(5.0f), - m_textGap(0.0f), + m_textGap(1.0f), m_fgStr(QSL("000000")), m_bgStr(QSL("FFFFFF")), m_cmyk(false), m_borderType(0), m_borderWidth(0), m_whitespace(0), m_vwhitespace(0), @@ -615,7 +615,7 @@ namespace Zint { m_textGap = textGap; } - /* Show (true) or hide (false) Human Readable Text */ + /* Show (true) or hide (false) Human Readable Text (HRT) */ bool QZint::showText() const { return m_show_hrt; } @@ -817,8 +817,12 @@ namespace Zint { return ZBarcode_Cap(symbology ? symbology : m_symbol, ZINT_CAP_STACKABLE); } - bool QZint::isExtendable(int symbology) const { - return ZBarcode_Cap(symbology ? symbology : m_symbol, ZINT_CAP_EXTENDABLE); + bool QZint::isEANUPC(int symbology) const { + return ZBarcode_Cap(symbology ? symbology : m_symbol, ZINT_CAP_EANUPC); + } + + bool QZint::isExtendable(int symbology) const { /* Legacy - same as `isEANUPC()` */ + return ZBarcode_Cap(symbology ? symbology : m_symbol, ZINT_CAP_EANUPC); } bool QZint::isComposite(int symbology) const { @@ -1115,8 +1119,8 @@ namespace Zint { QPen p; p.setColor(fgColor); painter.setPen(p); - bool bold = (m_zintSymbol->output_options & BOLD_TEXT) && !isExtendable(); - QFont font(isExtendable() ? upceanFontFamily : normalFontFamily, -1 /*pointSize*/, + bool bold = (m_zintSymbol->output_options & BOLD_TEXT) && !isEANUPC(); + QFont font(isEANUPC() ? upceanFontFamily : normalFontFamily, -1 /*pointSize*/, bold ? QFont::Bold : -1); while (string) { font.setPixelSize(string->fsize); @@ -1223,7 +1227,7 @@ namespace Zint { arg_int(cmd, longOptOnly ? "--barcode=" : "-b ", m_symbol); } - if (isExtendable()) { + if (isEANUPC()) { arg_int(cmd, "--addongap=", option2()); } @@ -1254,7 +1258,7 @@ namespace Zint { if (!default_bind_top) { arg_bool(cmd, "--bindtop", borderType() & BARCODE_BIND_TOP); } - arg_bool(cmd, "--bold", !notext && (fontSetting() & BOLD_TEXT) && !isExtendable()); + arg_bool(cmd, "--bold", !notext && (fontSetting() & BOLD_TEXT) && !isEANUPC()); if (!default_border) { arg_int(cmd, "--border=", borderWidth()); } @@ -1317,10 +1321,10 @@ namespace Zint { arg_bool(cmd, "--gssep", gsSep()); } - if (isExtendable() && guardDescent() != 5.0f) { + if (isEANUPC() && guardDescent() != 5.0f) { arg_float(cmd, "--guarddescent=", guardDescent(), true /*allowZero*/); } - if (isExtendable() && showText()) { + if (isEANUPC() && showText()) { arg_bool(cmd, "--guardwhitespace", guardWhitespace()); } @@ -1396,7 +1400,7 @@ namespace Zint { arg_structapp(cmd, "--structapp=", structAppCount(), structAppIndex(), structAppID(), win); } - if (!notext && textGap() != 0.0f) { + if (!notext && textGap() != 1.0f) { arg_float(cmd, "--textgap=", textGap(), true /*allowZero*/); } diff --git a/backend_qt/qzint.h b/backend_qt/qzint.h index a4eb06b4..20e4f0d8 100644 --- a/backend_qt/qzint.h +++ b/backend_qt/qzint.h @@ -169,7 +169,7 @@ public: float textGap() const; // `symbol->text_gap` void setTextGap(float textGap); - /* Show (true) or hide (false) Human Readable Text */ + /* Show (true) or hide (false) Human Readable Text (HRT) */ bool showText() const; // `symbol->show_hrt` void setShowText(bool showText); @@ -252,7 +252,8 @@ public: /* Test capabilities - `ZBarcode_Cap()` */ bool hasHRT(int symbology = 0) const; bool isStackable(int symbology = 0) const; - bool isExtendable(int symbology = 0) const; + bool isEANUPC(int symbology = 0) const; + bool isExtendable(int symbology = 0) const; /* Legacy - same as `isEANUPC()` */ bool isComposite(int symbology = 0) const; bool supportsECI(int symbology = 0) const; bool supportsGS1(int symbology = 0) const; diff --git a/backend_qt/tests/test_qzint.cpp b/backend_qt/tests/test_qzint.cpp index 580f64da..eb6e2b85 100644 --- a/backend_qt/tests/test_qzint.cpp +++ b/backend_qt/tests/test_qzint.cpp @@ -593,7 +593,7 @@ private slots: QTest::newRow("BARCODE_AUSPOST") << true << 0.0f << "" << BARCODE_AUSPOST << DATA_MODE // symbology-inputMode << "12345678" << "" // text-primary - << 30.0f << -1 << 0 << 0 << 1.0f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 30.0f << -1 << 0 << 0 << 1.0f << 0.0f << false << 0.8f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -610,7 +610,7 @@ private slots: QTest::newRow("BARCODE_AZTEC") << false << 0.0f << "" << BARCODE_AZTEC << UNICODE_MODE // symbology-inputMode << "12345678Ж0%var%" << "" // text-primary - << 0.0f << 1 << 0 << 0 << 4.0f << 0.0f << true << 0.9f << 0.0f // height-textGap + << 0.0f << 1 << 0 << 0 << 4.0f << 0.0f << true << 0.9f << 1.0f // height-textGap << 5.0f << 2 << 1 << "as\"dfa'sdf" // guardDescent-structAppID << "" << "" << QColor(Qt::blue) << QColor(Qt::white) << true // fgStr-cmyk << 0 << 0 << 2 << 3 << 0 // borderTypeIndex-fontSetting @@ -626,7 +626,7 @@ private slots: QTest::newRow("BARCODE_AZTEC (bgStr CMYK, fgStr CMYK)") << false << 0.0f << "" << BARCODE_AZTEC << UNICODE_MODE // symbology-inputMode << "12345678Ж0%var%" << "" // text-primary - << 0.0f << 1 << 0 << 0 << 4.0f << 0.0f << true << 0.9f << 0.0f // height-textGap + << 0.0f << 1 << 0 << 0 << 4.0f << 0.0f << true << 0.9f << 1.0f // height-textGap << 5.0f << 2 << 1 << "as\"dfa'sdf" // guardDescent-structAppID << "71,0,40,44" << "0,0,0,0" << QColor(Qt::black) << QColor(Qt::white) << true // fgStr-cmyk << 0 << 0 << 2 << 3 << 0 // borderTypeIndex-fontSetting @@ -642,7 +642,7 @@ private slots: QTest::newRow("BARCODE_C25INTER") << true << 0.0f << "" << BARCODE_C25INTER << UNICODE_MODE // symbology-inputMode << "12345" << "" // text-primary - << 0.0f << -1 << 2 << 0 << 1.0f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 0.0f << -1 << 2 << 0 << 1.0f << 0.0f << false << 0.8f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << SMALL_TEXT // borderTypeIndex-fontSetting @@ -656,7 +656,7 @@ private slots: QTest::newRow("BARCODE_CHANNEL") << false << 0.0f << "" << BARCODE_CHANNEL << UNICODE_MODE // symbology-inputMode << "453678" << "" // text-primary - << 19.7f << -1 << 7 << 0 << 1.0f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 19.7f << -1 << 7 << 0 << 1.0f << 0.0f << false << 0.8f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(255, 255, 255, 0) << false // fgStr-cmyk << 1 << 2 << 0 << 0 << BOLD_TEXT // borderTypeIndex-fontSetting @@ -672,7 +672,7 @@ private slots: QTest::newRow("BARCODE_CHANNEL (bgStr FFFFFF00)") << false << 0.0f << "" << BARCODE_CHANNEL << UNICODE_MODE // symbology-inputMode << "453678" << "" // text-primary - << 19.7f << -1 << 7 << 0 << 1.0f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 19.7f << -1 << 7 << 0 << 1.0f << 0.0f << false << 0.8f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "FFFFFF00" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 1 << 2 << 0 << 0 << BOLD_TEXT // borderTypeIndex-fontSetting @@ -688,7 +688,7 @@ private slots: QTest::newRow("BARCODE_CHANNEL (bgStr 12345600)") << false << 0.0f << "" << BARCODE_CHANNEL << UNICODE_MODE // symbology-inputMode << "453678" << "" // text-primary - << 19.7f << -1 << 7 << 0 << 1.0f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 19.7f << -1 << 7 << 0 << 1.0f << 0.0f << false << 0.8f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "12345600" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 1 << 2 << 0 << 0 << BOLD_TEXT // borderTypeIndex-fontSetting @@ -704,7 +704,7 @@ private slots: QTest::newRow("BARCODE_CODE128") << false << 0.0f << "" << BARCODE_CODE128 << (UNICODE_MODE | EXTRA_ESCAPE_MODE) // symbology-inputMode << "1234\\^A56" << "" // text-primary - << 0.0f << -1 << 0 << 0 << 1.0f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 0.0f << -1 << 0 << 0 << 1.0f << 0.0f << false << 0.8f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -718,7 +718,7 @@ private slots: QTest::newRow("BARCODE_GS1_128_CC") << false << 0.0f << "" << BARCODE_GS1_128_CC << UNICODE_MODE // symbology-inputMode << "[01]12345678901231[15]121212" << "[11]901222[99]ABCDE" // text-primary - << 71.142f << 3 << 0 << 0 << 3.5f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 71.142f << 3 << 0 << 0 << 3.5f << 0.0f << false << 0.8f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -734,7 +734,7 @@ private slots: QTest::newRow("BARCODE_CODE16K") << false << 11.7f << "" << BARCODE_CODE16K << (UNICODE_MODE | HEIGHTPERROW_MODE) // symbology-inputMode << "12345678901234567890123456789012" << "" // text-primary - << 0.0f << 4 << 0 << 2 << 1.0f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 0.0f << 4 << 0 << 2 << 1.0f << 0.0f << false << 0.8f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 1 << 1 << 0 << 0 << SMALL_TEXT // borderTypeIndex-fontSetting @@ -750,7 +750,7 @@ private slots: QTest::newRow("BARCODE_CODE49") << true << 0.0f << "" << BARCODE_CODE49 << UNICODE_MODE // symbology-inputMode << "12345678901234567890" << "" // text-primary - << 30.0f << -1 << 0 << 0 << 1.0f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 30.0f << -1 << 0 << 0 << 1.0f << 0.0f << false << 0.8f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -764,7 +764,7 @@ private slots: QTest::newRow("BARCODE_CODABLOCKF") << true << 0.0f << "" << BARCODE_CODABLOCKF << (DATA_MODE | ESCAPE_MODE) // symbology-inputMode << "T\\n\\xA0t\\\"" << "" // text-primary - << 0.0f << 2 << 5 << 3 << 3.0f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 0.0f << 2 << 5 << 3 << 3.0f << 0.0f << false << 0.8f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 2 << 4 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -780,7 +780,7 @@ private slots: QTest::newRow("BARCODE_DAFT") << false << 0.0f << "" << BARCODE_DAFT << UNICODE_MODE // symbology-inputMode << "daft" << "" // text-primary - << 9.2f << -1 << 251 << 0 << 1.0f << 0.0f << false << 0.7f << 0.0f // height-textGap + << 9.2f << -1 << 251 << 0 << 1.0f << 0.0f << false << 0.7f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(0x30, 0x31, 0x32, 0x33) << QColor(0xBF, 0xBE, 0xBD, 0xBC) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -794,7 +794,7 @@ private slots: QTest::newRow("BARCODE_DATAMATRIX (GS1)") << true << 0.0f << "" << BARCODE_DATAMATRIX << GS1_MODE // symbology-inputMode << "[20]12" << "" // text-primary - << 0.0f << -1 << 0 << DM_SQUARE << 1.0f << 0.0f << false << 0.7f << 0.0f // height-textGap + << 0.0f << -1 << 0 << DM_SQUARE << 1.0f << 0.0f << false << 0.7f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -808,7 +808,7 @@ private slots: QTest::newRow("BARCODE_DATAMATRIX") << false << 0.0f << "" << BARCODE_DATAMATRIX << (DATA_MODE | ESCAPE_MODE | FAST_MODE) // symbology-inputMode << "ABCDEFGH\\x01I" << "" // text-primary - << 0.0f << -1 << 0 << DM_ISO_144 << 1.0f << 0.0f << false << 0.7f << 0.0f // height-textGap + << 0.0f << -1 << 0 << DM_ISO_144 << 1.0f << 0.0f << false << 0.7f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -822,7 +822,7 @@ private slots: QTest::newRow("BARCODE_DBAR_EXPSTK_CC") << false << 40.8f << "" << BARCODE_DBAR_EXPSTK_CC << (DATA_MODE | HEIGHTPERROW_MODE) // symbology-inputMode << "[91]ABCDEFGHIJKL" << "[11]901222[99]ABCDE" // text-primary - << 0.0f << -1 << 0 << 2 << 1.0f << 0.0f << true << 0.9f << 0.0f // height-textGap + << 0.0f << -1 << 0 << 2 << 1.0f << 0.0f << true << 0.9f << 1.0f // height-textGap << 3.0f << 2 << 1 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -838,7 +838,7 @@ private slots: QTest::newRow("BARCODE_DOTCODE") << false << 1.0f << "" << BARCODE_DOTCODE << GS1_MODE // symbology-inputMode << "[20]01" << "" // text-primary - << 30.0f << -1 << 8 << ((0 + 1) << 8) << 1.0f << 0.0f << false << 0.7f << 0.0f // height-textGap + << 30.0f << -1 << 8 << ((0 + 1) << 8) << 1.0f << 0.0f << false << 0.7f << 1.0f // height-textGap << 0.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -852,7 +852,7 @@ private slots: QTest::newRow("BARCODE_DPD") << true << 0.0f << "" << BARCODE_DPD << UNICODE_MODE // symbology-inputMode << "1234567890123456789012345678" << "" // text-primary - << 0.0f << -1 << 0 << 0 << 4.5f << 24.0f << true << 0.8f << 0.0f // height-textGap + << 0.0f << -1 << 0 << 0 << 4.5f << 24.0f << true << 0.8f << 1.0f // height-textGap << 0.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -867,7 +867,7 @@ private slots: QTest::newRow("BARCODE_EANX") << true << 0.0f << "" << BARCODE_EANX << UNICODE_MODE // symbology-inputMode << "123456789012+12" << "" // text-primary - << 0.0f << -1 << 8 << 0 << 1.0f << 0.0f << true << 0.8f << 0.0f // height-textGap + << 0.0f << -1 << 8 << 0 << 1.0f << 0.0f << true << 0.8f << 1.0f // height-textGap << 0.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -881,7 +881,7 @@ private slots: QTest::newRow("BARCODE_EANX (guardWhitespace/embedVectorFont") << true << 0.0f << "" << BARCODE_EANX << UNICODE_MODE // symbology-inputMode << "123456789012+12" << "" // text-primary - << 0.0f << -1 << 8 << 0 << 1.0f << 0.0f << true << 0.8f << 0.0f // height-textGap + << 0.0f << -1 << 8 << 0 << 1.0f << 0.0f << true << 0.8f << 1.0f // height-textGap << 0.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -895,7 +895,7 @@ private slots: QTest::newRow("BARCODE_GRIDMATRIX") << false << 0.0f << "" << BARCODE_GRIDMATRIX << UNICODE_MODE // symbology-inputMode << "Your Data Here!" << "" // text-primary - << 0.0f << 1 << 5 << 0 << 0.5f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 0.0f << 1 << 5 << 0 << 0.5f << 0.0f << false << 0.8f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -909,7 +909,7 @@ private slots: QTest::newRow("BARCODE_HANXIN") << false << 0.0f << "" << BARCODE_HANXIN << (UNICODE_MODE | ESCAPE_MODE) // symbology-inputMode << "éβÿ啊\\e\"'" << "" // text-primary - << 30.0f << 2 << 5 << ((0 + 1) << 8) << 1.0f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 30.0f << 2 << 5 << ((0 + 1) << 8) << 1.0f << 0.0f << false << 0.8f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -923,7 +923,7 @@ private slots: QTest::newRow("BARCODE_HIBC_DM") << false << 10.0f << "" << BARCODE_HIBC_DM << UNICODE_MODE // symbology-inputMode << "1234" << "" // text-primary - << 0.0f << -1 << 8 << DM_DMRE << 1.0f << 0.0f << false << 0.7f << 0.0f // height-textGap + << 0.0f << -1 << 8 << DM_DMRE << 1.0f << 0.0f << false << 0.7f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -937,7 +937,7 @@ private slots: QTest::newRow("BARCODE_HIBC_PDF") << false << 0.0f << "" << BARCODE_HIBC_PDF << (DATA_MODE | HEIGHTPERROW_MODE) // symbology-inputMode << "TEXT" << "" // text-primary - << 3.5f << 3 << 4 << 10 << 10.0f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 3.5f << 3 << 4 << 10 << 10.0f << 0.0f << false << 0.8f << 1.0f // height-textGap << 5.0f << 2 << 1 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -953,7 +953,7 @@ private slots: QTest::newRow("BARCODE_ITF14") << true << 0.0f << "" << BARCODE_ITF14 << UNICODE_MODE // symbology-inputMode << "9212320967145" << "" // text-primary - << 30.0f << -1 << 0 << 0 << 1.0f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 30.0f << -1 << 0 << 0 << 1.0f << 0.0f << false << 0.8f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -967,7 +967,7 @@ private slots: QTest::newRow("BARCODE_ITF14 (border)") << true << 0.0f << "" << BARCODE_ITF14 << UNICODE_MODE // symbology-inputMode << "9212320967145" << "" // text-primary - << 30.0f << -1 << 0 << 0 << 1.0f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 30.0f << -1 << 0 << 0 << 1.0f << 0.0f << false << 0.8f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 1 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -982,7 +982,7 @@ private slots: << BARCODE_MAXICODE << (UNICODE_MODE | ESCAPE_MODE) // symbology-inputMode << "152382802840001" << "1Z00004951\\GUPSN\\G06X610\\G159\\G1234567\\G1/1\\G\\GY\\G1 MAIN ST\\GTOWN\\GNY\\R\\E" // text-primary - << 0.0f << -1 << (96 + 1) << 0 << 2.5f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 0.0f << -1 << (96 + 1) << 0 << 2.5f << 0.0f << false << 0.8f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -998,7 +998,7 @@ private slots: QTest::newRow("BARCODE_MICROQR") << false << 0.0f << "" << BARCODE_MICROQR << UNICODE_MODE // symbology-inputMode << "1234" << "" // text-primary - << 30.0f << 2 << 3 << (ZINT_FULL_MULTIBYTE | (3 + 1) << 8) << 1.0f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 30.0f << 2 << 3 << (ZINT_FULL_MULTIBYTE | (3 + 1) << 8) << 1.0f << 0.0f << false << 0.8f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -1012,7 +1012,7 @@ private slots: QTest::newRow("BARCODE_QRCODE") << true << 0.0f << "" << BARCODE_QRCODE << GS1_MODE // symbology-inputMode << "(01)12" << "" // text-primary - << 0.0f << 1 << 5 << (ZINT_FULL_MULTIBYTE | (0 + 1) << 8) << 1.0f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 0.0f << 1 << 5 << (ZINT_FULL_MULTIBYTE | (0 + 1) << 8) << 1.0f << 0.0f << false << 0.8f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -1028,7 +1028,7 @@ private slots: QTest::newRow("BARCODE_RMQR") << true << 0.0f << "" << BARCODE_RMQR << UNICODE_MODE // symbology-inputMode << "テ" << "" // text-primary - << 30.0f << -1 << 8 << 0 << 1.0f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 30.0f << -1 << 8 << 0 << 1.0f << 0.0f << false << 0.8f << 1.0f // height-textGap << 5.0f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -1042,7 +1042,7 @@ private slots: QTest::newRow("BARCODE_ULTRA") << false << 0.0f << "" << BARCODE_ULTRA << (GS1_MODE | GS1PARENS_MODE | GS1NOCHECK_MODE) // symbology-inputMode << "(01)1" << "" // text-primary - << 0.0f << 6 << 2 << 0 << 1.0f << 0.0f << true << 0.8f << 0.0f // height-textGap + << 0.0f << 6 << 2 << 0 << 1.0f << 0.0f << true << 0.8f << 1.0f // height-textGap << 5.0f << 2 << 1 << "4" // guardDescent-structAppID << "" << "" << QColor(Qt::black) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << 0 // borderTypeIndex-fontSetting @@ -1056,7 +1056,7 @@ private slots: QTest::newRow("BARCODE_UPCE_CC") << true << 0.0f << "out.svg" << BARCODE_UPCE_CC << UNICODE_MODE // symbology-inputMode << "12345670+1234" << "[11]901222[99]ABCDE" // text-primary - << 0.0f << -1 << 0 << 0 << 1.0f << 0.0f << false << 0.8f << 0.0f // height-textGap + << 0.0f << -1 << 0 << 0 << 1.0f << 0.0f << false << 0.8f << 1.0f // height-textGap << 6.5f << 0 << 0 << "" // guardDescent-structAppID << "" << "" << QColor(0xEF, 0x29, 0x29) << QColor(Qt::white) << false // fgStr-cmyk << 0 << 0 << 0 << 0 << (BOLD_TEXT | SMALL_TEXT) // borderTypeIndex-fontSetting diff --git a/docs/README b/docs/README index 6086c03f..ad68fd2b 100644 --- a/docs/README +++ b/docs/README @@ -2,8 +2,8 @@ For generation of "docs/manual.pdf" and "docs/manual.txt" from "manual.pmd" usin On Ubuntu/Debian (tested on Ubuntu 22.04) - wget https://github.com/jgm/pandoc/releases/download/3.1.5/pandoc-3.1.5-1-amd64.deb - sudo dpkg -i pandoc-3.1.5-1-amd64.deb + wget https://github.com/jgm/pandoc/releases/download/3.1.9/pandoc-3.1.9-1-amd64.deb + sudo dpkg -i pandoc-3.1.9-1-amd64.deb sudo apt install python3-pip pip install pandoc-tablenos --user export PATH=~/.local/bin:"$PATH" @@ -18,9 +18,9 @@ On Ubuntu/Debian (tested on Ubuntu 22.04) On Fedora (tested on Fedora Linux 38 (Workstation Edition)) - wget https://github.com/jgm/pandoc/releases/download/3.1.5/pandoc-3.1.5-linux-amd64.tar.gz - tar xf pandoc-3.1.5-linux-amd64.tar.gz - sudo mv -i pandoc-3.1.5/bin/pandoc /usr/local/bin + wget https://github.com/jgm/pandoc/releases/download/3.1.9/pandoc-3.1.9-linux-amd64.tar.gz + tar xf pandoc-3.1.9-linux-amd64.tar.gz + sudo mv -i pandoc-3.1.9/bin/pandoc /usr/local/bin sudo dnf install python3-pip pip install pandoc-tablenos --user export PATH=~/.local/bin:"$PATH" diff --git a/docs/images/dpd.svg b/docs/images/dpd.svg index 2353e4ee..ff06bbf2 100644 --- a/docs/images/dpd.svg +++ b/docs/images/dpd.svg @@ -1,9 +1,9 @@ - + Zint Generated Symbol - + 0003 932 0621 9912 3456 78 101 040 9 diff --git a/docs/images/gui_appearance.png b/docs/images/gui_appearance.png index ea17f694d4b51610f454fc0dab6df36a566fd098..5f609b06fe1e274f8953fff3af71ead463cde849 100644 GIT binary patch delta 88772 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
  • Y_ZGYkpLK!&N6m2aAi#h#YDu4J=m4i2O`b3n^ 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 z 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 G3I7G#(Iq$l delta 88771 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 z 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 code.sourceCode { white-space: pre; position: relative; } - pre > code.sourceCode > span { display: inline-block; line-height: 1.25; } + pre > code.sourceCode > span { line-height: 1.25; } pre > code.sourceCode > span:empty { height: 1.2em; } .sourceCode { overflow: visible; } code.sourceCode > span { color: inherit; text-decoration: inherit; } @@ -329,7 +329,7 @@

    Zint Barcode Generator and Zint Barcode Studio User Manual

    Version 2.12.0.9

    -

    July 2023

    +

    November 2023