[gegl] gegl: improve indentation of gegl-serialize
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] gegl: improve indentation of gegl-serialize
- Date: Tue, 4 Apr 2017 18:19:09 +0000 (UTC)
commit a4330ec342efa3300229f5ff1ac1abca74b09f6c
Author: Øyvind Kolås <pippin gimp org>
Date: Tue Apr 4 20:18:47 2017 +0200
gegl: improve indentation of gegl-serialize
gegl/gegl-serialize.c | 1286 ++++++++++++++++++++++++++-----------------------
1 files changed, 689 insertions(+), 597 deletions(-)
---
diff --git a/gegl/gegl-serialize.c b/gegl/gegl-serialize.c
index 6be9e1f..44d8646 100644
--- a/gegl/gegl-serialize.c
+++ b/gegl/gegl-serialize.c
@@ -20,19 +20,23 @@
#include <string.h>
#include <stdio.h>
-//#define make_rel(strv) (g_strtod (strv, NULL) * gegl_node_get_bounding_box (iter[0]).height)
+//#define make_rel(strv) (g_strtod (strv, NULL) * gegl_node_get_bounding_box
+// (iter[0]).height)
#define make_rel(strv) (g_strtod (strv, NULL) * rel_dim)
-static void remove_in_betweens (GeglNode *nop_raw,
- GeglNode *nop_transformed)
+static void
+remove_in_betweens (GeglNode *nop_raw,
+ GeglNode *nop_transformed)
{
GeglNode *iter = nop_raw;
GList *collect = NULL;
+
while (iter && iter != nop_transformed)
{
GeglNode **nodes = NULL;
int count = gegl_node_get_consumers (iter, "output", &nodes, NULL);
- if (count) iter = nodes[0];
+ if (count)
+ iter = nodes[0];
g_free (nodes);
if (iter && iter != nop_transformed)
collect = g_list_append (collect, iter);
@@ -44,16 +48,22 @@ static void remove_in_betweens (GeglNode *nop_raw,
}
}
-void gegl_create_chain_argv (char **ops, GeglNode *start, GeglNode *proxy, double time, int rel_dim, GError
**error)
+void
+gegl_create_chain_argv (char **ops,
+ GeglNode *start,
+ GeglNode *proxy,
+ double time,
+ int rel_dim,
+ GError **error)
{
GeglNode *iter[10] = {start, NULL};
GeglNode *new = NULL;
gchar **arg = ops;
- int level = 0;
+ int level = 0;
char *level_op[10];
char *level_pad[10];
- int in_keyframes = 0;
- int in_strkeyframes = 0;
+ int in_keyframes = 0;
+ int in_strkeyframes = 0;
char *prop = NULL;
GHashTable *ht = NULL;
GeglPath *path = NULL;
@@ -62,674 +72,750 @@ void gegl_create_chain_argv (char **ops, GeglNode *start, GeglNode *proxy, doubl
remove_in_betweens (start, proxy);
level_op[level] = *arg;
-
+
ht = g_hash_table_new (g_str_hash, g_str_equal);
while (*arg)
{
if (in_keyframes)
- {
- char *key = g_strdup (*arg);
- char *eq = strchr (key, '=');
- char *value = NULL;
-
- if (eq)
- {
- value = eq + 1;
- value[-1] = '\0';
- if (strstr (value, "rel"))
- {
- gegl_path_append (path, 'L', g_strtod (key, NULL), make_rel (value));
- }
- else
- {
- gegl_path_append (path, 'L', g_strtod (key, NULL), g_strtod (value, NULL));
- }
- }
- else
- {
- fprintf (stderr, "unhandled path data\n");
- }
-
- g_free (key);
-
- if (strchr (*arg, '}')) {
- gdouble y= 0;
- gegl_path_calc_y_for_x (g_object_get_qdata (G_OBJECT (new),
- g_quark_from_string(prop)), time, &y);
- gegl_node_set (new, prop, y, NULL);
-
- in_keyframes = 0;
- };
- }
- else if (in_strkeyframes)
- {
- char *key = g_strdup (*arg);
- char *eq = strchr (key, '=');
- char *value = NULL;
-
- if (eq)
{
- value = eq + 1;
- value[-1] = '\0';
- if (g_strtod (key, NULL) <= time)
- g_string_assign (string, value);
- }
-
- g_free (key);
-
- if (strchr (*arg, '}')) {
- gegl_node_set (new, prop, string->str, NULL);
- in_strkeyframes = 0;
- };
- }
- else if (!strchr(*arg, '=') && strchr (*arg, ']'))
- {
- level--;
- gegl_node_connect_to (iter[level+1], "output", iter[level], level_pad[level]);
- }
- else
- {
- if (strchr (*arg, '=')) /* contains = sign, must be a property assignment */
- {
- char *match= strchr (*arg, '=');
- {
- GType target_type = 0;
- GValue gvalue={0,};
char *key = g_strdup (*arg);
- char *value = strchr (key, '=') + 1;
- int end_block = 0;
- value[-1] = '\0';
- if (strchr (value, ']') &&
- strrchr (value, ']')[1] == '\0')
- {
- end_block = 1;
- * strchr (value, ']') = 0;
- }
+ char *eq = strchr (key, '=');
+ char *value = NULL;
- if (!strcmp (key, "id"))
- {
- g_hash_table_insert (ht, (void*)g_intern_string (value), iter[level]);
- g_object_set_data (G_OBJECT(iter[level]),
- "refname", (void*)g_intern_string (value));
- }
- else if (!strcmp (key, "ref"))
- {
- if (g_hash_table_lookup (ht, g_intern_string (value)))
- iter[level] = g_hash_table_lookup (ht, g_intern_string (value));
- else
- g_warning ("unknown id '%s'", value);
- }
- else if (!strcmp (key, "opi"))
- {
- /* should check for incompatibility rather than difference */
- if (!g_str_equal (value, gegl_operation_get_op_version (level_op[level])))
- {
- /* for now - just reporting it */
- g_print ("operation property interface version mismatch for %s\n"
- "parsed %s but GEGL library has %s\n",
- level_op[level], value, gegl_operation_get_op_version (level_op[level]));
- }
- }
- else
- {
- unsigned int n_props = 0;
- int i;
- if (level_op[level])
+ if (eq)
{
- GParamSpec **pspecs;
- pspecs = gegl_operation_list_properties (level_op[level], &n_props);
- for (i = 0; i < n_props; i++)
- {
- if (!strcmp (pspecs[i]->name, key))
+ value = eq + 1;
+ value[-1] = '\0';
+ if (strstr (value, "rel"))
{
- target_type = pspecs[i]->value_type;
- break;
+ gegl_path_append (path, 'L', g_strtod (key, NULL),
+ make_rel (value));
+ }
+ else
+ {
+ gegl_path_append (path, 'L', g_strtod (key, NULL),
+ g_strtod (value, NULL));
}
- }
}
-
- if (match[1] == '{')
- {
- char *key = g_strdup (*arg);
- char *value = strchr (key, '=') + 1;
- value[-1] = '\0';
-
- if (g_type_is_a (target_type, G_TYPE_STRING))
- {
- string = g_string_new ("");
- in_strkeyframes = 1;
- if (prop)
- g_free (prop);
- prop = g_strdup (key);
- }
else
- {
- path = gegl_path_new ();
- in_keyframes = 1;
- if (prop)
- g_free (prop);
- prop = g_strdup (key);
-
- g_object_set_qdata_full (G_OBJECT (new), g_quark_from_string(key), path, g_object_unref);
- }
+ {
+ fprintf (stderr, "unhandled path data\n");
+ }
g_free (key);
- }
- else if (match[1] == '[')
- {
- char *pad = g_strdup (*arg);
- char *value = strchr (pad, '=') + 1;
- value[-1] = '\0';
- level_pad[level]=(void*)g_intern_string(pad);
- g_free (pad);
- level++;
- iter[level]=NULL;
- level_op[level]=NULL;
- level_pad[level]=NULL;
-
- if (strlen (&match[2]))
- {
- if (strchr (&match[2], ':')) /* contains : is a non-prefixed operation */
- {
- level_op[level] = (void*)g_intern_string(&match[2]);
- }
- else /* default to gegl: as prefix if no : specified */
- {
- char temp[1024];
- g_snprintf (temp, 1023, "gegl:%s", &match[2]);
- level_op[level] = (void*)g_intern_string (temp);
- }
- if (gegl_has_operation (level_op[level]))
- {
- new = gegl_node_new_child (gegl_node_get_parent (proxy), "operation",
- level_op[level], NULL);
-
- if (iter[level])
- gegl_node_link_many (iter[level], new, proxy, NULL);
- else
- gegl_node_link_many (new, proxy, NULL);
- iter[level] = new;
- }
- else if (error)
- {
- GString *str = g_string_new ("");
- g_string_append_printf (str, "op '%s' not found, partial matches: ", level_op[level]);
+ if (strchr (*arg, '}'))
+ {
+ gdouble y = 0;
+ gegl_path_calc_y_for_x (g_object_get_qdata (G_OBJECT (new),
+ g_quark_from_string(
+ prop)), time, &y);
+ gegl_node_set (new, prop, y, NULL);
- *error = g_error_new_literal (g_quark_from_static_string ("gegl"),
- 0, str->str);
- g_string_free (str, TRUE);
- }
+ in_keyframes = 0;
+ }
+ ;
+ }
+ else if (in_strkeyframes)
+ {
+ char *key = g_strdup (*arg);
+ char *eq = strchr (key, '=');
+ char *value = NULL;
+ if (eq)
+ {
+ value = eq + 1;
+ value[-1] = '\0';
+ if (g_strtod (key, NULL) <= time)
+ g_string_assign (string, value);
+ }
- }
- /* XXX: ... */
+ g_free (key);
+ if (strchr (*arg, '}'))
+ {
+ gegl_node_set (new, prop, string->str, NULL);
+ in_strkeyframes = 0;
+ }
+ ;
+ }
+ else if (!strchr(*arg, '=') && strchr (*arg, ']'))
+ {
+ level--;
+ gegl_node_connect_to (iter[level+1], "output", iter[level],
+ level_pad[level]);
}
- else
- if (target_type == 0)
+ else
+ {
+ if (strchr (*arg, '=')) /* contains = sign, must be a property
+ assignment */
{
- if (error && level_op[level] && gegl_has_operation (level_op[level]))
+ char *match = strchr (*arg, '=');
{
- unsigned int n_props = 0;
- int i;
- GParamSpec **pspecs;
-
- GString *str = g_string_new ("");
- pspecs = gegl_operation_list_properties (level_op[level], &n_props);
-
- if (n_props <= 0)
- {
- g_string_append_printf (str, "%s has no %s property.",
- level_op[level], key);
- }
- else
- {
- g_string_append_printf (str, "%s has no %s property, properties: ",
- level_op[level], key);
-
- for (i = 0; i < n_props; i++)
+ GType target_type = 0;
+ GValue gvalue = {0,};
+ char *key = g_strdup (*arg);
+ char *value = strchr (key, '=') + 1;
+ int end_block = 0;
+ value[-1] = '\0';
+ if (strchr (value, ']') &&
+ strrchr (value, ']')[1] == '\0')
{
- g_string_append_printf (str, "'%s', ", pspecs[i]->name);
+ end_block = 1;
+ *strchr (value, ']') = 0;
}
- }
- *error = g_error_new_literal (g_quark_from_static_string ("gegl"),
- 0, str->str);
- g_string_free (str, TRUE);
- }
- }
- else
- if (g_type_is_a (target_type, G_TYPE_DOUBLE) ||
- g_type_is_a (target_type, G_TYPE_FLOAT) ||
- g_type_is_a (target_type, G_TYPE_INT))
- {
- if (strstr (value, "rel"))
- {
- g_object_set_qdata_full (G_OBJECT (new), g_quark_from_string(key), g_strdup (value),
g_free);
-
- if (g_type_is_a (target_type, G_TYPE_INT))
- gegl_node_set (iter[level], key, (int)make_rel (value), NULL);
- else
- gegl_node_set (iter[level], key, make_rel (value), NULL);
-
- }
+ if (!strcmp (key, "id"))
+ {
+ g_hash_table_insert (ht, (void*)g_intern_string (
+ value), iter[level]);
+ g_object_set_data (G_OBJECT(iter[level]),
+ "refname",
+ (void*)g_intern_string (value));
+ }
+ else if (!strcmp (key, "ref"))
+ {
+ if (g_hash_table_lookup (ht, g_intern_string (value)))
+ iter[level] =
+ g_hash_table_lookup (ht, g_intern_string (value));
+ else
+ g_warning ("unknown id '%s'", value);
+ }
+ else if (!strcmp (key, "opi"))
+ {
+ /* should check for incompatibility rather than difference
+ */
+ if (!g_str_equal (value,
+ gegl_operation_get_op_version (level_op[
+ level])))
+ {
+ /* for now - just reporting it */
+ g_print ("operation property interface version mismatch for %s\n"
+ "parsed %s but GEGL library has %s\n",
+ level_op[level], value, gegl_operation_get_op_version (
+ level_op[level]));
+ }
+ }
else
- {
- if (g_type_is_a (target_type, G_TYPE_INT))
- gegl_node_set (iter[level], key,
- (int)g_strtod (value, NULL), NULL);
- else
- gegl_node_set (iter[level], key,
- g_strtod (value, NULL), NULL);
- }
- }
- else if (g_type_is_a (target_type, G_TYPE_BOOLEAN))
- {
- if (!strcmp (value, "true") || !strcmp (value, "TRUE") ||
- !strcmp (value, "YES") || !strcmp (value, "yes") ||
- !strcmp (value, "y") || !strcmp (value, "Y") ||
- !strcmp (value, "1") || !strcmp (value, "on"))
- {
- gegl_node_set (iter[level], key, TRUE, NULL);
- }
- else
- {
- gegl_node_set (iter[level], key, FALSE, NULL);
+ {
+ unsigned int n_props = 0;
+ int i;
+ if (level_op[level])
+ {
+ GParamSpec **pspecs;
+ pspecs = gegl_operation_list_properties (
+ level_op[level], &n_props);
+ for (i = 0; i < n_props; i++)
+ {
+ if (!strcmp (pspecs[i]->name, key))
+ {
+ target_type = pspecs[i]->value_type;
+ break;
+ }
+ }
+ }
+
+ if (match[1] == '{')
+ {
+ char *key = g_strdup (*arg);
+ char *value = strchr (key, '=') + 1;
+ value[-1] = '\0';
+
+ if (g_type_is_a (target_type, G_TYPE_STRING))
+ {
+ string = g_string_new ("");
+ in_strkeyframes = 1;
+ if (prop)
+ g_free (prop);
+ prop = g_strdup (key);
+ }
+ else
+ {
+ path = gegl_path_new ();
+ in_keyframes = 1;
+ if (prop)
+ g_free (prop);
+ prop = g_strdup (key);
+
+ g_object_set_qdata_full (G_OBJECT (
+ new), g_quark_from_string(
+ key), path,
+ g_object_unref);
+ }
+
+ g_free (key);
+ }
+ else if (match[1] == '[')
+ {
+ char *pad = g_strdup (*arg);
+ char *value = strchr (pad, '=') + 1;
+ value[-1] = '\0';
+ level_pad[level] = (void*)g_intern_string(pad);
+ g_free (pad);
+ level++;
+ iter[level] = NULL;
+ level_op[level] = NULL;
+ level_pad[level] = NULL;
+
+ if (strlen (&match[2]))
+ {
+ if (strchr (&match[2], ':')) /* contains : is a
+ non-prefixed
+ operation */
+ {
+ level_op[level] =
+ (void*)g_intern_string(&match[2]);
+ }
+ else /* default to gegl: as prefix if no : specified
+ */
+ {
+ char temp[1024];
+ g_snprintf (temp, 1023, "gegl:%s", &match[2]);
+ level_op[level] = (void*)g_intern_string (temp);
+ }
+
+ if (gegl_has_operation (level_op[level]))
+ {
+ new = gegl_node_new_child (gegl_node_get_parent (
+ proxy), "operation",
+ level_op[level],
+ NULL);
+
+ if (iter[level])
+ gegl_node_link_many (iter[level], new, proxy,
+ NULL);
+ else
+ gegl_node_link_many (new, proxy, NULL);
+ iter[level] = new;
+ }
+ else if (error)
+ {
+ GString *str = g_string_new ("");
+ g_string_append_printf (str,
+ "op '%s' not found, partial matches: ",
+ level_op[level]);
+
+ *error = g_error_new_literal (g_quark_from_static_string (
+ "gegl"),
+ 0, str->str);
+ g_string_free (str, TRUE);
+ }
+ }
+ /* XXX: ... */
+ }
+ else
+ if (target_type == 0)
+ {
+ if (error && level_op[level] &&
+ gegl_has_operation (level_op[level]))
+ {
+ unsigned int n_props = 0;
+ int i;
+ GParamSpec **pspecs;
+
+ GString *str = g_string_new ("");
+ pspecs =
+ gegl_operation_list_properties (level_op[level],
+ &n_props);
+
+ if (n_props <= 0)
+ {
+ g_string_append_printf (str,
+ "%s has no %s property.",
+ level_op[level], key);
+ }
+ else
+ {
+ g_string_append_printf (str,
+ "%s has no %s property, properties: ",
+ level_op[level], key);
+
+ for (i = 0; i < n_props; i++)
+ {
+ g_string_append_printf (str, "'%s', ",
+ pspecs[i]->name);
+ }
+ }
+
+ *error = g_error_new_literal (g_quark_from_static_string (
+ "gegl"),
+ 0, str->str);
+ g_string_free (str, TRUE);
+ }
+ }
+ else
+ if (g_type_is_a (target_type, G_TYPE_DOUBLE) ||
+ g_type_is_a (target_type, G_TYPE_FLOAT) ||
+ g_type_is_a (target_type, G_TYPE_INT))
+ {
+ if (strstr (value, "rel"))
+ {
+ g_object_set_qdata_full (G_OBJECT (
+ new),
+ g_quark_from_string(
+ key), g_strdup (
+ value), g_free);
+
+ if (g_type_is_a (target_type, G_TYPE_INT))
+ gegl_node_set (iter[level], key,
+ (int)make_rel (value), NULL);
+ else
+ gegl_node_set (iter[level], key, make_rel (
+ value), NULL);
+ }
+ else
+ {
+ if (g_type_is_a (target_type, G_TYPE_INT))
+ gegl_node_set (iter[level], key,
+ (int)g_strtod (value, NULL), NULL);
+
+
+
+
+ else
+ gegl_node_set (iter[level], key,
+ g_strtod (value, NULL), NULL);
+ }
+ }
+ else if (g_type_is_a (target_type, G_TYPE_BOOLEAN))
+ {
+ if (!strcmp (value,
+ "true") || !strcmp (value, "TRUE") ||
+ !strcmp (value, "YES") || !strcmp (value, "yes") ||
+ !strcmp (value, "y") || !strcmp (value, "Y") ||
+ !strcmp (value, "1") || !strcmp (value, "on"))
+ {
+ gegl_node_set (iter[level], key, TRUE, NULL);
+ }
+ else
+ {
+ gegl_node_set (iter[level], key, FALSE, NULL);
+ }
+ }
+ else if (target_type == GEGL_TYPE_COLOR)
+ {
+ GeglColor *color = g_object_new (GEGL_TYPE_COLOR,
+ "string", value, NULL);
+ gegl_node_set (iter[level], key, color, NULL);
+ }
+ else if (g_type_is_a (target_type, G_TYPE_STRING))
+ {
+ gegl_node_set (iter[level], key, value, NULL);
+ }
+ else if (g_type_is_a (target_type, G_TYPE_ENUM))
+ {
+ GEnumClass *eclass = g_type_class_peek (target_type);
+ GEnumValue *evalue = g_enum_get_value_by_nick (eclass,
+ value);
+ if (evalue)
+ {
+ gegl_node_set (new, key, evalue->value, NULL);
+ }
+ else
+ {
+ /* warn, but try to get a valid nick out of the
+ old-style value
+ * name
+ */
+ gchar *nick;
+ gchar *c;
+ g_printerr (
+ "gedl (param_set %s): enum %s has no value '%s'\n",
+ key,
+ g_type_name (target_type),
+ value);
+ nick = g_strdup (value);
+ for (c = nick; *c; c++)
+ {
+ *c = g_ascii_tolower (*c);
+ if (*c == ' ')
+ *c = '-';
+ }
+ evalue = g_enum_get_value_by_nick (eclass, nick);
+ if (evalue)
+ gegl_node_set (iter[level], key, evalue->value,
+ NULL);
+ g_free (nick);
+ }
+ }
+ else
+ {
+ GValue gvalue_transformed = {0,};
+ g_value_init (&gvalue, G_TYPE_STRING);
+ g_value_set_string (&gvalue, value);
+ g_value_init (&gvalue_transformed, target_type);
+ g_value_transform (&gvalue, &gvalue_transformed);
+ gegl_node_set_property (iter[level], key,
+ &gvalue_transformed);
+ g_value_unset (&gvalue);
+ g_value_unset (&gvalue_transformed);
+ }
+ }
+ g_free (key);
+ if (end_block)
+ {
+ level--;
+ gegl_node_connect_to (iter[level+1], "output", iter[level],
+ level_pad[level]);
+ }
}
}
- else if (target_type == GEGL_TYPE_COLOR)
- {
- GeglColor *color = g_object_new (GEGL_TYPE_COLOR,
- "string", value, NULL);
- gegl_node_set (iter[level], key, color, NULL);
- }
- else if (g_type_is_a (target_type, G_TYPE_STRING))
- {
- gegl_node_set (iter[level], key, value, NULL);
- }
- else if (g_type_is_a (target_type, G_TYPE_ENUM))
+ else
{
- GEnumClass *eclass = g_type_class_peek (target_type);
- GEnumValue *evalue = g_enum_get_value_by_nick (eclass, value);
- if (evalue)
+ if (strchr (*arg, ':')) /* contains : is a non-prefixed operation
+ */
{
- gegl_node_set (new, key, evalue->value, NULL);
+ level_op[level] = *arg;
}
- else
+ else /* default to gegl: as prefix if no : specified */
{
- /* warn, but try to get a valid nick out of the old-style value
- * name
- */
- gchar *nick;
- gchar *c;
- g_printerr ("gedl (param_set %s): enum %s has no value '%s'\n",
- key,
- g_type_name (target_type),
- value);
- nick = g_strdup (value);
- for (c = nick; *c; c++)
- {
- *c = g_ascii_tolower (*c);
- if (*c == ' ')
- *c = '-';
- }
- evalue = g_enum_get_value_by_nick (eclass, nick);
- if (evalue)
- gegl_node_set (iter[level], key, evalue->value, NULL);
- g_free (nick);
- }
- }
- else
- {
- GValue gvalue_transformed={0,};
- g_value_init (&gvalue, G_TYPE_STRING);
- g_value_set_string (&gvalue, value);
- g_value_init (&gvalue_transformed, target_type);
- g_value_transform (&gvalue, &gvalue_transformed);
- gegl_node_set_property (iter[level], key, &gvalue_transformed);
- g_value_unset (&gvalue);
- g_value_unset (&gvalue_transformed);
- }
- }
- g_free (key);
- if (end_block)
- {
- level--;
- gegl_node_connect_to (iter[level+1], "output", iter[level], level_pad[level]);
- }
- }
- }
- else
- {
- if (strchr (*arg, ':')) /* contains : is a non-prefixed operation */
- {
- level_op[level] = *arg;
- }
- else /* default to gegl: as prefix if no : specified */
- {
- char temp[1024];
- g_snprintf (temp, 1023, "gegl:%s", *arg);
- level_op[level] = (void*)g_intern_string (temp);
- }
-
-
- if (gegl_has_operation (level_op[level]))
- {
- new = gegl_node_new_child (gegl_node_get_parent (proxy), "operation",
- level_op[level], NULL);
-
- if (iter[level])
- gegl_node_link_many (iter[level], new, proxy, NULL);
- else
- gegl_node_link_many (new, proxy, NULL);
- iter[level] = new;
- }
- else if (error)
- {
- GString *str = g_string_new ("");
- guint n_operations;
- gchar **operations = gegl_list_operations (&n_operations);
- gint i;
- gint started = 0;
- gint max = 12;
+ char temp[1024];
+ g_snprintf (temp, 1023, "gegl:%s", *arg);
+ level_op[level] = (void*)g_intern_string (temp);
+ }
- g_string_append_printf (str, "No such op '%s'", level_op[level]);
- for (i = 0; i < n_operations; i++)
- {
- if (g_str_has_prefix (operations[i], level_op[level]))
- {
- if (!started)
+ if (gegl_has_operation (level_op[level]))
{
- started = 1;
- g_string_append_printf (str," suggestions:");
+ new = gegl_node_new_child (gegl_node_get_parent (
+ proxy), "operation",
+ level_op[level], NULL);
+
+ if (iter[level])
+ gegl_node_link_many (iter[level], new, proxy, NULL);
+ else
+ gegl_node_link_many (new, proxy, NULL);
+ iter[level] = new;
}
- if (max -- > 0)
- g_string_append_printf (str, " %s", operations[i]);
- }
- }
- if (!started)
- for (i = 0; i < n_operations; i++)
- {
- if (strstr (operations[i], *arg))
- {
- if (!started)
+ else if (error)
{
- started = 1;
- g_string_append_printf (str," suggestions:");
+ GString *str = g_string_new ("");
+ guint n_operations;
+ gchar **operations = gegl_list_operations (&n_operations);
+ gint i;
+ gint started = 0;
+ gint max = 12;
+
+ g_string_append_printf (str, "No such op '%s'",
+ level_op[level]);
+
+ for (i = 0; i < n_operations; i++)
+ {
+ if (g_str_has_prefix (operations[i], level_op[level]))
+ {
+ if (!started)
+ {
+ started = 1;
+ g_string_append_printf (str," suggestions:");
+ }
+ if (max-- > 0)
+ g_string_append_printf (str, " %s", operations[i]);
+ }
+ }
+ if (!started)
+ for (i = 0; i < n_operations; i++)
+ {
+ if (strstr (operations[i], *arg))
+ {
+ if (!started)
+ {
+ started = 1;
+ g_string_append_printf (str," suggestions:");
+ }
+ if (max-- > 0)
+ g_string_append_printf (str, " %s",
+ operations[i]);
+ }
+ }
+
+ g_free (operations);
+ *error =
+ g_error_new_literal (g_quark_from_static_string ("gegl"),
+ 0, str->str);
+ g_string_free (str, TRUE);
}
- if (max -- > 0)
- g_string_append_printf (str, " %s", operations[i]);
- }
}
-
- g_free (operations);
- *error = g_error_new_literal (g_quark_from_static_string ("gegl"),
- 0, str->str);
- g_string_free (str, TRUE);
- }
-
- }
- }
+ }
arg++;
}
while (level > 0)
- {
- level--;
- gegl_node_connect_to (iter[level+1], "output", iter[level], level_pad[level]);
- }
+ {
+ level--;
+ gegl_node_connect_to (iter[level+1], "output", iter[level],
+ level_pad[level]);
+ }
if (prop)
- {
- g_free (prop);
- }
+ {
+ g_free (prop);
+ }
g_hash_table_unref (ht);
gegl_node_link_many (iter[level], proxy, NULL);
}
-void gegl_create_chain (const char *str, GeglNode *op_start, GeglNode *op_end, double time, int rel_dim,
GError **error)
+void
+gegl_create_chain (const char *str, GeglNode *op_start, GeglNode *op_end,
+ double time, int rel_dim, GError **error)
{
gchar **argv = NULL;
- gint argc = 0;
+ gint argc = 0;
+
g_shell_parse_argv (str, &argc, &argv, NULL);
if (argv)
- {
- gegl_create_chain_argv (argv, op_start, op_end, time, rel_dim, error);
- g_strfreev (argv);
- }
+ {
+ gegl_create_chain_argv (argv, op_start, op_end, time, rel_dim, error);
+ g_strfreev (argv);
+ }
}
-static gchar *gegl_serialize2 (GeglNode *start, GeglNode *end, const char *basepath, GHashTable *ht,
GeglSerializeFlag flags)
+static gchar *
+gegl_serialize2 (GeglNode *start, GeglNode *end, const char *basepath,
+ GHashTable *ht, GeglSerializeFlag flags)
{
char *ret = NULL;
gboolean trim_defaults = flags & GEGL_SERIALIZE_TRIM_DEFAULTS;
GeglNode *iter;
GString *str = g_string_new ("");
+
if (start == NULL && 0)
- {
- start = end;
- while (gegl_node_get_producer (start, "input", NULL))
- start = gegl_node_get_producer (start, "input", NULL);
- }
+ {
+ start = end;
+ while (gegl_node_get_producer (start, "input", NULL))
+ start = gegl_node_get_producer (start, "input", NULL);
+ }
iter = end;
while (iter)
- {
- GeglNode **nodes = NULL;
- int count = gegl_node_get_consumers (iter, "output", &nodes, NULL);
- if (count>1)
- {
- int val;
- int last = 0;
- int cnt = 0;
-
- if ((val = GPOINTER_TO_INT (g_hash_table_lookup (ht, iter))))
- {
- cnt = val - 1;
- g_hash_table_insert (ht, iter, GINT_TO_POINTER (cnt));
- if (cnt == 1)
- last=1;
- }
- else
- {
- g_hash_table_insert (ht, iter, GINT_TO_POINTER (count));
- cnt = count;
- }
-
- {
- gchar *str3;
-
- gchar *refname = g_object_get_data (G_OBJECT (iter), "refname");
-
- if (refname)
- str3 = g_strdup_printf (" %s=%s", last?"id":"ref", refname);
- else
- str3 = g_strdup_printf (" %s=%p", last?"id":"ref", iter);
- g_string_prepend (str, str3);
- g_free (str3);
- }
- /* if this is not the last reference to it,. keep recursing
- */
- if (!last)
- iter = NULL;
- }
- g_free (nodes);
-
- if (iter == start || !iter)
- {
- iter = NULL;
- }
- else
{
- GString *s2 = g_string_new ("");
- const char *op_name = gegl_node_get_operation (iter);
- if (!(flags & GEGL_SERIALIZE_INDENT))
- g_string_append_printf (s2, " ");
- g_string_append_printf (s2, "%s", op_name);
- if (flags & GEGL_SERIALIZE_VERSION)
- g_string_append_printf (s2, " opi=%s", gegl_operation_get_op_version (op_name));
- if (flags & GEGL_SERIALIZE_INDENT)
- g_string_append_printf (s2, "\n");
- {
- gint i;
- guint n_properties;
- GParamSpec **properties;
-
- properties = gegl_operation_list_properties (gegl_node_get_operation (iter), &n_properties);
- for (i = 0; i < n_properties; i++)
+ GeglNode **nodes = NULL;
+ int count = gegl_node_get_consumers (iter, "output", &nodes, NULL);
+ if (count>1)
{
- const gchar *property_name = g_param_spec_get_name (properties[i]);
- GType property_type = G_PARAM_SPEC_VALUE_TYPE (properties[i]);
- const GValue*default_value = g_param_spec_get_default_value (properties[i]);
- gboolean printed = FALSE;
+ int val;
+ int last = 0;
+ int cnt = 0;
-
- if (property_type == G_TYPE_FLOAT)
+ if ((val = GPOINTER_TO_INT (g_hash_table_lookup (ht, iter))))
{
- gfloat defval = g_value_get_float (default_value);
- gfloat value;
- gchar str[G_ASCII_DTOSTR_BUF_SIZE];
- gegl_node_get (iter, properties[i]->name, &value, NULL);
- if (value != defval || (!trim_defaults))
- {
- g_ascii_dtostr (str, sizeof(str), value);
- if (flags & GEGL_SERIALIZE_INDENT)
- g_string_append_printf (s2, " ");
- g_string_append_printf (s2, " %s=%s", property_name, str);
- printed = TRUE;
- }
- }
- else if (property_type == G_TYPE_DOUBLE)
- {
- gdouble defval = g_value_get_double (default_value);
- gdouble value;
- gchar str[G_ASCII_DTOSTR_BUF_SIZE];
- gegl_node_get (iter, property_name, &value, NULL);
- if (value != defval || (!trim_defaults))
- {
- if (flags & GEGL_SERIALIZE_INDENT)
- g_string_append_printf (s2, " ");
- g_ascii_dtostr (str, sizeof(str), value);
- g_string_append_printf (s2, " %s=%s", property_name, str);
- printed = TRUE;
- }
- }
- else if (property_type == G_TYPE_INT)
- {
- gint defval = g_value_get_int (default_value);
- gint value;
- gchar str[64];
- gegl_node_get (iter, properties[i]->name, &value, NULL);
- if (value != defval || (!trim_defaults))
- {
- if (flags & GEGL_SERIALIZE_INDENT)
- g_string_append_printf (s2, " ");
- g_snprintf (str, sizeof (str), "%i", value);
- g_string_append_printf (s2, " %s=%s", property_name, str);
- printed = TRUE;
- }
- }
- else if (property_type == G_TYPE_BOOLEAN)
- {
- gboolean value;
- gboolean defval = g_value_get_boolean (default_value);
- gegl_node_get (iter, properties[i]->name, &value, NULL);
- if (value != defval || (!trim_defaults))
- {
- if (flags & GEGL_SERIALIZE_INDENT)
- g_string_append_printf (s2, " ");
- if (value)
- g_string_append_printf (s2, " %s=true", property_name);
- else
- g_string_append_printf (s2, " %s=false", property_name);
- printed = TRUE;
- }
- }
- else if (property_type == G_TYPE_STRING)
- {
- gchar *value;
- const gchar *defval = g_value_get_string (default_value);
- gegl_node_get (iter, properties[i]->name, &value, NULL);
- if (!g_str_equal (defval, value) || (!trim_defaults))
- {
- if (flags & GEGL_SERIALIZE_INDENT)
- g_string_append_printf (s2, " ");
- g_string_append_printf (s2, " %s='%s'", property_name, value);
- printed = TRUE;
- }
- g_free (value);
- }
- else if (g_type_is_a (property_type, G_TYPE_ENUM))
- {
- GEnumClass *eclass = g_type_class_peek (property_type);
- gint defval = g_value_get_enum (default_value);
- gint value;
-
- gegl_node_get (iter, properties[i]->name, &value, NULL);
- if (value != defval || (!trim_defaults))
- {
- GEnumValue *evalue = g_enum_get_value (eclass, value);
- if (flags & GEGL_SERIALIZE_INDENT)
- g_string_append_printf (s2, " ");
- g_string_append_printf (s2, " %s=%s", property_name, evalue->value_nick);
- printed = TRUE;
- }
- }
- else if (property_type == GEGL_TYPE_COLOR)
- {
- GeglColor *color;
- GeglColor *defcolor = g_value_get_object (default_value);
- gchar *value;
- gchar *defvalue = NULL;
- gegl_node_get (iter, properties[i]->name, &color, NULL);
- g_object_get (color, "string", &value, NULL);
- if (defcolor)
- {
- g_object_get (defcolor, "string", &defvalue, NULL);
- }
- g_object_unref (color);
- if ((defvalue && !g_str_equal (defvalue, value)) || (!trim_defaults))
- {
- if (flags & GEGL_SERIALIZE_INDENT)
- g_string_append_printf (s2, " ");
- g_string_append_printf (s2, " %s='%s'", property_name, value);
- printed = TRUE;
- }
- g_free (value);
+ cnt = val - 1;
+ g_hash_table_insert (ht, iter, GINT_TO_POINTER (cnt));
+ if (cnt == 1)
+ last = 1;
}
else
{
- g_warning ("%s: serialization of %s properties not implemented",
- property_name, g_type_name (property_type));
+ g_hash_table_insert (ht, iter, GINT_TO_POINTER (count));
+ cnt = count;
}
- if (printed && (flags & GEGL_SERIALIZE_INDENT))
- g_string_append_printf (s2, "\n");
-
{
- GeglNode *aux = gegl_node_get_producer (iter, "aux", NULL);
- if (aux)
- {
- char *str = gegl_serialize2 (NULL, aux, basepath, ht, flags);
- g_string_append_printf (s2, " aux=[%s ]", str);
- g_free (str);
- }
+ gchar *str3;
+
+ gchar *refname = g_object_get_data (G_OBJECT (iter), "refname");
+
+ if (refname)
+ str3 = g_strdup_printf (" %s=%s", last ? "id" : "ref", refname);
+ else
+ str3 = g_strdup_printf (" %s=%p", last ? "id" : "ref", iter);
+ g_string_prepend (str, str3);
+ g_free (str3);
}
+ /* if this is not the last reference to it,. keep recursing
+ */
+ if (!last)
+ iter = NULL;
+ }
+ g_free (nodes);
+ if (iter == start || !iter)
+ {
+ iter = NULL;
}
- }
+ else
+ {
+ GString *s2 = g_string_new ("");
+ const char *op_name = gegl_node_get_operation (iter);
+ if (!(flags & GEGL_SERIALIZE_INDENT))
+ g_string_append_printf (s2, " ");
+ g_string_append_printf (s2, "%s", op_name);
+ if (flags & GEGL_SERIALIZE_VERSION)
+ g_string_append_printf (s2, " opi=%s", gegl_operation_get_op_version (
+ op_name));
+ if (flags & GEGL_SERIALIZE_INDENT)
+ g_string_append_printf (s2, "\n");
+ {
+ gint i;
+ guint n_properties;
+ GParamSpec **properties;
+
+ properties = gegl_operation_list_properties (gegl_node_get_operation (
+ iter),
+ &n_properties);
+ for (i = 0; i < n_properties; i++)
+ {
+ const gchar *property_name = g_param_spec_get_name (
+ properties[i]);
+ GType property_type = G_PARAM_SPEC_VALUE_TYPE (properties[i]);
+ const GValue*default_value = g_param_spec_get_default_value (
+ properties[i]);
+ gboolean printed = FALSE;
+
+
+ if (property_type == G_TYPE_FLOAT)
+ {
+ gfloat defval = g_value_get_float (default_value);
+ gfloat value;
+ gchar str[G_ASCII_DTOSTR_BUF_SIZE];
+ gegl_node_get (iter, properties[i]->name, &value, NULL);
+ if (value != defval || (!trim_defaults))
+ {
+ g_ascii_dtostr (str, sizeof(str), value);
+ if (flags & GEGL_SERIALIZE_INDENT)
+ g_string_append_printf (s2, " ");
+ g_string_append_printf (s2, " %s=%s", property_name,
+ str);
+ printed = TRUE;
+ }
+ }
+ else if (property_type == G_TYPE_DOUBLE)
+ {
+ gdouble defval = g_value_get_double (default_value);
+ gdouble value;
+ gchar str[G_ASCII_DTOSTR_BUF_SIZE];
+ gegl_node_get (iter, property_name, &value, NULL);
+ if (value != defval || (!trim_defaults))
+ {
+ if (flags & GEGL_SERIALIZE_INDENT)
+ g_string_append_printf (s2, " ");
+ g_ascii_dtostr (str, sizeof(str), value);
+ g_string_append_printf (s2, " %s=%s", property_name,
+ str);
+ printed = TRUE;
+ }
+ }
+ else if (property_type == G_TYPE_INT)
+ {
+ gint defval = g_value_get_int (default_value);
+ gint value;
+ gchar str[64];
+ gegl_node_get (iter, properties[i]->name, &value, NULL);
+ if (value != defval || (!trim_defaults))
+ {
+ if (flags & GEGL_SERIALIZE_INDENT)
+ g_string_append_printf (s2, " ");
+ g_snprintf (str, sizeof (str), "%i", value);
+ g_string_append_printf (s2, " %s=%s", property_name,
+ str);
+ printed = TRUE;
+ }
+ }
+ else if (property_type == G_TYPE_BOOLEAN)
+ {
+ gboolean value;
+ gboolean defval = g_value_get_boolean (default_value);
+ gegl_node_get (iter, properties[i]->name, &value, NULL);
+ if (value != defval || (!trim_defaults))
+ {
+ if (flags & GEGL_SERIALIZE_INDENT)
+ g_string_append_printf (s2, " ");
+ if (value)
+ g_string_append_printf (s2, " %s=true",
+ property_name);
+ else
+ g_string_append_printf (s2, " %s=false",
+ property_name);
+ printed = TRUE;
+ }
+ }
+ else if (property_type == G_TYPE_STRING)
+ {
+ gchar *value;
+ const gchar *defval = g_value_get_string (default_value);
+ gegl_node_get (iter, properties[i]->name, &value, NULL);
+ if (!g_str_equal (defval, value) || (!trim_defaults))
+ {
+ if (flags & GEGL_SERIALIZE_INDENT)
+ g_string_append_printf (s2, " ");
+ g_string_append_printf (s2, " %s='%s'", property_name,
+ value);
+ printed = TRUE;
+ }
+ g_free (value);
+ }
+ else if (g_type_is_a (property_type, G_TYPE_ENUM))
+ {
+ GEnumClass *eclass = g_type_class_peek (property_type);
+ gint defval = g_value_get_enum (default_value);
+ gint value;
+
+ gegl_node_get (iter, properties[i]->name, &value, NULL);
+ if (value != defval || (!trim_defaults))
+ {
+ GEnumValue *evalue = g_enum_get_value (eclass, value);
+ if (flags & GEGL_SERIALIZE_INDENT)
+ g_string_append_printf (s2, " ");
+ g_string_append_printf (s2, " %s=%s", property_name,
+ evalue->value_nick);
+ printed = TRUE;
+ }
+ }
+ else if (property_type == GEGL_TYPE_COLOR)
+ {
+ GeglColor *color;
+ GeglColor *defcolor = g_value_get_object (default_value);
+ gchar *value;
+ gchar *defvalue = NULL;
+ gegl_node_get (iter, properties[i]->name, &color, NULL);
+ g_object_get (color, "string", &value, NULL);
+ if (defcolor)
+ {
+ g_object_get (defcolor, "string", &defvalue, NULL);
+ }
+ g_object_unref (color);
+ if ((defvalue &&
+ !g_str_equal (defvalue, value)) || (!trim_defaults))
+ {
+ if (flags & GEGL_SERIALIZE_INDENT)
+ g_string_append_printf (s2, " ");
+ g_string_append_printf (s2, " %s='%s'", property_name,
+ value);
+ printed = TRUE;
+ }
+ g_free (value);
+ }
+ else
+ {
+ g_warning (
+ "%s: serialization of %s properties not implemented",
+ property_name, g_type_name (property_type));
+ }
- g_string_prepend (str, s2->str);
- g_string_free (s2, TRUE);
- iter = gegl_node_get_producer (iter, "input", NULL);
+ if (printed && (flags & GEGL_SERIALIZE_INDENT))
+ g_string_append_printf (s2, "\n");
+
+ {
+ GeglNode *aux = gegl_node_get_producer (iter, "aux", NULL);
+ if (aux)
+ {
+ char *str = gegl_serialize2 (NULL, aux, basepath, ht,
+ flags);
+ g_string_append_printf (s2, " aux=[%s ]", str);
+ g_free (str);
+ }
+ }
+ }
+ }
+
+ g_string_prepend (str, s2->str);
+ g_string_free (s2, TRUE);
+ iter = gegl_node_get_producer (iter, "input", NULL);
+ }
}
- }
ret = str->str;
g_string_free (str, FALSE);
@@ -737,13 +823,17 @@ static gchar *gegl_serialize2 (GeglNode *start, GeglNode *end, const char *basep
return ret;
}
-gchar *gegl_serialize (GeglNode *start, GeglNode *end, const char *basepath,
- GeglSerializeFlag flags)
+gchar *
+gegl_serialize (GeglNode *start,
+ GeglNode *end,
+ const char *basepath,
+ GeglSerializeFlag flags)
{
gchar *ret;
gchar *ret2;
GHashTable *ht = g_hash_table_new (g_direct_hash, g_direct_equal);
+
ret = gegl_serialize2 (start, end, basepath, ht, flags);
g_hash_table_destroy (ht);
ret2 = ret;
@@ -754,11 +844,13 @@ gchar *gegl_serialize (GeglNode *start, GeglNode *end, const char *basepath,
return ret2;
}
-GeglNode *gegl_node_new_from_serialized (const gchar *xmldata,
- const gchar *path_root)
+GeglNode *
+gegl_node_new_from_serialized (const gchar *xmldata,
+ const gchar *path_root)
{
GeglNode *ret;
GeglNode *foo;
+
ret = gegl_node_new ();
gegl_node_set (ret, "operation", "gegl:nop", NULL);
foo = gegl_node_new ();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]