[gegl] Only store GeglBuffer objects
- From: Daniel Sabo <daniels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] Only store GeglBuffer objects
- Date: Wed, 5 Jun 2013 04:14:25 +0000 (UTC)
commit 4aad701780349262184db0e99fa56c07c17cab51
Author: Daniel Sabo <DanielSabo gmail com>
Date: Mon May 20 23:53:27 2013 -0700
Only store GeglBuffer objects
The only object type that will ever be attached to the context is
a GeglBuffer, and the pspec query functions are mildly expensive.
gegl/operation/gegl-operation-context.c | 102 ++++++++----------------------
1 files changed, 27 insertions(+), 75 deletions(-)
---
diff --git a/gegl/operation/gegl-operation-context.c b/gegl/operation/gegl-operation-context.c
index 77bdb21..bb2df99 100644
--- a/gegl/operation/gegl-operation-context.c
+++ b/gegl/operation/gegl-operation-context.c
@@ -34,8 +34,7 @@
static GValue *
gegl_operation_context_add_value (GeglOperationContext *self,
- const gchar *property_name,
- GType proptype);
+ const gchar *property_name);
void
@@ -71,26 +70,14 @@ gegl_operation_context_set_property (GeglOperationContext *context,
const gchar *property_name,
const GValue *value)
{
- GParamSpec *pspec;
GValue *storage;
g_return_if_fail (context != NULL);
-
- pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (context->operation),
- property_name);
-
- if (!pspec)
- {
- g_warning ("%s: node %s has no pad|property named '%s'",
- G_STRFUNC,
- GEGL_OPERATION_GET_CLASS (context->operation)->name,
- property_name);
- }
+ g_return_if_fail (G_VALUE_TYPE (value) == GEGL_TYPE_BUFFER);
/* if the value already exists in the context it will be reused */
- storage = gegl_operation_context_add_value (context, property_name,
- G_PARAM_SPEC_VALUE_TYPE (pspec));
- /* storage needs to have the correct type */
+ storage = gegl_operation_context_add_value (context, property_name);
+
g_value_copy (value, storage);
}
@@ -99,20 +86,8 @@ gegl_operation_context_get_property (GeglOperationContext *context,
const gchar *property_name,
GValue *value)
{
- GParamSpec *pspec;
GValue *storage;
- pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (context->operation),
- property_name);
-
- if (!pspec)
- {
- g_warning ("%s: node %s has no pad|property named '%s'",
- G_STRFUNC,
- GEGL_OPERATION_GET_CLASS (context->operation)->name,
- property_name);
- }
-
storage = gegl_operation_context_get_value (context, property_name);
if (storage != NULL)
{
@@ -194,8 +169,7 @@ gegl_operation_context_remove_property (GeglOperationContext *self,
static GValue *
gegl_operation_context_add_value (GeglOperationContext *self,
- const gchar *property_name,
- GType proptype)
+ const gchar *property_name)
{
Property *property = NULL;
GSList *found;
@@ -209,7 +183,6 @@ gegl_operation_context_add_value (GeglOperationContext *self,
if (property)
{
- /* XXX: check that the existing one was of the right type */
g_value_reset (&property->value);
return &property->value;
}
@@ -217,7 +190,7 @@ gegl_operation_context_add_value (GeglOperationContext *self,
property = property_new (property_name);
self->property = g_slist_prepend (self->property, property);
- g_value_init (&property->value, proptype);
+ g_value_init (&property->value, GEGL_TYPE_BUFFER);
return &property->value;
}
@@ -245,6 +218,8 @@ gegl_operation_context_set_object (GeglOperationContext *context,
const gchar *padname,
GObject *data)
{
+ g_return_if_fail (!data || GEGL_IS_BUFFER (data));
+
/* Make it simple, just add an extra ref and then take the object */
if (data)
g_object_ref (data);
@@ -256,57 +231,34 @@ gegl_operation_context_take_object (GeglOperationContext *context,
const gchar *padname,
GObject *data)
{
- GParamSpec *pspec;
-
- /* FIXME: check that there isn't already an existing
- * output object/value set?
- */
-
- pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (context->operation),
- padname);
+ GValue *storage;
- if (pspec)
- {
- GValue value = {0, };
- g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec));
-
- g_value_take_object (&value, data);
- gegl_operation_context_set_property (context, padname, &value);
+ g_return_if_fail (context != NULL);
+ g_return_if_fail (!data || GEGL_IS_BUFFER (data));
- g_value_unset (&value);
- }
- else
- {
- g_warning ("%s: No paramspec found for pad '%s' on \"%s\"\n",
- G_STRFUNC,
- padname,
- gegl_operation_get_name (context->operation));
- }
+ storage = gegl_operation_context_add_value (context, padname);
+ g_value_take_object (storage, data);
}
GObject *
gegl_operation_context_get_object (GeglOperationContext *context,
const gchar *padname)
{
- GObject *ret;
- GParamSpec *pspec;
- GValue value = { 0, };
-
- pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (context->operation),
- padname);
- g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec));
- gegl_operation_context_get_property (context, padname, &value);
- /* FIXME: handle other things than gobjects as well? */
- ret = g_value_get_object (&value);
-
- if (!ret)
- {/*
- g_warning ("some important data was not found on %s.%s",
- gegl_node_get_debug_name (node), property_name);
- */
+ GObject *ret;
+ GValue *value;
+
+ value = gegl_operation_context_get_value (context, padname);
+
+ if (value != NULL)
+ {
+ ret = g_value_get_object (value);
+ if (ret != NULL)
+ {
+ return ret;
+ }
}
- g_value_unset (&value);
- return ret;
+
+ return NULL;
}
GeglBuffer *
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]