diff --git a/backend/tests/test_print.c b/backend/tests/test_print.c index b009f718..d619a23c 100644 --- a/backend/tests/test_print.c +++ b/backend/tests/test_print.c @@ -42,11 +42,13 @@ static void test_print(int index, int generate, int debug) { int have_libreoffice = 0; int have_ghostscript = 0; int have_vnu = 0; + int have_tiffinfo = 0; if (generate) { have_identify = testUtilHaveIdentify(); have_libreoffice = testUtilHaveLibreOffice(); have_ghostscript = testUtilHaveGhostscript(); have_vnu = testUtilHaveVnu(); + have_tiffinfo = testUtilHaveTiffInfo(); } int ret; @@ -153,6 +155,9 @@ static void test_print(int index, int generate, int debug) { ret = testUtilVerifyVnu(expected_file, debug); // Very slow assert_zero(ret, "i:%d %s vnu %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), expected_file, ret); } + } else if (strcmp(exts[j], "tif") == 0 && have_tiffinfo) { // Much faster (and better) than identify + ret = testUtilVerifyTiffInfo(expected_file, debug); + assert_zero(ret, "i:%d %s tiffinfo %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), expected_file, ret); } else if (strcmp(exts[j], "txt") != 0) { // I.e. rasters if (have_identify) { ret = testUtilVerifyIdentify(expected_file, debug); diff --git a/backend/tests/test_tif.c b/backend/tests/test_tif.c index 15edeb52..f807009c 100644 --- a/backend/tests/test_tif.c +++ b/backend/tests/test_tif.c @@ -1,6 +1,6 @@ /* libzint - the open source barcode library - Copyright (C) 2020 Robin Stuart + Copyright (C) 2020 - 2021 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -39,10 +39,8 @@ static void test_pixel_plot(int index, int debug) { testStart(""); - if (!testUtilHaveIdentify()) { - testSkip("ImageMagick identify not available"); - return; - } + int have_tiffinfo = testUtilHaveTiffInfo(); + int have_identify = testUtilHaveIdentify(); int ret; struct item { @@ -50,37 +48,38 @@ static void test_pixel_plot(int index, int debug) { int height; char *pattern; int repeat; + int no_identify; // identify fails for some valid TIFFs (eg. RGB with LZW and large rows) }; // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<")) struct item data[] = { - /* 0*/ { 1, 1, "1", 0 }, - /* 1*/ { 2, 1, "11", 0 }, - /* 2*/ { 1, 2, "11", 0 }, - /* 3*/ { 2, 2, "10", 1 }, - /* 4*/ { 3, 1, "101", 0 }, - /* 5*/ { 1, 3, "101", 0 }, - /* 6*/ { 4, 1, "1010", 0 }, - /* 7*/ { 1, 4, "1010", 0 }, - /* 8*/ { 5, 1, "10101", 0 }, - /* 9*/ { 1, 5, "10101", 0 }, - /* 10*/ { 3, 2, "101", 1 }, - /* 11*/ { 100, 2, "10", 1 }, - /* 12*/ { 2, 100, "10", 1 }, - /* 13*/ { 3, 3, "101010101", 0 }, - /* 14*/ { 4, 3, "10", 1 }, - /* 15*/ { 3, 4, "10", 1 }, - /* 16*/ { 45, 44, "10", 1 }, // Strip Count 1, Rows Per Strip 44 (45 * 44 * 4 == 7920) - /* 17*/ { 45, 45, "10", 1 }, // Strip Count 1, Rows Per Strip 45 (45 * 45 * 4 == 8100) - /* 18*/ { 46, 45, "10", 1 }, // Strip Count 2, Rows Per Strip 44 (46 * 45 * 4 == 8280) - /* 19*/ { 46, 46, "10", 1 }, // Strip Count 2, Rows Per Strip 44 - /* 20*/ { 2048, 1, "10", 1 }, // Strip Count 1, Rows Per Strip 1 (2048 * 4 == 8192) - /* 21*/ { 1, 2048, "10", 1 }, // Strip Count 1, Rows Per Strip 2048 - /* 22*/ { 2048, 2, "10", 1 }, // Strip Count 2, Rows Per Strip 1 - /* 23*/ { 2, 2048, "10", 1 }, // Strip Count 2, Rows Per Strip 1024 (2 * 1024 * 4 == 8192) - /* 24*/ { 2048, 3, "10", 1 }, // Strip Count 3, Rows Per Strip 1 - /* 25*/ { 3, 2048, "10", 1 }, // Strip Count 4, Rows Per Strip 682 ((3 * 682 + 2) * 4 == 8192) - /* 26*/ { 2049, 4, "10", 1 }, // Strip Count 4, Rows Per Strip 1 (2049 * 1 * 4 == 8196) - large rows in 1 strip, even if > 8192 - /* 27*/ { 4, 2049, "10", 1 }, // Strip Count 5, Rows Per Strip 512 ((4 * 512 + 1) * 4 == 8196) + /* 0*/ { 1, 1, "1", 0, 0 }, + /* 1*/ { 2, 1, "11", 0, 0 }, + /* 2*/ { 1, 2, "11", 0, 0 }, + /* 3*/ { 2, 2, "10", 1, 0 }, + /* 4*/ { 3, 1, "101", 0, 0 }, + /* 5*/ { 1, 3, "101", 0, 0 }, + /* 6*/ { 4, 1, "1010", 0, 0 }, + /* 7*/ { 1, 4, "1010", 0, 0 }, + /* 8*/ { 5, 1, "10101", 0, 0 }, + /* 9*/ { 1, 5, "10101", 0, 0 }, + /* 10*/ { 3, 2, "101", 1, 0 }, + /* 11*/ { 100, 2, "10", 1, 0 }, + /* 12*/ { 2, 100, "10", 1, 0 }, + /* 13*/ { 3, 3, "101010101", 0, 0 }, + /* 14*/ { 4, 3, "10", 1, 0 }, + /* 15*/ { 3, 4, "10", 1, 0 }, + /* 16*/ { 45, 44, "10", 1, 0 }, // Strip Count 1, Rows Per Strip 44 (45 * 44 * 4 == 7920) + /* 17*/ { 45, 45, "10", 1, 0 }, // Strip Count 1, Rows Per Strip 45 (45 * 45 * 4 == 8100) + /* 18*/ { 46, 45, "10", 1, 0 }, // Strip Count 2, Rows Per Strip 44 (46 * 45 * 4 == 8280) + /* 19*/ { 46, 46, "10", 1, 0 }, // Strip Count 2, Rows Per Strip 44 + /* 20*/ { 2048, 1, "10", 1, 1 }, // Strip Count 1, Rows Per Strip 1 (2048 * 4 == 8192) + /* 21*/ { 1, 2048, "10", 1, 0 }, // Strip Count 1, Rows Per Strip 2048 + /* 22*/ { 2048, 2, "10", 1, 1 }, // Strip Count 2, Rows Per Strip 1 + /* 23*/ { 2, 2048, "10", 1, 0 }, // Strip Count 2, Rows Per Strip 1024 (2 * 1024 * 4 == 8192) + /* 24*/ { 2048, 3, "10", 1, 1 }, // Strip Count 3, Rows Per Strip 1 + /* 25*/ { 3, 2048, "10", 1, 0 }, // Strip Count 4, Rows Per Strip 682 ((3 * 682 + 2) * 4 == 8192) + /* 26*/ { 2049, 4, "10", 1, 1 }, // Strip Count 4, Rows Per Strip 1 (2049 * 1 * 4 == 8196) - large rows in 1 strip, even if > 8192 + /* 27*/ { 4, 2049, "10", 1, 0 }, // Strip Count 5, Rows Per Strip 512 ((4 * 512 + 1) * 4 == 8196) }; int data_size = ARRAY_SIZE(data); @@ -88,18 +87,19 @@ static void test_pixel_plot(int index, int debug) { char data_buf[65536]; + struct zint_symbol *symbol = ZBarcode_Create(); + assert_nonnull(symbol, "Symbol not created\n"); + 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"); - strcpy(symbol->outfile, tif); symbol->bitmap_width = data[i].width; symbol->bitmap_height = data[i].height; - strcpy(symbol->bgcolour, "FFFFFFEE"); // Use alpha background to force RGB + symbol->symbology = BARCODE_ULTRA; // Use ULTRA with alpha background to force RGB + strcpy(symbol->bgcolour, "FFFFFFEE"); symbol->debug |= debug; int size = data[i].width * data[i].height; @@ -117,18 +117,23 @@ static void test_pixel_plot(int index, int debug) { ret = tif_pixel_plot(symbol, (unsigned char *) data_buf); assert_zero(ret, "i:%d tif_pixel_plot ret %d != 0 (%s)\n", i, ret, symbol->errtxt); - ret = testUtilVerifyIdentify(symbol->outfile, debug); - assert_zero(ret, "i:%d identify %s ret %d != 0\n", i, symbol->outfile, ret); + if (have_tiffinfo) { + ret = testUtilVerifyTiffInfo(symbol->outfile, debug); + assert_zero(ret, "i:%d tiffinfo %s ret %d != 0\n", i, symbol->outfile, ret); + } else if (have_identify && !data[i].no_identify) { + ret = testUtilVerifyIdentify(symbol->outfile, debug); + assert_zero(ret, "i:%d identify %s ret %d != 0\n", i, symbol->outfile, ret); + } if (!(debug & ZINT_DEBUG_TEST_KEEP_OUTFILE)) { assert_zero(remove(symbol->outfile), "i:%d remove(%s) != 0\n", i, symbol->outfile); } symbol->bitmap = NULL; - - ZBarcode_Delete(symbol); } + ZBarcode_Delete(symbol); + testFinish(); } @@ -136,6 +141,7 @@ static void test_print(int index, int generate, int debug) { testStart(""); + int have_tiffinfo = testUtilHaveTiffInfo(); int have_identify = testUtilHaveIdentify(); int ret; @@ -240,7 +246,10 @@ static void test_print(int index, int generate, int debug) { testUtilEscape(data[i].data, length, escaped, escaped_size), data[i].composite, data[i].expected_file, data[i].comment); ret = rename(symbol->outfile, data[i].expected_file); assert_zero(ret, "i:%d rename(%s, %s) ret %d != 0\n", i, symbol->outfile, data[i].expected_file, ret); - if (have_identify) { + if (have_tiffinfo) { + ret = testUtilVerifyTiffInfo(data[i].expected_file, debug); + assert_zero(ret, "i:%d %s tiffinfo %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), data[i].expected_file, ret); + } else if (have_identify) { ret = testUtilVerifyIdentify(data[i].expected_file, debug); assert_zero(ret, "i:%d %s identify %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), data[i].expected_file, ret); } diff --git a/backend/tests/testcommon.c b/backend/tests/testcommon.c index d3c174bf..8b01b2bf 100644 --- a/backend/tests/testcommon.c +++ b/backend/tests/testcommon.c @@ -1681,7 +1681,7 @@ int testUtilVerifyGhostscript(char *filename, int debug) { /* v.Nu https://github.com/validator/validator * Needs "$INSTALL_DIR/vnu-runtime-image/bin" in PATH */ int testUtilHaveVnu() { - return system("vnu --version > /dev/null") == 0; + return system("vnu --version > /dev/null 2>&1") == 0; } int testUtilVerifyVnu(char *filename, int debug) { @@ -1700,6 +1700,26 @@ int testUtilVerifyVnu(char *filename, int debug) { return system(buf); } +/* Requires libtiff 4.2.0 http://www.libtiff.org to be installed */ +int testUtilHaveTiffInfo() { + return system("tiffinfo -h > /dev/null") == 0; +} + +int testUtilVerifyTiffInfo(char *filename, int debug) { + char cmd[512 + 128]; + + if (strlen(filename) > 512) { + return -1; + } + if (debug & ZINT_DEBUG_TEST_PRINT) { + sprintf(cmd, "tiffinfo -D %s", filename); + } else { + sprintf(cmd, "tiffinfo -D %s > /dev/null 2>&1", filename); + } + + return system(cmd); +} + 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; diff --git a/backend/tests/testcommon.h b/backend/tests/testcommon.h index 6a806b98..733fc561 100644 --- a/backend/tests/testcommon.h +++ b/backend/tests/testcommon.h @@ -1,6 +1,6 @@ /* libzint - the open source barcode library - Copyright (C) 2019 - 2020 Robin Stuart + Copyright (C) 2019 - 2021 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -119,6 +119,8 @@ int testUtilHaveGhostscript(); int testUtilVerifyGhostscript(char *filename, int debug); int testUtilHaveVnu(); int testUtilVerifyVnu(char *filename, int debug); +int testUtilHaveTiffInfo(); +int testUtilVerifyTiffInfo(char *filename, 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); diff --git a/backend/tif.c b/backend/tif.c index 72cbe80b..f0000efb 100644 --- a/backend/tif.c +++ b/backend/tif.c @@ -290,8 +290,9 @@ INTERNAL int tif_pixel_plot(struct zint_symbol *symbol, unsigned char *pixelbuf) assert(strip_count > 0); /* Suppress clang-analyzer-core.UndefinedBinaryOperatorResult */ if (symbol->debug & ZINT_DEBUG_PRINT) { - printf("TIFF (%dx%d) Strip Count %d, Rows Per Strip %d\n", symbol->bitmap_width, symbol->bitmap_height, - strip_count, rows_per_strip); + printf("TIFF (%dx%d) Strip Count %d, Rows Per Strip %d, Pixels Per Sample %d, Samples Per Pixel %d, PMI %d\n", + symbol->bitmap_width, symbol->bitmap_height, strip_count, rows_per_strip, pixels_per_sample, + samples_per_pixel, pmi); } bytes_per_strip = rows_per_strip * ((symbol->bitmap_width + pixels_per_sample - 1) / pixels_per_sample) diff --git a/backend/zint.h b/backend/zint.h index e781159f..93822e72 100644 --- a/backend/zint.h +++ b/backend/zint.h @@ -1,7 +1,7 @@ /* zint.h - definitions for libzint libzint - the open source barcode library - Copyright (C) 2009-2020 Robin Stuart + Copyright (C) 2009-2021 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions