From 943ba79866bca8c2e08dd4aad6fadfaa99e7a1cf Mon Sep 17 00:00:00 2001 From: gitlost Date: Mon, 26 Oct 2020 12:21:43 +0000 Subject: [PATCH] AZTEC: fix bit-stuffing; AZTECRUNE: fix >= 128; DATAMATRIX: eod shift -> 0 pad; Qt6 --- CMakeLists.txt | 72 +- backend/aztec.c | 70 +- backend/common.c | 21 +- backend/dmatrix.c | 160 ++-- backend/dmatrix.h | 39 +- backend/emf.c | 57 +- backend/library.c | 141 +-- backend/ps.c | 116 +-- backend/raster.c | 46 +- backend/svg.c | 79 +- .../tests/data/print/bmp/dotcode_aim_fig7.bmp | Bin 2062 -> 2082 bytes .../tests/data/print/emf/dotcode_aim_fig7.emf | Bin 1212 -> 1212 bytes .../tests/data/print/eps/dotcode_aim_fig7.eps | 78 +- .../tests/data/print/gif/dotcode_aim_fig7.gif | Bin 688 -> 694 bytes .../tests/data/print/pcx/dotcode_aim_fig7.pcx | Bin 4856 -> 5201 bytes .../tests/data/print/png/dotcode_aim_fig7.png | Bin 682 -> 682 bytes .../tests/data/print/svg/dotcode_aim_fig7.svg | 78 +- .../tests/data/print/tif/dotcode_aim_fig7.tif | Bin 39244 -> 39946 bytes backend/tests/test_2of5.c | 2 +- backend/tests/test_auspost.c | 2 +- backend/tests/test_aztec.c | 858 +++++++++++++++--- backend/tests/test_channel.c | 2 +- backend/tests/test_codablock.c | 2 +- backend/tests/test_code.c | 2 +- backend/tests/test_code1.c | 2 +- backend/tests/test_code128.c | 2 +- backend/tests/test_code16k.c | 2 +- backend/tests/test_code49.c | 2 +- backend/tests/test_composite.c | 14 +- backend/tests/test_dmatrix.c | 725 +++++++++++++-- backend/tests/test_gs1.c | 2 +- backend/tests/test_imail.c | 2 +- backend/tests/test_medical.c | 2 +- backend/tests/test_pdf417.c | 96 +- backend/tests/test_postal.c | 2 +- backend/tests/test_raster.c | 66 +- backend/tests/test_rss.c | 4 +- backend/tests/test_telepen.c | 2 +- backend/tests/test_upcean.c | 2 +- backend/tests/testcommon.c | 174 +++- backend/tests/testcommon.h | 2 +- .../tests/tools/bwipp_dump-barcode.ps.diff | 63 +- backend/tests/tools/bwipp_dump.ps.tar.xz | Bin 116808 -> 117128 bytes backend/tests/tools/run_bwipp_tests.sh | 2 + backend/upcean.c | 18 +- backend/vector.c | 105 ++- backend_qt/CMakeLists.txt | 16 +- backend_qt/qzint.cpp | 45 +- docs/manual.txt | 32 +- frontend_qt/CMakeLists.txt | 20 +- frontend_qt/frontend_qt_zintdll.pro | 2 + frontend_qt/mainWindow.ui | 2 +- frontend_qt/mainwindow.cpp | 6 +- 53 files changed, 2324 insertions(+), 913 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f5a11c22..e21834c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,35 +100,61 @@ ENDIF(APPLE) add_subdirectory(backend) add_subdirectory(frontend) -find_package(Qt5Widgets) -find_package(Qt5Gui) -find_package(Qt5UiTools) +if($ENV{CMAKE_PREFIX_PATH} MATCHES "6[.][0-9][.][0-9]") + set(USE_QT6 TRUE) + message(STATUS "Using Qt6") + cmake_policy(SET CMP0012 NEW) # Recognize constants in if() + cmake_policy(SET CMP0072 NEW) # Choose OpenGL over legacy GL + find_package(Qt6Widgets) + find_package(Qt6Gui) + find_package(Qt6UiTools) -if (Qt5Widgets_FOUND) - if (Qt5Gui_FOUND) - if (Qt5UiTools_FOUND) - set( QT_USE_QTGUI TRUE ) - set( QT_USE_QTUITOOLS TRUE ) - set( QT_USE_QTXML TRUE ) - include_directories( - ${CMAKE_CURRENT_SOURCE_DIR} - ${Qt5Widgets_INCLUDES} - ${Qt5Gui_INCLUDES} - ${Qt5UiTools_INCLUDES} - ${CMAKE_CURRENT_BINARY_DIR} - ) - add_subdirectory(backend_qt) - add_subdirectory(frontend_qt) - endif(Qt5UiTools_FOUND) - endif(Qt5Gui_FOUND) -endif(Qt5Widgets_FOUND) + if(Qt6Widgets_FOUND AND Qt6Gui_FOUND AND Qt6UiTools_FOUND) + set(QT_USE_QTGUI TRUE) + set(QT_USE_QTUITOOLS TRUE) + set(QT_USE_QTXML TRUE) + include_directories( + ${CMAKE_CURRENT_SOURCE_DIR} + ${Qt6Widgets_INCLUDES} + ${Qt6Gui_INCLUDES} + ${Qt6UiTools_INCLUDES} + ${CMAKE_CURRENT_BINARY_DIR} + ) + add_subdirectory(backend_qt) + add_subdirectory(frontend_qt) + else() + message(STATUS "Could NOT find Qt6") + endif() +else() + message(STATUS "Using Qt5") + find_package(Qt5Widgets) + find_package(Qt5Gui) + find_package(Qt5UiTools) -CONFIGURE_FILE( + if(Qt5Widgets_FOUND AND Qt5Gui_FOUND AND Qt5UiTools_FOUND) + set(QT_USE_QTGUI TRUE) + set(QT_USE_QTUITOOLS TRUE) + set(QT_USE_QTXML TRUE) + include_directories( + ${CMAKE_CURRENT_SOURCE_DIR} + ${Qt5Widgets_INCLUDES} + ${Qt5Gui_INCLUDES} + ${Qt5UiTools_INCLUDES} + ${CMAKE_CURRENT_BINARY_DIR} + ) + add_subdirectory(backend_qt) + add_subdirectory(frontend_qt) + else() + message(STATUS "Could NOT find Qt5") + endif() +endif() + +configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) -ADD_CUSTOM_TARGET(uninstall +add_custom_target(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") # staniek: don't install diff --git a/backend/aztec.c b/backend/aztec.c index 466c6bfd..941a260d 100644 --- a/backend/aztec.c +++ b/backend/aztec.c @@ -49,14 +49,14 @@ static int count_doubles(const unsigned char source[], const int posn, const siz int i = posn; int cond = 1; - do { + while ((i + 1 < (int) src_len) && cond) { if (((source[i] == '.') || (source[i] == ',')) && (source[i + 1] == ' ')) { c++; } else { cond = 0; } i += 2; - } while ((i < (int) src_len) && cond); + } return c; } @@ -66,14 +66,14 @@ static int count_cr(unsigned char source[], int posn, int length) { int i = posn; int cond = 1; - do { + while ((i < length) && cond) { if (source[i] == 13) { c++; } else { cond = 0; } i++; - } while ((i < length) && cond); + } return c; } @@ -83,14 +83,14 @@ static int count_dotcomma(unsigned char source[], int posn, int length) { int i = posn; int cond = 1; - do { + while ((i < length) && cond) { if ((source[i] == '.') || (source[i] == ',')) { c++; } else { cond = 0; } i++; - } while ((i < length) && cond); + } return c; } @@ -100,14 +100,14 @@ static int count_spaces(unsigned char source[], int posn, int length) { int i = posn; int cond = 1; - do { + while ((i < length) && cond) { if (source[i] == ' ') { c++; } else { cond = 0; } i++; - } while ((i < length) && cond); + } return c; } @@ -168,7 +168,7 @@ static int aztec_text_process(const unsigned char source[], const size_t src_len // Deal first with letter combinations which can be combined to one codeword // Combinations are (CR LF) (. SP) (, SP) (: SP) in Punct mode current_mode = 'U'; - for (i = 0; i < (int) src_len - 1; i++) { + for (i = 0; i + 1 < (int) src_len; i++) { // Combination (CR LF) should always be in Punct mode if ((source[i] == 13) && (source[i + 1] == 10)) { encode_mode[i] = 'P'; @@ -249,19 +249,19 @@ static int aztec_text_process(const unsigned char source[], const size_t src_len i = 0; j = 0; while (i < (int) src_len) { - if ((source[i] == 13) && (source[i + 1] == 10)) { // CR LF + if ((source[i] == 13) && (i + 1 < (int) src_len) && (source[i + 1] == 10)) { // CR LF reduced_source[j] = 'a'; reduced_encode_mode[j] = encode_mode[i]; i += 2; - } else if (((source[i] == '.') && (source[i + 1] == ' ')) && (encode_mode[i] == 'P')) { + } else if ((source[i] == '.') && (i + 1 < (int) src_len) && (source[i + 1] == ' ') && (encode_mode[i] == 'P')) { reduced_source[j] = 'b'; reduced_encode_mode[j] = encode_mode[i]; i += 2; - } else if (((source[i] == ',') && (source[i + 1] == ' ')) && (encode_mode[i] == 'P')) { + } else if ((source[i] == ',') && (i + 1 < (int) src_len) && (source[i + 1] == ' ') && (encode_mode[i] == 'P')) { reduced_source[j] = 'c'; reduced_encode_mode[j] = encode_mode[i]; i += 2; - } else if ((source[i] == ':') && (source[i + 1] == ' ')) { + } else if ((source[i] == ':') && (i + 1 < (int) src_len) && (source[i + 1] == ' ')) { reduced_source[j] = 'd'; reduced_encode_mode[j] = encode_mode[i]; i += 2; @@ -530,7 +530,7 @@ static int aztec_text_process(const unsigned char source[], const size_t src_len printf("\n"); } - strcpy(binary_string, ""); + *binary_string = '\0'; if (gs1) { bin_append(0, 5, binary_string); // P/S @@ -1128,25 +1128,20 @@ INTERNAL int aztec(struct zint_symbol *symbol, unsigned char source[], const siz j = 0; count = 0; for (i = 0; i < data_length; i++) { - if ((j + 1) % codeword_size == 0) { // Last bit of codeword /* 7.3.1.2 "whenever the first B-1 bits ... are all “0”s, then a dummy “1” is inserted..." * "Similarly a message codeword that starts with B-1 “1”s has a dummy “0” inserted..." */ - if (count == (codeword_size - 1)) { - // Codeword of B-1 '1's - adjusted_string[j] = '0'; + if (count == 0 || count == (codeword_size - 1)) { + // Codeword of B-1 '0's or B-1 '1's + adjusted_string[j] = count == 0 ? '1' : '0'; j++; + count = binary_string[i] == '1' ? 1 : 0; + } else { + count = 0; } - if (count == 0) { - // Codeword of B-1 '0's - adjusted_string[j] = '1'; - j++; - } - - count = 0; } else if (binary_string[i] == '1') { /* Skip B so only counting B-1 */ count++; } @@ -1235,19 +1230,15 @@ INTERNAL int aztec(struct zint_symbol *symbol, unsigned char source[], const siz if ((j + 1) % codeword_size == 0) { // Last bit of codeword - if (count == (codeword_size - 1)) { - // Codeword of B-1 '1's - adjusted_string[j] = '0'; + if (count == 0 || count == (codeword_size - 1)) { + // Codeword of B-1 '0's or B-1 '1's + adjusted_string[j] = count == 0 ? '1' : '0'; j++; + count = binary_string[i] == '1' ? 1 : 0; + } else { + count = 0; } - if (count == 0) { - // Codeword of B-1 '0's - adjusted_string[j] = '1'; - j++; - } - - count = 0; } else if (binary_string[i] == '1') { /* Skip B so only counting B-1 */ count++; } @@ -1581,6 +1572,7 @@ INTERNAL int aztec_runes(struct zint_symbol *symbol, unsigned char source[], int int input_value, error_number, i, y, x; char binary_string[28]; unsigned char data_codewords[3], ecc_codewords[6]; + int debug = symbol->debug & ZINT_DEBUG_PRINT; input_value = 0; if (length > 3) { @@ -1609,7 +1601,7 @@ INTERNAL int aztec_runes(struct zint_symbol *symbol, unsigned char source[], int return ZINT_ERROR_INVALID_DATA; } - strcpy(binary_string, ""); + *binary_string = '\0'; bin_append(input_value, 8, binary_string); data_codewords[0] = 0; @@ -1635,8 +1627,6 @@ INTERNAL int aztec_runes(struct zint_symbol *symbol, unsigned char source[], int rs_encode(2, data_codewords, ecc_codewords); rs_free(); - strcpy(binary_string, ""); - for (i = 0; i < 5; i++) { if (ecc_codewords[4 - i] & 0x08) { binary_string[(i * 4) + 8] = '1'; @@ -1668,6 +1658,10 @@ INTERNAL int aztec_runes(struct zint_symbol *symbol, unsigned char source[], int } } + if (debug) { + printf("Binary String: %.28s\n", binary_string); + } + for (y = 8; y < 19; y++) { for (x = 8; x < 19; x++) { if (CompactAztecMap[(y * 27) + x] == 1) { diff --git a/backend/common.c b/backend/common.c index 533bd028..b082eb63 100644 --- a/backend/common.c +++ b/backend/common.c @@ -64,9 +64,10 @@ INTERNAL void bin_append_posn(const int arg, const int length, char *binary, siz start = 0x01 << (length - 1); for (i = 0; i < length; i++) { - binary[posn + i] = '0'; if (arg & (start >> i)) { binary[posn + i] = '1'; + } else { + binary[posn + i] = '0'; } } } @@ -114,18 +115,19 @@ INTERNAL int is_sane(const char test_string[], const unsigned char source[], con /* Replaces huge switch statements for looking up in tables */ INTERNAL void lookup(const char set_string[], const char *table[], const char data, char dest[]) { - size_t i, n = strlen(set_string); + int i, n = (int) strlen(set_string); for (i = 0; i < n; i++) { if (data == set_string[i]) { strcat(dest, table[i]); + break; } } } /* Returns the position of data in set_string */ INTERNAL int posn(const char set_string[], const char data) { - int i, n = (int)strlen(set_string); + int i, n = (int) strlen(set_string); for (i = 0; i < n; i++) { if (data == set_string[i]) { @@ -162,22 +164,23 @@ INTERNAL void unset_module(struct zint_symbol *symbol, const int y_coord, const /* Expands from a width pattern to a bit pattern */ INTERNAL void expand(struct zint_symbol *symbol, const char data[]) { - size_t reader, n = strlen(data); + int reader, n = (int) strlen(data); int writer, i; - char latch; + int latch, num; writer = 0; - latch = '1'; + latch = 1; for (reader = 0; reader < n; reader++) { - for (i = 0; i < ctoi(data[reader]); i++) { - if (latch == '1') { + num = ctoi(data[reader]); + for (i = 0; i < num; i++) { + if (latch) { set_module(symbol, symbol->rows, writer); } writer++; } - latch = (latch == '1' ? '0' : '1'); + latch = !latch; } if (symbol->symbology != BARCODE_PHARMA) { diff --git a/backend/dmatrix.c b/backend/dmatrix.c index 639d6d21..a2c7a6f5 100644 --- a/backend/dmatrix.c +++ b/backend/dmatrix.c @@ -2,7 +2,7 @@ /* libzint - the open source barcode library - Copyright (C) 2009-2017 Robin Stuart + Copyright (C) 2009 - 2020 Robin Stuart developed from and including some functions from: IEC16022 bar code generation @@ -40,8 +40,6 @@ /* vim: set ts=4 sw=4 et : */ #include -#include -#include #include #include #ifdef _MSC_VER @@ -528,7 +526,8 @@ static int look_ahead_test(const unsigned char inputData[], const size_t sourcel /* Encodes data using ASCII, C40, Text, X12, EDIFACT or Base 256 modes as appropriate Supports encoding FNC1 in supporting systems */ -static int dm200encode(struct zint_symbol *symbol, const unsigned char source[], unsigned char target[], int *last_mode, size_t *length_p, int process_buffer[], int *process_p, int *binlen_p) { +static int dm200encode(struct zint_symbol *symbol, const unsigned char source[], unsigned char target[], + int *last_mode, int *last_shift, size_t *length_p, int process_buffer[], int *process_p, int *binlen_p) { size_t sp; int tp, i, gs1; @@ -543,7 +542,7 @@ static int dm200encode(struct zint_symbol *symbol, const unsigned char source[], sp = 0; tp = 0; - memset(process_buffer, 0, 8); + memset(process_buffer, 0, 8 * sizeof(int)); *process_p = 0; strcpy(binary, ""); @@ -645,7 +644,7 @@ static int dm200encode(struct zint_symbol *symbol, const unsigned char source[], if (istwodigits(source, inputlen, sp)) { target[tp] = (unsigned char) ((10 * ctoi(source[sp])) + ctoi(source[sp + 1]) + 130); - if (debug) printf("N%d ", target[tp] - 130); + if (debug) printf("N%02d ", target[tp] - 130); tp++; strcat(binary, " "); sp += 2; @@ -735,17 +734,20 @@ static int dm200encode(struct zint_symbol *symbol, const unsigned char source[], shift_set = c40_shift[source[sp] - 128]; value = c40_value[source[sp] - 128]; } else { - shift_set = c40_shift[source[sp]]; - value = c40_value[source[sp]]; - } - - if (gs1 && (source[sp] == '[')) { - if (gs1 == 2) { - shift_set = c40_shift[29]; - value = c40_value[29]; /* GS */ + if (gs1 && (source[sp] == '[')) { + if (gs1 == 2) { + shift_set = c40_shift[29]; + value = c40_value[29]; /* GS */ + } else { + shift_set = 2; + value = 27; /* FNC1 */ + } } else { - shift_set = 2; - value = 27; /* FNC1 */ + shift_set = c40_shift[source[sp]]; + value = c40_value[source[sp]]; + } + if (*process_p % 3 == 2) { + *last_shift = shift_set; } } @@ -803,17 +805,20 @@ static int dm200encode(struct zint_symbol *symbol, const unsigned char source[], shift_set = text_shift[source[sp] - 128]; value = text_value[source[sp] - 128]; } else { - shift_set = text_shift[source[sp]]; - value = text_value[source[sp]]; - } - - if (gs1 && (source[sp] == '[')) { - if (gs1 == 2) { - shift_set = text_shift[29]; - value = text_value[29]; /* GS */ + if (gs1 && (source[sp] == '[')) { + if (gs1 == 2) { + shift_set = text_shift[29]; + value = text_value[29]; /* GS */ + } else { + shift_set = 2; + value = 27; /* FNC1 */ + } } else { - shift_set = 2; - value = 27; /* FNC1 */ + shift_set = text_shift[source[sp]]; + value = text_value[source[sp]]; + } + if (*process_p % 3 == 2) { + *last_shift = shift_set; } } @@ -865,20 +870,15 @@ static int dm200encode(struct zint_symbol *symbol, const unsigned char source[], int value = 0; if (source[sp] == 13) { value = 0; - } - if (source[sp] == '*') { + } else if (source[sp] == '*') { value = 1; - } - if (source[sp] == '>') { + } else if (source[sp] == '>') { value = 2; - } - if (source[sp] == ' ') { + } else if (source[sp] == ' ') { value = 3; - } - if ((source[sp] >= '0') && (source[sp] <= '9')) { + } else if ((source[sp] >= '0') && (source[sp] <= '9')) { value = (source[sp] - '0') + 4; - } - if ((source[sp] >= 'A') && (source[sp] <= 'Z')) { + } else if ((source[sp] >= 'A') && (source[sp] <= 'Z')) { value = (source[sp] - 'A') + 14; } @@ -977,6 +977,8 @@ static int dm200encode(struct zint_symbol *symbol, const unsigned char source[], } /* while */ + if (debug) printf("\n"); + /* Add length and randomising algorithm to b256 */ i = 0; while (i < tp) { @@ -1024,19 +1026,28 @@ static int dm200encode(struct zint_symbol *symbol, const unsigned char source[], } static int dm200encode_remainder(unsigned char target[], int target_length, const unsigned char source[], const size_t inputlen, - const int last_mode, const int process_buffer[], const int process_p, const int symbols_left, int debug) { + const int last_mode, const int last_shift, const int process_buffer[], const int process_p, const int symbols_left, int debug) { switch (last_mode) { case DM_C40: case DM_TEXT: - if (debug) printf(" %s symbols_left %d, process_p %d\n", last_mode == DM_C40 ? "C40" : "TEXT", symbols_left, process_p); + /* NOTE: the use of a 0-padded doublet is only mentioned in ISO/IEC 16022:2006 for case 5.2.5.2 (b) when 2 symbols and + * 2 C40/Text characters are left, but using it here also for other cases. This matches the behaviour of tec-it (but + * not BWIPP) and is used for figures 4.15-1-1 and 4.15-1-1 in GS1 General Specifications. */ + + if (debug) printf("%s last_shift %d, symbols_left %d, process_p %d ", last_mode == DM_C40 ? "C40" : "TEX", last_shift, symbols_left, process_p); if (process_p == 1) // 1 data character left to encode. { + if (last_shift) { + target[target_length - 1] -= last_shift - 1; // Remove shift from second half of previous doublet leaving pad value (0) + } if (symbols_left > 1) { target[target_length] = 254; target_length++; // Unlatch and encode remaining data in ascii. + if (debug) printf("ASC "); } target[target_length] = source[inputlen - 1] + 1; + if (debug) printf("A%02X ", target[target_length] - 1); target_length++; } else if (process_p == 2) // 2 data characters left to encode. { @@ -1046,55 +1057,62 @@ static int dm200encode_remainder(unsigned char target[], int target_length, cons target_length++; target[target_length] = (unsigned char) (intValue % 256); target_length++; + if (debug) printf("[%d %d %d] ", process_buffer[0], process_buffer[1], 0); if (symbols_left > 2) { target[target_length] = 254; // Unlatch target_length++; + if (debug) printf("ASC "); } } else { if (symbols_left > 0) { target[target_length] = 254; // Unlatch target_length++; + if (debug) printf("ASC "); } } break; case DM_X12: - if (debug) printf(" X12 symbols_left %d, process_p %d\n", symbols_left, process_p); + if (debug) printf("X12 symbols_left %d, process_p %d ", symbols_left, process_p); if ((symbols_left == process_p) && (process_p == 1)) { // Unlatch not required! target[target_length] = source[inputlen - 1] + 1; + if (debug) printf("A%02X ", target[target_length] - 1); target_length++; } else if (symbols_left) { target[target_length] = (254); target_length++; // Unlatch. + if (debug) printf("ASC "); if (process_p == 1) { target[target_length] = source[inputlen - 1] + 1; + if (debug) printf("A%02X ", target[target_length] - 1); target_length++; - } - - if (process_p == 2) { + } else if (process_p == 2) { target[target_length] = source[inputlen - 2] + 1; + if (debug) printf("A%02X ", target[target_length] - 1); target_length++; target[target_length] = source[inputlen - 1] + 1; + if (debug) printf("A%02X ", target[target_length] - 1); target_length++; } } break; case DM_EDIFACT: - if (debug) printf(" EDIFACT symbols_left %d, process_p %d\n", symbols_left, process_p); + if (debug) printf("EDI symbols_left %d, process_p %d ", symbols_left, process_p); if (symbols_left <= 2) // Unlatch not required! { if (process_p == 1) { target[target_length] = source[inputlen - 1] + 1; + if (debug) printf("A%02X ", target[target_length] - 1); target_length++; - } - - if (process_p == 2) { + } else if (process_p == 2) { target[target_length] = source[inputlen - 2] + 1; + if (debug) printf("A%02X ", target[target_length] - 1); target_length++; target[target_length] = source[inputlen - 1] + 1; + if (debug) printf("A%02X ", target[target_length] - 1); target_length++; } } else { @@ -1102,31 +1120,29 @@ static int dm200encode_remainder(unsigned char target[], int target_length, cons if (process_p == 0) { target[target_length] = (unsigned char) (31 << 2); target_length++; - } - - if (process_p == 1) { + if (debug) printf("[31 0 0 0] "); + } else if (process_p == 1) { target[target_length] = (unsigned char) ((process_buffer[0] << 2) + ((31 & 0x30) >> 4)); target_length++; target[target_length] = (unsigned char) ((31 & 0x0f) << 4); target_length++; - } - - if (process_p == 2) { + if (debug) printf("[%d 31 0 0] ", process_buffer[0]); + } else if (process_p == 2) { target[target_length] = (unsigned char) ((process_buffer[0] << 2) + ((process_buffer[1] & 0x30) >> 4)); target_length++; target[target_length] = (unsigned char) (((process_buffer[1] & 0x0f) << 4) + ((31 & 0x3c) >> 2)); target_length++; target[target_length] = (unsigned char) (((31 & 0x03) << 6)); target_length++; - } - - if (process_p == 3) { + if (debug) printf("[%d %d 31 0] ", process_buffer[0], process_buffer[1]); + } else if (process_p == 3) { target[target_length] = (unsigned char) ((process_buffer[0] << 2) + ((process_buffer[1] & 0x30) >> 4)); target_length++; target[target_length] = (unsigned char) (((process_buffer[1] & 0x0f) << 4) + ((process_buffer[2] & 0x3c) >> 2)); target_length++; target[target_length] = (unsigned char) (((process_buffer[2] & 0x03) << 6) + 31); target_length++; + if (debug) printf("[%d %d %d 31] ", process_buffer[0], process_buffer[1], process_buffer[2]); } } break; @@ -1134,9 +1150,9 @@ static int dm200encode_remainder(unsigned char target[], int target_length, cons if (debug) { int i; - printf("\n\n"); + printf("\nData (%d): ", target_length); for (i = 0; i < target_length; i++) - printf("%03d ", target[i]); + printf("%d ", target[i]); printf("\n"); } @@ -1177,10 +1193,12 @@ static int data_matrix_200(struct zint_symbol *symbol,const unsigned char source int taillength, error_number = 0; int H, W, FH, FW, datablock, bytes, rsblock; int last_mode = DM_ASCII; + int last_shift = 0; int symbols_left; + int debug = symbol->debug & ZINT_DEBUG_PRINT; /* inputlen may be decremented by 2 if macro character is used */ - error_number = dm200encode(symbol, source, binary, &last_mode, &inputlen, process_buffer, &process_p, &binlen); + error_number = dm200encode(symbol, source, binary, &last_mode, &last_shift, &inputlen, process_buffer, &process_p, &binlen); if (error_number != 0) { return error_number; } @@ -1226,7 +1244,7 @@ static int data_matrix_200(struct zint_symbol *symbol,const unsigned char source // Now we know the symbol size we can handle the remaining data in the process buffer. symbols_left = matrixbytes[symbolsize] - binlen; - binlen = dm200encode_remainder(binary, binlen, source, inputlen, last_mode, process_buffer, process_p, symbols_left, symbol->debug & ZINT_DEBUG_PRINT); + binlen = dm200encode_remainder(binary, binlen, source, inputlen, last_mode, last_shift, process_buffer, process_p, symbols_left, debug); if (binlen > matrixbytes[symbolsize]) { strcpy(symbol->errtxt, "523: Data too long to fit in symbol"); @@ -1246,27 +1264,23 @@ static int data_matrix_200(struct zint_symbol *symbol,const unsigned char source if (taillength != 0) { add_tail(binary, binlen, taillength); } + if (debug) { + printf("Pads (%d): ", taillength); + for (i = binlen; i < binlen + taillength; i++) printf("%d ", binary[i]); + printf("\n"); + } // ecc code if (symbolsize == INTSYMBOL144) { skew = 1; } ecc200(binary, bytes, datablock, rsblock, skew); - // Print Codewords -#ifdef DEBUG - { - int CWCount; - int posCur; - if (skew) - CWCount = 1558 + 620; - else - CWCount = bytes + rsblock * (bytes / datablock); - printf("Codewords (%i):", CWCount); - for (posCur = 0; posCur < CWCount; posCur++) - printf(" %3i", binary[posCur]); - puts("\n"); + if (debug) { + printf("ECC (%d): ", rsblock * (bytes / datablock)); + for (i = bytes; i < bytes + rsblock * (bytes / datablock); i++) printf("%d ", binary[i]); + printf("\n"); } -#endif + #ifdef ZINT_TEST if (symbol->debug & ZINT_DEBUG_TEST) debug_test_codeword_dump(symbol, binary, skew ? 1558 + 620 : bytes + rsblock * (bytes / datablock)); #endif diff --git a/backend/dmatrix.h b/backend/dmatrix.h index ef39825d..54772fa0 100644 --- a/backend/dmatrix.h +++ b/backend/dmatrix.h @@ -2,7 +2,7 @@ /* libzint - the open source barcode library - Copyright (C) 2009-2017 Robin Stuart + Copyright (C) 2009 - 2020 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -40,15 +40,13 @@ #ifndef __DMATRIX_H #define __DMATRIX_H -#define MAXBARCODE 3116 - -#define DM_NULL 0 -#define DM_ASCII 1 -#define DM_C40 2 -#define DM_TEXT 3 -#define DM_X12 4 -#define DM_EDIFACT 5 -#define DM_BASE256 6 +#define DM_NULL 0 +#define DM_ASCII 1 +#define DM_C40 2 +#define DM_TEXT 3 +#define DM_X12 4 +#define DM_EDIFACT 5 +#define DM_BASE256 6 static const char c40_shift[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -93,13 +91,12 @@ static const unsigned short int intsymbol[] = { 44, /* 21:104x104,816*/ 45, /* 22:120x120,1050*/46, /* 23:132x132,1304*/47, /* 24:144x144,1558*/ 2, /* 25: 8x18 , 5*/ 4, /* 26: 8x32 , 10*/ 6, /* 27: 12x26 , 16*/ 10, /* 28: 12x36 , 22*/ 13, /* 29: 16x36 , 32*/ 20, /* 30: 16x48 , 49*/ -/* DMRE */ +/* DMRE */ 8, /* 31: 8x48 , 18*/ 11, /* 32: 8x64 , 24*/ 14, /* 33: 8x80 , 32*/ 16, /* 34: 8x96 , 38*/ 21, /* 35: 8x120, 49*/ 25, /* 36: 8x144, 63*/ 17, /* 37: 12x64 , 43*/ 26, /* 38: 12x88 , 64*/ 24, /* 39: 16x64 , 62*/ 19, /* 40: 20x36 , 44*/ 22, /* 41: 20x44 , 56*/ 30, /* 42: 20x64 , 84*/ 28, /* 43: 22x48 , 72*/ 29, /* 44: 24x48 , 80*/ 33, /* 45: 24x64 ,108*/ 27, /* 46: 26x40 , 70*/ 32, /* 47: 26x48 , 90*/ 35, /* 48: 26x64 ,118*/ - 0 }; // Number of DM Sizes @@ -167,14 +164,14 @@ static const unsigned short int matrixFH[] = { /* 4*/ 8, /* 8x32 */ 16, /* 16x16 */ 12, /* 12x26 */ 18, /* 18x18 */ /* 8*/ 8, /* 8x48 */ 20, /* 20x20 */ 12, /* 12x36 */ 8, /* 8x64 */ /*12*/ 22, /* 22x22 */ 16, /* 16x36 */ 8, /* 8x80 */ 24, /* 24x24 */ - /*16*/ 8, /* 8x96 */ 12, /* 12x64 */ 26, /* 26x26 */ 20, /* 20x36 */ + /*16*/ 8, /* 8x96 */ 12, /* 12x64 */ 26, /* 26x26 */ 20, /* 20x36 */ /*20*/ 16, /* 16x48 */ 8, /* 8x120*/ 20, /* 20x44 */ 16, /* 32x32 */ /*24*/ 16, /* 16x64 */ 8, /* 8x144*/ 12, /* 12x88 */ 26, /* 26x40 */ /*28*/ 22, /* 22x48 */ 24, /* 24x48 */ 20, /* 20x64 */ 18, /* 36x36 */ /*32*/ 26, /* 26x48 */ 24, /* 24x64 */ 20, /* 40x40 */ 26, /* 26x64 */ /*36*/ 22, /* 44x44 */ 24, /* 48x48 */ 26, /* 52x52 */ 16, /* 64x64 */ /*40*/ 18, /* 72x72 */ 20, /* 80x80 */ 22, /* 88x88 */ 24, /* 96x96 */ - /*44*/ 26, /*104x104*/ 20, /*120x120*/ 22, /*132x132*/ 24 /*144x144*/ + /*44*/ 26, /*104x104*/ 20, /*120x120*/ 22, /*132x132*/ 24 /*144x144*/ }; // Vertical submodule size (including subfinder) @@ -184,14 +181,14 @@ static const unsigned short int matrixFW[] = { /* 4*/ 16, /* 8x32 */ 16, /* 16x16 */ 26, /* 12x26 */ 18, /* 18x18 */ /* 8*/ 24, /* 8x48 */ 20, /* 20x20 */ 18, /* 12x36 */ 16, /* 8x64 */ /*12*/ 22, /* 22x22 */ 18, /* 16x36 */ 20, /* 8x80 */ 24, /* 24x24 */ - /*16*/ 24, /* 8x96 */ 16, /* 12x64 */ 26, /* 26x26 */ 18, /* 20x36 */ + /*16*/ 24, /* 8x96 */ 16, /* 12x64 */ 26, /* 26x26 */ 18, /* 20x36 */ /*20*/ 24, /* 16x48 */ 20, /* 8x120*/ 22, /* 20x44 */ 16, /* 32x32 */ /*24*/ 16, /* 16x64 */ 24, /* 8x144*/ 22, /* 12x88 */ 20, /* 26x40 */ /*28*/ 24, /* 22x48 */ 24, /* 24x48 */ 16, /* 20x64 */ 18, /* 36x36 */ /*32*/ 24, /* 26x48 */ 16, /* 24x64 */ 20, /* 40x40 */ 16, /* 26x64 */ /*36*/ 22, /* 44x44 */ 24, /* 48x48 */ 26, /* 52x52 */ 16, /* 64x64 */ /*40*/ 18, /* 72x72 */ 20, /* 80x80 */ 22, /* 88x88 */ 24, /* 96x96 */ - /*44*/ 26, /*104x104*/ 20, /*120x120*/ 22, /*132x132*/ 24 /*144x144*/ + /*44*/ 26, /*104x104*/ 20, /*120x120*/ 22, /*132x132*/ 24 /*144x144*/ }; // Total Data Codewords @@ -201,14 +198,14 @@ static const unsigned short int matrixbytes[] = { /* 4*/ 10, /* 8x32 */ 12, /* 16x16 */ 16, /* 12x26 */ 18, /* 18x18 */ /* 8*/ 18, /* 8x48 */ 22, /* 20x20 */ 22, /* 12x36 */ 24, /* 8x64 */ /*12*/ 30, /* 22x22 */ 32, /* 16x36 */ 32, /* 8x80 */ 36, /* 24x24 */ - /*16*/ 38, /* 8x96 */ 43, /* 12x64 */ 44, /* 26x26 */ 44, /* 20x36 */ + /*16*/ 38, /* 8x96 */ 43, /* 12x64 */ 44, /* 26x26 */ 44, /* 20x36 */ /*20*/ 49, /* 16x48 */ 49, /* 8x120*/ 56, /* 20x44 */ 62, /* 32x32 */ /*24*/ 62, /* 16x64 */ 63, /* 8x144*/ 64, /* 12x88 */ 70, /* 26x40 */ /*28*/ 72, /* 22x48 */ 80, /* 24x48 */ 84, /* 20x64 */ 86, /* 36x36 */ /*32*/ 90, /* 26x48 */ 108, /* 24x64 */ 114, /* 40x40 */ 118, /* 26x64 */ /*36*/ 144, /* 44x44 */ 174, /* 48x48 */ 204, /* 52x52 */ 280, /* 64x64 */ /*40*/ 368, /* 72x72 */ 456, /* 80x80 */ 576, /* 88x88 */ 696, /* 96x96 */ - /*44*/ 816, /*104x104*/1050, /*120x120*/1304, /*132x132*/1558 /*144x144*/ + /*44*/ 816, /*104x104*/1050, /*120x120*/1304, /*132x132*/1558 /*144x144*/ }; // Data Codewords per RS-Block @@ -218,14 +215,14 @@ static const unsigned short int matrixdatablock[] = { /* 4*/ 10, /* 8x32 */ 12, /* 16x16 */ 16, /* 12x26 */ 18, /* 18x18 */ /* 8*/ 18, /* 8x48 */ 22, /* 20x20 */ 22, /* 12x36 */ 24, /* 8x64 */ /*12*/ 30, /* 22x22 */ 32, /* 16x36 */ 32, /* 8x80 */ 36, /* 24x24 */ - /*16*/ 38, /* 8x96 */ 43, /* 12x64 */ 44, /* 26x26 */ 44, /* 20x36 */ + /*16*/ 38, /* 8x96 */ 43, /* 12x64 */ 44, /* 26x26 */ 44, /* 20x36 */ /*20*/ 49, /* 16x48 */ 49, /* 8x120*/ 56, /* 20x44 */ 62, /* 32x32 */ /*24*/ 62, /* 16x64 */ 63, /* 8x144*/ 64, /* 12x88 */ 70, /* 26x40 */ /*28*/ 72, /* 22x48 */ 80, /* 24x48 */ 84, /* 20x64 */ 86, /* 36x36 */ /*32*/ 90, /* 26x48 */ 108, /* 24x64 */ 114, /* 40x40 */ 118, /* 26x64 */ /*36*/ 144, /* 44x44 */ 174, /* 48x48 */ 102, /* 52x52 */ 140, /* 64x64 */ /*40*/ 92, /* 72x72 */ 114, /* 80x80 */ 144, /* 88x88 */ 174, /* 96x96 */ - /*44*/ 136, /*104x104*/ 175, /*120x120*/ 163, /*132x132*/ 156 /* 144x144*/ + /*44*/ 136, /*104x104*/ 175, /*120x120*/ 163, /*132x132*/ 156 /* 144x144*/ }; // ECC Codewords per RS-Block @@ -241,7 +238,7 @@ static const unsigned short int matrixrsblock[] = { /*28*/ 38, /* 22x48 */ 41, /* 24x48 */ 42, /* 20x64 */ 42, /* 36x36 */ /*32*/ 42, /* 26x48 */ 46, /* 24x64 */ 48, /* 40x40 */ 50, /* 26x64 */ /*36*/ 56, /* 44x44 */ 68, /* 48x48 */ 42, /* 52x52 */ 56, /* 64x64 */ - /*40*/ 36, /* 72x72 */ 48, /* 80x80 */ 56, /* 88x88 */ 68, /* 96x96 */ + /*40*/ 36, /* 72x72 */ 48, /* 80x80 */ 56, /* 88x88 */ 68, /* 96x96 */ /*44*/ 56, /*104x104*/ 68, /*120x120*/ 62, /*132x132*/ 62 /*144x144*/ }; diff --git a/backend/emf.c b/backend/emf.c index 1c89d3f7..712fa241 100644 --- a/backend/emf.c +++ b/backend/emf.c @@ -166,7 +166,8 @@ INTERNAL int emf_plot(struct zint_symbol *symbol, int rotate_angle) { int hexagon_count, this_hexagon; int string_count, this_text; int bytecount, recordcount; - float radius; + float previous_diameter; + float radius, half_radius, half_sqrt3_radius; int colours_used = 0; int rectangle_count_bycolour[9]; unsigned char *this_string[6]; @@ -443,10 +444,14 @@ INTERNAL int emf_plot(struct zint_symbol *symbol, int rotate_angle) { } //Circles + previous_diameter = radius = 0.0f; circ = symbol->vector->circles; this_circle = 0; while (circ) { - radius = circ->diameter / 2.0; + if (previous_diameter != circ->diameter) { + previous_diameter = circ->diameter; + radius = (float) (0.5 * previous_diameter); + } circle[this_circle].type = 0x0000002a; // EMR_ELLIPSE circle[this_circle].size = 24; circle[this_circle].box.top = circ->y - radius; @@ -460,6 +465,7 @@ INTERNAL int emf_plot(struct zint_symbol *symbol, int rotate_angle) { } //Hexagons + previous_diameter = radius = half_radius = half_sqrt3_radius = 0.0f; hex = symbol->vector->hexagons; this_hexagon = 0; while (hex) { @@ -467,33 +473,38 @@ INTERNAL int emf_plot(struct zint_symbol *symbol, int rotate_angle) { hexagon[this_hexagon].size = 76; hexagon[this_hexagon].count = 6; - radius = hex->diameter / 2.0; + 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); + } if ((hex->rotation == 0) || (hex->rotation == 180)) { - ay = hex->y + (1.0 * radius); - by = hex->y + (0.5 * radius); - cy = hex->y - (0.5 * radius); - dy = hex->y - (1.0 * radius); - ey = hex->y - (0.5 * radius); - fy = hex->y + (0.5 * radius); + ay = hex->y + radius; + by = hex->y + half_radius; + cy = hex->y - half_radius; + dy = hex->y - radius; + ey = hex->y - half_radius; + fy = hex->y + half_radius; ax = hex->x; - bx = hex->x + (0.86 * radius); - cx = hex->x + (0.86 * radius); + bx = hex->x + half_sqrt3_radius; + cx = hex->x + half_sqrt3_radius; dx = hex->x; - ex = hex->x - (0.86 * radius); - fx = hex->x - (0.86 * radius); + ex = hex->x - half_sqrt3_radius; + fx = hex->x - half_sqrt3_radius; } else { ay = hex->y; - by = hex->y + (0.86 * radius); - cy = hex->y + (0.86 * radius); + by = hex->y + half_sqrt3_radius; + cy = hex->y + half_sqrt3_radius; dy = hex->y; - ey = hex->y - (0.86 * radius); - fy = hex->y - (0.86 * radius); - ax = hex->x - (1.0 * radius); - bx = hex->x - (0.5 * radius); - cx = hex->x + (0.5 * radius); - dx = hex->x + (1.0 * radius); - ex = hex->x + (0.5 * radius); - fx = hex->x - (0.5 * radius); + ey = hex->y - half_sqrt3_radius; + fy = hex->y - half_sqrt3_radius; + ax = hex->x - radius; + bx = hex->x - half_radius; + cx = hex->x + half_radius; + dx = hex->x + radius; + ex = hex->x + half_radius; + fx = hex->x - half_radius; } hexagon[this_hexagon].a_points_a.x = ax; diff --git a/backend/library.c b/backend/library.c index 62513921..fd0efa4c 100644 --- a/backend/library.c +++ b/backend/library.c @@ -48,12 +48,6 @@ struct zint_symbol *ZBarcode_Create() { memset(symbol, 0, sizeof (*symbol)); symbol->symbology = BARCODE_CODE128; - symbol->height = 0; - symbol->whitespace_width = 0; - symbol->border_width = 0; - symbol->output_options = 0; - symbol->rows = 0; - symbol->width = 0; strcpy(symbol->fgcolour, "000000"); symbol->fgcolor = &symbol->fgcolour[0]; strcpy(symbol->bgcolour, "ffffff"); @@ -61,19 +55,14 @@ struct zint_symbol *ZBarcode_Create() { strcpy(symbol->outfile, "out.png"); symbol->scale = 1.0f; symbol->option_1 = -1; - symbol->option_2 = 0; - symbol->option_3 = 0; symbol->show_hrt = 1; // Show human readable text symbol->fontsize = 8; symbol->input_mode = DATA_MODE; symbol->bitmap = NULL; - symbol->bitmap_width = 0; - symbol->bitmap_height = 0; symbol->alphamap = NULL; symbol->eci = 0; // Default 0 uses ECI 3 symbol->dot_size = 4.0f / 5.0f; symbol->vector = NULL; - symbol->debug = 0; symbol->warn_level = WARN_DEFAULT; return symbol; } @@ -786,9 +775,9 @@ int ZBarcode_ValidID(int symbol_id) { return result; } -static int reduced_charset(struct zint_symbol *symbol, const unsigned char *source, size_t in_length); +static int reduced_charset(struct zint_symbol *symbol, unsigned char *source, size_t in_length); -static int extended_or_reduced_charset(struct zint_symbol *symbol, const unsigned char *source, const int length) { +static int extended_or_reduced_charset(struct zint_symbol *symbol, unsigned char *source, const int length) { int error_number = 0; switch (symbol->symbology) { @@ -812,30 +801,25 @@ static int extended_or_reduced_charset(struct zint_symbol *symbol, const unsigne return error_number; } -static int reduced_charset(struct zint_symbol *symbol, const unsigned char *source, size_t in_length) { +static int reduced_charset(struct zint_symbol *symbol, unsigned char *source, size_t in_length) { /* These are the "norm" standards which only support Latin-1 at most, though a few support ECI */ int error_number = 0; + unsigned char *preprocessed = source; #ifndef _MSC_VER - unsigned char preprocessed[in_length + 1]; + unsigned char preprocessed_buf[in_length + 1]; #else - unsigned char* preprocessed = (unsigned char*) _alloca(in_length + 1); + unsigned char *preprocessed_buf = (unsigned char *) _alloca(in_length + 1); #endif - switch (symbol->input_mode & 0x07) { - case DATA_MODE: - case GS1_MODE: - memcpy(preprocessed, source, in_length); - preprocessed[in_length] = '\0'; - break; - case UNICODE_MODE: - /* Prior check ensures ECI only set for those that support it */ - error_number = utf_to_eci(symbol->eci && symbol->eci <= 899 ? symbol->eci : 3, source, preprocessed, &in_length); - if (error_number != 0) { - strcpy(symbol->errtxt, "204: Invalid characters in input data"); - return error_number; - } - break; + if ((symbol->input_mode & 0x07) == UNICODE_MODE) { + /* Prior check ensures ECI only set for those that support it */ + preprocessed = preprocessed_buf; + error_number = utf_to_eci(symbol->eci && symbol->eci <= 899 ? symbol->eci : 3, source, preprocessed, &in_length); + if (error_number != 0) { + strcpy(symbol->errtxt, "204: Invalid characters in input data"); + return error_number; + } } if ((symbol->height == 0) && is_linear(symbol->symbology)) { @@ -1197,22 +1181,16 @@ int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int symbol->symbology = BARCODE_CODE128; error_number = ZINT_WARN_INVALID_OPTION; } - } - /* symbol->symbologys 1 to 86 are defined by tbarcode */ - if (symbol->symbology == 5) { + } else if (symbol->symbology == 5) { symbol->symbology = BARCODE_C25STANDARD; - } - if ((symbol->symbology >= 10) && (symbol->symbology <= 12)) { + } else if ((symbol->symbology >= 10) && (symbol->symbology <= 12)) { symbol->symbology = BARCODE_EANX; - } - if (symbol->symbology == 15) { + } else if (symbol->symbology == 15) { symbol->symbology = BARCODE_EANX; - } - if (symbol->symbology == 17) { + } else if (symbol->symbology == 17) { symbol->symbology = BARCODE_UPCA; - } - if (symbol->symbology == 19) { + } else if (symbol->symbology == 19) { strcpy(symbol->errtxt, "207: Codabar 18 not supported"); if (symbol->warn_level == WARN_FAIL_ALL) { return WARN_FAIL_ALL; @@ -1220,30 +1198,22 @@ int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int symbol->symbology = BARCODE_CODABAR; error_number = ZINT_WARN_INVALID_OPTION; } - } - if (symbol->symbology == 26) { + } else if (symbol->symbology == 26) { symbol->symbology = BARCODE_UPCA; - } - if (symbol->symbology == 27) { + } else if (symbol->symbology == 27) { strcpy(symbol->errtxt, "208: UPCD1 not supported"); error_number = ZINT_ERROR_INVALID_OPTION; - } - if (symbol->symbology == 33) { + } else if (symbol->symbology == 33) { symbol->symbology = BARCODE_GS1_128; - } - if (symbol->symbology == 36) { + } else if (symbol->symbology == 36) { symbol->symbology = BARCODE_UPCA; - } - if ((symbol->symbology >= 41) && (symbol->symbology <= 45)) { + } else if ((symbol->symbology >= 41) && (symbol->symbology <= 45)) { symbol->symbology = BARCODE_POSTNET; - } - if (symbol->symbology == 46) { + } else if (symbol->symbology == 46) { symbol->symbology = BARCODE_PLESSEY; - } - if (symbol->symbology == 48) { + } else if (symbol->symbology == 48) { symbol->symbology = BARCODE_NVE18; - } - if (symbol->symbology == 54) { + } else if (symbol->symbology == 54) { strcpy(symbol->errtxt, "210: General Parcel Code not supported"); if (symbol->warn_level == WARN_FAIL_ALL) { return ZINT_ERROR_INVALID_OPTION; @@ -1251,26 +1221,19 @@ int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int symbol->symbology = BARCODE_CODE128; error_number = ZINT_WARN_INVALID_OPTION; } - } - if ((symbol->symbology == 59) || (symbol->symbology == 61)) { + } else if ((symbol->symbology == 59) || (symbol->symbology == 61)) { symbol->symbology = BARCODE_CODE128; - } - if (symbol->symbology == 62) { + } else if (symbol->symbology == 62) { symbol->symbology = BARCODE_CODE93; - } - if ((symbol->symbology == 64) || (symbol->symbology == 65)) { + } else if ((symbol->symbology == 64) || (symbol->symbology == 65)) { symbol->symbology = BARCODE_AUSPOST; - } - if (symbol->symbology == 78) { + } else if (symbol->symbology == 78) { symbol->symbology = BARCODE_DBAR_OMN; - } - if (symbol->symbology == 83) { + } else if (symbol->symbology == 83) { symbol->symbology = BARCODE_PLANET; - } - if (symbol->symbology == 88) { + } else if (symbol->symbology == 88) { symbol->symbology = BARCODE_GS1_128; - } - if (symbol->symbology == 91) { + } else if (symbol->symbology == 91) { strcpy(symbol->errtxt, "212: Symbology out of range"); if (symbol->warn_level == WARN_FAIL_ALL) { return ZINT_ERROR_INVALID_OPTION; @@ -1278,8 +1241,7 @@ int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int symbol->symbology = BARCODE_CODE128; error_number = ZINT_WARN_INVALID_OPTION; } - } - if ((symbol->symbology >= 94) && (symbol->symbology <= 95)) { + } else if ((symbol->symbology >= 94) && (symbol->symbology <= 95)) { strcpy(symbol->errtxt, "213: Symbology out of range"); if (symbol->warn_level == WARN_FAIL_ALL) { return ZINT_ERROR_INVALID_OPTION; @@ -1287,29 +1249,21 @@ int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int symbol->symbology = BARCODE_CODE128; error_number = ZINT_WARN_INVALID_OPTION; } - } - if (symbol->symbology == 100) { + } else if (symbol->symbology == 100) { symbol->symbology = BARCODE_HIBC_128; - } - if (symbol->symbology == 101) { + } else if (symbol->symbology == 101) { symbol->symbology = BARCODE_HIBC_39; - } - if (symbol->symbology == 103) { + } else if (symbol->symbology == 103) { symbol->symbology = BARCODE_HIBC_DM; - } - if (symbol->symbology == 105) { + } else if (symbol->symbology == 105) { symbol->symbology = BARCODE_HIBC_QR; - } - if (symbol->symbology == 107) { + } else if (symbol->symbology == 107) { symbol->symbology = BARCODE_HIBC_PDF; - } - if (symbol->symbology == 109) { + } else if (symbol->symbology == 109) { symbol->symbology = BARCODE_HIBC_MICPDF; - } - if (symbol->symbology == 111) { + } else if (symbol->symbology == 111) { symbol->symbology = BARCODE_HIBC_BLOCKF; - } - if ((symbol->symbology == 113) || (symbol->symbology == 114)) { + } else if ((symbol->symbology == 113) || (symbol->symbology == 114)) { strcpy(symbol->errtxt, "214: Symbology out of range"); if (symbol->warn_level == WARN_FAIL_ALL) { return ZINT_ERROR_INVALID_OPTION; @@ -1317,11 +1271,9 @@ int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int symbol->symbology = BARCODE_CODE128; error_number = ZINT_WARN_INVALID_OPTION; } - } - if (symbol->symbology == 115) { + } else if (symbol->symbology == 115) { symbol->symbology = BARCODE_DOTCODE; - } - if ((symbol->symbology >= 117) && (symbol->symbology <= 127)) { + } else if ((symbol->symbology >= 117) && (symbol->symbology <= 127)) { if (symbol->symbology != 121) { strcpy(symbol->errtxt, "215: Symbology out of range"); if (symbol->warn_level == WARN_FAIL_ALL) { @@ -1331,9 +1283,8 @@ int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int error_number = ZINT_WARN_INVALID_OPTION; } } - } /* Everything from 128 up is Zint-specific */ - if (symbol->symbology > 145) { + } else if (symbol->symbology > 145) { strcpy(symbol->errtxt, "216: Symbology out of range"); if (symbol->warn_level == WARN_FAIL_ALL) { return ZINT_ERROR_INVALID_OPTION; diff --git a/backend/ps.c b/backend/ps.c index 7fe4f2f7..1246f5ae 100644 --- a/backend/ps.c +++ b/backend/ps.c @@ -139,7 +139,8 @@ INTERNAL int ps_plot(struct zint_symbol *symbol) { float cyan_paper, magenta_paper, yellow_paper, black_paper; int error_number = 0; float ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy; - float radius; + float previous_diameter; + float radius, half_radius, half_sqrt3_radius; int colour_index, colour_rect_counter; char ps_color[30]; int draw_background = 1; @@ -180,58 +181,58 @@ INTERNAL int ps_plot(struct zint_symbol *symbol) { bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]); bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]); bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]); - red_ink = fgred / 256.0; - green_ink = fggrn / 256.0; - blue_ink = fgblu / 256.0; - red_paper = bgred / 256.0; - green_paper = bggrn / 256.0; - blue_paper = bgblu / 256.0; + red_ink = (float) (fgred / 256.0); + green_ink = (float) (fggrn / 256.0); + blue_ink = (float) (fgblu / 256.0); + red_paper = (float) (bgred / 256.0); + green_paper = (float) (bggrn / 256.0); + blue_paper = (float) (bgblu / 256.0); /* Convert RGB to CMYK */ if (red_ink > green_ink) { if (blue_ink > red_ink) { - black_ink = 1 - blue_ink; + black_ink = 1.0f - blue_ink; } else { - black_ink = 1 - red_ink; + black_ink = 1.0f - red_ink; } } else { if (blue_ink > red_ink) { - black_ink = 1 - blue_ink; + black_ink = 1.0f - blue_ink; } else { - black_ink = 1 - green_ink; + black_ink = 1.0f - green_ink; } } - if (black_ink < 1.0) { - cyan_ink = (1 - red_ink - black_ink) / (1 - black_ink); - magenta_ink = (1 - green_ink - black_ink) / (1 - black_ink); - yellow_ink = (1 - blue_ink - black_ink) / (1 - black_ink); + if (black_ink < 1.0f) { + cyan_ink = (1.0f - red_ink - black_ink) / (1.0f - black_ink); + magenta_ink = (1.0f - green_ink - black_ink) / (1.0f - black_ink); + yellow_ink = (1.0f - blue_ink - black_ink) / (1.0f - black_ink); } else { - cyan_ink = 0.0; - magenta_ink = 0.0; - yellow_ink = 0.0; + cyan_ink = 0.0f; + magenta_ink = 0.0f; + yellow_ink = 0.0f; } if (red_paper > green_paper) { if (blue_paper > red_paper) { - black_paper = 1 - blue_paper; + black_paper = 1.0f - blue_paper; } else { - black_paper = 1 - red_paper; + black_paper = 1.0f - red_paper; } } else { if (blue_paper > red_paper) { - black_paper = 1 - blue_paper; + black_paper = 1.0f - blue_paper; } else { - black_paper = 1 - green_paper; + black_paper = 1.0f - green_paper; } } - if (black_paper < 1.0) { - cyan_paper = (1 - red_paper - black_paper) / (1 - black_paper); - magenta_paper = (1 - green_paper - black_paper) / (1 - black_paper); - yellow_paper = (1 - blue_paper - black_paper) / (1 - black_paper); + if (black_paper < 1.0f) { + cyan_paper = (1.0f - red_paper - black_paper) / (1.0f - black_paper); + magenta_paper = (1.0f - green_paper - black_paper) / (1.0f - black_paper); + yellow_paper = (1.0f - blue_paper - black_paper) / (1.0f - black_paper); } else { - cyan_paper = 0.0; - magenta_paper = 0.0; - yellow_paper = 0.0; + cyan_paper = 0.0f; + magenta_paper = 0.0f; + yellow_paper = 0.0f; } for (i = 0, len = (int) ustrlen(symbol->text); i < len; i++) { @@ -329,43 +330,54 @@ INTERNAL int ps_plot(struct zint_symbol *symbol) { } // Hexagons + previous_diameter = radius = half_radius = half_sqrt3_radius = 0.0f; hex = symbol->vector->hexagons; while (hex) { - radius = hex->diameter / 2.0; + 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); + } if ((hex->rotation == 0) || (hex->rotation == 180)) { - ay = (symbol->vector->height - hex->y) + (1.0 * radius); - by = (symbol->vector->height - hex->y) + (0.5 * radius); - cy = (symbol->vector->height - hex->y) - (0.5 * radius); - dy = (symbol->vector->height - hex->y) - (1.0 * radius); - ey = (symbol->vector->height - hex->y) - (0.5 * radius); - fy = (symbol->vector->height - hex->y) + (0.5 * radius); + ay = (symbol->vector->height - hex->y) + radius; + by = (symbol->vector->height - hex->y) + half_radius; + cy = (symbol->vector->height - hex->y) - half_radius; + dy = (symbol->vector->height - hex->y) - radius; + ey = (symbol->vector->height - hex->y) - half_radius; + fy = (symbol->vector->height - hex->y) + half_radius; ax = hex->x; - bx = hex->x + (0.86 * radius); - cx = hex->x + (0.86 * radius); + bx = hex->x + half_sqrt3_radius; + cx = hex->x + half_sqrt3_radius; dx = hex->x; - ex = hex->x - (0.86 * radius); - fx = hex->x - (0.86 * radius); + ex = hex->x - half_sqrt3_radius; + fx = hex->x - half_sqrt3_radius; } else { ay = (symbol->vector->height - hex->y); - by = (symbol->vector->height - hex->y) + (0.86 * radius); - cy = (symbol->vector->height - hex->y) + (0.86 * radius); + by = (symbol->vector->height - hex->y) + half_sqrt3_radius; + cy = (symbol->vector->height - hex->y) + half_sqrt3_radius; dy = (symbol->vector->height - hex->y); - ey = (symbol->vector->height - hex->y) - (0.86 * radius); - fy = (symbol->vector->height - hex->y) - (0.86 * radius); - ax = hex->x - (1.0 * radius); - bx = hex->x - (0.5 * radius); - cx = hex->x + (0.5 * radius); - dx = hex->x + (1.0 * radius); - ex = hex->x + (0.5 * radius); - fx = hex->x - (0.5 * radius); + ey = (symbol->vector->height - hex->y) - half_sqrt3_radius; + fy = (symbol->vector->height - hex->y) - half_sqrt3_radius; + ax = hex->x - radius; + bx = hex->x - half_radius; + cx = hex->x + half_radius; + dx = hex->x + radius; + ex = hex->x + half_radius; + fx = hex->x - half_radius; } fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TH\n", ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy); hex = hex->next; } // Circles + previous_diameter = radius = 0.0f; circle = symbol->vector->circles; while (circle) { + if (previous_diameter != circle->diameter) { + previous_diameter = circle->diameter; + radius = (float) (0.5 * previous_diameter); + } if (circle->colour) { // A 'white' circle if ((symbol->output_options & CMYK_COLOUR) == 0) { @@ -373,7 +385,7 @@ INTERNAL int ps_plot(struct zint_symbol *symbol) { } else { fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_paper, magenta_paper, yellow_paper, black_paper); } - fprintf(feps, "%.2f %.2f %.2f TD\n", circle->x, (symbol->vector->height - circle->y), circle->diameter / 2.0); + fprintf(feps, "%.2f %.2f %.2f TD\n", circle->x, (symbol->vector->height - circle->y), radius); if (circle->next) { if ((symbol->output_options & CMYK_COLOUR) == 0) { fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); @@ -383,7 +395,7 @@ INTERNAL int ps_plot(struct zint_symbol *symbol) { } } else { // A 'black' circle - fprintf(feps, "%.2f %.2f %.2f TD\n", circle->x, (symbol->vector->height - circle->y), circle->diameter / 2.0); + fprintf(feps, "%.2f %.2f %.2f TD\n", circle->x, (symbol->vector->height - circle->y), radius); } circle = circle->next; } diff --git a/backend/raster.c b/backend/raster.c index 34a5c889..33de24d9 100644 --- a/backend/raster.c +++ b/backend/raster.c @@ -667,28 +667,34 @@ static int plot_raster_dotty(struct zint_symbol *symbol, int rotate_angle, int f int r, i; int scale_width, scale_height; int error_number = 0; - int image_width, image_height; int xoffset, yoffset, roffset, boffset; - int dot_overspill = 0; + float dot_overspill; + float dotoffset; float dotradius_scaled; + int dot_overspill_scaled; + + if (scaler < 2.0f) { + scaler = 2.0f; + } symbol->height = symbol->rows; // This is true because only 2d matrix symbols are processed here output_set_whitespace_offsets(symbol, &xoffset, &yoffset, &roffset, &boffset); - dot_overspill = (int) ceil(symbol->dot_size - 1); /* Allow for exceeding 1X */ - if (dot_overspill < 0) { - dot_overspill = 0; + dot_overspill = symbol->dot_size - 1.0f; /* Allow for exceeding 1X */ + if (dot_overspill < 0.0f) { + dotoffset = -dot_overspill / 2.0f; + dot_overspill_scaled = 0; + } else { + dotoffset = 0.0f; + dot_overspill_scaled = dot_overspill * scaler; + } + if (dot_overspill_scaled == 0) { + dot_overspill_scaled = 1; } - image_width = symbol->width + dot_overspill + xoffset + roffset; - image_height = symbol->height + dot_overspill + yoffset + boffset; - - if (scaler < 2.0f) { - scaler = 2.0f; - } - scale_width = image_width * scaler; - scale_height = image_height * scaler; + scale_width = (symbol->width + xoffset + roffset) * scaler + dot_overspill_scaled; + scale_height = (symbol->height + yoffset + boffset) * scaler + dot_overspill_scaled; /* Apply scale options by creating another pixel buffer */ if (!(scaled_pixelbuf = (char *) malloc(scale_width * scale_height))) { @@ -700,11 +706,11 @@ static int plot_raster_dotty(struct zint_symbol *symbol, int rotate_angle, int f /* Plot the body of the symbol to the pixel buffer */ dotradius_scaled = (symbol->dot_size * scaler) / 2.0f; for (r = 0; r < symbol->rows; r++) { - float row_scaled = (r + yoffset) * scaler + dotradius_scaled; + float row_scaled = (r + dotoffset + yoffset) * scaler + dotradius_scaled; for (i = 0; i < symbol->width; i++) { if (module_is_set(symbol, r, i)) { draw_circle(scaled_pixelbuf, scale_width, scale_height, - (i + xoffset) * scaler + dotradius_scaled, + (i + dotoffset + xoffset) * scaler + dotradius_scaled, row_scaled, dotradius_scaled, DEFAULT_INK); @@ -1178,14 +1184,12 @@ INTERNAL int plot_raster(struct zint_symbol *symbol, int rotate_angle, int file_ return error; } - if (symbol->output_options & BARCODE_DOTTY_MODE) { + if (symbol->symbology == BARCODE_MAXICODE) { + error = plot_raster_maxicode(symbol, rotate_angle, file_type); + } else if (symbol->output_options & BARCODE_DOTTY_MODE) { error = plot_raster_dotty(symbol, rotate_angle, file_type); } else { - if (symbol->symbology == BARCODE_MAXICODE) { - error = plot_raster_maxicode(symbol, rotate_angle, file_type); - } else { - error = plot_raster_default(symbol, rotate_angle, file_type); - } + error = plot_raster_default(symbol, rotate_angle, file_type); } return error; diff --git a/backend/svg.c b/backend/svg.c index ead5440c..45c3b27f 100644 --- a/backend/svg.c +++ b/backend/svg.c @@ -41,7 +41,7 @@ #include "common.h" -void pick_colour(int colour, char colour_code[]) { +static void pick_colour(int colour, char colour_code[]) { switch(colour) { case 1: // Cyan strcpy(colour_code, "00ffff"); @@ -119,12 +119,14 @@ INTERNAL int svg_plot(struct zint_symbol *symbol) { int error_number = 0; const char *locale = NULL; float ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy; - float radius; + float previous_diameter; + float radius, half_radius, half_sqrt3_radius; int i; char fgcolour_string[7]; char bgcolour_string[7]; int bg_alpha = 0xff; int fg_alpha = 0xff; + float fg_alpha_opacity = 0.0f, bg_alpha_opacity = 0.0f; const char *font_family = "Helvetica, sans-serif"; int bold; @@ -149,9 +151,15 @@ INTERNAL int svg_plot(struct zint_symbol *symbol) { if (strlen(symbol->fgcolour) > 6) { fg_alpha = (16 * ctoi(symbol->fgcolour[6])) + ctoi(symbol->fgcolour[7]); + if (fg_alpha != 0xff) { + fg_alpha_opacity = (float) (fg_alpha / 255.0); + } } if (strlen(symbol->bgcolour) > 6) { bg_alpha = (16 * ctoi(symbol->bgcolour[6])) + ctoi(symbol->bgcolour[7]); + if (bg_alpha != 0xff) { + bg_alpha_opacity = (float) (bg_alpha / 255.0); + } } html_len = strlen((char *)symbol->text) + 1; @@ -204,7 +212,7 @@ INTERNAL int svg_plot(struct zint_symbol *symbol) { if (bg_alpha != 0) { fprintf(fsvg, " vector->width), (int) ceil(symbol->vector->height), bgcolour_string); if (bg_alpha != 0xff) { - fprintf(fsvg, " opacity=\"%.3f\"", (float) bg_alpha / 255.0); + fprintf(fsvg, " opacity=\"%.3f\"", bg_alpha_opacity); } fprintf(fsvg, " />\n"); } @@ -217,63 +225,74 @@ INTERNAL int svg_plot(struct zint_symbol *symbol) { fprintf(fsvg, " fill=\"#%s\"", colour_code); } if (fg_alpha != 0xff) { - fprintf(fsvg, " opacity=\"%.3f\"", (float) fg_alpha / 255.0); + fprintf(fsvg, " opacity=\"%.3f\"", fg_alpha_opacity); } fprintf(fsvg, " />\n"); rect = rect->next; } + previous_diameter = radius = half_radius = half_sqrt3_radius = 0.0f; hex = symbol->vector->hexagons; while (hex) { - radius = hex->diameter / 2.0; + 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); + } if ((hex->rotation == 0) || (hex->rotation == 180)) { - ay = hex->y + (1.0 * radius); - by = hex->y + (0.5 * radius); - cy = hex->y - (0.5 * radius); - dy = hex->y - (1.0 * radius); - ey = hex->y - (0.5 * radius); - fy = hex->y + (0.5 * radius); + ay = hex->y + radius; + by = hex->y + half_radius; + cy = hex->y - half_radius; + dy = hex->y - radius; + ey = hex->y - half_radius; + fy = hex->y + half_radius; ax = hex->x; - bx = hex->x + (0.86 * radius); - cx = hex->x + (0.86 * radius); + bx = hex->x + half_sqrt3_radius; + cx = hex->x + half_sqrt3_radius; dx = hex->x; - ex = hex->x - (0.86 * radius); - fx = hex->x - (0.86 * radius); + ex = hex->x - half_sqrt3_radius; + fx = hex->x - half_sqrt3_radius; } else { ay = hex->y; - by = hex->y + (0.86 * radius); - cy = hex->y + (0.86 * radius); + by = hex->y + half_sqrt3_radius; + cy = hex->y + half_sqrt3_radius; dy = hex->y; - ey = hex->y - (0.86 * radius); - fy = hex->y - (0.86 * radius); - ax = hex->x - (1.0 * radius); - bx = hex->x - (0.5 * radius); - cx = hex->x + (0.5 * radius); - dx = hex->x + (1.0 * radius); - ex = hex->x + (0.5 * radius); - fx = hex->x - (0.5 * radius); + ey = hex->y - half_sqrt3_radius; + fy = hex->y - half_sqrt3_radius; + ax = hex->x - radius; + bx = hex->x - half_radius; + cx = hex->x + half_radius; + dx = hex->x + radius; + ex = hex->x + half_radius; + fx = hex->x - half_radius; } fprintf(fsvg, " \n"); hex = hex->next; } + previous_diameter = radius = 0.0f; circle = symbol->vector->circles; while (circle) { - fprintf(fsvg, " x, circle->y, circle->diameter / 2.0); + if (previous_diameter != circle->diameter) { + previous_diameter = circle->diameter; + radius = (float) (0.5 * previous_diameter); + } + fprintf(fsvg, " x, circle->y, radius); if (circle->colour) { fprintf(fsvg, " fill=\"#%s\"", bgcolour_string); if (bg_alpha != 0xff) { // This doesn't work how the user is likely to expect - more work needed! - fprintf(fsvg, " opacity=\"%.3f\"", (float) bg_alpha / 255.0); + fprintf(fsvg, " opacity=\"%.3f\"", bg_alpha_opacity); } } else { if (fg_alpha != 0xff) { - fprintf(fsvg, " opacity=\"%.3f\"", (float) fg_alpha / 255.0); + fprintf(fsvg, " opacity=\"%.3f\"", fg_alpha_opacity); } } fprintf(fsvg, " />\n"); @@ -290,7 +309,7 @@ INTERNAL int svg_plot(struct zint_symbol *symbol) { fprintf(fsvg, " font-weight=\"bold\""); } if (fg_alpha != 0xff) { - fprintf(fsvg, " opacity=\"%.3f\"", (float) fg_alpha / 255.0); + fprintf(fsvg, " opacity=\"%.3f\"", fg_alpha_opacity); } if (string->rotation != 0) { fprintf(fsvg, " transform=\"rotate(%d,%.2f,%.2f)\"", string->rotation, string->x, string->y); diff --git a/backend/tests/data/print/bmp/dotcode_aim_fig7.bmp b/backend/tests/data/print/bmp/dotcode_aim_fig7.bmp index 69bb9520bd1c527a2080f60ab5c8e8d005c3f0b5..e7f5282df11033aabbeea3c80c6b048647234afa 100644 GIT binary patch literal 2082 zcmc&!K~BR!4BSwpaHBtn#EDnXs&}5jFOXV^kL4*mAx93VVLWTg*^Qg-4WkUUYsYrH zv#0l$r$l)JzT)}9^MR+sUo8)C$TQD#{gc~B+l%FpQa`3o@j0aQ{GG1ibBKMz)JZi5 z7_GTc-Kan5qmoCl4USnG#HY|rSvy?dQ`r5Ow)UMz_!RozthMGwb*(ivsr{kCS~xF2 zR%+7AJ^)Ak2#(s(JgQvaFZmlZ@CJR1mVRRH*#6Bs>{|0c#-y(8(SlWK8lwh z3S>y21`eBm$>9QOq(s>AokvgupF_Z;H8-jo^=I$3|30c|&I%<7LwyydIa99ri!)AH zfmIaz;BU(~d&|<-j|?+%(y*?SBspM>cK(+4L3D4l-Z}qvUtzT9)F~^9!S!U{^BF7d y#Tmd>PV@=Qkyo@c-1!CnXoi>dDR~0N92mlSEsYHR!-6lpC*ve$B7 z-=3e0;{y4D=L63>o&$dEcmR-|Wm(#(V#8rbRuN{W(dL8|VRpVBz5o>gLt)qH_>HL| zcKlSV%B$+bC)>eo2{9VAv`6ORIA!gYFc*)Xp>45c1m@y2XRS9@<&DxTmFD#!!*+1J zi8WG}=eaKsWF|v-@6UHw6hyhF4Msk$6Xq#){Zy>VtLo!N*CN*IORf0`D!5G@RM4fN zf@W`Qa|CFr`qnFOYemJ7!4(y35@*4wV3WYLrXsMK3O31(pNds^Reib2t>n=IJXTW| z10U$uBx2kQtzlXGhAksn1BcSLfUdom%Vg>Qh)MeO=O% zIFl0E{@!r% zq<3GUx9iXoPS46=2v+$hIXPEOp1dc|%JENj_$NE}C1W@lSI$guW~zLgoSZ9XE<7<8 zo?M@~;LKGy48ba&Bq#sMXUUnXa^}JlbK%K-nG4Qbl`|6@@0CxJ^S|I5(vIZC`4@g= BIqLub literal 1212 zcmZ9KyGlb*5JmU(MNm-`3kwk&AE<>|O3Ii{Nhv8MrKFUU7r)BF5ArYKUOEGlb6|7k ztPC@I=BAVMZsqxOFw2MU;lA{>Bb_}xkEKrE8`8bGua)z&E}`4*Un@VxXC^o^RXz>Qo-6lLcw#O* zWqsy?Ggsv>1gm@&oc&k62;MiGx$wkXc*?%a1!u0xnF)^f%ICrPUhqAO|79NHUsf(T APXGV_ diff --git a/backend/tests/data/print/eps/dotcode_aim_fig7.eps b/backend/tests/data/print/eps/dotcode_aim_fig7.eps index 61730583..43dbc88e 100644 --- a/backend/tests/data/print/eps/dotcode_aim_fig7.eps +++ b/backend/tests/data/print/eps/dotcode_aim_fig7.eps @@ -15,42 +15,42 @@ newpath 100.00 0.00 TB 0.00 130.00 TR TE 0.00 0.00 0.00 setrgbcolor -4.00 96.00 4.00 TD -24.00 96.00 4.00 TD -64.00 96.00 4.00 TD -84.00 96.00 4.00 TD -104.00 96.00 4.00 TD -124.00 96.00 4.00 TD -34.00 86.00 4.00 TD -4.00 76.00 4.00 TD -44.00 76.00 4.00 TD -84.00 76.00 4.00 TD -104.00 76.00 4.00 TD -124.00 76.00 4.00 TD -14.00 66.00 4.00 TD -74.00 66.00 4.00 TD -94.00 66.00 4.00 TD -44.00 56.00 4.00 TD -64.00 56.00 4.00 TD -104.00 56.00 4.00 TD -14.00 46.00 4.00 TD -54.00 46.00 4.00 TD -114.00 46.00 4.00 TD -4.00 36.00 4.00 TD -44.00 36.00 4.00 TD -64.00 36.00 4.00 TD -84.00 36.00 4.00 TD -124.00 36.00 4.00 TD -14.00 26.00 4.00 TD -34.00 26.00 4.00 TD -54.00 26.00 4.00 TD -94.00 26.00 4.00 TD -4.00 16.00 4.00 TD -44.00 16.00 4.00 TD -84.00 16.00 4.00 TD -104.00 16.00 4.00 TD -124.00 16.00 4.00 TD -14.00 6.00 4.00 TD -34.00 6.00 4.00 TD -74.00 6.00 4.00 TD -114.00 6.00 4.00 TD +5.00 95.00 4.00 TD +25.00 95.00 4.00 TD +65.00 95.00 4.00 TD +85.00 95.00 4.00 TD +105.00 95.00 4.00 TD +125.00 95.00 4.00 TD +35.00 85.00 4.00 TD +5.00 75.00 4.00 TD +45.00 75.00 4.00 TD +85.00 75.00 4.00 TD +105.00 75.00 4.00 TD +125.00 75.00 4.00 TD +15.00 65.00 4.00 TD +75.00 65.00 4.00 TD +95.00 65.00 4.00 TD +45.00 55.00 4.00 TD +65.00 55.00 4.00 TD +105.00 55.00 4.00 TD +15.00 45.00 4.00 TD +55.00 45.00 4.00 TD +115.00 45.00 4.00 TD +5.00 35.00 4.00 TD +45.00 35.00 4.00 TD +65.00 35.00 4.00 TD +85.00 35.00 4.00 TD +125.00 35.00 4.00 TD +15.00 25.00 4.00 TD +35.00 25.00 4.00 TD +55.00 25.00 4.00 TD +95.00 25.00 4.00 TD +5.00 15.00 4.00 TD +45.00 15.00 4.00 TD +85.00 15.00 4.00 TD +105.00 15.00 4.00 TD +125.00 15.00 4.00 TD +15.00 5.00 4.00 TD +35.00 5.00 4.00 TD +75.00 5.00 4.00 TD +115.00 5.00 4.00 TD diff --git a/backend/tests/data/print/gif/dotcode_aim_fig7.gif b/backend/tests/data/print/gif/dotcode_aim_fig7.gif index e82f1425a753dd33fd6d19afa66c46c5ff2ff4c5..41f53d101631697ffa33ed6ddda1ea12baf317e5 100644 GIT binary patch literal 694 zcmV;n0!jTxNk%v~VS@l=0Pp|+|Ns90001li0001k0A&CG0{?`MsmtvTqntF*W3R?L zUtcl7I8J1_nWsv!Xmo-={5rIpiZr}KHy=a%e7&5lcnlJikKycwOF*MW!?X#-I(5!% z!&{XizhmxddA61p;4o&bXvg7Vrn)7uyXSadP5YM=Xw|U?Q>a1JWXRa)__(JCIZ2tK zSBaU4)~DI&DMa@v`gk>JS}Av`>Xy3dnsfOoTO~PbdyBiMSD`oOi2*c&2j#=Dg5x#pvs{4P?{RrlVeL&AE7Pv^Ym!Ns8A!`LTWV~ z(OeIy=GiJVC(fN@PyMu1^DNAiU=z08log)WlXD>^Jy+M8(QLSUO>39I_6!2wQ1MHOM_Nse0brm$w76soV&=GG7iRf7tMKE$ zwe}8Q-sg8ivq`gS?_D(cs=mfQZl3Ra@$R|TUzH5K9ez;7B;9p7RfiyF&|&gZgQFEA z;3m%9CxdSc4Hx2=@C|6h8wO}B7drV*rFct?L*RX z0VW0GWZ7Y7V1hzQu~{(-(x#(~x#gIiZy4VAB9i)%$l{X%o@g6hyRpdOI;d@_UXM<7 c>E)D4DtBgw`Aul0m^iXmBq>J@iC_T$J6`=`-~a#s literal 688 zcmV;h0#E%%Nk%v~VS)f;0Pp|+|Ns90001li0001j0Av6F0{?^&r_0z6<4Us8Ix)K{ zc&{NJ7nUO#ouR6+#tBw1T1qo^%P_vbz5T24T&W-=2V~7+$E9#++&GKK$C6TQ5}(u& z^z&tQ!M?3E%C(@SW_6qGJ-prG^mrBj;>j5y&7Sh~XCnw`c!-#&XtLPo_&AXVIY}wF zR*9L}ajDrkdF2_ZnI&54NNSpzIH%eQIOrNHJL@-UTZgXuXJi_H6xZ=bZ*F{sYccZaFVDS(?~n=T#Nrcl=SWtl&hYGdXPbVaYA!hn1RX0i>ww}x}t+kko!AUtkSSb=0-*K7I5bNshG|=l~ z$eYuCyLS2RYppwXjXnExk<-uDKSg}Gape5*?~gxRLw7V-Ru+4|y;hkd@P&3CZ?L(? z#DccT1z~!nNw|%AX~~w_b3I^K;CJ>tNFpB~X4s&27M3`Sc??P?A~gw0WuS5^*+@u# zIv$bVjhNJ^*Nica2;_^iy{93HLk3tIZs4Ve;F3Yk)FDqvP6;J<@#W@Xh(J22QI|>< WNuQKVW{Kb`J^J_Kj&2%I0027`-%_Ih diff --git a/backend/tests/data/print/pcx/dotcode_aim_fig7.pcx b/backend/tests/data/print/pcx/dotcode_aim_fig7.pcx index 7b6bf7b83b08b3d52142812869ee787b6cca7e92..484311a1c6be8834445547ba16eb4f4b97b0f558 100644 GIT binary patch literal 5201 zcmeHK(MrQG6wMGp{FZ%|Un2h4Hiis0_8=;Px{W=Eiccaw_;5X^NxC#kVp_V=hm~G) z?@iYxIp^fY^V7kZ!gZ-G)Nn8y(64o!T&em$+I>NAO+{53ByL5$7JuR3MkYTwk*Qk3 zwx*>|n+WbEU1Pac3)sfA^l4+k-HWb~%+w8RWm@{Qk>GC9)suN8hS3bl#IN!R7JRZw zVH0gh?X`f4)pi3Oio6IYMFNY#dwxtQCY@ zY8hcphA?f7dGgIqlRT8HD_bMkj?>g25pv~eq?w=Y&vaTrCx-_6&jdNP6!lw_2{19{ zFTkcB7}>NDY~QJH4%U3bxXDAkEr#5bzhHW^E}D4Q;&;7QrKj)p#+KC02XXndb^K9O z%>OW$P}UEk(&4+ogz~)?)nfQoVlq>AqS9fD-}PRVp1#)`TT(Y4#09`%LxyDF#C&pq zm{2ndt(SO6b`cY5X0G+pQmA!eHB+8(v}XM9aKosz8nGpH^FdtncBfCg00?1D#_q

1$%5-AG1QK?uXiVRcm1vL|>EScp5*R#@*6@YSD}s zL5^vbf@8Shr$eg+4u@ur8r)&hDJxqRDw;WVaECcis=Af1IF;MU?w`0&s{5ffUez>M IUT+ZnKa7Xv4*&oF literal 4856 zcmd5<+fKtU49$d)5Z|)D;!EJqHa4NLjXfYhNU#fg;3D1-;(-U_)6{K3(kx56Zq?k_ zr?yK0=4|Y5!M7YD^=wV8JNT%k_AC|0}7UK}yW3pNZv=?>^#VfKzdPAw{$# zdss5nh~|vj2 z{(@qVHfNaT!}u7v@lDv$2s2R^B)nyPh(RU4%xX~9hj!4|ovZJ@LzsX4C?tg5<&Wl` z{{NFTcdie9OSlb!Ky;f2fkKF6A4mbwEg$uvc|@uK8Utip)Q1q#<_yz(7#|}yzJG5^ By{iBK diff --git a/backend/tests/data/print/png/dotcode_aim_fig7.png b/backend/tests/data/print/png/dotcode_aim_fig7.png index 3a38e2945bf6298672cd020bbec17b5915cacf26..d30531230fe613a35a880921218dcaacfb382cbc 100644 GIT binary patch literal 682 zcmV;b0#*HqP)=bV zxt{blqB|l{XI`gEb`tAi|GTUIPd%bLH!Sv?d690ryw_TL{5y{54%Up2Gtbp+U~Ey0 zt%-yy$c~tZLg2)N1Omqsh@>Z?5ICMtLEv}-5%xqB0;h|WL*RG<8Ou(NTy&IOMIPG` zfhXj#9T7M@HuAMjIC9ZZc6E7dM+6R!jdXOej$Cw~E55rM;FBfl`VCK7f;(YI}N z#)Kmm?KS;=Jo{_t2Z!DCJ6)_#op9u$9jD)ad%}^6cAS1EJ6UzHj$E|e^n1J8+u0#O zm+5yfwkO6039qvo9~0H~z(r%C+8#JvEOjCs5?*IF(i7G8z{yTzr;JE=om~}VS8Wd* zjGZMrRhuN=d1iGUyAFRY&10A1&*@@)>O{3k@~AWG^4Qh*bF!0F7h7$TJmkzCJaz^C z9E`1+o!E;GgB{lU*qJzR<9+O895`L9Qk`HgTH*V;?qlcUz{yTxT`YUi;ompIK6VZc z9E`1su|dL7c6adDOoLC036L=R*whJ-@OHavd2FV^$xcbTSdeh4eQc(|XLdA;tEdSE!dH`w*yu`8f=Ft&>P0f*5W@y$^c QX#fBK07*qoM6N<$g5D`hbN~PV literal 682 zcmV;b0#*HqP)ER2mC5J@*=VQdmsEsTvDkh?)CD~EBkJ6CrC7ww3#cjKZRF*aN@ za^RsG_$xXt7v!&$6z z)ccK1p?@swYSc+s9qtB4K6zx#SRO`nkVdZYv2;xFer$pgL1{0n8)sJnzE$hT21WY^rE2xw zE7vT|Mc3iLb-CzL95@N9!`-kSUe#Q)C>LFg11Bh%B&^lyy;Ig~z(rT!z(LV^L5cq4 zG?z$4N3f$W^^xaaNkCo4QJK}jZIr9V0SdF}h6_u#QX z(RwHvtea&woQtMrd(LS9>(Up^-SBlIMAuzc diff --git a/backend/tests/data/print/svg/dotcode_aim_fig7.svg b/backend/tests/data/print/svg/dotcode_aim_fig7.svg index 7966d67c..228f4396 100644 --- a/backend/tests/data/print/svg/dotcode_aim_fig7.svg +++ b/backend/tests/data/print/svg/dotcode_aim_fig7.svg @@ -8,44 +8,44 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backend/tests/data/print/tif/dotcode_aim_fig7.tif b/backend/tests/data/print/tif/dotcode_aim_fig7.tif index 74f4dcc271938c8bd04fd11f1780cec670e82d48..a668466ecb85a1e60f07a24b61b319818eb531e3 100644 GIT binary patch delta 1246 zcmcgqL2DC16rM?JYaqc?HmNiaBBZT`N`v4-1m+CJFc=I5BGqc;S@$O-nw{O1r-uvG74tISo-~0OK z=Tj`&5cd||ax#~@v>GbaaxqF|yOc=1rtm<7S}WhwdE|da>5FH`tbBL=pVCAiLT2BX z2#*Z%&C@aDlVT!J2iGy^xkJ{ZyURZ%zc3embE<9x#CFKy)S7OSY3wOVb8a88?TL3N zJc1X7!97VYV9z1g*R-bbv6izzGU-a`aQ*Ab>CF5kN2Et9oYJEOr9lMC4UW_!DDd^u z$=hb_`ku>*N(Xpy%|?kf%G*$A*V1v>p{QQD&nYx;4#7I#ytRd7i8@mSYMq4^jMFS` zf$01RxVnMl+&f7^tyd}94(*85&{ZE$PlUN#<|2_@SMo(`iYt6CDTEm>N&X82nwJ}lCNGgdQ6yVY{Ocd7K;Cj<+ z(TyGO|Fe8Ba2%!bD37tZmbF%TEb}B_*|8=$1g*&f(6)IJi!OOVRl^WJaL&lAM~BOd zG0y#r<1FIyA@<|^+@NYbp6N&UrNLOlfyk>UKc(OX;vvKm^8=V+-ly`v5XYR@*Q9R! j!sMqoW2;k)CGRly^)X|WH;mcH^?onVMiz9k8~6MJ>Qa=6 delta 1271 zcmd5*O=}ZT6n%G+N@8Q8&}cCvPF>YfFbkmwfd&!Nb`j#DhD0MnYo(%#LHx){jcroB&B0wuO%1<{9 diff --git a/backend/tests/test_2of5.c b/backend/tests/test_2of5.c index 8174a101..433bbdec 100644 --- a/backend/tests/test_2of5.c +++ b/backend/tests/test_2of5.c @@ -282,7 +282,7 @@ static void test_encode(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, -1, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, -1, -1, -1, debug)) { ret = testUtilBwipp(i, symbol, -1, -1, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); diff --git a/backend/tests/test_auspost.c b/backend/tests/test_auspost.c index d2298893..1025322f 100644 --- a/backend/tests/test_auspost.c +++ b/backend/tests/test_auspost.c @@ -282,7 +282,7 @@ static void test_encode(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, -1, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, -1, -1, -1, debug)) { ret = testUtilBwipp(i, symbol, -1, -1, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); diff --git a/backend/tests/test_aztec.c b/backend/tests/test_aztec.c index 073b7fb1..ab69ef15 100644 --- a/backend/tests/test_aztec.c +++ b/backend/tests/test_aztec.c @@ -31,7 +31,7 @@ #include "testcommon.h" -static void test_encode(int index, int generate, int debug) { +static void test_options(int index, int debug) { testStart(""); @@ -39,6 +39,7 @@ static void test_encode(int index, int generate, int debug) { struct item { int symbology; int input_mode; + int output_options; int option_1; int option_2; char *data; @@ -46,11 +47,67 @@ static void test_encode(int index, int generate, int debug) { int expected_rows; int expected_width; + }; + // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) + struct item data[] = { + /* 0*/ { BARCODE_AZTEC, -1, -1, -1, -1, "1234567890", 0, 15, 15 }, + /* 1*/ { BARCODE_AZTEC, -1, -1, 4, -1, "1234567890", 0, 19, 19 }, + /* 2*/ { BARCODE_AZTEC, -1, -1, 5, -1, "1234567890", ZINT_WARN_INVALID_OPTION, 15, 15 }, + /* 3*/ { BARCODE_AZTEC, -1, -1, -1, 36, "1234567890", 0, 151, 151 }, + /* 4*/ { BARCODE_AZTEC, -1, -1, -1, 37, "1234567890", ZINT_ERROR_INVALID_OPTION, -1, -1 }, + /* 5*/ { BARCODE_AZTEC, GS1_MODE, READER_INIT, -1, -1, "[91]A", ZINT_ERROR_INVALID_OPTION, -1, -1 }, + }; + int data_size = ARRAY_SIZE(data); + + for (int i = 0; i < data_size; i++) { + + if (index != -1 && i != index) continue; + + struct zint_symbol *symbol = ZBarcode_Create(); + assert_nonnull(symbol, "Symbol not created\n"); + + int length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, data[i].option_1, data[i].option_2, -1, data[i].output_options, data[i].data, -1, debug); + + ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length); + assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); + + if (ret < ZINT_ERROR) { + assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, symbol->errtxt); + assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, symbol->errtxt); + } + + ZBarcode_Delete(symbol); + } + + testFinish(); +} + +static void test_encode(int index, int generate, int debug) { + + testStart(""); + + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + + int ret; + struct item { + int symbology; + int input_mode; + int eci; + int output_options; + int option_1; + int option_2; + char *data; + int length; + int ret; + + int expected_rows; + int expected_width; + int bwipp_cmp; char *comment; char *expected; }; struct item data[] = { - /* 0*/ { BARCODE_AZTEC, UNICODE_MODE, -1, -1, "123456789012", 0, 15, 15, "ISO/IEC 24778:2008 Figure 1 (left)", + /* 0*/ { BARCODE_AZTEC, UNICODE_MODE, -1, -1, -1, -1, "123456789012", -1, 0, 15, 15, 1, "ISO/IEC 24778:2008 Figure 1 (left)", "000111000011100" "110111001110010" "111100001000100" @@ -67,7 +124,7 @@ static void test_encode(int index, int generate, int debug) { "101011110101010" "100010001000101" }, - /* 1*/ { BARCODE_AZTEC, UNICODE_MODE, -1, -1, "Aztec Code is a public domain 2D matrix barcode symbology of nominally square symbols built on a square grid with a distinctive square bullseye pattern at their center.", 0, 41, 41, "ISO/IEC 24778:2008 Figure 1 (right) NOTE: Not the same but down to single encoding mode difference (UPPER space rather than LOWER space after 2D)", + /* 1*/ { BARCODE_AZTEC, UNICODE_MODE, -1, -1, -1, -1, "Aztec Code is a public domain 2D matrix barcode symbology of nominally square symbols built on a square grid with a distinctive square bullseye pattern at their center.", -1, 0, 41, 41, 0, "ISO/IEC 24778:2008 Figure 1 (right) NOTE: Not the same but down to single encoding mode difference (UPPER space rather than LOWER space after 2D); BWIPP same encodation as figure", "00001100110010010010111000010100001011000" "01000110010110110001000000100101101000001" "01011100101011001110101100000001100011001" @@ -110,7 +167,7 @@ static void test_encode(int index, int generate, int debug) { "00010010010011001011011010000110001000101" "10001000001010100110100000001001001110000" }, - /* 2*/ { BARCODE_AZTEC, UNICODE_MODE, -1, -1, "Code 2D!", 0, 15, 15, "ISO/IEC 24778:2008 Figure G.2", + /* 2*/ { BARCODE_AZTEC, UNICODE_MODE, -1, -1, -1, -1, "Code 2D!", -1, 0, 15, 15, 1, "ISO/IEC 24778:2008 Figure G.2", "000110001100000" "000000110000010" "101100001000101" @@ -127,7 +184,7 @@ static void test_encode(int index, int generate, int debug) { "011000011011010" "111001101100000" }, - /* 3*/ { BARCODE_AZTEC, UNICODE_MODE, -1, 1, "Code 2D!", 0, 15, 15, "ISO/IEC 24778:2008 Figure G.2; specify size", + /* 3*/ { BARCODE_AZTEC, UNICODE_MODE, -1, -1, -1, 1, "Code 2D!", -1, 0, 15, 15, 1, "ISO/IEC 24778:2008 Figure G.2; specify size", "000110001100000" "000000110000010" "101100001000101" @@ -144,7 +201,7 @@ static void test_encode(int index, int generate, int debug) { "011000011011010" "111001101100000" }, - /* 4*/ { BARCODE_AZTEC, UNICODE_MODE, -1, -1, "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", 0, 53, 53, "**NOT SAME** ISO/IEC 24778:2008 Figure I.1 (left) TODO: investigate", + /* 4*/ { BARCODE_AZTEC, UNICODE_MODE, -1, -1, -1, -1, "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111\015\012", -1, 0, 53, 53, 0, "ISO/IEC 24778:2008 Figure I.1 (left) (note CRLF at end!), same; BWIPP different encodation (doesn't use P/S CRLF)", "00010101011010101010101010110101010101010110101010101" "00101010100101010101010101001010101010101001010101010" "11100101011010101010101010110101010101010110101010110" @@ -156,37 +213,37 @@ static void test_encode(int index, int generate, int debug) { "10101010101010101010101010110101010101010110110101010" "01010101010101010101010101001010101010101001001010101" "10101010101010101010101010101010101010101010101010101" - "10101010100101111100100010001100110110010001010101010" - "01010101011011100000011011111100100111010010101010101" - "10101010100101000000011011011101100100000101010101010" - "01010101011010110110100001100000100100100010101010101" - "10101010100111101100101000001111010001001001010101010" - "01010101011110000110010111110110001101010010101010101" - "10101010100111001001110011011111100001000101010101010" - "01010101011110101000100001101101111001000010101010101" - "10101010100010011011101000000010011011000101010101010" - "01010101011010000001111111111111110100110110101010101" - "10101010100110000001100000000000110000010001010101010" - "01010101011000001000101111111110100001100110101010101" - "10101010100011000011101000000010101100001001010101010" - "01010101011101111101101011111010101000011010101010101" - "10101010100001100111101010001010101010110001010101010" + "10101010100101010100000010000100011110011001010101010" + "01010101011010010011110110111000110101111010101010101" + "10101010100100011100001111011001101011001101010101010" + "01010101011011001111111011100110111001001010101010101" + "10101010100101001000001100001111011001011101010101010" + "01010101011001100000011100110001110001100010101010101" + "10101010100001100100101000011101101100111001010101010" + "01010101011001000110001101100101011101111110101010101" + "10101010100101001101101000000010011100011001010101010" + "01010101011111010101111111111111110111010110101010101" + "10101010100110110101100000000000111000100001010101010" + "01010101011110111010101111111110101101000110101010101" + "10101010100010011000101000000010100100000101010101010" + "01010101011111010010101011111010101011110010101010101" + "10101010100000010001101010001010101011010001010101010" "10101010101010101010101010101010101010101010101010101" - "01010101010001101100101010001010100110010100101010101" - "10101010101101100011101011111010110001100011010101010" - "01010101010010110110101000000010100110110100101010101" - "10101010101111000100101111111110111110000011010101010" - "01010101010110011110100000000000110001100000101010101" - "10101010101011001000111111111111110100001111010101010" - "01010101010011101000001000001111000110001100101010101" - "10101010101001010100110111101001011010101111010101010" - "01010101010010100011010011000101101111011000101010101" - "10101010101111000100000111111101101110111111010101010" - "01010101010110100110110110000011100010000000101010101" - "10101010101101110111010001101100001000011111010101010" - "01010101010110001101001100010100101010110000101010101" - "10101010101000101001111010110101100111100111010101010" - "01010101010010010000111100011100110101100000101010101" + "01010101010101000111101010001010111100101100101010101" + "10101010101111111001101011111010111101000011010101010" + "01010101010110010001101000000010111100111100101010101" + "10101010101011010100101111111110101010010011010101010" + "01010101010000101110100000000000101111001000101010101" + "10101010101001000000111111111111111110110111010101010" + "01010101010101101100010110000110000111110100101010101" + "10101010101101110101011101100001010010100111010101010" + "01010101010000111001101101011011011010111000101010101" + "10101010101001011011011100100001001001001011010101010" + "01010101010001110110101010000110111100000000101010101" + "10101010101000001110110100101011000011001111010101010" + "01010101010001110010110111010101111111101100101010101" + "10101010101100100010010111110110111100001111010101010" + "01010101010000011101010001000010011111011100101010101" "10101010101010101010101010101010101010101010101010101" "10101010010010101010101010010101010101010101010101010" "01010101101101010101010101101010101010101010101010101" @@ -199,7 +256,7 @@ static void test_encode(int index, int generate, int debug) { "01010101010010101010101010010101010101010100101010110" "10101010101101010101010101101010101010101011010101001" }, - /* 5*/ { BARCODE_AZTEC, UNICODE_MODE, -1, -1, "3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333", 0, 53, 53, "**NOT SAME** ISO/IEC 24778:2008 Figure I.1 (right) TODO: investigate", + /* 5*/ { BARCODE_AZTEC, UNICODE_MODE, -1, -1, -1, -1, "3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333\015\012", -1, 0, 53, 53, 0, "ISO/IEC 24778:2008 Figure I.1 (right) (CRLF at end), same; BWIPP different encodation (doesn't use P/S CRLF)", "00111111111111111111111111111111111111111111111111111" "00000000000000000000000000000000000000000000000000000" "11101111111111111111111111111111111111111111111111101" @@ -211,37 +268,37 @@ static void test_encode(int index, int generate, int debug) { "10101010101111111111111111111111111111111111101010101" "10101010100000000000000000000000000000000000001010101" "10101010101010101010101010101010101010101010101010101" - "10101010100100010001110111001110000101000000101010101" - "10101010101101011100101111110011101011101010101010101" - "10101010100100111100011011000001110011010000101010101" - "10101010101100110110001101111010001010101010101010101" - "10101010100110111110011111000100011001111100101010101" - "10101010101110110100111001111011110011111110101010101" - "10101010100110011110100000010101000011010000101010101" - "10101010101011001010101110101110001010011110101010101" - "10101010100110010101101000000010010101100000101010101" - "10101010101101111111111111111111111010111110101010101" - "10101010100111110111100000000000110001101000101010101" - "10101010101101101100101111111110100000000110101010101" - "10101010100101100001101000000010101110011000101010101" - "10101010101100110101101011111010101001000010101010101" - "10101010100001100111101010001010101100100000101010101" + "10101010100100101111110001000100101100100000101010101" + "10101010101101111101110010111000101000111010101010101" + "10101010100101100101101111010110010110001000101010101" + "10101010101101110110011100100101011101001110101010101" + "10101010100100101010001101001001101000011100101010101" + "10101010101000101001010110111111111000100110101010101" + "10101010100000101001101101000111100001001100101010101" + "10101010101001011101100000110001101011000010101010101" + "10101010100100000111101000000010010100011100101010101" + "10101010101111001011111111111111111011111110101010101" + "10101010100110110111100000000000111101001100101010101" + "10101010101111001010101111111110100000100110101010101" + "10101010100001001000101000000010101010000000101010101" + "10101010101100110010101011111010100101111110101010101" + "10101010100010111111101010001010100001100000101010101" "10101010101010101010101010101010101010101010101010101" - "10101010100000111110101010001010100010011000101010101" - "10101010101011011101101011111010111011110110101010101" - "10101010100100010000101000000010101001010000101010101" - "10101010101011010100101111111110110110000010101010101" - "10101010100011111000100000000000110110101000101010101" - "10101010101101000110111111111111111100100010101010101" - "10101010100100100000001000001111000100010100101010101" - "10101010101000111110011001100110101101100110101010101" - "10101010100101100010110011011100001010110100101010101" - "10101010101101111011000111100110101010011110101010101" - "10101010100001101011111001001000010001001000101010101" - "10101010101010100111010011111110000111100010101010101" - "10101010100000001011111101010011011010000000101010101" - "10101010101100100000011011100010000000101010101010101" - "10101010100001101101001111001100000001000100101010101" + "10101010100111000101101010001010111101001100101010101" + "10101010101001000011101011111010110001011010101010101" + "10101010100111011011101000000010111000000100101010101" + "10101010101011100110101111111110100100011110101010101" + "10101010100001010110100000000000100011100100101010101" + "10101010101110101100111111111111110011110010101010101" + "10101010100100000010010110000110000110001100101010101" + "10101010101110101100110100111110100111001110101010101" + "10101010100100011000111110000001100011101000101010101" + "10101010101010100111001011111011100101111110101010101" + "10101010100011101001111001000100101000111100101010101" + "10101010101101100101110101110101101010110010101010101" + "10101010100101000101110100010000011101011100101010101" + "10101010101000110100111011110110000101000010101010101" + "10101010100101010001100000001011100001110000101010101" "10101010101010101010101010101010101010101010101010101" "10101010000000000000000000000000000000000000101010101" "10101010111111111111111111111111111111111110101010101" @@ -254,7 +311,7 @@ static void test_encode(int index, int generate, int debug) { "00000000000000000000000000000000000000000000000000001" "11111111111111111111111111111111111111111111111111101" }, - /* 6*/ { BARCODE_AZTEC, GS1_MODE, -1, -1, "[01]03453120000011[17]120508[10]ABCD1234[410]9501101020917", 0, 23, 23, "#189 Follow embedded FLG(n) with FLG(0)", + /* 6*/ { BARCODE_AZTEC, GS1_MODE, -1, -1, -1, -1, "[01]03453120000011[17]120508[10]ABCD1234[410]9501101020917", -1, 0, 23, 23, 1, "#189 Follow embedded FLG(n) with FLG(0)", "00100000101111000100100" "00011101100110001010000" "00000111000111101011011" @@ -279,7 +336,7 @@ static void test_encode(int index, int generate, int debug) { "00010001010101010101011" "11101100000000000010110" }, - /* 7*/ { BARCODE_AZTEC, GS1_MODE, -1, -1, "[01]95012345678903[3103]000123", 0, 19, 19, "#189 Follow embedded FLG(n) with FLG(0)", + /* 7*/ { BARCODE_AZTEC, GS1_MODE, -1, -1, -1, -1, "[01]95012345678903[3103]000123", -1, 0, 19, 19, 1, "#189 Follow embedded FLG(n) with FLG(0)", "0000000100001010101" "0001101111011000000" "0111100100010110100" @@ -300,7 +357,7 @@ static void test_encode(int index, int generate, int debug) { "1000110111011000101" "1010100000101101001" }, - /* 8*/ { BARCODE_AZTEC, GS1_MODE, -1, -1, "[01]04610044273252[21]LRFX)k\\R06\\G+/ACMRN123456/V2009121908334\\R\\E", -1, 0, 23, 23, 0, "HIBC/PAS Section 2.2 Patient Id Macro **NOT SAME** different encodation, Zint 1 codeword longer; BWIPP same as figure", + "11010110110000110111011" + "10111111001000110100000" + "11000001011011010011010" + "11001101001101000001100" + "10101000100101011100111" + "11000010111111111010111" + "01101111100111001101011" + "10101011111111111011111" + "11110111000000011110001" + "10000001011111011111110" + "11111001010001010111101" + "00011001010101010001001" + "11000111010001011011111" + "11000111011111010100100" + "11110101000000011010001" + "10100001111111111001000" + "11111000111101100110101" + "01001101000000011001000" + "10100101111001101010001" + "01001111101010100001111" + "01110000011111101011111" + "11110110111110011000100" + "10110000010101011110010" + }, + /* 12*/ { BARCODE_HIBC_AZTEC, UNICODE_MODE, -1, -1, 3, -1, "/EO523201", -1, 0, 19, 19, 1, "HIBC/PAS Section 2.2 Purchase Order, same", + "0011100011001101111" + "0010011001010110110" + "0110100100101000000" + "1001111000110011001" + "0011110100101011001" + "0001111111111110101" + "0001010000000100100" + "0001010111110101000" + "1000010100010100011" + "1001010101010111001" + "0000010100010110100" + "0111010111110111101" + "1000110000000101001" + "1001011111111111010" + "0010000000111001101" + "0110010000010110011" + "1110001000101101001" + "0111011100001111101" + "1010000000101001001" + }, + /* 13*/ { BARCODE_HIBC_AZTEC, UNICODE_MODE, -1, -1, -1, -1, "/KN12345", -1, 0, 19, 19, 1, "HIBC/PAS Section 2.2 Asset Tag, same", + "0011111101100100110" + "0010011100111110101" + "0111110010101101110" + "1000010111011000001" + "0001110100101010001" + "0010111111111110110" + "0001110000000111110" + "0000010111110110011" + "1010010100010100000" + "1011010101010100101" + "0010010100010100100" + "1101110111110110110" + "0011110000000110110" + "0100011111111110100" + "1110000011111000011" + "1100001111010010010" + "1100001101001110001" + "0010000010110001111" + "1001101110111100011" + }, + /* 14*/ { BARCODE_HIBC_AZTEC, UNICODE_MODE, -1, -1, -1, -1, "A123ABCDEFGHI1234567891/$$420020216LOT123456789012345/SXYZ456789012345678/16D20130202", -1, 0, 27, 27, 1, "IDAutomation example, same", + "001010100100100010000010110" + "000110110110001000101000100" + "010010001101110110001000110" + "000110101101000001010111100" + "000101110011011000111100000" + "000100110000110111011011010" + "011100000100000111111000001" + "011101111110011100111011100" + "110001001111110110101101100" + "100100001111111111100110000" + "001000101100000001011001101" + "111011010101111101111010001" + "010010101101000101001101100" + "001000110101010101010011100" + "011011001101000101010011111" + "011111010101111101000100100" + "110000011100000001001111011" + "101110110111111111111001001" + "001110110000000110000001101" + "010010001010001000001011001" + "000100111010110100000100110" + "000010100010001000000111001" + "111100011100100010001100100" + "001110101000001010011010101" + "100001000110111011000010111" + "011010111000111110011011110" + "000010010001000011010000001" + }, + /* 15*/ { BARCODE_AZTEC, DATA_MODE, -1, -1, -1, -1, "\377\000\000\377\300\000\017\377\376\217\300\017", 12, 0, 19, 19, 1, "6 bit words", + "1101000001111000001" + "1101011000011100000" + "1000001010001001001" + "0110011100001000011" + "1001110101001011011" + "0111111111111110100" + "1111010000000110101" + "1110110111110100001" + "1010010100010101001" + "1110010101010111111" + "0001110100010101011" + "0000010111110101101" + "0011010000000110011" + "0011011111111110011" + "0110000011010001001" + "0010101001100111111" + "0001000100011100011" + "1011110000001001011" + "0011111100000000010" + }, + /* 16*/ { BARCODE_AZTEC, DATA_MODE, -1, -1, -1, 3, "\377\377\377\377\377\000\000\000\000\377\377\377\000\000\377\377\377\377\000\000\000\000\000", 23, 0, 23, 23, 1, "8 bit words", + "11111111111111111100000" + "11011101110111011110001" + "11110110111011010101100" + "01111000111100011111100" + "11000101111110011010100" + "11001111001011001100000" + "11000111100110101001011" + "10001111111111111100111" + "11000111000000011111011" + "11010111011111010001101" + "11000011010001011010111" + "10000101010101011000011" + "11001011010001010001011" + "11011011011111011101001" + "11001111000000011010011" + "10001001111111111111011" + "11001100000000000000111" + "11011011001100000010011" + "11000011001011110101011" + "10001000111111011110000" + "11000000001110101011000" + "11011100001000100010010" + "11111110000000000000000" + }, + /* 17*/ { BARCODE_AZTEC, DATA_MODE, -1, -1, -1, 13, "\000\000\000\377\377\000\000\000\000\377\377\377\377\000\377\377\377\377\000\000\377\000\000", 23, 0, 53, 53, 1, "10 bit words", + "00011010011110010011110101110010000000111111010101001" + "00000010100101010010001000010100000010101101001111110" + "11101010001110100001111100110101111010110110110001010" + "11000010110001100001000100010011110110001001110110011" + "11101001111011111001010000100101101011101010101000100" + "01110000100100011010101111011100111000100001000011011" + "11001000001101011010001111100001101111000011010001110" + "00001110000100111010100000000110101111011101001101001" + "00101001111001011001001000110011011001110011110010111" + "00001110100001001111111111001011001010001101001101111" + "10101010101010101010101010101010101010101010101010101" + "00010011000110111100001100011010011010101101000001000" + "01110111011000100011111111111111010100110010010100110" + "00011101100100100001111111000100111100010101101010011" + "00010100011010010011101101101001100101111110110010011" + "00110110000001100111111101001111100011110101011110000" + "00111110111111001011010000100001100001101010001101110" + "01010011000110100110101111000100000010000000000111110" + "00011001011011101101110111100010000100010011111011110" + "00011010000111001001101000000000010100110001000111010" + "00000100001011100111111111111111111000010010001010101" + "11110000100101010111100000000000100000101101001011100" + "11100011101111001100101111111110111111010110000001111" + "11000000010100001101101000000010100100010000101010110" + "11011000001010101011101011111010110100101011100111110" + "11101111100010111000101010001010101011011001010101001" + "10101010101010101010101010101010101010101010101010101" + "11000100000110100000101010001010101100101000011000011" + "10110100011010000110101011111010100100100111000101100" + "11000001010101000101101000000010111010100100000101001" + "10110111011110011110101111111110110011001110000001100" + "00000111100110110001100000000000111000101101111011111" + "00100101001001100110111111111111110110100111011101000" + "00001100110000110010001101011000001100110001110010010" + "00001010111110011011011100110001001110011110100100100" + "00111111000010000111110111010111101010101101000100010" + "00110100101110101000101110100101010110101111001010100" + "00100100000010111111001101001100000011110001111100101" + "01011111101101001110100101101000000111101110110111001" + "00001111000100101010011111001100011101011100010011010" + "00001011111001000011100001100001000001111011010101111" + "00000101010011100101010000010010000010011001111101011" + "10101010101010101010101010101010101010101010101010101" + "00000011000011110011111000001000000110011100110110010" + "01100110111101101010001110101001111111000111011110000" + "00010110000111101110001011011110001100100100000001000" + "00110110011101001010011110111110111101010110001011100" + "00100010010011101001001010000101011011011101011100010" + "01101001101111101010010000110100110011000111011010000" + "11110001000011110111001100010011011001010001110101000" + "11011000101001001101101111100111101001010110111011100" + "11101111010111010000111101011101111011000000001011100" + "11111111111111110000111111111111111111100010000011111" + }, + /* 18*/ { BARCODE_AZTEC, DATA_MODE, -1, -1, -1, 27, "\377\377\377\000\000\377\377\377\377\000\000\000\000\377\000\000\000\000\377\377\000\377\377\377\000\000\000", 27, 0, 113, 113, 1, "12 bit words", + "11111010101001000010110010110110001010111011100001100010111010111011011110010101111001111110001101011111100000011" + "11111001010001010111110100101000101000010110010011001000011010011001111000010101011110010001110101100110011001100" + "11101100111000011000000011000001001001111001111110000001110100001110010010001100100011101110000011010101101011011" + "10110010001100011001110101101111111010100000010000011010011100111110010000000111011110010111110001010010000011001" + "11101111110100000110110011100000101100011010001010011100110001010111001110011001100010101101000101001000110110110" + "11000001000111110000011001001100110001010000000001010111000100101100100000011011001001000111011001101101001111101" + "11011101101011110011011110111101101101001100010010101010100001111111100110011101010100011100110111111101101100000" + "11011110000101110011110000101111100111100101011010100010011000011100010001111000100110100101011011001101011001101" + "10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101" + "11101110000011011000110000100100010110100010110101111111000011111011010101010011000101000110111111111011001101111" + "11010011100011001101011011110000010100011001100100111111111110001010111110000000001111001110000001111011110100101" + "11110101011101110000011001000111000101000011000110111011000110110011100100000111101100000011000100001010011111001" + "10111001111000101000101111110101001000001000001100011100111001011010001110110000101011001001111001100011101001010" + "11101000001010100010000000100110101011010100010000110101010111111011000101110100001101110110010101010101011010000" + "11101110101000010010010111101100100110111000111001011010110110010001111010010011011100001001011101110010110111111" + "11101110001111110110010000110111101100010000111100110111000110111101101001111001101010010100011010001001001110001" + "11111000100110000011010110111010101001001011001101111000110110001011000110100000100100001111000000000100101010001" + "11001110001110100010000001100110100001100010001110001011000100111100111101100000011101000001010110101111010011001" + "10100001101001100010010010110010111001101000010101110110111010000111100110000001110111111000110001000110100100101" + "00111101011000111111010101011111111011000000001110101111011101110111100100011111001100110000110000011001010001100" + "00000011111100000101111110100000010010101000000011011011111110011000100010011000010100011001010101001000101100001" + "00000010011110111000110101001101011101010011011111011111010110100000111000100001110010110001110111110101001100011" + "00100101101010111011111011011011100110011100100111100111101011010011100010100110101011001111111010100111111011111" + "00100001011101110100100001001101011101010111100001000100001000110111111100010011110001010000100001110001000001111" + "10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101" + "01101111010111101011110101110001010000100011000111100011010110111101011101000001001011110111110101100000001010101" + "00011110100001100110001010110011001011011110110110110000101100100110100110001111111011111111010100111000101101111" + "00001100001111101101101000011101111101100100001011000001001000010111101100100011101101110001010010111001001111111" + "01001010110111011110001110101011101100111110100101100000101001111101010011001111110101011110101011100001100010001" + "11111110010100000110111001001010100011010100110101011101001000111010100100010011011111000100001100000000001100100" + "11101010100001010011100010010010100010001000001000110000110110000100011110001101001101111111110011001010101101110" + "11010001000111100010100000111000011111000110011101100001001011010110111001101011111100000000000001010011010111010" + "11001011110110001001101111000111101010011100001011011001101010000000110111111011100011111010100100001110100001001" + "11110111010110000000011100111110101000110110101110001000011011111010001001111000110010110011110110010110001100101" + "11011000101011000111010111110110101000001010001011111000101010110010110011000100100101001100010110100001111111110" + "11001100010000000000101100001110011101100111100110101110000100101010111000100001001000000001011111100100011111011" + "11001000101100010101000010000100110001001101101110100100100111110111011011010111100011101011001001100001110010110" + "10000100001000101100011001011111100110010111111111011011000011011110001100001000101110100100001010010000000001110" + "11001001100000100110010111011101111010111011110011100110110011110110111011011101000001111001100111111100110110010" + "11110100010011101010111101111011100100010001110000100010010100011110001101101100000110100110001010001100000110110" + "10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101" + "11101010011001111101000001000100111100010111100110100011011111100010100100100100101000000000011110011010011111100" + "11011000110000000101010110110011111000111110100100000011100111011010110111101010110000001011111100010110111101101" + "11100100001010010001100001001100000011100000110001000110011110100000001101000000101000000000111111011111001011111" + "10110100101101001001110110110000100011111101000011110010101110001111001010010110100100001001111111101000111111111" + "11110111000000010110101000100110010010110011111011100001001001101110111101001101111001100101111010110110010010110" + "10101010111100101100111010010101101111001101011101100110101000101011110011001001011001011010000111100110110001100" + "00011000010111101000001001100001101110000101000100001100011010111000100100011111001101110010101010100011011000000" + "00000001111010100010111111010011001010011100111010010001110001111100000111000100011011101000011111000011101011111" + "00101011000110101001011000111011011001010100111101110110000000010011101100100011101001110111001101011110000000011" + "00010000101001010000110011111001001110111111011011111111111111110010110110011111010101101110111011111001111001100" + "00000011011110011110000101111111101001000011011010100000000000100100010101010110111110100000000101100011011100101" + "00010111100101101100111111000001100010011011011010101111111110110110100011001010000100111001100001101001100100010" + "00001011011111110001111001100001000111000000010011101000000010100011100100001110000011000100111111010001011011001" + "00110000100100110001100110101011100110111011100001101011111010101111100110111011010000111011011001001110110100001" + "00011001010000110100101000001000011000110011111011101010001010111010101001111011110010000111010001110101011110010" + "10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101" + "01100111001110010110110100001110110000000110011110101010001010110000011001000001000101100010011011100101000111001" + "00101001100010010001111010100101101110111011101000101011111010100001011110110000010010101100110011011010111001101" + "00000100001011011100011101111011101110110010010100101000000010111010010100110110101110110000100010101100001011011" + "00110010111110000001110111010110010101101101000000101111111110111000110111100000001111001011010001000110101010110" + "00100101010110001001011100111010111001110110111111100000000000110010011000111011101110000010100011011001000001001" + "00000000111101111101111110111000101000011111000100111111111111110100010011100110010001101011001100111011110101110" + "01011111001111001111101001100010110011000001010110011110010001000110101001101111110100000000111100001101010010000" + "01110001111101111010111011100110010011101111011111100000100101001111010111111101100111001100101001111000100011011" + "11101100000100010100011100001011011101010101101101001010000101001111100101101100001100110101001010100000010000011" + "11001111110100111000110111111000110001001111110000010111101010000000010011100111010011111000101111100000101111101" + "11111011011110101010100101110100001011110000000000010001011011001111000101010000001100000111100001100110001100101" + "10001111111110011011110011111110001110011000010011101000101000011100111010000101111110001110011110001101100001101" + "00001100001010000010100001011101011100110010110010001000010010011101011001110011011001110001100111101110001001001" + "00100110110000000101000010110101010001001110101110000010110110101111001010011011110111101011101010011000110010000" + "00011111000011010010101000010001110010100110101010010101000010101111100100010010111010110000010011111100011000100" + "10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101" + "00100110010000010110110100011110100001000011011000110110001011000011011101101011101010100101110110101111010010101" + "00001100100010111111111011011000100110101110110010000111100110001100111110001110101100101100001011001101100100100" + "00000100000110001111010000100000100011010000011111111010011011110000111000011110001000010101100001100001010010110" + "01010011111111111100001010101100001010111101001111100010111110010000101010100000011100101001110011011110101011101" + "00100110001010001111011101101111100000000000001101010011010111010100100000010011101011100101111001111101011100101" + "00111011100011001100100011001110001011111010000101101001100110001110111010111110000101111100011110010110101110100" + "00011000001101000110001001000010010101010111011101100101010000000101100000010001111001010101100101100011001000110" + "00101001111001011010110111010101001010101111111011010111100111001100010010010001101010111000100111000110111101110" + "00001000011101110110110101111110100010100100011110000111010100000100010100101111010101110101001111000101001110010" + "01010111110111001101011110101101001110001011010011011111100000100011101010101110111101001111110001100010111001011" + "00000111000100111011101101010100001100100110010110010010011000111000010000011100000110100010000100001011011011010" + "00001101101110011111110010000111100110111100101011011110111111010101111111000000111110011011110000010111101100000" + "00010010001110011111110101110000001100010001111001101111000000101000000001010001100111100001101100010010010111110" + "01110011101110110110110011011101110100001010010110100110110011101011100011001111011110111110101111011101110010001" + "11111010000100110111101100110110111010110011110111110010000010011000011101111101001101100100111000110001011110001" + "10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101" + "11010010010101011110111001111011101100010101010111000000011011011111101100010000000100000011100111000011010101101" + "11001111111111001010101010000001010001011100101100110110100110111010101011101111100100011011100110110101101010011" + "11110011000011100100010001101001000101000010111111010101001110110000010000000001000101010101100111010110011101100" + "11100101100001000110100111011001011000001100010001100110101111110110101111100101010001001100110011010101101001110" + "11111001000100001001110100011001001110010011001100000000011111000110010000010100001011010010100010111111000100001" + "11001100111001110001010011110110011110101010100001111011111010111011011011010010110010101000001111000100111100110" + "10010100001100111111100101101000111001110111010011011110000000110111001101100010110110100001111011001011011000100" + "00111010100010111011001111110001000000101010011111111111100000100101110110101010011101111010110100100001100001100" + "00110001010001110111011100011011110111110110100010000100011011110100000000100000101000000010010100011101010100100" + "00101000100110010001111010000110100101011000011111101110110000100111100011000110000010011011111100100010110011000" + "00000101001010101000010101000110010110110101000100100110011010100101110000110100100111010100111100100100011110111" + "11011100101011111001110111001000101111001001101101010111101101011110110011110110001110011001001000010010110001101" + "11000010011001001000100101001100111011000101100000111110011011110011100101000010101011000000110000100101011010000" + "11000001111010110010111011110100100100101100111101111100111010000011110010011001111110101100101000001000100110010" + "11110111000001001010010000001000101101110101001110110011011011011010010101111110000000000111001111010010011000111" + "10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101" + "11000011011111001011001101010001011100100111010000101011000101111101101101000101110101110110010011100011001101100" + "11001000101111010000101011101000011011001010110010101000100011110101111111000001000110001101100001001110111100101" + "11101110000100001111001001001101100111000010011100011111001010100010101000011110000111000010101001100010010001111" + "10000001111010110010110010001111101001111011011100110001111111001011010010100000001011001111010010101100111010111" + "11110101011110010111100001100001000000010111111010101111000001100011111101110001000001000001100000100110000001011" + "11101101100010110000110110001100111001001101000101110001101010000111011110000001111001011010110100011101110011100" + "11000000001000001011101101101101101001100000101000000000010111000000100101000110010000110010000011000101011111000" + "11100000100000001110111110110000111110011100000010001110101010101111000011001011111001101101010010001011111011101" + }, + /* 19*/ { BARCODE_AZTEC, UNICODE_MODE, -1, READER_INIT, -1, -1, "A", -1, 0, 15, 15, 1, "", + "000011000111101" + "001110010011000" + "011100100000100" + "011111111111110" + "101100000001010" + "110101111101100" + "111101000101010" + "100101010101000" + "100101000101111" + "100101111101101" + "000100000001010" + "100111111111100" + "100011001110001" + "110110000101100" + "010001010010110" + }, + /* 20*/ { BARCODE_AZTEC, DATA_MODE, 3, -1, -1, -1, "\101\300", -1, 0, 15, 15, 1, "AÀ", + "000000101011100" + "000100010100111" + "001100000110110" + "011111111111111" + "001100000001100" + "001101111101000" + "011101000101110" + "000101010101011" + "100101000101010" + "101101111101111" + "101100000001111" + "000111111111111" + "100011000110001" + "110001000111110" + "111001100011011" + }, + /* 21*/ { BARCODE_AZTEC, UNICODE_MODE, 26, -1, -1, -1, "AÀ", -1, 0, 15, 15, 1, "AÀ", + "001111011000101" + "000110100011000" + "001100001000111" + "011111111111111" + "001100000001101" + "000101111101100" + "010101000101101" + "011101010101001" + "001101000101001" + "100101111101001" + "010100000001011" + "000111111111111" + "000001100010010" + "001100010010010" + "011110110011000" + }, + /* 22*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, -1, -1, "0", -1, 0, 11, 11, 1, "ISO/IEC 24778:2008 Figure A.1 (1st)", "11101010101" "11111111111" "01000000010" @@ -381,7 +822,7 @@ static void test_encode(int index, int generate, int debug) { "01111111111" "00101010100" }, - /* 11*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, "25", 0, 11, 11, "ISO/IEC 24778:2008 Figure A.1 (2nd)", + /* 23*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, -1, -1, "25", -1, 0, 11, 11, 1, "ISO/IEC 24778:2008 Figure A.1 (2nd)", "11101100101" "11111111111" "01000000011" @@ -394,7 +835,7 @@ static void test_encode(int index, int generate, int debug) { "01111111111" "00100100000" }, - /* 12*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, "125", 0, 11, 11, "ISO/IEC 24778:2008 Figure A.1 (3rd)", + /* 24*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, -1, -1, "125", -1, 0, 11, 11, 1, "ISO/IEC 24778:2008 Figure A.1 (3rd)", "11110101101" "11111111111" "11000000011" @@ -407,8 +848,8 @@ static void test_encode(int index, int generate, int debug) { "01111111111" "00111101000" }, - /* 13*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, "255", 0, 11, 11, "ISO/IEC 24778:2008 Figure A.1 (4th)", - "11110101001" + /* 25*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, -1, -1, "255", -1, 0, 11, 11, 1, "ISO/IEC 24778:2008 Figure A.1 (4th)", + "11010101001" "11111111111" "01000000011" "11011111011" @@ -420,10 +861,181 @@ static void test_encode(int index, int generate, int debug) { "01111111111" "00110011100" }, + /* 26*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, -1, -1, "1", -1, 0, 11, 11, 1, "", + "11101010101" + "11111111111" + "11000000011" + "11011111010" + "01010001010" + "11010101010" + "01010001011" + "01011111011" + "01000000011" + "01111111111" + "00100110100" + }, + /* 27*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, -1, -1, "15", -1, 0, 11, 11, 1, "", + "11101001001" + "11111111111" + "11000000011" + "01011111011" + "11010001010" + "01010101010" + "11010001011" + "11011111010" + "11000000010" + "01111111111" + "00001111100" + }, + /* 28*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, -1, -1, "16", -1, 0, 11, 11, 1, "", + "11101110101" + "11111111111" + "11000000010" + "01011111010" + "01010001011" + "01010101011" + "01010001011" + "11011111010" + "11000000011" + "01111111111" + "00111100100" + }, + /* 29*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, -1, -1, "63", -1, 0, 11, 11, 1, "", + "11100101001" + "11111111111" + "11000000011" + "11011111011" + "01010001011" + "11010101010" + "11010001011" + "11011111010" + "01000000011" + "01111111111" + "00101010000" + }, + /* 30*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, -1, -1, "64", -1, 0, 11, 11, 1, "", + "11111010101" + "11111111111" + "01000000010" + "01011111011" + "01010001010" + "01010101011" + "11010001011" + "01011111011" + "01000000011" + "01111111111" + "00111011100" + }, + /* 31*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, -1, -1, "65", -1, 0, 11, 11, 1, "", + "11111010101" + "11111111111" + "11000000011" + "01011111010" + "01010001010" + "01010101010" + "11010001010" + "11011111011" + "01000000010" + "01111111111" + "00110111100" + }, + /* 32*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, -1, -1, "126", -1, 0, 11, 11, 1, "", + "11110101001" + "11111111111" + "01000000010" + "01011111010" + "01010001011" + "01010101011" + "01010001011" + "11011111010" + "01000000011" + "01111111111" + "00110111000" + }, + /* 33*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, -1, -1, "127", -1, 0, 11, 11, 1, "", + "11110101001" + "11111111111" + "11000000011" + "01011111011" + "01010001011" + "01010101010" + "01010001010" + "01011111010" + "01000000010" + "01111111111" + "00111011000" + }, + /* 34*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, -1, -1, "128", -1, 0, 11, 11, 1, "", + "11001010101" + "11111111111" + "11000000010" + "01011111011" + "11010001010" + "11010101010" + "01010001010" + "01011111010" + "11000000010" + "01111111111" + "00100010000" + }, + /* 35*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, -1, -1, "191", -1, 0, 11, 11, 1, "", + "11000101001" + "11111111111" + "01000000011" + "01011111011" + "11010001011" + "11010101011" + "11010001011" + "01011111011" + "11000000011" + "01111111111" + "00100010100" + }, + /* 36*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, -1, -1, "192", -1, 0, 11, 11, 1, "", + "11011010101" + "11111111111" + "11000000010" + "11011111011" + "11010001010" + "01010101010" + "11010001011" + "11011111010" + "11000000011" + "01111111111" + "00110011000" + }, + /* 37*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, -1, -1, "225", -1, 0, 11, 11, 1, "", + "11010010101" + "11111111111" + "11000000011" + "11011111011" + "01010001010" + "01010101011" + "11010001011" + "01011111011" + "11000000010" + "01111111111" + "00001100100" + }, + /* 38*/ { BARCODE_AZRUNE, UNICODE_MODE, -1, -1, -1, -1, "254", -1, 0, 11, 11, 1, "", + "11010101001" + "11111111111" + "11000000010" + "11011111010" + "11010001011" + "01010101010" + "01010001011" + "01011111011" + "11000000011" + "01111111111" + "00111111100" + }, }; - int data_size = sizeof(data) / sizeof(struct item); + int data_size = ARRAY_SIZE(data); char escaped[1024]; + char bwipp_buf[16384]; + char bwipp_msg[1024]; for (int i = 0; i < data_size; i++) { @@ -432,25 +1044,16 @@ static void test_encode(int index, int generate, int debug) { struct zint_symbol *symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - symbol->symbology = data[i].symbology; - symbol->input_mode = data[i].input_mode; - if (data[i].option_1 != -1) { - symbol->option_1 = data[i].option_1; - } - if (data[i].option_2 != -1) { - symbol->option_2 = data[i].option_2; - } - symbol->debug |= debug; - - int length = strlen(data[i].data); + int length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, data[i].eci, data[i].option_1, data[i].option_2, -1, data[i].output_options, data[i].data, data[i].length, debug); ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length); assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); if (generate) { - printf(" /*%3d*/ { %s, %s, %d, %d, \"%s\", %s, %d, %d, \"%s\",\n", - i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), data[i].option_1, data[i].option_2, - testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), testUtilErrorName(data[i].ret), symbol->rows, symbol->width, data[i].comment); + printf(" /*%3d*/ { %s, %s, %d, %s, %d, %d, \"%s\", %d, %s, %d, %d, %d, \"%s\",\n", + i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), data[i].eci, testUtilOutputOptionsName(data[i].output_options), + data[i].option_1, data[i].option_2, testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), data[i].length, + testUtilErrorName(data[i].ret), symbol->rows, symbol->width, data[i].bwipp_cmp, data[i].comment); testUtilModulesDump(symbol, " ", "\n"); printf(" },\n"); } else { @@ -458,10 +1061,21 @@ static void test_encode(int index, int generate, int debug) { assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data); 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 == 0) { - int width, row; - ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); - assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); + int width, row; + ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); + assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); + + if (do_bwipp && testUtilCanBwipp(i, symbol, data[i].option_1, data[i].option_2, -1, debug)) { + if (!data[i].bwipp_cmp) { + if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d %s not BWIPP compatible (%s)\n", i, testUtilBarcodeName(symbol->symbology), data[i].comment); + } else { + ret = testUtilBwipp(i, symbol, data[i].option_1, data[i].option_2, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(symbol->symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } } } } @@ -890,7 +1504,7 @@ static void test_fuzz(int index, int debug) { "\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240\240", 2080, -1, 1, ZINT_ERROR_TOO_LONG }, }; - int data_size = sizeof(data) / sizeof(struct item); + int data_size = ARRAY_SIZE(data); for (int i = 0; i < data_size; i++) { @@ -899,18 +1513,7 @@ static void test_fuzz(int index, int debug) { struct zint_symbol *symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - symbol->symbology = data[i].symbology; - int length = data[i].length; - if (length == -1) { - length = strlen(data[i].data); - } - if (data[i].input_mode != -1) { - symbol->input_mode = data[i].input_mode; - } - if (data[i].option_1 != -1) { - symbol->option_1 = data[i].option_1; - } - symbol->debug |= debug; + int length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, data[i].option_1, -1, -1, -1 /*output_options*/, data[i].data, data[i].length, debug); ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length); assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); @@ -924,6 +1527,7 @@ static void test_fuzz(int index, int debug) { int main(int argc, char *argv[]) { testFunction funcs[] = { /* name, func, has_index, has_generate, has_debug */ + { "test_options", test_options, 1, 0, 1 }, { "test_encode", test_encode, 1, 1, 1 }, { "test_fuzz", test_fuzz, 1, 0, 1 }, }; diff --git a/backend/tests/test_channel.c b/backend/tests/test_channel.c index e1c9ae36..6ce7dc3b 100644 --- a/backend/tests/test_channel.c +++ b/backend/tests/test_channel.c @@ -380,7 +380,7 @@ static void test_encode(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, data[i].option_2, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, -1, data[i].option_2, -1, debug)) { ret = testUtilBwipp(i, symbol, -1, data[i].option_2, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); diff --git a/backend/tests/test_codablock.c b/backend/tests/test_codablock.c index 1b55342c..00427cb5 100644 --- a/backend/tests/test_codablock.c +++ b/backend/tests/test_codablock.c @@ -444,7 +444,7 @@ static void test_encode(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, data[i].option_1, data[i].option_2, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, data[i].option_1, data[i].option_2, -1, debug)) { if (!data[i].bwipp_cmp) { if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d %s not BWIPP compatible (%s)\n", i, testUtilBarcodeName(symbol->symbology), data[i].comment); } else { diff --git a/backend/tests/test_code.c b/backend/tests/test_code.c index d493ad89..e97c9adc 100644 --- a/backend/tests/test_code.c +++ b/backend/tests/test_code.c @@ -368,7 +368,7 @@ static void test_encode(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, data[i].option_2, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, -1, data[i].option_2, -1, debug)) { ret = testUtilBwipp(i, symbol, -1, data[i].option_2, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); diff --git a/backend/tests/test_code1.c b/backend/tests/test_code1.c index df1d9b04..cd1e025a 100644 --- a/backend/tests/test_code1.c +++ b/backend/tests/test_code1.c @@ -234,7 +234,7 @@ static void test_encode(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, data[i].option_2, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, -1, data[i].option_2, -1, debug)) { ret = testUtilBwipp(i, symbol, -1, data[i].option_2, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); diff --git a/backend/tests/test_code128.c b/backend/tests/test_code128.c index 75d6ecef..75c59088 100644 --- a/backend/tests/test_code128.c +++ b/backend/tests/test_code128.c @@ -665,7 +665,7 @@ static void test_encode(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, -1, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, -1, -1, -1, debug)) { if (!data[i].bwipp_cmp) { if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d %s not BWIPP compatible (%s)\n", i, testUtilBarcodeName(symbol->symbology), data[i].comment); } else { diff --git a/backend/tests/test_code16k.c b/backend/tests/test_code16k.c index d04153d2..5ef7dd59 100644 --- a/backend/tests/test_code16k.c +++ b/backend/tests/test_code16k.c @@ -278,7 +278,7 @@ static void test_encode(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, -1, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, -1, -1, -1, debug)) { ret = testUtilBwipp(i, symbol, -1, -1, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); diff --git a/backend/tests/test_code49.c b/backend/tests/test_code49.c index 628f6104..0eba355e 100644 --- a/backend/tests/test_code49.c +++ b/backend/tests/test_code49.c @@ -212,7 +212,7 @@ static void test_encode(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, -1, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, -1, -1, -1, debug)) { ret = testUtilBwipp(i, symbol, -1, -1, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); diff --git a/backend/tests/test_composite.c b/backend/tests/test_composite.c index 83985fbe..0a715364 100644 --- a/backend/tests/test_composite.c +++ b/backend/tests/test_composite.c @@ -1265,7 +1265,7 @@ static void test_examples(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, data[i].option_1, -1, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, data[i].option_1, -1, -1, debug)) { ret = testUtilBwipp(i, symbol, data[i].option_1, -1, -1, data[i].composite, composite_length, symbol->primary, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); @@ -1431,7 +1431,7 @@ static void test_odd_numbered_numeric(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, data[i].option_1, -1, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, data[i].option_1, -1, -1, debug)) { ret = testUtilBwipp(i, symbol, data[i].option_1, -1, -1, data[i].composite, composite_length, symbol->primary, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); @@ -1561,7 +1561,7 @@ static void test_ean128_cc_shift(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, data[i].option_1, -1, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, data[i].option_1, -1, -1, debug)) { if (!data[i].bwipp_cmp) { if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d %s not BWIPP compatible (%s)\n", i, testUtilBarcodeName(symbol->symbology), data[i].comment); } else { @@ -2112,7 +2112,7 @@ static void test_encodation_0(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, data[i].option_1, -1, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, data[i].option_1, -1, -1, debug)) { ret = testUtilBwipp(i, symbol, data[i].option_1, -1, -1, data[i].composite, composite_length, symbol->primary, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); @@ -2251,7 +2251,7 @@ static void test_encodation_10(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, data[i].option_1, -1, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, data[i].option_1, -1, -1, debug)) { ret = testUtilBwipp(i, symbol, data[i].option_1, -1, -1, data[i].composite, composite_length, symbol->primary, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); @@ -2633,7 +2633,7 @@ static void test_encodation_11(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, data[i].option_1, -1, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, data[i].option_1, -1, -1, debug)) { ret = testUtilBwipp(i, symbol, data[i].option_1, -1, -1, data[i].composite, composite_length, symbol->primary, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); @@ -2786,7 +2786,7 @@ static void test_addongap(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, data[i].option_1, data[i].option_2, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, data[i].option_1, data[i].option_2, -1, debug)) { ret = testUtilBwipp(i, symbol, data[i].option_1, data[i].option_2, -1, composite, composite_length, symbol->primary, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); diff --git a/backend/tests/test_dmatrix.c b/backend/tests/test_dmatrix.c index a0d87a2e..d26ac384 100644 --- a/backend/tests/test_dmatrix.c +++ b/backend/tests/test_dmatrix.c @@ -92,19 +92,19 @@ static void test_buffer(int index, int debug) { int ret; struct item { - char *data; int eci; int input_mode; int output_options; + char *data; int ret; char *comment; }; // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) struct item data[] = { - /* 0*/ { "1", 16383, UNICODE_MODE, READER_INIT, 0, "" }, - /* 1*/ { "000106j 05 Galeria A Nação0000000000", 3, UNICODE_MODE, 0, 0, "From Okapi, consecutive use of upper shift; ticket #176" }, + /* 0*/ { 16383, UNICODE_MODE, READER_INIT, "1", 0, "" }, + /* 1*/ { 3, UNICODE_MODE, 0, "000106j 05 Galeria A Nação0000000000", 0, "From Okapi, consecutive use of upper shift; #176" }, }; - int data_size = sizeof(data) / sizeof(struct item); + int data_size = ARRAY_SIZE(data); for (int i = 0; i < data_size; i++) { @@ -113,13 +113,7 @@ static void test_buffer(int index, int debug) { struct zint_symbol *symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - symbol->symbology = BARCODE_DATAMATRIX; - symbol->input_mode = data[i].input_mode; - symbol->eci = data[i].eci; - symbol->output_options = data[i].output_options; - symbol->debug |= debug; - - int length = strlen(data[i].data); + int length = testUtilSetSymbol(symbol, BARCODE_DATAMATRIX, data[i].input_mode, data[i].eci, -1 /*option_1*/, -1, -1, data[i].output_options, data[i].data, -1, debug); ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length); assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret); @@ -130,6 +124,118 @@ static void test_buffer(int index, int debug) { testFinish(); } +static void test_options(int index, int debug) { + + testStart(""); + + int ret; + struct item { + int symbology; + int option_1; + int option_2; + int option_3; + char *data; + int ret; + + int expected_rows; + int expected_width; + }; + // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) + struct item data[] = { + /* 0*/ { BARCODE_DATAMATRIX, -1, -1, -1, "1", 0, 10, 10 }, + /* 1*/ { BARCODE_DATAMATRIX, 2, -1, -1, "1", ZINT_ERROR_INVALID_OPTION, -1, -1 }, + /* 2*/ { BARCODE_DATAMATRIX, -1, 1, -1, "1", 0, 10, 10 }, + /* 3*/ { BARCODE_DATAMATRIX, -1, 2, -1, "1", 0, 12, 12 }, + /* 4*/ { BARCODE_DATAMATRIX, -1, 48, -1, "1", 0, 26, 64 }, + /* 5*/ { BARCODE_DATAMATRIX, -1, 49, -1, "1", 0, 10, 10 }, // Ignored + /* 6*/ { BARCODE_DATAMATRIX, -1, -1, -1, "ABCDEFGHIJK", 0, 8, 32 }, + /* 7*/ { BARCODE_DATAMATRIX, -1, -1, DM_SQUARE, "ABCDEFGHIJK", 0, 16, 16 }, + /* 8*/ { BARCODE_DATAMATRIX, -1, -1, -1, "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTU", 0, 32, 32 }, + /* 9*/ { BARCODE_DATAMATRIX, -1, -1, DM_DMRE, "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTU", 0, 20, 44 }, + /* 10*/ { BARCODE_DATAMATRIX, -1, -1, 9999, "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTU", 0, 32, 32 }, // Ignored + }; + int data_size = ARRAY_SIZE(data); + + for (int i = 0; i < data_size; i++) { + + if (index != -1 && i != index) continue; + + struct zint_symbol *symbol = ZBarcode_Create(); + assert_nonnull(symbol, "Symbol not created\n"); + + int length = testUtilSetSymbol(symbol, data[i].symbology, -1 /*input_mode*/, -1 /*eci*/, data[i].option_1, data[i].option_2, data[i].option_3, -1 /*output_options*/, data[i].data, -1, debug); + + ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length); + assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); + + if (ret < ZINT_ERROR) { + assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, symbol->errtxt); + assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, symbol->errtxt); + } + + ZBarcode_Delete(symbol); + } + + testFinish(); +} + +static void test_reader_init(int index, int generate, int debug) { + + testStart(""); + + int ret; + struct item { + int symbology; + int input_mode; + int output_options; + char *data; + int ret; + int expected_rows; + int expected_width; + char *expected; + char *comment; + }; + struct item data[] = { + /* 0*/ { BARCODE_DATAMATRIX, UNICODE_MODE, READER_INIT, "A", 0, 10, 10, "EA 42 81 19 A4 53 21 DF", "TODO: Check this" }, + /* 1*/ { BARCODE_DATAMATRIX, GS1_MODE, READER_INIT, "[91]A", ZINT_ERROR_INVALID_OPTION, 0, 0, "Error 521: Cannot encode in GS1 mode and Reader Initialisation at the same time", "" }, + }; + int data_size = ARRAY_SIZE(data); + + char escaped[1024]; + + for (int i = 0; i < data_size; i++) { + + if (index != -1 && i != index) continue; + + struct zint_symbol *symbol = ZBarcode_Create(); + assert_nonnull(symbol, "Symbol not created\n"); + + symbol->debug = ZINT_DEBUG_TEST; // Needed to get codeword dump in errtxt + + int length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, -1 /*option_1*/, -1 /*option_2*/, -1, data[i].output_options, data[i].data, -1, debug); + + ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length); + assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); + + if (generate) { + printf(" /*%3d*/ { %s, %s, %s, \"%s\", %s, %d, %d, \"%s\", \"%s\" },\n", + i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), testUtilOutputOptionsName(data[i].output_options), + testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), + testUtilErrorName(data[i].ret), symbol->rows, symbol->width, symbol->errtxt, data[i].comment); + } else { + if (ret < 5) { + assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data); + 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); + assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected); + } + } + + ZBarcode_Delete(symbol); + } + + testFinish(); +} + static void test_input(int index, int generate, int debug) { testStart(""); @@ -138,7 +244,6 @@ static void test_input(int index, int generate, int debug) { struct item { int input_mode; int eci; - int option_1; int option_2; int option_3; char *data; @@ -151,16 +256,78 @@ static void test_input(int index, int generate, int debug) { char *comment; }; struct item data[] = { - /* 0*/ { UNICODE_MODE, 0, -1, -1, -1, "0466010592130100000k*AGUATY80", 0, 0, 18, 18, "(32) 86 C4 83 87 DE 8F 83 82 82 31 6C EE 08 85 D6 D2 EF 65 93 B0 1C 3C 76 FB D4 AB 16 11", "" }, - /* 1*/ { UNICODE_MODE, 0, -1, 5, -1, "0466010592130100000k*AGUATY80", 0, 0, 18, 18, "(32) 86 C4 83 87 DE 8F 83 82 82 31 6C EE 08 85 D6 D2 EF 65 93 B0 1C 3C 76 FB D4 AB 16 11", "" }, - /* 2*/ { UNICODE_MODE, 0, -1, -1, -1, "0466010592130100000k*AGUATY8", 0, 0, 18, 18, "(32) 86 C4 83 87 DE 8F 83 82 82 E6 19 5C 07 B7 82 5F D4 3D 65 B5 97 30 00 FC 2C 4C 30 52", "" }, - /* 3*/ { UNICODE_MODE, 0, -1, -1, -1, "0466010592130100000k*AGUATY80U", 0, 0, 20, 20, "(40) 86 C4 83 87 DE 8F 83 82 82 31 6C EE 08 85 D6 D2 EF 65 FE 56 81 76 4F AB 22 B8 6F 0A", "" }, - /* 4*/ { UNICODE_MODE, 0, -1, 5, -1, "0466010592130100000k*AGUATY80U", ZINT_ERROR_TOO_LONG, -1, 0, 0, "Error 522: Input too long for selected symbol size", "" }, - /* 5*/ { UNICODE_MODE, 0, -1, 6, -1, "0466010592130100000k*AGUATY80U", 0, 0, 20, 20, "(40) 86 C4 83 87 DE 8F 83 82 82 31 6C EE 08 85 D6 D2 EF 65 FE 56 81 76 4F AB 22 B8 6F 0A", "" }, - /* 6*/ { UNICODE_MODE, 0, -1, -1, -1, "0466010592130100000k*AGUATY80UA", 0, 0, 20, 20, "(40) 86 C4 83 87 DE 8F 83 82 82 31 6C E6 07 B7 82 5F D4 3D 1E 5F FE 81 1E 1B B0 FE E7 54", "" }, - /* 7*/ { UNICODE_MODE, 0, -1, -1, -1, "A*0>B1*", 0, 0, 14, 14, "EE 57 AD 0E DE FE 2B 81 F8 05 75 94 1E 5F 24 0C A0 D3", "X12 symbols_left 3, process_p 1" }, - /* 8*/ { UNICODE_MODE, 0, -1, -1, -1, "A*0>B1*2", 0, 0, 14, 14, "EE 57 AD 0E DE FE 2B 33 E7 BB FB 78 F9 F5 4B 11 BB 5A", "X12 symbols_left 3, process_p 2" }, - /* 9*/ { UNICODE_MODE, 0, -1, -1, -1, "A*0>B1*2>", 0, 0, 14, 14, "EE 57 AD 0E DE 07 33 FE 75 99 1B 4D 76 0E 9E 49 E0 37", "X12 symbols_left 1, process_p 0" }, + /* 0*/ { UNICODE_MODE, 0, -1, -1, "0466010592130100000k*AGUATY80", 0, 0, 18, 18, "(32) 86 C4 83 87 DE 8F 83 82 82 31 6C EE 08 85 D6 D2 EF 65 93 B0 1C 3C 76 FB D4 AB 16 11", "#208" }, + /* 1*/ { UNICODE_MODE, 0, 5, -1, "0466010592130100000k*AGUATY80", 0, 0, 18, 18, "(32) 86 C4 83 87 DE 8F 83 82 82 31 6C EE 08 85 D6 D2 EF 65 93 B0 1C 3C 76 FB D4 AB 16 11", "" }, + /* 2*/ { UNICODE_MODE, 0, -1, -1, "0466010592130100000k*AGUATY8", 0, 0, 18, 18, "(32) 86 C4 83 87 DE 8F 83 82 82 E6 19 5C 07 B7 82 5F D4 3D 65 B5 97 30 00 FC 2C 4C 30 52", "" }, + /* 3*/ { UNICODE_MODE, 0, -1, -1, "0466010592130100000k*AGUATY80U", 0, 0, 20, 20, "(40) 86 C4 83 87 DE 8F 83 82 82 31 6C EE 08 85 D6 D2 EF 65 FE 56 81 76 4F AB 22 B8 6F 0A", "" }, + /* 4*/ { UNICODE_MODE, 0, 5, -1, "0466010592130100000k*AGUATY80U", ZINT_ERROR_TOO_LONG, -1, 0, 0, "Error 522: Input too long for selected symbol size", "" }, + /* 5*/ { UNICODE_MODE, 0, 6, -1, "0466010592130100000k*AGUATY80U", 0, 0, 20, 20, "(40) 86 C4 83 87 DE 8F 83 82 82 31 6C EE 08 85 D6 D2 EF 65 FE 56 81 76 4F AB 22 B8 6F 0A", "" }, + /* 6*/ { UNICODE_MODE, 0, -1, -1, "0466010592130100000k*AGUATY80UA", 0, 0, 20, 20, "(40) 86 C4 83 87 DE 8F 83 82 82 31 6C E6 07 B7 82 5F D4 3D 1E 5F FE 81 1E 1B B0 FE E7 54", "" }, + /* 7*/ { UNICODE_MODE, 0, -1, -1, "A*0>B1*", 0, 0, 14, 14, "EE 57 AD 0E DE FE 2B 81 F8 05 75 94 1E 5F 24 0C A0 D3", "X12 symbols_left 3, process_p 1" }, + /* 8*/ { UNICODE_MODE, 0, -1, -1, "A*0>B1*2", 0, 0, 14, 14, "EE 57 AD 0E DE FE 2B 33 E7 BB FB 78 F9 F5 4B 11 BB 5A", "X12 symbols_left 3, process_p 2" }, + /* 9*/ { UNICODE_MODE, 0, -1, -1, "A*0>B1*2>", 0, 0, 14, 14, "EE 57 AD 0E DE 07 33 FE 75 99 1B 4D 76 0E 9E 49 E0 37", "X12 symbols_left 1, process_p 0" }, + /* 10*/ { UNICODE_MODE, 0, -1, -1, "ABCDEF", 0, 0, 12, 12, "E6 59 E9 6D 24 3D 15 EF AA 21 F9 59", "C40 last_shift 0, symbols_left 0, process_p 0" }, + /* 11*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFG", 0, 0, 14, 14, "E6 59 E9 6D 24 FE 48 81 8C 7E 09 5E 10 64 BC 5F 4C 91", "C40 last_shift 0, symbols_left 3, process_p 1" }, + /* 12*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFGH", 0, 0, 14, 14, "E6 59 E9 6D 24 80 49 FE DD 85 9E 5B E9 8F 4D F3 02 9C", "C40 last_shift 0, symbols_left 3, process_p 2" }, + /* 13*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFGHI", 0, 0, 14, 14, "E6 59 E9 6D 24 80 5F FE 01 DE 20 9F AA C2 FF 8F 08 97", "C40 last_shift 0, symbols_left 1, process_p 0" }, + /* 14*/ { UNICODE_MODE, 0, -1, -1, "ABCDEF\001G", 0, 0, 14, 14, "E6 59 E9 6D 24 00 3D FE 5D 5A F5 0A 8A 4E 1D 63 07 B9", "C40 last_shift 0, symbols_left 1, process_p 0" }, + /* 15*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFG\001", 0, 0, 14, 14, "E6 59 E9 6D 24 7D 02 FE 14 A3 27 63 01 2F B1 94 FE FA", "C40 last_shift 0, symbols_left 1, process_p 0" }, + /* 16*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFG\001H", 0, 0, 14, 14, "E6 59 E9 6D 24 7D 02 49 C2 E6 DD 06 89 51 BA 8E 9D 1F", "C40 last_shift 0, symbols_left 1, process_p 1" }, + /* 17*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFGH\001", 0, 0, 14, 14, "E6 59 E9 6D 24 80 49 02 4F 4D 86 23 5F 1B F9 8C 67 7E", "C40 last_shift 1, symbols_left 1, process_p 1" }, + /* 18*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFGH\001I", 0, 0, 8, 32, "E6 59 E9 6D 24 80 49 09 B1 FE 27 19 F1 CA B7 85 D0 25 0D 5E 24", "C40 last_shift 1, symbols_left 3, process_p 2" }, + /* 19*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFGHI\001", 0, 0, 8, 32, "E6 59 E9 6D 24 80 5F FE 02 81 47 6C 3E 49 D3 FA 46 47 53 6E E5", "Switches to ASC for last char" }, + /* 20*/ { UNICODE_MODE, 0, -1, -1, "ABCDEF+G", 0, 0, 14, 14, "E6 59 E9 6D 24 07 E5 FE 6B 35 71 7F 3D 57 59 46 F7 B9", "C40 last_shift 0, symbols_left 1, process_p 0" }, + /* 21*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFG+", 0, 0, 14, 14, "E6 59 E9 6D 24 7D 33 FE 33 F5 97 60 73 48 13 2E E5 74", "C40 last_shift 0, symbols_left 1, process_p 0" }, + /* 22*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFG+H", 0, 0, 14, 14, "E6 59 E9 6D 24 7D 33 49 E5 B0 6D 05 FB 36 18 34 86 91", "C40 last_shift 0, symbols_left 1, process_p 1" }, + /* 23*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFGH+", 0, 0, 14, 14, "E6 59 E9 6D 24 80 49 2C 67 1F 09 CA 1A CD 0D 55 80 21", "C40 last_shift 2, symbols_left 1, process_p 1" }, + /* 24*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFGH+I", 0, 0, 8, 32, "E6 59 E9 6D 24 80 4A 41 F1 FE 41 81 CF 13 E2 64 43 2F E1 D1 11", "C40 last_shift 2, symbols_left 3, process_p 2" }, + /* 25*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFGHI+", 0, 0, 8, 32, "E6 59 E9 6D 24 80 5F FE 2C 81 F8 BC 8D 12 17 7E 22 27 DE 7F E2", "Switches to ASC for last char" }, + /* 26*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFjG", 0, 0, 14, 14, "E6 59 E9 6D 24 0E 25 FE DA 14 D7 15 47 69 9D 4A 54 6D", "C40 last_shift 0, symbols_left 1, process_p 0" }, + /* 27*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFGj", 0, 0, 14, 14, "E6 59 E9 6D 24 7D 5B FE B5 F3 24 0A 99 26 D6 CC A8 40", "C40 last_shift 0, symbols_left 1, process_p 0" }, + /* 28*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFGjH", 0, 0, 14, 14, "E6 59 E9 6D 24 7D 5B 49 63 B6 DE 6F 11 58 DD D6 CB A5", "C40 last_shift 0, symbols_left 1, process_p 1" }, + /* 29*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFGHj", 0, 0, 14, 14, "E6 59 E9 6D 24 80 49 6B 12 00 5B FD B0 3A D9 DF 26 B6", "C40 last_shift 3, symbols_left 1, process_p 1" }, + /* 30*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFGHjI", 0, 0, 8, 32, "E6 59 E9 6D 24 80 4B 41 F1 FE FB 10 AC 51 A1 56 8F 20 98 18 1B", "C40 last_shift 3, symbols_left 3, process_p 2" }, + /* 31*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFGHIj", 0, 0, 8, 32, "E6 59 E9 6D 24 80 5F FE 6B 81 17 79 06 42 7E 96 B2 70 79 F8 3C", "Switches to ASC for last char" }, + /* 32*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFGHIJÊ", 0, 0, 16, 16, "E6 59 E9 6D 24 80 5F FE 4B EB 4B 81 DD D9 F9 C9 C5 38 F3 4B DB 80 92 A7", "Switches to ASC for last 2 chars" }, + /* 33*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFGHIJKÊ", 0, 0, 16, 16, "E6 59 E9 6D 24 80 5F 93 82 BF 19 FE E7 50 32 B4 0B CC 8C 07 D2 78 8D F5", "C40 last_shift 0, symbols_left 3, process_p 2" }, + /* 34*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFGHIJKª", 0, 0, 16, 16, "E6 59 E9 6D 24 80 5F 93 82 BB B2 FE 11 5C 60 32 A6 DE FC 7B 30 F1 03 56", "C40 last_shift 0, symbols_left 1, process_p 0" }, + /* 35*/ { UNICODE_MODE, 0, -1, -1, "ABCDEFGHIJKê", 0, 0, 16, 16, "E6 59 E9 6D 24 80 5F 93 82 BB DB FE 78 43 69 3C C2 FE F5 2E 1B 4F B6 04", "C40 last_shift 0, symbols_left 1, process_p 0" }, + /* 36*/ { UNICODE_MODE, 0, -1, -1, "abcdef", 0, 0, 12, 12, "EF 59 E9 6D 24 E2 CC D9 B4 55 E2 6A", "TEX last_shift 0, symbols_left 0, process_p 0" }, + /* 37*/ { UNICODE_MODE, 0, -1, -1, "abcdefg", 0, 0, 14, 14, "EF 59 E9 6D 24 FE 68 81 A9 65 CD 3A A2 E9 E0 B7 E1 E5", "TEX last_shift 0, symbols_left 3, process_p 1" }, + /* 38*/ { UNICODE_MODE, 0, -1, -1, "abcdefgh", 0, 0, 14, 14, "EF 59 E9 6D 24 80 49 FE 06 E4 44 D2 32 58 90 31 E9 F8", "TEX last_shift 0, symbols_left 3, process_p 2" }, + /* 39*/ { UNICODE_MODE, 0, -1, -1, "abcdefghi", 0, 0, 14, 14, "EF 59 E9 6D 24 80 5F FE DA BF FA 16 71 15 22 4D E3 F3", "TEX last_shift 0, symbols_left 1, process_p 0" }, + /* 40*/ { UNICODE_MODE, 0, -1, -1, "abcdef\001g", 0, 0, 14, 14, "EF 59 E9 6D 24 00 3D FE 86 3B 2F 83 51 99 C0 A1 EC DD", "TEX last_shift 0, symbols_left 1, process_p 0" }, + /* 41*/ { UNICODE_MODE, 0, -1, -1, "abcdefg\001", 0, 0, 14, 14, "EF 59 E9 6D 24 7D 02 FE CF C2 FD EA DA F8 6C 56 15 9E", "TEX last_shift 0, symbols_left 1, process_p 0" }, + /* 42*/ { UNICODE_MODE, 0, -1, -1, "abcdefg\001h", 0, 0, 14, 14, "EF 59 E9 6D 24 7D 02 69 7A 9B EB A4 5E DE 99 25 01 8C", "TEX last_shift 0, symbols_left 1, process_p 1" }, + /* 43*/ { UNICODE_MODE, 0, -1, -1, "abcdefgh\001", 0, 0, 14, 14, "EF 59 E9 6D 24 80 49 02 94 2C 5C AA 84 CC 24 4E 8C 1A", "TEX last_shift 1, symbols_left 1, process_p 1" }, + /* 44*/ { UNICODE_MODE, 0, -1, -1, "abcdefgh\001i", 0, 0, 8, 32, "EF 59 E9 6D 24 80 49 09 B1 FE 2D DE FF 05 A9 AE 0B 91 4B C5 70", "TEX last_shift 1, symbols_left 3, process_p 2" }, + /* 45*/ { UNICODE_MODE, 0, -1, -1, "abcdefghi\001", 0, 0, 8, 32, "EF 59 E9 6D 24 80 5F FE 02 81 4D AB 30 86 CD D1 9D F3 15 F5 B1", "Switches to ASC for last char" }, + /* 46*/ { UNICODE_MODE, 0, -1, -1, "abcdefJg", 0, 0, 14, 14, "EF 59 E9 6D 24 0E 25 FE 01 75 0D 9C 9C BE 40 88 BF 09", "TEX last_shift 0, symbols_left 1, process_p 0" }, + /* 47*/ { UNICODE_MODE, 0, -1, -1, "abcdefgJ", 0, 0, 14, 14, "EF 59 E9 6D 24 7D 5B FE 6E 92 FE 83 42 F1 0B 0E 43 24", "TEX last_shift 0, symbols_left 1, process_p 0" }, + /* 48*/ { UNICODE_MODE, 0, -1, -1, "abcdefgJh", 0, 0, 14, 14, "EF 59 E9 6D 24 7D 5B 69 DB CB E8 CD C6 D7 FE 7D 57 36", "TEX last_shift 0, symbols_left 1, process_p 1" }, + /* 49*/ { UNICODE_MODE, 0, -1, -1, "abcdefghJ", 0, 0, 14, 14, "EF 59 E9 6D 24 80 49 4B AA 7D 6D 5F 67 B5 FA 74 BA 25", "TEX last_shift 3, symbols_left 1, process_p 1" }, + /* 50*/ { UNICODE_MODE, 0, -1, -1, "abcdefghJi", 0, 0, 8, 32, "EF 59 E9 6D 24 80 4B 41 F1 FE F1 D7 A2 9E BF 7D 54 94 DE 83 4F", "TEX last_shift 3, symbols_left 3, process_p 2" }, + /* 51*/ { UNICODE_MODE, 0, -1, -1, "abcdefghiJ", 0, 0, 8, 32, "EF 59 E9 6D 24 80 5F FE 4B 81 B3 A5 20 E3 DC F9 74 40 09 30 46", "Switches to ASC for last char" }, + /* 52*/ { UNICODE_MODE, 0, -1, -1, "abcdefghijkÊ", 0, 0, 16, 16, "EF 59 E9 6D 24 80 5F 93 82 BB DB FE 3E C8 EC 73 58 A7 42 46 10 49 25 99", "TEX last_shift 0, symbols_left 1, process_p 0" }, + /* 53*/ { UNICODE_MODE, 0, -1, -1, "abcdefghijkª", 0, 0, 16, 16, "EF 59 E9 6D 24 80 5F 93 82 BB B2 FE 57 D7 E5 7D 3C 87 4B 13 3B F7 90 CB", "TEX last_shift 0, symbols_left 1, process_p 0" }, + /* 54*/ { UNICODE_MODE, 0, -1, -1, "abcdefghijkê", 0, 0, 16, 16, "EF 59 E9 6D 24 80 5F 93 82 BF 19 FE A1 DB B7 FB 91 95 3B 6F D9 7E 1E 68", "TEX last_shift 2, symbols_left 3, process_p 2" }, + /* 55*/ { UNICODE_MODE, 0, -1, -1, "@AB@CD@E", 0, 0, 14, 14, "F0 00 10 80 0C 40 05 81 45 D9 9B 1F BC 09 CD E4 7F F4", "EDIFACT symbols_left 1, process_p 0" }, + /* 56*/ { UNICODE_MODE, 0, -1, -1, "@AB@CD@EF", 0, 0, 14, 14, "F0 00 10 80 0C 40 05 47 AC D8 F1 F0 DE 6C 30 5E 30 D4", "EDIFACT symbols_left 1, process_p 1" }, + /* 57*/ { UNICODE_MODE, 0, -1, -1, "@AB@CD@EF@", 0, 0, 8, 32, "F0 00 10 80 0C 40 05 18 07 C0 6C 60 CA 7E 7B F3 38 A1 9D D0 CC", "EDIFACT symbols_left 3, process_p 2" }, + /* 58*/ { UNICODE_MODE, 0, -1, -1, "@AB@CD@EF@G", 0, 0, 8, 32, "F0 00 10 80 0C 40 05 18 01 DF 71 FB 95 EA E6 4B 36 E0 23 9B 4C", "EDIFACT symbols_left 3, process_p 3" }, + /* 59*/ { UNICODE_MODE, 0, -1, -1, "@AB@CD@EF@GH", 0, 0, 8, 32, "F0 00 10 80 0C 40 05 18 01 C8 77 0F 96 AD 39 FB F3 04 3B BF 99", "EDIFACT symbols_left 0, process_p 0" }, + /* 60*/ { UNICODE_MODE, 0, -1, -1, "@AB@CD@EF@GH@", 0, 0, 16, 16, "F0 00 10 80 0C 40 05 18 01 C8 41 81 4A 43 1E F1 26 2E 4B EB B8 6A 2B 64", "EDIFACT symbols_left 2, process_p 1" }, + /* 61*/ { UNICODE_MODE, 0, -1, -1, "@AB@CD@EF@GH@I", 0, 0, 16, 16, "F0 00 10 80 0C 40 05 18 01 C8 41 4A 49 B3 34 91 8C 2A C4 0E 16 2F 45 9B", "EDIFACT symbols_left 2, process_p 2" }, + /* 62*/ { DATA_MODE, 0, -1, -1, "\377\376", 0, 0, 12, 12, "EB 80 EB 7F 81 6F A8 0F 21 6F 5F 88", "FN4 A7F FN4 A7E" }, + /* 63*/ { DATA_MODE, 0, -1, -1, "\377\376\375", 0, 0, 12, 12, "E7 2F C0 55 E9 52 B7 8D 38 76 E8 6E", "BAS BFF BFE BFD" }, + /* 64*/ { DATA_MODE, 3, -1, -1, "\101\102\103\104\300\105\310", 0, 3, 16, 16, "F1 04 E7 5E 2D C4 5B F1 03 1D 36 81 64 0E C0 77 9A 18 52 B2 F9 F0 04 39", "ECI 4 BAS B41 B42 B43 B44 BC0 B45 BC8" }, + /* 65*/ { UNICODE_MODE, 26, -1, -1, "ABCDÀEÈ", 0, 26, 12, 26, "F1 1B E7 60 2D C4 5B F1 06 58 B3 C7 21 81 57 ED 3D C0 12 2E 6C 80 58 CC 2C 05 0D 31 FC 2D", "ECI 27 BAS B41 B42 B43 B44 BC3 B80 B45 BC3 B88" }, + /* 66*/ { UNICODE_MODE, 0, -1, -1, "β", ZINT_WARN_USES_ECI, 9, 12, 12, "Warning F1 0A EB 63 81 41 56 DA C0 3D 2D CC", "ECI 10 FN4 A62" }, + /* 67*/ { UNICODE_MODE, 127, -1, -1, "A", 0, 127, 12, 12, "F1 80 01 42 81 14 A2 86 07 F5 27 30", "ECI 128 A41" }, + /* 68*/ { UNICODE_MODE, 16382, -1, -1, "A", 0, 16382, 12, 12, "F1 BF FE 42 81 29 57 AA A0 92 B2 45", "ECI 16383 A41" }, + /* 69*/ { UNICODE_MODE, 810899, -1, -1, "A", 0, 810899, 12, 12, "F1 CC 51 05 42 BB A5 A7 8A C6 6E 0F", "ECI 810900 A41" }, + /* 70*/ { UNICODE_MODE, 26, -1, -1, "abcdefghi1234FGHIJKLMNabc@@@@@@@@@é", 0, 26, 24, 24, "(60) F1 1B EF 59 E9 6D 24 80 5F FE 8E A4 E6 79 F6 8D 31 A0 6C FE 62 63 64 F0 00 00 00 00", "Mix of modes TEX ASC C40 ASC EDI BAS" }, + /* 71*/ { UNICODE_MODE | ESCAPE_MODE, -1, -1, -1, "[)>\\R05\\GA\\R\\E", 0, 0, 10, 10, "EC 42 81 5D 17 49 F6 B6", "Macro05 A41" }, }; int data_size = ARRAY_SIZE(data); @@ -175,14 +342,14 @@ static void test_input(int index, int generate, int debug) { symbol->debug = ZINT_DEBUG_TEST; // Needed to get codeword dump in errtxt - int length = testUtilSetSymbol(symbol, BARCODE_DATAMATRIX, data[i].input_mode, data[i].eci, data[i].option_1, data[i].option_2, data[i].option_3, -1 /*output_options*/, data[i].data, -1, debug); + int length = testUtilSetSymbol(symbol, BARCODE_DATAMATRIX, data[i].input_mode, data[i].eci, -1 /*option_1*/, data[i].option_2, data[i].option_3, -1 /*output_options*/, data[i].data, -1, debug); ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length); assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret); if (generate) { - printf(" /*%3d*/ { %s, %d, %d, %d, %d, \"%s\", %s, %d, %d, %d, \"%s\", \"%s\" },\n", - i, testUtilInputModeName(data[i].input_mode), data[i].eci, data[i].option_1, data[i].option_2, data[i].option_3, testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), + printf(" /*%3d*/ { %s, %d, %d, %d, \"%s\", %s, %d, %d, %d, \"%s\", \"%s\" },\n", + i, testUtilInputModeName(data[i].input_mode), data[i].eci, data[i].option_2, data[i].option_3, testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), testUtilErrorName(data[i].ret), ret < 5 ? symbol->eci : -1, symbol->rows, symbol->width, symbol->errtxt, data[i].comment); } else { if (ret < 5) { @@ -203,20 +370,28 @@ static void test_encode(int index, int generate, int debug) { testStart(""); + int do_bwipp = (debug & ZINT_DEBUG_TEST_BWIPP) && testUtilHaveGhostscript(); // Only do BWIPP test if asked, too slow otherwise + int ret; struct item { int symbology; int input_mode; + int eci; + int output_options; + int option_2; + int option_3; char *data; int ret; int expected_rows; int expected_width; + int bwipp_cmp; char *comment; char *expected; }; + // Verified manually against ISO/IEC 16022:2006, GS1 General Specifications 20.0 (GGS), ANSI/HIBC LIC 2.6-2016 (HIBC/LIC) and ANSI/HIBC PAS 1.3-2010 (HIBC/PAS), with noted exceptions struct item data[] = { - /* 0*/ { BARCODE_DATAMATRIX, -1, "1234abcd", 0, 14, 14, "", + /* 0*/ { BARCODE_DATAMATRIX, -1, -1, -1, -1, -1, "1234abcd", 0, 14, 14, 1, "", "10101010101010" "11001010001111" "11000101100100" @@ -232,7 +407,7 @@ static void test_encode(int index, int generate, int debug) { "10011111000100" "11111111111111" }, - /* 1*/ { BARCODE_DATAMATRIX, -1, "A1B2C3D4E5F6G7H8I9J0K1L2", 0, 18, 18, "ISO 16022:2006 Figure 1", + /* 1*/ { BARCODE_DATAMATRIX, -1, -1, -1, -1, -1, "A1B2C3D4E5F6G7H8I9J0K1L2", 0, 18, 18, 1, "ISO 16022:2006 Figure 1", "101010101010101010" "101000101010001111" "101100000111000010" @@ -252,7 +427,7 @@ static void test_encode(int index, int generate, int debug) { "100011000000100100" "111111111111111111" }, - /* 2*/ { BARCODE_DATAMATRIX, -1, "123456", 0, 10, 10, "ISO 16022:2006 Figure O.2", + /* 2*/ { BARCODE_DATAMATRIX, -1, -1, -1, -1, -1, "123456", 0, 10, 10, 1, "ISO 16022:2006 Figure O.2", "1010101010" "1100101101" "1100000100" @@ -264,7 +439,7 @@ static void test_encode(int index, int generate, int debug) { "1001110100" "1111111111" }, - /* 3*/ { BARCODE_DATAMATRIX, -1, "30Q324343430794\\R06\\G+/ACMRN123456/V2009121908334\\R\\E", 0, 20, 20, 1, "HIBC/PAS Section 2.2 Patient Id Macro, same", + "10101010101010101010" + "10000000001110001111" + "11010101001010011100" + "11000000011100110101" + "11011001101011001100" + "11001100000100010001" + "11110111101011000100" + "11010010001101100001" + "11110010010110011110" + "11010010010000010011" + "10010001100010110000" + "11101100100001000111" + "11101010000011111100" + "11000010000101001011" + "11001110111110010010" + "11000010110100011101" + "11001011001001011100" + "10010110010000010101" + "11100110001010111010" + "11111111111111111111" + }, + /* 21*/ { BARCODE_HIBC_DM, -1, -1, -1, -1, -1, "/EO523201", 0, 14, 14, 1, "HIBC/PAS Section 2.2 Purchase Order, same", + "10101010101010" + "10011001010101" + "11101000011010" + "10001100011101" + "11101100101100" + "10100001101111" + "10010001010110" + "10000001011001" + "11100000010100" + "11011010100101" + "10111110101110" + "11110000101101" + "10010010000100" + "11111111111111" + }, + /* 22*/ { BARCODE_HIBC_DM, -1, -1, -1, -1, DM_SQUARE, "/EU720060FF0/O523201", 0, 18, 18, 1, "HIBC/PAS Section 2.2 2nd Purchase Order, same", + "101010101010101010" + "100110010100100001" + "111011110110010110" + "100000101110011001" + "111001001010000100" + "100000000000011101" + "100101100000101110" + "111000000111111011" + "110110111000101010" + "101001000111000111" + "100011110101010110" + "111111001101010011" + "100000000001101000" + "110100100011011111" + "111000100110101110" + "111010100101000011" + "111000010011001010" + "111111111111111111" + }, + /* 23*/ { BARCODE_HIBC_DM, -1, -1, -1, -1, -1, "/EU720060FF0/O523201/Z34H159/M9842431340", 0, 22, 22, 1, "HIBC/PAS Section 2.2 3rd Purchase Order (left), same", + "1010101010101010101010" + "1001100101001000000011" + "1110111101100001111010" + "1000001011101100111111" + "1110010010010000111100" + "1000000000011100000111" + "1001011010011000001110" + "1110000010001001101001" + "1101100110001010100100" + "1010010011011101000101" + "1000100011010000001110" + "1111010100101000010111" + "1000001001011011101110" + "1111110111111101100011" + "1001010110011010000000" + "1101010100110100010011" + "1001010011000110000000" + "1111001010100101110111" + "1100110010110011010000" + "1100001011100001000111" + "1010110000010001001000" + "1111111111111111111111" + }, + /* 24*/ { BARCODE_DATAMATRIX, DATA_MODE | ESCAPE_MODE, -1, -1, -1, -1, "[)>\\R06\\G+/EU720060FF0/O523201/Z34H159/M9842431340V\\R\\E", 0, 22, 22, 1, "HIBC/PAS Section 2.2 3rd Purchase Order (right), same", + "1010101010101010101010" + "1000000000111010011101" + "1101011100101001011100" + "1100010000000001101001" + "1111110110000111100000" + "1100100000110011001101" + "1001011001000010000110" + "1000100101110111110111" + "1100001001110111111100" + "1011111001001010001101" + "1000011000010100101010" + "1111001101110100101101" + "1110001101101100001100" + "1001010101111010110011" + "1000110111011100101010" + "1111110011011111010101" + "1101000011100111101110" + "1011000010010100110111" + "1001110101111101000000" + "1110101001011011000111" + "1001110110011101101000" + "1111111111111111111111" + }, + /* 25*/ { BARCODE_HIBC_DM, -1, -1, -1, -1, -1, "/E+/KN12345", 0, 16, 16, 1, "HIBC/PAS Section 2.2 Asset Tag **NOT SAME** check digit 'A' in figure is for '/KN12345', but actual data is as given here, when check digit is 'J'", + "1010101010101010" + "1001101010001111" + "1110001000101100" + "1000110100101101" + "1101000000110010" + "1000101001000001" + "1110000111001100" + "1010001101111101" + "1111101010101000" + "1101100101010001" + "1100001011010010" + "1100001111001001" + "1100010100000110" + "1010001101001101" + "1001000000000010" + "1111111111111111" + }, + /* 26*/ { BARCODE_HIBC_DM, -1, -1, -1, -1, -1, "/LAH123/NC903", 0, 16, 16, 1, "HIBC/PAS Section 2.2 Surgical Instrument, same", + "1010101010101010" + "1001010001010001" + "1110010100000100" + "1000001100000011" + "1110001100101000" + "1000111111100001" + "1011001110000100" + "1100110000001101" + "1000001110010000" + "1011001110111111" + "1001011010011010" + "1111000110111011" + "1010010101000100" + "1011001110110101" + "1100000101010010" + "1111111111111111" + }, + /* 27*/ { BARCODE_DATAMATRIX, DATA_MODE, 3, -1, -1, -1, "\101\300", 0, 12, 12, 1, "AÀ", + "101010101010" + "100010101111" + "100001011110" + "110000010001" + "101100110000" + "110010100111" + "101011011100" + "110100111101" + "101100110100" + "101011100101" + "100011011010" + "111111111111" + }, + /* 28*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 26, -1, -1, -1, "AÀ", 0, 14, 14, 1, "AÀ", + "10101010101010" + "10001010100001" + "10110101100100" + "10110001000101" + "10111000100010" + "11101011110011" + "10011100001100" + "10001100101111" + "10110110111110" + "10000111010001" + "10000001111000" + "11110100110001" + "11000110001100" + "11111111111111" + }, + /* 29*/ { BARCODE_DATAMATRIX, UNICODE_MODE, -1, -1, -1, -1, "abcdefgh+", 0, 14, 14, 0, "TEX last_shift 2, symbols_left 1, process_p 1; BWIPP different encodation (does not use 0 padded Text)", + "10101010101010" + "10100110111011" + "10110010100010" + "10011000100101" + "11101000000000" + "11000110110111" + "11000010110100" + "10101011010111" + "10111110000100" + "11011001001111" + "11110111100000" + "11001011110101" + "10010111010100" + "11111111111111" + }, }; int data_size = ARRAY_SIZE(data); + char escaped[1024]; + char bwipp_buf[8192]; + char bwipp_msg[1024]; + for (int i = 0; i < data_size; i++) { if (index != -1 && i != index) continue; @@ -446,15 +1029,16 @@ static void test_encode(int index, int generate, int debug) { struct zint_symbol *symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - int length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, -1 /*eci*/, -1 /*option_1*/, -1, -1, -1 /*output_options*/, data[i].data, -1, debug); + int length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, data[i].eci, -1 /*option_1*/, data[i].option_2, data[i].option_3, data[i].output_options, data[i].data, -1, debug); ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length); assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret); if (generate) { - printf(" /*%3d*/ { %s, %s, \"%s\", %s, %d, %d, \"%s\",\n", - i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), - data[i].data, testUtilErrorName(data[i].ret), symbol->rows, symbol->width, data[i].comment); + printf(" /*%3d*/ { %s, %s, %d, %s, %d, %s, \"%s\", %s, %d, %d, %d, \"%s\",\n", + i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), data[i].eci, testUtilOutputOptionsName(data[i].output_options), + data[i].option_2, testUtilOption3Name(data[i].option_3), testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), + testUtilErrorName(data[i].ret), symbol->rows, symbol->width, data[i].bwipp_cmp, data[i].comment); testUtilModulesDump(symbol, " ", "\n"); printf(" },\n"); } else { @@ -462,10 +1046,21 @@ static void test_encode(int index, int generate, int debug) { assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data); 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 == 0) { - int width, row; - ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); - assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); + int width, row; + ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); + assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); + + if (do_bwipp && testUtilCanBwipp(i, symbol, -1, data[i].option_2, data[i].option_3, debug)) { + if (!data[i].bwipp_cmp) { + if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d %s not BWIPP compatible (%s)\n", i, testUtilBarcodeName(symbol->symbology), data[i].comment); + } else { + ret = testUtilBwipp(i, symbol, -1, data[i].option_2, data[i].option_3, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); + assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); + + ret = testUtilBwippCmp(symbol, bwipp_msg, bwipp_buf, data[i].expected); + assert_zero(ret, "i:%d %s testUtilBwippCmp %d != 0 %s\n actual: %s\nexpected: %s\n", + i, testUtilBarcodeName(symbol->symbology), ret, bwipp_msg, bwipp_buf, data[i].expected); + } } } } @@ -481,6 +1076,8 @@ int main(int argc, char *argv[]) { testFunction funcs[] = { /* name, func, has_index, has_generate, has_debug */ { "test_large", test_large, 1, 0, 1 }, { "test_buffer", test_buffer, 1, 0, 1 }, + { "test_options", test_options, 1, 0, 1 }, + { "test_reader_init", test_reader_init, 1, 1, 1 }, { "test_input", test_input, 1, 1, 1 }, { "test_encode", test_encode, 1, 1, 1 }, }; diff --git a/backend/tests/test_gs1.c b/backend/tests/test_gs1.c index 8db0009f..d9ff1824 100644 --- a/backend/tests/test_gs1.c +++ b/backend/tests/test_gs1.c @@ -213,7 +213,7 @@ static void test_gs1_reduce(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, -1, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, -1, -1, -1, debug)) { ret = testUtilBwipp(i, symbol, -1, -1, -1, text, length, symbol->primary, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); diff --git a/backend/tests/test_imail.c b/backend/tests/test_imail.c index aaf3ec8f..fb501e25 100644 --- a/backend/tests/test_imail.c +++ b/backend/tests/test_imail.c @@ -267,7 +267,7 @@ static void test_encode(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, -1, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, -1, -1, -1, debug)) { ret = testUtilBwipp(i, symbol, -1, -1, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); diff --git a/backend/tests/test_medical.c b/backend/tests/test_medical.c index 76e81785..36cdc056 100644 --- a/backend/tests/test_medical.c +++ b/backend/tests/test_medical.c @@ -283,7 +283,7 @@ static void test_encode(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, data[i].option_2, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, -1, data[i].option_2, -1, debug)) { ret = testUtilBwipp(i, symbol, -1, data[i].option_2, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); diff --git a/backend/tests/test_pdf417.c b/backend/tests/test_pdf417.c index d94fd103..af2a1b5e 100644 --- a/backend/tests/test_pdf417.c +++ b/backend/tests/test_pdf417.c @@ -186,7 +186,7 @@ static void test_input(int index, int generate, int debug) { char *comment; }; // é U+00E9 (\351, 233), UTF-8 C3A9 - // β U+03B2 in ISO 8859-7 Greek (but not other ISO 8859 or Win page), in Shift JIS 0x83C0, UTF-8 CEB2 + // β U+03B2 in ISO 8859-7 Greek (but not other ISO 8859 or Win page) (\342, 226), UTF-8 CEB2 struct item data[] = { /* 0*/ { BARCODE_PDF417, UNICODE_MODE, -1, "é", 0, 0, 6, 103, "(12) 4 913 233 900 398 878 279 350 217 295 231 77", "" }, /* 1*/ { BARCODE_PDF417, UNICODE_MODE, 3, "é", 0, 3, 7, 103, "(14) 6 927 3 913 233 900 162 81 551 529 607 384 164 108", "" }, @@ -261,6 +261,7 @@ static void test_encode(int index, int generate, int debug) { int ret; struct item { int symbology; + int eci; int input_mode; int option_1; int option_2; @@ -274,7 +275,7 @@ static void test_encode(int index, int generate, int debug) { char *expected; }; struct item data[] = { - /* 0*/ { BARCODE_PDF417, UNICODE_MODE, 1, 2, "PDF417 Symbology Standard", 0, 10, 103, 0, "ISO 15438:2015 Figure 1, same, BWIPP uses different encodation, same codeword count", + /* 0*/ { BARCODE_PDF417, -1, UNICODE_MODE, 1, 2, "PDF417 Symbology Standard", 0, 10, 103, 0, "ISO 15438:2015 Figure 1, same, BWIPP uses different encodation, same codeword count", "1111111101010100011101010011100000111010110011110001110111011001100011110101011110000111111101000101001" "1111111101010100011111010100110000110100001110001001111010001010000011111010100110000111111101000101001" "1111111101010100011101010111111000101100110111100001110111111000101011010100111110000111111101000101001" @@ -286,14 +287,14 @@ static void test_encode(int index, int generate, int debug) { "1111111101010100011010011011111100110000101001111101101111100010001010100110011111000111111101000101001" "1111111101010100010100011000001100100010111101111001100011100011001011010001100011100111111101000101001" }, - /* 1*/ { BARCODE_PDF417, UNICODE_MODE, 1, 2, "PDF417", 0, 5, 103, 1, "ISO 15438:2015 Annex Q example for generating ECC", + /* 1*/ { BARCODE_PDF417, -1, UNICODE_MODE, 1, 2, "PDF417", 0, 5, 103, 1, "ISO 15438:2015 Annex Q example for generating ECC", "1111111101010100011110101011110000110101000110000001110111011001100011110101011110000111111101000101001" "1111111101010100011111101010011100110100001110001001111010001010000011111101010111000111111101000101001" "1111111101010100011101010111111000101100110011110001100011111001001011101010011111100111111101000101001" "1111111101010100010101111001111000101011101110000001100001101000100010101111001111000111111101000101001" "1111111101010100011101011100011000100001101011111101111110110001011011101011100110000111111101000101001" }, - /* 2*/ { BARCODE_PDF417, UNICODE_MODE, 0, 1, "ABCDEFGHIJKLMNOPQRSTUVWXYZ ", 0, 17, 86, 1, "Text Compaction Alpha", + /* 2*/ { BARCODE_PDF417, -1, UNICODE_MODE, 0, 1, "ABCDEFGHIJKLMNOPQRSTUVWXYZ ", 0, 17, 86, 1, "Text Compaction Alpha", "11111111010101000111110101001111101101011001110000011101010111000000111111101000101001" "11111111010101000111111010101110001111110101011100011110101000100000111111101000101001" "11111111010101000110101011111000001010011001111100011101010111111000111111101000101001" @@ -312,7 +313,7 @@ static void test_encode(int index, int generate, int debug) { "11111111010101000110010110111000001100011000100001011100101000111000111111101000101001" "11111111010101000101000111100100001110000101100010010100011110000100111111101000101001" }, - /* 3*/ { BARCODE_PDF417, UNICODE_MODE, 1, 1, "abcdefghijklmnopqrstuvwxyz ", 0, 19, 86, 1, "Text Compaction Lower", + /* 3*/ { BARCODE_PDF417, -1, UNICODE_MODE, 1, 1, "abcdefghijklmnopqrstuvwxyz ", 0, 19, 86, 1, "Text Compaction Lower", "11111111010101000110101000110000001101011001110000011101010111000000111111101000101001" "11111111010101000111110101001100001100000101110010011111010100011000111111101000101001" "11111111010101000110101011111000001111101011110110011010100111110000111111101000101001" @@ -333,14 +334,14 @@ static void test_encode(int index, int generate, int debug) { "11111111010101000111111001011101101010000001001111010010111001111110111111101000101001" "11111111010101000111011010000110001000100111001110011110110100111000111111101000101001" }, - /* 4*/ { BARCODE_PDF417, UNICODE_MODE, 1, 4, "0123456&\015\011,:#-.$/+%*=^ 789", 0, 5, 137, 1, "Text Compaction Mixed", + /* 4*/ { BARCODE_PDF417, -1, UNICODE_MODE, 1, 4, "0123456&\015\011,:#-.$/+%*=^ 789", 0, 5, 137, 1, "Text Compaction Mixed", "11111111010101000111101010111100001110101100111100010000110111001100110101111001111101010001110111000011101010011100000111111101000101001" "11111111010101000111111010100111001010001111000001011101101111001100110110011110010001110010000011010011111101010111000111111101000101001" "11111111010101000110101001111100001100111010000111011011110010110000100000101011110001101111101010000011101010011111100111111101000101001" "11111111010101000101011110011110001000010000100001010010011000011000110010000100110001000011000110010010101111101111100111111101000101001" "11111111010101000111010111000110001001111001001111010000101111101100100011110010111101001111110110111011101011100110000111111101000101001" }, - /* 5*/ { BARCODE_PDF417, UNICODE_MODE, 3, 2, ";<>@[\\]_'~!\015\011,:\012-.$/\"|*()?{", 0, 16, 103, 1, "Text Compaction Punctuation", + /* 5*/ { BARCODE_PDF417, -1, UNICODE_MODE, 3, 2, ";<>@[\\]_'~!\015\011,:\012-.$/\"|*()?{", 0, 16, 103, 1, "Text Compaction Punctuation", "1111111101010100011111010100111110111010110011110001000111011100100011110101011110000111111101000101001" "1111111101010100011111010100001100111111010101110001101011111101111011110101000100000111111101000101001" "1111111101010100011101010111111000101000001000111101011011001111000011010100001111100111111101000101001" @@ -358,26 +359,26 @@ static void test_encode(int index, int generate, int debug) { "1111111101010100011101000011111010111111010001101001011000010011100010010101111000000111111101000101001" "1111111101010100011001011011100000110011001100001101100100101100000011110010100011110111111101000101001" }, - /* 6*/ { BARCODE_PDF417, UNICODE_MODE, 2, 3, "12345678901234", 0, 5, 120, 1, "Numeric Compaction", + /* 6*/ { BARCODE_PDF417, -1, UNICODE_MODE, 2, 3, "12345678901234", 0, 5, 120, 1, "Numeric Compaction", "111111110101010001111010101111000011101010001110000100111101111010001001011100001110011111010101111100111111101000101001" "111111110101010001111110101000111011010000001110010111111011010011001111010100000010011111101010111000111111101000101001" "111111110101010001010100111100000010111000110011100101110011000011101110001111110101011101010001111110111111101000101001" "111111110101010001010111100111100010001100001100010100001100011101101110101100111100011010111100111110111111101000101001" "111111110101010001110101110000110011000000101110010110001001110000101011001000111111011101011100110000111111101000101001" }, - /* 7*/ { BARCODE_PDF417, UNICODE_MODE, 1, 4, "\177\177\177\177\177\177\177\177\177\177\177", 0, 4, 137, 1, "Byte Compaction", + /* 7*/ { BARCODE_PDF417, -1, UNICODE_MODE, 1, 4, "\177\177\177\177\177\177\177\177\177\177\177", 0, 4, 137, 1, "Byte Compaction", "11111111010101000111101010111100001101011011100000010000010000100010111001001100111101000010100001000011101010011100000111111101000101001" "11111111010101000111110101001100001110010000111011010100111110000110111101001100001101111101000100011011111101010111000111111101000101001" "11111111010101000110101001111100001010000001011110010100000010111100101000000101111001010000001011110011010100111110000111111101000101001" "11111111010101000101011110011110001010001000001000011011000010100000111000110001001101100111000110010010101111101111100111111101000101001" }, - /* 8*/ { BARCODE_PDF417, UNICODE_MODE, 1, 4, "\177\177\177\177\177\177\177\177\177\177\177\177", 0, 4, 137, 1, "Byte Compaction, mod 6 == 0 (924 emitted)", + /* 8*/ { BARCODE_PDF417, -1, UNICODE_MODE, 1, 4, "\177\177\177\177\177\177\177\177\177\177\177\177", 0, 4, 137, 1, "Byte Compaction, mod 6 == 0 (924 emitted)", "11111111010101000111101010111100001101011011100000011000111000110100111001001100111101000010100001000011101010011100000111111101000101001" "11111111010101000111110101001100001110010000111011010100111110000110111101001100001101111001010010000011111101010111000111111101000101001" "11111111010101000110101001111100001001110000100110010011000100001110101000011001111101101000101111100011010100111110000111111101000101001" "11111111010101000101011110011110001101000100011000010011000111001100110001100001000101110100010111000010101111101111100111111101000101001" }, - /* 9*/ { BARCODE_PDF417, UNICODE_MODE, -1, 5, "ABCDEF1234567890123\177\177\177\177VWXYZ", 0, 6, 154, 1, "Text, Numeric, Byte, Text", + /* 9*/ { BARCODE_PDF417, -1, UNICODE_MODE, -1, 5, "ABCDEF1234567890123\177\177\177\177VWXYZ", 0, 6, 154, 1, "Text, Numeric, Byte, Text", "1111111101010100011110101011110000110101110111100001111010101111000010100111001110000110100000101100001001111011110100011110101001111000111111101000101001" "1111111101010100011110101000010000111101011001100001010011110000100011111100011101010110000010111000101111001011011000011111101010111000111111101000101001" "1111111101010100011101010011111100110011111101100101010000001011110010100000010111100101000000101111001010000001011110010101000011110000111111101000101001" @@ -385,7 +386,7 @@ static void test_encode(int index, int generate, int debug) { "1111111101010100011010111000001000101111110101100001011111101011000011001011111001110111100100100100001011111101011000011101011100110000111111101000101001" "1111111101010100011111010111100110110111110110011001101001011111000010101110011111100100100001000111101011000000101110011110101111101100111111101000101001" }, - /* 10*/ { BARCODE_PDF417COMP, UNICODE_MODE, 1, 2, "PDF417 APK", 0, 6, 69, 0, "ISO 15438:2015 Figure G.1, same, BWIPP uses different encodation, same codeword count", + /* 10*/ { BARCODE_PDF417COMP, -1, UNICODE_MODE, 1, 2, "PDF417 APK", 0, 6, 69, 0, "ISO 15438:2015 Figure G.1, same, BWIPP uses different encodation, same codeword count", "111111110101010001111010101111000011010100001100000111011101100110001" "111111110101010001111010100010000011010000111000100111101000101000001" "111111110101010001110101011111100010110011011110000100111110011000101" @@ -393,7 +394,7 @@ static void test_encode(int index, int generate, int debug) { "111111110101010001111010111000111011011000001111010110010011101000001" "111111110101010001111010111101000011110100111101000110010010011111001" }, - /* 11*/ { BARCODE_PDF417COMP, UNICODE_MODE, 4, 4, "ABCDEFG", 0, 10, 103, 1, "", + /* 11*/ { BARCODE_PDF417COMP, -1, UNICODE_MODE, 4, 4, "ABCDEFG", 0, 10, 103, 1, "", "1111111101010100011101010011100000110101000011000001111010101111000010100111001110000110100000101100001" "1111111101010100011110101000000100110100000011100101011111101011000010111111010110000101111110101100001" "1111111101010100011010100111110000101111001100011001000001111010100010011111001100100111001011111001001" @@ -405,7 +406,7 @@ static void test_encode(int index, int generate, int debug) { "1111111101010100010100110011111000100110000110111101100111000010111010010001011110000110011111010001001" "1111111101010100010100011000001100110001101010000001100011000110011011001001101110000111110111110101001" }, - /* 12*/ { BARCODE_HIBC_PDF, UNICODE_MODE, -1, 3, "H123ABC01234567890D", 0, 8, 120, 0, "BWIPP uses different encodation, same codeword count but zint half-pad shorter", + /* 12*/ { BARCODE_HIBC_PDF, -1, UNICODE_MODE, -1, 3, "H123ABC01234567890D", 0, 8, 120, 0, "BWIPP uses different encodation, same codeword count but zint half-pad shorter", "111111110101010001111101010111110011101011001111000100000100010010001110001110100010011111010101111100111111101000101001" "111111110101010001111110101000111011110000010001010110101111110111101111100011101101011110101001000000111111101000101001" "111111110101010001010100111100000011111010111101100100001111000101001100101000011111011101010001111110111111101000101001" @@ -415,7 +416,7 @@ static void test_encode(int index, int generate, int debug) { "111111110101010001110100111011111010100110001100000110100011100111101111010010111100011101001110111110111111101000101001" "111111110101010001111101001011000011100001001100100111010000011001001111011000110100010101111110111000111111101000101001" }, - /* 13*/ { BARCODE_HIBC_PDF, UNICODE_MODE, 1, 3, "A123BJC5D6E71", 0, 6, 120, 1, "BWIPP example", + /* 13*/ { BARCODE_HIBC_PDF, -1, UNICODE_MODE, 1, 3, "A123BJC5D6E71", 0, 6, 120, 1, "BWIPP example", "111111110101010001111010101111000011110101101111100100000100010010001000011011100110011111010101111100111111101000101001" "111111110101010001111010100010000011110000010001010110101111110111101111000001000101011111101010111000111111101000101001" "111111110101010001010100111100000010110001100011110101111110111101101000111100011011010101000111100000111111101000101001" @@ -423,7 +424,7 @@ static void test_encode(int index, int generate, int debug) { "111111110101010001111010111000111011010111110011100110100000011100101111110101000111011101011100110000111111101000101001" "111111110101010001111101011110110010011100110011100100011110110011001011001011100000011110101111000100111111101000101001" }, - /* 14*/ { BARCODE_MICROPDF417, UNICODE_MODE, -1, 1, "ABCDEFGHIJKLMNOPQRSTUV", 0, 20, 38, 1, "ISO 24728:2006 Figure 1 1st 1x20, same", + /* 14*/ { BARCODE_MICROPDF417, -1, UNICODE_MODE, -1, 1, "ABCDEFGHIJKLMNOPQRSTUV", 0, 20, 38, 1, "ISO 24728:2006 Figure 1 1st 1x20, same", "11110101001000011000110010011110101001" "11100101001111110101011100011100101001" "11101101001010011001111100011101101001" @@ -445,7 +446,7 @@ static void test_encode(int index, int generate, int debug) { "11011101001111011111011010011011101001" "11011001001100010001110100011011001001" }, - /* 15*/ { BARCODE_MICROPDF417, UNICODE_MODE, -1, 2, "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD", 0, 20, 55, 1, "ISO 24728:2006 Figure 1 2nd 2x20, same", + /* 15*/ { BARCODE_MICROPDF417, -1, UNICODE_MODE, -1, 2, "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD", 0, 20, 55, 1, "ISO 24728:2006 Figure 1 2nd 2x20, same", "1111010100100001100011001001111010101111000011110101001" "1110010100110101111110111101111101000100110011100101001" "1110110100101101100111100001011001110011111011101101001" @@ -467,7 +468,7 @@ static void test_encode(int index, int generate, int debug) { "1101110100111010110011110001000001001101100011011101001" "1101100100111100110110100001001001111001000011011001001" }, - /* 16*/ { BARCODE_MICROPDF417, UNICODE_MODE, -1, 3, "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN", 0, 20, 82, 1, "ISO 24728:2006 Figure 1 3rd 3x20", + /* 16*/ { BARCODE_MICROPDF417, -1, UNICODE_MODE, -1, 3, "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN", 0, 20, 82, 1, "ISO 24728:2006 Figure 1 3rd 3x20", "1100100010100001100011001001011110010111101010111100001010011100111000011100101101" "1110100010111110100010011001011110110101000011111001101001011110010000011000101101" "1110110010111100010111101001001110110110111011001111001001100001000111011000101001" @@ -489,7 +490,7 @@ static void test_encode(int index, int generate, int debug) { "1111010100101111011110100001011001000111110011010111101011110111110110011010000101" "1110010100110010001111011001011001100111000010111011001110001011100110011011000101" }, - /* 17*/ { BARCODE_MICROPDF417, UNICODE_MODE, -1, 4, "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB", 0, 20, 99, 1, "ISO 24728:2006 Figure 1 4th 4x20, same", + /* 17*/ { BARCODE_MICROPDF417, -1, UNICODE_MODE, -1, 4, "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB", 0, 20, 99, 1, "ISO 24728:2006 Figure 1 4th 4x20, same", "110010001010000110001100100111101010111100001011110010101001110011100001101000001011000011100101101" "111010001010100001111100110100101111001000001011110110111011011110011001101100111100100011000101101" "111011001010011000010001110110011101000011101001110110110111100101100001000001010111100011000101001" @@ -511,7 +512,7 @@ static void test_encode(int index, int generate, int debug) { "111101010011100011101010000110001011101111001011001000111110111101011001100101110111100011010000101" "111001010010001000001111010111100010100001001011001100100111101101111101001110100111110011011000101" }, - /* 18*/ { BARCODE_MICROPDF417, UNICODE_MODE, -1, 1, "123456789012345", 0, 14, 38, 1, "Number Compaction", + /* 18*/ { BARCODE_MICROPDF417, -1, UNICODE_MODE, -1, 1, "123456789012345", 0, 14, 38, 1, "Number Compaction", "11101110101011111101001100011101110101" "11100110101110101011111100011100110101" "11110110101000001011001100011110110101" @@ -527,7 +528,7 @@ static void test_encode(int index, int generate, int debug) { "11100101001101011110000110011100101001" "11101101001101000111111001011101101001" }, - /* 19*/ { BARCODE_MICROPDF417, UNICODE_MODE, -1, 2, "\177\177\177", 0, 8, 55, 1, "Byte Compaction", + /* 19*/ { BARCODE_MICROPDF417, -1, UNICODE_MODE, -1, 2, "\177\177\177", 0, 8, 55, 1, "Byte Compaction", "1100100010100000100001000101010000010010000011001000101" "1110100010111110100010001101111101000100011011101000101" "1110110010110001111100100101100011111001001011101100101" @@ -537,7 +538,7 @@ static void test_encode(int index, int generate, int debug) { "1100111010111001111001100101000001001101100011001110101" "1110111010111000101111011101110001000011010011101110101" }, - /* 20*/ { BARCODE_MICROPDF417, UNICODE_MODE, -1, 2, "\177\177\177\177\177\177", 0, 8, 55, 1, "Byte Compaction, mod 6 == 0 (924 emitted)", + /* 20*/ { BARCODE_MICROPDF417, -1, UNICODE_MODE, -1, 2, "\177\177\177\177\177\177", 0, 8, 55, 1, "Byte Compaction, mod 6 == 0 (924 emitted)", "1100100010110001110001101001110010011001111011001000101" "1110100010100010001111010001110010000111011011101000101" "1110110010101000011001111101101000101111100011101100101" @@ -547,7 +548,7 @@ static void test_encode(int index, int generate, int debug) { "1100111010100100010000100001110111101100001011001110101" "1110111010111110011010100001101100001111010011101110101" }, - /* 21*/ { BARCODE_MICROPDF417, UNICODE_MODE, -1, 3, "ABCDEFG\177\177\177", 0, 8, 82, 1, "Text & Byte Compaction", + /* 21*/ { BARCODE_MICROPDF417, -1, UNICODE_MODE, -1, 3, "ABCDEFG\177\177\177", 0, 8, 82, 1, "Text & Byte Compaction", "1100111010100001100011001001000010110111101010111100001010011100111000011001110101" "1110111010111110100010011001000010010110100000011100101101111110101110011101110101" "1110011010101000000101111001000011010101000000101111001010000001011110011100110101" @@ -557,7 +558,7 @@ static void test_encode(int index, int generate, int debug) { "1100001010111110111010111001001100010110011100011000101101100001100110011000010101" "1100011010110100011100001001001110010110110000111101001100011011110010011000110101" }, - /* 22*/ { BARCODE_MICROPDF417, UNICODE_MODE, -1, 4, "\177\177\177abcdefgh1234567890123", 0, 8, 99, 1, "Byte & Text & Numeric Compaction", + /* 22*/ { BARCODE_MICROPDF417, -1, UNICODE_MODE, -1, 4, "\177\177\177abcdefgh1234567890123", 0, 8, 99, 1, "Byte & Text & Numeric Compaction", "110011101010000010000100010101000001001000001000010110101000001001000001010000010010000011001110101" "111011101010111111010110000110000010111001001000010010111101011100111001110100111001100011101110101" "111001101011111001011110110101100110011110001000011010100001111000101001111110101100010011100110101" @@ -567,7 +568,7 @@ static void test_encode(int index, int generate, int debug) { "110000101011000011010000100100000101101100001001100010101110111110111001111001110010110011000010101" "110001101011101110111100010100100011110100001001110010100000101111000101111001010010000011000110101" }, - /* 23*/ { BARCODE_HIBC_MICPDF, UNICODE_MODE, -1, 4, "H123ABC01234567890D", 0, 8, 99, 0, "BWIPP uses different encodation, same codeword count but zint full-pad shorter", + /* 23*/ { BARCODE_HIBC_MICPDF, -1, UNICODE_MODE, -1, 4, "H123ABC01234567890D", 0, 8, 99, 0, "BWIPP uses different encodation, same codeword count but zint full-pad shorter", "110011101010000110001100100100000100010010001000010110111000111010001001000001001100011011001110101" "111011101011010111111011110111110001110110101000010010111101011100111001011111101001100011101110101" "111001101011001010000111110100011110101000001000011010100111110001101001011011000111100011100110101" @@ -577,7 +578,7 @@ static void test_encode(int index, int generate, int debug) { "110000101010110110001000000111000101100111101001100010110111101110000101100010101100000011000010101" "110001101011110110000011010111100100001101101001110010101101011111100001111001000110011011000110101" }, - /* 24*/ { BARCODE_HIBC_MICPDF, UNICODE_MODE, -1, 1, "/EAH783", 0, 17, 38, 1, "HIBC Provider Applications Standard (PAS) example", + /* 24*/ { BARCODE_HIBC_MICPDF, -1, UNICODE_MODE, -1, 1, "/EAH783", 0, 17, 38, 1, "HIBC Provider Applications Standard (PAS) example", "11001101001100011111001001011001101001" "11011101001000001000100100011011101001" "11011001001000100011110100011011001001" @@ -596,6 +597,31 @@ static void test_encode(int index, int generate, int debug) { "11010000101101100100001111011010000101" "11011000101110111000100010011011000101" }, + /* 25*/ { BARCODE_PDF417, 9, DATA_MODE, -1, -1, "\342", 0, 7, 103, 1, "β", + "1111111101010100011111010101111100110101000110000001100011100011001011110101011110000111111101000101001" + "1111111101010100011111010100011000111110101000011001011111100100011011110101001000000111111101000101001" + "1111111101010100011101010111111000110110010011110001100011111001001011010100011111000111111101000101001" + "1111111101010100011010111100111110100110011100110001010001100001100010101111001111000111111101000101001" + "1111111101010100011010111000010000110110001111000101111110010010111011110101110011100111111101000101001" + "1111111101010100011110101111010000100011110001000101000110010111000011110101111000010111111101000101001" + "1111111101010100011101001110111110101110001110001001010001101100000011010011101111000111111101000101001" + }, + /* 26*/ { BARCODE_MICROPDF417, 9, DATA_MODE, -1, 1, "\342\343", 0, 14, 38, 1, "βγ", + "11101110101001111110010110011101110101" + "11100110101101010000111110011100110101" + "11110110101000001000010001011110110101" + "11110010101111001011001100011110010101" + "11100010101110110010011111011100010101" + "11000010101000011000110010011000010101" + "11000110101011111101011000011000110101" + "11000100101001111000101000011000100101" + "11100100101000100000101000011100100101" + "11110100101101110010111111011110100101" + "11110101101101100101111000011110101101" + "11110101001101011100111100011110101001" + "11100101001011100101111100011100101001" + "11101101001101001001111100011101101001" + }, }; int data_size = sizeof(data) / sizeof(struct item); @@ -610,24 +636,14 @@ static void test_encode(int index, int generate, int debug) { struct zint_symbol *symbol = ZBarcode_Create(); assert_nonnull(symbol, "Symbol not created\n"); - symbol->symbology = data[i].symbology; - symbol->input_mode = data[i].input_mode; - if (data[i].option_1 != -1) { - symbol->option_1 = data[i].option_1; - } - if (data[i].option_2 != -1) { - symbol->option_2 = data[i].option_2; - } - symbol->debug |= debug; - - int length = strlen(data[i].data); + int length = testUtilSetSymbol(symbol, data[i].symbology, data[i].input_mode, data[i].eci, data[i].option_1, data[i].option_2, -1, -1 /*output_options*/, data[i].data, -1, debug); ret = ZBarcode_Encode(symbol, (unsigned char *) data[i].data, length); assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt); if (generate) { - printf(" /*%3d*/ { %s, %s, %d, %d, \"%s\", %s, %d, %d, %d, \"%s\",\n", - i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), data[i].option_1, data[i].option_2, + printf(" /*%3d*/ { %s, %d, %s, %d, %d, \"%s\", %s, %d, %d, %d, \"%s\",\n", + i, testUtilBarcodeName(data[i].symbology), data[i].eci, testUtilInputModeName(data[i].input_mode), data[i].option_1, data[i].option_2, testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), testUtilErrorName(data[i].ret), symbol->rows, symbol->width, data[i].bwipp_cmp, data[i].comment); testUtilModulesDump(symbol, " ", "\n"); @@ -641,7 +657,7 @@ static void test_encode(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, data[i].option_1, data[i].option_2, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, data[i].option_1, data[i].option_2, -1, debug)) { if (!data[i].bwipp_cmp) { if (debug & ZINT_DEBUG_TEST_PRINT) printf("i:%d %s not BWIPP compatible (%s)\n", i, testUtilBarcodeName(symbol->symbology), data[i].comment); } else { diff --git a/backend/tests/test_postal.c b/backend/tests/test_postal.c index 6638ba6d..e766cf33 100644 --- a/backend/tests/test_postal.c +++ b/backend/tests/test_postal.c @@ -406,7 +406,7 @@ static void test_encode(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, -1, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, -1, -1, -1, debug)) { ret = testUtilBwipp(i, symbol, -1, -1, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); diff --git a/backend/tests/test_raster.c b/backend/tests/test_raster.c index 3cc32e1a..57c232de 100644 --- a/backend/tests/test_raster.c +++ b/backend/tests/test_raster.c @@ -219,7 +219,7 @@ static void test_buffer(int index, int generate, int debug) { /* 95*/ { BARCODE_HIBC_MICPDF, "1234567890", "", 28, 14, 38, 76, 56 }, /* 96*/ { BARCODE_HIBC_BLOCKF, "1234567890", "", 30, 3, 101, 242, 64 }, /* 97*/ { BARCODE_HIBC_AZTEC, "1234567890AB", "", 19, 19, 19, 38, 38 }, - /* 98*/ { BARCODE_DOTCODE, "ABC", "", 11, 11, 16, 32, 22 }, + /* 98*/ { BARCODE_DOTCODE, "ABC", "", 11, 11, 16, 33, 23 }, /* 99*/ { BARCODE_HANXIN, "1234567890AB", "", 23, 23, 23, 46, 46 }, /*100*/ { BARCODE_MAILMARK, "01000000000000000AA00AA0A", "", 10, 3, 155, 310, 20 }, /*101*/ { BARCODE_AZRUNE, "255", "", 11, 11, 11, 22, 22 }, @@ -660,35 +660,41 @@ static void test_output_options(int index, int debug) { /* 27*/ { BARCODE_QRCODE, 5, 6, BARCODE_BIND, 0, "A123", 0, 21, 21, 21, 62, 66, 1, 0, 0 }, /* 28*/ { BARCODE_QRCODE, 5, 6, BARCODE_BIND, 0, "A123", 0, 21, 21, 21, 62, 66, 0, 12, 0 }, /* 29*/ { BARCODE_QRCODE, 5, 6, BARCODE_BOX, 0, "A123", 0, 21, 21, 21, 86, 66, 1, 12, 0 }, - /* 30*/ { BARCODE_QRCODE, -1, -1, BARCODE_DOTTY_MODE, 0, "A123", 0, 21, 21, 21, 42, 42, 1, 0, 0 }, - /* 31*/ { BARCODE_QRCODE, -1, -1, BARCODE_DOTTY_MODE, 0, "A123", 0, 21, 21, 21, 42, 42, 0, 1, 1 }, - /* 32*/ { BARCODE_QRCODE, -1, 4, BARCODE_DOTTY_MODE, 0, "A123", 0, 21, 21, 21, 42, 42, 1, 0, 0 }, - /* 33*/ { BARCODE_QRCODE, -1, 4, BARCODE_BIND | BARCODE_DOTTY_MODE, 0, "A123", 0, 21, 21, 21, 42, 58, -1, -1, -1 }, // TODO: fix (bind/box in dotty mode) - /* 34*/ { BARCODE_QRCODE, 1, 4, BARCODE_BOX | BARCODE_DOTTY_MODE, 0, "A123", 0, 21, 21, 21, 62, 58, -1, -1, -1 }, // TODO: fix (bind/box in dotty mode) - /* 35*/ { BARCODE_QRCODE, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, "A123", 0, 21, 21, 21, 42, 42, 0, 2, 2 }, - /* 36*/ { BARCODE_QRCODE, -1, -1, BARCODE_DOTTY_MODE | OUT_BUFFER_INTERMEDIATE, 0, "A123", 0, 21, 21, 21, 42, 42, 1, 0, 0 }, - /* 37*/ { BARCODE_QRCODE, -1, -1, BARCODE_DOTTY_MODE | OUT_BUFFER_INTERMEDIATE, 180, "A123", 0, 21, 21, 21, 42, 42, 0, 40, 1 }, - /* 38*/ { BARCODE_MAXICODE, -1, -1, -1, 0, "A123", 0, 165, 33, 30, 300, 300, 0, 0, 0 }, - /* 39*/ { BARCODE_MAXICODE, -1, -1, -1, 270, "A123", 0, 165, 33, 30, 300, 300, 0, 0, 0 }, - /* 40*/ { BARCODE_MAXICODE, -1, 5, -1, 0, "A123", 0, 165, 33, 30, 300, 300, 0, 0, 0 }, - /* 41*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BIND, 0, "A123", 0, 165, 33, 30, 300, 320, 1, 0, 0 }, - /* 42*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BIND, 0, "A123", 0, 165, 33, 30, 300, 320, 0, 10, 0 }, - /* 43*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BOX, 0, "A123", 0, 165, 33, 30, 320, 320, 1, 10, 0 }, - /* 44*/ { BARCODE_MAXICODE, -1, -1, -1, 0, "A123", 0, 165, 33, 30, 300, 300, 1, 0, 14 }, - /* 45*/ { BARCODE_MAXICODE, 6, -1, -1, 0, "A123", 0, 165, 33, 30, 324, 300, 0, 0, 14 }, - /* 46*/ { BARCODE_MAXICODE, 6, 5, BARCODE_BIND, 0, "A123", 0, 165, 33, 30, 324, 320, 1, 10, 25 }, - /* 47*/ { BARCODE_MAXICODE, 6, 5, BARCODE_BIND, 0, "A123", 0, 165, 33, 30, 324, 320, 0, 10, 9 }, - /* 48*/ { BARCODE_MAXICODE, 6, 5, BARCODE_BOX, 0, "A123", 0, 165, 33, 30, 344, 320, 1, 10, 9 }, - /* 49*/ { BARCODE_MAXICODE, -1, -1, BARCODE_DOTTY_MODE, 0, "A123", ZINT_ERROR_INVALID_OPTION, -1, -1, -1, -1, -1, -1, -1, -1 }, - /* 50*/ { BARCODE_MAXICODE, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, "A123", 0, 165, 33, 30, 300, 300, 0, 0, 0 }, - /* 51*/ { BARCODE_MAXICODE, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, "A123", 0, 165, 33, 30, 300, 300, 1, 0, 14 }, - /* 52*/ { BARCODE_MAXICODE, -1, -1, OUT_BUFFER_INTERMEDIATE, 270, "A123", 0, 165, 33, 30, 300, 300, 0, 0, 0 }, - /* 53*/ { BARCODE_ITF14, -1, -1, -1, 0, "123", 0, 50, 1, 135, 330, 136, 1, 110, 0 }, - /* 54*/ { BARCODE_ITF14, -1, -1, -1, 90, "123", 0, 50, 1, 135, 136, 330, 1, 0, 110 }, - /* 55*/ { BARCODE_ITF14, -1, 0, -1, 0, "123", 0, 50, 1, 135, 330, 136, 1, 110, 0 }, - /* 56*/ { BARCODE_ITF14, -1, 0, BARCODE_BOX, 0, "123", 0, 50, 1, 135, 310, 116, 0, 100, 0 }, - /* 57*/ { BARCODE_ITF14, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, "123", 0, 50, 1, 135, 330, 136, 1, 110, 0 }, - /* 58*/ { BARCODE_ITF14, -1, -1, OUT_BUFFER_INTERMEDIATE, 90, "123", 0, 50, 1, 135, 136, 330, 1, 0, 110 }, + /* 30*/ { BARCODE_QRCODE, -1, -1, BARCODE_DOTTY_MODE, 0, "A123", 0, 21, 21, 21, 43, 43, 1, 1, 1 }, + /* 31*/ { BARCODE_QRCODE, -1, -1, BARCODE_DOTTY_MODE, 0, "A123", 0, 21, 21, 21, 43, 43, 0, 2, 2 }, + /* 32*/ { BARCODE_QRCODE, -1, -1, BARCODE_DOTTY_MODE, 0, "A123", 0, 21, 21, 21, 43, 43, 1, 41, 1 }, + /* 33*/ { BARCODE_QRCODE, -1, -1, BARCODE_DOTTY_MODE, 0, "A123", 0, 21, 21, 21, 43, 43, 0, 40, 2 }, + /* 34*/ { BARCODE_QRCODE, -1, 4, BARCODE_DOTTY_MODE, 0, "A123", 0, 21, 21, 21, 43, 43, 1, 1, 1 }, + /* 35*/ { BARCODE_QRCODE, -1, 4, BARCODE_DOTTY_MODE, 0, "A123", 0, 21, 21, 21, 43, 43, 0, 2, 2 }, + /* 36*/ { BARCODE_QRCODE, -1, 4, BARCODE_BIND | BARCODE_DOTTY_MODE, 0, "A123", 0, 21, 21, 21, 43, 59, -1, -1, -1 }, // TODO: fix (bind/box in dotty mode) + /* 37*/ { BARCODE_QRCODE, 1, 4, BARCODE_BOX | BARCODE_DOTTY_MODE, 0, "A123", 0, 21, 21, 21, 63, 59, -1, -1, -1 }, // TODO: fix (bind/box in dotty mode) + /* 38*/ { BARCODE_QRCODE, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, "A123", 0, 21, 21, 21, 42, 42, 1, 1, 1 }, + /* 39*/ { BARCODE_QRCODE, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, "A123", 0, 21, 21, 21, 42, 42, 0, 2, 2 }, + /* 40*/ { BARCODE_QRCODE, -1, -1, BARCODE_DOTTY_MODE | OUT_BUFFER_INTERMEDIATE, 0, "A123", 0, 21, 21, 21, 43, 43, 1, 1, 1 }, + /* 41*/ { BARCODE_QRCODE, -1, -1, BARCODE_DOTTY_MODE | OUT_BUFFER_INTERMEDIATE, 0, "A123", 0, 21, 21, 21, 43, 43, 0, 2, 2 }, + /* 42*/ { BARCODE_QRCODE, -1, -1, BARCODE_DOTTY_MODE | OUT_BUFFER_INTERMEDIATE, 180, "A123", 0, 21, 21, 21, 43, 43, 1, 41, 1 }, + /* 43*/ { BARCODE_QRCODE, -1, -1, BARCODE_DOTTY_MODE | OUT_BUFFER_INTERMEDIATE, 180, "A123", 0, 21, 21, 21, 43, 43, 0, 40, 2 }, + /* 44*/ { BARCODE_MAXICODE, -1, -1, -1, 0, "A123", 0, 165, 33, 30, 300, 300, 0, 0, 0 }, + /* 45*/ { BARCODE_MAXICODE, -1, -1, -1, 270, "A123", 0, 165, 33, 30, 300, 300, 0, 0, 0 }, + /* 46*/ { BARCODE_MAXICODE, -1, 5, -1, 0, "A123", 0, 165, 33, 30, 300, 300, 0, 0, 0 }, + /* 47*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BIND, 0, "A123", 0, 165, 33, 30, 300, 320, 1, 0, 0 }, + /* 48*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BIND, 0, "A123", 0, 165, 33, 30, 300, 320, 0, 10, 0 }, + /* 49*/ { BARCODE_MAXICODE, -1, 5, BARCODE_BOX, 0, "A123", 0, 165, 33, 30, 320, 320, 1, 10, 0 }, + /* 50*/ { BARCODE_MAXICODE, -1, -1, -1, 0, "A123", 0, 165, 33, 30, 300, 300, 1, 0, 14 }, + /* 51*/ { BARCODE_MAXICODE, 6, -1, -1, 0, "A123", 0, 165, 33, 30, 324, 300, 0, 0, 14 }, + /* 52*/ { BARCODE_MAXICODE, 6, 5, BARCODE_BIND, 0, "A123", 0, 165, 33, 30, 324, 320, 1, 10, 25 }, + /* 53*/ { BARCODE_MAXICODE, 6, 5, BARCODE_BIND, 0, "A123", 0, 165, 33, 30, 324, 320, 0, 10, 9 }, + /* 54*/ { BARCODE_MAXICODE, 6, 5, BARCODE_BOX, 0, "A123", 0, 165, 33, 30, 344, 320, 1, 10, 9 }, + /* 55*/ { BARCODE_MAXICODE, -1, -1, BARCODE_DOTTY_MODE, 0, "A123", ZINT_ERROR_INVALID_OPTION, -1, -1, -1, -1, -1, -1, -1, -1 }, + /* 56*/ { BARCODE_MAXICODE, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, "A123", 0, 165, 33, 30, 300, 300, 0, 0, 0 }, + /* 57*/ { BARCODE_MAXICODE, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, "A123", 0, 165, 33, 30, 300, 300, 1, 0, 14 }, + /* 58*/ { BARCODE_MAXICODE, -1, -1, OUT_BUFFER_INTERMEDIATE, 270, "A123", 0, 165, 33, 30, 300, 300, 0, 0, 0 }, + /* 59*/ { BARCODE_ITF14, -1, -1, -1, 0, "123", 0, 50, 1, 135, 330, 136, 1, 110, 0 }, + /* 60*/ { BARCODE_ITF14, -1, -1, -1, 90, "123", 0, 50, 1, 135, 136, 330, 1, 0, 110 }, + /* 61*/ { BARCODE_ITF14, -1, 0, -1, 0, "123", 0, 50, 1, 135, 330, 136, 1, 110, 0 }, + /* 62*/ { BARCODE_ITF14, -1, 0, BARCODE_BOX, 0, "123", 0, 50, 1, 135, 310, 116, 0, 100, 0 }, + /* 63*/ { BARCODE_ITF14, -1, -1, OUT_BUFFER_INTERMEDIATE, 0, "123", 0, 50, 1, 135, 330, 136, 1, 110, 0 }, + /* 64*/ { BARCODE_ITF14, -1, -1, OUT_BUFFER_INTERMEDIATE, 90, "123", 0, 50, 1, 135, 136, 330, 1, 0, 110 }, }; int data_size = ARRAY_SIZE(data); diff --git a/backend/tests/test_rss.c b/backend/tests/test_rss.c index 6999cf49..08f91903 100644 --- a/backend/tests/test_rss.c +++ b/backend/tests/test_rss.c @@ -164,7 +164,7 @@ static void test_binary_div_modulo_divisor(int index, int generate, int debug) { ret = ZBarcode_Buffer_Vector(symbol, 0); assert_zero(ret, "i:%d ZBarcode_Buffer_Vector ret %d != 0\n", i, ret); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, -1, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, -1, -1, -1, debug)) { ret = testUtilBwipp(i, symbol, -1, -1, -1, text, length, symbol->primary, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); @@ -663,7 +663,7 @@ static void test_examples(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, data[i].option_2, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, -1, data[i].option_2, -1, debug)) { ret = testUtilBwipp(i, symbol, -1, data[i].option_2, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); diff --git a/backend/tests/test_telepen.c b/backend/tests/test_telepen.c index 148040fb..d31fd9e0 100644 --- a/backend/tests/test_telepen.c +++ b/backend/tests/test_telepen.c @@ -258,7 +258,7 @@ static void test_encode(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, -1, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, -1, -1, -1, debug)) { ret = testUtilBwipp(i, symbol, -1, -1, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); diff --git a/backend/tests/test_upcean.c b/backend/tests/test_upcean.c index fe848226..89ca2d0b 100644 --- a/backend/tests/test_upcean.c +++ b/backend/tests/test_upcean.c @@ -696,7 +696,7 @@ static void test_encode(int index, int generate, int debug) { ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row); assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data); - if (do_bwipp && testUtilCanBwipp(symbol->symbology, -1, data[i].option_2, -1, debug)) { + if (do_bwipp && testUtilCanBwipp(i, symbol, -1, data[i].option_2, -1, debug)) { ret = testUtilBwipp(i, symbol, -1, data[i].option_2, -1, data[i].data, length, NULL, bwipp_buf, sizeof(bwipp_buf)); assert_zero(ret, "i:%d %s testUtilBwipp ret %d != 0\n", i, testUtilBarcodeName(symbol->symbology), ret); diff --git a/backend/tests/testcommon.c b/backend/tests/testcommon.c index 32165ca6..1db41a86 100644 --- a/backend/tests/testcommon.c +++ b/backend/tests/testcommon.c @@ -1427,7 +1427,7 @@ int testUtilVerifyLibreOffice(char *filename, int debug) { char cmd[512 + 128]; char svg[512]; char *slash, *dot; - char buf[32768]; + char buf[16384]; char *b = buf, *be = buf + sizeof(buf) - 1; FILE *fp; int len; @@ -1536,7 +1536,7 @@ int testUtilVerifyVnu(char *filename, int debug) { return system(buf); } -static const char *testUtilBwippName(int symbology, int option_1, int option_2, int option_3, int *linear_row_height, int *gs1_cvt) { +static const char *testUtilBwippName(int index, const struct zint_symbol *symbol, int option_1, int option_2, int option_3, int debug, int *linear_row_height, int *gs1_cvt) { struct item { const char *name; int define; @@ -1619,7 +1619,7 @@ static const char *testUtilBwippName(int symbology, int option_1, int option_2, { "", BARCODE_AUSREDIRECT, 68, 0, 0, 0, 0, 0, }, { "isbn", BARCODE_ISBNX, 69, 0, 1, 0, 0, 1 /*gs1_cvt*/, }, { "royalmail", BARCODE_RM4SCC, 70, 0, 0, 0, 0, 0, }, - { "datamatrix", BARCODE_DATAMATRIX, 71, 0, 0, 0, 0, 0, }, + { "datamatrix", BARCODE_DATAMATRIX, 71, 0, 1, 1, 0, 0, }, { "ean14", BARCODE_EAN14, 72, 0, 0, 0, 0, 1 /*gs1_cvt*/, }, { "code39", BARCODE_VIN, 73, 0, 0, 0, 0, 0, }, { "codablockf", BARCODE_CODABLOCKF, 74, 1, 1, 0, 10 /*linear_row_height*/, 0, }, @@ -1640,7 +1640,7 @@ static const char *testUtilBwippName(int symbology, int option_1, int option_2, { "itf14", BARCODE_ITF14, 89, 0, 0, 0, 0, 0, }, { "kix", BARCODE_KIX, 90, 0, 0, 0, 0, 0, }, { "", -1, 91, 0, 0, 0, 0, 0, }, - { "azteccode", BARCODE_AZTEC, 92, 0, 0, 0, 0, 0, }, + { "azteccode", BARCODE_AZTEC, 92, 0, 1, 0, 0, 0, }, { "daft", BARCODE_DAFT, 93, 0, 0, 0, 0, 0, }, { "", -1, 94, 0, 0, 0, 0, 0, }, { "", -1, 95, 0, 0, 0, 0, 0, }, @@ -1650,7 +1650,7 @@ static const char *testUtilBwippName(int symbology, int option_1, int option_2, { "hibccode39", BARCODE_HIBC_39, 99, 0, 0, 0, 0, 0, }, { "", -1, 100, 0, 0, 0, 0, 0, }, { "", -1, 101, 0, 0, 0, 0, 0, }, - { "hibcdatamatrix", BARCODE_HIBC_DM, 102, 0, 0, 0, 0, 0, }, + { "hibcdatamatrix", BARCODE_HIBC_DM, 102, 0, 1, 1, 0, 0, }, { "", -1, 103, 0, 0, 0, 0, 0, }, { "hibcqrcode", BARCODE_HIBC_QR, 104, 0, 0, 0, 0, 0, }, { "", -1, 105, 0, 0, 0, 0, 0, }, @@ -1660,7 +1660,7 @@ static const char *testUtilBwippName(int symbology, int option_1, int option_2, { "", -1, 109, 0, 0, 0, 0, 0, }, { "hibccodablockf", BARCODE_HIBC_BLOCKF, 110, 1, 1, 0, 10 /*linear_row_height*/, 0, }, { "", -1, 111, 0, 0, 0, 0, 0, }, - { "hibcazteccode", BARCODE_HIBC_AZTEC, 112, 0, 0, 0, 0, 0, }, + { "hibcazteccode", BARCODE_HIBC_AZTEC, 112, 1, 0, 1, 0, 0, }, { "", -1, 113, 0, 0, 0, 0, 0, }, { "", -1, 114, 0, 0, 0, 0, 0, }, { "dotcode", BARCODE_DOTCODE, 115, 0, 0, 0, 0, 0, }, @@ -1697,27 +1697,43 @@ static const char *testUtilBwippName(int symbology, int option_1, int option_2, }; static const int data_size = ARRAY_SIZE(data); + int symbology = symbol->symbology; + int gs1 = (symbol->input_mode & 0x07) == GS1_MODE; + if (symbology < 0 || symbology >= data_size) { - return NULL; + fprintf(stderr, "testUtilBwippName: unknown symbology (%d)\n", symbology); + abort(); } if (data[symbology].val != symbology || (data[symbology].define != -1 && data[symbology].define != symbology)) { // Self-check fprintf(stderr, "testUtilBwippName: data table out of sync (%d)\n", symbology); abort(); } if (data[symbology].name[0] == '\0') { + if (debug & ZINT_DEBUG_TEST_PRINT) { + printf("i:%d %s no BWIPP mapping\n", index, testUtilBarcodeName(symbology)); + } return NULL; } if ((option_1 != -1 && !data[symbology].can_option_1) || (option_2 != -1 && !data[symbology].can_option_2) || (option_3 != -1 && !data[symbology].can_option_3)) { + if (debug & ZINT_DEBUG_TEST_PRINT) { + printf("i:%d %s not BWIPP compatible, options not supported, option_1 %d, option_2 %d, option_3 %d\n", index, testUtilBarcodeName(symbology), option_1, option_2, option_3); + } return NULL; } if (symbology == BARCODE_CODE11) { if (option_2 != 1 && option_2 != 2) { /* 2 check digits (Zint default) not supported */ + if (debug & ZINT_DEBUG_TEST_PRINT) { + printf("i:%d %s not BWIPP compatible, 2 check digits not supported, option_1 %d, option_2 %d\n", index, testUtilBarcodeName(symbology), option_1, option_2); + } return NULL; } } else if (symbology == BARCODE_CODABLOCKF || symbology == BARCODE_HIBC_BLOCKF) { if (option_1 == 1) { /* Single row i.e. CODE128 not supported */ + if (debug & ZINT_DEBUG_TEST_PRINT) { + printf("i:%d %s not BWIPP compatible, single row not supported, option_1 %d\n", index, testUtilBarcodeName(symbology), option_1); + } return NULL; } } @@ -1728,19 +1744,31 @@ static const char *testUtilBwippName(int symbology, int option_1, int option_2, if (gs1_cvt) { *gs1_cvt = data[symbology].gs1_cvt; } + if (gs1) { + if (symbology == BARCODE_DATAMATRIX) { + if (symbol->output_options & GS1_GS_SEPARATOR) { /* Not supported */ + if (debug & ZINT_DEBUG_TEST_PRINT) { + printf("i:%d %s not BWIPP compatible, GS1_GS_SEPARATOR not supported\n", index, testUtilBarcodeName(symbology)); + } + return NULL; + } + if (gs1_cvt) { + *gs1_cvt = 1; + } + return "gs1datamatrix"; + } else if (symbology == BARCODE_AZTEC) { + if (debug & ZINT_DEBUG_TEST_PRINT) { + printf("i:%d %s not BWIPP compatible, GS1_MODE not supported\n", index, testUtilBarcodeName(symbology)); + } + return NULL; + } + } return data[symbology].name; } -int testUtilCanBwipp(int symbology, int option_1, int option_2, int option_3, int debug) { - if (testUtilBwippName(symbology, option_1, option_2, option_3, NULL, NULL) != NULL) { - return 1; - } - if (debug & ZINT_DEBUG_TEST_PRINT) { - printf("testUtilCanBwipp: not supported %s, option_1 %d, option_2 %d, option_3 %d\n", testUtilBarcodeName(symbology), option_1, option_2, option_3); - } - - return 0; +int testUtilCanBwipp(int index, const struct zint_symbol *symbol, int option_1, int option_2, int option_3, int debug) { + return testUtilBwippName(index, symbol, option_1, option_2, option_3, debug, NULL, NULL) != NULL; } static void testUtilBwippCvtGS1Data(char *bwipp_data, int upcean, int *addon_posn) { @@ -1763,21 +1791,59 @@ static void testUtilBwippCvtGS1Data(char *bwipp_data, int upcean, int *addon_pos } } -static char *testUtilBwippEscape(char *bwipp_data, int bwipp_data_size, const char *data, int length, int *parse) { +static char *testUtilBwippEscape(char *bwipp_data, int bwipp_data_size, const char *data, int length, int zint_escape_mode, int eci, int *parse, int *parsefnc) { char *b = bwipp_data; char *be = b + bwipp_data_size; unsigned char *d = (unsigned char *) data; unsigned char *de = (unsigned char *) data + length; - *parse = 0; + *parse = *parsefnc = 0; + + if (eci) { + sprintf(bwipp_data, "^ECI%06d", eci); + *parsefnc = 1; + b = bwipp_data + 10; + } while (b < be && d < de) { /* Have to escape double quote otherwise Ghostscript gives "Unterminated quote in @-file" for some reason */ /* Escape single quote also to avoid having to do proper shell escaping TODO: proper shell escaping */ if (*d < 0x20 || *d >= 0x7F || *d == '^' || *d == '"' || *d == '\'') { + if (b + 4 >= be) { + fprintf(stderr, "testUtilBwippEscape: bwipp_data buffer full\n"); + return NULL; + } sprintf(b, "^%03u", *d++); b += 4; *parse = 1; + } else if (zint_escape_mode && *d == '\\' && d + 1 < de) { + int val; + switch (*++d) { + case '0': val = 0x00; /* Null */ break; + case 'E': val = 0x04; /* End of Transmission */ break; + case 'a': val = 0x07; /* Bell */ break; + case 'b': val = 0x08; /* Backspace */ break; + case 't': val = 0x09; /* Horizontal tab */ break; + case 'n': val = 0x0a; /* Line feed */ break; + case 'v': val = 0x0b; /* Vertical tab */ break; + case 'f': val = 0x0c; /* Form feed */ break; + case 'r': val = 0x0d; /* Carriage return */ break; + case 'e': val = 0x1b; /* Escape */ break; + case 'G': val = 0x1d; /* Group Separator */ break; + case 'R': val = 0x1e; /* Record Separator */ break; + //case 'x': val = 0; /* TODO: implement */ break; + case '\\': val = '\\'; break; + //case 'u': val = 0; /* TODO: implement */ break; + default: fprintf(stderr, "testUtilBwippEscape: unknown escape %c\n", *d); return NULL; break; + } + if (b + 4 >= be) { + fprintf(stderr, "testUtilBwippEscape: bwipp_data buffer full\n"); + return NULL; + } + sprintf(b, "^%03d", val); + b += 4; + d++; + *parse = 1; } else { *b++ = *d++; } @@ -1838,7 +1904,7 @@ int testUtilBwipp(int index, const struct zint_symbol *symbol, int option_1, int char *b = buffer; char *be = buffer + buffer_size; int r, h; - int parse; + int parse, parsefnc; int upcean = is_extendable(symbology); int upca = symbology == BARCODE_UPCA || symbology == BARCODE_UPCA_CHK || symbology == BARCODE_UPCA_CC; @@ -1846,7 +1912,7 @@ int testUtilBwipp(int index, const struct zint_symbol *symbol, int option_1, int bwipp_data[0] = bwipp_opts_buf[0] = '\0'; - bwipp_barcode = testUtilBwippName(symbology, option_1, option_2, option_3, &linear_row_height, &gs1_cvt); + bwipp_barcode = testUtilBwippName(index, symbol, option_1, option_2, option_3, 0, &linear_row_height, &gs1_cvt); if (!bwipp_barcode) { fprintf(stderr, "i:%d testUtilBwipp: no mapping for %s, option_1 %d, option_2 %d, option_3 %d\n", index, testUtilBarcodeName(symbology), option_1, option_2, option_3); return -1; @@ -1924,11 +1990,18 @@ int testUtilBwipp(int index, const struct zint_symbol *symbol, int option_1, int } } } else { - testUtilBwippEscape(bwipp_data, sizeof(bwipp_data), data, data_len, &parse); + int eci = symbol->eci >= 3 && ZBarcode_Cap(symbology, ZINT_CAP_ECI) ? symbol->eci : 0; + if (testUtilBwippEscape(bwipp_data, sizeof(bwipp_data), data, data_len, symbol->input_mode & ESCAPE_MODE, eci, &parse, &parsefnc) == NULL) { + return -1; + } if (parse) { sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%sparse", strlen(bwipp_opts_buf) ? " " : ""); bwipp_opts = bwipp_opts_buf; } + if (parsefnc) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%sparsefnc", strlen(bwipp_opts_buf) ? " " : ""); + bwipp_opts = bwipp_opts_buf; + } if (symbology == BARCODE_CODE93) { sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%sincludecheck", strlen(bwipp_opts_buf) ? " " : ""); @@ -2010,12 +2083,69 @@ int testUtilBwipp(int index, const struct zint_symbol *symbol, int option_1, int for (r = 0; r < symbol->rows; r++) bwipp_row_height[r] = 8; /* Change from 10 */ sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%ssepheight=0", strlen(bwipp_opts_buf) ? " " : ""); bwipp_opts = bwipp_opts_buf; + } else if (symbology == BARCODE_AZTEC || symbology == BARCODE_HIBC_AZTEC) { + int compact = 0; + if (option_1 >= 1 && option_1 <= 4) { + int eclevel; + if (option_1 == 1) { + eclevel = 10; + } else if (option_1 == 2) { + eclevel = 23; + } else if (option_1 == 3) { + eclevel = 36; + } else { + eclevel = 50; + } + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%seclevel=%d", strlen(bwipp_opts_buf) ? " " : "", eclevel); + bwipp_opts = bwipp_opts_buf; + } + if (option_2 >= 1) { + int layers; + if (option_2 <= 4) { + compact = 1; + layers = option_2; + } else { + layers = option_2 - 4; + } + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%slayers=%d", strlen(bwipp_opts_buf) ? " " : "", layers); + bwipp_opts = bwipp_opts_buf; + } + if (symbol->output_options & READER_INIT) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%sreaderinit", strlen(bwipp_opts_buf) ? " " : ""); + bwipp_opts = bwipp_opts_buf; + } + if (symbology == BARCODE_HIBC_AZTEC) { + compact = 1; + } + if (compact) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%sformat=compact", strlen(bwipp_opts_buf) ? " " : ""); + bwipp_opts = bwipp_opts_buf; + } + } + } + + if (symbology == BARCODE_DATAMATRIX || symbology == BARCODE_HIBC_DM) { + #include "../dmatrix.h" + (void)matrixrsblock; (void)matrixdatablock; (void)matrixbytes; (void)matrixFW; (void)matrixFH; + (void)isDMRE; (void)text_value; (void)text_shift; (void)c40_value; (void)c40_shift; + + if (option_2 >= 1 && option_2 <= (int) sizeof(intsymbol)) { + int idx = intsymbol[option_2 - 1]; + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%srows=%d columns=%d", strlen(bwipp_opts_buf) ? " " : "", matrixH[idx], matrixW[idx]); + bwipp_opts = bwipp_opts_buf; + } + if (option_3 != DM_SQUARE && symbol->width != symbol->height) { + sprintf(bwipp_opts_buf + (int) strlen(bwipp_opts_buf), "%sformat=rectangle", strlen(bwipp_opts_buf) ? " " : ""); + bwipp_opts = bwipp_opts_buf; + } + if (option_3 != -1) { + bwipp_opts = bwipp_opts_buf; } } } if ((option_1 != -1 || option_2 != -1 || option_3 != -1) && !bwipp_opts) { - fprintf(stderr, "i:%d testUtilBwipp: no mapping option_1 %d, option_2 %d, option_3 %d for symbology %s\n", index, option_1, option_2, option_3, testUtilBarcodeName(symbology)); + fprintf(stderr, "i:%d testUtilBwipp: no BWIPP options set option_1 %d, option_2 %d, option_3 %d for symbology %s\n", index, option_1, option_2, option_3, testUtilBarcodeName(symbology)); return -1; } diff --git a/backend/tests/testcommon.h b/backend/tests/testcommon.h index 4d4de826..7b04b3dc 100644 --- a/backend/tests/testcommon.h +++ b/backend/tests/testcommon.h @@ -112,7 +112,7 @@ int testUtilHaveGhostscript(); int testUtilVerifyGhostscript(char *filename, int debug); int testUtilHaveVnu(); int testUtilVerifyVnu(char *filename, int debug); -int testUtilCanBwipp(int symbology, int option_1, int option_2, int option_3, int debug); +int testUtilCanBwipp(int index, const struct zint_symbol *symbol, int option_1, int option_2, int option_3, int debug); int testUtilBwipp(int index, const struct zint_symbol *symbol, int option_1, int option_2, int option_3, const char *data, int length, const char *primary, char *buffer, int buffer_size); int testUtilBwippCmp(const struct zint_symbol *symbol, char *msg, const char *bwipp_buf, const char *expected); int testUtilBwippCmpRow(const struct zint_symbol *symbol, int row, char *msg, const char *bwipp_buf, const char *expected); diff --git a/backend/tests/tools/bwipp_dump-barcode.ps.diff b/backend/tests/tools/bwipp_dump-barcode.ps.diff index cfa936d0..89b3bdfc 100644 --- a/backend/tests/tools/bwipp_dump-barcode.ps.diff +++ b/backend/tests/tools/bwipp_dump-barcode.ps.diff @@ -1,5 +1,5 @@ ---- ../../../../postscriptbarcode/build/monolithic/barcode.ps 2020-10-02 20:03:59.411955883 +0100 -+++ ../tools/bwipp_dump.ps 2020-10-03 01:47:30.454223200 +0100 +--- ../../../../postscriptbarcode/build/monolithic/barcode.ps 2020-10-26 01:13:25.080992540 +0000 ++++ ../tools/bwipp_dump.ps 2020-10-26 11:19:21.268222231 +0000 @@ -29,6 +29,8 @@ % CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS % IN THE SOFTWARE. @@ -9,7 +9,7 @@ % --BEGIN TEMPLATE-- % --BEGIN RESOURCE preamble-- -@@ -25404,34 +25406,80 @@ +@@ -24466,34 +24468,80 @@ pop } ifelse @@ -109,7 +109,7 @@ end -@@ -25490,7 +25538,7 @@ +@@ -24552,7 +24600,7 @@ pop } ifelse @@ -118,7 +118,7 @@ % Get the result of encoding with ean8 and gs1-cc options (lintype) (ean8) put -@@ -25498,29 +25546,75 @@ +@@ -24560,29 +24608,75 @@ options (dontdraw) true put % Plot the linear part @@ -214,7 +214,7 @@ end -@@ -25579,34 +25673,80 @@ +@@ -24641,34 +24735,80 @@ pop } ifelse @@ -314,7 +314,7 @@ end -@@ -25680,34 +25820,80 @@ +@@ -24742,34 +24882,80 @@ /opt options >> def @@ -414,7 +414,7 @@ end -@@ -25766,7 +25952,7 @@ +@@ -24828,7 +25014,7 @@ pop } ifelse @@ -423,7 +423,7 @@ options (lintype) (databaromni) put options (linkage) true put -@@ -25777,7 +25963,7 @@ +@@ -24839,7 +25025,7 @@ linear options //databaromni exec dup (sbs) get /linsbs exch def dup (bhs) get 0 get 72 mul /linheight exch def @@ -432,7 +432,7 @@ % Plot the separator /sepfinder { -@@ -25808,20 +25994,66 @@ +@@ -24870,20 +25056,66 @@ sep 0 [0 0 0] putinterval sep sep length 4 sub [0 0 0 0] putinterval 18 sepfinder 64 sepfinder @@ -511,7 +511,7 @@ end -@@ -25879,7 +26111,7 @@ +@@ -24941,7 +25173,7 @@ pop } ifelse @@ -520,7 +520,7 @@ options (lintype) (databarstacked) put options (linkage) true put -@@ -25890,7 +26122,7 @@ +@@ -24952,7 +25184,7 @@ linear options //databarstacked exec dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def dup (pixy) get /linheight exch def @@ -529,7 +529,7 @@ % Plot the separator /sepfinder { -@@ -25918,20 +26150,52 @@ +@@ -24980,20 +25212,52 @@ sep 0 [ 0 0 0 0 ] putinterval sep sep length 4 sub [ 0 0 0 0 ] putinterval 18 sepfinder @@ -594,7 +594,7 @@ end -@@ -25989,7 +26253,7 @@ +@@ -25051,7 +25315,7 @@ pop } ifelse @@ -603,7 +603,7 @@ options (lintype) (databarstackedomni) put options (linkage) true put -@@ -26000,7 +26264,7 @@ +@@ -25062,7 +25326,7 @@ linear options //databarstackedomni exec dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def dup (pixy) get /linheight exch def @@ -612,7 +612,7 @@ % Plot the separator /sepfinder { -@@ -26028,20 +26292,52 @@ +@@ -25090,20 +25354,52 @@ sep 0 [ 0 0 0 0 ] putinterval sep sep length 4 sub [ 0 0 0 0 ] putinterval 18 sepfinder @@ -677,7 +677,7 @@ end -@@ -26214,7 +26510,7 @@ +@@ -25276,7 +25572,7 @@ pop } ifelse @@ -686,7 +686,7 @@ options (lintype) (databarlimited) put options (linkage) true put -@@ -26225,7 +26521,7 @@ +@@ -25287,7 +25583,7 @@ linear options //databarlimited exec dup (sbs) get /linsbs exch def dup (bhs) get 0 get 72 mul /linheight exch def @@ -695,7 +695,7 @@ % Plot the separator mark -@@ -26233,22 +26529,68 @@ +@@ -25295,22 +25591,68 @@ counttomark 1 sub array astore /sep exch def pop pop sep 0 [0 0 0] putinterval sep sep length 9 sub [0 0 0 0 0 0 0 0 0] putinterval % 4 + 5 right guard spaces @@ -778,7 +778,7 @@ end -@@ -26307,7 +26649,7 @@ +@@ -25369,7 +25711,7 @@ pop } ifelse @@ -787,7 +787,7 @@ options (lintype) (databarexpanded) put options (linkage) true put -@@ -26318,7 +26660,7 @@ +@@ -25380,7 +25722,7 @@ linear options //databarexpanded exec dup (sbs) get /linsbs exch def dup (bhs) get 0 get 72 mul /linheight exch def @@ -796,7 +796,7 @@ % Plot the separator /sepfinder { -@@ -26347,20 +26689,60 @@ +@@ -25409,20 +25751,60 @@ 18 98 bot length 13 sub {} for 69 98 bot length 13 sub {} for ] {sepfinder} forall @@ -869,7 +869,7 @@ end -@@ -26418,7 +26800,7 @@ +@@ -25480,7 +25862,7 @@ pop } ifelse @@ -878,7 +878,7 @@ options (lintype) (databarexpandedstacked) put options (linkage) true put -@@ -26429,7 +26811,7 @@ +@@ -25491,7 +25873,7 @@ linear options //databarexpandedstacked exec dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def dup (pixy) get /linheight exch def @@ -887,14 +887,7 @@ % Plot the separator /sepfinder { -@@ -26449,27 +26831,55 @@ - } for - } bind def - /sep [ bot {1 exch sub} forall ] def -- sep 0 [ 0 0 0 ] putinterval -+ sep 0 [ 0 0 0 0 ] putinterval - sep sep length 4 sub [ 0 0 0 0 ] putinterval - [ % Finder pattern module positions +@@ -25517,21 +25899,49 @@ 19 98 bot length 13 sub {} for 70 98 bot length 13 sub {} for ] {sepfinder} forall @@ -957,7 +950,7 @@ end -@@ -26528,7 +26938,7 @@ +@@ -25590,7 +26000,7 @@ pop } ifelse @@ -966,7 +959,7 @@ options (inkspread) (0) put options (dontdraw) true put -@@ -26555,35 +26965,87 @@ +@@ -25617,35 +26027,87 @@ linear << options {} forall >> //gs1-128 exec dup (sbs) get /linsbs exch def dup (bhs) get 0 get 72 mul /linheight exch def @@ -1068,7 +1061,7 @@ end -@@ -27881,3 +28343,176 @@ +@@ -26919,3 +27381,176 @@ % --END ENCODER hibcazteccode-- % --END TEMPLATE-- diff --git a/backend/tests/tools/bwipp_dump.ps.tar.xz b/backend/tests/tools/bwipp_dump.ps.tar.xz index 38fc9caad3475c5e035c656f01aeb3a3a6f6dc5c..02dbc179a22654b2ec1f0a04d3749ef2940d0eee 100644 GIT binary patch literal 117128 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 RDFd;@XZr#G00004Sz6l7UR?kH literal 116808 zcmV(-K-|CmH+ooF000E$*0e?f03iV!0000G&sfao;zaNNT>vp1$yUEJ0H%@u`y9Po z7M&UcT)M1GaJ=_k5-&EC->-(AC}nayZbk)zWFCd{%&W{QW?_@MG|BXmv7JsTH#Pn; zV)v*m?m7OfqbsVzSd|DJx`lS!-J0g`^aNH)cn%)vksVI2?cwWAY3JurfrH5Rw(&fS)JVfs|25oI?{daf~Fu4uMnI{S~*5Bhyj>~AKbqQ3qQ==yV!u`Qp6 zN*98fYJv?w6DZzG-xipMX(aQq1p@6(uTALxg0|_qq6JOAD0|#2;Bu!6a#<1L_}}?C z`>wdr;M>W(mS2{zO`CsNbJeJFI^f;Fi$y=iSA<-tGb2cTkj73Gg#PXI6a7r4pa-T( zaQ_UDs{P`M5bCW%f;6zg&_7u?J|uLy9VmmqxnrbLxr z2fM{1Dz(Pn^3rv(a)0JE(bZxWVH1y;WCaZ}^6Xb-LnEW#_a?~GHDnhnpB!mJ}#?vYgir9|gJ+|4&{s5|v4onB;~{GTxD!f7^BkdpD* z4^TzrMOEZl8P*nEqJWb{hd#OQTzA5ivp&n%pS6?J#6EEf4sw2yZMhHVZ4LNY&2o9N z^go2J)&<5E-kbPaev&`iv-HTN-seX%#E<;2210}9y_1~9ejl{v2}7Ee@9AHe{m?8^ z&j+^pFhdL^5*wrsR-jT3UbSfZQ5EYdw<;Dg2A5Nc*VHvvWuEl;UD=&V-b*=n5|woB z6+x$KPYt(t-KT%YW`X72=^;iYk?XJg+HMEW9%yEZ6W-njad-HAxMCbmJhz>gvIFX; zyK(j$^fn@1pZ<#~bzI9_^1T7ZOW5W=os7CyE7#vgx=7Fn_kfE%01#gL3>}(H6XUOa zK!IeS=P>BYJeevz(`Tex;=%dKM+NX%{_rExYI-ZR1i?oW{%Tz%y3Vg0qZq*#4(yi3 zt)mb4O4y!}rd>RWAQ+V>*nJ2u<{yT}j;x*MxL-#QV!c%)NYvHOSY} z?AOgv-U^gZmf%VAe0pUX?P1iCB(r97fWg;KT#t){VAiA5`m#AOWu_GuI1QbwI&xD$ z?q%ldpz0d&^(B@{188`P>@2Q2Sw_xOIuH|yGsk^`aG6ZeVk}?hRfYuaYJ}yk^mzhO z>qr}zJ>}I2WW@cSbC7nw(2I5vNktVCq{^$#$u#?qzuV6}AXd28c+ue^ROToz0%{M zR#{ngHCP^u7))AlGuiL6@KqSt7mbFODF4sgUmnES4jt7HD5H|q==$J!&=vgH!!^WX z1z*e`^z^;ceDBm%SQ*>=rz9{YvGI(UB(82TNJ3WQ5#C;`Z=;?i-`ZXpYuPpc4PZdW zL;$kI=Nx6MLT12NIOnx(P)>aeg}*g6Gt&v^6uo#6>u{W8YMl4)=-~^CzW8|$^~@ZU zJ%F`tBvbC3Y_`T}v_ASvUh~&5@Z2#yHu`hmd#|GDrV6dUAUS=w)QKOYo4S-_?R+iz zerzr-GvRBTw{CDk%x>j#E_3W>rZs{BMI|}hgb&Sj6ROKIxdhBe&_vG2h9A?nLXqGe zp-nWHV)rl(+jSdQVgOxPbMq3F#=~)j#Z$kE{5A*x!n~8l8T0oi&)USGWZ`ZeMrXhn zH6wDeYbCm3cd@o#x~ZG>A2EBGa$5@S>3SNXfm6`Iabpq)O2}}+Bm{k3_=UQ5Y3hOw zgtALl2i@BGmyqm34Eg;N39&>Yjb3p)+~0Rfl2e0gxQM1FseB|M9Hi{Of8gbA5{1l@ zkSn2uGTbni5hOBv_aKSGPawzU$Uju@{($dP zq;voiI57Y2DHxz9W<{+fL`I3`lk&_luhyU5F2sd=DLQ9)H#*yb2kdE-EcDjFE6%xG zRYz9~@y`laLr+hxOe3z*mqd>>W;o`^632X_zp{c-9LXI^LT@P#!?uUEuQip?V5*`<~%fM`wWNc&TM4{MUM@8T
  • WsIX<;Ng`&dM96W4mxvkC( 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 J00004Sz5X)#UB6w diff --git a/backend/tests/tools/run_bwipp_tests.sh b/backend/tests/tools/run_bwipp_tests.sh index fd24c224..04c34b69 100755 --- a/backend/tests/tools/run_bwipp_tests.sh +++ b/backend/tests/tools/run_bwipp_tests.sh @@ -15,6 +15,7 @@ function run_bwipp_test() { run_bwipp_test "test_2of5" "encode" run_bwipp_test "test_auspost" "encode" +run_bwipp_test "test_aztec" "encode" run_bwipp_test "test_channel" "encode" run_bwipp_test "test_codablock" "encode" run_bwipp_test "test_code" "encode" @@ -23,6 +24,7 @@ run_bwipp_test "test_code128" "encode" run_bwipp_test "test_code16k" "encode" run_bwipp_test "test_code49" "encode" run_bwipp_test "test_composite" +run_bwipp_test "test_dmatrix" "encode" run_bwipp_test "test_gs1" "gs1_reduce" run_bwipp_test "test_imail" "encode" run_bwipp_test "test_medical" "encode" diff --git a/backend/upcean.c b/backend/upcean.c index 99044fc0..54478134 100644 --- a/backend/upcean.c +++ b/backend/upcean.c @@ -101,14 +101,14 @@ static char upc_check(char source[]) { /* UPC A is usually used for 12 digit numbers, but this function takes a source of any length */ static void upca_draw(char source[], char dest[]) { - unsigned int i, half_way; + unsigned int i, half_way, length = strlen(source); - half_way = strlen(source) / 2; + half_way = length / 2; /* start character */ strcat(dest, "111"); - for (i = 0; i <= strlen(source); i++) { + for (i = 0; i < length; i++) { if (i == half_way) { /* middle character - separates manufacturer no. from product no. */ /* also inverts right hand characters */ @@ -157,7 +157,7 @@ static int upca(struct zint_symbol *symbol, unsigned char source[], char dest[]) /* UPC E is a zero-compressed version of UPC A */ static int upce(struct zint_symbol *symbol, unsigned char source[], char dest[]) { - unsigned int i, num_system; + unsigned int i, num_system, length; char emode, equivalent[12], check_digit, parity[8], temp[9]; char hrt[9]; int error_number = 0; @@ -285,7 +285,8 @@ static int upce(struct zint_symbol *symbol, unsigned char source[], char dest[]) /* start character */ strcat(dest, "111"); - for (i = 0; i <= ustrlen(source); i++) { + length = ustrlen(source); + for (i = 0; i < length; i++) { switch (parity[i]) { case 'A': lookup(NEON, EANsetA, source[i], dest); break; @@ -321,7 +322,7 @@ static int upce(struct zint_symbol *symbol, unsigned char source[], char dest[]) /* EAN-2 and EAN-5 add-on codes */ static void add_on(unsigned char source[], char dest[], int addon_gap) { char parity[6]; - unsigned int i, code_type; + unsigned int i, code_type, length; /* If an add-on then append with space */ if (addon_gap != 0) { @@ -363,7 +364,8 @@ static void add_on(unsigned char source[], char dest[], int addon_gap) { strcpy(parity, EAN5Parity[parity_bit]); } - for (i = 0; i < ustrlen(source); i++) { + length = ustrlen(source); + for (i = 0; i < length; i++) { switch (parity[i]) { case 'A': lookup(NEON, EANsetA, source[i], dest); break; @@ -441,7 +443,7 @@ static int ean13(struct zint_symbol *symbol, unsigned char source[], char dest[] /* start character */ strcat(dest, "111"); length = strlen(gtin); - for (i = 1; i <= length; i++) { + for (i = 1; i < length; i++) { if (i == half_way) { /* middle character - separates manufacturer no. from product no. */ /* also inverses right hand characters */ diff --git a/backend/vector.c b/backend/vector.c index a027e045..4e9be76e 100644 --- a/backend/vector.c +++ b/backend/vector.c @@ -79,7 +79,7 @@ static struct zint_vector_hexagon *vector_plot_create_hexagon(float x, float y, hexagon->next = NULL; hexagon->x = x; hexagon->y = y; - hexagon->diameter = (diameter * 5.0f) / 4.0f; // Ugly kludge for legacy support + hexagon->diameter = diameter; hexagon->rotation = 0; return hexagon; @@ -407,7 +407,7 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ float dot_overspill = 0.0f; float dotoffset = 0.0f; - int rect_count, last_row_start; + int rect_count, last_row_start = 0; int this_row; struct zint_vector *vector; @@ -469,14 +469,16 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ if ((symbol->symbology != BARCODE_MAXICODE) && (symbol->output_options & BARCODE_DOTTY_MODE)) { dot_overspill = symbol->dot_size - 1.0f; /* Allow for exceeding 1X */ if (dot_overspill < 0.0f) { + dotoffset = -dot_overspill / 2.0f; dot_overspill = 0.0f; } else { - dotoffset = 0.1f; /* Fudge for anti-aliasing */ + dot_overspill += 0.1f; /* Fudge for anti-aliasing */ + dotoffset = 0.05f; } } - vector->width = symbol->width + dotoffset * 2.0f + dot_overspill + (xoffset + roffset); - vector->height = symbol->height + textoffset + dotoffset * 2.0f + dot_overspill + (yoffset + boffset); + vector->width = symbol->width + dot_overspill + (xoffset + roffset); + vector->height = symbol->height + textoffset + dot_overspill + (yoffset + boffset); if (symbol->border_width > 0 && ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND))) { default_text_posn = symbol->height + text_height + text_gap + symbol->border_width + symbol->border_width; @@ -484,11 +486,52 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ default_text_posn = symbol->height + text_height + text_gap; } - rect_count = 0; - last_row_start = 0; + // Plot Maxicode symbols + if (symbol->symbology == BARCODE_MAXICODE) { + struct zint_vector_circle *circle; + float hex_diameter = (float) (symbol->dot_size * 5.0 / 4.0); // Ugly kludge for legacy support + vector->width = 37.0f + (xoffset + roffset); + vector->height = 36.0f + (yoffset + boffset); + // Bullseye + circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 10.85f, 0); + vector_plot_add_circle(symbol, circle, &last_circle); + circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 8.97f, 1); + vector_plot_add_circle(symbol, circle, &last_circle); + circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 7.10f, 0); + vector_plot_add_circle(symbol, circle, &last_circle); + circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 5.22f, 1); + vector_plot_add_circle(symbol, circle, &last_circle); + circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 3.31f, 0); + vector_plot_add_circle(symbol, circle, &last_circle); + circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 1.43f, 1); + vector_plot_add_circle(symbol, circle, &last_circle); + + /* Hexagons */ + for (r = 0; r < symbol->rows; r++) { + for (i = 0; i < symbol->width; i++) { + if (module_is_set(symbol, r, i)) { + //struct zint_vector_hexagon *hexagon = vector_plot_create_hexagon(((i * 0.88) + ((r & 1) ? 1.76 : 1.32)), ((r * 0.76) + 0.76), hex_diameter); + struct zint_vector_hexagon *hexagon = vector_plot_create_hexagon(((i * 1.23f) + 0.615f + ((r & 1) ? 0.615f : 0.0f)) + xoffset, + ((r * 1.067f) + 0.715f) + yoffset, hex_diameter); + vector_plot_add_hexagon(symbol, hexagon, &last_hexagon); + } + } + } + // Dotty mode + } else if (symbol->output_options & BARCODE_DOTTY_MODE) { + float dotradius = symbol->dot_size / 2.0f; + for (r = 0; r < symbol->rows; r++) { + for (i = 0; i < symbol->width; i++) { + if (module_is_set(symbol, r, i)) { + struct zint_vector_circle *circle = vector_plot_create_circle(i + dotradius + dotoffset + xoffset, r + dotradius + dotoffset + yoffset, symbol->dot_size, 0); + vector_plot_add_circle(symbol, circle, &last_circle); + } + } + } // Plot rectangles - most symbols created here - if ((symbol->symbology != BARCODE_MAXICODE) && ((symbol->output_options & BARCODE_DOTTY_MODE) == 0)) { + } else { + rect_count = 0; row_posn = yoffset; for (r = 0; r < symbol->rows; r++) { this_row = r; @@ -537,52 +580,6 @@ INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_ } } - // Plot Maxicode symbols - if (symbol->symbology == BARCODE_MAXICODE) { - struct zint_vector_circle *circle; - vector->width = 37.0f + (xoffset + roffset); - vector->height = 36.0f + (yoffset + boffset); - - // Bullseye - circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 10.85f, 0); - vector_plot_add_circle(symbol, circle, &last_circle); - circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 8.97f, 1); - vector_plot_add_circle(symbol, circle, &last_circle); - circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 7.10f, 0); - vector_plot_add_circle(symbol, circle, &last_circle); - circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 5.22f, 1); - vector_plot_add_circle(symbol, circle, &last_circle); - circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 3.31f, 0); - vector_plot_add_circle(symbol, circle, &last_circle); - circle = vector_plot_create_circle(17.88f + xoffset, 17.8f + yoffset, 1.43f, 1); - vector_plot_add_circle(symbol, circle, &last_circle); - - /* Hexagons */ - for (r = 0; r < symbol->rows; r++) { - for (i = 0; i < symbol->width; i++) { - if (module_is_set(symbol, r, i)) { - //struct zint_vector_hexagon *hexagon = vector_plot_create_hexagon(((i * 0.88) + ((r & 1) ? 1.76 : 1.32)), ((r * 0.76) + 0.76), symbol->dot_size); - struct zint_vector_hexagon *hexagon = vector_plot_create_hexagon(((i * 1.23f) + 0.615f + ((r & 1) ? 0.615f : 0.0f)) + xoffset, - ((r * 1.067f) + 0.715f) + yoffset, symbol->dot_size); - vector_plot_add_hexagon(symbol, hexagon, &last_hexagon); - } - } - } - } - - // Dotty mode - if ((symbol->symbology != BARCODE_MAXICODE) && (symbol->output_options & BARCODE_DOTTY_MODE)) { - float dotradius = symbol->dot_size / 2.0f; - for (r = 0; r < symbol->rows; r++) { - for (i = 0; i < symbol->width; i++) { - if (module_is_set(symbol, r, i)) { - struct zint_vector_circle *circle = vector_plot_create_circle(i + dotradius + dotoffset + xoffset, r + dotradius + dotoffset + yoffset, symbol->dot_size, 0); - vector_plot_add_circle(symbol, circle, &last_circle); - } - } - } - } - if (upceanflag) { /* Guard bar extension */ if (upceanflag == 6) { /* UPC-E */ diff --git a/backend_qt/CMakeLists.txt b/backend_qt/CMakeLists.txt index 8be5bc0e..03d9566f 100644 --- a/backend_qt/CMakeLists.txt +++ b/backend_qt/CMakeLists.txt @@ -1,22 +1,32 @@ # (c) 2008 by BogDan Vatra < bogdan@licentia.eu > +# vim: set ts=4 sw=4 et : project(QZint) include_directories(BEFORE "${CMAKE_SOURCE_DIR}/backend" ) set(QZint_SRCS qzint.cpp) -QT5_WRAP_CPP(QZint_SRCS qzint.h) + +if(USE_QT6) + qt6_wrap_cpp(QZint_SRCS qzint.h) +else() + qt5_wrap_cpp(QZint_SRCS qzint.h) +endif() add_library(QZint SHARED ${QZint_SRCS}) -set_target_properties(QZint PROPERTIES SOVERSION "${ZINT_VERSION_MAJOR}.${ZINT_VERSION_MINOR}" +set_target_properties(QZint PROPERTIES SOVERSION "${ZINT_VERSION_MAJOR}.${ZINT_VERSION_MINOR}" VERSION ${ZINT_VERSION}) add_dependencies(QZint zint) link_directories( "${CMAKE_BINARY_DIR}/backend" ) -target_link_libraries(QZint zint Qt5::Widgets Qt5::Gui ) +if(USE_QT6) + target_link_libraries(QZint zint Qt6::Widgets Qt6::Gui) +else() + target_link_libraries(QZint zint Qt5::Widgets Qt5::Gui) +endif() install(TARGETS QZint ${INSTALL_TARGETS_DEFAULT_ARGS} ) install(FILES qzint.h DESTINATION ${INCLUDE_INSTALL_DIR} COMPONENT Devel) diff --git a/backend_qt/qzint.cpp b/backend_qt/qzint.cpp index 2de11d45..f5a4d959 100644 --- a/backend_qt/qzint.cpp +++ b/backend_qt/qzint.cpp @@ -411,7 +411,6 @@ namespace Zint { struct zint_vector_hexagon *hex; struct zint_vector_circle *circle; struct zint_vector_string *string; - qreal radius; (void)mode; /* Not currently used */ @@ -454,9 +453,6 @@ namespace Zint { xtr += (qreal) (paintRect.width() - gwidth * scale) / 2.0; ytr += (qreal) (paintRect.height() - gheight * scale) / 2.0; - painter.setBackground(QBrush(m_bgColor)); - painter.fillRect(paintRect, QBrush(m_bgColor)); - if (m_rotate_angle) { painter.translate(paintRect.width() / 2.0, paintRect.height() / 2.0); // Need to rotate around centre painter.rotate(m_rotate_angle); @@ -466,6 +462,9 @@ namespace Zint { painter.translate(xtr, ytr); painter.scale(scale, scale); + QBrush bgBrush(m_bgColor); + painter.fillRect(QRectF(0, 0, gwidth, gheight), bgBrush); + //Red square for diagnostics //painter.fillRect(QRect(0, 0, m_zintSymbol->vector->width, m_zintSymbol->vector->height), QBrush(QColor(255,0,0,255))); @@ -488,19 +487,25 @@ namespace Zint { hex = m_zintSymbol->vector->hexagons; if (hex) { painter.setRenderHint(QPainter::Antialiasing); - QBrush brush(m_fgColor); + QBrush fgBrush(m_fgColor); + qreal previous_diameter = 0.0, radius = 0.0, half_radius = 0.0, half_sqrt3_radius = 0.0; while (hex) { - radius = hex->diameter / 2.0; + if (previous_diameter != hex->diameter) { + previous_diameter = hex->diameter; + radius = 0.5 * previous_diameter; + half_radius = 0.25 * previous_diameter; + half_sqrt3_radius = 0.43301270189221932338 * previous_diameter; + } QPainterPath pt; - pt.moveTo(hex->x, hex->y + (1.0 * radius)); - pt.lineTo(hex->x + (0.86 * radius), hex->y + (0.5 * radius)); - pt.lineTo(hex->x + (0.86 * radius), hex->y - (0.5 * radius)); - pt.lineTo(hex->x, hex->y - (1.0 * radius)); - pt.lineTo(hex->x - (0.86 * radius), hex->y - (0.5 * radius)); - pt.lineTo(hex->x - (0.86 * radius), hex->y + (0.5 * radius)); - pt.lineTo(hex->x, hex->y + (1.0 * radius)); - painter.fillPath(pt, brush); + pt.moveTo(hex->x, hex->y + radius); + pt.lineTo(hex->x + half_sqrt3_radius, hex->y + half_radius); + pt.lineTo(hex->x + half_sqrt3_radius, hex->y - half_radius); + pt.lineTo(hex->x, hex->y - radius); + pt.lineTo(hex->x - half_sqrt3_radius, hex->y - half_radius); + pt.lineTo(hex->x - half_sqrt3_radius, hex->y + half_radius); + pt.lineTo(hex->x, hex->y + radius); + painter.fillPath(pt, fgBrush); hex = hex->next; } @@ -511,19 +516,25 @@ namespace Zint { if (circle) { painter.setRenderHint(QPainter::Antialiasing); QPen p; + QBrush fgBrush(m_fgColor); + qreal previous_diameter = 0.0, radius = 0.0; while (circle) { + if (previous_diameter != circle->diameter) { + previous_diameter = circle->diameter; + radius = 0.5 * previous_diameter; + } if (circle->colour) { // Set means use background colour p.setColor(m_bgColor); p.setWidth(0); painter.setPen(p); - painter.setBrush(QBrush(m_bgColor)); + painter.setBrush(bgBrush); } else { p.setColor(m_fgColor); p.setWidth(0); painter.setPen(p); - painter.setBrush(QBrush(m_fgColor)); + painter.setBrush(fgBrush); } - painter.drawEllipse(QPointF(circle->x, circle->y), (double) circle->diameter / 2.0, (double) circle->diameter / 2.0); + painter.drawEllipse(QPointF(circle->x, circle->y), radius, radius); circle = circle->next; } } diff --git a/docs/manual.txt b/docs/manual.txt index 07b5f209..13494e7c 100644 --- a/docs/manual.txt +++ b/docs/manual.txt @@ -22,11 +22,11 @@ able to encode data in over 50 barcode symbologies (types of barcode), for each of which it is possible to translate that data from either Unicode (UTF-8) or a raw 8-bit data stream. The image can be rendered as either a Portable Network Graphic (PNG) image, Windows Bitmap (BMP), Graphics Interchange Format (GIF), -ZSoft Paintbrush image (PCX), as Encapsulated Post Script (EPS) or as a -Scalable Vector Graphic (SVG). Many options are available for setting the -characteristics of the output image including the size and colour of the image, -the amount of error correction used in the symbol and, in the case of raster -images, the orientation of the image. +ZSoft Paintbrush image (PCX), Tagged Image File Format (TIF), Enhanced Metafile +Format (EMF), as Encapsulated Post Script (EPS), or as a Scalable Vector Graphic +(SVG). Many options are available for setting the characteristics of the output +image including the size and colour of the image, the amount of error correction +used in the symbol and the orientation of the image. 1.1 Terms of Reference ---------------------- @@ -388,8 +388,8 @@ zint --box --border=10 -d "This" gives a box with a width 10 times the X-dimension of the symbol. -These options are ignored for Code 16k and Codablock-F. Special considerations -apply to ITF-14 - see the specific section for that symbology. +These options are ignored for Code 16k, Code 49 and Codablock-F. Special +considerations apply to ITF-14 - see the specific section for that symbology. 4.7 Using colour ---------------- @@ -433,8 +433,7 @@ PNG, GIF, SVG, EMF and EPS files. 4.8 Rotating the Symbol ----------------------- The symbol can be rotated through four orientations using the --rotate= option -followed by the angle of rotation as shown below. This option does not (yet) -apply to EMF file output. +followed by the angle of rotation as shown below. --rotate=0 (default) --rotate=90 @@ -627,6 +626,7 @@ supported output file formats are shown in the following table: Abbreviation | File format -------------------------------------------------------------- BMP | Windows Bitmap +EMF | Enhanced Metafile Format EPS | Encapsulated PostScript GIF | Graphics Interchange Format PCX | ZSoft Paintbrush image @@ -790,8 +790,8 @@ string. This allows the encoding of NUL (ASCII 0) characters in those symbologies which allow this. A value of 0 will disable this function and Zint will encode data up to the first NUL character in the input string. -The "rotate_angle" value can be used to rotate the image when outputting as a -raster image. Valid values are 0, 90, 180 and 270. +The "rotate_angle" value can be used to rotate the image when outputting. Valid +values are 0, 90, 180 and 270. The ZBarcode_Encode_File() and ZBarcode_Encode_File_and_Print() functions can be used to encode data read directly from a text file where the filename is @@ -816,10 +816,10 @@ saving the image to file it is placed in an unsigned character array. The "bitmap" pointer is set to the first memory location in the array and the values "barcode_width" and "barcode_height" indicate the size of the resulting image in pixels. Rotation and colour options can be used at the same time as using -the buffer functions in the same way as when saving to a raster image. The -pixel data can be extracted from the array by the method shown in the example -below where render_pixel() is assumed to be a function for drawing a pixel on -the screen implemented by the external application: +the buffer functions in the same way as when saving to a file. The pixel data +can be extracted from the array by the method shown in the example below where +render_pixel() is assumed to be a function for drawing a pixel on the screen +implemented by the external application: int row, col, i = 0; int red, blue, green; @@ -2377,7 +2377,7 @@ Input | Symbol Size 24 | 101 x 101 25 | 105 x 105 26 | 109 x 109 -28 | 113 x 113 +27 | 113 x 113 28 | 117 x 117 29 | 121 x 121 30 | 125 x 125 diff --git a/frontend_qt/CMakeLists.txt b/frontend_qt/CMakeLists.txt index a18c13fa..0b8781f4 100644 --- a/frontend_qt/CMakeLists.txt +++ b/frontend_qt/CMakeLists.txt @@ -1,26 +1,36 @@ # (c) 2008 by BogDan Vatra < bogdan@licentia.eu > +# vim: set ts=4 sw=4 et : project(zint-qt) include_directories(BEFORE "${CMAKE_SOURCE_DIR}/backend" "${CMAKE_SOURCE_DIR}/backend_qt") set(zint-qt_SRCS barcodeitem.cpp main.cpp mainwindow.cpp datawindow.cpp sequencewindow.cpp exportwindow.cpp) -QT5_WRAP_CPP(zint-qt_SRCS mainwindow.h datawindow.h sequencewindow.h exportwindow.h) -QT5_WRAP_UI(zint-qt_SRCS mainWindow.ui extData.ui extSequence.ui extExport.ui) +if(USE_QT6) + qt6_wrap_cpp(zint-qt_SRCS mainwindow.h datawindow.h sequencewindow.h exportwindow.h) + qt6_wrap_ui(zint-qt_SRCS mainWindow.ui extData.ui extSequence.ui extExport.ui) + qt6_add_resources(zint-qt_SRCS resources.qrc) +else() + qt5_wrap_cpp(zint-qt_SRCS mainwindow.h datawindow.h sequencewindow.h exportwindow.h) + qt5_wrap_ui(zint-qt_SRCS mainWindow.ui extData.ui extSequence.ui extExport.ui) + qt5_add_resources(zint-qt_SRCS resources.qrc) +endif() # grpAztec.ui grpC49.ui grpDBExtend.ui grpLOGMARS.ui grpPDF417.ui grpUPCEAN.ui # grpC11.ui grpChannel.ui grpDM.ui grpMaxicode.ui grpQR.ui grpVIN.ui # grpC128.ui grpCodabar.ui grpDotCode.ui grpMicroPDF.ui grpRMQR.ui # grpC16k.ui grpCodablockF.ui grpGrid.ui grpMQR.ui grpUltra.ui # grpC39.ui grpCodeOne.ui grpHX.ui grpMSICheck.ui grpUPCA.ui -QT5_ADD_RESOURCES(zint-qt_SRCS resources.qrc) - add_executable(zint-qt ${zint-qt_SRCS}) add_dependencies(zint-qt QZint zint) link_directories( "${CMAKE_BINARY_DIR}/backend" "${CMAKE_BINARY_DIR}/backend_qt" ) -target_link_libraries(zint-qt zint QZint Qt5::UiTools ${QT_QTXML_LIBRARY} Qt5::Gui Qt5::Core ) +if(USE_QT6) + target_link_libraries(zint-qt zint QZint Qt6::UiTools ${QT_QTXML_LIBRARY} Qt6::Gui Qt6::Core) +else() + target_link_libraries(zint-qt zint QZint Qt5::UiTools ${QT_QTXML_LIBRARY} Qt5::Gui Qt5::Core) +endif() install(TARGETS zint-qt DESTINATION "${BIN_INSTALL_DIR}" RUNTIME) diff --git a/frontend_qt/frontend_qt_zintdll.pro b/frontend_qt/frontend_qt_zintdll.pro index b79178ba..a39e6ecd 100644 --- a/frontend_qt/frontend_qt_zintdll.pro +++ b/frontend_qt/frontend_qt_zintdll.pro @@ -36,6 +36,8 @@ FORMS += extData.ui \ grpPDF417.ui \ grpQR.ui \ grpRMQR.ui \ + grpUPCA.ui \ + grpUPCEAN.ui \ grpVIN.ui \ mainWindow.ui diff --git a/frontend_qt/mainWindow.ui b/frontend_qt/mainWindow.ui index 22d5f767..df86fd24 100644 --- a/frontend_qt/mainWindow.ui +++ b/frontend_qt/mainWindow.ui @@ -22,7 +22,7 @@ 420 - 500 + 460 diff --git a/frontend_qt/mainwindow.cpp b/frontend_qt/mainwindow.cpp index b428a027..4133facd 100644 --- a/frontend_qt/mainwindow.cpp +++ b/frontend_qt/mainwindow.cpp @@ -286,10 +286,10 @@ bool MainWindow::save() #ifdef NO_PNG suffix = settings.value("studio/default_suffix", "gif").toString(); - save_dialog.setNameFilter(tr("Encapsulated PostScript (*.eps);;Graphics Interchange Format (*.gif);;Scalable Vector Graphic (*.svg);;Windows Bitmap (*.bmp);;ZSoft PC Painter Image (*.pcx);;Extended Metafile (*.emf);;Tagged Image File Format (*.tif)")); + save_dialog.setNameFilter(tr("Encapsulated PostScript (*.eps);;Graphics Interchange Format (*.gif);;Scalable Vector Graphic (*.svg);;Windows Bitmap (*.bmp);;ZSoft PC Painter Image (*.pcx);;Enhanced Metafile (*.emf);;Tagged Image File Format (*.tif)")); #else suffix = settings.value("studio/default_suffix", "png").toString(); - save_dialog.setNameFilter(tr("Portable Network Graphic (*.png);;Encapsulated PostScript (*.eps);;Graphics Interchange Format (*.gif);;Scalable Vector Graphic (*.svg);;Windows Bitmap (*.bmp);;ZSoft PC Painter Image (*.pcx);;Extended Metafile (*.emf);;Tagged Image File Format (*.tif)")); + save_dialog.setNameFilter(tr("Portable Network Graphic (*.png);;Encapsulated PostScript (*.eps);;Graphics Interchange Format (*.gif);;Scalable Vector Graphic (*.svg);;Windows Bitmap (*.bmp);;ZSoft PC Painter Image (*.pcx);;Enhanced Metafile (*.emf);;Tagged Image File Format (*.tif)")); #endif if (QString::compare(suffix, "png", Qt::CaseInsensitive) == 0) @@ -305,7 +305,7 @@ bool MainWindow::save() if (QString::compare(suffix, "pcx", Qt::CaseInsensitive) == 0) save_dialog.selectNameFilter("ZSoft PC Painter Image (*.pcx)"); if (QString::compare(suffix, "emf", Qt::CaseInsensitive) == 0) - save_dialog.selectNameFilter("Extended Metafile (*.emf)"); + save_dialog.selectNameFilter("Enhanced Metafile (*.emf)"); if (QString::compare(suffix, "tif", Qt::CaseInsensitive) == 0) save_dialog.selectNameFilter("Tagged Image File Format (*.tif)");