[gimp/mypaint-brush: 1/6] app: first draft of GimpMybrushTool, which uses MyPaint brushes
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/mypaint-brush: 1/6] app: first draft of GimpMybrushTool, which uses MyPaint brushes
- Date: Thu, 15 May 2014 09:23:44 +0000 (UTC)
commit e7ba638ff11176a5ddf0827eae1a9c13b7069291
Author: Michael Natterer <mitch gimp org>
Date: Sun Apr 6 15:48:53 2014 +0200
app: first draft of GimpMybrushTool, which uses MyPaint brushes
app/Makefile.am | 2 +
app/paint/Makefile.am | 60 ++++++++--
app/paint/gimp-paint.c | 2 +
app/paint/gimpmybrush.c | 226 ++++++++++++++++++++++++++++++++++++
app/paint/gimpmybrush.h | 55 +++++++++
app/paint/gimpmybrushoptions.c | 136 ++++++++++++++++++++++
app/paint/gimpmybrushoptions.h | 53 +++++++++
app/paint/paint-types.h | 2 +
app/tools/Makefile.am | 4 +
app/tools/gimp-tools.c | 6 +
app/tools/gimpmybrushoptions-gui.c | 166 ++++++++++++++++++++++++++
app/tools/gimpmybrushoptions-gui.h | 25 ++++
app/tools/gimpmybrushtool.c | 77 ++++++++++++
app/tools/gimpmybrushtool.h | 53 +++++++++
app/widgets/gimphelp-ids.h | 1 +
configure.ac | 13 ++-
icons/16/gimp-tool-mybrush.png | Bin 0 -> 3474 bytes
icons/22/gimp-tool-mybrush.png | Bin 0 -> 3469 bytes
icons/Makefile.am | 2 +
libgimpwidgets/gimpstock.c | 3 +
libgimpwidgets/gimpstock.h | 1 +
menus/image-menu.xml.in | 1 +
22 files changed, 877 insertions(+), 11 deletions(-)
---
diff --git a/app/Makefile.am b/app/Makefile.am
index b145419..ca7441b 100644
--- a/app/Makefile.am
+++ b/app/Makefile.am
@@ -162,6 +162,7 @@ gimpconsoleldadd = \
file/libappfile.a \
text/libapptext.a \
paint/libapppaint.a \
+ paint/libmypaint.a \
operations/libappoperations.a \
gegl/libappgegl.a \
config/libappconfig.a \
@@ -181,6 +182,7 @@ gimpconsoleldadd = \
$(GLIB_LIBS) \
$(GEXIV2_LIBS) \
$(LCMS_LIBS) \
+ $(JSON_C_LIBS) \
$(INTLLIBS) \
$(RT_LIBS)
diff --git a/app/paint/Makefile.am b/app/paint/Makefile.am
index b1da3e2..c678cc5 100644
--- a/app/paint/Makefile.am
+++ b/app/paint/Makefile.am
@@ -1,17 +1,55 @@
## Process this file with automake to produce Makefile.in
AM_CPPFLAGS = \
- -DG_LOG_DOMAIN=\"Gimp-Paint\" \
- -I$(top_builddir) \
- -I$(top_srcdir) \
- -I$(top_builddir)/app \
- -I$(top_srcdir)/app \
- $(CAIRO_CFLAGS) \
- $(GEGL_CFLAGS) \
- $(GDK_PIXBUF_CFLAGS) \
+ -DG_LOG_DOMAIN=\"Gimp-Paint\" \
+ -I$(top_builddir) \
+ -I$(top_srcdir) \
+ -I$(top_builddir)/app \
+ -I$(top_srcdir)/app \
+ -I$(top_srcdir)/app/paint/libmypaint \
+ -std=c99 \
+ -DHAVE_JSON_C=1 \
+ $(JSON_C_CFLAGS) \
+ $(CAIRO_CFLAGS) \
+ $(GEGL_CFLAGS) \
+ $(GDK_PIXBUF_CFLAGS) \
-I$(includedir)
-noinst_LIBRARIES = libapppaint.a
+noinst_LIBRARIES = libmypaint.a libapppaint.a
+
+libmypaint_a_SOURCES = \
+ libmypaint/mapping.c \
+ libmypaint/mapping.h \
+ libmypaint/helpers.c \
+ libmypaint/helpers.h \
+ libmypaint/brushmodes.c \
+ libmypaint/brushmodes.h \
+ libmypaint/fifo.c \
+ libmypaint/fifo.h \
+ libmypaint/operationqueue.c \
+ libmypaint/operationqueue.h \
+ libmypaint/rng-double.c \
+ libmypaint/rng-double.h \
+ libmypaint/utils.c \
+ libmypaint/utils.h \
+ libmypaint/tilemap.c \
+ libmypaint/tilemap.h \
+ libmypaint/mypaint.c \
+ libmypaint/mypaint.h \
+ libmypaint/mypaint-brush.c \
+ libmypaint/mypaint-brush.h \
+ libmypaint/mypaint-brush-settings.c \
+ libmypaint/mypaint-brush-settings.h \
+ libmypaint/mypaint-fixed-tiled-surface.c \
+ libmypaint/mypaint-fixed-tiled-surface.h \
+ libmypaint/mypaint-surface.c \
+ libmypaint/mypaint-surface.h \
+ libmypaint/mypaint-tiled-surface.c \
+ libmypaint/mypaint-tiled-surface.h \
+ libmypaint/mypaint-rectangle.c \
+ libmypaint/mypaint-rectangle.h \
+ libmypaint/gegl/mypaint-gegl-surface.c \
+ libmypaint/gegl/mypaint-gegl-surface.h
libapppaint_a_sources = \
paint-enums.h \
@@ -51,6 +89,10 @@ libapppaint_a_sources = \
gimpinkoptions.h \
gimpinkundo.c \
gimpinkundo.h \
+ gimpmybrush.c \
+ gimpmybrush.h \
+ gimpmybrushoptions.c \
+ gimpmybrushoptions.h \
gimppaintcore.c \
gimppaintcore.h \
gimppaintcore-loops.c \
diff --git a/app/paint/gimp-paint.c b/app/paint/gimp-paint.c
index b452ec9..4f2359d 100644
--- a/app/paint/gimp-paint.c
+++ b/app/paint/gimp-paint.c
@@ -34,6 +34,7 @@
#include "gimperaser.h"
#include "gimpheal.h"
#include "gimpink.h"
+#include "gimpmybrush.h"
#include "gimppaintoptions.h"
#include "gimppaintbrush.h"
#include "gimppencil.h"
@@ -64,6 +65,7 @@ gimp_paint_init (Gimp *gimp)
gimp_perspective_clone_register,
gimp_heal_register,
gimp_clone_register,
+ gimp_mybrush_register,
gimp_ink_register,
gimp_airbrush_register,
gimp_eraser_register,
diff --git a/app/paint/gimpmybrush.c b/app/paint/gimpmybrush.c
new file mode 100644
index 0000000..aee5bba
--- /dev/null
+++ b/app/paint/gimpmybrush.c
@@ -0,0 +1,226 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <string.h>
+
+#include <cairo.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <gegl.h>
+
+#include "libmypaint/mypaint-brush.h"
+#include "libmypaint/mypaint-tiled-surface.h"
+#include "libmypaint/gegl/mypaint-gegl-surface.h"
+
+#include "libgimpmath/gimpmath.h"
+#include "libgimpcolor/gimpcolor.h"
+
+#include "paint-types.h"
+
+#include "gegl/gimp-gegl-utils.h"
+
+#include "core/gimpdrawable.h"
+#include "core/gimpimage.h"
+#include "core/gimpimage-undo.h"
+#include "core/gimptempbuf.h"
+
+#include "gimpmybrushoptions.h"
+#include "gimpmybrush.h"
+
+#include "gimp-intl.h"
+
+
+struct _GimpMybrushPrivate
+{
+ MyPaintGeglTiledSurface *surface;
+ MyPaintBrush *brush;
+};
+
+
+/* local function prototypes */
+
+static void gimp_mybrush_paint (GimpPaintCore *paint_core,
+ GimpDrawable *drawable,
+ GimpPaintOptions *paint_options,
+ const GimpCoords *coords,
+ GimpPaintState paint_state,
+ guint32 time);
+static void gimp_mybrush_motion (GimpPaintCore *paint_core,
+ GimpDrawable *drawable,
+ GimpPaintOptions *paint_options,
+ const GimpCoords *coords,
+ guint32 time);
+
+
+G_DEFINE_TYPE (GimpMybrush, gimp_mybrush, GIMP_TYPE_PAINT_CORE)
+
+#define parent_class gimp_mybrush_parent_class
+
+
+void
+gimp_mybrush_register (Gimp *gimp,
+ GimpPaintRegisterCallback callback)
+{
+ (* callback) (gimp,
+ GIMP_TYPE_MYBRUSH,
+ GIMP_TYPE_MYBRUSH_OPTIONS,
+ "gimp-mybrush",
+ _("Mybrush"),
+ "gimp-tool-mybrush");
+}
+
+static void
+gimp_mybrush_class_init (GimpMybrushClass *klass)
+{
+ GimpPaintCoreClass *paint_core_class = GIMP_PAINT_CORE_CLASS (klass);
+
+ paint_core_class->paint = gimp_mybrush_paint;
+
+ g_type_class_add_private (klass, sizeof (GimpMybrushPrivate));
+}
+
+static void
+gimp_mybrush_init (GimpMybrush *mybrush)
+{
+ mybrush->private = G_TYPE_INSTANCE_GET_PRIVATE (mybrush,
+ GIMP_TYPE_MYBRUSH,
+ GimpMybrushPrivate);
+}
+
+static void
+gimp_mybrush_paint (GimpPaintCore *paint_core,
+ GimpDrawable *drawable,
+ GimpPaintOptions *paint_options,
+ const GimpCoords *coords,
+ GimpPaintState paint_state,
+ guint32 time)
+{
+ GimpMybrush *mybrush = GIMP_MYBRUSH (paint_core);
+ GimpMybrushOptions *options = GIMP_MYBRUSH_OPTIONS (paint_options);
+
+ switch (paint_state)
+ {
+ case GIMP_PAINT_STATE_INIT:
+ mybrush->private->surface = mypaint_gegl_tiled_surface_new ();
+ mypaint_gegl_tiled_surface_set_buffer (mybrush->private->surface,
+ gimp_drawable_get_buffer (drawable));
+
+ mybrush->private->brush = mypaint_brush_new ();
+ mypaint_brush_from_defaults (mybrush->private->brush);
+
+ if (options->mybrush)
+ {
+ gchar *string;
+ gsize length;
+
+ if (g_file_get_contents (options->mybrush,
+ &string, &length, NULL))
+ {
+ if (! mypaint_brush_from_string (mybrush->private->brush, string))
+ g_printerr ("Failed to deserialize MyPaint brush\n");
+
+ g_free (string);
+ }
+ }
+
+ mypaint_brush_new_stroke (mybrush->private->brush);
+ break;
+
+ case GIMP_PAINT_STATE_MOTION:
+ gimp_mybrush_motion (paint_core, drawable, paint_options, coords, time);
+ break;
+
+ case GIMP_PAINT_STATE_FINISH:
+ mypaint_surface_unref ((MyPaintSurface *) mybrush->private->surface);
+ mybrush->private->surface = NULL;
+
+ mypaint_brush_unref (mybrush->private->brush);
+ mybrush->private->brush = NULL;
+ break;
+ }
+}
+
+static void
+gimp_mybrush_motion (GimpPaintCore *paint_core,
+ GimpDrawable *drawable,
+ GimpPaintOptions *paint_options,
+ const GimpCoords *coords,
+ guint32 time)
+{
+ GimpMybrush *mybrush = GIMP_MYBRUSH (paint_core);
+ GimpMybrushOptions *options = GIMP_MYBRUSH_OPTIONS (paint_options);
+ GimpContext *context = GIMP_CONTEXT (paint_options);
+ GimpComponentMask active_mask;
+ GimpRGB fg;
+ GimpHSV hsv;
+ MyPaintRectangle rect;
+
+ active_mask = gimp_drawable_get_active_mask (drawable);
+
+ mypaint_brush_set_base_value (mybrush->private->brush,
+ MYPAINT_BRUSH_SETTING_LOCK_ALPHA,
+ (active_mask & GIMP_COMPONENT_ALPHA) ?
+ FALSE : TRUE);
+
+ gimp_context_get_foreground (context, &fg);
+ gimp_rgb_to_hsv (&fg, &hsv);
+
+ mypaint_brush_set_base_value (mybrush->private->brush,
+ MYPAINT_BRUSH_SETTING_COLOR_H,
+ hsv.h);
+ mypaint_brush_set_base_value (mybrush->private->brush,
+ MYPAINT_BRUSH_SETTING_COLOR_S,
+ hsv.s);
+ mypaint_brush_set_base_value (mybrush->private->brush,
+ MYPAINT_BRUSH_SETTING_COLOR_V,
+ hsv.v);
+
+ mypaint_brush_set_base_value (mybrush->private->brush,
+ MYPAINT_BRUSH_SETTING_OPAQUE,
+ gimp_context_get_opacity (context));
+ mypaint_brush_set_base_value (mybrush->private->brush,
+ MYPAINT_BRUSH_SETTING_RADIUS_LOGARITHMIC,
+ options->radius);
+ mypaint_brush_set_base_value (mybrush->private->brush,
+ MYPAINT_BRUSH_SETTING_HARDNESS,
+ options->hardness);
+
+ mypaint_surface_begin_atomic ((MyPaintSurface *) mybrush->private->surface);
+
+ mypaint_brush_stroke_to (mybrush->private->brush,
+ (MyPaintSurface *) mybrush->private->surface,
+ coords->x,
+ coords->y,
+ coords->pressure,
+ coords->xtilt,
+ coords->ytilt,
+ 1);
+
+ mypaint_surface_end_atomic ((MyPaintSurface *) mybrush->private->surface,
+ &rect);
+
+ g_printerr ("painted rect: %d %d %d %d\n",
+ rect.x, rect.y, rect.width, rect.height);
+
+ paint_core->x1 = MIN (paint_core->x1, rect.x);
+ paint_core->y1 = MIN (paint_core->y1, rect.y);
+ paint_core->x2 = MAX (paint_core->x2, rect.x + rect.width);
+ paint_core->y2 = MAX (paint_core->y2, rect.y + rect.height);
+
+ gimp_drawable_update (drawable, rect.x, rect.y, rect.width, rect.height);
+}
diff --git a/app/paint/gimpmybrush.h b/app/paint/gimpmybrush.h
new file mode 100644
index 0000000..2a5d765
--- /dev/null
+++ b/app/paint/gimpmybrush.h
@@ -0,0 +1,55 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GIMP_MYBRUSH_H__
+#define __GIMP_MYBRUSH_H__
+
+
+#include "gimppaintcore.h"
+
+
+#define GIMP_TYPE_MYBRUSH (gimp_mybrush_get_type ())
+#define GIMP_MYBRUSH(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_MYBRUSH, GimpMybrush))
+#define GIMP_MYBRUSH_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_MYBRUSH, GimpMybrushClass))
+#define GIMP_IS_MYBRUSH(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_MYBRUSH))
+#define GIMP_IS_MYBRUSH_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_MYBRUSH))
+#define GIMP_MYBRUSH_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_MYBRUSH, GimpMybrushClass))
+
+
+typedef struct _GimpMybrushPrivate GimpMybrushPrivate;
+typedef struct _GimpMybrushClass GimpMybrushClass;
+
+struct _GimpMybrush
+{
+ GimpPaintCore parent_instance;
+
+ GimpMybrushPrivate *private;
+};
+
+struct _GimpMybrushClass
+{
+ GimpPaintCoreClass parent_class;
+};
+
+
+void gimp_mybrush_register (Gimp *gimp,
+ GimpPaintRegisterCallback callback);
+
+GType gimp_mybrush_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_MYBRUSH_H__ */
diff --git a/app/paint/gimpmybrushoptions.c b/app/paint/gimpmybrushoptions.c
new file mode 100644
index 0000000..487e787
--- /dev/null
+++ b/app/paint/gimpmybrushoptions.c
@@ -0,0 +1,136 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <gegl.h>
+
+#include "libgimpconfig/gimpconfig.h"
+
+#include "paint-types.h"
+
+#include "core/gimp.h"
+#include "core/gimpdrawable.h"
+#include "core/gimppaintinfo.h"
+
+#include "gimpmybrushoptions.h"
+
+#include "gimp-intl.h"
+
+
+enum
+{
+ PROP_0,
+ PROP_RADIUS,
+ PROP_HARDNESS,
+ PROP_MYBRUSH
+};
+
+
+static void gimp_mybrush_options_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec);
+static void gimp_mybrush_options_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec);
+
+
+G_DEFINE_TYPE (GimpMybrushOptions, gimp_mybrush_options, GIMP_TYPE_PAINT_OPTIONS)
+
+
+static void
+gimp_mybrush_options_class_init (GimpMybrushOptionsClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->set_property = gimp_mybrush_options_set_property;
+ object_class->get_property = gimp_mybrush_options_get_property;
+
+ GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_RADIUS,
+ "radius", _("Radius"),
+ -2.0, 6.0, 1.0,
+ GIMP_PARAM_STATIC_STRINGS);
+ GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_HARDNESS,
+ "hardness", NULL,
+ 0.0, 1.0, 1.0,
+ GIMP_PARAM_STATIC_STRINGS);
+ GIMP_CONFIG_INSTALL_PROP_STRING (object_class, PROP_MYBRUSH,
+ "mybrush", NULL,
+ NULL,
+ GIMP_PARAM_STATIC_STRINGS);
+}
+
+static void
+gimp_mybrush_options_init (GimpMybrushOptions *options)
+{
+}
+
+static void
+gimp_mybrush_options_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GimpMybrushOptions *options = GIMP_MYBRUSH_OPTIONS (object);
+
+ switch (property_id)
+ {
+ case PROP_RADIUS:
+ options->radius = g_value_get_double (value);
+ break;
+ case PROP_HARDNESS:
+ options->hardness = g_value_get_double (value);
+ break;
+ case PROP_MYBRUSH:
+ g_free (options->mybrush);
+ options->mybrush = g_value_dup_string (value);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+gimp_mybrush_options_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GimpMybrushOptions *options = GIMP_MYBRUSH_OPTIONS (object);
+
+ switch (property_id)
+ {
+ case PROP_RADIUS:
+ g_value_set_double (value, options->radius);
+ break;
+ case PROP_HARDNESS:
+ g_value_set_double (value, options->hardness);
+ break;
+ case PROP_MYBRUSH:
+ g_value_set_string (value, options->mybrush);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
diff --git a/app/paint/gimpmybrushoptions.h b/app/paint/gimpmybrushoptions.h
new file mode 100644
index 0000000..1a756d4
--- /dev/null
+++ b/app/paint/gimpmybrushoptions.h
@@ -0,0 +1,53 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GIMP_MYBRUSH_OPTIONS_H__
+#define __GIMP_MYBRUSH_OPTIONS_H__
+
+
+#include "gimppaintoptions.h"
+
+
+#define GIMP_TYPE_MYBRUSH_OPTIONS (gimp_mybrush_options_get_type ())
+#define GIMP_MYBRUSH_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_MYBRUSH_OPTIONS,
GimpMybrushOptions))
+#define GIMP_MYBRUSH_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_MYBRUSH_OPTIONS,
GimpMybrushOptionsClass))
+#define GIMP_IS_MYBRUSH_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_MYBRUSH_OPTIONS))
+#define GIMP_IS_MYBRUSH_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_MYBRUSH_OPTIONS))
+#define GIMP_MYBRUSH_OPTIONS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_MYBRUSH_OPTIONS,
GimpMybrushOptionsClass))
+
+
+typedef struct _GimpMybrushOptionsClass GimpMybrushOptionsClass;
+
+struct _GimpMybrushOptions
+{
+ GimpPaintOptions parent_instance;
+
+ gdouble radius;
+ gdouble hardness;
+ gchar *mybrush;
+};
+
+struct _GimpMybrushOptionsClass
+{
+ GimpPaintOptionsClass parent_instance;
+};
+
+
+GType gimp_mybrush_options_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_MYBRUSH_OPTIONS_H__ */
diff --git a/app/paint/paint-types.h b/app/paint/paint-types.h
index 4235bef..ccbedb2 100644
--- a/app/paint/paint-types.h
+++ b/app/paint/paint-types.h
@@ -36,6 +36,7 @@ typedef struct _GimpDodgeBurn GimpDodgeBurn;
typedef struct _GimpEraser GimpEraser;
typedef struct _GimpHeal GimpHeal;
typedef struct _GimpInk GimpInk;
+typedef struct _GimpMybrush GimpMybrush;
typedef struct _GimpPaintbrush GimpPaintbrush;
typedef struct _GimpPencil GimpPencil;
typedef struct _GimpPerspectiveClone GimpPerspectiveClone;
@@ -53,6 +54,7 @@ typedef struct _GimpConvolveOptions GimpConvolveOptions;
typedef struct _GimpDodgeBurnOptions GimpDodgeBurnOptions;
typedef struct _GimpEraserOptions GimpEraserOptions;
typedef struct _GimpInkOptions GimpInkOptions;
+typedef struct _GimpMybrushOptions GimpMybrushOptions;
typedef struct _GimpPencilOptions GimpPencilOptions;
typedef struct _GimpPerspectiveCloneOptions GimpPerspectiveCloneOptions;
typedef struct _GimpSmudgeOptions GimpSmudgeOptions;
diff --git a/app/tools/Makefile.am b/app/tools/Makefile.am
index d5fcd17..76a52f2 100644
--- a/app/tools/Makefile.am
+++ b/app/tools/Makefile.am
@@ -132,6 +132,10 @@ libapptools_a_sources = \
gimpmoveoptions.h \
gimpmovetool.c \
gimpmovetool.h \
+ gimpmybrushoptions-gui.c \
+ gimpmybrushoptions-gui.h \
+ gimpmybrushtool.c \
+ gimpmybrushtool.h \
gimppaintbrushtool.c \
gimppaintbrushtool.h \
gimppaintoptions-gui.c \
diff --git a/app/tools/gimp-tools.c b/app/tools/gimp-tools.c
index dd56ed3..6442a8f 100644
--- a/app/tools/gimp-tools.c
+++ b/app/tools/gimp-tools.c
@@ -70,6 +70,7 @@
#include "gimpmagnifytool.h"
#include "gimpmeasuretool.h"
#include "gimpmovetool.h"
+#include "gimpmybrushtool.h"
#include "gimppaintbrushtool.h"
#include "gimppenciltool.h"
#include "gimpperspectiveclonetool.h"
@@ -142,6 +143,7 @@ gimp_tools_init (Gimp *gimp)
gimp_perspective_clone_tool_register,
gimp_heal_tool_register,
gimp_clone_tool_register,
+ gimp_mybrush_tool_register,
gimp_ink_tool_register,
gimp_airbrush_tool_register,
gimp_eraser_tool_register,
@@ -535,6 +537,10 @@ gimp_tools_register (GType tool_type,
{
paint_core_name = "gimp-ink";
}
+ else if (tool_type == GIMP_TYPE_MYBRUSH_TOOL)
+ {
+ paint_core_name = "gimp-mybrush";
+ }
else
{
paint_core_name = "gimp-paintbrush";
diff --git a/app/tools/gimpmybrushoptions-gui.c b/app/tools/gimpmybrushoptions-gui.c
new file mode 100644
index 0000000..34ad30a
--- /dev/null
+++ b/app/tools/gimpmybrushoptions-gui.c
@@ -0,0 +1,166 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gegl.h>
+#include <gtk/gtk.h>
+
+#include "libgimpbase/gimpbase.h"
+#include "libgimpwidgets/gimpwidgets.h"
+
+#include "tools-types.h"
+
+#include "paint/gimpmybrushoptions.h"
+
+#include "widgets/gimppropwidgets.h"
+
+#include "gimpmybrushoptions-gui.h"
+#include "gimppaintoptions-gui.h"
+
+#include "gimp-intl.h"
+
+
+static void
+gimp_mybrush_options_load_brush (const GimpDatafileData *file_data,
+ gpointer user_data)
+{
+ if (gimp_datafiles_check_extension (file_data->basename, ".myb"))
+ {
+ GtkListStore *store = user_data;
+ GtkTreeIter iter = { 0, };
+ GdkPixbuf *pixbuf = NULL;
+ gchar *filename;
+ gchar *basename;
+ gchar *preview_filename;
+
+ filename = g_strdup (file_data->filename);
+ g_object_weak_ref (G_OBJECT (store), (GWeakNotify) g_free, filename);
+
+ basename = g_strndup (filename, strlen (filename) - 4);
+ preview_filename = g_strconcat (basename, "_prev.png", NULL);
+ g_free (basename);
+
+ pixbuf = gdk_pixbuf_new_from_file (preview_filename, NULL);
+ g_free (preview_filename);
+
+ if (pixbuf)
+ {
+ GdkPixbuf *scaled;
+ gint width = gdk_pixbuf_get_width (pixbuf);
+ gint height = gdk_pixbuf_get_height (pixbuf);
+ gdouble factor = 48.0 / height;
+
+ scaled = gdk_pixbuf_scale_simple (pixbuf,
+ width * factor,
+ height * factor,
+ GDK_INTERP_NEAREST);
+
+ g_object_unref (pixbuf);
+ pixbuf = scaled;
+ }
+
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter,
+ GIMP_INT_STORE_LABEL, file_data->basename,
+ GIMP_INT_STORE_PIXBUF, pixbuf,
+ GIMP_INT_STORE_USER_DATA, filename,
+ -1);
+
+ if (pixbuf)
+ g_object_unref (pixbuf);
+ }
+}
+
+static void
+gimp_mybrush_options_load_recursive (const GimpDatafileData *file_data,
+ gpointer user_data)
+{
+ gimp_datafiles_read_directories (file_data->filename,
+ G_FILE_TEST_IS_REGULAR,
+ gimp_mybrush_options_load_brush,
+ user_data);
+}
+
+static void
+gimp_mybrush_options_brush_changed (GtkComboBox *combo,
+ GObject *config)
+{
+ GtkTreeIter iter;
+
+ if (gtk_combo_box_get_active_iter (combo, &iter))
+ {
+ GtkTreeModel *model = gtk_combo_box_get_model (combo);
+ const gchar *brush;
+
+ gtk_tree_model_get (model, &iter,
+ GIMP_INT_STORE_USER_DATA, &brush,
+ -1);
+
+ if (brush)
+ g_object_set (config,
+ "mybrush", brush,
+ NULL);
+ }
+}
+
+GtkWidget *
+gimp_mybrush_options_gui (GimpToolOptions *tool_options)
+{
+ GObject *config = G_OBJECT (tool_options);
+ GtkWidget *vbox = gimp_paint_options_gui (tool_options);
+ GtkWidget *scale;
+ GtkWidget *combo;
+ GtkTreeModel *model;
+
+ /* radius */
+ scale = gimp_prop_spin_scale_new (config, "radius",
+ _("Radius"),
+ 0.1, 1.0, 2);
+ gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, FALSE, 0);
+ gtk_widget_show (scale);
+
+ /* hardness */
+ scale = gimp_prop_spin_scale_new (config, "hardness",
+ _("Hardness"),
+ 0.1, 1.0, 2);
+ gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, FALSE, 0);
+ gtk_widget_show (scale);
+
+ /* brushes */
+ combo = g_object_new (GIMP_TYPE_INT_COMBO_BOX,
+ "label", _("Brush"),
+ "ellipsize", PANGO_ELLIPSIZE_END,
+ NULL);
+ gtk_box_pack_start (GTK_BOX (vbox), combo, FALSE, FALSE, 0);
+ gtk_widget_show (combo);
+
+ model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo));
+
+ gimp_datafiles_read_directories ("/usr/share/mypaint/brushes",
+ G_FILE_TEST_IS_DIR,
+ gimp_mybrush_options_load_recursive,
+ model);
+
+ g_signal_connect (combo, "changed",
+ G_CALLBACK (gimp_mybrush_options_brush_changed),
+ config);
+
+ gimp_int_combo_box_set_active (GIMP_INT_COMBO_BOX (combo), 0);
+
+ return vbox;
+}
diff --git a/app/tools/gimpmybrushoptions-gui.h b/app/tools/gimpmybrushoptions-gui.h
new file mode 100644
index 0000000..59618a2
--- /dev/null
+++ b/app/tools/gimpmybrushoptions-gui.h
@@ -0,0 +1,25 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GIMP_MYBRUSH_OPTIONS_GUI_H__
+#define __GIMP_MYBRUSH_OPTIONS_GUI_H__
+
+
+GtkWidget * gimp_mybrush_options_gui (GimpToolOptions *tool_options);
+
+
+#endif /* __GIMP_MYBRUSH_OPTIONS_GUI_H__ */
diff --git a/app/tools/gimpmybrushtool.c b/app/tools/gimpmybrushtool.c
new file mode 100644
index 0000000..678d137
--- /dev/null
+++ b/app/tools/gimpmybrushtool.c
@@ -0,0 +1,77 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gegl.h>
+#include <gtk/gtk.h>
+
+#include "libgimpwidgets/gimpwidgets.h"
+
+#include "tools-types.h"
+
+#include "paint/gimpmybrushoptions.h"
+
+#include "widgets/gimphelp-ids.h"
+
+#include "gimpmybrushoptions-gui.h"
+#include "gimpmybrushtool.h"
+#include "gimptoolcontrol.h"
+
+#include "gimp-intl.h"
+
+
+G_DEFINE_TYPE (GimpMybrushTool, gimp_mybrush_tool, GIMP_TYPE_PAINT_TOOL)
+
+#define parent_class gimp_mybrush_tool_parent_class
+
+
+void
+gimp_mybrush_tool_register (GimpToolRegisterCallback callback,
+ gpointer data)
+{
+ (* callback) (GIMP_TYPE_MYBRUSH_TOOL,
+ GIMP_TYPE_MYBRUSH_OPTIONS,
+ gimp_mybrush_options_gui,
+ GIMP_CONTEXT_FOREGROUND_MASK |
+ GIMP_CONTEXT_BACKGROUND_MASK |
+ GIMP_CONTEXT_OPACITY_MASK |
+ GIMP_CONTEXT_PAINT_MODE_MASK,
+ "gimp-mybrush-tool",
+ _("MyPaint Brush"),
+ _("MyPaint Brush Tool: Use MyPaint brushes in GIMP"),
+ N_("M_yPaint Brush"), "Y",
+ NULL, GIMP_HELP_TOOL_MYBRUSH,
+ GIMP_STOCK_TOOL_MYBRUSH,
+ data);
+}
+
+static void
+gimp_mybrush_tool_class_init (GimpMybrushToolClass *klass)
+{
+}
+
+static void
+gimp_mybrush_tool_init (GimpMybrushTool *mybrush_tool)
+{
+ GimpTool *tool = GIMP_TOOL (mybrush_tool);
+
+ gimp_tool_control_set_tool_cursor (tool->control, GIMP_TOOL_CURSOR_INK);
+
+ gimp_paint_tool_enable_color_picker (GIMP_PAINT_TOOL (mybrush_tool),
+ GIMP_COLOR_PICK_MODE_FOREGROUND);
+}
diff --git a/app/tools/gimpmybrushtool.h b/app/tools/gimpmybrushtool.h
new file mode 100644
index 0000000..f4413cb
--- /dev/null
+++ b/app/tools/gimpmybrushtool.h
@@ -0,0 +1,53 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GIMP_MYBRUSH_TOOL_H__
+#define __GIMP_MYBRUSH_TOOL_H__
+
+
+#include "gimppainttool.h"
+
+
+#define GIMP_TYPE_MYBRUSH_TOOL (gimp_mybrush_tool_get_type ())
+#define GIMP_MYBRUSH_TOOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_MYBRUSH_TOOL,
GimpMybrushTool))
+#define GIMP_MYBRUSH_TOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_MYBRUSH_TOOL,
GimpMybrushToolClass))
+#define GIMP_IS_MYBRUSH_TOOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_MYBRUSH_TOOL))
+#define GIMP_IS_MYBRUSH_TOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_MYBRUSH_TOOL))
+#define GIMP_MYBRUSH_TOOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_MYBRUSH_TOOL,
GimpMybrushToolClass))
+
+
+typedef struct _GimpMybrushTool GimpMybrushTool;
+typedef struct _GimpMybrushToolClass GimpMybrushToolClass;
+
+struct _GimpMybrushTool
+{
+ GimpPaintTool parent_instance;
+};
+
+struct _GimpMybrushToolClass
+{
+ GimpPaintToolClass parent_class;
+};
+
+
+void gimp_mybrush_tool_register (GimpToolRegisterCallback callback,
+ gpointer data);
+
+GType gimp_mybrush_tool_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_MYBRUSH_TOOL_H__ */
diff --git a/app/widgets/gimphelp-ids.h b/app/widgets/gimphelp-ids.h
index 95d7464..9eff3fd 100644
--- a/app/widgets/gimphelp-ids.h
+++ b/app/widgets/gimphelp-ids.h
@@ -284,6 +284,7 @@
#define GIMP_HELP_TOOL_LEVELS "gimp-tool-levels"
#define GIMP_HELP_TOOL_MEASURE "gimp-tool-measure"
#define GIMP_HELP_TOOL_MOVE "gimp-tool-move"
+#define GIMP_HELP_TOOL_MYBRUSH "gimp-tool-mybrush"
#define GIMP_HELP_TOOL_PATH "gimp-tool-path"
#define GIMP_HELP_TOOL_PAINTBRUSH "gimp-tool-paintbrush"
#define GIMP_HELP_TOOL_PENCIL "gimp-tool-pencil"
diff --git a/configure.ac b/configure.ac
index 642aa3e..8cb3873 100644
--- a/configure.ac
+++ b/configure.ac
@@ -363,8 +363,10 @@ CFLAGS="$CFLAGS $extra_warnings"
# We really don't want anyone using code with missing prototypes, which
# can cause random behavior. If compile breaks due to the following,
# come to us and we will point you to a newer version which works.
-GIMP_DETECT_CFLAGS(extra_warnings, '-Werror=missing-prototypes')
-CFLAGS="$CFLAGS $extra_warnings"
+#
+# Temporarily disabled -- mypaint brush
+# GIMP_DETECT_CFLAGS(extra_warnings, '-Werror=missing-prototypes')
+# CFLAGS="$CFLAGS $extra_warnings"
GIMP_DETECT_CFLAGS(extra_warnings, '-Wstrict-prototypes')
CFLAGS="$CFLAGS $extra_warnings"
@@ -1594,6 +1596,13 @@ AC_SUBST(JP2_LIBS)
PKG_CHECK_MODULES(LCMS, lcms2 >= lcms_required_version)
+##################
+# Check for json-c -- temporary for mypaint brush
+##################
+
+PKG_CHECK_MODULES(JSON_C, json-c)
+
+
######################
# Check for libXcursor
######################
diff --git a/icons/16/gimp-tool-mybrush.png b/icons/16/gimp-tool-mybrush.png
new file mode 100644
index 0000000..d785457
Binary files /dev/null and b/icons/16/gimp-tool-mybrush.png differ
diff --git a/icons/22/gimp-tool-mybrush.png b/icons/22/gimp-tool-mybrush.png
new file mode 100644
index 0000000..bc27d81
Binary files /dev/null and b/icons/22/gimp-tool-mybrush.png differ
diff --git a/icons/Makefile.am b/icons/Makefile.am
index 829aab1..02fae7a 100644
--- a/icons/Makefile.am
+++ b/icons/Makefile.am
@@ -179,6 +179,7 @@ icons16_IMAGES = \
16/gimp-tool-levels.png \
16/gimp-tool-measure.png \
16/gimp-tool-move.png \
+ 16/gimp-tool-mybrush.png \
16/gimp-tool-options.png \
16/gimp-tool-paintbrush.png \
16/gimp-tool-path.png \
@@ -286,6 +287,7 @@ icons22_IMAGES = \
22/gimp-tool-levels.png \
22/gimp-tool-measure.png \
22/gimp-tool-move.png \
+ 22/gimp-tool-mybrush.png \
22/gimp-tool-paintbrush.png \
22/gimp-tool-path.png \
22/gimp-tool-pencil.png \
diff --git a/libgimpwidgets/gimpstock.c b/libgimpwidgets/gimpstock.c
index 372866c..60de90a 100644
--- a/libgimpwidgets/gimpstock.c
+++ b/libgimpwidgets/gimpstock.c
@@ -334,6 +334,7 @@ static const GtkStockItem gimp_stock_items[] =
{ GIMP_STOCK_TOOL_LEVELS, NULL, 0, 0, LIBGIMP_DOMAIN },
{ GIMP_STOCK_TOOL_MEASURE, NULL, 0, 0, LIBGIMP_DOMAIN },
{ GIMP_STOCK_TOOL_MOVE, NULL, 0, 0, LIBGIMP_DOMAIN },
+ { GIMP_STOCK_TOOL_MYBRUSH, NULL, 0, 0, LIBGIMP_DOMAIN },
{ GIMP_STOCK_TOOL_PAINTBRUSH, NULL, 0, 0, LIBGIMP_DOMAIN },
{ GIMP_STOCK_TOOL_PATH, NULL, 0, 0, LIBGIMP_DOMAIN },
{ GIMP_STOCK_TOOL_PENCIL, NULL, 0, 0, LIBGIMP_DOMAIN },
@@ -495,6 +496,7 @@ gimp_stock_button_pixbufs[] =
{ GIMP_STOCK_TOOL_LEVELS, gimp_tool_levels_22 },
{ GIMP_STOCK_TOOL_MEASURE, gimp_tool_measure_22 },
{ GIMP_STOCK_TOOL_MOVE, gimp_tool_move_22 },
+ { GIMP_STOCK_TOOL_MYBRUSH, gimp_tool_mybrush_22 },
{ GIMP_STOCK_TOOL_PAINTBRUSH, gimp_tool_paintbrush_22 },
{ GIMP_STOCK_TOOL_PATH, gimp_tool_path_22 },
{ GIMP_STOCK_TOOL_PENCIL, gimp_tool_pencil_22 },
@@ -664,6 +666,7 @@ gimp_stock_menu_pixbufs[] =
{ GIMP_STOCK_TOOL_ISCISSORS, gimp_tool_iscissors_16 },
{ GIMP_STOCK_TOOL_LEVELS, gimp_tool_levels_16 },
{ GIMP_STOCK_TOOL_MEASURE, gimp_tool_measure_16 },
+ { GIMP_STOCK_TOOL_MYBRUSH, gimp_tool_mybrush_16 },
{ GIMP_STOCK_TOOL_MOVE, gimp_tool_move_16 },
{ GIMP_STOCK_TOOL_PAINTBRUSH, gimp_tool_paintbrush_16 },
{ GIMP_STOCK_TOOL_PATH, gimp_tool_path_16 },
diff --git a/libgimpwidgets/gimpstock.h b/libgimpwidgets/gimpstock.h
index ec9eec7..040e55d 100644
--- a/libgimpwidgets/gimpstock.h
+++ b/libgimpwidgets/gimpstock.h
@@ -132,6 +132,7 @@ G_BEGIN_DECLS
#define GIMP_STOCK_TOOL_LEVELS "gimp-tool-levels"
#define GIMP_STOCK_TOOL_MEASURE "gimp-tool-measure"
#define GIMP_STOCK_TOOL_MOVE "gimp-tool-move"
+#define GIMP_STOCK_TOOL_MYBRUSH "gimp-tool-mybrush"
#define GIMP_STOCK_TOOL_PAINTBRUSH "gimp-tool-paintbrush"
#define GIMP_STOCK_TOOL_PATH "gimp-tool-path"
#define GIMP_STOCK_TOOL_PENCIL "gimp-tool-pencil"
diff --git a/menus/image-menu.xml.in b/menus/image-menu.xml.in
index 160f03e..e54aa44 100644
--- a/menus/image-menu.xml.in
+++ b/menus/image-menu.xml.in
@@ -579,6 +579,7 @@
<menuitem action="tools-eraser" />
<menuitem action="tools-airbrush" />
<menuitem action="tools-ink" />
+ <menuitem action="tools-mybrush" />
<menuitem action="tools-clone" />
<menuitem action="tools-heal" />
<menuitem action="tools-perspective-clone" />
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]