[gegl] gegl-op: add macro based alternative to varargs property meta-data



commit 4b10ec0f346e04a9ec6e7fdd82041b9027b743f3
Author: Øyvind Kolås <pippin gimp org>
Date:   Mon May 19 14:27:48 2014 +0200

    gegl-op: add macro based alternative to varargs property meta-data
    
    Varargs in operation initialization can cause crashes on startup; that might
    be masked by running on 32bit vs 64bit; and possibly other platform specific
    traits.

 gegl/gegl-op.h |  550 +++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 445 insertions(+), 105 deletions(-)
---
diff --git a/gegl/gegl-op.h b/gegl/gegl-op.h
index fa68351..64f1cf5 100644
--- a/gegl/gegl-op.h
+++ b/gegl/gegl-op.h
@@ -228,20 +228,44 @@ gegl_module_register (GTypeModule *module)
 }
 #endif
 
+
+#define description(blurb)
+#define value_range(min,max)
+#define ui_range(min,max)
+#define ui_gamma(gamma)
+#define ui_meta(key,val)
+
+#define ITEM(name,label,def_val, type)
+#define ITEM2(name,label,def_val,type) ITEM(name,label,def_val,type)
+
 /* enum registration */
-#define gegl_property_double(name, label, ...)
-#define gegl_property_string(name, label, ...)
-#define gegl_property_file_path(name, label, ...)
-#define gegl_property_int(name, label, ...)
-#define gegl_property_boolean(name, label, ...)
-#define gegl_property_enum(name, label, enum, enum_name, ...)
-#define gegl_property_object(name, label, ...)
-#define gegl_property_pointer(name, label, ...)
-#define gegl_property_format(name, label, ...)
-#define gegl_property_color(name, label, ...)
-#define gegl_property_curve(name, label, ...)
-#define gegl_property_seed(name, label, rand_name, ...)
-#define gegl_property_path(name, label, ...)
+
+#define property_double(name, label, def_val)     ITEM(name,label,def_val,double)
+#define property_int(name, label, def_val)        ITEM(name,label,def_val,int)
+#define property_string(name, label, def_val)     ITEM(name,label,def_val,string)
+#define property_file_path(name, label, def_val)  ITEM(name,label,def_val,string)
+#define property_boolean(name, label, def_val)    ITEM(name,label,def_val,boolean)
+#define property_pointer(name, label, def_val)    ITEM(name,label,def_val,pointer)
+#define property_object(name, label, def_val)     ITEM2(name,label,def_val,object)
+#define property_enum(name, label, enm, enum_name, def_val)  ITEM(name,label,def_val,pointer)
+#define property_seed(name, label, rand_name)     ITEM(name,label,def_val,int)
+#define property_format(name, label, def_val)     ITEM(name,label,def_val,pointer)
+#define property_curve(name, label, def_val)      ITEM2(name,label,def_val,object)
+#define property_path(name, label, def_val)       ITEM2(name,label,def_val,object)
+#define property_color(name, label, def_val)      ITEM2(name,label,def_val,object)
+#define gegl_property_double(name, label, ...)    ITEM(name,label,def_val,double)
+#define gegl_property_string(name, label, ...)    ITEM(name,label,def_val,string)
+#define gegl_property_file_path(name, label, ...) ITEM(name,label,def_val,string)
+#define gegl_property_int(name, label, ...)       ITEM(name,label,def_val,int)
+#define gegl_property_boolean(name, label, ...)   ITEM(name,label,def_val,boolean)
+#define gegl_property_object(name, label, ...)    ITEM2(name,label,def_val,object)
+#define gegl_property_pointer(name, label, ...)   ITEM(name,label,def_val,pointer)
+#define gegl_property_format(name, label, ...)    ITEM(name,label,def_val,pointer)
+#define gegl_property_color(name, label, ...)     ITEM(name,label,def_val,object)
+#define gegl_property_curve(name, label, ...)     ITEM2(name,label,def_val,object)
+#define gegl_property_path(name, label, ...)      ITEM2(name,label,def_val,object)
+#define gegl_property_seed(name, label, rand_name, ...)   ITEM(name,label,def_val,int)
+#define gegl_property_enum(name, label, enm, enum_name, ...)  ITEM(name,label,def_val,enum)
 
 #define gegl_enum_start(enum_name)   typedef enum {
 #define gegl_enum_value(value, nick)    value ,
@@ -274,6 +298,19 @@ GType enum_name ## _get_type (void)               \
 
 #include GEGL_OP_C_FILE
 
+#undef property_double
+#undef property_int
+#undef property_string
+#undef property_boolean
+#undef property_file_path
+#undef property_object
+#undef property_pointer
+#undef property_format
+#undef property_enum
+#undef property_seed
+#undef property_curve
+#undef property_color
+#undef property_path
 #undef gegl_property_double
 #undef gegl_property_string
 #undef gegl_property_file_path
@@ -299,12 +336,27 @@ GType enum_name ## _get_type (void)               \
 struct _GeglProperties
 {
   gpointer user_data; /* for use by the op implementation */
+#define property_double(name, label, def_val)          gdouble     name;
+#define property_int(name, label, def_val)             gint        name;
+#define property_string(name, label, def_val)          gchar      *name;
+#define property_boolean(name, label, def_val)         gboolean    name;
+#define property_file_path(name, label, def_val)       gchar      *name;
+#define property_object(name, label, def_val)          GObject    *name;
+#define property_curve(name, label, def_val)           GeglCurve  *name;
+#define property_color(name, label, def_val)           GeglColor  *name;
+#define property_path(name, label, def_val)            GeglPath   *name; gulong path_changed_handler;
+#define property_pointer(name, label, def_val)         gpointer    name;
+#define property_format(name, label, def_val)          gpointer    name;
+#define property_enum(name, label, enum, enum_name, def_val) enum        name;
+#define property_seed(name, label, rand_name)          gint        name;\
+                                                       GeglRandom *rand_name;
+
 #define gegl_property_double(name, label, ...)         gdouble     name;
 #define gegl_property_boolean(name, label, ...)        gboolean    name;
 #define gegl_property_int(name, label, ...)            gint        name;
 #define gegl_property_string(name, label, ...)         gchar      *name;
 #define gegl_property_file_path(name, label, ...)      gchar      *name;
-#define gegl_property_enum(name, label, enum, enum_name, ...) enum        name;
+#define gegl_property_enum(name, label, enum, enum_name, ...) enum  name;
 #define gegl_property_object(name, label, ...)         GObject    *name;
 #define gegl_property_pointer(name, label, ...)        gpointer    name;
 #define gegl_property_format(name, label, ...)         gpointer    name;
@@ -317,6 +369,19 @@ struct _GeglProperties
 
 #include GEGL_OP_C_FILE
 
+#undef property_double
+#undef property_int
+#undef property_string
+#undef property_boolean
+#undef property_file_path
+#undef property_object
+#undef property_pointer
+#undef property_format
+#undef property_enum
+#undef property_seed
+#undef property_curve
+#undef property_color
+#undef property_path
 #undef gegl_property_double
 #undef gegl_property_boolean
 #undef gegl_property_int
@@ -338,35 +403,47 @@ enum
 {
   PROP_0,
 
-#define gegl_property_double(name, label, ...)     PROP_##name,
-#define gegl_property_boolean(name, label, ...)    PROP_##name,
-#define gegl_property_int(name, label, ...)        PROP_##name,
-#define gegl_property_string(name, label, ...)     PROP_##name,
-#define gegl_property_file_path(name, label, ...)  PROP_##name,
-#define gegl_property_enum(name, label, enum, enum_name, ...)  PROP_##name,
-#define gegl_property_object(name, label, ...)     PROP_##name,
-#define gegl_property_pointer(name, label, ...)    PROP_##name,
-#define gegl_property_format(name, label, ...)     PROP_##name,
-#define gegl_property_color(name, label, ...)      PROP_##name,
-#define gegl_property_curve(name, label, ...)      PROP_##name,
-#define gegl_property_seed(name, label, rand_name, ...)   PROP_##name,
-#define gegl_property_path(name, label, ...)       PROP_##name,
+#undef ITEM
+#define ITEM(name,label,def_val, type)             PROP_##name,
+#define ITEM2(name,label,def_val, type)            ITEM(name,label,def_val,type)
+
+#define property_double(name, label, def_val)     ITEM(name,label,def_val,double)
+#define property_int(name, label, def_val)        ITEM(name,label,def_val,int)
+#define property_string(name, label, def_val)     ITEM(name,label,def_val,string)
+#define property_file_path(name, label, def_val)  ITEM(name,label,def_val,string)
+#define property_boolean(name, label, def_val)    ITEM(name,label,def_val,boolean)
+#define property_object(name, label, def_val)     ITEM2(name,label,def_val,object)
+#define property_curve(name, label, def_val)      ITEM2(name,label,def_val,object)
+#define property_color(name, label, def_val)      ITEM2(name,label,def_val,object)
+#define property_path(name, label, def_val)       ITEM2(name,label,def_val,object)
+#define property_pointer(name, label, def_val)    ITEM(name,label,def_val,pointer)
+#define property_format(name, label, def_val)     ITEM(name,label,def_val,pointer)
+#define property_enum(name, label, enm, enum_name, def_val) ITEM(name,label,def_val,enum)
+#define property_seed(name, label, rand_name)     ITEM(name,label,def_val,int)
+
+#define gegl_property_double(name, label, ...)    ITEM(name,label,def_val,double)
+#define gegl_property_string(name, label, ...)    ITEM(name,label,def_val,string)
+#define gegl_property_file_path(name, label, ...) ITEM(name,label,def_val,string)
+#define gegl_property_int(name, label, ...)       ITEM(name,label,def_val,int)
+#define gegl_property_boolean(name, label, ...)   ITEM(name,label,def_val,boolean)
+#define gegl_property_object(name, label, ...)    ITEM2(name,label,def_val,object)
+#define gegl_property_pointer(name, label, ...)   ITEM(name,label,def_val,pointer)
+#define gegl_property_format(name, label, ...)    ITEM(name,label,def_val,pointer)
+#define gegl_property_color(name, label, ...)     ITEM(name,label,def_val,object)
+#define gegl_property_curve(name, label, ...)     ITEM2(name,label,def_val,object)
+#define gegl_property_path(name, label, ...)      ITEM2(name,label,def_val,object)
+#define gegl_property_seed(name, label, rand_name, ...)   ITEM(name,label,def_val,int)
+#define gegl_property_enum(name, label, enm, enum_name, ...)  ITEM(name,label,def_val,enum)
 
 #include GEGL_OP_C_FILE
 
-#undef gegl_property_double
-#undef gegl_property_string
-#undef gegl_property_file_path
-#undef gegl_property_boolean
-#undef gegl_property_int
-#undef gegl_property_enum
-#undef gegl_property_object
-#undef gegl_property_pointer
-#undef gegl_property_format
-#undef gegl_property_color
-#undef gegl_property_curve
-#undef gegl_property_seed
-#undef gegl_property_path
+#undef ITEM
+#define ITEM(name,label,def_val, type) \
+    case PROP_##name:                                         \
+      g_value_set_##type (value, properties->name);           \
+      break;
+#define ITEM2(name,label,def_val, type)            ITEM(name,label,def_val,type)
+
   PROP_LAST
 };
 
@@ -382,61 +459,22 @@ get_property (GObject      *gobject,
 
   switch (property_id)
   {
-#define gegl_property_double(name, label,...)                 \
-    case PROP_##name:                                         \
-      g_value_set_double (value, properties->name);           \
-      break;
-#define gegl_property_boolean(name, label,...)                \
-    case PROP_##name:                                         \
-      g_value_set_boolean (value, properties->name);          \
-      break;
-#define gegl_property_int(name, label,...)                    \
-    case PROP_##name:                                         \
-      g_value_set_int (value, properties->name);              \
-      break;
-#define gegl_property_string(name, label, ...)                \
-    case PROP_##name:                                         \
-      g_value_set_string (value, properties->name);           \
-      break;
-#define gegl_property_file_path(name, label, ...)             \
-    case PROP_##name:                                         \
-      g_value_set_string (value, properties->name);           \
-      break;
-#define gegl_property_enum(name, label, enum, enum_name, ...) \
-    case PROP_##name:                                         \
-      g_value_set_enum (value, properties->name);             \
-      break;
-#define gegl_property_object(name, label, ...)                \
-    case PROP_##name:                                         \
-      g_value_set_object (value, properties->name);           \
-      break;
-#define gegl_property_pointer(name, label, ...)               \
-    case PROP_##name:                                         \
-      g_value_set_pointer (value, properties->name);          \
-      break;
-#define gegl_property_format(name, label, ...)                \
-    case PROP_##name:                                         \
-      g_value_set_pointer (value, properties->name);          \
-      break;
-#define gegl_property_color(name, label, ...)                 \
-    case PROP_##name:                                         \
-      g_value_set_object (value, properties->name);           \
-      break;
-#define gegl_property_curve(name, label, ...)                 \
-    case PROP_##name:                                         \
-      g_value_set_object (value, properties->name);           \
-      break;
-#define gegl_property_seed(name, label, rand_name, ...)       \
-    case PROP_##name:                                         \
-      g_value_set_int (value, properties->name);              \
-      break;
-#define gegl_property_path(name, label, ...)                  \
-    case PROP_##name:                                         \
-      g_value_set_object (value, properties->name);           \
-      break;
 
 #include GEGL_OP_C_FILE
 
+#undef property_double
+#undef property_int
+#undef property_string
+#undef property_boolean
+#undef property_file_path
+#undef property_object
+#undef property_pointer
+#undef property_format
+#undef property_enum
+#undef property_seed
+#undef property_curve
+#undef property_color
+#undef property_path
 #undef gegl_property_double
 #undef gegl_property_boolean
 #undef gegl_property_int
@@ -469,61 +507,130 @@ set_property (GObject      *gobject,
 
   switch (property_id)
   {
-#define gegl_property_double(name, label, ...)                               \
+#define property_double(name, label, def_val)                         \
+    case PROP_##name:                                                 \
+      properties->name = g_value_get_double (value);                  \
+      break;
+#define property_int(name, label, def_val)                            \
+    case PROP_##name:                                                 \
+      properties->name = g_value_get_double (value);                  \
+      break;
+#define property_string(name, label, def_val)                         \
+    case PROP_##name:                                                 \
+      if (properties->name)                                           \
+        g_free (properties->name);                                    \
+      properties->name = g_value_dup_string (value);                  \
+      break;
+#define property_boolean(name, label, def_val)                        \
+    case PROP_##name:                                                 \
+      properties->name = g_value_get_boolean (value);                 \
+      break;
+#define property_file_path (name, label, def_val)                     \
+    case PROP_##name:                                                 \
+      if (properties->name)                                           \
+        g_free (properties->name);                                    \
+      properties->name = g_value_dup_string (value);                  \
+      break;
+#define property_object(name, label, def_val)                         \
+    case PROP_##name:                                                 \
+      if (properties->name != NULL)                                   \
+         g_object_unref (properties->name);                           \
+      properties->name = g_value_dup_object (value);                  \
+      break;
+#define property_curve(name, label, def_val)                          \
+    case PROP_##name:                                                 \
+      if (properties->name != NULL)                                   \
+         g_object_unref (properties->name);                           \
+      properties->name = g_value_dup_object (value);                  \
+      break;
+#define property_color(name, label, def_val)                          \
+    case PROP_##name:                                                 \
+      if (properties->name != NULL)                                   \
+         g_object_unref (properties->name);                           \
+      properties->name = g_value_dup_object (value);                  \
+      break;
+#define property_path(name, label, def_val)                           \
+    case PROP_##name:                                                 \
+      if (properties->name != NULL)                                   \
+         g_object_unref (properties->name);                           \
+      properties->name = g_value_dup_object (value);                  \
+      break;
+#define property_pointer(name, label, def_val)                        \
+    case PROP_##name:                                                 \
+      properties->name = g_value_get_pointer (value);                 \
+      break;
+#define property_format(name, label, def_val)                         \
+    case PROP_##name:                                                 \
+      properties->name = g_value_get_pointer (value);                 \
+      break;
+#define property_enum(name, label, enum, enum_name, def_val)          \
+    case PROP_##name:                                                 \
+      properties->name = g_value_get_enum (value);                    \
+      break;
+#define property_seed(name, label, rand_name)                         \
+    case PROP_##name:                                                 \
+      properties->name = g_value_get_int (value);                     \
+      if (!properties->rand_name)                                     \
+        properties->rand_name = gegl_random_new_with_seed (properties->name);\
+      else                                                            \
+        gegl_random_set_seed (properties->rand_name, properties->name);\
+      break;
+
+#define gegl_property_double(name, label, ...)                        \
     case PROP_##name:                                                 \
       properties->name = g_value_get_double (value);                  \
       break;
-#define gegl_property_boolean(name, label, ...)                              \
+#define gegl_property_boolean(name, label, ...)                       \
     case PROP_##name:                                                 \
       properties->name = g_value_get_boolean (value);                 \
       break;
-#define gegl_property_int(name, label, ...)                                  \
+#define gegl_property_int(name, label, ...)                           \
     case PROP_##name:                                                 \
       properties->name = g_value_get_int (value);                     \
       break;
-#define gegl_property_string(name, label, ...)                               \
+#define gegl_property_string(name, label, ...)                        \
     case PROP_##name:                                                 \
       if (properties->name)                                           \
         g_free (properties->name);                                    \
       properties->name = g_value_dup_string (value);                  \
       break;
-#define gegl_property_file_path(name, label, ...)                            \
+#define gegl_property_file_path(name, label, ...)                     \
     case PROP_##name:                                                 \
       if (properties->name)                                           \
         g_free (properties->name);                                    \
       properties->name = g_value_dup_string (value);                  \
       break;
-#define gegl_property_enum(name, label, enum, enum_name, ...)                \
+#define gegl_property_enum(name, label, enum, enum_name, ...)         \
     case PROP_##name:                                                 \
       properties->name = g_value_get_enum (value);                    \
       break;
-#define gegl_property_object(name, label, ...)                               \
+#define gegl_property_object(name, label, ...)                        \
     case PROP_##name:                                                 \
       if (properties->name != NULL)                                   \
          g_object_unref (properties->name);                           \
       properties->name = g_value_dup_object (value);                  \
       break;
-#define gegl_property_pointer(name, label, ...)                              \
+#define gegl_property_pointer(name, label, ...)                       \
     case PROP_##name:                                                 \
       properties->name = g_value_get_pointer (value);                 \
       break;
-#define gegl_property_format(name, label, ...)                               \
+#define gegl_property_format(name, label, ...)                        \
     case PROP_##name:                                                 \
       properties->name = g_value_get_pointer (value);                 \
       break;
-#define gegl_property_color(name, label, ...)                                \
+#define gegl_property_color(name, label, ...)                         \
     case PROP_##name:                                                 \
       if (properties->name != NULL)                                   \
          g_object_unref (properties->name);                           \
       properties->name = g_value_dup_object (value);                  \
       break;
-#define gegl_property_curve(name, label, ...)                                \
+#define gegl_property_curve(name, label, ...)                         \
     case PROP_##name:                                                 \
       if (properties->name != NULL)                                   \
          g_object_unref (properties->name);                           \
       properties->name = g_value_dup_object (value);                  \
       break;
-#define gegl_property_seed(name, label, rand_name, ...)                      \
+#define gegl_property_seed(name, label, rand_name, ...)               \
     case PROP_##name:                                                 \
       properties->name = g_value_get_int (value);                     \
       if (!properties->rand_name)                                     \
@@ -552,6 +659,19 @@ set_property (GObject      *gobject,
 
 #include GEGL_OP_C_FILE
 
+#undef property_double
+#undef property_int
+#undef property_string
+#undef property_boolean
+#undef property_file_path
+#undef property_object
+#undef property_pointer
+#undef property_curve
+#undef property_color
+#undef property_path
+#undef property_format
+#undef property_enum
+#undef property_seed
 #undef gegl_property_double
 #undef gegl_property_boolean
 #undef gegl_property_int
@@ -578,6 +698,49 @@ static void gegl_op_destroy_notify (gpointer data)
 {
   GeglProperties *properties = GEGL_PROPERTIES (data);
 
+#define property_double(name, label, def_val)
+#define property_int(name, label, def_val) 
+#define property_string(name, label, ...)      \
+  if (properties->name)                             \
+    {                                               \
+      g_free (properties->name);                    \
+      properties->name = NULL;                      \
+    }
+#define property_boolean(name, label, def_val)
+#define property_file_path(name, label, def_val)    \
+  if (properties->name)                             \
+    {                                               \
+      g_free (properties->name);                    \
+      properties->name = NULL;                      \
+    }
+#define property_object(name, label, def_val)       \
+  if (properties->name)                             \
+    {                                               \
+      g_object_unref (properties->name);            \
+      properties->name = NULL;                      \
+    }
+#define property_curve(name, label, def_val)       \
+  if (properties->name)                             \
+    {                                               \
+      g_object_unref (properties->name);            \
+      properties->name = NULL;                      \
+    }
+#define property_color(name, label, def_val)       \
+  if (properties->name)                             \
+    {                                               \
+      g_object_unref (properties->name);            \
+      properties->name = NULL;                      \
+    }
+#define property_path(name, label, def_val)       \
+  if (properties->name)                             \
+    {                                               \
+      g_object_unref (properties->name);            \
+      properties->name = NULL;                      \
+    }
+#define property_pointer(name, label, ...)
+#define property_format(name, label, ...)
+#define property_enum(name, label, ...)
+#define property_seed(name, label, ...)
 #define gegl_property_double(name, label, ...)
 #define gegl_property_boolean(name, label, ...)
 #define gegl_property_int(name, label, ...)
@@ -614,7 +777,7 @@ static void gegl_op_destroy_notify (gpointer data)
       g_object_unref (properties->name);            \
       properties->name = NULL;                      \
     }
-#define gegl_property_seed(name, label, rand_name, ...)    \
+#define gegl_property_seed(name, label, rand_name, ...)  \
   if (properties->rand_name)                        \
     {                                               \
       gegl_random_free (properties->rand_name);     \
@@ -629,6 +792,19 @@ static void gegl_op_destroy_notify (gpointer data)
 
 #include GEGL_OP_C_FILE
 
+#undef property_double
+#undef property_int
+#undef property_string
+#undef property_boolean
+#undef property_file_path
+#undef property_object
+#undef property_pointer
+#undef property_format
+#undef property_enum
+#undef property_seed
+#undef property_curve
+#undef property_color
+#undef property_path
 #undef gegl_property_double
 #undef gegl_property_boolean
 #undef gegl_property_int
@@ -660,6 +836,23 @@ gegl_op_constructor (GType                  type,
   /* create dummy colors and vectors */
   properties = GEGL_PROPERTIES (obj);
 
+#define property_double(name, label, def_val)
+#define property_int(name, label, def_val)
+#define property_string(name, label, def_val)
+#define property_boolean(name, label, def_val)
+#define property_file_path(name, label, def_val)
+#define property_object(name, label, def_val)
+#define property_pointer(name, label, def_val)
+#define property_format(name, label, def_val)
+#define property_curve(name, label, def_val)
+#define property_color(name, label, def_val)\
+    if (properties->name == NULL)                   \
+    {properties->name = gegl_color_new(def_val?def_val:"black");}
+#define property_path(name, label, def_val)
+#define property_enum(name, ...)
+#define property_seed(name, label, rand_name)    \
+    if (properties->rand_name == NULL)              \
+      {properties->rand_name = gegl_random_new_with_seed (0);}
 #define gegl_property_double(name, label, ...)
 #define gegl_property_boolean(name, label, ...)
 #define gegl_property_int(name, label, ...)
@@ -680,6 +873,19 @@ gegl_op_constructor (GType                  type,
 
 #include GEGL_OP_C_FILE
 
+#undef property_double
+#undef property_int
+#undef property_string
+#undef property_boolean
+#undef property_file_path
+#undef property_object
+#undef property_pointer
+#undef property_format
+#undef property_enum
+#undef property_seed
+#undef property_curve
+#undef property_color
+#undef property_path
 #undef gegl_property_double
 #undef gegl_property_boolean
 #undef gegl_property_int
@@ -703,11 +909,124 @@ static void
 gegl_op_class_intern_init (gpointer klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  int current_prop = -1;
+  GParamFlags flags G_GNUC_UNUSED = G_PARAM_READWRITE | G_PARAM_CONSTRUCT | GEGL_PARAM_PAD_INPUT;
 
   object_class->set_property = set_property;
   object_class->get_property = get_property;
   object_class->constructor  = gegl_op_constructor;
 
+  {
+    GParamSpec *pspec = NULL;
+
+#undef description
+#undef value_range
+#undef ui_range
+#undef ui_gamma
+#undef ui_meta
+
+#define REGISTER_IF_ANY \
+    if (pspec && current_prop >=0) {\
+      g_object_class_install_property (object_class, current_prop, pspec);\
+      pspec = NULL; current_prop = -1;\
+    }
+
+#define description(blurb) \
+    pspec->_blurb = g_strdup (blurb);
+#define value_range(min,max) \
+    vpspec->minimum = min; vpspec->maximum = max; \
+    upspec->ui_minimum = min; upspec->ui_maximum = max;
+#define ui_range(min,max) \
+    upspec->ui_minimum = min; upspec->ui_maximum = max;
+#define ui_gamma(gamma) \
+    upspec->ui_gamma = gamma;
+#define ui_meta(key,val) \
+    gegl_param_spec_set_property_key(pspec, key, val);
+
+#define property_double(name, label, def_val) \
+    REGISTER_IF_ANY  \
+  }{ GParamSpec *pspec = \
+       gegl_param_spec_double (#name, label, NULL,-G_MAXDOUBLE,G_MAXDOUBLE,0,-100,100,1.0,flags);\
+     GeglParamSpecDouble *upspec G_GNUC_UNUSED = GEGL_PARAM_SPEC_DOUBLE (pspec);\
+     GParamSpecDouble    *vpspec G_GNUC_UNUSED = G_PARAM_SPEC_DOUBLE (pspec);\
+     current_prop = PROP_##name ;
+
+#define property_int(name, label, def_val) \
+    REGISTER_IF_ANY  \
+  }{ GParamSpec *pspec = \
+       gegl_param_spec_int (#name, label, NULL,G_MININT,G_MAXINT,0,-100,100,1.0,flags);\
+     GeglParamSpecInt *upspec G_GNUC_UNUSED = GEGL_PARAM_SPEC_INT (pspec);\
+     GParamSpecInt    *vpspec G_GNUC_UNUSED = G_PARAM_SPEC_INT (pspec);\
+     current_prop = PROP_##name ;
+
+#define property_string(name, label, def_val) \
+    REGISTER_IF_ANY  \
+  }{ GParamSpec *pspec = \
+       g_param_spec_string (#name, label, def_val, flags);\
+     current_prop = PROP_##name ;
+
+#define property_boolean(name, label, def_val) \
+    REGISTER_IF_ANY  \
+  }{ GParamSpec *pspec = \
+       g_param_spec_boolean (#name, label, NULL, def_val, flags);\
+     current_prop = PROP_##name ;
+
+#define property_file_path(name, label, def_val) \
+    REGISTER_IF_ANY  \
+  }{ GParamSpec *pspec = \
+       gegl_param_spec_file_path (#name, label, NULL, FALSE, FALSE, def_val, flags);\
+     current_prop = PROP_##name ;
+
+#define property_object(name, label, def_val) \
+    REGISTER_IF_ANY  \
+  }{ GParamSpec *pspec = \
+       g_param_spec_object (#name, label, NULL, flags);\
+     current_prop = PROP_##name ;
+
+#define property_curve(name, label, def_val) \
+    REGISTER_IF_ANY  \
+  }{ GParamSpec *pspec = \
+       gegl_param_spec_curve (#name, label, NULL, flags);\
+     current_prop = PROP_##name ;
+
+#define property_color(name, label, def_val) \
+    REGISTER_IF_ANY  \
+  }{ GParamSpec *pspec = \
+       gegl_param_spec_color_from_string (#name, label, NULL, def_val, flags);\
+     current_prop = PROP_##name ;
+
+#define property_path(name, label, def_val) \
+    REGISTER_IF_ANY  \
+  }{ GParamSpec *pspec = \
+       gegl_param_spec_path (#name, label, NULL, flags);\
+     current_prop = PROP_##name ;
+
+#define property_pointer(name, label, def_val) \
+    REGISTER_IF_ANY  \
+  }{ GParamSpec *pspec = \
+       g_param_spec_pointer (#name, label, NULL, flags);\
+     current_prop = PROP_##name ;
+
+#define property_format(name, label, def_val) \
+    REGISTER_IF_ANY  \
+  }{ GParamSpec *pspec = \
+       gegl_param_spec_format (#name, label, NULL, flags);\
+     current_prop = PROP_##name ;
+
+#define property_enum(name, label, enum, enum_name, def_val)                   \
+    REGISTER_IF_ANY  \
+  }{ GParamSpec *pspec = gegl_param_spec_enum (#name, label, NULL, enum_name ##_get_type(), def_val, flags); 
      \
+    current_prop = PROP_##name ;
+
+#define property_seed(name, label, rand_name)    \
+    REGISTER_IF_ANY  \
+  }{ GParamSpec *pspec = gegl_param_spec_seed (#name, label, NULL, flags);       \
+    current_prop = PROP_##name ;
+
+#define gegl_property_string(name, label, foo...)                              \
+  { GParamSpec *pspec = gegl_param_spec_string_from_vararg (#name, label, foo);\
+    g_object_class_install_property (object_class, PROP_##name, pspec);};
+
 #define gegl_property_double(name, label, foo...)                              \
   { GParamSpec *pspec = gegl_param_spec_double_from_vararg (#name, label, foo);\
     g_object_class_install_property (object_class, PROP_##name, pspec);};
@@ -752,6 +1071,27 @@ gegl_op_class_intern_init (gpointer klass)
 
 #include GEGL_OP_C_FILE
 
+    REGISTER_IF_ANY
+  }
+
+#undef REGISTER_IF_ANY
+#undef description
+#undef value_range
+#undef ui_range
+#undef ui_gamma
+#undef ui_meta
+#undef property_double
+#undef property_int
+#undef property_string
+#undef property_enum
+#undef property_seed
+#undef property_pointer
+#undef property_path
+#undef property_curve
+#undef property_color
+#undef property_object
+#undef property_format
+
 #undef gegl_property_double
 #undef gegl_property_boolean
 #undef gegl_property_int


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]