[gegl] gegl-binary: support specifying more complex DAGs than linear chains from commandline
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] gegl-binary: support specifying more complex DAGs than linear chains from commandline
- Date: Sat, 5 Mar 2016 15:14:38 +0000 (UTC)
commit e0d43764185ae8307282f7ddbf3d492b6f14d389
Author: Øyvind Kolås <pippin gimp org>
Date: Sat Mar 5 16:12:55 2016 +0100
gegl-binary: support specifying more complex DAGs than linear chains from commandline
bin/gegl.c | 102 ++++++++++++++++++++++++++++++++++++-----------------------
1 files changed, 62 insertions(+), 40 deletions(-)
---
diff --git a/bin/gegl.c b/bin/gegl.c
index cc3d09f..cc945fc 100644
--- a/bin/gegl.c
+++ b/bin/gegl.c
@@ -282,14 +282,18 @@ main (gint argc,
void gegl_create_chain (char **ops, GeglNode *start, GeglNode *proxy)
{
- GeglNode *iter[10] = {start, NULL};
- GeglNode *new = NULL;
- gchar **arg = ops;
- int level = 0;
- char *level_op[10];
- char *level_pad[10];
+ GeglNode *iter[10] = {start, NULL};
+ GeglNode *new = NULL;
+ gchar **arg = ops;
+ int level = 0;
+ char *level_op[10];
+ char *level_pad[10];
+ GHashTable *ht = NULL;
+
level_op[level] = *arg;
+ ht = g_hash_table_new (g_str_hash, g_str_equal);
+
while (*arg)
{
if (strchr (*arg, ']'))
@@ -321,50 +325,66 @@ void gegl_create_chain (char **ops, GeglNode *start, GeglNode *proxy)
GValue gvalue={0,};
char *key = g_strdup (*arg);
char *value = strchr (key, '=') + 1;
- unsigned int n_props;
- GParamSpec **pspecs = gegl_operation_list_properties (level_op[level], &n_props);
- int i;
-
value[-1] = '\0';
- for (i = 0; i < n_props; i++)
+
+ if (!strcmp (key, "id"))
+ {
+ g_hash_table_insert (ht, (void*)g_intern_string (value), iter[level]);
+ }
+ else if (!strcmp (key, "ref"))
{
- if (!strcmp (pspecs[i]->name, key))
- target_type = pspecs[i]->value_type;
+ 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);
}
- if (target_type == G_TYPE_DOUBLE || target_type == G_TYPE_FLOAT)
+ else
+ {
+ unsigned int n_props = 0;
+ GParamSpec **pspecs;
+ int i;
+
+ pspecs = gegl_operation_list_properties (level_op[level], &n_props);
+ for (i = 0; i < n_props; i++)
{
- double val = g_strtod (value, NULL);
- gegl_node_set (iter[level], key, val, NULL);
+ if (!strcmp (pspecs[i]->name, key))
+ target_type = pspecs[i]->value_type;
}
- else if (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"))
+ if (target_type == G_TYPE_DOUBLE || target_type == G_TYPE_FLOAT)
+ {
+ double val = g_strtod (value, NULL);
+ gegl_node_set (iter[level], key, val, NULL);
+ }
+ else if (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 == G_TYPE_INT)
{
- gegl_node_set (iter[level], key, TRUE, NULL);
+ int val = g_strtod (value, NULL);
+ gegl_node_set (iter[level], key, val, NULL);
}
- else
+ else
{
- gegl_node_set (iter[level], key, FALSE, NULL);
+ 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);
}
}
- else if (target_type == G_TYPE_INT)
- {
- int val = g_strtod (value, NULL);
- gegl_node_set (iter[level], key, val, NULL);
- }
- 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);
}
}
@@ -392,5 +412,7 @@ void gegl_create_chain (char **ops, GeglNode *start, GeglNode *proxy)
}
arg++;
}
+
+ g_hash_table_unref (ht);
gegl_node_link_many (iter[level], proxy, NULL);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]