Partially circumvent a Little CMS bug

This commit is contained in:
Přemysl Eric Janouch 2024-01-26 19:53:55 +01:00
parent 3c8a280546
commit ae8dc3070a
Signed by: p
GPG Key ID: A0420B94F92B9493
1 changed files with 10 additions and 1 deletions

View File

@ -30,12 +30,16 @@
#include <lcms2_fast_float.h> #include <lcms2_fast_float.h>
#endif // HAVE_LCMS2_FAST_FLOAT #endif // HAVE_LCMS2_FAST_FLOAT
// https://github.com/mm2/Little-CMS/issues/430
static bool g_broken_cms_premul;
void void
fiv_io_profile_init(void) fiv_io_profile_init(void)
{ {
// TODO(p): Use Little CMS with contexts instead. // TODO(p): Use Little CMS with contexts instead.
#ifdef HAVE_LCMS2_FAST_FLOAT #ifdef HAVE_LCMS2_FAST_FLOAT
cmsPluginTHR(NULL, cmsFastFloatExtensions()); if (cmsPluginTHR(NULL, cmsFastFloatExtensions()))
g_broken_cms_premul = LCMS_VERSION <= 2160;
#endif // HAVE_LCMS2_FAST_FLOAT #endif // HAVE_LCMS2_FAST_FLOAT
} }
@ -300,6 +304,8 @@ fiv_io_profile_argb32(FivIoImage *image,
{ {
g_return_if_fail(image->format == CAIRO_FORMAT_ARGB32); g_return_if_fail(image->format == CAIRO_FORMAT_ARGB32);
// TODO: With g_no_cms_premultiplication,
// this probably also needs to be wrapped in un-premultiplication.
fiv_io_profile_rgb_direct(image->data, image->width, image->height, fiv_io_profile_rgb_direct(image->data, image->width, image->height,
source, target, source, target,
FIV_IO_PROFILE_ARGB32_PREMUL, FIV_IO_PROFILE_ARGB32_PREMUL); FIV_IO_PROFILE_ARGB32_PREMUL, FIV_IO_PROFILE_ARGB32_PREMUL);
@ -311,6 +317,9 @@ fiv_io_profile_argb32_premultiply(
{ {
if (image->format != CAIRO_FORMAT_ARGB32) { if (image->format != CAIRO_FORMAT_ARGB32) {
fiv_io_profile_xrgb32(image, source, target); fiv_io_profile_xrgb32(image, source, target);
} else if (g_broken_cms_premul) {
fiv_io_profile_xrgb32(image, source, target);
fiv_io_premultiply_argb32(image);
} else if (!fiv_io_profile_rgb_direct(image->data, } else if (!fiv_io_profile_rgb_direct(image->data,
image->width, image->height, source, target, image->width, image->height, source, target,
FIV_IO_PROFILE_ARGB32, FIV_IO_PROFILE_ARGB32_PREMUL)) { FIV_IO_PROFILE_ARGB32, FIV_IO_PROFILE_ARGB32_PREMUL)) {