Issue #12577: get rid of the gamma hack.

What it was doing was casting the input buffer to another TRC, basically
pretending the data was what it was not. In particular, it was casting
linear input buffers to non-linear and all other TRCs to linear.

As was noted in #1958, this was in fact a useful trick, yet it's still a
trick. Basically when it's needed, it's either:

1. because the operation implementation does not work in the technically
   correct space. Then the operation code should be fixed;
2. or because several work TRC are valid, then an option should be
   proposed by the operation;
3. or for artistic reasons, which people are free to implement as
   plug-ins or third-party filters, but it should not be a core GIMP
   feature.

Therefore for most cases where it felt needed, the real solution will be
to improve the operations' implementations.
This commit is contained in:
Jehan 2025-01-10 22:31:36 +01:00
parent 496b390724
commit c3ef79b3ef
10 changed files with 2 additions and 184 deletions

View file

@ -51,7 +51,6 @@ enum
PROP_MOVE_TOOL_CHANGES_ACTIVE,
PROP_FILTER_TOOL_MAX_RECENT,
PROP_FILTER_TOOL_USE_LAST_SETTINGS,
PROP_FILTER_TOOL_SHOW_COLOR_OPTIONS,
PROP_TRUST_DIRTY_FLAG,
PROP_SAVE_DEVICE_STATUS,
PROP_DEVICES_SHARE_TOOL,
@ -165,13 +164,6 @@ gimp_gui_config_class_init (GimpGuiConfigClass *klass)
FALSE,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_FILTER_TOOL_SHOW_COLOR_OPTIONS,
"filter-tool-show-color-options",
"Show advanced color options in filters",
FILTER_TOOL_SHOW_COLOR_OPTIONS_BLURB,
FALSE,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_TRUST_DIRTY_FLAG,
"trust-dirty-flag",
"Trust dirty flag",
@ -632,9 +624,6 @@ gimp_gui_config_set_property (GObject *object,
case PROP_FILTER_TOOL_USE_LAST_SETTINGS:
gui_config->filter_tool_use_last_settings = g_value_get_boolean (value);
break;
case PROP_FILTER_TOOL_SHOW_COLOR_OPTIONS:
gui_config->filter_tool_show_color_options = g_value_get_boolean (value);
break;
case PROP_TRUST_DIRTY_FLAG:
gui_config->trust_dirty_flag = g_value_get_boolean (value);
break;
@ -819,9 +808,6 @@ gimp_gui_config_get_property (GObject *object,
case PROP_FILTER_TOOL_USE_LAST_SETTINGS:
g_value_set_boolean (value, gui_config->filter_tool_use_last_settings);
break;
case PROP_FILTER_TOOL_SHOW_COLOR_OPTIONS:
g_value_set_boolean (value, gui_config->filter_tool_show_color_options);
break;
case PROP_TRUST_DIRTY_FLAG:
g_value_set_boolean (value, gui_config->trust_dirty_flag);
break;

View file

@ -45,7 +45,6 @@ struct _GimpGuiConfig
gboolean move_tool_changes_active;
gint filter_tool_max_recent;
gboolean filter_tool_use_last_settings;
gboolean filter_tool_show_color_options;
gboolean trust_dirty_flag;
gboolean save_device_status;
gboolean devices_share_tool;

View file

@ -97,7 +97,6 @@ struct _GimpDrawableFilter
GimpLayerCompositeMode composite_mode;
gboolean add_alpha;
gboolean color_managed;
gboolean gamma_hack;
gboolean override_constraints;
@ -106,8 +105,6 @@ struct _GimpDrawableFilter
GeglNode *translate;
GeglNode *crop_before;
GeglNode *cast_before;
GeglNode *cast_after;
GeglNode *crop_after;
GimpApplicator *applicator;
};
@ -140,7 +137,6 @@ static void gimp_drawable_filter_sync_mode (GimpDrawableFilter
static void gimp_drawable_filter_sync_affect (GimpDrawableFilter *filter);
static void gimp_drawable_filter_sync_format (GimpDrawableFilter *filter);
static void gimp_drawable_filter_sync_mask (GimpDrawableFilter *filter);
static void gimp_drawable_filter_sync_gamma_hack (GimpDrawableFilter *filter);
static gboolean gimp_drawable_filter_is_added (GimpDrawableFilter *filter);
static gboolean gimp_drawable_filter_is_active (GimpDrawableFilter *filter);
@ -386,28 +382,18 @@ gimp_drawable_filter_new (GimpDrawable *drawable,
"operation", "gegl:crop",
NULL);
filter->cast_before = gegl_node_new_child (node,
"operation", "gegl:nop",
NULL);
gegl_node_link_many (input,
filter->translate,
filter->crop_before,
filter->cast_before,
filter->operation,
NULL);
}
filter->cast_after = gegl_node_new_child (node,
"operation", "gegl:nop",
NULL);
filter->crop_after = gegl_node_new_child (node,
"operation", "gegl:crop",
NULL);
gegl_node_link_many (filter->operation,
filter->cast_after,
filter->crop_after,
NULL);
@ -1015,23 +1001,6 @@ gimp_drawable_filter_set_add_alpha (GimpDrawableFilter *filter,
}
}
void
gimp_drawable_filter_set_gamma_hack (GimpDrawableFilter *filter,
gboolean gamma_hack)
{
g_return_if_fail (GIMP_IS_DRAWABLE_FILTER (filter));
if (gamma_hack != filter->gamma_hack)
{
filter->gamma_hack = gamma_hack;
gimp_drawable_filter_sync_gamma_hack (filter);
if (gimp_drawable_filter_is_active (filter))
gimp_drawable_filter_update_drawable (filter, NULL);
}
}
void
gimp_drawable_filter_set_override_constraints (GimpDrawableFilter *filter,
gboolean override_constraints)
@ -1596,62 +1565,6 @@ gimp_drawable_filter_sync_mask (GimpDrawableFilter *filter)
}
}
static void
gimp_drawable_filter_sync_gamma_hack (GimpDrawableFilter *filter)
{
if (filter->gamma_hack)
{
const Babl *drawable_format;
const Babl *cast_format;
GimpTRCType trc = GIMP_TRC_LINEAR;
switch (gimp_drawable_get_trc (filter->drawable))
{
case GIMP_TRC_LINEAR: trc = GIMP_TRC_NON_LINEAR; break;
case GIMP_TRC_NON_LINEAR: trc = GIMP_TRC_LINEAR; break;
case GIMP_TRC_PERCEPTUAL: trc = GIMP_TRC_LINEAR; break;
}
drawable_format =
gimp_drawable_get_format_with_alpha (filter->drawable);
cast_format =
gimp_babl_format (gimp_babl_format_get_base_type (drawable_format),
gimp_babl_precision (gimp_babl_format_get_component_type (drawable_format),
trc),
TRUE,
babl_format_get_space (drawable_format));
if (filter->has_input)
{
gegl_node_set (filter->cast_before,
"operation", "gegl:cast-format",
"input-format", drawable_format,
"output-format", cast_format,
NULL);
}
gegl_node_set (filter->cast_after,
"operation", "gegl:cast-format",
"input-format", cast_format,
"output-format", drawable_format,
NULL);
}
else
{
if (filter->has_input)
{
gegl_node_set (filter->cast_before,
"operation", "gegl:nop",
NULL);
}
gegl_node_set (filter->cast_after,
"operation", "gegl:nop",
NULL);
}
}
static gboolean
gimp_drawable_filter_is_added (GimpDrawableFilter *filter)
{
@ -1690,7 +1603,6 @@ gimp_drawable_filter_add_filter (GimpDrawableFilter *filter)
gimp_drawable_filter_sync_mode (filter);
gimp_drawable_filter_sync_affect (filter);
gimp_drawable_filter_sync_format (filter);
gimp_drawable_filter_sync_gamma_hack (filter);
gimp_drawable_add_filter (filter->drawable,
GIMP_FILTER (filter));

View file

@ -120,9 +120,6 @@ void gimp_drawable_filter_set_mode (GimpDrawableFilter *filter,
void gimp_drawable_filter_set_add_alpha (GimpDrawableFilter *filter,
gboolean add_alpha);
void gimp_drawable_filter_set_gamma_hack (GimpDrawableFilter *filter,
gboolean gamma_hack);
void gimp_drawable_filter_set_override_constraints
(GimpDrawableFilter *filter,
gboolean override_constraints);

View file

@ -408,7 +408,6 @@ prefs_color_management_reset (GtkWidget *widget,
gimp_config_reset (GIMP_CONFIG (core_config->color_management));
gimp_config_reset_property (config, "color-profile-policy");
gimp_config_reset_property (config, "filter-tool-show-color-options");
}
static void
@ -434,7 +433,6 @@ prefs_dialog_defaults_reset (GtkWidget *widget,
gimp_config_reset_property (config, "filter-tool-max-recent");
gimp_config_reset_property (config, "filter-tool-use-last-settings");
gimp_config_reset_property (config, "filter-tool-show-color-options");
g_object_thaw_notify (config);
@ -1506,14 +1504,6 @@ prefs_dialog_new (Gimp *gimp,
_("_File Open behavior:"),
GTK_GRID (grid), 0, size_group);
/* Filter Dialogs */
vbox2 = prefs_frame_new (_("Filter Dialogs"), GTK_CONTAINER (vbox),
FALSE);
button = prefs_check_button_add (object, "filter-tool-show-color-options",
_("Show _advanced color options"),
GTK_BOX (vbox2));
g_clear_object (&size_group);
g_object_unref (store);
@ -2431,9 +2421,6 @@ prefs_dialog_new (Gimp *gimp,
button = prefs_check_button_add (object, "filter-tool-use-last-settings",
_("Default to the last used settings"),
GTK_BOX (vbox2));
button = prefs_check_button_add (object, "filter-tool-show-color-options",
_("Show advanced color options"),
GTK_BOX (vbox2));
/* Canvas Size Dialog */
vbox2 = prefs_frame_new (_("Canvas Size Dialog"),

View file

@ -44,7 +44,6 @@ enum
PROP_REGION,
PROP_MODE,
PROP_OPACITY,
PROP_GAMMA_HACK
};
@ -101,13 +100,6 @@ gimp_operation_settings_class_init (GimpOperationSettingsClass *klass)
NULL,
0.0, 1.0, 1.0,
GIMP_CONFIG_PARAM_DEFAULTS);
GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_GAMMA_HACK,
"gimp-gamma-hack",
"Gamma hack (temp hack, please ignore)",
NULL,
FALSE,
GIMP_CONFIG_PARAM_DEFAULTS);
}
static void
@ -141,10 +133,6 @@ gimp_operation_settings_get_property (GObject *object,
g_value_set_double (value, settings->opacity);
break;
case PROP_GAMMA_HACK:
g_value_set_boolean (value, settings->gamma_hack);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@ -177,10 +165,6 @@ gimp_operation_settings_set_property (GObject *object,
settings->opacity = g_value_get_double (value);
break;
case PROP_GAMMA_HACK:
settings->gamma_hack = g_value_get_boolean (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@ -210,7 +194,6 @@ gimp_operation_settings_sync_drawable_filter (GimpOperationSettings *settings,
GIMP_LAYER_COLOR_SPACE_AUTO,
GIMP_LAYER_COMPOSITE_AUTO);
gimp_drawable_filter_set_opacity (filter, settings->opacity);
gimp_drawable_filter_set_gamma_hack (filter, settings->gamma_hack);
}
@ -223,7 +206,6 @@ static const gchar * const base_properties[] =
"gimp-region",
"gimp-mode",
"gimp-opacity",
"gimp-gamma-hack"
};
gboolean
@ -256,8 +238,7 @@ gimp_operation_settings_config_equal_base (GimpConfig *a,
return settings_a->clip == settings_b->clip &&
settings_a->region == settings_b->region &&
settings_a->mode == settings_b->mode &&
settings_a->opacity == settings_b->opacity &&
settings_a->gamma_hack == settings_b->gamma_hack;
settings_a->opacity == settings_b->opacity;
}
void

View file

@ -43,7 +43,6 @@ struct _GimpOperationSettings
GimpFilterRegion region;
GimpLayerMode mode;
gdouble opacity;
gboolean gamma_hack;
};
struct _GimpOperationSettingsClass

View file

@ -1090,8 +1090,7 @@ gimp_filter_tool_real_config_notify (GimpFilterTool *filter_tool,
{
if (! strcmp (pspec->name, "gimp-clip") ||
! strcmp (pspec->name, "gimp-mode") ||
! strcmp (pspec->name, "gimp-opacity") ||
! strcmp (pspec->name, "gimp-gamma-hack"))
! strcmp (pspec->name, "gimp-opacity"))
{
gimp_filter_tool_update_filter (filter_tool);
}
@ -1381,9 +1380,7 @@ gimp_filter_tool_dialog (GimpFilterTool *filter_tool)
static void
gimp_filter_tool_update_dialog_operation_settings (GimpFilterTool *filter_tool)
{
GimpTool *tool = GIMP_TOOL (filter_tool);
GimpFilterOptions *options = GIMP_FILTER_TOOL_GET_OPTIONS (filter_tool);
GimpImage *image = gimp_display_get_image (tool->display);
if (filter_tool->operation_settings_box)
{
@ -1398,7 +1395,6 @@ gimp_filter_tool_update_dialog_operation_settings (GimpFilterTool *filter_tool)
GtkWidget *vbox2;
GtkWidget *mode_box;
GtkWidget *scale;
GtkWidget *toggle;
vbox = filter_tool->operation_settings_box;
@ -1459,35 +1455,6 @@ gimp_filter_tool_update_dialog_operation_settings (GimpFilterTool *filter_tool)
gtk_box_pack_start (GTK_BOX (vbox2), scale,
FALSE, FALSE, 0);
gtk_widget_show (scale);
/* The Color Options expander */
expander = gtk_expander_new (_("Advanced Color Options"));
gtk_box_pack_start (GTK_BOX (vbox), expander,
FALSE, FALSE, 0);
g_object_bind_property (image->gimp->config,
"filter-tool-show-color-options",
expander, "visible",
G_BINDING_SYNC_CREATE);
g_object_bind_property (options, "color-options-expanded",
expander, "expanded",
G_BINDING_SYNC_CREATE |
G_BINDING_BIDIRECTIONAL);
frame = gimp_frame_new (NULL);
gtk_container_add (GTK_CONTAINER (expander), frame);
gtk_widget_show (frame);
vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
gtk_container_add (GTK_CONTAINER (frame), vbox2);
gtk_widget_show (vbox2);
/* The gamma hack toggle */
toggle = gimp_prop_check_button_new (filter_tool->config,
"gimp-gamma-hack", NULL);
gtk_box_pack_start (GTK_BOX (vbox2), toggle,
FALSE, FALSE, 0);
gtk_widget_show (toggle);
}
}
}

View file

@ -873,11 +873,6 @@ value.
Default to the last used settings in filter tools. Possible values are yes
and no.
.TP
(filter-tool-show-color-options no)
Show advanced color options in filter tools. Possible values are yes and no.
.TP
(trust-dirty-flag no)

View file

@ -684,11 +684,6 @@
#
# (filter-tool-use-last-settings no)
# Show advanced color options in filter tools. Possible values are yes and
# no.
#
# (filter-tool-show-color-options no)
# When enabled, GIMP will not save an image if it has not been changed since
# it was opened. Possible values are yes and no.
#