output: use doubles when converting in out_colour_get_rgb()

and `out_colour_get_cmyk()`, to lessen chances of rounding
  errors (in particular for VC6)
test_large: fix regression in change to test for formatting
  `uint64_t` for `printf()`
win32/README: update MinGW/MSYS Qt version
This commit is contained in:
gitlost 2024-01-19 09:28:03 +00:00
parent 57fac4048d
commit 7c1bdba8ae
8 changed files with 33 additions and 32 deletions

View File

@ -1,5 +1,5 @@
% README.macos 2014-01-17 % README.macos 2014-01-18
% Tested on macOS 12.4 Monterey VirtualBox (thanks to https://github.com/myspaghetti/macos-virtualbox) % Tested on macOS 12.7.2 Monterey VirtualBox (thanks to https://github.com/myspaghetti/macos-virtualbox)
1. Prerequisites for building zint and zint-qt 1. Prerequisites for building zint and zint-qt
============================================== ==============================================

View File

@ -1,7 +1,7 @@
/* filemem.c - write to file/memory abstraction */ /* filemem.c - write to file/memory abstraction */
/* /*
libzint - the open source barcode library libzint - the open source barcode library
Copyright (C) 2023 Robin Stuart <rstuart114@gmail.com> Copyright (C) 2023-2024 Robin Stuart <rstuart114@gmail.com>
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions modification, are permitted provided that the following conditions
@ -287,7 +287,7 @@ static int fm_vprintf(struct filemem *restrict const fmp, const char *fmt, va_li
return 1; return 1;
} }
/* `fprintf()` to memory or file, returning 1 on success, 0 on failure */ /* `fprintf()` to file or memory, returning 1 on success, 0 on failure */
INTERNAL int fm_printf(struct filemem *restrict const fmp, const char *fmt, ...) { INTERNAL int fm_printf(struct filemem *restrict const fmp, const char *fmt, ...) {
va_list ap; va_list ap;
int ret; int ret;

View File

@ -1,7 +1,7 @@
/* filemem.h - write to file/memory abstraction */ /* filemem.h - write to file/memory abstraction */
/* /*
libzint - the open source barcode library libzint - the open source barcode library
Copyright (C) 2023 Robin Stuart <rstuart114@gmail.com> Copyright (C) 2023-2024 Robin Stuart <rstuart114@gmail.com>
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions modification, are permitted provided that the following conditions
@ -67,7 +67,7 @@ INTERNAL int fm_putc(const int ch, struct filemem *restrict const fmp);
/* `fputs()` to file or memory, returning 1 on success, 0 on failure */ /* `fputs()` to file or memory, returning 1 on success, 0 on failure */
INTERNAL int fm_puts(const char *str, struct filemem *restrict const fmp); INTERNAL int fm_puts(const char *str, struct filemem *restrict const fmp);
/* `fprintf()` to memory or file, returning 1 on success, 0 on failure */ /* `fprintf()` to file or memory, returning 1 on success, 0 on failure */
INTERNAL int fm_printf(struct filemem *restrict const fmp, const char *format, ...); INTERNAL int fm_printf(struct filemem *restrict const fmp, const char *format, ...);
/* Output float without trailing zeroes to `fmp` with decimal pts `dp` (precision), returning 1 on success, 0 on /* Output float without trailing zeroes to `fmp` with decimal pts `dp` (precision), returning 1 on success, 0 on

View File

@ -129,13 +129,13 @@ INTERNAL int out_colour_get_rgb(const char *colour, unsigned char *red, unsigned
black = 100 - to_int((const unsigned char *) (comma3 + 1), (int) strlen(comma3 + 1)); black = 100 - to_int((const unsigned char *) (comma3 + 1), (int) strlen(comma3 + 1));
val = 100 - to_int((const unsigned char *) colour, (int) (comma1 - colour)); /* Cyan */ val = 100 - to_int((const unsigned char *) colour, (int) (comma1 - colour)); /* Cyan */
*red = (int) roundf((0xFF * val * black) / 10000.0f); *red = (int) round((0xFF * val * black) / 10000.0);
val = 100 - to_int((const unsigned char *) (comma1 + 1), (int) (comma2 - (comma1 + 1))); /* Magenta */ val = 100 - to_int((const unsigned char *) (comma1 + 1), (int) (comma2 - (comma1 + 1))); /* Magenta */
*green = (int) roundf((0xFF * val * black) / 10000.0f); *green = (int) round((0xFF * val * black) / 10000.0);
val = 100 - to_int((const unsigned char *) (comma2 + 1), (int) (comma3 - (comma2 + 1))); /* Yellow */ val = 100 - to_int((const unsigned char *) (comma2 + 1), (int) (comma3 - (comma2 + 1))); /* Yellow */
*blue = (int) roundf((0xFF * val * black) / 10000.0f); *blue = (int) round((0xFF * val * black) / 10000.0);
if (alpha) { if (alpha) {
*alpha = 0xFF; *alpha = 0xFF;
@ -176,10 +176,10 @@ INTERNAL int out_colour_get_cmyk(const char *colour, int *cyan, int *magenta, in
*cyan = *magenta = *yellow = 0; *cyan = *magenta = *yellow = 0;
*black = 100; *black = 100;
} else { } else {
*cyan = (int) roundf((k - red) * 100.0f / k); *cyan = (int) round((k - red) * 100.0 / k);
*magenta = (int) roundf((k - green) * 100.0f / k); *magenta = (int) round((k - green) * 100.0 / k);
*yellow = (int) roundf((k - blue) * 100.0f / k); *yellow = (int) round((k - blue) * 100.0 / k);
*black = (int) roundf(((0xFF - k) * 100.0f) / 0xFF); *black = (int) round(((0xFF - k) * 100.0) / 0xFF);
} }
if (rgb_alpha) { if (rgb_alpha) {

View File

@ -43,9 +43,10 @@
# if defined(__clang__) # if defined(__clang__)
# pragma GCC diagnostic ignored "-Wformat-non-iso" # pragma GCC diagnostic ignored "-Wformat-non-iso"
# elif defined(__GNUC__) # elif defined(__GNUC__)
# pragma GCC diagnostic ignored "-Wformat" /* Unfortunately doesn't seem to be way to only avoid non-ISO warnings */ # pragma GCC diagnostic ignored "-Wformat" /* Doesn't seem to be way to only avoid non-ISO warnings */
# endif # endif
#elif (defined(__WORDSIZE) && __WORDSIZE == 32) || (defined(ULONG_MAX) && ULONG_MAX <= 0xFFFFFFFF) #elif (defined(__WORDSIZE) && __WORDSIZE == 32) || (defined(ULONG_MAX) && ULONG_MAX <= 0xFFFFFFFF) \
|| defined(__APPLE__) || defined(__OpenBSD__)
# define LX_FMT "ll" # define LX_FMT "ll"
#else #else
# define LX_FMT "l" # define LX_FMT "l"

View File

@ -46,7 +46,7 @@ namespace Zint {
/* Matches RGB(A) hex string or CMYK decimal "C,M,Y,K" percentage string */ /* Matches RGB(A) hex string or CMYK decimal "C,M,Y,K" percentage string */
static const QString colorREstr( static const QString colorREstr(
QSL("^([0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?)|(((100|[0-9]{0,2}),){3}(100|[0-9]{0,2}))$")); QSL("^([0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?)|(((100|[0-9]{0,2}),){3}(100|[0-9]{0,2}))$"));
Q_GLOBAL_STATIC_WITH_ARGS(QRegularExpression, colorRE, (colorREstr)); Q_GLOBAL_STATIC_WITH_ARGS(QRegularExpression, colorRE, (colorREstr))
static const QString normalFontFamily = QSL("Arimo"); /* Sans-serif metrically compatible with Arial */ static const QString normalFontFamily = QSL("Arimo"); /* Sans-serif metrically compatible with Arial */
static const QString upceanFontFamily = QSL("OCRB"); /* Monospace OCR-B */ static const QString upceanFontFamily = QSL("OCRB"); /* Monospace OCR-B */

View File

@ -51,22 +51,22 @@
static const int tempMessageTimeout = 2000; static const int tempMessageTimeout = 2000;
// Use on Windows also (i.e. not using QKeySequence::Quit) // Use on Windows also (i.e. not using QKeySequence::Quit)
Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, quitKeySeq, (Qt::CTRL | Qt::Key_Q)); Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, quitKeySeq, (Qt::CTRL | Qt::Key_Q))
Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, openCLISeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_C)); Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, openCLISeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_C))
Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyBMPSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_B)); Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyBMPSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_B))
Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyEMFSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_E)); Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyEMFSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_E))
Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyGIFSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_G)); Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyGIFSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_G))
Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyPNGSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_P)); Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyPNGSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_P))
Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copySVGSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_S)); Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copySVGSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_S))
Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyTIFSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_T)); Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, copyTIFSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_T))
Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, factoryResetSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_R)); Q_GLOBAL_STATIC_WITH_ARGS(QKeySequence, factoryResetSeq, (Qt::SHIFT | Qt::CTRL | Qt::Key_R))
// RGB hexadecimal 6 or 8 in length or CMYK comma-separated decimal percentages "C,M,Y,K" // RGB hexadecimal 6 or 8 in length or CMYK comma-separated decimal percentages "C,M,Y,K"
static const QString colorREstr(QSL("^([0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?)|(((100|[0-9]{0,2}),){3}(100|[0-9]{0,2}))$")); static const QString colorREstr(QSL("^([0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?)|(((100|[0-9]{0,2}),){3}(100|[0-9]{0,2}))$"));
Q_GLOBAL_STATIC_WITH_ARGS(QRegularExpression, colorRE, (colorREstr)); Q_GLOBAL_STATIC_WITH_ARGS(QRegularExpression, colorRE, (colorREstr))
static const QString fgDefault(QSL("000000")); static const QString fgDefault(QSL("000000"));
static const QString bgDefault(QSL("FFFFFF")); static const QString bgDefault(QSL("FFFFFF"));

View File

@ -1,4 +1,4 @@
% win32/README 2024-01-17 % win32/README 2024-01-18
Visual Studio 2022 Visual Studio 2022
------------------ ------------------
@ -179,12 +179,12 @@ using it install the packages:
(This should include mingw32-libz-dll) (This should include mingw32-libz-dll)
Any reasonably modern version of Qt can be used. The following uses Qt 5.14.2. Any reasonably modern version of Qt can be used. The following uses Qt 5.15.2.
Using the Qt Maintenance Tool (see the Visual Studio 2022 instructions above) Using the Qt Maintenance Tool (see the Visual Studio 2022 instructions above)
install the "MinGW 7.3.0 32-bit" component. install the "MinGW 8.1.0 32-bit" component.
(Note the Qt MinGW versions actually refer to Mingw-w64, the 64-bit fork of (Note the Qt MinGW versions actually refer to Mingw-w64, the 64-bit fork of
MinGW, but versions up to 8.1 seem to be compatible.) MinGW, but versions up to 8.1.0 at least are compatible.)
Open a MinGW/MSYS shell by clicking/running e.g. (your path may differ) Open a MinGW/MSYS shell by clicking/running e.g. (your path may differ)
@ -192,10 +192,10 @@ Open a MinGW/MSYS shell by clicking/running e.g. (your path may differ)
As above make sure git and cmake are in your PATH. As above make sure git and cmake are in your PATH.
Add the Qt MinGW 7.3.0 32-bit component to your PATH, e.g. (your path may Add the Qt MinGW 8.1.0 32-bit component to your PATH, e.g. (your path may
differ): differ):
export PATH="/c/Qt/5.14.2/mingw73_32/bin":${PATH} export PATH="/c/Qt/5.15.2/mingw81_32/bin":${PATH}
Go into the directory you want to use and clone zint and libpng: Go into the directory you want to use and clone zint and libpng: