From a4821914d355afc2f45a7491cc7746cd39ac6846 Mon Sep 17 00:00:00 2001 From: Elle Stone Date: Sat, 7 Dec 2013 13:42:11 -0500 Subject: [PATCH] Bug 720045 - Add black point compensation to Preferences/Color Management Make black point compensation configurable separately for both proof and display. --- app/dialogs/preferences-dialog.c | 24 ++++++++++++++- libgimpconfig/gimpcolorconfig.c | 53 ++++++++++++++++++++++++++------ libgimpconfig/gimpcolorconfig.h | 6 +++- modules/display-filter-lcms.c | 29 ++++++++++------- 4 files changed, 89 insertions(+), 23 deletions(-) diff --git a/app/dialogs/preferences-dialog.c b/app/dialogs/preferences-dialog.c index 7a9c118df4..be14267a47 100644 --- a/app/dialogs/preferences-dialog.c +++ b/app/dialogs/preferences-dialog.c @@ -2342,7 +2342,18 @@ prefs_dialog_new (Gimp *gimp, "display-rendering-intent", 0, 0, _("_Display rendering intent:"), GTK_TABLE (table), row++, NULL); - gtk_table_set_row_spacing (GTK_TABLE (table), row - 1, 12); + + button = + gimp_prop_check_button_new (color_config, + "display-use-black-point-compensation", + _("Use _black point compensation for " + "the display")); + + gtk_table_attach_defaults (GTK_TABLE (table), + button, 1, 2, row, row + 1); + gtk_widget_show (button); + gtk_table_set_row_spacing (GTK_TABLE (table), row, 12); + row++; } if (i == 3) /* printer profile */ @@ -2351,6 +2362,17 @@ prefs_dialog_new (Gimp *gimp, "simulation-rendering-intent", 0, 0, _("_Softproof rendering intent:"), GTK_TABLE (table), row++, NULL); + + button = + gimp_prop_check_button_new (color_config, + "simulation-use-black-point-compensation", + _("Use black _point compensation " + "for softproofing")); + + gtk_table_attach_defaults (GTK_TABLE (table), + button, 1, 2, row, row + 1); + gtk_widget_show (button); + row++; } } diff --git a/libgimpconfig/gimpcolorconfig.c b/libgimpconfig/gimpcolorconfig.c index 1277941ef8..7698337f15 100644 --- a/libgimpconfig/gimpcolorconfig.c +++ b/libgimpconfig/gimpcolorconfig.c @@ -62,19 +62,31 @@ #define CMYK_PROFILE_BLURB \ N_("The CMYK color profile used to convert between RGB and CMYK.") #define PRINTER_PROFILE_BLURB \ - N_("The color profile used for simulating a printed version (softproof).") + N_("The color profile to use for soft proofing from your image's " \ + "color space to some other color space, including " \ + "soft proofing to a printer or other output device profile. ") #define DISPLAY_RENDERING_INTENT_BLURB \ - N_("Sets how colors are mapped for your display.") + N_("How colors are converted from your image's color space to your display device. " \ + "Relative colorimetric is usually the best choice. " \ + "Unless you use a LUT monitor profile (most monitor profiles are matrix), " \ + "choosing perceptual intent really gives you relative colorimetric." ) +#define DISPLAY_USE_BPC_BLURB \ + N_("Do use black point compensation (unless you know you have a reason not to). ") #define SIMULATION_RENDERING_INTENT_BLURB \ - N_("Sets how colors are converted from RGB working space to the " \ - "print simulation device.") + N_("How colors are converted from your image's color space to the " \ + "output simulation device (usually your monitor). " \ + "Try them all and choose what looks the best. ") +#define SIMULATION_USE_BPC_BLURB \ + N_("Try with and without black point compensation "\ + "and choose what looks best. ") #define SIMULATION_GAMUT_CHECK_BLURB \ - N_("When enabled, the print simulation will mark colors which can not be " \ - "represented in the target color space.") + N_("When enabled, the print simulation will mark colors " \ + "which can not be represented in the target color space.") #define OUT_OF_GAMUT_COLOR_BLURB \ N_("The color to use for marking colors which are out of gamut.") + enum { PROP_0, @@ -85,7 +97,9 @@ enum PROP_DISPLAY_PROFILE_FROM_GDK, PROP_PRINTER_PROFILE, PROP_DISPLAY_RENDERING_INTENT, + PROP_DISPLAY_USE_BPC, PROP_SIMULATION_RENDERING_INTENT, + PROP_SIMULATION_USE_BPC, PROP_SIMULATION_GAMUT_CHECK, PROP_OUT_OF_GAMUT_COLOR, PROP_DISPLAY_MODULE @@ -153,14 +167,24 @@ gimp_color_config_class_init (GimpColorConfigClass *klass) "display-rendering-intent", DISPLAY_RENDERING_INTENT_BLURB, GIMP_TYPE_COLOR_RENDERING_INTENT, - GIMP_COLOR_RENDERING_INTENT_PERCEPTUAL, + GIMP_COLOR_RENDERING_INTENT_RELATIVE_COLORIMETRIC, GIMP_PARAM_STATIC_STRINGS); + GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_DISPLAY_USE_BPC, + "display-use-black-point-compensation", + DISPLAY_USE_BPC_BLURB, + TRUE, + GIMP_PARAM_STATIC_STRINGS); GIMP_CONFIG_INSTALL_PROP_ENUM (object_class, PROP_SIMULATION_RENDERING_INTENT, "simulation-rendering-intent", SIMULATION_RENDERING_INTENT_BLURB, GIMP_TYPE_COLOR_RENDERING_INTENT, GIMP_COLOR_RENDERING_INTENT_PERCEPTUAL, GIMP_PARAM_STATIC_STRINGS); + GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_SIMULATION_USE_BPC, + "simulation-use-black-point-compensation", + SIMULATION_USE_BPC_BLURB, + FALSE, + GIMP_PARAM_STATIC_STRINGS); GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_SIMULATION_GAMUT_CHECK, "simulation-gamut-check", SIMULATION_GAMUT_CHECK_BLURB, @@ -171,7 +195,6 @@ gimp_color_config_class_init (GimpColorConfigClass *klass) OUT_OF_GAMUT_COLOR_BLURB, FALSE, &color, GIMP_PARAM_STATIC_STRINGS); - GIMP_CONFIG_INSTALL_PROP_STRING (object_class, PROP_DISPLAY_MODULE, "display-module", NULL, "CdisplayLcms", @@ -241,9 +264,15 @@ gimp_color_config_set_property (GObject *object, case PROP_DISPLAY_RENDERING_INTENT: color_config->display_intent = g_value_get_enum (value); break; + case PROP_DISPLAY_USE_BPC: + color_config->display_use_black_point_compensation = g_value_get_boolean (value); + break; case PROP_SIMULATION_RENDERING_INTENT: color_config->simulation_intent = g_value_get_enum (value); break; + case PROP_SIMULATION_USE_BPC: + color_config->simulation_use_black_point_compensation = g_value_get_boolean (value); + break; case PROP_SIMULATION_GAMUT_CHECK: color_config->simulation_gamut_check = g_value_get_boolean (value); break; @@ -254,7 +283,6 @@ gimp_color_config_set_property (GObject *object, g_free (color_config->display_module); color_config->display_module = g_value_dup_string (value); break; - default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -292,9 +320,15 @@ gimp_color_config_get_property (GObject *object, case PROP_DISPLAY_RENDERING_INTENT: g_value_set_enum (value, color_config->display_intent); break; + case PROP_DISPLAY_USE_BPC: + g_value_set_boolean (value, color_config->display_use_black_point_compensation); + break; case PROP_SIMULATION_RENDERING_INTENT: g_value_set_enum (value, color_config->simulation_intent); break; + case PROP_SIMULATION_USE_BPC: + g_value_set_boolean (value, color_config->simulation_use_black_point_compensation); + break; case PROP_SIMULATION_GAMUT_CHECK: g_value_set_boolean (value, color_config->simulation_gamut_check); break; @@ -304,7 +338,6 @@ gimp_color_config_get_property (GObject *object, case PROP_DISPLAY_MODULE: g_value_set_string (value, color_config->display_module); break; - default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; diff --git a/libgimpconfig/gimpcolorconfig.h b/libgimpconfig/gimpcolorconfig.h index 22cf17b8de..9d99428a08 100644 --- a/libgimpconfig/gimpcolorconfig.h +++ b/libgimpconfig/gimpcolorconfig.h @@ -55,10 +55,14 @@ struct _GimpColorConfig gboolean simulation_gamut_check; GimpRGB out_of_gamut_color; + gboolean display_use_black_point_compensation; + gboolean simulation_use_black_point_compensation; + /*< private >*/ /* Padding for future expansion */ - void (* _gimp_reserved1) (void); +#if (GLIB_SIZEOF_VOID_P == 8) void (* _gimp_reserved2) (void); +#endif void (* _gimp_reserved3) (void); void (* _gimp_reserved4) (void); void (* _gimp_reserved5) (void); diff --git a/modules/display-filter-lcms.c b/modules/display-filter-lcms.c index 7510360f64..17966b7602 100644 --- a/modules/display-filter-lcms.c +++ b/modules/display-filter-lcms.c @@ -338,7 +338,6 @@ cdisplay_lcms_changed (GimpColorDisplay *display) cmsHPROFILE src_profile = NULL; cmsHPROFILE dest_profile = NULL; cmsHPROFILE proof_profile = NULL; - cmsUInt32Number flags = 0; cmsUInt16Number alarmCodes[cmsMAXCHANNELS] = { 0, }; if (lcms->transform) @@ -365,27 +364,28 @@ cdisplay_lcms_changed (GimpColorDisplay *display) break; } - if (config->display_intent == - GIMP_COLOR_RENDERING_INTENT_RELATIVE_COLORIMETRIC) - { - flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; - } - if (proof_profile) { + cmsUInt32Number softproof_flags = 0; + if (! src_profile) src_profile = cmsCreate_sRGBProfile (); if (! dest_profile) dest_profile = cmsCreate_sRGBProfile (); - flags |= cmsFLAGS_SOFTPROOFING; + softproof_flags |= cmsFLAGS_SOFTPROOFING; + + if (config->simulation_use_black_point_compensation) + { + softproof_flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; + } if (config->simulation_gamut_check) { guchar r, g, b; - flags |= cmsFLAGS_GAMUTCHECK; + softproof_flags |= cmsFLAGS_GAMUTCHECK; gimp_rgb_get_uchar (&config->out_of_gamut_color, &r, &g, &b); @@ -401,21 +401,28 @@ cdisplay_lcms_changed (GimpColorDisplay *display) proof_profile, config->simulation_intent, config->display_intent, - flags); + softproof_flags); cmsCloseProfile (proof_profile); } else if (src_profile || dest_profile) { + cmsUInt32Number display_flags = 0; + if (! src_profile) src_profile = cmsCreate_sRGBProfile (); if (! dest_profile) dest_profile = cmsCreate_sRGBProfile (); + if (config->display_use_black_point_compensation) + { + display_flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; + } + lcms->transform = cmsCreateTransform (src_profile, TYPE_RGBA_FLT, dest_profile, TYPE_RGBA_FLT, config->display_intent, - flags); + display_flags); } if (dest_profile)