mirror of
https://gitlab.gnome.org/GNOME/gimp.git
synced 2025-07-03 17:33:25 +00:00
app, icons: add Paint Select tool in the playground
A -quick done- first step towards the addition of a smart selection tool. Require the gegl:paint-select workshop operation. Still LOT of work to do (wip): - fluctuations removal (GEGL side) - multilevels pyramid approach + banded graphcut for instant result on large image (GEGL ? GIMP ?) - Gaussian Mixtures for color models (GEGL side) - drawable offsets (GIMP side) - undo / redo (GIMP side) - scribbles edition mode (GIMP side) - dedicated icons - ...
This commit is contained in:
parent
3e67d7d676
commit
e1cdb9f54e
23 changed files with 1894 additions and 0 deletions
|
@ -86,6 +86,7 @@ enum
|
|||
|
||||
PROP_PLAYGROUND_NPD_TOOL,
|
||||
PROP_PLAYGROUND_SEAMLESS_CLONE_TOOL,
|
||||
PROP_PLAYGROUND_PAINT_SELECT_TOOL,
|
||||
|
||||
PROP_HIDE_DOCKS,
|
||||
PROP_SINGLE_WINDOW_MODE,
|
||||
|
@ -417,6 +418,15 @@ gimp_gui_config_class_init (GimpGuiConfigClass *klass)
|
|||
GIMP_PARAM_STATIC_STRINGS |
|
||||
GIMP_CONFIG_PARAM_RESTART);
|
||||
|
||||
GIMP_CONFIG_PROP_BOOLEAN (object_class,
|
||||
PROP_PLAYGROUND_PAINT_SELECT_TOOL,
|
||||
"playground-paint-select-tool",
|
||||
"Playground Paint Select tool",
|
||||
PLAYGROUND_PAINT_SELECT_TOOL_BLURB,
|
||||
FALSE,
|
||||
GIMP_PARAM_STATIC_STRINGS |
|
||||
GIMP_CONFIG_PARAM_RESTART);
|
||||
|
||||
g_object_class_install_property (object_class, PROP_HIDE_DOCKS,
|
||||
g_param_spec_boolean ("hide-docks",
|
||||
NULL,
|
||||
|
@ -683,6 +693,9 @@ gimp_gui_config_set_property (GObject *object,
|
|||
case PROP_PLAYGROUND_SEAMLESS_CLONE_TOOL:
|
||||
gui_config->playground_seamless_clone_tool = g_value_get_boolean (value);
|
||||
break;
|
||||
case PROP_PLAYGROUND_PAINT_SELECT_TOOL:
|
||||
gui_config->playground_paint_select_tool = g_value_get_boolean (value);
|
||||
break;
|
||||
|
||||
case PROP_HIDE_DOCKS:
|
||||
gui_config->hide_docks = g_value_get_boolean (value);
|
||||
|
@ -846,6 +859,9 @@ gimp_gui_config_get_property (GObject *object,
|
|||
case PROP_PLAYGROUND_SEAMLESS_CLONE_TOOL:
|
||||
g_value_set_boolean (value, gui_config->playground_seamless_clone_tool);
|
||||
break;
|
||||
case PROP_PLAYGROUND_PAINT_SELECT_TOOL:
|
||||
g_value_set_boolean (value, gui_config->playground_paint_select_tool);
|
||||
break;
|
||||
|
||||
case PROP_HIDE_DOCKS:
|
||||
g_value_set_boolean (value, gui_config->hide_docks);
|
||||
|
|
|
@ -82,6 +82,7 @@ struct _GimpGuiConfig
|
|||
/* experimental playground */
|
||||
gboolean playground_npd_tool;
|
||||
gboolean playground_seamless_clone_tool;
|
||||
gboolean playground_paint_select_tool;
|
||||
|
||||
/* saved in sessionrc */
|
||||
gboolean hide_docks;
|
||||
|
|
|
@ -478,6 +478,9 @@ _("Enable the MyPaint Brush tool.")
|
|||
#define PLAYGROUND_SEAMLESS_CLONE_TOOL_BLURB \
|
||||
_("Enable the Seamless Clone tool.")
|
||||
|
||||
#define PLAYGROUND_PAINT_SELECT_TOOL_BLURB \
|
||||
_("Enable the Paint Select tool.")
|
||||
|
||||
#define SPACE_BAR_ACTION_BLURB \
|
||||
_("What to do when the space bar is pressed in the image window.")
|
||||
|
||||
|
|
|
@ -1648,6 +1648,9 @@ prefs_dialog_new (Gimp *gimp,
|
|||
button = prefs_check_button_add (object, "playground-seamless-clone-tool",
|
||||
_("_Seamless Clone tool"),
|
||||
GTK_BOX (vbox2));
|
||||
button = prefs_check_button_add (object, "playground-paint-select-tool",
|
||||
_("_Paint Select tool"),
|
||||
GTK_BOX (vbox2));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -152,6 +152,10 @@ libapptools_a_sources = \
|
|||
gimppaintbrushtool.h \
|
||||
gimppaintoptions-gui.c \
|
||||
gimppaintoptions-gui.h \
|
||||
gimppaintselectoptions.c \
|
||||
gimppaintselectoptions.h \
|
||||
gimppaintselecttool.c \
|
||||
gimppaintselecttool.h \
|
||||
gimppainttool.c \
|
||||
gimppainttool.h \
|
||||
gimppainttool-paint.c \
|
||||
|
|
|
@ -75,6 +75,7 @@
|
|||
#include "gimpnpointdeformationtool.h"
|
||||
#include "gimpoffsettool.h"
|
||||
#include "gimppaintbrushtool.h"
|
||||
#include "gimppaintselecttool.h"
|
||||
#include "gimppenciltool.h"
|
||||
#include "gimpperspectiveclonetool.h"
|
||||
#include "gimpperspectivetool.h"
|
||||
|
@ -140,6 +141,7 @@ gimp_tools_init (Gimp *gimp)
|
|||
gimp_by_color_select_tool_register,
|
||||
gimp_iscissors_tool_register,
|
||||
gimp_foreground_select_tool_register,
|
||||
gimp_paint_select_tool_register,
|
||||
|
||||
/* path tool */
|
||||
|
||||
|
|
188
app/tools/gimppaintselectoptions.c
Normal file
188
app/tools/gimppaintselectoptions.c
Normal file
|
@ -0,0 +1,188 @@
|
|||
/* GIMP - The GNU Image Manipulation Program
|
||||
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
|
||||
*
|
||||
* 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 <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <gegl.h>
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "libgimpbase/gimpbase.h"
|
||||
#include "libgimpconfig/gimpconfig.h"
|
||||
#include "libgimpwidgets/gimpwidgets.h"
|
||||
|
||||
#include "tools-types.h"
|
||||
|
||||
#include "widgets/gimppropwidgets.h"
|
||||
#include "widgets/gimpspinscale.h"
|
||||
#include "widgets/gimpwidgets-constructors.h"
|
||||
#include "widgets/gimpwidgets-utils.h"
|
||||
|
||||
#include "core/gimptooloptions.h"
|
||||
#include "gimppaintselectoptions.h"
|
||||
#include "gimptooloptions-gui.h"
|
||||
|
||||
#include "gimp-intl.h"
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
PROP_MODE,
|
||||
PROP_STROKE_WIDTH,
|
||||
};
|
||||
|
||||
|
||||
static void gimp_paint_select_options_set_property (GObject *object,
|
||||
guint property_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec);
|
||||
static void gimp_paint_select_options_get_property (GObject *object,
|
||||
guint property_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec);
|
||||
|
||||
|
||||
G_DEFINE_TYPE (GimpPaintSelectOptions, gimp_paint_select_options,
|
||||
GIMP_TYPE_TOOL_OPTIONS)
|
||||
|
||||
|
||||
static void
|
||||
gimp_paint_select_options_class_init (GimpPaintSelectOptionsClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->set_property = gimp_paint_select_options_set_property;
|
||||
object_class->get_property = gimp_paint_select_options_get_property;
|
||||
|
||||
GIMP_CONFIG_PROP_ENUM (object_class, PROP_MODE,
|
||||
"mode",
|
||||
_("Mode"),
|
||||
_("Paint over areas to mark pixels for "
|
||||
"inclusion or exclusion from selection"),
|
||||
GIMP_TYPE_PAINT_SELECT_MODE,
|
||||
GIMP_PAINT_SELECT_MODE_ADD,
|
||||
GIMP_PARAM_STATIC_STRINGS);
|
||||
|
||||
GIMP_CONFIG_PROP_INT (object_class, PROP_STROKE_WIDTH,
|
||||
"stroke-width",
|
||||
_("Stroke width"),
|
||||
_("Size of the brush used for refinements"),
|
||||
1, 6000, 50,
|
||||
GIMP_PARAM_STATIC_STRINGS);
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_options_init (GimpPaintSelectOptions *options)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_options_set_property (GObject *object,
|
||||
guint property_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
GimpPaintSelectOptions *options = GIMP_PAINT_SELECT_OPTIONS (object);
|
||||
|
||||
switch (property_id)
|
||||
{
|
||||
case PROP_MODE:
|
||||
options->mode = g_value_get_enum (value);
|
||||
break;
|
||||
|
||||
case PROP_STROKE_WIDTH:
|
||||
options->stroke_width = g_value_get_int (value);
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_options_get_property (GObject *object,
|
||||
guint property_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
GimpPaintSelectOptions *options = GIMP_PAINT_SELECT_OPTIONS (object);
|
||||
|
||||
switch (property_id)
|
||||
{
|
||||
case PROP_MODE:
|
||||
g_value_set_enum (value, options->mode);
|
||||
break;
|
||||
|
||||
case PROP_STROKE_WIDTH:
|
||||
g_value_set_int (value, options->stroke_width);
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_options_reset_stroke_width (GtkWidget *button,
|
||||
GimpToolOptions *tool_options)
|
||||
{
|
||||
g_object_set (tool_options, "stroke-width", 10, NULL);
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
gimp_paint_select_options_gui (GimpToolOptions *tool_options)
|
||||
{
|
||||
GObject *config = G_OBJECT (tool_options);
|
||||
GtkWidget *vbox = gimp_tool_options_gui (tool_options);
|
||||
GtkWidget *hbox;
|
||||
GtkWidget *button;
|
||||
GtkWidget *frame;
|
||||
GtkWidget *scale;
|
||||
|
||||
frame = gimp_prop_enum_radio_frame_new (config, "mode", NULL,
|
||||
0, 0);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
|
||||
|
||||
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
|
||||
gtk_widget_show (hbox);
|
||||
|
||||
/* stroke width */
|
||||
scale = gimp_prop_spin_scale_new (config, "stroke-width", NULL,
|
||||
1.0, 10.0, 2);
|
||||
gimp_spin_scale_set_scale_limits (GIMP_SPIN_SCALE (scale), 1.0, 1000.0);
|
||||
gimp_spin_scale_set_gamma (GIMP_SPIN_SCALE (scale), 1.7);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
|
||||
|
||||
button = gimp_icon_button_new (GIMP_ICON_RESET, NULL);
|
||||
gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
|
||||
gtk_image_set_from_icon_name (GTK_IMAGE (gtk_bin_get_child (GTK_BIN (button))),
|
||||
GIMP_ICON_RESET, GTK_ICON_SIZE_MENU);
|
||||
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
|
||||
gtk_widget_show (button);
|
||||
|
||||
g_signal_connect (button, "clicked",
|
||||
G_CALLBACK (gimp_paint_select_options_reset_stroke_width),
|
||||
tool_options);
|
||||
|
||||
gimp_help_set_help_data (button,
|
||||
_("Reset stroke width native size"), NULL);
|
||||
|
||||
return vbox;
|
||||
}
|
57
app/tools/gimppaintselectoptions.h
Normal file
57
app/tools/gimppaintselectoptions.h
Normal file
|
@ -0,0 +1,57 @@
|
|||
/* GIMP - The GNU Image Manipulation Program
|
||||
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
|
||||
*
|
||||
* 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 <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __GIMP_PAINT_SELECT_OPTIONS_H__
|
||||
#define __GIMP_PAINT_SELECT_OPTIONS_H__
|
||||
|
||||
|
||||
#include "core/gimptooloptions.h"
|
||||
|
||||
|
||||
#define GIMP_TYPE_PAINT_SELECT_OPTIONS (gimp_paint_select_options_get_type ())
|
||||
#define GIMP_PAINT_SELECT_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_PAINT_SELECT_OPTIONS, GimpPaintSelectOptions))
|
||||
#define GIMP_PAINT_SELECT_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_PAINT_SELECT_OPTIONS, GimpPaintSelectOptionsClass))
|
||||
#define GIMP_IS_PAINT_SELECT_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_PAINT_SELECT_OPTIONS))
|
||||
#define GIMP_IS_PAINT_SELECT_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_PAINT_SELECT_OPTIONS))
|
||||
#define GIMP_PAINT_SELECT_OPTIONS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_PAINT_SELECT_OPTIONS, GimpPaintSelectOptionsClass))
|
||||
|
||||
|
||||
typedef struct _GimpPaintSelectOptions GimpPaintSelectOptions;
|
||||
typedef struct _GimpPaintSelectOptionsClass GimpPaintSelectOptionsClass;
|
||||
|
||||
struct _GimpPaintSelectOptions
|
||||
{
|
||||
GimpToolOptions parent_instance;
|
||||
|
||||
GimpPaintSelectMode mode;
|
||||
gint stroke_width;
|
||||
};
|
||||
|
||||
struct _GimpPaintSelectOptionsClass
|
||||
{
|
||||
GimpToolOptionsClass parent_class;
|
||||
};
|
||||
|
||||
|
||||
GType gimp_paint_select_options_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GtkWidget * gimp_paint_select_options_gui (GimpToolOptions *tool_options);
|
||||
|
||||
|
||||
|
||||
#endif /* __GIMP_PAINT_SELECT_OPTIONS_H__ */
|
728
app/tools/gimppaintselecttool.c
Normal file
728
app/tools/gimppaintselecttool.c
Normal file
|
@ -0,0 +1,728 @@
|
|||
/* GIMP - The GNU Image Manipulation Program
|
||||
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
|
||||
*
|
||||
* GimpPaintSelectTool
|
||||
* Copyright (C) 2020 Thomas Manni <thomas.manni@free.fr>
|
||||
*
|
||||
* 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 <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
#include <gegl.h>
|
||||
#include <gtk/gtk.h>
|
||||
#include <gdk/gdkkeysyms.h>
|
||||
|
||||
|
||||
#include "libgimpmath/gimpmath.h"
|
||||
#include "libgimpbase/gimpbase.h"
|
||||
#include "libgimpcolor/gimpcolor.h"
|
||||
#include "libgimpwidgets/gimpwidgets.h"
|
||||
|
||||
#include "tools-types.h"
|
||||
|
||||
#include "config/gimpguiconfig.h"
|
||||
|
||||
#include "gegl/gimp-gegl-loops.h"
|
||||
#include "gegl/gimp-gegl-mask.h"
|
||||
#include "gegl/gimp-gegl-utils.h"
|
||||
|
||||
#include "core/gimp.h"
|
||||
#include "core/gimpchannel-select.h"
|
||||
#include "core/gimperror.h"
|
||||
#include "core/gimpimage.h"
|
||||
#include "core/gimplayer.h"
|
||||
#include "core/gimplayermask.h"
|
||||
#include "core/gimpprogress.h"
|
||||
#include "core/gimpscanconvert.h"
|
||||
|
||||
#include "widgets/gimphelp-ids.h"
|
||||
#include "widgets/gimpwidgets-utils.h"
|
||||
|
||||
#include "display/gimpdisplay.h"
|
||||
#include "display/gimpdisplayshell.h"
|
||||
#include "display/gimptoolgui.h"
|
||||
|
||||
#include "core/gimptooloptions.h"
|
||||
#include "gimppaintselecttool.h"
|
||||
#include "gimppaintselectoptions.h"
|
||||
#include "gimptoolcontrol.h"
|
||||
|
||||
#include "gimp-intl.h"
|
||||
|
||||
#include "config/gimpguiconfig.h" /* playground */
|
||||
|
||||
|
||||
static gboolean gimp_paint_select_tool_initialize (GimpTool *tool,
|
||||
GimpDisplay *display,
|
||||
GError **error);
|
||||
static void gimp_paint_select_tool_control (GimpTool *tool,
|
||||
GimpToolAction action,
|
||||
GimpDisplay *display);
|
||||
static void gimp_paint_select_tool_button_press (GimpTool *tool,
|
||||
const GimpCoords *coords,
|
||||
guint32 time,
|
||||
GdkModifierType state,
|
||||
GimpButtonPressType press_type,
|
||||
GimpDisplay *display);
|
||||
static void gimp_paint_select_tool_button_release (GimpTool *tool,
|
||||
const GimpCoords *coords,
|
||||
guint32 time,
|
||||
GdkModifierType state,
|
||||
GimpButtonReleaseType release_type,
|
||||
GimpDisplay *display);
|
||||
static void gimp_paint_select_tool_motion (GimpTool *tool,
|
||||
const GimpCoords *coords,
|
||||
guint32 time,
|
||||
GdkModifierType state,
|
||||
GimpDisplay *display);
|
||||
static gboolean gimp_paint_select_tool_key_press (GimpTool *tool,
|
||||
GdkEventKey *kevent,
|
||||
GimpDisplay *display);
|
||||
static void gimp_paint_select_tool_modifier_key (GimpTool *tool,
|
||||
GdkModifierType key,
|
||||
gboolean press,
|
||||
GdkModifierType state,
|
||||
GimpDisplay *display);
|
||||
static void gimp_paint_select_tool_oper_update (GimpTool *tool,
|
||||
const GimpCoords *coords,
|
||||
GdkModifierType state,
|
||||
gboolean proximity,
|
||||
GimpDisplay *display);
|
||||
static void gimp_paint_select_tool_options_notify (GimpTool *tool,
|
||||
GimpToolOptions *options,
|
||||
const GParamSpec *pspec);
|
||||
static void gimp_paint_select_tool_cursor_update (GimpTool *tool,
|
||||
const GimpCoords *coords,
|
||||
GdkModifierType state,
|
||||
GimpDisplay *display);
|
||||
static void gimp_paint_select_tool_draw (GimpDrawTool *draw_tool);
|
||||
|
||||
static void gimp_paint_select_tool_halt (GimpPaintSelectTool *ps_tool);
|
||||
static void gimp_paint_select_tool_update_image_mask (GimpPaintSelectTool *ps_tool);
|
||||
static void gimp_paint_select_tool_init_buffers (GimpPaintSelectTool *ps_tool,
|
||||
GimpImage *image,
|
||||
GimpDrawable *drawable);
|
||||
static void gimp_paint_select_tool_init_scribble (GimpPaintSelectTool *ps_tool);
|
||||
static void gimp_paint_select_tool_create_graph (GimpPaintSelectTool *ps_tool);
|
||||
static gboolean gimp_paint_select_tool_paint_scribble (GimpPaintSelectTool *ps_tool);
|
||||
|
||||
static gfloat euclidean_distance (gint x1,
|
||||
gint y1,
|
||||
gint x2,
|
||||
gint y2);
|
||||
|
||||
|
||||
G_DEFINE_TYPE (GimpPaintSelectTool, gimp_paint_select_tool,
|
||||
GIMP_TYPE_DRAW_TOOL)
|
||||
|
||||
#define parent_class gimp_paint_select_tool_parent_class
|
||||
|
||||
|
||||
void
|
||||
gimp_paint_select_tool_register (GimpToolRegisterCallback callback,
|
||||
gpointer data)
|
||||
{
|
||||
if (gegl_has_operation ("gegl:paint-select") &&
|
||||
GIMP_GUI_CONFIG (GIMP (data)->config)->playground_paint_select_tool)
|
||||
(* callback) (GIMP_TYPE_PAINT_SELECT_TOOL,
|
||||
GIMP_TYPE_PAINT_SELECT_OPTIONS,
|
||||
gimp_paint_select_options_gui,
|
||||
0,
|
||||
"gimp-paint-select-tool",
|
||||
_("Paint Select"),
|
||||
_("Paint Select Tool: Scult selection by painting"),
|
||||
N_("P_aint Select"), NULL,
|
||||
NULL, GIMP_HELP_TOOL_FOREGROUND_SELECT,
|
||||
GIMP_ICON_TOOL_PAINT_SELECT,
|
||||
data);
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_tool_class_init (GimpPaintSelectToolClass *klass)
|
||||
{
|
||||
GimpToolClass *tool_class = GIMP_TOOL_CLASS (klass);
|
||||
GimpDrawToolClass *draw_tool_class = GIMP_DRAW_TOOL_CLASS (klass);
|
||||
|
||||
tool_class->button_press = gimp_paint_select_tool_button_press;
|
||||
tool_class->button_release = gimp_paint_select_tool_button_release;
|
||||
tool_class->control = gimp_paint_select_tool_control;
|
||||
tool_class->cursor_update = gimp_paint_select_tool_cursor_update;
|
||||
tool_class->initialize = gimp_paint_select_tool_initialize;
|
||||
tool_class->key_press = gimp_paint_select_tool_key_press;
|
||||
tool_class->modifier_key = gimp_paint_select_tool_modifier_key;
|
||||
tool_class->motion = gimp_paint_select_tool_motion;
|
||||
tool_class->oper_update = gimp_paint_select_tool_oper_update;
|
||||
tool_class->options_notify = gimp_paint_select_tool_options_notify;
|
||||
|
||||
draw_tool_class->draw = gimp_paint_select_tool_draw;
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_tool_init (GimpPaintSelectTool *ps_tool)
|
||||
{
|
||||
GimpTool *tool = GIMP_TOOL (ps_tool);
|
||||
|
||||
gimp_tool_control_set_motion_mode (tool->control, GIMP_MOTION_MODE_EXACT);
|
||||
gimp_tool_control_set_scroll_lock (tool->control, FALSE);
|
||||
gimp_tool_control_set_preserve (tool->control, FALSE);
|
||||
gimp_tool_control_set_dirty_mask (tool->control,
|
||||
GIMP_DIRTY_IMAGE |
|
||||
GIMP_DIRTY_ACTIVE_DRAWABLE);
|
||||
gimp_tool_control_set_dirty_action (tool->control,
|
||||
GIMP_TOOL_ACTION_HALT);
|
||||
gimp_tool_control_set_precision (tool->control,
|
||||
GIMP_CURSOR_PRECISION_SUBPIXEL);
|
||||
gimp_tool_control_set_tool_cursor (tool->control,
|
||||
GIMP_TOOL_CURSOR_PAINTBRUSH);
|
||||
gimp_tool_control_set_cursor_modifier (tool->control,
|
||||
GIMP_CURSOR_MODIFIER_PLUS);
|
||||
gimp_tool_control_set_action_size (tool->control,
|
||||
"tools/tools-paint-select-brush-size-set");
|
||||
ps_tool->result_mask = NULL;
|
||||
ps_tool->image_mask = NULL;
|
||||
ps_tool->trimap = NULL;
|
||||
ps_tool->drawable = NULL;
|
||||
ps_tool->scribble = NULL;
|
||||
ps_tool->graph = NULL;
|
||||
ps_tool->ps_node = NULL;
|
||||
ps_tool->render_node = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_tool_button_press (GimpTool *tool,
|
||||
const GimpCoords *coords,
|
||||
guint32 time,
|
||||
GdkModifierType state,
|
||||
GimpButtonPressType press_type,
|
||||
GimpDisplay *display)
|
||||
{
|
||||
GimpPaintSelectTool *ps_tool = GIMP_PAINT_SELECT_TOOL (tool);
|
||||
GimpDrawTool *draw_tool = GIMP_DRAW_TOOL (tool);
|
||||
|
||||
if (gimp_draw_tool_is_active (draw_tool) && draw_tool->display != display)
|
||||
gimp_draw_tool_stop (draw_tool);
|
||||
|
||||
gimp_draw_tool_pause (draw_tool);
|
||||
gimp_tool_control_activate (tool->control);
|
||||
|
||||
ps_tool->last_pos.x = coords->x;
|
||||
ps_tool->last_pos.y = coords->y;
|
||||
|
||||
if (gimp_paint_select_tool_paint_scribble (ps_tool))
|
||||
{
|
||||
if (tool->display)
|
||||
{
|
||||
GimpPaintSelectOptions *options = GIMP_PAINT_SELECT_TOOL_GET_OPTIONS (ps_tool);
|
||||
GimpImage *image = gimp_display_get_image (tool->display);
|
||||
GimpChannelOps op;
|
||||
gint x_offset = ps_tool->last_pos.x - options->stroke_width / 2;
|
||||
gint y_offset = ps_tool->last_pos.y - options->stroke_width / 2;
|
||||
|
||||
if (options->mode == GIMP_PAINT_SELECT_MODE_ADD)
|
||||
op = GIMP_CHANNEL_OP_ADD;
|
||||
else
|
||||
op = GIMP_CHANNEL_OP_SUBTRACT;
|
||||
|
||||
gimp_channel_select_buffer (gimp_image_get_mask (image),
|
||||
C_("command", "Paint Select"),
|
||||
ps_tool->scribble,
|
||||
x_offset,
|
||||
y_offset,
|
||||
op,
|
||||
FALSE,
|
||||
0,
|
||||
0);
|
||||
gimp_image_flush (image);
|
||||
}
|
||||
}
|
||||
|
||||
if (! gimp_draw_tool_is_active (draw_tool))
|
||||
gimp_draw_tool_start (draw_tool, display);
|
||||
|
||||
gimp_draw_tool_resume (draw_tool);
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_tool_button_release (GimpTool *tool,
|
||||
const GimpCoords *coords,
|
||||
guint32 time,
|
||||
GdkModifierType state,
|
||||
GimpButtonReleaseType release_type,
|
||||
GimpDisplay *display)
|
||||
{
|
||||
GimpDrawTool *draw_tool = GIMP_DRAW_TOOL (tool);
|
||||
gimp_draw_tool_stop (draw_tool);
|
||||
gimp_tool_control_halt (tool->control);
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_tool_control (GimpTool *tool,
|
||||
GimpToolAction action,
|
||||
GimpDisplay *display)
|
||||
{
|
||||
GimpPaintSelectTool *paint_select = GIMP_PAINT_SELECT_TOOL (tool);
|
||||
|
||||
switch (action)
|
||||
{
|
||||
case GIMP_TOOL_ACTION_PAUSE:
|
||||
break;
|
||||
|
||||
case GIMP_TOOL_ACTION_RESUME:
|
||||
break;
|
||||
|
||||
case GIMP_TOOL_ACTION_HALT:
|
||||
gimp_paint_select_tool_halt (paint_select);
|
||||
break;
|
||||
|
||||
case GIMP_TOOL_ACTION_COMMIT:
|
||||
break;
|
||||
}
|
||||
|
||||
GIMP_TOOL_CLASS (parent_class)->control (tool, action, display);
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_tool_cursor_update (GimpTool *tool,
|
||||
const GimpCoords *coords,
|
||||
GdkModifierType state,
|
||||
GimpDisplay *display)
|
||||
{
|
||||
GimpPaintSelectOptions *options = GIMP_PAINT_SELECT_TOOL_GET_OPTIONS (tool);
|
||||
GimpCursorModifier modifier = GIMP_CURSOR_MODIFIER_NONE;
|
||||
|
||||
if (options->mode == GIMP_PAINT_SELECT_MODE_ADD)
|
||||
{
|
||||
modifier = GIMP_CURSOR_MODIFIER_PLUS;
|
||||
}
|
||||
else
|
||||
{
|
||||
modifier = GIMP_CURSOR_MODIFIER_MINUS;
|
||||
}
|
||||
|
||||
gimp_tool_control_set_cursor_modifier (tool->control, modifier);
|
||||
|
||||
GIMP_TOOL_CLASS (parent_class)->cursor_update (tool, coords, state, display);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gimp_paint_select_tool_initialize (GimpTool *tool,
|
||||
GimpDisplay *display,
|
||||
GError **error)
|
||||
{
|
||||
GimpPaintSelectTool *ps_tool = GIMP_PAINT_SELECT_TOOL (tool);
|
||||
GimpGuiConfig *config = GIMP_GUI_CONFIG (display->gimp->config);
|
||||
GimpImage *image = gimp_display_get_image (display);
|
||||
GList *drawables = gimp_image_get_selected_drawables (image);
|
||||
GimpDrawable *drawable;
|
||||
|
||||
if (g_list_length (drawables) != 1)
|
||||
{
|
||||
if (g_list_length (drawables) > 1)
|
||||
g_set_error_literal (error, GIMP_ERROR, GIMP_FAILED,
|
||||
_("Cannot select from multiple layers."));
|
||||
else
|
||||
g_set_error_literal (error, GIMP_ERROR, GIMP_FAILED, _("No selected drawables."));
|
||||
|
||||
g_list_free (drawables);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
drawable = drawables->data;
|
||||
g_list_free (drawables);
|
||||
|
||||
if (! gimp_item_is_visible (GIMP_ITEM (drawable)) &&
|
||||
! config->edit_non_visible)
|
||||
{
|
||||
g_set_error_literal (error, GIMP_ERROR, GIMP_FAILED,
|
||||
_("The active layer is not visible."));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
tool->display = display;
|
||||
|
||||
gimp_paint_select_tool_init_buffers (ps_tool, image, drawable);
|
||||
gimp_paint_select_tool_create_graph (ps_tool);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gimp_paint_select_tool_key_press (GimpTool *tool,
|
||||
GdkEventKey *kevent,
|
||||
GimpDisplay *display)
|
||||
{
|
||||
return GIMP_TOOL_CLASS (parent_class)->key_press (tool, kevent, display);
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_tool_modifier_key (GimpTool *tool,
|
||||
GdkModifierType key,
|
||||
gboolean press,
|
||||
GdkModifierType state,
|
||||
GimpDisplay *display)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_tool_motion (GimpTool *tool,
|
||||
const GimpCoords *coords,
|
||||
guint32 time,
|
||||
GdkModifierType state,
|
||||
GimpDisplay *display)
|
||||
{
|
||||
GimpPaintSelectTool *ps_tool = GIMP_PAINT_SELECT_TOOL (tool);
|
||||
GimpDrawTool *draw_tool = GIMP_DRAW_TOOL (tool);
|
||||
|
||||
static guint32 last_time = 0;
|
||||
|
||||
GIMP_TOOL_CLASS (parent_class)->motion (tool, coords, time, state, display);
|
||||
|
||||
/* don't let the events come in too fast, ignore below a delay of 100 ms */
|
||||
if (time - last_time < 100)
|
||||
return;
|
||||
|
||||
last_time = time;
|
||||
|
||||
if (state & GDK_BUTTON1_MASK)
|
||||
{
|
||||
gfloat distance = euclidean_distance (coords->x,
|
||||
coords->y,
|
||||
ps_tool->last_pos.x,
|
||||
ps_tool->last_pos.y);
|
||||
|
||||
if (distance >= 2.f)
|
||||
{
|
||||
gimp_draw_tool_pause (draw_tool);
|
||||
gimp_tool_control_halt (tool->control);
|
||||
ps_tool->last_pos.x = coords->x;
|
||||
ps_tool->last_pos.y = coords->y;
|
||||
|
||||
if (gimp_paint_select_tool_paint_scribble (ps_tool))
|
||||
{
|
||||
GimpPaintSelectOptions *options = GIMP_PAINT_SELECT_TOOL_GET_OPTIONS (ps_tool);
|
||||
GTimer *timer = g_timer_new ();
|
||||
|
||||
if (options->mode == GIMP_PAINT_SELECT_MODE_ADD)
|
||||
{
|
||||
gegl_node_set (ps_tool->ps_node, "mode", 0, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
gegl_node_set (ps_tool->ps_node, "mode", 1, NULL);
|
||||
}
|
||||
|
||||
g_timer_start (timer);
|
||||
gegl_node_process (ps_tool->render_node);
|
||||
g_timer_stop (timer);
|
||||
g_printerr ("processing graph takes %.3f s\n", g_timer_elapsed (timer, NULL));
|
||||
g_timer_destroy (timer);
|
||||
|
||||
gimp_paint_select_tool_update_image_mask (ps_tool);
|
||||
}
|
||||
|
||||
gimp_tool_control_activate (tool->control);
|
||||
gimp_draw_tool_resume (draw_tool);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_tool_oper_update (GimpTool *tool,
|
||||
const GimpCoords *coords,
|
||||
GdkModifierType state,
|
||||
gboolean proximity,
|
||||
GimpDisplay *display)
|
||||
{
|
||||
GimpPaintSelectTool *ps = GIMP_PAINT_SELECT_TOOL (tool);
|
||||
GimpDrawTool *draw_tool = GIMP_DRAW_TOOL (tool);
|
||||
|
||||
if (proximity)
|
||||
{
|
||||
gimp_draw_tool_pause (draw_tool);
|
||||
|
||||
if (! tool->display || display == tool->display)
|
||||
{
|
||||
ps->last_pos.x = coords->x;
|
||||
ps->last_pos.y = coords->y;
|
||||
}
|
||||
|
||||
if (! gimp_draw_tool_is_active (draw_tool))
|
||||
gimp_draw_tool_start (draw_tool, display);
|
||||
|
||||
gimp_draw_tool_resume (draw_tool);
|
||||
}
|
||||
else if (gimp_draw_tool_is_active (draw_tool))
|
||||
{
|
||||
gimp_draw_tool_stop (draw_tool);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_tool_draw (GimpDrawTool *draw_tool)
|
||||
{
|
||||
GimpPaintSelectTool *paint_select = GIMP_PAINT_SELECT_TOOL (draw_tool);
|
||||
GimpPaintSelectOptions *options = GIMP_PAINT_SELECT_TOOL_GET_OPTIONS (paint_select);
|
||||
gint size = options->stroke_width;
|
||||
|
||||
gimp_draw_tool_add_arc (draw_tool,
|
||||
FALSE,
|
||||
paint_select->last_pos.x - (size / 2.0),
|
||||
paint_select->last_pos.y - (size / 2.0),
|
||||
size, size,
|
||||
0.0, (2.0 * G_PI));
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_tool_options_notify (GimpTool *tool,
|
||||
GimpToolOptions *options,
|
||||
const GParamSpec *pspec)
|
||||
{
|
||||
GimpPaintSelectTool *ps_tool = GIMP_PAINT_SELECT_TOOL (tool);
|
||||
|
||||
if (! tool->display)
|
||||
return;
|
||||
|
||||
if (! strcmp (pspec->name, "stroke-width") && ps_tool->scribble)
|
||||
{
|
||||
g_object_unref (ps_tool->scribble);
|
||||
ps_tool->scribble = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_tool_halt (GimpPaintSelectTool *ps_tool)
|
||||
{
|
||||
GimpTool *tool = GIMP_TOOL (ps_tool);
|
||||
|
||||
g_clear_object (&ps_tool->trimap);
|
||||
g_clear_object (&ps_tool->result_mask);
|
||||
g_clear_object (&ps_tool->graph);
|
||||
g_clear_object (&ps_tool->scribble);
|
||||
|
||||
ps_tool->drawable = NULL;
|
||||
ps_tool->render_node = NULL;
|
||||
ps_tool->ps_node = NULL;
|
||||
|
||||
ps_tool->image_mask = NULL;
|
||||
|
||||
if (tool->display)
|
||||
gimp_image_flush (gimp_display_get_image (tool->display));
|
||||
|
||||
tool->display = NULL;
|
||||
g_list_free (tool->drawables);
|
||||
tool->drawables = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_tool_update_image_mask (GimpPaintSelectTool *ps_tool)
|
||||
{
|
||||
GimpTool *tool = GIMP_TOOL (ps_tool);
|
||||
|
||||
if (tool->display)
|
||||
{
|
||||
GimpImage *image = gimp_display_get_image (tool->display);
|
||||
|
||||
gimp_channel_select_buffer (gimp_image_get_mask (image),
|
||||
C_("command", "Paint Select"),
|
||||
ps_tool->result_mask,
|
||||
0, /* x offset */
|
||||
0, /* y offset */
|
||||
GIMP_CHANNEL_OP_REPLACE,
|
||||
FALSE,
|
||||
0,
|
||||
0);
|
||||
gimp_image_flush (image);
|
||||
}
|
||||
|
||||
g_clear_object (&ps_tool->result_mask);
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_tool_init_buffers (GimpPaintSelectTool *ps_tool,
|
||||
GimpImage *image,
|
||||
GimpDrawable *drawable)
|
||||
{
|
||||
GimpChannel *channel;
|
||||
GeglColor *grey = gegl_color_new ("#888");
|
||||
|
||||
g_return_if_fail (ps_tool->result_mask == NULL);
|
||||
g_return_if_fail (ps_tool->trimap == NULL);
|
||||
g_return_if_fail (ps_tool->drawable == NULL);
|
||||
|
||||
ps_tool->drawable = gimp_drawable_get_buffer (drawable);
|
||||
|
||||
channel = gimp_image_get_mask (image);
|
||||
ps_tool->image_mask = gimp_drawable_get_buffer (GIMP_DRAWABLE (channel));
|
||||
ps_tool->trimap = gegl_buffer_new (gegl_buffer_get_extent (ps_tool->image_mask),
|
||||
babl_format ("Y float"));
|
||||
gegl_buffer_set_color (ps_tool->trimap, NULL, grey);
|
||||
|
||||
g_object_unref (grey);
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_tool_init_scribble (GimpPaintSelectTool *ps_tool)
|
||||
{
|
||||
GimpPaintSelectOptions *options = GIMP_PAINT_SELECT_TOOL_GET_OPTIONS (ps_tool);
|
||||
|
||||
GimpScanConvert *scan_convert;
|
||||
GimpVector2 points[2];
|
||||
gint size = options->stroke_width;
|
||||
gint radius = size / 2;
|
||||
GeglRectangle square = {0, 0, size, size};
|
||||
|
||||
if (ps_tool->scribble)
|
||||
g_object_unref (ps_tool->scribble);
|
||||
|
||||
ps_tool->scribble = gegl_buffer_linear_new (&square, babl_format ("Y float"));
|
||||
|
||||
points[0].x = points[1].x = radius;
|
||||
points[0].y = points[1].y = radius;
|
||||
points[1].x += 0.01;
|
||||
points[1].y += 0.01;
|
||||
|
||||
scan_convert = gimp_scan_convert_new ();
|
||||
gimp_scan_convert_add_polyline (scan_convert, 2, points, FALSE);
|
||||
gimp_scan_convert_stroke (scan_convert, size,
|
||||
GIMP_JOIN_ROUND, GIMP_CAP_ROUND, 10.0,
|
||||
0.0, NULL);
|
||||
gimp_scan_convert_compose (scan_convert, ps_tool->scribble, 0, 0);
|
||||
gimp_scan_convert_free (scan_convert);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gimp_paint_select_tool_paint_scribble (GimpPaintSelectTool *ps_tool)
|
||||
{
|
||||
GimpPaintSelectOptions *options = GIMP_PAINT_SELECT_TOOL_GET_OPTIONS (ps_tool);
|
||||
|
||||
gint size = options->stroke_width;
|
||||
gint radius = size / 2;
|
||||
GeglRectangle square = {0, 0, size, size};
|
||||
|
||||
GeglBufferIterator *iter;
|
||||
gfloat scribble_value;
|
||||
gboolean overlap = FALSE;
|
||||
|
||||
if (! ps_tool->scribble)
|
||||
{
|
||||
gimp_paint_select_tool_init_scribble (ps_tool);
|
||||
}
|
||||
|
||||
/* add the scribble to the trimap buffer and check the image mask to see if
|
||||
an optimization should be triggered.
|
||||
*/
|
||||
|
||||
if (options->mode == GIMP_PAINT_SELECT_MODE_ADD)
|
||||
{
|
||||
scribble_value = 1.f;
|
||||
}
|
||||
else
|
||||
{
|
||||
scribble_value = 0.f;
|
||||
}
|
||||
|
||||
iter = gegl_buffer_iterator_new (ps_tool->scribble, NULL, 0,
|
||||
babl_format ("Y float"),
|
||||
GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 3);
|
||||
|
||||
square = *gegl_buffer_get_extent (ps_tool->scribble);
|
||||
square.x = ps_tool->last_pos.x - radius;
|
||||
square.y = ps_tool->last_pos.y - radius;
|
||||
|
||||
gegl_buffer_iterator_add (iter, ps_tool->trimap, &square, 0,
|
||||
babl_format ("Y float"),
|
||||
GEGL_ACCESS_READWRITE, GEGL_ABYSS_NONE);
|
||||
|
||||
gegl_buffer_iterator_add (iter, ps_tool->image_mask, &square, 0,
|
||||
babl_format ("Y float"),
|
||||
GEGL_ACCESS_READ, GEGL_ABYSS_NONE);
|
||||
|
||||
while (gegl_buffer_iterator_next (iter))
|
||||
{
|
||||
gfloat *scribble_pix = iter->items[0].data;
|
||||
gfloat *trimap_pix = iter->items[1].data;
|
||||
gfloat *mask_pix = iter->items[2].data;
|
||||
gint n_pixels = iter->length;
|
||||
|
||||
while (n_pixels--)
|
||||
{
|
||||
if (*scribble_pix)
|
||||
{
|
||||
*trimap_pix = scribble_value;
|
||||
|
||||
if (*mask_pix != scribble_value)
|
||||
overlap = TRUE;
|
||||
}
|
||||
|
||||
scribble_pix++;
|
||||
trimap_pix++;
|
||||
mask_pix++;
|
||||
}
|
||||
}
|
||||
|
||||
return overlap;
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_paint_select_tool_create_graph (GimpPaintSelectTool *ps_tool)
|
||||
{
|
||||
GimpTool *tool = GIMP_TOOL (ps_tool);
|
||||
GimpImage *image = gimp_display_get_image (tool->display);
|
||||
GimpChannel *channel = gimp_image_get_mask (image);
|
||||
GeglNode *t; /* trimap */
|
||||
GeglNode *m; /* mask */
|
||||
GeglNode *d; /* drawable */
|
||||
|
||||
ps_tool->graph = gegl_node_new ();
|
||||
|
||||
m = gegl_node_new_child (ps_tool->graph,
|
||||
"operation", "gegl:buffer-source",
|
||||
"buffer", gimp_drawable_get_buffer (GIMP_DRAWABLE(channel)),
|
||||
NULL);
|
||||
d = gegl_node_new_child (ps_tool->graph,
|
||||
"operation", "gegl:buffer-source",
|
||||
"buffer", ps_tool->drawable,
|
||||
NULL);
|
||||
|
||||
t = gegl_node_new_child (ps_tool->graph,
|
||||
"operation", "gegl:buffer-source",
|
||||
"buffer", ps_tool->trimap,
|
||||
NULL);
|
||||
|
||||
ps_tool->ps_node = gegl_node_new_child (ps_tool->graph,
|
||||
"operation", "gegl:paint-select",
|
||||
NULL);
|
||||
|
||||
ps_tool->render_node = gegl_node_new_child (ps_tool->graph,
|
||||
"operation", "gegl:buffer-sink",
|
||||
"buffer", &ps_tool->result_mask,
|
||||
NULL);
|
||||
|
||||
gegl_node_link_many (m, ps_tool->ps_node, ps_tool->render_node, NULL);
|
||||
gegl_node_connect_to (d, "output", ps_tool->ps_node, "aux");
|
||||
gegl_node_connect_to (t, "output", ps_tool->ps_node, "aux2");
|
||||
}
|
||||
|
||||
static gfloat
|
||||
euclidean_distance (gint x1,
|
||||
gint y1,
|
||||
gint x2,
|
||||
gint y2)
|
||||
{
|
||||
return sqrtf ((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
|
||||
}
|
67
app/tools/gimppaintselecttool.h
Normal file
67
app/tools/gimppaintselecttool.h
Normal file
|
@ -0,0 +1,67 @@
|
|||
/* GIMP - The GNU Image Manipulation Program
|
||||
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
|
||||
*
|
||||
* 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 <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GIMP_PAINT_SELECT_TOOL_H__
|
||||
#define __GIMP_PAINT_SELECT_TOOL_H__
|
||||
|
||||
|
||||
#include "gimpdrawtool.h"
|
||||
|
||||
|
||||
#define GIMP_TYPE_PAINT_SELECT_TOOL (gimp_paint_select_tool_get_type ())
|
||||
#define GIMP_PAINT_SELECT_TOOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_PAINT_SELECT_TOOL, GimpPaintSelectTool))
|
||||
#define GIMP_PAINT_SELECT_TOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_PAINT_SELECT_TOOL, GimpPaintSelectToolClass))
|
||||
#define GIMP_IS_PAINT_SELECT_TOOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_PAINT_SELECT_TOOL))
|
||||
#define GIMP_IS_PAINT_SELECT_TOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_PAINT_SELECT_TOOL))
|
||||
#define GIMP_PAINT_SELECT_TOOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_PAINT_SELECT_TOOL, GimpPaintSelectToolClass))
|
||||
|
||||
#define GIMP_PAINT_SELECT_TOOL_GET_OPTIONS(t) (GIMP_PAINT_SELECT_OPTIONS (gimp_tool_get_options (GIMP_TOOL (t))))
|
||||
|
||||
|
||||
typedef struct _GimpPaintSelectTool GimpPaintSelectTool;
|
||||
typedef struct _GimpPaintSelectToolClass GimpPaintSelectToolClass;
|
||||
|
||||
struct _GimpPaintSelectTool
|
||||
{
|
||||
GimpDrawTool parent_instance;
|
||||
|
||||
GeglBuffer *trimap;
|
||||
GeglBuffer *image_mask;
|
||||
GeglBuffer *result_mask;
|
||||
GeglBuffer *drawable;
|
||||
GeglBuffer *scribble;
|
||||
|
||||
GeglNode *graph;
|
||||
GeglNode *ps_node;
|
||||
GeglNode *render_node;
|
||||
|
||||
GimpVector2 last_pos;
|
||||
};
|
||||
|
||||
struct _GimpPaintSelectToolClass
|
||||
{
|
||||
GimpDrawToolClass parent_class;
|
||||
};
|
||||
|
||||
|
||||
void gimp_paint_select_tool_register (GimpToolRegisterCallback callback,
|
||||
gpointer data);
|
||||
|
||||
GType gimp_paint_select_tool_get_type (void) G_GNUC_CONST;
|
||||
|
||||
|
||||
#endif /* __GIMP_PAINT_SELECT_TOOL_H__ */
|
|
@ -84,6 +84,8 @@ libapptools_sources = [
|
|||
'gimpoperationtool.c',
|
||||
'gimppaintbrushtool.c',
|
||||
'gimppaintoptions-gui.c',
|
||||
'gimppaintselectoptions.c',
|
||||
'gimppaintselecttool.c',
|
||||
'gimppainttool-paint.c',
|
||||
'gimppainttool.c',
|
||||
'gimppenciltool.c',
|
||||
|
|
|
@ -337,6 +337,23 @@ gimp_warp_behavior_get_type (void)
|
|||
return type;
|
||||
}
|
||||
|
||||
GType
|
||||
gimp_paint_select_mode_get_type (void)
|
||||
{
|
||||
static const GEnumValue values[] =
|
||||
{
|
||||
{ GIMP_PAINT_SELECT_MODE_ADD, "GIMP_PAINT_SELECT_MODE_ADD", "add" },
|
||||
{ GIMP_PAINT_SELECT_MODE_SUBTRACT, "GIMP_PAINT_SELECT_MODE_SUBTRACT", "subtract" },
|
||||
{ 0, NULL, NULL }
|
||||
};
|
||||
|
||||
static const GimpEnumDesc descs[] =
|
||||
{
|
||||
{ GIMP_PAINT_SELECT_MODE_ADD, NC_("paint-select-mode", "Add to selection"), NULL },
|
||||
{ GIMP_PAINT_SELECT_MODE_SUBTRACT, NC_("paint-select-mode", "Subtract from selection"), NULL },
|
||||
{ 0, NULL, NULL }
|
||||
};
|
||||
|
||||
|
||||
/* Generated data ends here */
|
||||
|
||||
|
|
|
@ -166,6 +166,16 @@ typedef enum
|
|||
} GimpWarpBehavior;
|
||||
|
||||
|
||||
#define GIMP_TYPE_PAINT_SELECT_MODE (gimp_paint_select_mode_get_type ())
|
||||
|
||||
GType gimp_paint_select_mode_get_type (void) G_GNUC_CONST;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
GIMP_PAINT_SELECT_MODE_ADD, /*< desc="Add to selection" >*/
|
||||
GIMP_PAINT_SELECT_MODE_SUBTRACT, /*< desc="Subtract from selection" >*/
|
||||
} GimpPaintSelectMode;
|
||||
|
||||
/*
|
||||
* non-registered enums; register them if needed
|
||||
*/
|
||||
|
|
BIN
icons/Color/16/gimp-tool-paint-select.png
Normal file
BIN
icons/Color/16/gimp-tool-paint-select.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 718 B |
BIN
icons/Color/24/gimp-tool-paint-select.png
Normal file
BIN
icons/Color/24/gimp-tool-paint-select.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1 KiB |
235
icons/Color/24/gimp-tool-paint-select.svg
Normal file
235
icons/Color/24/gimp-tool-paint-select.svg
Normal file
|
@ -0,0 +1,235 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg30571"
|
||||
version="1.1"
|
||||
inkscape:version="0.91+devel r"
|
||||
sodipodi:docname="gimp-tool-blur-24.svg"
|
||||
inkscape:export-filename="/home/klaus/Bilder/icons/Symbolic/hicolor/24x24/apps/gimp-channel.png"
|
||||
inkscape:export-xdpi="98.181816"
|
||||
inkscape:export-ydpi="98.181816">
|
||||
<defs
|
||||
id="defs30573">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6951"
|
||||
id="linearGradient2979-31"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.87935,-0.07437292,0.07703828,0.848926,-18.417151,-18.747073)"
|
||||
x1="28.058632"
|
||||
y1="18.867767"
|
||||
x2="33.436985"
|
||||
y2="23.742767" />
|
||||
<linearGradient
|
||||
id="linearGradient6951">
|
||||
<stop
|
||||
style="stop-color:#6e3d09;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6953" />
|
||||
<stop
|
||||
id="stop6959"
|
||||
offset="0.24242425"
|
||||
style="stop-color:#ea8113;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#5c3307;stop-opacity:1;"
|
||||
offset="0.62121212"
|
||||
id="stop6961" />
|
||||
<stop
|
||||
style="stop-color:#e07c12;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop6955" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6939"
|
||||
id="linearGradient2975-75"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.356127,-0.219769,0.227645,1.309208,-32.05138,-32.311441)"
|
||||
x1="19.394735"
|
||||
y1="30.001331"
|
||||
x2="23.109331"
|
||||
y2="33.438831" />
|
||||
<linearGradient
|
||||
id="linearGradient6939">
|
||||
<stop
|
||||
style="stop-color:#bdbdbd;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6941" />
|
||||
<stop
|
||||
id="stop6947"
|
||||
offset="0.33333334"
|
||||
style="stop-color:#e2e2e2;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#a3a3a3;stop-opacity:1;"
|
||||
offset="0.66666669"
|
||||
id="stop6949" />
|
||||
<stop
|
||||
style="stop-color:#dddddd;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop6943" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6963"
|
||||
id="radialGradient2971"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.584317,0,0,0.549734,-12.035061,-8.383133)"
|
||||
cx="15.415101"
|
||||
cy="35.356506"
|
||||
fx="15.415101"
|
||||
fy="35.356506"
|
||||
r="7.5791559" />
|
||||
<linearGradient
|
||||
id="linearGradient6963">
|
||||
<stop
|
||||
style="stop-color:#696969;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6965" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop6967" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="16"
|
||||
inkscape:cx="-5.416016"
|
||||
inkscape:cy="14.628924"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
units="px"
|
||||
inkscape:snap-page="true"
|
||||
inkscape:snap-bbox="true"
|
||||
inkscape:bbox-paths="true"
|
||||
inkscape:bbox-nodes="true"
|
||||
inkscape:snap-bbox-edge-midpoints="true"
|
||||
inkscape:snap-bbox-midpoints="true"
|
||||
inkscape:object-paths="true"
|
||||
inkscape:snap-intersection-paths="true"
|
||||
inkscape:object-nodes="true"
|
||||
inkscape:snap-smooth-nodes="true"
|
||||
inkscape:snap-midpoints="true"
|
||||
inkscape:snap-object-midpoints="true"
|
||||
inkscape:snap-center="true"
|
||||
inkscape:snap-text-baseline="true"
|
||||
showborder="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:snap-global="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid4369" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata30576">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Klaus Staedtler</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-1028.3622)">
|
||||
<g
|
||||
id="g4733">
|
||||
<g
|
||||
transform="matrix(0.72842778,0,0,0.75240082,10.103955,1039.3154)"
|
||||
id="g4288">
|
||||
<g
|
||||
id="g891-37"
|
||||
transform="matrix(0.186703,0,0,0.186703,-51.137271,27.041497)" />
|
||||
<path
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient2979-31);fill-opacity:1;fill-rule:nonzero;stroke:#673907;stroke-width:1.00000048;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
|
||||
d="m 1.880007,0.390614 6.166172,4.218273 c 5.776248,-6.5301 9.110705,-17.663007 9.110705,-17.663007 0.283343,-1.07141 -0.778668,-1.32072 -1.382605,-0.563567 0,0 -8.9019,7.384103 -13.894272,14.008301 z"
|
||||
id="path6937-9"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true"
|
||||
sodipodi:nodetypes="ccssc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccsc"
|
||||
inkscape:r_cy="true"
|
||||
inkscape:r_cx="true"
|
||||
id="path7220-3"
|
||||
d="m 2.906028,0.727447 4.203637,3.360672 c 6.3456,-7.19205 8.687017,-16.297389 8.687017,-16.297389 0,0 -7.406194,5.641032 -12.890654,12.936717 z"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.33333333;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient2975-75);fill-opacity:1;fill-rule:nonzero;stroke:#888a85;stroke-width:1.0000006;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
|
||||
d="M -2.531061,9.502156 0.955458,11.54026 7.987449,4.840791 C 7.03845,2.891301 3.875427,0.350218 1.332688,0.762284 Z"
|
||||
id="path6935-1"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true"
|
||||
sodipodi:nodetypes="ccccc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient2971);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
|
||||
d="m -12.498089,17.325227 c 12.009594,0.0849 14.031177,-0.03171 14.694027,-4.850339 0.542698,-3.94517 -6.498481,-5.648707 -8.88957,-1.235576 -1.930787,3.563572 -5.804457,6.085915 -5.804457,6.085915 z"
|
||||
id="path6933-9"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true"
|
||||
sodipodi:nodetypes="cssc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<ellipse
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.52777782;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
|
||||
id="path6971-5"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true"
|
||||
cx="-3.2496638"
|
||||
cy="11.638556"
|
||||
rx="1.5320324"
|
||||
ry="1.4790274" />
|
||||
<path
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.00000107;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
|
||||
d="M 2.832601,2.79379 -0.089332,8.294237"
|
||||
id="path6985-0"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<rect
|
||||
ry="1.8554795"
|
||||
rx="2.5547137"
|
||||
y="1028.3622"
|
||||
x="0"
|
||||
height="24"
|
||||
width="24"
|
||||
id="rect4297"
|
||||
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.30000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 9.9 KiB |
|
@ -311,6 +311,7 @@ scalable_images = \
|
|||
scalable/gimp-tool-offset.svg \
|
||||
scalable/gimp-tool-options.svg \
|
||||
scalable/gimp-tool-paintbrush.svg \
|
||||
scalable/gimp-tool-paint-select.svg \
|
||||
scalable/gimp-tool-path.svg \
|
||||
scalable/gimp-tool-pencil.svg \
|
||||
scalable/gimp-tool-perspective-clone.svg \
|
||||
|
@ -491,6 +492,7 @@ vector24_images = \
|
|||
24/gimp-tool-offset.svg \
|
||||
24/gimp-tool-options.svg \
|
||||
24/gimp-tool-paintbrush.svg \
|
||||
24/gimp-tool-paint-select.svg \
|
||||
24/gimp-tool-path.svg \
|
||||
24/gimp-tool-pencil.svg \
|
||||
24/gimp-tool-perspective.svg \
|
||||
|
@ -791,6 +793,7 @@ icons16_images = \
|
|||
16/gimp-tool-offset.png \
|
||||
16/gimp-tool-options.png \
|
||||
16/gimp-tool-paintbrush.png \
|
||||
16/gimp-tool-paint-select.png \
|
||||
16/gimp-tool-path.png \
|
||||
16/gimp-tool-pencil.png \
|
||||
16/gimp-tool-perspective-clone.png \
|
||||
|
@ -1006,6 +1009,7 @@ icons24_images = \
|
|||
24/gimp-tool-n-point-deformation.png \
|
||||
24/gimp-tool-offset.png \
|
||||
24/gimp-tool-paintbrush.png \
|
||||
24/gimp-tool-paint-select.png \
|
||||
24/gimp-tool-path.png \
|
||||
24/gimp-tool-pencil.png \
|
||||
24/gimp-tool-perspective-clone.png \
|
||||
|
|
263
icons/Color/scalable/gimp-tool-paint-select.svg
Normal file
263
icons/Color/scalable/gimp-tool-paint-select.svg
Normal file
|
@ -0,0 +1,263 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
inkscape:export-ydpi="90.000000"
|
||||
inkscape:export-xdpi="90.000000"
|
||||
inkscape:export-filename="/home/jimmac/src/cvs/gnome/gimp/themes/Default/images/stock-layers-16.png"
|
||||
width="16"
|
||||
height="16"
|
||||
id="svg11300"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.91+devel r"
|
||||
sodipodi:docname="gimp-tool-paintbrush.svg"
|
||||
version="1.0"
|
||||
viewBox="0 0 16 16">
|
||||
<sodipodi:namedview
|
||||
inkscape:cy="7.1741021"
|
||||
inkscape:cx="1.3590445"
|
||||
inkscape:zoom="16.269075"
|
||||
inkscape:window-height="752"
|
||||
inkscape:window-width="1440"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="0.17254902"
|
||||
bordercolor="#666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
inkscape:showpageshadow="false"
|
||||
showborder="true"
|
||||
inkscape:window-x="480"
|
||||
inkscape:window-y="290"
|
||||
inkscape:current-layer="layer1"
|
||||
width="16px"
|
||||
height="16px"
|
||||
showgrid="true"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:document-units="px">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid4056" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs3">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6951"
|
||||
id="linearGradient2979-31"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.87935,-0.07437292,0.07703828,0.848926,-18.417151,-18.747073)"
|
||||
x1="28.058632"
|
||||
y1="18.867767"
|
||||
x2="33.436985"
|
||||
y2="23.742767" />
|
||||
<linearGradient
|
||||
id="linearGradient6951">
|
||||
<stop
|
||||
style="stop-color:#6e3d09;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6953" />
|
||||
<stop
|
||||
id="stop6959"
|
||||
offset="0.24242425"
|
||||
style="stop-color:#ea8113;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#5c3307;stop-opacity:1;"
|
||||
offset="0.62121212"
|
||||
id="stop6961" />
|
||||
<stop
|
||||
style="stop-color:#e07c12;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop6955" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6939"
|
||||
id="linearGradient2975-75"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.356127,-0.219769,0.227645,1.309208,-32.05138,-32.311441)"
|
||||
x1="19.394735"
|
||||
y1="30.001331"
|
||||
x2="23.109331"
|
||||
y2="33.438831" />
|
||||
<linearGradient
|
||||
id="linearGradient6939">
|
||||
<stop
|
||||
style="stop-color:#bdbdbd;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6941" />
|
||||
<stop
|
||||
id="stop6947"
|
||||
offset="0.33333334"
|
||||
style="stop-color:#e2e2e2;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#a3a3a3;stop-opacity:1;"
|
||||
offset="0.66666669"
|
||||
id="stop6949" />
|
||||
<stop
|
||||
style="stop-color:#dddddd;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop6943" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6963"
|
||||
id="radialGradient2971"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.584317,0,0,0.549734,-12.035061,-8.383133)"
|
||||
cx="15.415101"
|
||||
cy="35.356506"
|
||||
fx="15.415101"
|
||||
fy="35.356506"
|
||||
r="7.5791559" />
|
||||
<linearGradient
|
||||
id="linearGradient6963">
|
||||
<stop
|
||||
style="stop-color:#696969;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6965" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop6967" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
stroke="#ef2929"
|
||||
fill="#eeeeec"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="0.25490196"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1"
|
||||
inkscape:cx="-14.198652"
|
||||
inkscape:cy="-5.1663457"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:showpageshadow="false"
|
||||
inkscape:window-width="872"
|
||||
inkscape:window-height="659"
|
||||
inkscape:window-x="403"
|
||||
inkscape:window-y="296"
|
||||
width="32px"
|
||||
height="32px"
|
||||
id="namedview73" />
|
||||
<metadata
|
||||
id="metadata4">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jakub Steiner</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:source>http://jimmac.musichall.cz</dc:source>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer">
|
||||
<g
|
||||
id="g11310">
|
||||
<g
|
||||
transform="matrix(0.4966552,0,0,0.50160171,6.7072409,7.3021503)"
|
||||
id="g4288">
|
||||
<g
|
||||
id="g891-37"
|
||||
transform="matrix(0.186703,0,0,0.186703,-51.137271,27.041497)" />
|
||||
<path
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient2979-31);fill-opacity:1;fill-rule:nonzero;stroke:#673907;stroke-width:1.00000048;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
|
||||
d="m 1.880007,0.390614 6.166172,4.218273 c 5.776248,-6.5301 9.110705,-17.663007 9.110705,-17.663007 0.283343,-1.07141 -0.778668,-1.32072 -1.382605,-0.563567 0,0 -8.9019,7.384103 -13.894272,14.008301 z"
|
||||
id="path6937-9"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true"
|
||||
sodipodi:nodetypes="ccssc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccsc"
|
||||
inkscape:r_cy="true"
|
||||
inkscape:r_cx="true"
|
||||
id="path7220-3"
|
||||
d="m 2.906028,0.727447 4.203637,3.360672 c 6.3456,-7.19205 8.687017,-16.297389 8.687017,-16.297389 0,0 -7.406194,5.641032 -12.890654,12.936717 z"
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.33333333;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient2975-75);fill-opacity:1;fill-rule:nonzero;stroke:#888a85;stroke-width:1.0000006;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
|
||||
d="M -2.531061,9.502156 0.955458,11.54026 7.987449,4.840791 C 7.03845,2.891301 3.875427,0.350218 1.332688,0.762284 Z"
|
||||
id="path6935-1"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true"
|
||||
sodipodi:nodetypes="ccccc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient2971);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
|
||||
d="m -12.498089,17.325227 c 12.009594,0.0849 14.031177,-0.03171 14.694027,-4.850339 0.542698,-3.94517 -6.498481,-5.648707 -8.88957,-1.235576 -1.930787,3.563572 -5.804457,6.085915 -5.804457,6.085915 z"
|
||||
id="path6933-9"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true"
|
||||
sodipodi:nodetypes="cssc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<ellipse
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.52777782;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
|
||||
id="path6971-5"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true"
|
||||
cx="-3.2496638"
|
||||
cy="11.638556"
|
||||
rx="1.5320324"
|
||||
ry="1.4790274" />
|
||||
<path
|
||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.00000107;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
|
||||
d="M 2.832601,2.79379 -0.089332,8.294237"
|
||||
id="path6985-0"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<rect
|
||||
ry="1.2369863"
|
||||
rx="1.7031425"
|
||||
y="0"
|
||||
x="0"
|
||||
height="16"
|
||||
width="16"
|
||||
id="rect4297"
|
||||
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 11 KiB |
137
icons/Symbolic/24/gimp-tool-paint-select-symbolic.svg
Normal file
137
icons/Symbolic/24/gimp-tool-paint-select-symbolic.svg
Normal file
|
@ -0,0 +1,137 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg30571"
|
||||
version="1.1"
|
||||
inkscape:version="0.91+devel r"
|
||||
sodipodi:docname="gimp-tool-paintbrush-24.svg"
|
||||
inkscape:export-filename="/home/klaus/Bilder/icons/Symbolic/hicolor/24x24/apps/gimp-channel.png"
|
||||
inkscape:export-xdpi="98.181816"
|
||||
inkscape:export-ydpi="98.181816">
|
||||
<defs
|
||||
id="defs30573">
|
||||
<linearGradient
|
||||
id="linearGradient19282-4"
|
||||
osb:paint="solid"
|
||||
gradientTransform="matrix(0.34682586,0,0,0.30620888,-482.61525,330.965)">
|
||||
<stop
|
||||
style="stop-color:#bebebe;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop19284-0" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient19282-4"
|
||||
id="linearGradient10384"
|
||||
x1="-28.5"
|
||||
y1="25.737938"
|
||||
x2="-20.499094"
|
||||
y2="25.737938"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient19282-4"
|
||||
id="linearGradient10378"
|
||||
x1="67.260277"
|
||||
y1="183.23083"
|
||||
x2="76.514008"
|
||||
y2="183.23083"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.5129026,0,0,1.5338414,-92.758245,756.44128)" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="16"
|
||||
inkscape:cx="-7.400391"
|
||||
inkscape:cy="14.628924"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
units="px"
|
||||
inkscape:snap-page="true"
|
||||
inkscape:snap-bbox="true"
|
||||
inkscape:bbox-paths="true"
|
||||
inkscape:bbox-nodes="true"
|
||||
inkscape:snap-bbox-edge-midpoints="true"
|
||||
inkscape:snap-bbox-midpoints="true"
|
||||
inkscape:object-paths="true"
|
||||
inkscape:snap-intersection-paths="true"
|
||||
inkscape:object-nodes="true"
|
||||
inkscape:snap-smooth-nodes="true"
|
||||
inkscape:snap-midpoints="true"
|
||||
inkscape:snap-object-midpoints="true"
|
||||
inkscape:snap-center="true"
|
||||
inkscape:snap-text-baseline="true"
|
||||
showborder="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:snap-global="false">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid4369" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata30576">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Klaus Staedtler</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-1028.3622)">
|
||||
<g
|
||||
id="g9134">
|
||||
<g
|
||||
style="fill:#bebebe;fill-opacity:1;stroke:none"
|
||||
transform="matrix(1.3748443,0,0,1.4226056,40.183063,1011.7472)"
|
||||
id="g9272">
|
||||
<path
|
||||
style="fill:url(#linearGradient10384);fill-opacity:1;stroke:none"
|
||||
sodipodi:nodetypes="cssac"
|
||||
id="path9274"
|
||||
d="m -28.5,27.5711 c 3.111145,0.0011 2.79359,-3.323359 4.304166,-4.248979 1.750479,-1.072622 3.284496,0.256475 3.590759,1.350292 0.386445,1.380184 -0.337829,2.508685 -1.300323,3.118949 -1.846361,1.170674 -6.300039,0.898712 -6.594602,-0.220262 z"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path9264"
|
||||
d="m 22.852515,1030.0121 c 0.466524,-1.0212 -0.247692,-1.4129 -1.108083,-0.5471 -6.049703,6.0877 -7.086286,5.9984 -12.744432,13.8972 1.518274,0.057 2.823067,1.0638 3.5,2.5 6.698265,-7.3202 7.451812,-11.1222 10.352515,-15.8501 z"
|
||||
style="fill:url(#linearGradient10378);fill-opacity:1;stroke:none;stroke-width:1.52333605"
|
||||
sodipodi:nodetypes="csccc" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.6 KiB |
|
@ -311,6 +311,7 @@ scalable_images = \
|
|||
scalable/gimp-tool-offset-symbolic.svg \
|
||||
scalable/gimp-tool-options-symbolic.svg \
|
||||
scalable/gimp-tool-paintbrush-symbolic.svg \
|
||||
scalable/gimp-tool-paint-select-symbolic.svg \
|
||||
scalable/gimp-tool-path-symbolic.svg \
|
||||
scalable/gimp-tool-pencil-symbolic.svg \
|
||||
scalable/gimp-tool-perspective-clone-symbolic.svg \
|
||||
|
@ -491,6 +492,7 @@ vector24_images = \
|
|||
24/gimp-tool-offset-symbolic.svg \
|
||||
24/gimp-tool-options-symbolic.svg \
|
||||
24/gimp-tool-paintbrush-symbolic.svg \
|
||||
24/gimp-tool-paint-select-symbolic.svg \
|
||||
24/gimp-tool-path-symbolic.svg \
|
||||
24/gimp-tool-pencil-symbolic.svg \
|
||||
24/gimp-tool-perspective-symbolic.svg \
|
||||
|
|
153
icons/Symbolic/scalable/gimp-tool-paint-select-symbolic.svg
Normal file
153
icons/Symbolic/scalable/gimp-tool-paint-select-symbolic.svg
Normal file
|
@ -0,0 +1,153 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
viewBox="0 0 16.000001 15.999992"
|
||||
id="svg7384"
|
||||
height="15.999992"
|
||||
width="16.000002"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="gimp-tool-paintbrush.svg">
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="640"
|
||||
inkscape:window-height="480"
|
||||
id="namedview1509"
|
||||
showgrid="false"
|
||||
inkscape:zoom="14.750007"
|
||||
inkscape:cx="-155.21063"
|
||||
inkscape:cy="-46.369966"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg7384" />
|
||||
<metadata
|
||||
id="metadata90">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
<dc:contributor>
|
||||
<cc:Agent>
|
||||
<dc:title>Barbara Muraus, Jakub Steiner, Klaus Staedtler</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:contributor>
|
||||
<dc:description>Images originally created as the "Art Libre" icon set. Extended and adopted for GIMP</dc:description>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs7386">
|
||||
<linearGradient
|
||||
osb:paint="solid"
|
||||
id="linearGradient8074">
|
||||
<stop
|
||||
id="stop8072"
|
||||
offset="0"
|
||||
style="stop-color:#be00be;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
osb:paint="solid"
|
||||
id="linearGradient7561">
|
||||
<stop
|
||||
id="stop7558"
|
||||
offset="0"
|
||||
style="stop-color:#a5a5a5;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
osb:paint="solid"
|
||||
id="linearGradient7548">
|
||||
<stop
|
||||
id="stop7546"
|
||||
offset="0"
|
||||
style="stop-color:#ebebeb;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
osb:paint="solid"
|
||||
id="linearGradient7542">
|
||||
<stop
|
||||
id="stop7538"
|
||||
offset="0"
|
||||
style="stop-color:#c9c9c9;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
gradientTransform="matrix(0,-735328.32,170712.69,0,2464326300,577972450)"
|
||||
osb:paint="solid"
|
||||
id="linearGradient19282">
|
||||
<stop
|
||||
id="stop19284"
|
||||
offset="0"
|
||||
style="stop-color:#b4b4b4;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
gradientTransform="matrix(0.34682586,0,0,0.30620888,-93.351872,584.01677)"
|
||||
osb:paint="solid"
|
||||
id="linearGradient19282-4">
|
||||
<stop
|
||||
id="stop19284-0"
|
||||
offset="0"
|
||||
style="stop-color:#bebebe;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
gradientTransform="translate(224.21083,191.51971)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="183.23083"
|
||||
x2="76.514008"
|
||||
y1="183.23083"
|
||||
x1="67.260277"
|
||||
id="linearGradient10378"
|
||||
xlink:href="#linearGradient19282-4" />
|
||||
<linearGradient
|
||||
gradientTransform="translate(256.35128,214.76037)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="25.737938"
|
||||
x2="-20.499094"
|
||||
y1="25.737938"
|
||||
x1="-28.5"
|
||||
id="linearGradient10384"
|
||||
xlink:href="#linearGradient19282-4" />
|
||||
</defs>
|
||||
<g
|
||||
transform="translate(66.422852,-256.0432)"
|
||||
style="display:inline"
|
||||
id="tools">
|
||||
<g
|
||||
transform="translate(-127.42305,79.021454)"
|
||||
id="gimp-tool-paintbrush"
|
||||
style="display:inline">
|
||||
<g
|
||||
id="g9272"
|
||||
transform="matrix(0.8746234,0,0,0.89178327,86.926967,167.56161)"
|
||||
style="fill:#bebebe;fill-opacity:1;stroke:none">
|
||||
<path
|
||||
d="m -28.5,27.5711 c 3.111145,0.0011 2.79359,-3.323359 4.304166,-4.248979 1.750479,-1.072622 3.284496,0.256475 3.590759,1.350292 0.386445,1.380184 -0.337829,2.508685 -1.300323,3.118949 -1.846361,1.170674 -6.300039,0.898712 -6.594602,-0.220262 z"
|
||||
id="path9274"
|
||||
style="fill:url(#linearGradient10384);fill-opacity:1;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<path
|
||||
style="fill:url(#linearGradient10378);fill-opacity:1;stroke:none"
|
||||
d="m 76.416523,178.35668 c 0.308363,-0.6658 -0.16372,-0.92113 -0.732422,-0.35668 -3.998739,3.96884 -4.683901,4 -8.423828,9.14967 1.00355,0.0377 1.86506,0.68644 2.3125,1.62279 4.427427,-4.77246 4.92644,-7.33336 6.84375,-10.41578 z"
|
||||
id="path9264"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 5 KiB |
|
@ -374,6 +374,7 @@ G_BEGIN_DECLS
|
|||
#define GIMP_ICON_TOOL_N_POINT_DEFORMATION "gimp-tool-n-point-deformation"
|
||||
#define GIMP_ICON_TOOL_OFFSET "gimp-tool-offset"
|
||||
#define GIMP_ICON_TOOL_PAINTBRUSH "gimp-tool-paintbrush"
|
||||
#define GIMP_ICON_TOOL_PAINT_SELECT "gimp-tool-paint-select"
|
||||
#define GIMP_ICON_TOOL_PATH "gimp-tool-path"
|
||||
#define GIMP_ICON_TOOL_PENCIL "gimp-tool-pencil"
|
||||
#define GIMP_ICON_TOOL_PERSPECTIVE "gimp-tool-perspective"
|
||||
|
|
|
@ -643,6 +643,7 @@
|
|||
<menuitem action="tools-fuzzy-select" />
|
||||
<menuitem action="tools-by-color-select" />
|
||||
<menuitem action="tools-iscissors" />
|
||||
<menuitem action="tools-paint-select" />
|
||||
</menu>
|
||||
<menu action="tools-paint-menu" name="Paint Tools">
|
||||
<menuitem action="tools-bucket-fill" />
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue