Author: ok Date: Tue Jan 8 00:22:07 2008 New Revision: 1827 URL: http://svn.gnome.org/viewvc/gegl?rev=1827&view=rev
Log: * operations/core/clone.c: turned into a non chanted operation that derives directly from GeglOperation instead of GeglOperationFilter. * operations/core/nop.c: removed erronious buffer reference. * operations/core/shift.c: removed erronious buffer reference. Modified: trunk/ChangeLog trunk/operations/core/clone.c trunk/operations/core/nop.c trunk/operations/core/shift.c Modified: trunk/operations/core/clone.c ============================================================================== --- trunk/operations/core/clone.c (original) +++ trunk/operations/core/clone.c Tue Jan 8 00:22:07 2008 @@ -1,4 +1,4 @@ -/* This file is an image processing operation for GEGL +/* This file is part of GEGL * * GEGL is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -13,48 +13,200 @@ * You should have received a copy of the GNU Lesser General Public * License along with GEGL; if not, see <http://www.gnu.org/licenses/>. * - * Copyright 2006 Øyvind Kolås <[EMAIL PROTECTED]> + * Copyright 2006 Øyvind Kolås */ -#if GEGL_CHANT_PROPERTIES -gegl_chant_string (ref, "", "The reference ID used as input.") +#ifndef __GEGL_OPERATION_CLONE_H__ +#define __GEGL_OPERATION_CLONE_H__ -#else +#include "operation/gegl-operation.h" +#include "gegl-module.h" -#define GEGL_CHANT_FILTER -#define GEGL_CHANT_NAME clone -#define GEGL_CHANT_DESCRIPTION "A routing op used by the XML data model to implement clones." +G_BEGIN_DECLS -#define GEGL_CHANT_SELF "clone.c" -#define GEGL_CHANT_CATEGORIES "misc" -#define GEGL_CHANT_CLASS_INIT -#include "gegl-chant.h" +#define GEGL_TYPE_OPERATION_CLONE (gegl_operation_clone_get_type ()) +#define GEGL_OPERATION_CLONE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEGL_TYPE_OPERATION_CLONE, GeglOperationClone)) +#define GEGL_OPERATION_CLONE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GEGL_TYPE_OPERATION_CLONE, GeglOperationCloneClass)) +#define GEGL_IS_OPERATION_CLONE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEGL_TYPE_OPERATION_CLONE)) +#define GEGL_IS_OPERATION_CLONE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GEGL_TYPE_OPERATION_CLONE)) +#define GEGL_OPERATION_CLONE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GEGL_TYPE_OPERATION_CLONE, GeglOperationCloneClass)) +typedef struct _GeglOperationClone GeglOperationClone; +typedef struct _GeglOperationCloneClass GeglOperationCloneClass; -/* FIXME: rewrtie without chanting, wihtout deriving from GeglOperationFilter, but - * directly from GeglOperation - */ +struct _GeglOperationClone +{ + GeglOperation parent_instance; + gchar *ref; +}; -/* Actual image processing code - ************************************************************************/ -static gboolean -process (GeglOperation *operation, - GeglNodeContext *context, - GeglBuffer *input, - GeglBuffer *output, /* ignored */ - const GeglRectangle *result) +struct _GeglOperationCloneClass { - gboolean success = FALSE; - if (input) + GeglOperationClass parent_class; +}; + +GType gegl_operation_clone_get_type (void) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __GEGL_OPERATION_CLONE_H__ */ + +/***************************************************************************/ + +#include "graph/gegl-pad.h" +#include "graph/gegl-node.h" +#include <math.h> +#include <string.h> + + +enum +{ + PROP_0, + PROP_OUTPUT, + PROP_INPUT, + PROP_REF +}; + +static gboolean process (GeglOperation *operation, + GeglNodeContext *context, + const gchar *output_prop, + const GeglRectangle *result); +static void attach (GeglOperation *operation); +static GeglNode * detect (GeglOperation *operation, + gint x, + gint y); +static GeglRectangle get_defined_region (GeglOperation *operation); +static GeglRectangle compute_input_request (GeglOperation *operation, + const gchar *input_pad, + const GeglRectangle *roi); +static GeglRectangle compute_affected_region (GeglOperation *operation, + const gchar *input_pad, + const GeglRectangle *input_region); +static void get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static void set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); + +G_DEFINE_DYNAMIC_TYPE (GeglOperationClone, gegl_operation_clone, GEGL_TYPE_OPERATION) + +static void +gegl_operation_clone_class_init (GeglOperationCloneClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GeglOperationClass *operation_class = GEGL_OPERATION_CLASS (klass); + + object_class->get_property = get_property; + object_class->set_property = set_property; + + operation_class->categories = "core"; + operation_class->no_cache = TRUE; + operation_class->process = process; + operation_class->attach = attach; + operation_class->detect = detect; + operation_class->get_defined_region = get_defined_region; + operation_class->compute_input_request = compute_input_request; + operation_class->compute_affected_region = compute_affected_region; + + gegl_operation_class_set_name (operation_class, "clone"); + + + g_object_class_install_property (object_class, PROP_OUTPUT, + g_param_spec_object ("output", + "Output", + "Ouput pad for generated image buffer.", + GEGL_TYPE_BUFFER, + G_PARAM_READABLE | + GEGL_PARAM_PAD_OUTPUT)); + + g_object_class_install_property (object_class, PROP_INPUT, + g_param_spec_object ("input", + "Input", + "Input pad, for image buffer input.", + GEGL_TYPE_BUFFER, + G_PARAM_READWRITE | + GEGL_PARAM_PAD_INPUT)); + + g_object_class_install_property (object_class, PROP_REF, + g_param_spec_string ("ref", + "Reference", + "The reference ID used as input (for use in XML).", + "", + G_PARAM_READWRITE | + GEGL_PARAM_PAD_INPUT)); +} + +static void +gegl_operation_clone_class_finalize (GeglOperationCloneClass *klass) +{ +} + +static void +gegl_operation_clone_init (GeglOperationClone *self) +{ + self->ref = NULL; +} + +static void +get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GeglOperationClone *self = GEGL_OPERATION_CLONE (object); + + switch (property_id) { - g_object_ref (input); - /* overrides the _set_object, that has occured earlier */ - gegl_node_context_set_object (context, "output", G_OBJECT (input)); - success = TRUE; - } - return success; + case PROP_REF: + g_value_set_string (value, self->ref); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GeglOperationClone *self = GEGL_OPERATION_CLONE (object); + + switch (property_id) + { + case PROP_REF: + if (self->ref) + g_free (self->ref); + self->ref = g_value_dup_string (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + + +static void +attach (GeglOperation *operation) +{ + GObjectClass *object_class = G_OBJECT_GET_CLASS (operation); + + gegl_operation_create_pad (operation, + g_object_class_find_property (object_class, + "output")); + gegl_operation_create_pad (operation, + g_object_class_find_property (object_class, + "input")); } + static GeglNode * detect (GeglOperation *operation, gint x, @@ -72,10 +224,77 @@ return NULL; } -static void class_init (GeglOperationClass *operation_class) + +static gboolean +process (GeglOperation *operation, + GeglNodeContext *context, + const gchar *output_prop, + const GeglRectangle *result) { - operation_class->detect = detect; - operation_class->no_cache = TRUE; + GeglBuffer *input; + + if (strcmp (output_prop, "output")) + { + g_warning ("requested processing of %s pad on a clone", output_prop); + return FALSE; + } + + input = gegl_node_context_get_source (context, "input"); + if (!input) + { + g_warning ("clone received NULL input"); + return FALSE; + } + gegl_node_context_set_object (context, "output", G_OBJECT (input)); + return TRUE; } -#endif +static GeglRectangle +get_defined_region (GeglOperation *operation) +{ + GeglRectangle result = { 0, 0, 0, 0 }; + GeglRectangle *in_rect; + + in_rect = gegl_operation_source_get_defined_region (operation, "input"); + if (in_rect) + { + result = *in_rect; + } + + return result; +} + +static GeglRectangle +compute_affected_region (GeglOperation *operation, + const gchar *input_pad, + const GeglRectangle *input_region) +{ + return *input_region; +} + +static GeglRectangle +compute_input_request (GeglOperation *operation, + const gchar *input_pad, + const GeglRectangle *roi) +{ + return *roi; +} + +static const GeglModuleInfo modinfo = +{ + GEGL_MODULE_ABI_VERSION, "clone", "", "" +}; + +G_MODULE_EXPORT const GeglModuleInfo * +gegl_module_query (GTypeModule *module) +{ + return &modinfo; +} + +G_MODULE_EXPORT gboolean +gegl_module_register (GTypeModule *module) +{ + gegl_operation_clone_register_type (module); + + return TRUE; +} Modified: trunk/operations/core/nop.c ============================================================================== --- trunk/operations/core/nop.c (original) +++ trunk/operations/core/nop.c Tue Jan 8 00:22:07 2008 @@ -37,20 +37,11 @@ struct _GeglOperationNop { GeglOperation parent_instance; - - gfloat x; - gfloat y; }; struct _GeglOperationNopClass { GeglOperationClass parent_class; - - gboolean (* process) (GeglOperation *self, - GeglNodeContext *context, - GeglBuffer *input, - GeglBuffer *output, - const GeglRectangle *result); }; GType gegl_operation_nop_get_type (void) G_GNUC_CONST; @@ -182,15 +173,12 @@ gint x, gint y) { - GeglOperationNop *self = GEGL_OPERATION_NOP (operation); GeglNode *input_node; input_node = gegl_operation_get_source_node (operation, "input"); if (input_node) - return gegl_operation_detect (input_node->operation, - x - floor (self->x), - y - floor (self->y)); + return gegl_operation_detect (input_node->operation, x, y); return operation->node; } @@ -202,11 +190,7 @@ const gchar *output_prop, const GeglRectangle *result) { - GeglOperationNop *nop = GEGL_OPERATION_NOP (operation); - GeglBuffer *input; - - nop->x = floor (nop->x); - nop->y = floor (nop->y); + GeglBuffer *input; if (strcmp (output_prop, "output")) { @@ -220,7 +204,7 @@ g_warning ("nop received NULL input"); return FALSE; } - g_object_ref (input); + gegl_node_context_set_object (context, "output", G_OBJECT (input)); return TRUE; } @@ -245,13 +229,7 @@ const gchar *input_pad, const GeglRectangle *input_region) { - GeglOperationNop *self = GEGL_OPERATION_NOP (operation); - GeglRectangle result = *input_region; - - result.x += floor (self->x); - result.y += floor (self->y); - - return result; + return *input_region; } static GeglRectangle Modified: trunk/operations/core/shift.c ============================================================================== --- trunk/operations/core/shift.c (original) +++ trunk/operations/core/shift.c Tue Jan 8 00:22:07 2008 @@ -45,12 +45,6 @@ struct _GeglOperationShiftClass { GeglOperationClass parent_class; - - gboolean (* process) (GeglOperation *self, - GeglNodeContext *context, - GeglBuffer *input, - GeglBuffer *output, - const GeglRectangle *result); }; GType gegl_operation_shift_get_type (void) G_GNUC_CONST; _______________________________________________ SVN-commits-list mailing list [email protected] http://mail.gnome.org/mailman/listinfo/svn-commits-list
