test_tif: fix, use tiffinfo if available (big speedup)

This commit is contained in:
gitlost 2021-03-21 21:20:16 +00:00
parent 2d962c6321
commit 6dc8a242df
6 changed files with 84 additions and 47 deletions

View File

@ -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);

View File

@ -1,6 +1,6 @@
/*
libzint - the open source barcode library
Copyright (C) 2020 Robin Stuart <rstuart114@gmail.com>
Copyright (C) 2020 - 2021 Robin Stuart <rstuart114@gmail.com>
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,17 +117,22 @@ 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);
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);
}
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);
}

View File

@ -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;

View File

@ -1,6 +1,6 @@
/*
libzint - the open source barcode library
Copyright (C) 2019 - 2020 Robin Stuart <rstuart114@gmail.com>
Copyright (C) 2019 - 2021 Robin Stuart <rstuart114@gmail.com>
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);

View File

@ -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)

View File

@ -1,7 +1,7 @@
/* zint.h - definitions for libzint
libzint - the open source barcode library
Copyright (C) 2009-2020 Robin Stuart <rstuart114@gmail.com>
Copyright (C) 2009-2021 Robin Stuart <rstuart114@gmail.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions