[gimp/gimp-2-10] Foreground-select Tool: new Preview Mode and color selector for "On color" preview
- From: Jehan <jehanp src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/gimp-2-10] Foreground-select Tool: new Preview Mode and color selector for "On color" preview
- Date: Tue, 18 Jun 2019 16:06:41 +0000 (UTC)
commit 6dd2475bf8f5697fb31f9443e1f87e8316f0ce30
Author: Thomas Manni <thomas manni free fr>
Date: Thu Jun 13 14:46:23 2019 +0200
Foreground-select Tool: new Preview Mode and color selector for "On color" preview
This commit adds a new preview called "Grayscale", allowing to see the
resulting mask in black and white. The previous preview is now called
"On color" and allow users to choose the color and opacity, instead of
imposing only 4 colors (red, green, blue, grey).
(cherry picked from commit d6bcb16b0bf9a539e8799fffb7015a98a8c54809)
app/tools/gimpforegroundselectoptions.c | 82 ++++++++++++++++-----------------
app/tools/gimpforegroundselectoptions.h | 17 ++++---
app/tools/gimpforegroundselecttool.c | 73 +++++++++++++++++++++++++----
app/tools/gimpforegroundselecttool.h | 2 +
app/tools/tools-enums.c | 29 ++++++++++++
app/tools/tools-enums.h | 11 +++++
6 files changed, 153 insertions(+), 61 deletions(-)
---
diff --git a/app/tools/gimpforegroundselectoptions.c b/app/tools/gimpforegroundselectoptions.c
index 52bafc96a2..d88a1f36ca 100644
--- a/app/tools/gimpforegroundselectoptions.c
+++ b/app/tools/gimpforegroundselectoptions.c
@@ -26,6 +26,7 @@
#include "tools-types.h"
+#include "widgets/gimpcolorpanel.h"
#include "widgets/gimppropwidgets.h"
#include "widgets/gimpspinscale.h"
#include "widgets/gimpwidgets-constructors.h"
@@ -46,6 +47,7 @@ enum
{
PROP_0,
PROP_DRAW_MODE,
+ PROP_PREVIEW_MODE,
PROP_STROKE_WIDTH,
PROP_MASK_COLOR,
PROP_ENGINE,
@@ -73,6 +75,7 @@ static void
gimp_foreground_select_options_class_init (GimpForegroundSelectOptionsClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GimpRGB blue = {0.0, 0.0, 1.0, 0.5};
object_class->set_property = gimp_foreground_select_options_set_property;
object_class->get_property = gimp_foreground_select_options_get_property;
@@ -88,6 +91,14 @@ gimp_foreground_select_options_class_init (GimpForegroundSelectOptionsClass *kla
GIMP_MATTING_DRAW_MODE_FOREGROUND,
GIMP_PARAM_STATIC_STRINGS);
+ GIMP_CONFIG_PROP_ENUM (object_class, PROP_PREVIEW_MODE,
+ "preview-mode",
+ _("Preview Mode"),
+ _("Preview Mode"),
+ GIMP_TYPE_MATTING_PREVIEW_MODE,
+ GIMP_MATTING_PREVIEW_MODE_ON_COLOR,
+ GIMP_PARAM_STATIC_STRINGS);
+
GIMP_CONFIG_PROP_INT (object_class, PROP_STROKE_WIDTH,
"stroke-width",
_("Stroke width"),
@@ -95,12 +106,12 @@ gimp_foreground_select_options_class_init (GimpForegroundSelectOptionsClass *kla
1, 6000, 10,
GIMP_PARAM_STATIC_STRINGS);
- GIMP_CONFIG_PROP_ENUM (object_class, PROP_MASK_COLOR,
+ GIMP_CONFIG_PROP_RGB (object_class, PROP_MASK_COLOR,
"mask-color",
_("Preview color"),
_("Color of selection preview mask"),
- GIMP_TYPE_CHANNEL_TYPE,
- GIMP_CHANNEL_BLUE,
+ GIMP_TYPE_RGB,
+ &blue,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_PROP_ENUM (object_class, PROP_ENGINE,
@@ -145,6 +156,7 @@ gimp_foreground_select_options_set_property (GObject *object,
GParamSpec *pspec)
{
GimpForegroundSelectOptions *options = GIMP_FOREGROUND_SELECT_OPTIONS (object);
+ GimpRGB *color;
switch (property_id)
{
@@ -152,12 +164,17 @@ gimp_foreground_select_options_set_property (GObject *object,
options->draw_mode = g_value_get_enum (value);
break;
+ case PROP_PREVIEW_MODE:
+ options->preview_mode = g_value_get_enum (value);
+ break;
+
case PROP_STROKE_WIDTH:
options->stroke_width = g_value_get_int (value);
break;
case PROP_MASK_COLOR:
- options->mask_color = g_value_get_enum (value);
+ color = g_value_get_boxed (value);
+ options->mask_color = *color;
break;
case PROP_ENGINE:
@@ -201,12 +218,16 @@ gimp_foreground_select_options_get_property (GObject *object,
g_value_set_enum (value, options->draw_mode);
break;
+ case PROP_PREVIEW_MODE:
+ g_value_set_enum (value, options->preview_mode);
+ break;
+
case PROP_STROKE_WIDTH:
g_value_set_int (value, options->stroke_width);
break;
case PROP_MASK_COLOR:
- g_value_set_enum (value, options->mask_color);
+ g_value_set_boxed (value, &options->mask_color);
break;
case PROP_ENGINE:
@@ -299,13 +320,21 @@ gimp_foreground_select_options_gui (GimpToolOptions *tool_options)
gimp_help_set_help_data (button,
_("Reset stroke width native size"), NULL);
+ /* preview mode */
+
+ frame = gimp_prop_enum_radio_frame_new (config, "preview-mode", NULL,
+ 0, 0);
+ gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
+ gtk_widget_show (frame);
+
/* mask color */
- combo = gimp_prop_enum_combo_box_new (config, "mask-color",
- GIMP_CHANNEL_RED, GIMP_CHANNEL_GRAY);
- gimp_int_combo_box_set_label (GIMP_INT_COMBO_BOX (combo), _("Preview color"));
- g_object_set (combo, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
- gtk_box_pack_start (GTK_BOX (vbox), combo, FALSE, FALSE, 0);
- gtk_widget_show (combo);
+ button = gimp_prop_color_button_new (config, "mask-color",
+ NULL,
+ 128, 24,
+ GIMP_COLOR_AREA_SMALL_CHECKS);
+ gimp_color_panel_set_context (GIMP_COLOR_PANEL (button), GIMP_CONTEXT (config));
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_widget_show (button);
/* engine */
frame = gimp_frame_new (NULL);
@@ -364,34 +393,3 @@ gimp_foreground_select_options_gui (GimpToolOptions *tool_options)
return vbox;
}
-
-void
-gimp_foreground_select_options_get_mask_color (GimpForegroundSelectOptions *options,
- GimpRGB *color)
-{
- g_return_if_fail (GIMP_IS_FOREGROUND_SELECT_OPTIONS (options));
- g_return_if_fail (color != NULL);
-
- switch (options->mask_color)
- {
- case GIMP_CHANNEL_RED:
- gimp_rgba_set (color, 1, 0, 0, 0.7);
- break;
-
- case GIMP_CHANNEL_GREEN:
- gimp_rgba_set (color, 0, 1, 0, 0.7);
- break;
-
- case GIMP_CHANNEL_BLUE:
- gimp_rgba_set (color, 0, 0, 1, 0.7);
- break;
-
- case GIMP_CHANNEL_GRAY:
- gimp_rgba_set (color, 1, 1, 1, 0.7);
- break;
-
- default:
- g_warn_if_reached ();
- break;
- }
-}
diff --git a/app/tools/gimpforegroundselectoptions.h b/app/tools/gimpforegroundselectoptions.h
index d90b9452b4..e6cd1a9a62 100644
--- a/app/tools/gimpforegroundselectoptions.h
+++ b/app/tools/gimpforegroundselectoptions.h
@@ -38,13 +38,14 @@ struct _GimpForegroundSelectOptions
{
GimpSelectionOptions parent_instance;
- GimpMattingDrawMode draw_mode;
- gint stroke_width;
- GimpChannelType mask_color;
- GimpMattingEngine engine;
- gint levels;
- gint active_levels;
- gint iterations;
+ GimpMattingDrawMode draw_mode;
+ GimpMattingPreviewMode preview_mode;
+ gint stroke_width;
+ GimpRGB mask_color;
+ GimpMattingEngine engine;
+ gint levels;
+ gint active_levels;
+ gint iterations;
};
struct _GimpForegroundSelectOptionsClass
@@ -57,8 +58,6 @@ GType gimp_foreground_select_options_get_type (void) G_GNUC_CONST;
GtkWidget * gimp_foreground_select_options_gui (GimpToolOptions *tool_options);
-void gimp_foreground_select_options_get_mask_color (GimpForegroundSelectOptions *options,
- GimpRGB *color);
#endif /* __GIMP_FOREGROUND_SELECT_OPTIONS_H__ */
diff --git a/app/tools/gimpforegroundselecttool.c b/app/tools/gimpforegroundselecttool.c
index f500e0ba4d..000512e575 100644
--- a/app/tools/gimpforegroundselecttool.c
+++ b/app/tools/gimpforegroundselecttool.c
@@ -49,6 +49,8 @@
#include "widgets/gimphelp-ids.h"
#include "widgets/gimpwidgets-utils.h"
+#include "display/gimpcanvasitem.h"
+#include "display/gimpcanvasbufferpreview.h"
#include "display/gimpdisplay.h"
#include "display/gimpdisplayshell.h"
#include "display/gimptoolgui.h"
@@ -246,6 +248,7 @@ gimp_foreground_select_tool_init (GimpForegroundSelectTool *fg_select)
"tools/tools-foreground-select-brush-size-set");
fg_select->state = MATTING_STATE_FREE_SELECT;
+ fg_select->grayscale_preview = NULL;
}
static void
@@ -777,7 +780,8 @@ gimp_foreground_select_tool_options_notify (GimpTool *tool,
if (! tool->display)
return;
- if (! strcmp (pspec->name, "mask-color"))
+ if (! strcmp (pspec->name, "mask-color") ||
+ ! strcmp (pspec->name, "preview-mode"))
{
if (fg_select->state == MATTING_STATE_PAINT_TRIMAP)
{
@@ -890,6 +894,9 @@ gimp_foreground_select_tool_draw (GimpDrawTool *draw_tool)
x - radius, y - radius,
2 * radius, 2 * radius,
0.0, 2.0 * G_PI);
+
+ if (fg_select->grayscale_preview)
+ gimp_draw_tool_add_preview (draw_tool, fg_select->grayscale_preview);
}
}
@@ -921,6 +928,10 @@ gimp_foreground_select_tool_confirm (GimpPolygonSelectTool *poly_sel,
0, 0, 0.5);
gimp_scan_convert_free (scan_convert);
+ fg_select->grayscale_preview =
+ gimp_canvas_buffer_preview_new (gimp_display_get_shell (display),
+ fg_select->trimap);
+
gimp_foreground_select_tool_set_trimap (fg_select);
}
}
@@ -928,8 +939,15 @@ gimp_foreground_select_tool_confirm (GimpPolygonSelectTool *poly_sel,
static void
gimp_foreground_select_tool_halt (GimpForegroundSelectTool *fg_select)
{
- GimpTool *tool = GIMP_TOOL (fg_select);
+ GimpTool *tool = GIMP_TOOL (fg_select);
+ GimpDrawTool *draw_tool = GIMP_DRAW_TOOL (fg_select);
+ if (draw_tool->preview)
+ {
+ gimp_draw_tool_remove_preview (draw_tool, fg_select->grayscale_preview);
+ }
+
+ g_clear_object (&fg_select->grayscale_preview);
g_clear_object (&fg_select->trimap);
g_clear_object (&fg_select->mask);
@@ -1010,7 +1028,6 @@ gimp_foreground_select_tool_set_trimap (GimpForegroundSelectTool *fg_select)
{
GimpTool *tool = GIMP_TOOL (fg_select);
GimpForegroundSelectOptions *options;
- GimpRGB color;
g_return_if_fail (fg_select->trimap != NULL);
@@ -1018,9 +1035,28 @@ gimp_foreground_select_tool_set_trimap (GimpForegroundSelectTool *fg_select)
gimp_polygon_select_tool_halt (GIMP_POLYGON_SELECT_TOOL (fg_select));
- gimp_foreground_select_options_get_mask_color (options, &color);
- gimp_display_shell_set_mask (gimp_display_get_shell (tool->display),
- fg_select->trimap, 0, 0, &color, TRUE);
+ if (options->preview_mode == GIMP_MATTING_PREVIEW_MODE_ON_COLOR)
+ {
+ if (fg_select->grayscale_preview)
+ gimp_canvas_item_set_visible (fg_select->grayscale_preview, FALSE);
+
+ gimp_display_shell_set_mask (gimp_display_get_shell (tool->display),
+ fg_select->trimap, 0, 0,
+ &options->mask_color, TRUE);
+ }
+ else
+ {
+ gimp_display_shell_set_mask (gimp_display_get_shell (tool->display),
+ NULL, 0, 0, NULL, FALSE);
+
+ if (fg_select->grayscale_preview)
+ {
+ g_object_set (fg_select->grayscale_preview, "buffer",
+ fg_select->trimap, NULL);
+
+ gimp_canvas_item_set_visible (fg_select->grayscale_preview, TRUE);
+ }
+ }
gimp_tool_control_set_tool_cursor (tool->control,
GIMP_TOOL_CURSOR_PAINTBRUSH);
@@ -1047,15 +1083,32 @@ gimp_foreground_select_tool_set_preview (GimpForegroundSelectTool *fg_select)
GimpTool *tool = GIMP_TOOL (fg_select);
GimpForegroundSelectOptions *options;
- GimpRGB color;
g_return_if_fail (fg_select->mask != NULL);
options = GIMP_FOREGROUND_SELECT_TOOL_GET_OPTIONS (tool);
- gimp_foreground_select_options_get_mask_color (options, &color);
- gimp_display_shell_set_mask (gimp_display_get_shell (tool->display),
- fg_select->mask, 0, 0, &color, TRUE);
+ if (options->preview_mode == GIMP_MATTING_PREVIEW_MODE_ON_COLOR)
+ {
+ if (fg_select->grayscale_preview)
+ gimp_canvas_item_set_visible (fg_select->grayscale_preview, FALSE);
+
+ gimp_display_shell_set_mask (gimp_display_get_shell (tool->display),
+ fg_select->mask, 0, 0,
+ &options->mask_color, TRUE);
+ }
+ else
+ {
+ gimp_display_shell_set_mask (gimp_display_get_shell (tool->display),
+ NULL, 0, 0, NULL, FALSE);
+
+ if (fg_select->grayscale_preview)
+ {
+ g_object_set (fg_select->grayscale_preview, "buffer",
+ fg_select->mask, NULL);
+ gimp_canvas_item_set_visible (fg_select->grayscale_preview, TRUE);
+ }
+ }
gimp_tool_control_set_tool_cursor (tool->control,
GIMP_TOOL_CURSOR_PAINTBRUSH);
diff --git a/app/tools/gimpforegroundselecttool.h b/app/tools/gimpforegroundselecttool.h
index 0dcd19ae13..648652cf1f 100644
--- a/app/tools/gimpforegroundselecttool.h
+++ b/app/tools/gimpforegroundselecttool.h
@@ -59,6 +59,8 @@ struct _GimpForegroundSelectTool
GimpToolGui *gui;
GtkWidget *preview_toggle;
+
+ GimpCanvasItem *grayscale_preview;
};
struct _GimpForegroundSelectToolClass
diff --git a/app/tools/tools-enums.c b/app/tools/tools-enums.c
index 30ac1073af..1897428d7d 100644
--- a/app/tools/tools-enums.c
+++ b/app/tools/tools-enums.c
@@ -230,6 +230,35 @@ gimp_matting_draw_mode_get_type (void)
return type;
}
+GType
+gimp_matting_preview_mode_get_type (void)
+{
+ static const GEnumValue values[] =
+ {
+ { GIMP_MATTING_PREVIEW_MODE_ON_COLOR, "GIMP_MATTING_PREVIEW_MODE_ON_COLOR", "on-color" },
+ { GIMP_MATTING_PREVIEW_MODE_GRAYSCALE, "GIMP_MATTING_PREVIEW_MODE_GRAYSCALE", "grayscale" },
+ { 0, NULL, NULL }
+ };
+
+ static const GimpEnumDesc descs[] =
+ {
+ { GIMP_MATTING_PREVIEW_MODE_ON_COLOR, NC_("matting-preview-mode", "On color"), NULL },
+ { GIMP_MATTING_PREVIEW_MODE_GRAYSCALE, NC_("matting-preview-mode", "Grayscale"), NULL },
+ { 0, NULL, NULL }
+ };
+
+ static GType type = 0;
+
+ if (G_UNLIKELY (! type))
+ {
+ type = g_enum_register_static ("GimpMattingPreviewMode", values);
+ gimp_type_set_translation_context (type, "matting-preview-mode");
+ gimp_enum_set_value_descriptions (type, descs);
+ }
+
+ return type;
+}
+
GType
gimp_warp_behavior_get_type (void)
{
diff --git a/app/tools/tools-enums.h b/app/tools/tools-enums.h
index be53c0b29c..ae8a8aab9a 100644
--- a/app/tools/tools-enums.h
+++ b/app/tools/tools-enums.h
@@ -126,6 +126,17 @@ typedef enum
} GimpMattingDrawMode;
+#define GIMP_TYPE_MATTING_PREVIEW_MODE (gimp_matting_preview_mode_get_type ())
+
+GType gimp_matting_preview_mode_get_type (void) G_GNUC_CONST;
+
+typedef enum
+{
+ GIMP_MATTING_PREVIEW_MODE_ON_COLOR, /*< desc="On color" >*/
+ GIMP_MATTING_PREVIEW_MODE_GRAYSCALE, /*< desc="Grayscale" >*/
+} GimpMattingPreviewMode;
+
+
#define GIMP_TYPE_WARP_BEHAVIOR (gimp_warp_behavior_get_type ())
GType gimp_warp_behavior_get_type (void) G_GNUC_CONST;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]