Commit ccd8ec5d authored by Michael Natterer's avatar Michael Natterer 😴

app: connect the MyPaint brush core with the new brush container

and remove all hackish temp code that did the same. Remove quite
some #ifdefs around code that doesn't depend on libmypaint.
parent bf161e7b
......@@ -16,6 +16,7 @@ AM_CPPFLAGS = \
$(CAIRO_CFLAGS) \
$(GEGL_CFLAGS) \
$(GDK_PIXBUF_CFLAGS) \
$(LIBMYPAINTGEGL_CFLAGS) \
$(GEXIV2_CFLAGS) \
$(LCMS_CFLAGS) \
-I$(includedir) \
......
......@@ -21,6 +21,10 @@
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gegl.h>
#ifdef HAVE_LIBMYPAINT
#include <mypaint-brush.h>
#endif
#include "core-types.h"
#include "gimpmybrush.h"
......@@ -32,7 +36,12 @@
struct _GimpMybrushPrivate
{
gpointer dummy;
gboolean json_loaded;
gchar *brush_json;
gdouble radius;
gdouble opaque;
gdouble hardness;
};
......@@ -102,6 +111,10 @@ gimp_mybrush_init (GimpMybrush *brush)
brush->priv = G_TYPE_INSTANCE_GET_PRIVATE (brush,
GIMP_TYPE_MYBRUSH,
GimpMybrushPrivate);
brush->priv->radius = 1.0;
brush->priv->opaque = 1.0;
brush->priv->hardness = 1.0;
}
static void
......@@ -109,6 +122,12 @@ gimp_mybrush_finalize (GObject *object)
{
GimpMybrush *brush = GIMP_MYBRUSH (object);
if (brush->priv->brush_json)
{
g_free (brush->priv->brush_json);
brush->priv->brush_json = NULL;
}
G_OBJECT_CLASS (parent_class)->finalize (object);
}
......@@ -220,3 +239,96 @@ gimp_mybrush_get_standard (GimpContext *context)
return standard_mybrush;
}
static void
gimp_mybrush_load_json (GimpMybrush *brush)
{
#ifdef HAVE_LIBMYPAINT
GFile *file = gimp_data_get_file (GIMP_DATA (brush));
MyPaintBrush *mypaint_brush = mypaint_brush_new ();
mypaint_brush_from_defaults (mypaint_brush);
if (file)
{
gchar *path = g_file_get_path (file);
if (g_file_get_contents (path, &brush->priv->brush_json, NULL, NULL))
{
if (! mypaint_brush_from_string (mypaint_brush,
brush->priv->brush_json))
{
g_printerr ("Failed to deserialize MyPaint brush\n");
g_free (brush->priv->brush_json);
brush->priv->brush_json = NULL;
}
}
else
{
g_printerr ("Failed to load MyPaint brush\n");
}
}
brush->priv->radius =
mypaint_brush_get_base_value (mypaint_brush,
MYPAINT_BRUSH_SETTING_RADIUS_LOGARITHMIC);
brush->priv->opaque =
mypaint_brush_get_base_value (mypaint_brush,
MYPAINT_BRUSH_SETTING_OPAQUE);
brush->priv->hardness =
mypaint_brush_get_base_value (mypaint_brush,
MYPAINT_BRUSH_SETTING_HARDNESS);
mypaint_brush_unref (mypaint_brush);
#endif
brush->priv->json_loaded = TRUE;
}
const gchar *
gimp_mybrush_get_brush_json (GimpMybrush *brush)
{
g_return_val_if_fail (GIMP_IS_MYBRUSH (brush), NULL);
if (! brush->priv->json_loaded)
gimp_mybrush_load_json (brush);
return brush->priv->brush_json;
}
gdouble
gimp_mybrush_get_radius (GimpMybrush *brush)
{
g_return_val_if_fail (GIMP_IS_MYBRUSH (brush), 1.0);
if (! brush->priv->json_loaded)
gimp_mybrush_load_json (brush);
return brush->priv->radius;
}
gdouble
gimp_mybrush_get_opaque (GimpMybrush *brush)
{
g_return_val_if_fail (GIMP_IS_MYBRUSH (brush), 1.0);
if (! brush->priv->json_loaded)
gimp_mybrush_load_json (brush);
return brush->priv->opaque;
}
gdouble
gimp_mybrush_get_hardness (GimpMybrush *brush)
{
g_return_val_if_fail (GIMP_IS_MYBRUSH (brush), 1.0);
if (! brush->priv->json_loaded)
gimp_mybrush_load_json (brush);
return brush->priv->hardness;
}
......@@ -46,11 +46,17 @@ struct _GimpMybrushClass
};
GType gimp_mybrush_get_type (void) G_GNUC_CONST;
GType gimp_mybrush_get_type (void) G_GNUC_CONST;
GimpData * gimp_mybrush_new (GimpContext *context,
const gchar *name);
GimpData * gimp_mybrush_get_standard (GimpContext *context);
GimpData * gimp_mybrush_new (GimpContext *context,
const gchar *name);
GimpData * gimp_mybrush_get_standard (GimpContext *context);
const gchar * gimp_mybrush_get_brush_json (GimpMybrush *brush);
gdouble gimp_mybrush_get_radius (GimpMybrush *brush);
gdouble gimp_mybrush_get_opaque (GimpMybrush *brush);
gdouble gimp_mybrush_get_hardness (GimpMybrush *brush);
#endif /* __GIMP_MYBRUSH_H__ */
......@@ -43,9 +43,8 @@
#include "core/gimp.h"
#include "core/gimp-palettes.h"
#include "core/gimpdrawable.h"
#include "core/gimpimage.h"
#include "core/gimpimage-undo.h"
#include "core/gimptempbuf.h"
#include "core/gimperror.h"
#include "core/gimpmybrush.h"
#include "gimpmybrushcore.h"
#include "gimpmybrushsurface.h"
......@@ -56,6 +55,7 @@
struct _GimpMybrushCorePrivate
{
GimpMybrush *mybrush;
#if 0
MyPaintGeglTiledSurface *surface;
#else
......@@ -68,17 +68,22 @@ struct _GimpMybrushCorePrivate
/* local function prototypes */
static void gimp_mybrush_core_paint (GimpPaintCore *paint_core,
GimpDrawable *drawable,
GimpPaintOptions *paint_options,
const GimpCoords *coords,
GimpPaintState paint_state,
guint32 time);
static void gimp_mybrush_core_motion (GimpPaintCore *paint_core,
GimpDrawable *drawable,
GimpPaintOptions *paint_options,
const GimpCoords *coords,
guint32 time);
static gboolean gimp_mybrush_core_start (GimpPaintCore *paint_core,
GimpDrawable *drawable,
GimpPaintOptions *paint_options,
const GimpCoords *coords,
GError **error);
static void gimp_mybrush_core_paint (GimpPaintCore *paint_core,
GimpDrawable *drawable,
GimpPaintOptions *paint_options,
const GimpCoords *coords,
GimpPaintState paint_state,
guint32 time);
static void gimp_mybrush_core_motion (GimpPaintCore *paint_core,
GimpDrawable *drawable,
GimpPaintOptions *paint_options,
const GimpCoords *coords,
guint32 time);
G_DEFINE_TYPE (GimpMybrushCore, gimp_mybrush_core, GIMP_TYPE_PAINT_CORE)
......@@ -104,6 +109,7 @@ gimp_mybrush_core_class_init (GimpMybrushCoreClass *klass)
{
GimpPaintCoreClass *paint_core_class = GIMP_PAINT_CORE_CLASS (klass);
paint_core_class->start = gimp_mybrush_core_start;
paint_core_class->paint = gimp_mybrush_core_paint;
g_type_class_add_private (klass, sizeof (GimpMybrushCorePrivate));
......@@ -117,6 +123,28 @@ gimp_mybrush_core_init (GimpMybrushCore *mybrush)
GimpMybrushCorePrivate);
}
static gboolean
gimp_mybrush_core_start (GimpPaintCore *paint_core,
GimpDrawable *drawable,
GimpPaintOptions *paint_options,
const GimpCoords *coords,
GError **error)
{
GimpMybrushCore *core = GIMP_MYBRUSH_CORE (paint_core);
GimpContext *context = GIMP_CONTEXT (paint_options);
core->private->mybrush = gimp_context_get_mybrush (context);
if (! core->private->mybrush)
{
g_set_error_literal (error, GIMP_ERROR, GIMP_FAILED,
_("No MyPaint brushes available for use with this tool."));
return FALSE;
}
return TRUE;
}
static void
gimp_mybrush_core_paint (GimpPaintCore *paint_core,
GimpDrawable *drawable,
......@@ -162,7 +190,7 @@ gimp_mybrush_core_paint (GimpPaintCore *paint_core,
mybrush->private->brush = mypaint_brush_new ();
mypaint_brush_from_defaults (mybrush->private->brush);
brush_data = gimp_mybrush_options_get_brush_data (options);
brush_data = gimp_mybrush_get_brush_json (mybrush->private->mybrush);
if (brush_data)
mypaint_brush_from_string (mybrush->private->brush, brush_data);
......
......@@ -15,8 +15,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifdef HAVE_LIBMYPAINT
#ifndef __GIMP_MYBRUSH_CORE_H__
#define __GIMP_MYBRUSH_CORE_H__
......@@ -27,8 +25,8 @@
#define GIMP_TYPE_MYBRUSH_CORE (gimp_mybrush_core_get_type ())
#define GIMP_MYBRUSH_CORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_MYBRUSH_CORE, GimpMybrushCore))
#define GIMP_MYBRUSH_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_MYBRUSH_CORE, GimpMybrushCoreClass))
#define GIMP_IS_MYBRUSH(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_MYBRUSH_CORE))
#define GIMP_IS_MYBRUSH_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_MYBRUSH_CORE))
#define GIMP_IS_MYBRUSH_CORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_MYBRUSH_CORE))
#define GIMP_IS_MYBRUSH_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_MYBRUSH_CORE))
#define GIMP_MYBRUSH_CORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_MYBRUSH_CORE, GimpMybrushCoreClass))
......@@ -55,5 +53,3 @@ GType gimp_mybrush_core_get_type (void) G_GNUC_CONST;
#endif /* __GIMP_MYBRUSH_CORE_H__ */
#endif
......@@ -17,8 +17,6 @@
#include "config.h"
#ifdef HAVE_LIBMYPAINT
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gegl.h>
......@@ -28,59 +26,50 @@
#include "core/gimp.h"
#include "core/gimpdrawable.h"
#include "core/gimpmybrush.h"
#include "core/gimppaintinfo.h"
#include "gimpmybrushoptions.h"
#include "gimp-intl.h"
#include <mypaint-brush.h>
enum
{
PROP_0,
PROP_RADIUS,
PROP_OPAQUE,
PROP_HARDNESS,
PROP_MYBRUSH
PROP_HARDNESS
};
typedef struct
{
gdouble radius;
gdouble opaque;
gdouble hardness;
gchar *brush_json;
} OptionsState;
static GHashTable *loaded_myb;
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);
static void options_state_free (gpointer options)
{
OptionsState *state = options;
g_free (state->brush_json);
g_free (state);
}
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);
static void gimp_mybrush_options_mybrush_changed (GimpContext *context,
GimpMybrush *brush);
G_DEFINE_TYPE (GimpMybrushOptions, gimp_mybrush_options, GIMP_TYPE_PAINT_OPTIONS)
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);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GimpContextClass *context_class = GIMP_CONTEXT_CLASS (klass);
object_class->set_property = gimp_mybrush_options_set_property;
object_class->get_property = gimp_mybrush_options_get_property;
object_class->set_property = gimp_mybrush_options_set_property;
object_class->get_property = gimp_mybrush_options_get_property;
context_class->mybrush_changed = gimp_mybrush_options_mybrush_changed;
GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_RADIUS,
"radius", _("Radius"),
......@@ -94,54 +83,6 @@ gimp_mybrush_options_class_init (GimpMybrushOptionsClass *klass)
"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);
loaded_myb = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, options_state_free);
}
static void
gimp_mybrush_options_load_path (GObject *object,
gchar *path)
{
GimpMybrushOptions *options = GIMP_MYBRUSH_OPTIONS (object);
OptionsState *state = g_hash_table_lookup (loaded_myb, path);
if (!state)
{
gchar *brush_json = NULL;
MyPaintBrush *brush = mypaint_brush_new ();
state = g_new0 (OptionsState, 1);
mypaint_brush_from_defaults (brush);
if (g_file_get_contents (path, &brush_json, NULL, NULL))
{
if (! mypaint_brush_from_string (brush, brush_json))
{
g_printerr ("Failed to deserialize MyPaint brush\n");
g_free (brush_json);
brush_json = NULL;
}
}
state->brush_json = brush_json;
state->radius = mypaint_brush_get_base_value (brush, MYPAINT_BRUSH_SETTING_RADIUS_LOGARITHMIC);
state->opaque = mypaint_brush_get_base_value (brush, MYPAINT_BRUSH_SETTING_OPAQUE);
state->hardness = mypaint_brush_get_base_value (brush, MYPAINT_BRUSH_SETTING_HARDNESS);
g_hash_table_insert (loaded_myb, g_strdup(path), state);
}
options->radius = state->radius;
options->opaque = state->opaque;
options->hardness = state->hardness;
g_object_notify (object, "radius");
g_object_notify (object, "opaque");
g_object_notify (object, "hardness");
}
static void
......@@ -168,12 +109,6 @@ gimp_mybrush_options_set_property (GObject *object,
case PROP_OPAQUE:
options->opaque = g_value_get_double (value);
break;
case PROP_MYBRUSH:
g_free (options->mybrush);
options->mybrush = g_value_dup_string (value);
if (options->mybrush)
gimp_mybrush_options_load_path (object, options->mybrush);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
......@@ -200,9 +135,6 @@ gimp_mybrush_options_get_property (GObject *object,
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);
......@@ -210,13 +142,14 @@ gimp_mybrush_options_get_property (GObject *object,
}
}
const gchar *
gimp_mybrush_options_get_brush_data (GimpMybrushOptions *options)
static void
gimp_mybrush_options_mybrush_changed (GimpContext *context,
GimpMybrush *brush)
{
OptionsState *state = g_hash_table_lookup (loaded_myb, options->mybrush);
if (state)
return state->brush_json;
return NULL;
if (brush)
g_object_set (context,
"radius", gimp_mybrush_get_radius (brush),
"opaque", gimp_mybrush_get_opaque (brush),
"hardness", gimp_mybrush_get_hardness (brush),
NULL);
}
#endif
......@@ -15,8 +15,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifdef HAVE_LIBMYPAINT
#ifndef __GIMP_MYBRUSH_OPTIONS_H__
#define __GIMP_MYBRUSH_OPTIONS_H__
......@@ -41,7 +39,6 @@ struct _GimpMybrushOptions
gdouble radius;
gdouble opaque;
gdouble hardness;
gchar *mybrush;
};
struct _GimpMybrushOptionsClass
......@@ -52,9 +49,5 @@ struct _GimpMybrushOptionsClass
GType gimp_mybrush_options_get_type (void) G_GNUC_CONST;
const gchar *
gimp_mybrush_options_get_brush_data (GimpMybrushOptions *options);
#endif /* __GIMP_MYBRUSH_OPTIONS_H__ */
#endif
......@@ -17,8 +17,6 @@
#include "config.h"
#ifdef HAVE_LIBMYPAINT
#include <gegl.h>
#include <gtk/gtk.h>
......@@ -42,124 +40,12 @@
#include "gimp-intl.h"
static void
gimp_mybrush_options_load_brush (GFile *file,
GtkTreeModel *model)
{
GtkListStore *store = GTK_LIST_STORE (model);
GtkTreeIter iter = { 0, };
GdkPixbuf *pixbuf = NULL;
gchar *filename;
gchar *basename;
gchar *preview_filename;
filename = g_file_get_path (file);
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_at_size (preview_filename,
48, 48, NULL);
g_free (preview_filename);
basename = g_file_get_basename (file);
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter,
GIMP_INT_STORE_LABEL, gimp_filename_to_utf8 (basename),
GIMP_INT_STORE_PIXBUF, pixbuf,
GIMP_INT_STORE_USER_DATA, filename,
-1);
g_free (basename);
if (pixbuf)
g_object_unref (pixbuf);
}
static void
gimp_mybrush_options_load_recursive (GFile *dir,
GtkTreeModel *model)
{
GFileEnumerator *enumerator;
enumerator = g_file_enumerate_children (dir,
G_FILE_ATTRIBUTE_STANDARD_NAME ","
G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN ","
G_FILE_ATTRIBUTE_STANDARD_TYPE,
G_FILE_QUERY_INFO_NONE,
NULL, NULL);
if (enumerator)
{
GFileInfo *info;
while ((info = g_file_enumerator_next_file (enumerator,
NULL, NULL)))
{
if (! g_file_info_get_is_hidden (info))
{
GFile *file = g_file_enumerator_get_child (enumerator, info);
switch (g_file_info_get_file_type (info))
{
case G_FILE_TYPE_DIRECTORY:
gimp_mybrush_options_load_recursive (file, model);
break;
case G_FILE_TYPE_REGULAR:
if (gimp_file_has_extension (file, ".myb"))
gimp_mybrush_options_load_brush (file, model);
break;
default:
break;
}
g_object_unref (file);
}
g_object_unref (info);
}
g_object_unref (enumerator);
}
}
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;
GList *path;
GList *list;
GObject *config = G_OBJECT (tool_options);
GtkWidget *vbox = gimp_paint_options_gui (tool_options);
GtkWidget *scale;
/* radius */
scale = gimp_prop_spin_scale_new (config, "radius",
......@@ -182,34 +68,5 @@ gimp_mybrush_options_gui (GimpToolOptions *tool_options)
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));
path = gimp_config_path_expand_to_files (GIMP_CONTEXT (config)->gimp->config->mypaint_brush_path, NULL);
for (list = path; list; list = g_list_next (list))
{
GFile *dir = list->data;
gimp_mybrush_options_load_recursive (dir, model);
}
g_list_free_full (path, (GDestroyNotify) g_object_unref);
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;
}
#endif
......@@ -15,8 +15,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifdef HAVE_LIBMYPAINT
#ifndef __GIMP_MYBRUSH_OPTIONS_GUI_H__
#define __GIMP_MYBRUSH_OPTIONS_GUI_H__
......@@ -25,5 +23,3 @@ GtkWidget * gimp_mybrush_options_gui (GimpToolOptions *tool_options);
#endif /* __GIMP_MYBRUSH_OPTIONS_GUI_H__ */
#endif
......@@ -17,8 +17,6 @@
#include "config.h"
#ifdef HAVE_LIBMYPAINT
#include <gegl.h>
#include <gtk/gtk.h>
......@@ -72,7 +70,7 @@ gimp_mybrush_tool_register (GimpToolRegisterCallback callback,
GIMP_CONTEXT_PROP_MASK_BACKGROUND |
GIMP_CONTEXT_PROP_MASK_OPACITY |
GIMP_CONTEXT_PROP_MASK_PAINT_MODE |
GIMP_CONTEXT_PROP_MYBRUSH,
GIMP_CONTEXT_PROP_MASK_MYBRUSH,
"gimp-mybrush-tool",
_("MyPaint Brush"),
_("MyPaint Brush Tool: Use MyPaint brushes in GIMP"),
......@@ -133,5 +131,3 @@ gimp_mybrush_tool_get_outline (GimpPaintTool *paint_tool,
return NULL;
}
#endif
......@@ -15,8 +15,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifdef HAVE_LIBMYPAINT
#ifndef __GIMP_MYBRUSH_TOOL_H__
#define __GIMP_MYBRUSH_TOOL_H__
......@@ -55,5 +53,3 @@ GType gimp_mybrush_tool_get_type (void) G_GNUC_CONST;
#endif /* __GIMP_MYBRUSH_TOOL_H__ */
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment