From 29c97472229bc8ceafc642b6fa45001f547af635 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Novomesk=C3=BD?= Date: Tue, 28 Jan 2025 19:03:50 +0100 Subject: [PATCH] plug-ins: simplify JXL export options CMYK is saved with lossless compression. Lossy CMYK is not recommended by libjxl developers. libjxl API allows possibility to use lossy compression in original profile but the compression in this combination of settings is ineffective, with visible artifacts and discouraged by libjxl developers. We removed this option. --- plug-ins/common/file-jpegxl.c | 71 ++++++++++++----------------------- 1 file changed, 25 insertions(+), 46 deletions(-) diff --git a/plug-ins/common/file-jpegxl.c b/plug-ins/common/file-jpegxl.c index 9ee70f31d0..a660510db2 100644 --- a/plug-ins/common/file-jpegxl.c +++ b/plug-ins/common/file-jpegxl.c @@ -223,12 +223,6 @@ jpegxl_create_procedure (GimpPlugIn *plug_in, "squirrel", G_PARAM_READWRITE); - gimp_procedure_add_boolean_argument (procedure, "uses-original-profile", - _("Save ori_ginal profile"), - _("Store ICC profile to exported JXL file"), - FALSE, - G_PARAM_READWRITE); - gimp_procedure_add_boolean_argument (procedure, "cmyk", _("Export as CMY_K"), _("Create a CMYK JPEG XL image using the soft-proofing color profile"), @@ -1389,7 +1383,6 @@ export_image (GFile *file, gint speed = 7; gint bit_depth = 8; gboolean cmyk = FALSE; - gboolean uses_original_profile = FALSE; gboolean save_exif = FALSE; gboolean save_xmp = FALSE; @@ -1401,29 +1394,16 @@ export_image (GFile *file, "compression", &compression, "save-bit-depth", &bit_depth, "cmyk", &cmyk, - "uses-original-profile", &uses_original_profile, "include-exif", &save_exif, "include-xmp", &save_xmp, NULL); speed = gimp_procedure_config_get_choice_id (GIMP_PROCEDURE_CONFIG (config), "speed"); - if (lossless || cmyk) + if (cmyk) { - /* JPEG XL developers recommend enabling uses_original_profile - * for better lossless compression efficiency. - * Profile must be saved for CMYK export */ - uses_original_profile = TRUE; - } - else - { - /* 0.1 is actually minimal value for lossy in libjxl 0.5 - * 0.01 is allowed in libjxl 0.6 but - * using too low value with lossy compression is not wise */ - if (compression < 0.1) - { - compression = 0.1; - } + /* CMYK is allways saved as lossless */ + lossless = TRUE; } drawable_type = gimp_drawable_type (drawable); @@ -1432,7 +1412,7 @@ export_image (GFile *file, JxlEncoderInitBasicInfo(&output_info); - if (uses_original_profile) + if (lossless) { output_info.uses_original_profile = JXL_TRUE; @@ -1464,6 +1444,14 @@ export_image (GFile *file, } else { + /* 0.1 is actually minimal value for lossy in libjxl 0.5 + * 0.01 is allowed in libjxl 0.6 but + * using too low value with lossy compression is not wise */ + if (compression < 0.1) + { + compression = 0.1; + } + output_info.uses_original_profile = JXL_FALSE; space = babl_space ("sRGB"); out_linear = FALSE; @@ -1529,7 +1517,7 @@ export_image (GFile *file, switch (drawable_type) { case GIMP_GRAYA_IMAGE: - if (uses_original_profile && out_linear) + if (lossless && out_linear) { file_format = babl_format ( (bit_depth > 8) ? "YA u16" : "YA u8"); JxlColorEncodingSetToLinearSRGB (&color_profile, JXL_TRUE); @@ -1545,10 +1533,14 @@ export_image (GFile *file, output_info.alpha_exponent_bits = 0; output_info.num_extra_channels = 1; - uses_original_profile = FALSE; + if (profile) + { + g_object_unref (profile); + profile = NULL; + } break; case GIMP_GRAY_IMAGE: - if (uses_original_profile && out_linear) + if (lossless && out_linear) { file_format = babl_format ( (bit_depth > 8) ? "Y u16" : "Y u8"); JxlColorEncodingSetToLinearSRGB (&color_profile, JXL_TRUE); @@ -1562,7 +1554,11 @@ export_image (GFile *file, output_info.num_color_channels = 1; output_info.alpha_bits = 0; - uses_original_profile = FALSE; + if (profile) + { + g_object_unref (profile); + profile = NULL; + } break; case GIMP_RGBA_IMAGE: if (bit_depth > 8) @@ -1714,7 +1710,7 @@ export_image (GFile *file, return FALSE; } - if (uses_original_profile) + if (profile) { const uint8_t *icc_data = NULL; size_t icc_length = 0; @@ -1736,12 +1732,6 @@ export_image (GFile *file, } else { - if (profile) - { - g_object_unref (profile); - profile = NULL; - } - status = JxlEncoderSetColorEncoding (encoder, &color_profile); if (status != JXL_ENC_SUCCESS) { @@ -2005,7 +1995,6 @@ save_dialog (GimpImage *image, GtkWidget *dialog; GtkListStore *store; GtkWidget *compression_scale; - GtkWidget *orig_profile_check; GtkWidget *profile_label; GimpColorProfile *cmyk_profile = NULL; gboolean run; @@ -2079,20 +2068,10 @@ save_dialog (GimpImage *image, cmyk_profile != NULL, NULL, NULL, FALSE); - orig_profile_check = gimp_procedure_dialog_get_widget (GIMP_PROCEDURE_DIALOG (dialog), - "uses-original-profile", - GTK_TYPE_CHECK_BUTTON); - - g_object_bind_property (config, "lossless", - orig_profile_check, "sensitive", - G_BINDING_SYNC_CREATE | - G_BINDING_INVERT_BOOLEAN); - gimp_procedure_dialog_fill (GIMP_PROCEDURE_DIALOG (dialog), "lossless", "compression", "speed", "save-bit-depth", "cmyk-frame", - "uses-original-profile", "include-exif", "include-xmp", NULL);