From 0c05c33b80d875009cf0f665d719b4356c679a88 Mon Sep 17 00:00:00 2001 From: Ell Date: Mon, 6 Jan 2020 12:36:16 +0200 Subject: [PATCH] app, icons: add GimpPivotSelector widget GimpPivotSelector is a 3x3 grid of toggle buttons, used for selecting a natural pivot position (e.g., for a transform) relative to an item: its center, its corners, and the midpoints of its edges. --- app/widgets/Makefile.am | 2 + app/widgets/gimppivotselector.c | 547 ++++++++++++++++++ app/widgets/gimppivotselector.h | 78 +++ app/widgets/widgets-types.h | 1 + icons/Color/12/gimp-pivot-center.png | Bin 0 -> 172 bytes icons/Color/12/gimp-pivot-east.png | Bin 0 -> 196 bytes icons/Color/12/gimp-pivot-north-east.png | Bin 0 -> 195 bytes icons/Color/12/gimp-pivot-north-west.png | Bin 0 -> 190 bytes icons/Color/12/gimp-pivot-north.png | Bin 0 -> 184 bytes icons/Color/12/gimp-pivot-south-east.png | Bin 0 -> 201 bytes icons/Color/12/gimp-pivot-south-west.png | Bin 0 -> 201 bytes icons/Color/12/gimp-pivot-south.png | Bin 0 -> 184 bytes icons/Color/12/gimp-pivot-west.png | Bin 0 -> 196 bytes icons/Color/scalable/gimp-pivot-center.svg | 81 +++ icons/Color/scalable/gimp-pivot-east.svg | 118 ++++ .../Color/scalable/gimp-pivot-north-east.svg | 122 ++++ .../Color/scalable/gimp-pivot-north-west.svg | 118 ++++ icons/Color/scalable/gimp-pivot-north.svg | 119 ++++ .../Color/scalable/gimp-pivot-south-east.svg | 122 ++++ .../Color/scalable/gimp-pivot-south-west.svg | 122 ++++ icons/Color/scalable/gimp-pivot-south.svg | 119 ++++ icons/Color/scalable/gimp-pivot-west.svg | 118 ++++ icons/Symbolic/12/gimp-pivot-center.png | Bin 0 -> 166 bytes icons/Symbolic/12/gimp-pivot-east.png | Bin 0 -> 183 bytes icons/Symbolic/12/gimp-pivot-north-east.png | Bin 0 -> 187 bytes icons/Symbolic/12/gimp-pivot-north-west.png | Bin 0 -> 187 bytes icons/Symbolic/12/gimp-pivot-north.png | Bin 0 -> 171 bytes icons/Symbolic/12/gimp-pivot-south-east.png | Bin 0 -> 188 bytes icons/Symbolic/12/gimp-pivot-south-west.png | Bin 0 -> 189 bytes icons/Symbolic/12/gimp-pivot-south.png | Bin 0 -> 171 bytes icons/Symbolic/12/gimp-pivot-west.png | Bin 0 -> 183 bytes icons/Symbolic/scalable/gimp-pivot-center.svg | 74 +++ icons/Symbolic/scalable/gimp-pivot-east.svg | 89 +++ .../scalable/gimp-pivot-north-east.svg | 89 +++ .../scalable/gimp-pivot-north-west.svg | 85 +++ icons/Symbolic/scalable/gimp-pivot-north.svg | 85 +++ .../scalable/gimp-pivot-south-east.svg | 89 +++ .../scalable/gimp-pivot-south-west.svg | 89 +++ icons/Symbolic/scalable/gimp-pivot-south.svg | 85 +++ icons/Symbolic/scalable/gimp-pivot-west.svg | 89 +++ icons/icon-list.mk | 18 + libgimpwidgets/gimpicons.h | 10 + 42 files changed, 2469 insertions(+) create mode 100644 app/widgets/gimppivotselector.c create mode 100644 app/widgets/gimppivotselector.h create mode 100644 icons/Color/12/gimp-pivot-center.png create mode 100644 icons/Color/12/gimp-pivot-east.png create mode 100644 icons/Color/12/gimp-pivot-north-east.png create mode 100644 icons/Color/12/gimp-pivot-north-west.png create mode 100644 icons/Color/12/gimp-pivot-north.png create mode 100644 icons/Color/12/gimp-pivot-south-east.png create mode 100644 icons/Color/12/gimp-pivot-south-west.png create mode 100644 icons/Color/12/gimp-pivot-south.png create mode 100644 icons/Color/12/gimp-pivot-west.png create mode 100644 icons/Color/scalable/gimp-pivot-center.svg create mode 100644 icons/Color/scalable/gimp-pivot-east.svg create mode 100644 icons/Color/scalable/gimp-pivot-north-east.svg create mode 100644 icons/Color/scalable/gimp-pivot-north-west.svg create mode 100644 icons/Color/scalable/gimp-pivot-north.svg create mode 100644 icons/Color/scalable/gimp-pivot-south-east.svg create mode 100644 icons/Color/scalable/gimp-pivot-south-west.svg create mode 100644 icons/Color/scalable/gimp-pivot-south.svg create mode 100644 icons/Color/scalable/gimp-pivot-west.svg create mode 100644 icons/Symbolic/12/gimp-pivot-center.png create mode 100644 icons/Symbolic/12/gimp-pivot-east.png create mode 100644 icons/Symbolic/12/gimp-pivot-north-east.png create mode 100644 icons/Symbolic/12/gimp-pivot-north-west.png create mode 100644 icons/Symbolic/12/gimp-pivot-north.png create mode 100644 icons/Symbolic/12/gimp-pivot-south-east.png create mode 100644 icons/Symbolic/12/gimp-pivot-south-west.png create mode 100644 icons/Symbolic/12/gimp-pivot-south.png create mode 100644 icons/Symbolic/12/gimp-pivot-west.png create mode 100644 icons/Symbolic/scalable/gimp-pivot-center.svg create mode 100644 icons/Symbolic/scalable/gimp-pivot-east.svg create mode 100644 icons/Symbolic/scalable/gimp-pivot-north-east.svg create mode 100644 icons/Symbolic/scalable/gimp-pivot-north-west.svg create mode 100644 icons/Symbolic/scalable/gimp-pivot-north.svg create mode 100644 icons/Symbolic/scalable/gimp-pivot-south-east.svg create mode 100644 icons/Symbolic/scalable/gimp-pivot-south-west.svg create mode 100644 icons/Symbolic/scalable/gimp-pivot-south.svg create mode 100644 icons/Symbolic/scalable/gimp-pivot-west.svg diff --git a/app/widgets/Makefile.am b/app/widgets/Makefile.am index 156fac32f3..0495f839fb 100644 --- a/app/widgets/Makefile.am +++ b/app/widgets/Makefile.am @@ -310,6 +310,8 @@ libappwidgets_a_sources = \ gimppickablebutton.h \ gimppickablepopup.c \ gimppickablepopup.h \ + gimppivotselector.c \ + gimppivotselector.h \ gimppixbuf.c \ gimppixbuf.h \ gimppluginview.c \ diff --git a/app/widgets/gimppivotselector.c b/app/widgets/gimppivotselector.c new file mode 100644 index 0000000000..598513a8d7 --- /dev/null +++ b/app/widgets/gimppivotselector.c @@ -0,0 +1,547 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimppivotselector.c + * Copyright (C) 2019 Ell + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "config.h" + +#include +#include + +#include "libgimpbase/gimpbase.h" +#include "libgimpmath/gimpmath.h" +#include "libgimpwidgets/gimpwidgets.h" + +#include "widgets-types.h" + +#include "core/gimpmarshal.h" + +#include "gimppivotselector.h" + + +#define EPSILON 1e-6 + + +enum +{ + CHANGED, + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_LEFT, + PROP_TOP, + PROP_RIGHT, + PROP_BOTTOM, + PROP_X, + PROP_Y +}; + + +struct _GimpPivotSelectorPrivate +{ + gdouble left; + gdouble top; + gdouble right; + gdouble bottom; + + gdouble x; + gdouble y; + + GtkWidget *buttons[9]; + GtkWidget *active_button; +}; + + +/* local function prototypes */ + +static void gimp_pivot_selector_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec); +static void gimp_pivot_selector_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec); + +static void gimp_pivot_selector_button_toggled (GtkToggleButton *button, + GimpPivotSelector *selector); + +static GtkWidget * gimp_pivot_selector_position_to_button (GimpPivotSelector *selector, + gdouble x, + gdouble y); +static void gimp_pivot_selector_button_to_position (GimpPivotSelector *selector, + GtkWidget *button, + gdouble *x, + gdouble *y); + +static void gimp_pivot_selector_update_active_button (GimpPivotSelector *selector); + + +G_DEFINE_TYPE_WITH_PRIVATE (GimpPivotSelector, gimp_pivot_selector, GTK_TYPE_TABLE) + +#define parent_class gimp_pivot_selector_parent_class + +static guint pivot_selector_signals[LAST_SIGNAL]; + + +/* private functions */ + + +static void +gimp_pivot_selector_class_init (GimpPivotSelectorClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + pivot_selector_signals[CHANGED] = + g_signal_new ("changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GimpPivotSelectorClass, changed), + NULL, NULL, + gimp_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + object_class->get_property = gimp_pivot_selector_get_property; + object_class->set_property = gimp_pivot_selector_set_property; + + g_object_class_install_property (object_class, PROP_LEFT, + g_param_spec_double ("left", + NULL, NULL, + -G_MAXDOUBLE, + +G_MAXDOUBLE, + 0.0, + GIMP_PARAM_READWRITE | + G_PARAM_CONSTRUCT)); + + g_object_class_install_property (object_class, PROP_TOP, + g_param_spec_double ("top", + NULL, NULL, + -G_MAXDOUBLE, + +G_MAXDOUBLE, + 0.0, + GIMP_PARAM_READWRITE | + G_PARAM_CONSTRUCT)); + + g_object_class_install_property (object_class, PROP_RIGHT, + g_param_spec_double ("right", + NULL, NULL, + -G_MAXDOUBLE, + +G_MAXDOUBLE, + 0.0, + GIMP_PARAM_READWRITE | + G_PARAM_CONSTRUCT)); + + g_object_class_install_property (object_class, PROP_BOTTOM, + g_param_spec_double ("bottom", + NULL, NULL, + -G_MAXDOUBLE, + +G_MAXDOUBLE, + 0.0, + GIMP_PARAM_READWRITE | + G_PARAM_CONSTRUCT)); + + g_object_class_install_property (object_class, PROP_X, + g_param_spec_double ("x", + NULL, NULL, + -G_MAXDOUBLE, + +G_MAXDOUBLE, + 0.0, + GIMP_PARAM_READWRITE | + G_PARAM_CONSTRUCT)); + + g_object_class_install_property (object_class, PROP_Y, + g_param_spec_double ("y", + NULL, NULL, + -G_MAXDOUBLE, + +G_MAXDOUBLE, + 0.0, + GIMP_PARAM_READWRITE | + G_PARAM_CONSTRUCT)); +} + +static void +gimp_pivot_selector_init (GimpPivotSelector *selector) +{ + GtkTable *table = GTK_TABLE (selector); + gint i; + + selector->priv = gimp_pivot_selector_get_instance_private (selector); + + gtk_table_resize (table, 3, 3); + gtk_table_set_homogeneous (table, TRUE); + + for (i = 0; i < 9; i++) + { + static const gchar *icon_names[9] = { + GIMP_ICON_PIVOT_NORTH_WEST, + GIMP_ICON_PIVOT_NORTH, + GIMP_ICON_PIVOT_NORTH_EAST, + + GIMP_ICON_PIVOT_WEST, + GIMP_ICON_PIVOT_CENTER, + GIMP_ICON_PIVOT_EAST, + + GIMP_ICON_PIVOT_SOUTH_WEST, + GIMP_ICON_PIVOT_SOUTH, + GIMP_ICON_PIVOT_SOUTH_EAST + }; + + GtkWidget *button; + GtkWidget *image; + gint x, y; + + x = i % 3; + y = i / 3; + + button = gtk_toggle_button_new (); + gtk_widget_set_can_focus (button, FALSE); + gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE); + gtk_table_attach_defaults (table, button, + x, x + 1, y, y + 1); + gtk_widget_show (button); + + selector->priv->buttons[i] = button; + + g_signal_connect (button, "toggled", + G_CALLBACK (gimp_pivot_selector_button_toggled), + selector); + + image = gtk_image_new_from_icon_name (icon_names[i], GTK_ICON_SIZE_MENU); + gtk_image_set_pixel_size (GTK_IMAGE (image), 12); + gtk_container_add (GTK_CONTAINER (button), image); + gtk_widget_show (image); + } +} + +static void +gimp_pivot_selector_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GimpPivotSelector *selector = GIMP_PIVOT_SELECTOR (object); + + switch (property_id) + { + case PROP_LEFT: + gimp_pivot_selector_set_bounds (selector, + g_value_get_double (value), + selector->priv->top, + selector->priv->right, + selector->priv->bottom); + break; + case PROP_TOP: + gimp_pivot_selector_set_bounds (selector, + selector->priv->left, + g_value_get_double (value), + selector->priv->right, + selector->priv->bottom); + break; + case PROP_RIGHT: + gimp_pivot_selector_set_bounds (selector, + selector->priv->left, + selector->priv->top, + g_value_get_double (value), + selector->priv->bottom); + break; + case PROP_BOTTOM: + gimp_pivot_selector_set_bounds (selector, + selector->priv->left, + selector->priv->top, + selector->priv->right, + g_value_get_double (value)); + break; + + case PROP_X: + gimp_pivot_selector_set_position (selector, + g_value_get_double (value), + selector->priv->y); + break; + case PROP_Y: + gimp_pivot_selector_set_position (selector, + selector->priv->x, + g_value_get_double (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gimp_pivot_selector_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GimpPivotSelector *selector = GIMP_PIVOT_SELECTOR (object); + + switch (property_id) + { + case PROP_LEFT: + g_value_set_double (value, selector->priv->left); + break; + case PROP_TOP: + g_value_set_double (value, selector->priv->top); + break; + case PROP_RIGHT: + g_value_set_double (value, selector->priv->right); + break; + case PROP_BOTTOM: + g_value_set_double (value, selector->priv->bottom); + break; + + case PROP_X: + g_value_set_double (value, selector->priv->x); + break; + case PROP_Y: + g_value_set_double (value, selector->priv->y); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +gimp_pivot_selector_button_toggled (GtkToggleButton *button, + GimpPivotSelector *selector) +{ + if (GTK_WIDGET (button) == selector->priv->active_button) + { + gtk_toggle_button_set_active (button, TRUE); + } + else + { + gdouble x, y; + + gimp_pivot_selector_button_to_position (selector, GTK_WIDGET (button), + &x, &y); + + gimp_pivot_selector_set_position (selector, x, y); + } +} + +static GtkWidget * +gimp_pivot_selector_position_to_button (GimpPivotSelector *selector, + gdouble x, + gdouble y) +{ + gint ix; + gint iy; + + if (selector->priv->left == selector->priv->right || + selector->priv->top == selector->priv->bottom) + { + return NULL; + } + + x = 2.0 * (x - selector->priv->left) / + (selector->priv->right - selector->priv->left); + y = 2.0 * (y - selector->priv->top) / + (selector->priv->bottom - selector->priv->top); + + ix = RINT (x); + iy = RINT (y); + + if (fabs (x - ix) > EPSILON || fabs (y - iy) > EPSILON) + return NULL; + + if (ix < 0 || ix > 2 || iy < 0 || iy > 2) + return NULL; + + return selector->priv->buttons[3 * iy + ix]; +} + +static void +gimp_pivot_selector_button_to_position (GimpPivotSelector *selector, + GtkWidget *button, + gdouble *x, + gdouble *y) +{ + gint i; + + for (i = 0; selector->priv->buttons[i] != button; i++); + + *x = selector->priv->left + + (selector->priv->right - selector->priv->left) * (i % 3) / 2.0; + *y = selector->priv->top + + (selector->priv->bottom - selector->priv->top) * (i / 3) / 2.0; +} + +static void +gimp_pivot_selector_update_active_button (GimpPivotSelector *selector) +{ + GtkWidget *button; + + button = gimp_pivot_selector_position_to_button (selector, + selector->priv->x, + selector->priv->y); + + if (button != selector->priv->active_button) + { + if (selector->priv->active_button) + { + g_signal_handlers_block_by_func ( + selector->priv->active_button, + gimp_pivot_selector_button_toggled, + selector); + + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON (selector->priv->active_button), FALSE); + + g_signal_handlers_unblock_by_func ( + selector->priv->active_button, + gimp_pivot_selector_button_toggled, + selector); + } + + selector->priv->active_button = button; + + if (selector->priv->active_button) + { + g_signal_handlers_block_by_func ( + selector->priv->active_button, + gimp_pivot_selector_button_toggled, + selector); + + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON (selector->priv->active_button), TRUE); + + g_signal_handlers_unblock_by_func ( + selector->priv->active_button, + gimp_pivot_selector_button_toggled, + selector); + } + } +} + + +/* public functions */ + + +GtkWidget * +gimp_pivot_selector_new (gdouble left, + gdouble top, + gdouble right, + gdouble bottom) +{ + return g_object_new (GIMP_TYPE_PIVOT_SELECTOR, + + "left", left, + "top", top, + "right", right, + "bottom", bottom, + + "x", (left + right) / 2.0, + "y", (top + bottom) / 2.0, + + NULL); +} + +void +gimp_pivot_selector_set_bounds (GimpPivotSelector *selector, + gdouble left, + gdouble top, + gdouble right, + gdouble bottom) +{ + g_return_if_fail (GIMP_IS_PIVOT_SELECTOR (selector)); + + if (left != selector->priv->left || top != selector->priv->top || + right != selector->priv->right || bottom != selector->priv->bottom) + { + g_object_freeze_notify (G_OBJECT (selector)); + + selector->priv->left = left; + selector->priv->top = top; + selector->priv->right = right; + selector->priv->bottom = bottom; + + gimp_pivot_selector_update_active_button (selector); + + if (left != selector->priv->left) + g_object_notify (G_OBJECT (selector), "left"); + if (top != selector->priv->top) + g_object_notify (G_OBJECT (selector), "top"); + if (right != selector->priv->right) + g_object_notify (G_OBJECT (selector), "right"); + if (left != selector->priv->bottom) + g_object_notify (G_OBJECT (selector), "bottom"); + + g_object_thaw_notify (G_OBJECT (selector)); + } +} + +void +gimp_pivot_selector_get_bounds (GimpPivotSelector *selector, + gdouble *left, + gdouble *top, + gdouble *right, + gdouble *bottom) +{ + g_return_if_fail (GIMP_IS_PIVOT_SELECTOR (selector)); + + if (left) *left = selector->priv->left; + if (top) *top = selector->priv->top; + if (right) *right = selector->priv->right; + if (bottom) *bottom = selector->priv->bottom; +} + +void +gimp_pivot_selector_set_position (GimpPivotSelector *selector, + gdouble x, + gdouble y) +{ + g_return_if_fail (GIMP_IS_PIVOT_SELECTOR (selector)); + + if (x != selector->priv->x || y != selector->priv->y) + { + g_object_freeze_notify (G_OBJECT (selector)); + + selector->priv->x = x; + selector->priv->y = y; + + gimp_pivot_selector_update_active_button (selector); + + g_signal_emit (selector, pivot_selector_signals[CHANGED], 0); + + if (x != selector->priv->x) + g_object_notify (G_OBJECT (selector), "x"); + if (y != selector->priv->y) + g_object_notify (G_OBJECT (selector), "y"); + + g_object_thaw_notify (G_OBJECT (selector)); + } +} + +void +gimp_pivot_selector_get_position (GimpPivotSelector *selector, + gdouble *x, + gdouble *y) +{ + g_return_if_fail (GIMP_IS_PIVOT_SELECTOR (selector)); + + if (x) *x = selector->priv->x; + if (y) *y = selector->priv->y; +} diff --git a/app/widgets/gimppivotselector.h b/app/widgets/gimppivotselector.h new file mode 100644 index 0000000000..1603b404ed --- /dev/null +++ b/app/widgets/gimppivotselector.h @@ -0,0 +1,78 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimppivotselector.h + * Copyright (C) 2019 Ell + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef __GIMP_PIVOT_SELECTOR_H__ +#define __GIMP_PIVOT_SELECTOR_H__ + + +#define GIMP_TYPE_PIVOT_SELECTOR (gimp_pivot_selector_get_type ()) +#define GIMP_PIVOT_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_PIVOT_SELECTOR, GimpPivotSelector)) +#define GIMP_PIVOT_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_PIVOT_SELECTOR, GimpPivotSelectorClass)) +#define GIMP_IS_PIVOT_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE (obj, GIMP_TYPE_PIVOT_SELECTOR)) +#define GIMP_IS_PIVOT_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_PIVOT_SELECTOR)) +#define GIMP_PIVOT_SELECTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_PIVOT_SELECTOR, GimpPivotSelectorClass)) + + +typedef struct _GimpPivotSelectorPrivate GimpPivotSelectorPrivate; +typedef struct _GimpPivotSelectorClass GimpPivotSelectorClass; + +struct _GimpPivotSelector +{ + GtkTable parent_instance; + + GimpPivotSelectorPrivate *priv; +}; + +struct _GimpPivotSelectorClass +{ + GtkTableClass parent_class; + + /* signals */ + void (* changed) (GimpPivotSelector *selector); +}; + + +GType gimp_pivot_selector_get_type (void) G_GNUC_CONST; + +GtkWidget * gimp_pivot_selector_new (gdouble left, + gdouble top, + gdouble right, + gdouble bottom); + +void gimp_pivot_selector_set_position (GimpPivotSelector *selector, + gdouble x, + gdouble y); +void gimp_pivot_selector_get_position (GimpPivotSelector *selector, + gdouble *x, + gdouble *y); + +void gimp_pivot_selector_set_bounds (GimpPivotSelector *selector, + gdouble left, + gdouble top, + gdouble right, + gdouble bottom); +void gimp_pivot_selector_get_bounds (GimpPivotSelector *selector, + gdouble *left, + gdouble *top, + gdouble *right, + gdouble *bottom); + + +#endif /* __GIMP_PIVOT_SELECTOR_H__ */ diff --git a/app/widgets/widgets-types.h b/app/widgets/widgets-types.h index 04631c70fe..f25e816dc9 100644 --- a/app/widgets/widgets-types.h +++ b/app/widgets/widgets-types.h @@ -211,6 +211,7 @@ typedef struct _GimpMeter GimpMeter; typedef struct _GimpOverlayBox GimpOverlayBox; typedef struct _GimpPickableButton GimpPickableButton; typedef struct _GimpPickablePopup GimpPickablePopup; +typedef struct _GimpPivotSelector GimpPivotSelector; typedef struct _GimpPlugInView GimpPlugInView; typedef struct _GimpPolar GimpPolar; typedef struct _GimpPopup GimpPopup; diff --git a/icons/Color/12/gimp-pivot-center.png b/icons/Color/12/gimp-pivot-center.png new file mode 100644 index 0000000000000000000000000000000000000000..1f2dbf7daca134d8f76784588c065576c14d266e GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`rBFiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0wTo-U3d z8WWQfBuW|td;ia$U?o;E^Z)AHnixD? L{an^LB{Ts5pOG-O literal 0 HcmV?d00001 diff --git a/icons/Color/12/gimp-pivot-east.png b/icons/Color/12/gimp-pivot-east.png new file mode 100644 index 0000000000000000000000000000000000000000..fd210aeba5de7af587b76ddf5da93aebd9b6c33b GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`rBFiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0wHo-U3d z8WWFBG~{AX;9=H(^nbsMy6b8UzNBrFVlr3ENWIPA!4#0cjCI3R(**{O=u<5X=vX`rBFiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0uxo-U3d z8WWQfBuW|td;ia$U?o=K`v3ppSBWVurjuDC8F#6e9dHR?l}b=N7LwwyY57LU|MJiD iSG?88^7zJlQi>sPCa;83@FW?aSqz@8elF{r5}E*d%Q;s7 literal 0 HcmV?d00001 diff --git a/icons/Color/12/gimp-pivot-north-west.png b/icons/Color/12/gimp-pivot-north-west.png new file mode 100644 index 0000000000000000000000000000000000000000..d562cf7fd77432429366a372ea58c74957be2dbd GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`rBFiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0x4o-U3d z8WWQfBuW|td;ia$V8z4x|Nr7wi776jhn#whC-5dJxiOzKQ?Tw%@;5e6sFcYv>XMrD d*I^SI!$oCYp$nQbeglnR@O1TaS?83{1OOgNHcO=u<5X=vX`rBFiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0wfo-U3d z8WWQfBuW|td;ia$VC7cg`v3ppSBWVurjuDC8F#6eInOBADJq_DFjY%0ed3#!jvNfn XBY6b&dX$6%4Pfwe^>bP0l+XkK1Pe7M literal 0 HcmV?d00001 diff --git a/icons/Color/12/gimp-pivot-south-east.png b/icons/Color/12/gimp-pivot-south-east.png new file mode 100644 index 0000000000000000000000000000000000000000..b627800835e5cce26f8635427dca164a3a2a21da GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`rBFiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0v+o-U3d z8WYdgu#!PC{xWt~$(6995$KCA!$ literal 0 HcmV?d00001 diff --git a/icons/Color/12/gimp-pivot-south-west.png b/icons/Color/12/gimp-pivot-south-west.png new file mode 100644 index 0000000000000000000000000000000000000000..1041c8940754a055dd0078be031683dea2a30efc GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`rBFiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0v+o-U3d z8WYd<8}c1c;9)-B@xT7&T!+kH#+x6+j{2QbI=zi?0?UFOIrfc9Pchb}y|2+U__5qE p-`oCRhx;knK0B8+MK8I(GVIgj6=GTPm>p;$gQu&X%Q~loCIEBYKB)iz literal 0 HcmV?d00001 diff --git a/icons/Color/12/gimp-pivot-south.png b/icons/Color/12/gimp-pivot-south.png new file mode 100644 index 0000000000000000000000000000000000000000..8fe6381c19cb158d803cdc4df64a67485ec4b687 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`rBFiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0wfo-U3d z8WWQfBuW|td;ia$VC7cg`v3ppSBWVurjuDC8F#6eInOBADJq_DFjY%0ed3#!jvNfn XBY6b&dX$6%4Pfwe^>bP0l+XkK1Pe7M literal 0 HcmV?d00001 diff --git a/icons/Color/12/gimp-pivot-west.png b/icons/Color/12/gimp-pivot-west.png new file mode 100644 index 0000000000000000000000000000000000000000..fd210aeba5de7af587b76ddf5da93aebd9b6c33b GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`rBFiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0wHo-U3d z8WWFBG~{AX;9=H(^nbsMy6b8UzNBrFVlr3ENWIPA!4#0cjCI3R(**{ + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/icons/Color/scalable/gimp-pivot-east.svg b/icons/Color/scalable/gimp-pivot-east.svg new file mode 100644 index 0000000000..28b6c01b84 --- /dev/null +++ b/icons/Color/scalable/gimp-pivot-east.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/icons/Color/scalable/gimp-pivot-north-east.svg b/icons/Color/scalable/gimp-pivot-north-east.svg new file mode 100644 index 0000000000..88bb0e276a --- /dev/null +++ b/icons/Color/scalable/gimp-pivot-north-east.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + diff --git a/icons/Color/scalable/gimp-pivot-north-west.svg b/icons/Color/scalable/gimp-pivot-north-west.svg new file mode 100644 index 0000000000..6b33662cb0 --- /dev/null +++ b/icons/Color/scalable/gimp-pivot-north-west.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/icons/Color/scalable/gimp-pivot-north.svg b/icons/Color/scalable/gimp-pivot-north.svg new file mode 100644 index 0000000000..af3b2ddba8 --- /dev/null +++ b/icons/Color/scalable/gimp-pivot-north.svg @@ -0,0 +1,119 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/icons/Color/scalable/gimp-pivot-south-east.svg b/icons/Color/scalable/gimp-pivot-south-east.svg new file mode 100644 index 0000000000..b97cc98552 --- /dev/null +++ b/icons/Color/scalable/gimp-pivot-south-east.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + diff --git a/icons/Color/scalable/gimp-pivot-south-west.svg b/icons/Color/scalable/gimp-pivot-south-west.svg new file mode 100644 index 0000000000..7b0719b145 --- /dev/null +++ b/icons/Color/scalable/gimp-pivot-south-west.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + diff --git a/icons/Color/scalable/gimp-pivot-south.svg b/icons/Color/scalable/gimp-pivot-south.svg new file mode 100644 index 0000000000..2bba90a32d --- /dev/null +++ b/icons/Color/scalable/gimp-pivot-south.svg @@ -0,0 +1,119 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/icons/Color/scalable/gimp-pivot-west.svg b/icons/Color/scalable/gimp-pivot-west.svg new file mode 100644 index 0000000000..a199d887ab --- /dev/null +++ b/icons/Color/scalable/gimp-pivot-west.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/icons/Symbolic/12/gimp-pivot-center.png b/icons/Symbolic/12/gimp-pivot-center.png new file mode 100644 index 0000000000000000000000000000000000000000..dde850b419d6cf861f5823165e7adea6011df149 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`rBFiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0w@o-U3d z8WWQfBz`pr#wOg~SNnhBPd`6DjjS0STN}SgwJ|d=T$#+m(bwI72B@6D)78&qol`;+ E0C{09`Tzg` literal 0 HcmV?d00001 diff --git a/icons/Symbolic/12/gimp-pivot-east.png b/icons/Symbolic/12/gimp-pivot-east.png new file mode 100644 index 0000000000000000000000000000000000000000..ee7548a40da9ad5e09a552f856da6564880b51c3 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`rBFiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u}o-U3d z8WWQf4lsRtd;5F+{e89nH=Z<16h6Z4am~Rf!A0DmeD~zZ!d+6gem8!bcZ`e8>=A>~ Wae*&P{tcx-{S2P2elF{r5}E*ou{e|f literal 0 HcmV?d00001 diff --git a/icons/Symbolic/12/gimp-pivot-north-east.png b/icons/Symbolic/12/gimp-pivot-north-east.png new file mode 100644 index 0000000000000000000000000000000000000000..bc3e44fc4e739ea9e95cf15f171819d546215373 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`rBFiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u(o-U3d z8WWQfBz`pr#wOg~SNnhBPd`6DjjV_Xq6@r}n0=O5b+$?bujK#s_V#!AyPpjlHpzQj aV_^7d$nUwM=GuIq84RATelF{r5}E)6#W_m= literal 0 HcmV?d00001 diff --git a/icons/Symbolic/12/gimp-pivot-north-west.png b/icons/Symbolic/12/gimp-pivot-north-west.png new file mode 100644 index 0000000000000000000000000000000000000000..34cda68e56c245cef7dc0079bac1b66fdcfde933 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`rBFiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u(o-U3d z8WWQfBz`pr#wOg~SNnhBPd`6DjjV_cL(!W8YC&^drtrQvw@BvA?d|XFcRf#RNU@)= bhLIsPm9NQu$Md&9GZ;Kw{an^LB{Ts5AJRH0 literal 0 HcmV?d00001 diff --git a/icons/Symbolic/12/gimp-pivot-north.png b/icons/Symbolic/12/gimp-pivot-north.png new file mode 100644 index 0000000000000000000000000000000000000000..f6161819fb041b91baecf81dcf9d915989c3bbfa GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`rBFiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u-o-U3d z8WWQfBz`pr#wOg~SNnhBPd`6DjjV_Xq6@r}j9WUN`AP9HFcg{bJ4J03H38~j@O1Ta JS?83{1OP+GE}#Ga literal 0 HcmV?d00001 diff --git a/icons/Symbolic/12/gimp-pivot-south-east.png b/icons/Symbolic/12/gimp-pivot-south-east.png new file mode 100644 index 0000000000000000000000000000000000000000..3419412878e41e9a35e1ae4d8fd3c204f2dd64a6 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`rBFiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0wPo-U3d z8WWQf4lsRtd;5F+{e89nH=Z<16h6Z4am~Rf!A0DmeD~zZ!d+5gDXcFh-C#Ibm!Np; c%0o5=aczFjV-J7G0u5pCboFyt=akR{0FMnh{r~^~ literal 0 HcmV?d00001 diff --git a/icons/Symbolic/12/gimp-pivot-south-west.png b/icons/Symbolic/12/gimp-pivot-south-west.png new file mode 100644 index 0000000000000000000000000000000000000000..7be7f029e93a1c0697e0da5955368ed01895d113 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`rBFiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0vko-U3d z8WWQf4lsRtd;5F+{e89nH=Z<16h6Z4am~Rf!A0DmeD~zZ!d+5gNj|P-Eh+W_sm!}J cw^=bTvFVdQ&MBb@0Dg=&MF0Q* literal 0 HcmV?d00001 diff --git a/icons/Symbolic/12/gimp-pivot-south.png b/icons/Symbolic/12/gimp-pivot-south.png new file mode 100644 index 0000000000000000000000000000000000000000..f6161819fb041b91baecf81dcf9d915989c3bbfa GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`rBFiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u-o-U3d z8WWQfBz`pr#wOg~SNnhBPd`6DjjV_Xq6@r}j9WUN`AP9HFcg{bJ4J03H38~j@O1Ta JS?83{1OP+GE}#Ga literal 0 HcmV?d00001 diff --git a/icons/Symbolic/12/gimp-pivot-west.png b/icons/Symbolic/12/gimp-pivot-west.png new file mode 100644 index 0000000000000000000000000000000000000000..ee7548a40da9ad5e09a552f856da6564880b51c3 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`rBFiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0u}o-U3d z8WWQf4lsRtd;5F+{e89nH=Z<16h6Z4am~Rf!A0DmeD~zZ!d+6gem8!bcZ`e8>=A>~ Wae*&P{tcx-{S2P2elF{r5}E*ou{e|f literal 0 HcmV?d00001 diff --git a/icons/Symbolic/scalable/gimp-pivot-center.svg b/icons/Symbolic/scalable/gimp-pivot-center.svg new file mode 100644 index 0000000000..75f0ff0397 --- /dev/null +++ b/icons/Symbolic/scalable/gimp-pivot-center.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/icons/Symbolic/scalable/gimp-pivot-east.svg b/icons/Symbolic/scalable/gimp-pivot-east.svg new file mode 100644 index 0000000000..be32b47b57 --- /dev/null +++ b/icons/Symbolic/scalable/gimp-pivot-east.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/icons/Symbolic/scalable/gimp-pivot-north-east.svg b/icons/Symbolic/scalable/gimp-pivot-north-east.svg new file mode 100644 index 0000000000..eda050889e --- /dev/null +++ b/icons/Symbolic/scalable/gimp-pivot-north-east.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/icons/Symbolic/scalable/gimp-pivot-north-west.svg b/icons/Symbolic/scalable/gimp-pivot-north-west.svg new file mode 100644 index 0000000000..61659be22b --- /dev/null +++ b/icons/Symbolic/scalable/gimp-pivot-north-west.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/icons/Symbolic/scalable/gimp-pivot-north.svg b/icons/Symbolic/scalable/gimp-pivot-north.svg new file mode 100644 index 0000000000..d2797afb91 --- /dev/null +++ b/icons/Symbolic/scalable/gimp-pivot-north.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/icons/Symbolic/scalable/gimp-pivot-south-east.svg b/icons/Symbolic/scalable/gimp-pivot-south-east.svg new file mode 100644 index 0000000000..1426de86c8 --- /dev/null +++ b/icons/Symbolic/scalable/gimp-pivot-south-east.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/icons/Symbolic/scalable/gimp-pivot-south-west.svg b/icons/Symbolic/scalable/gimp-pivot-south-west.svg new file mode 100644 index 0000000000..acc533c2f2 --- /dev/null +++ b/icons/Symbolic/scalable/gimp-pivot-south-west.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/icons/Symbolic/scalable/gimp-pivot-south.svg b/icons/Symbolic/scalable/gimp-pivot-south.svg new file mode 100644 index 0000000000..d2797afb91 --- /dev/null +++ b/icons/Symbolic/scalable/gimp-pivot-south.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/icons/Symbolic/scalable/gimp-pivot-west.svg b/icons/Symbolic/scalable/gimp-pivot-west.svg new file mode 100644 index 0000000000..be32b47b57 --- /dev/null +++ b/icons/Symbolic/scalable/gimp-pivot-west.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/icons/icon-list.mk b/icons/icon-list.mk index 7ee24a2690..c2a0fae9f0 100644 --- a/icons/icon-list.mk +++ b/icons/icon-list.mk @@ -183,6 +183,15 @@ scalable_images = \ scalable/gimp-paths.svg \ scalable/gimp-path-stroke.svg \ scalable/gimp-pattern.svg \ + scalable/gimp-pivot-center.svg \ + scalable/gimp-pivot-east.svg \ + scalable/gimp-pivot-north.svg \ + scalable/gimp-pivot-north-east.svg \ + scalable/gimp-pivot-north-west.svg \ + scalable/gimp-pivot-south.svg \ + scalable/gimp-pivot-south-east.svg \ + scalable/gimp-pivot-south-west.svg \ + scalable/gimp-pivot-west.svg \ scalable/gimp-plugin.svg \ scalable/gimp-portrait.svg \ scalable/gimp-prefs-color-management.svg \ @@ -514,6 +523,15 @@ icons12_images = \ 12/gimp-linked.png \ 12/gimp-menu-left.png \ 12/gimp-menu-right.png \ + 12/gimp-pivot-center.png \ + 12/gimp-pivot-east.png \ + 12/gimp-pivot-north.png \ + 12/gimp-pivot-north-east.png \ + 12/gimp-pivot-north-west.png \ + 12/gimp-pivot-south.png \ + 12/gimp-pivot-south-east.png \ + 12/gimp-pivot-south-west.png \ + 12/gimp-pivot-west.png \ 12/gimp-quick-mask-off.png \ 12/gimp-quick-mask-on.png \ 12/gimp-swap-colors.png \ diff --git a/libgimpwidgets/gimpicons.h b/libgimpwidgets/gimpicons.h index 504a46c700..d4c52c3028 100644 --- a/libgimpwidgets/gimpicons.h +++ b/libgimpwidgets/gimpicons.h @@ -300,6 +300,16 @@ G_BEGIN_DECLS #define GIMP_ICON_PATH "gimp-path" #define GIMP_ICON_PATH_STROKE "gimp-path-stroke" +#define GIMP_ICON_PIVOT_CENTER "gimp-pivot-center" +#define GIMP_ICON_PIVOT_EAST "gimp-pivot-east" +#define GIMP_ICON_PIVOT_NORTH "gimp-pivot-north" +#define GIMP_ICON_PIVOT_NORTH_EAST "gimp-pivot-north-east" +#define GIMP_ICON_PIVOT_NORTH_WEST "gimp-pivot-north-west" +#define GIMP_ICON_PIVOT_SOUTH "gimp-pivot-south" +#define GIMP_ICON_PIVOT_SOUTH_EAST "gimp-pivot-south-east" +#define GIMP_ICON_PIVOT_SOUTH_WEST "gimp-pivot-south-west" +#define GIMP_ICON_PIVOT_WEST "gimp-pivot-west" + #define GIMP_ICON_PREFERENCES_SYSTEM "preferences-system" #define GIMP_ICON_PROCESS_STOP "process-stop"