diff --git a/app/actions/gimpgeglprocedure.c b/app/actions/gimpgeglprocedure.c index 2de5892d80..c406d4493d 100644 --- a/app/actions/gimpgeglprocedure.c +++ b/app/actions/gimpgeglprocedure.c @@ -210,10 +210,11 @@ gimp_gegl_procedure_execute (GimpProcedure *procedure, GObject **drawables; GObject *config; - image = g_value_get_object (gimp_value_array_index (args, 1)); - n_drawables = g_value_get_int (gimp_value_array_index (args, 2)); - drawables = gimp_value_get_object_array (gimp_value_array_index (args, 3)); - config = g_value_get_object (gimp_value_array_index (args, 4)); + image = g_value_get_object (gimp_value_array_index (args, 1)); + drawables = g_value_get_boxed (gimp_value_array_index (args, 2)); + config = g_value_get_object (gimp_value_array_index (args, 3)); + + n_drawables = gimp_core_object_array_get_length ((GObject **) drawables); if (n_drawables == 1) { @@ -254,7 +255,7 @@ gimp_gegl_procedure_execute_async (GimpProcedure *procedure, const gchar *tool_name; run_mode = g_value_get_enum (gimp_value_array_index (args, 0)); - settings = g_value_get_object (gimp_value_array_index (args, 4)); + settings = g_value_get_object (gimp_value_array_index (args, 3)); if (! settings && (run_mode != GIMP_RUN_INTERACTIVE || @@ -292,7 +293,7 @@ gimp_gegl_procedure_execute_async (GimpProcedure *procedure, { GimpValueArray *return_vals; - g_value_set_object (gimp_value_array_index (args, 4), settings); + g_value_set_object (gimp_value_array_index (args, 3), settings); return_vals = gimp_procedure_execute (procedure, gimp, context, progress, args, NULL); gimp_value_array_unref (return_vals); @@ -514,17 +515,11 @@ gimp_gegl_procedure_new (Gimp *gimp, FALSE, GIMP_PARAM_READWRITE)); gimp_procedure_add_argument (procedure, - g_param_spec_int ("num-drawables", - "N drawables", - "The number of drawables", - 0, G_MAXINT32, 0, - GIMP_PARAM_READWRITE)); - gimp_procedure_add_argument (procedure, - gimp_param_spec_object_array ("drawables", - "Drawables", - "Input drawables", - GIMP_TYPE_DRAWABLE, - GIMP_PARAM_READWRITE)); + gimp_param_spec_core_object_array ("drawables", + "Drawables", + "Input drawables", + GIMP_TYPE_DRAWABLE, + GIMP_PARAM_READWRITE)); gimp_procedure_add_argument (procedure, g_param_spec_object ("settings", "Settings", diff --git a/app/actions/procedure-commands.c b/app/actions/procedure-commands.c index 9cb01fe797..1a8e5cc707 100644 --- a/app/actions/procedure-commands.c +++ b/app/actions/procedure-commands.c @@ -193,31 +193,20 @@ procedure_commands_get_items_args (GimpProcedure *procedure, return NULL; } } - else if (gimp_value_array_length (args) > n_args + 1 && - G_IS_PARAM_SPEC_INT (procedure->args[n_args]) && - GIMP_IS_PARAM_SPEC_OBJECT_ARRAY (procedure->args[n_args + 1])) + else if (GIMP_IS_PARAM_SPEC_CORE_OBJECT_ARRAY (procedure->args[n_args])) { GimpItem **items = NULL; gint n_items; + GList *iter; + gint i; + n_items = g_list_length (items_list); + items = g_new0 (GimpItem *, n_items + 1); + for (iter = items_list, i = 0; iter; iter = iter->next, i++) + items[i] = iter->data; - g_value_set_int (gimp_value_array_index (args, n_args++), - n_items); - - if (items_list) - { - GList *iter; - gint i; - - items = g_new (GimpItem *, n_items); - for (iter = items_list, i = 0; iter; iter = iter->next, i++) - items[i] = iter->data; - } - - gimp_value_set_object_array (gimp_value_array_index (args, n_args++), - GIMP_TYPE_ITEM, - (GObject **) items, n_items); + g_value_set_boxed (gimp_value_array_index (args, n_args++), (GObject **) items); g_free (items); } @@ -298,31 +287,21 @@ procedure_commands_get_display_args (GimpProcedure *procedure, return NULL; } } - else if (gimp_value_array_length (args) > n_args + 1 && - G_IS_PARAM_SPEC_INT (procedure->args[n_args]) && - GIMP_IS_PARAM_SPEC_OBJECT_ARRAY (procedure->args[n_args + 1])) + else if (GIMP_IS_PARAM_SPEC_CORE_OBJECT_ARRAY (procedure->args[n_args])) { GimpDrawable **drawables = NULL; gint n_drawables; + GList *iter; + gint i; + n_drawables = g_list_length (drawables_list); - g_value_set_int (gimp_value_array_index (args, n_args++), - n_drawables); + drawables = g_new0 (GimpDrawable *, n_drawables + 1); + for (iter = drawables_list, i = 0; iter; iter = iter->next, i++) + drawables[i] = iter->data; - if (drawables_list) - { - GList *iter; - gint i; - - drawables = g_new (GimpDrawable *, n_drawables); - for (iter = drawables_list, i = 0; iter; iter = iter->next, i++) - drawables[i] = iter->data; - } - - gimp_value_set_object_array (gimp_value_array_index (args, n_args++), - GIMP_TYPE_DRAWABLE, - (GObject **) drawables, n_drawables); + g_value_set_boxed (gimp_value_array_index (args, n_args++), (GObject **) drawables); g_free (drawables); } diff --git a/app/errors.c b/app/errors.c index 28b363bdf2..cedcef0058 100644 --- a/app/errors.c +++ b/app/errors.c @@ -471,11 +471,10 @@ gimp_eek (const gchar *reason, gimp_get_user_context (the_errors_gimp), NULL, NULL, "gimp-xcf-save", - GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE, - GIMP_TYPE_IMAGE, image, - G_TYPE_INT, 0, - GIMP_TYPE_OBJECT_ARRAY, NULL, - G_TYPE_FILE, backup_file, + GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE, + GIMP_TYPE_IMAGE, image, + GIMP_TYPE_CORE_OBJECT_ARRAY, NULL, + G_TYPE_FILE, backup_file, G_TYPE_NONE); g_rename (g_file_peek_path (backup_file), backup_path); i++; diff --git a/app/file-data/file-data-gbr.c b/app/file-data/file-data-gbr.c index 0901e43fb3..a4e7b3ef9e 100644 --- a/app/file-data/file-data-gbr.c +++ b/app/file-data/file-data-gbr.c @@ -134,11 +134,11 @@ file_gbr_save_invoker (GimpProcedure *procedure, gimp_set_busy (gimp); image = g_value_get_object (gimp_value_array_index (args, 1)); - n_drawables = g_value_get_int (gimp_value_array_index (args, 2)); - drawables = (GimpDrawable **) gimp_value_get_object_array (gimp_value_array_index (args, 3)); - file = g_value_get_object (gimp_value_array_index (args, 4)); - spacing = g_value_get_int (gimp_value_array_index (args, 5)); - name = g_value_get_string (gimp_value_array_index (args, 6)); + drawables = (GimpDrawable **) g_value_get_boxed (gimp_value_array_index (args, 2)); + n_drawables = gimp_core_object_array_get_length ((GObject **) drawables); + file = g_value_get_object (gimp_value_array_index (args, 3)); + spacing = g_value_get_int (gimp_value_array_index (args, 4)); + name = g_value_get_string (gimp_value_array_index (args, 5)); brush = file_gbr_image_to_brush (image, context, n_drawables, drawables, name, spacing); diff --git a/app/file-data/file-data-gih.c b/app/file-data/file-data-gih.c index 0da36c6569..551a689562 100644 --- a/app/file-data/file-data-gih.c +++ b/app/file-data/file-data-gih.c @@ -134,10 +134,10 @@ file_gih_save_invoker (GimpProcedure *procedure, /* XXX: drawable list is currently unused. GIH saving just uses the * whole layer list. */ - file = g_value_get_object (gimp_value_array_index (args, 4)); - spacing = g_value_get_int (gimp_value_array_index (args, 5)); - name = g_value_get_string (gimp_value_array_index (args, 6)); - params = g_value_get_string (gimp_value_array_index (args, 7)); + file = g_value_get_object (gimp_value_array_index (args, 3)); + spacing = g_value_get_int (gimp_value_array_index (args, 4)); + name = g_value_get_string (gimp_value_array_index (args, 5)); + params = g_value_get_string (gimp_value_array_index (args, 6)); pipe = file_gih_image_to_pipe (image, name, spacing, params); diff --git a/app/file-data/file-data-pat.c b/app/file-data/file-data-pat.c index 7d7f2c1a39..07c20b5a37 100644 --- a/app/file-data/file-data-pat.c +++ b/app/file-data/file-data-pat.c @@ -134,10 +134,10 @@ file_pat_save_invoker (GimpProcedure *procedure, gimp_set_busy (gimp); image = g_value_get_object (gimp_value_array_index (args, 1)); - n_drawables = g_value_get_int (gimp_value_array_index (args, 2)); - drawables = (GimpDrawable **) gimp_value_get_object_array (gimp_value_array_index (args, 3)); - file = g_value_get_object (gimp_value_array_index (args, 4)); - name = g_value_get_string (gimp_value_array_index (args, 5)); + drawables = (GimpDrawable **) g_value_get_boxed (gimp_value_array_index (args, 2)); + n_drawables = gimp_core_object_array_get_length ((GObject **) drawables); + file = g_value_get_object (gimp_value_array_index (args, 3)); + name = g_value_get_string (gimp_value_array_index (args, 4)); pattern = file_pat_image_to_pattern (image, context, n_drawables, drawables, name); diff --git a/app/file-data/file-data.c b/app/file-data/file-data.c index 9245076879..23eeaf04b4 100644 --- a/app/file-data/file-data.c +++ b/app/file-data/file-data.c @@ -154,17 +154,11 @@ file_data_init (Gimp *gimp) FALSE, GIMP_PARAM_READWRITE)); gimp_procedure_add_argument (procedure, - g_param_spec_int ("num-drawables", - "Num drawables", - "Number of drawables", - 1, G_MAXINT, 1, - GIMP_PARAM_READWRITE)); - gimp_procedure_add_argument (procedure, - gimp_param_spec_object_array ("drawables", - "Drawables", - "Selected drawables", - GIMP_TYPE_DRAWABLE, - GIMP_PARAM_READWRITE | GIMP_PARAM_NO_VALIDATE)); + gimp_param_spec_core_object_array ("drawables", + "Drawables", + "Selected drawables", + GIMP_TYPE_DRAWABLE, + GIMP_PARAM_READWRITE | GIMP_PARAM_NO_VALIDATE)); gimp_procedure_add_argument (procedure, g_param_spec_object ("file", "File", @@ -291,17 +285,11 @@ file_data_init (Gimp *gimp) FALSE, GIMP_PARAM_READWRITE)); gimp_procedure_add_argument (procedure, - g_param_spec_int ("num-drawables", - "num drawables", - "The number of drawables to save", - 1, G_MAXINT32, 1, - GIMP_PARAM_READWRITE)); - gimp_procedure_add_argument (procedure, - gimp_param_spec_object_array ("drawables", - "drawables", - "Drawables to save", - GIMP_TYPE_DRAWABLE, - GIMP_PARAM_READWRITE | GIMP_PARAM_NO_VALIDATE)); + gimp_param_spec_core_object_array ("drawables", + "drawables", + "Drawables to save", + GIMP_TYPE_DRAWABLE, + GIMP_PARAM_READWRITE | GIMP_PARAM_NO_VALIDATE)); gimp_procedure_add_argument (procedure, g_param_spec_object ("file", "File", @@ -434,17 +422,11 @@ file_data_init (Gimp *gimp) FALSE, GIMP_PARAM_READWRITE)); gimp_procedure_add_argument (procedure, - g_param_spec_int ("num-drawables", - "Num drawables", - "Number of drawables", - 1, G_MAXINT, 1, - GIMP_PARAM_READWRITE)); - gimp_procedure_add_argument (procedure, - gimp_param_spec_object_array ("drawables", - "Drawables", - "Selected drawables", - GIMP_TYPE_DRAWABLE, - GIMP_PARAM_READWRITE | GIMP_PARAM_NO_VALIDATE)); + gimp_param_spec_core_object_array ("drawables", + "Drawables", + "Selected drawables", + GIMP_TYPE_DRAWABLE, + GIMP_PARAM_READWRITE | GIMP_PARAM_NO_VALIDATE)); gimp_procedure_add_argument (procedure, g_param_spec_object ("file", "File", diff --git a/app/pdb/gimppdb.c b/app/pdb/gimppdb.c index b1281f123a..5977caa400 100644 --- a/app/pdb/gimppdb.c +++ b/app/pdb/gimppdb.c @@ -447,7 +447,7 @@ gimp_pdb_execute_procedure_by_name (GimpPDB *pdb, if (GIMP_VALUE_HOLDS_INT32_ARRAY (value) || GIMP_VALUE_HOLDS_FLOAT_ARRAY (value) || - GIMP_VALUE_HOLDS_OBJECT_ARRAY (value)) + GIMP_VALUE_HOLDS_CORE_OBJECT_ARRAY (value)) { /* Array arguments don't have their size information when they * are set by core code, in C array form. @@ -464,10 +464,8 @@ gimp_pdb_execute_procedure_by_name (GimpPDB *pdb, gimp_value_set_float_array (value, (const gdouble *) va_arg (va_args, gpointer), prev_int_value); - else if (GIMP_VALUE_HOLDS_OBJECT_ARRAY (value)) - gimp_value_set_object_array (value, GIMP_TYPE_ITEM, - va_arg (va_args, gpointer), - prev_int_value); + else if (GIMP_VALUE_HOLDS_CORE_OBJECT_ARRAY (value)) + g_value_set_boxed (value, va_arg (va_args, gpointer)); } else { diff --git a/app/plug-in/gimppluginprocedure.c b/app/plug-in/gimppluginprocedure.c index 16f394b515..54b38c2c44 100644 --- a/app/plug-in/gimppluginprocedure.c +++ b/app/plug-in/gimppluginprocedure.c @@ -672,21 +672,20 @@ gimp_plug_in_procedure_add_menu_path (GimpPlugInProcedure *proc, if ((procedure->num_args < 4) || ! GIMP_IS_PARAM_SPEC_RUN_MODE (procedure->args[0]) || ! GIMP_IS_PARAM_SPEC_IMAGE (procedure->args[1]) || - ! (G_TYPE_FROM_INSTANCE (procedure->args[3]) - == GIMP_TYPE_PARAM_OBJECT_ARRAY)) + ! (G_TYPE_FROM_INSTANCE (procedure->args[2]) == GIMP_TYPE_PARAM_CORE_OBJECT_ARRAY)) { - required = "GimpRunMode, GimpImage, length, array of (GimpLayer | GimpDrawable)"; + required = "GimpRunMode, GimpImage, NULL-terminated array of (GimpLayer | GimpDrawable)"; goto failure; } else { - GimpParamSpecObjectArray *spec = GIMP_PARAM_SPEC_OBJECT_ARRAY (procedure->args[3]); - const gchar *type_name = g_type_name (spec->object_type); + GimpParamSpecCoreObjectArray *spec = GIMP_PARAM_SPEC_CORE_OBJECT_ARRAY (procedure->args[2]); + const gchar *type_name = g_type_name (spec->object_type); if (g_strcmp0 (type_name, "GimpDrawable") != 0 && g_strcmp0 (type_name, "GimpLayer") != 0) { - required = "GimpRunMode, GimpImage, length, array of (GimpLayer | GimpDrawable)"; + required = "GimpRunMode, GimpImage, NULL-terminated array of (GimpLayer | GimpDrawable)"; goto failure; } } @@ -696,21 +695,20 @@ gimp_plug_in_procedure_add_menu_path (GimpPlugInProcedure *proc, if ((procedure->num_args < 4) || ! GIMP_IS_PARAM_SPEC_RUN_MODE (procedure->args[0]) || ! GIMP_IS_PARAM_SPEC_IMAGE (procedure->args[1]) || - ! (G_TYPE_FROM_INSTANCE (procedure->args[3]) - == GIMP_TYPE_PARAM_OBJECT_ARRAY)) + ! (G_TYPE_FROM_INSTANCE (procedure->args[2]) == GIMP_TYPE_PARAM_CORE_OBJECT_ARRAY)) { - required = "GimpRunMode, GimpImage, length, array of (GimpChannel | GimpDrawable)"; + required = "GimpRunMode, GimpImage, NULL-terminated array of (GimpChannel | GimpDrawable)"; goto failure; } else { - GimpParamSpecObjectArray *spec = GIMP_PARAM_SPEC_OBJECT_ARRAY (procedure->args[3]); - const gchar *type_name = g_type_name (spec->object_type); + GimpParamSpecCoreObjectArray *spec = GIMP_PARAM_SPEC_CORE_OBJECT_ARRAY (procedure->args[2]); + const gchar *type_name = g_type_name (spec->object_type); if (g_strcmp0 (type_name, "GimpDrawable") != 0 && g_strcmp0 (type_name, "GimpChannel") != 0) { - required = "GimpRunMode, GimpImage, length, array of (GimpChannel | GimpDrawable)"; + required = "GimpRunMode, GimpImage, NULL-terminated array of (GimpChannel | GimpDrawable)"; goto failure; } } diff --git a/libgimp/gimp.def b/libgimp/gimp.def index d8f7dc96aa..e5c1ee3ea5 100644 --- a/libgimp/gimp.def +++ b/libgimp/gimp.def @@ -791,6 +791,9 @@ EXPORTS gimp_procedure_add_color_from_string_aux_argument gimp_procedure_add_color_from_string_return_value gimp_procedure_add_color_return_value + gimp_procedure_add_core_object_array_argument + gimp_procedure_add_core_object_array_aux_argument + gimp_procedure_add_core_object_array_return_value gimp_procedure_add_display_argument gimp_procedure_add_display_aux_argument gimp_procedure_add_display_return_value diff --git a/libgimp/gimpimageprocedure.c b/libgimp/gimpimageprocedure.c index 0838a7fe26..4865d62f5b 100644 --- a/libgimp/gimpimageprocedure.c +++ b/libgimp/gimpimageprocedure.c @@ -118,17 +118,11 @@ gimp_image_procedure_constructed (GObject *object) FALSE, G_PARAM_READWRITE); - gimp_procedure_add_int_argument (procedure, "num-drawables", - "Number of drawables", - "Number of input drawables", - 0, G_MAXINT, 1, - G_PARAM_READWRITE); - - gimp_procedure_add_object_array_argument (procedure, "drawables", - "Drawables", - "The input drawables", - GIMP_TYPE_DRAWABLE, - G_PARAM_READWRITE | GIMP_PARAM_NO_VALIDATE); + gimp_procedure_add_core_object_array_argument (procedure, "drawables", + "Drawables", + "The input drawables", + GIMP_TYPE_DRAWABLE, + G_PARAM_READWRITE | GIMP_PARAM_NO_VALIDATE); } static void @@ -142,7 +136,7 @@ gimp_image_procedure_finalize (GObject *object) G_OBJECT_CLASS (parent_class)->finalize (object); } -#define ARG_OFFSET 4 +#define ARG_OFFSET 3 static GimpValueArray * gimp_image_procedure_run (GimpProcedure *procedure, @@ -160,12 +154,12 @@ gimp_image_procedure_run (GimpProcedure *procedure, gint n_drawables; gint i; - run_mode = GIMP_VALUES_GET_ENUM (args, 0); - image = GIMP_VALUES_GET_IMAGE (args, 1); - n_drawables = GIMP_VALUES_GET_INT (args, 2); - drawables = GIMP_VALUES_GET_OBJECT_ARRAY (args, 3); + run_mode = GIMP_VALUES_GET_ENUM (args, 0); + image = GIMP_VALUES_GET_IMAGE (args, 1); + drawables = GIMP_VALUES_GET_CORE_OBJECT_ARRAY (args, 2); - remaining = gimp_value_array_new (gimp_value_array_length (args) - ARG_OFFSET); + n_drawables = gimp_core_object_array_get_length ((GObject **) drawables); + remaining = gimp_value_array_new (gimp_value_array_length (args) - ARG_OFFSET); for (i = ARG_OFFSET; i < gimp_value_array_length (args); i++) { diff --git a/libgimp/gimpprocedure-params.c b/libgimp/gimpprocedure-params.c index 322b1c7f32..9dede99427 100644 --- a/libgimp/gimpprocedure-params.c +++ b/libgimp/gimpprocedure-params.c @@ -1338,6 +1338,84 @@ gimp_procedure_add_string_array_return_value (GimpProcedure *procedure, G_TYPE_STRV, flags)); } +/** + * gimp_procedure_add_core_object_array_argument: + * @procedure: the #GimpProcedure. + * @name: the name of the argument to be created. + * @nick: the label used in #GimpProcedureDialog. + * @blurb: a more detailed help description. + * @object_type the type of object stored in the array + * @flags: argument flags. + * + * Add a new object array argument to @procedure. + * + * Since: 3.0 + **/ +void +gimp_procedure_add_core_object_array_argument (GimpProcedure *procedure, + const gchar *name, + const gchar *nick, + const gchar *blurb, + GType object_type, + GParamFlags flags) +{ + _gimp_procedure_add_argument (procedure, + gimp_param_spec_core_object_array (name, nick, blurb, + object_type, flags)); +} + +/** + * gimp_procedure_add_core_object_array_aux_argument: + * @procedure: the #GimpProcedure. + * @name: the name of the argument to be created. + * @nick: the label used in #GimpProcedureDialog. + * @blurb: a more detailed help description. + * @object_type the type of object stored in the array + * @flags: argument flags. + * + * Add a new object array auxiliary argument to @procedure. + * + * Since: 3.0 + **/ +void +gimp_procedure_add_core_object_array_aux_argument (GimpProcedure *procedure, + const gchar *name, + const gchar *nick, + const gchar *blurb, + GType object_type, + GParamFlags flags) +{ + _gimp_procedure_add_aux_argument (procedure, + gimp_param_spec_core_object_array (name, nick, blurb, + object_type, flags)); +} + +/** + * gimp_procedure_add_core_object_array_return_value: + * @procedure: the #GimpProcedure. + * @name: the name of the argument to be created. + * @nick: the label used in #GimpProcedureDialog. + * @blurb: a more detailed help description. + * @object_type the type of object stored in the array + * @flags: argument flags. + * + * Add a new object array return value to @procedure. + * + * Since: 3.0 + **/ +void +gimp_procedure_add_core_object_array_return_value (GimpProcedure *procedure, + const gchar *name, + const gchar *nick, + const gchar *blurb, + GType object_type, + GParamFlags flags) +{ + _gimp_procedure_add_return_value (procedure, + gimp_param_spec_core_object_array (name, nick, blurb, + object_type, flags)); +} + /** * gimp_procedure_add_object_array_argument: * @procedure: the #GimpProcedure. diff --git a/libgimp/gimpprocedure-params.h b/libgimp/gimpprocedure-params.h index 64004d8956..15655b6a69 100644 --- a/libgimp/gimpprocedure-params.h +++ b/libgimp/gimpprocedure-params.h @@ -228,6 +228,19 @@ G_BEGIN_DECLS /* object array */ +#define GIMP_VALUES_GET_CORE_OBJECT_ARRAY(args, n) \ + (gpointer) g_value_get_boxed (gimp_value_array_index (args, n)) + +#define GIMP_VALUES_DUP_CORE_OBJECT_ARRAY(args, n) \ + (gpointer) g_value_dup_boxed (gimp_value_array_index (args, n)) + +#define GIMP_VALUES_SET_CORE_OBJECT_ARRAY(args, n, value) \ + g_value_set_boxed (gimp_value_array_index (args, n), (gconstpointer) value) + +#define GIMP_VALUES_TAKE_CORE_OBJECT_ARRAY(args, n, value) \ + g_value_take_boxed (gimp_value_array_index (args, n), (gconstpointer) value) + + #define GIMP_VALUES_GET_OBJECT_ARRAY(args, n) \ (gpointer) gimp_value_get_object_array (gimp_value_array_index (args, n)) @@ -756,6 +769,25 @@ void gimp_procedure_add_string_array_return_value (GimpProcedure *procedure const gchar *blurb, GParamFlags flags); +void gimp_procedure_add_core_object_array_argument (GimpProcedure *procedure, + const gchar *name, + const gchar *nick, + const gchar *blurb, + GType object_type, + GParamFlags flags); +void gimp_procedure_add_core_object_array_aux_argument (GimpProcedure *procedure, + const gchar *name, + const gchar *nick, + const gchar *blurb, + GType object_type, + GParamFlags flags); +void gimp_procedure_add_core_object_array_return_value (GimpProcedure *procedure, + const gchar *name, + const gchar *nick, + const gchar *blurb, + GType object_type, + GParamFlags flags); + void gimp_procedure_add_object_array_argument (GimpProcedure *procedure, const gchar *name, const gchar *nick, diff --git a/libgimpconfig/gimpconfig-params.c b/libgimpconfig/gimpconfig-params.c index ab67c838c3..cc7c37bcdb 100644 --- a/libgimpconfig/gimpconfig-params.c +++ b/libgimpconfig/gimpconfig-params.c @@ -294,6 +294,14 @@ gimp_config_param_spec_duplicate (GParamSpec *pspec) flags); } } + else if (GIMP_IS_PARAM_SPEC_CORE_OBJECT_ARRAY (pspec)) + { + GimpParamSpecCoreObjectArray *spec = GIMP_PARAM_SPEC_CORE_OBJECT_ARRAY (pspec); + + copy = gimp_param_spec_core_object_array (name, nick, blurb, + spec->object_type, + flags); + } else if (GIMP_IS_PARAM_SPEC_OBJECT_ARRAY (pspec)) { GimpParamSpecObjectArray *spec = GIMP_PARAM_SPEC_OBJECT_ARRAY (pspec); diff --git a/plug-ins/common/file-gbr.c b/plug-ins/common/file-gbr.c index 64c87f8548..f37a816c2a 100644 --- a/plug-ins/common/file-gbr.c +++ b/plug-ins/common/file-gbr.c @@ -182,8 +182,7 @@ gbr_export (GimpProcedure *procedure, { GimpPDBStatusType status = GIMP_PDB_SUCCESS; GimpExportReturn export = GIMP_EXPORT_IGNORE; - GList *drawables; - gint n_drawables; + GimpLayer **layers; gchar *description; GError *error = NULL; @@ -217,14 +216,12 @@ gbr_export (GimpProcedure *procedure, } export = gimp_export_options_get_image (options, &image); - drawables = gimp_image_list_layers (image); - n_drawables = g_list_length (drawables); + layers = gimp_image_get_layers (image); if (status == GIMP_PDB_SUCCESS) { GimpProcedure *procedure; GimpValueArray *save_retvals; - GimpObjectArray *drawables_array; gint spacing; g_object_get (config, @@ -232,20 +229,16 @@ gbr_export (GimpProcedure *procedure, "spacing", &spacing, NULL); - drawables_array = gimp_object_array_new (GIMP_TYPE_DRAWABLE, (GObject **) drawables, - n_drawables, FALSE); procedure = gimp_pdb_lookup_procedure (gimp_get_pdb (), "file-gbr-export-internal"); save_retvals = gimp_procedure_run (procedure, - "image", image, - "num-drawables", n_drawables, - "drawables", drawables_array, - "file", file, - "spacing", spacing, - "name", description, + "image", image, + "drawables", (GimpDrawable **) layers, + "file", file, + "spacing", spacing, + "name", description, NULL); - gimp_object_array_free (drawables_array); g_free (description); if (GIMP_VALUES_GET_ENUM (save_retvals, 0) != GIMP_PDB_SUCCESS) @@ -264,7 +257,7 @@ gbr_export (GimpProcedure *procedure, if (export == GIMP_EXPORT_EXPORT) gimp_image_delete (image); - g_list_free (drawables); + g_free (layers); return gimp_procedure_new_return_values (procedure, status, error); } diff --git a/plug-ins/common/file-gih.c b/plug-ins/common/file-gih.c index 654a26475e..850153e14e 100644 --- a/plug-ins/common/file-gih.c +++ b/plug-ins/common/file-gih.c @@ -262,8 +262,7 @@ gih_export (GimpProcedure *procedure, { GimpPDBStatusType status = GIMP_PDB_SUCCESS; GimpExportReturn export = GIMP_EXPORT_IGNORE; - GList *layers = NULL; - gint n_drawables; + GimpLayer **layers = NULL; GimpParasite *parasite; GimpImage *orig_image; GError *error = NULL; @@ -397,9 +396,8 @@ gih_export (GimpProcedure *procedure, } } - export = gimp_export_options_get_image (options, &image); - layers = gimp_image_list_layers (image); - n_drawables = g_list_length (layers); + export = gimp_export_options_get_image (options, &image); + layers = gimp_image_get_layers (image); g_object_get (config, "spacing", &spacing, @@ -428,35 +426,22 @@ gih_export (GimpProcedure *procedure, if (status == GIMP_PDB_SUCCESS) { - GimpProcedure *procedure; - GimpValueArray *save_retvals; - GimpDrawable **drawables = NULL; - GimpObjectArray *drawables_array; - GList *iter; - gint i; - gchar *paramstring; + GimpProcedure *procedure; + GimpValueArray *save_retvals; + gchar *paramstring; paramstring = gimp_pixpipe_params_build (&gihparams); - drawables = g_new (GimpDrawable *, n_drawables); - for (iter = layers, i = 0; iter; iter = iter->next, i++) - drawables[i] = iter->data; - - drawables_array = gimp_object_array_new (GIMP_TYPE_DRAWABLE, (GObject **) drawables, - n_drawables, FALSE); procedure = gimp_pdb_lookup_procedure (gimp_get_pdb (), "file-gih-export-internal"); save_retvals = gimp_procedure_run (procedure, - "image", image, - "num-drawables", n_drawables, - "drawables", drawables_array, - "file", file, - "spacing", spacing, - "name", description, - "params", paramstring, + "image", image, + "drawables", (GimpDrawable **) layers, + "file", file, + "spacing", spacing, + "name", description, + "params", paramstring, NULL); - g_free (drawables); - gimp_object_array_free (drawables_array); if (GIMP_VALUES_GET_ENUM (save_retvals, 0) == GIMP_PDB_SUCCESS) { @@ -489,7 +474,7 @@ gih_export (GimpProcedure *procedure, if (export == GIMP_EXPORT_EXPORT) gimp_image_delete (image); - g_list_free (layers); + g_free (layers); return gimp_procedure_new_return_values (procedure, status, error); } diff --git a/plug-ins/common/file-pat.c b/plug-ins/common/file-pat.c index da25e1f2d1..40c864c389 100644 --- a/plug-ins/common/file-pat.c +++ b/plug-ins/common/file-pat.c @@ -161,8 +161,7 @@ pat_export (GimpProcedure *procedure, { GimpPDBStatusType status = GIMP_PDB_SUCCESS; GimpExportReturn export = GIMP_EXPORT_IGNORE; - GList *drawables; - gint n_drawables; + GimpLayer **layers; gchar *description; GError *error = NULL; @@ -196,16 +195,12 @@ pat_export (GimpProcedure *procedure, } export = gimp_export_options_get_image (options, &image); - drawables = gimp_image_list_layers (image); - n_drawables = g_list_length (drawables); + layers = gimp_image_get_layers (image); if (status == GIMP_PDB_SUCCESS) { GimpProcedure *procedure; GimpValueArray *save_retvals; - GimpObjectArray *drawables_array; - - drawables_array = gimp_object_array_new (GIMP_TYPE_DRAWABLE, (GObject **) drawables, n_drawables, FALSE); g_object_get (config, "description", &description, @@ -214,11 +209,10 @@ pat_export (GimpProcedure *procedure, procedure = gimp_pdb_lookup_procedure (gimp_get_pdb (), "file-pat-export-internal"); save_retvals = gimp_procedure_run (procedure, - "image", image, - "num-drawables", n_drawables, - "drawables", drawables_array, - "file", file, - "name", description, + "image", image, + "drawables", (GimpDrawable **) layers, + "file", file, + "name", description, NULL); if (GIMP_VALUES_GET_ENUM (save_retvals, 0) != GIMP_PDB_SUCCESS) @@ -232,13 +226,13 @@ pat_export (GimpProcedure *procedure, } gimp_value_array_unref (save_retvals); - gimp_object_array_free (drawables_array); } if (export == GIMP_EXPORT_EXPORT) gimp_image_delete (image); - g_list_free (drawables); + g_free (layers); + return gimp_procedure_new_return_values (procedure, status, error); } diff --git a/plug-ins/common/film.c b/plug-ins/common/film.c index 6608473427..cb4291fd20 100644 --- a/plug-ins/common/film.c +++ b/plug-ins/common/film.c @@ -240,11 +240,11 @@ film_create_procedure (GimpPlugIn *plug_in, /* Arguments ignored in interactive mode. */ - gimp_procedure_add_object_array_argument (procedure, "images", - "Images", - "Images to be used for film", - GIMP_TYPE_IMAGE, - G_PARAM_READWRITE); + gimp_procedure_add_core_object_array_argument (procedure, "images", + "Images", + "Images to be used for film", + GIMP_TYPE_IMAGE, + G_PARAM_READWRITE); /* The more specific settings. */ @@ -405,43 +405,43 @@ film_run (GimpProcedure *procedure, static GimpImage * film (GimpProcedureConfig *config) { - GimpObjectArray *images; - gint width, height; - guchar *hole; - gint film_height; - gint film_width; - gint picture_width; - gdouble picture_height; - gdouble picture_space; - gint picture_x0; - gint picture_y0; - gdouble hole_offset; - gdouble hole_width; - gdouble hole_height; - gdouble hole_space; - gint hole_x; - gdouble number_height; - gint num_pictures; - gint number_start; - gboolean at_top; - gboolean at_bottom; - gint picture_count; - GeglColor *number_color = NULL; - GeglColor *film_color = NULL; - gboolean keep_height; - gdouble f; - GimpImage *image_dst; - GimpImage *image_tmp; - GimpLayer *layer_src; - GimpLayer *layer_dst; - GimpLayer *new_layer; - GimpLayer *floating_sel; + GimpImage **images; + gint width, height; + guchar *hole; + gint film_height; + gint film_width; + gint picture_width; + gdouble picture_height; + gdouble picture_space; + gint picture_x0; + gint picture_y0; + gdouble hole_offset; + gdouble hole_width; + gdouble hole_height; + gdouble hole_space; + gint hole_x; + gdouble number_height; + gint num_pictures; + gint number_start; + gboolean at_top; + gboolean at_bottom; + gint picture_count; + GeglColor *number_color = NULL; + GeglColor *film_color = NULL; + gboolean keep_height; + gdouble f; + GimpImage *image_dst; + GimpImage *image_tmp; + GimpLayer *layer_src; + GimpLayer *layer_dst; + GimpLayer *new_layer; + GimpLayer *floating_sel; - GimpFont *number_font; + GimpFont *number_font; - GList *layers = NULL; - GList *iter2; - gint i; + GList *layers = NULL; + GList *iter2; + gint i; g_object_get (config, "images", &images, @@ -462,7 +462,7 @@ film (GimpProcedureConfig *config) "at-bottom", &at_bottom, NULL); - if (images->length <= 0) + if (images[0] == NULL) return NULL; if (film_color == NULL) @@ -484,9 +484,9 @@ film (GimpProcedureConfig *config) { gdouble max_height = 0; - for (i = 0; i < images->length; i++) + for (i = 0; images[i] != NULL; i++) { - GimpImage *image = GIMP_IMAGE (images->data[i]); + GimpImage *image = images[i]; height = gimp_image_get_height (image); if ((gdouble) height > max_height) @@ -505,9 +505,9 @@ film (GimpProcedureConfig *config) /* Calculate total film width */ film_width = 0; num_pictures = 0; - for (i = 0; i < images->length; i++) + for (i = 0; images[i] != NULL; i++) { - GimpImage *image = GIMP_IMAGE (images->data[i]); + GimpImage *image = images[i]; layers = gimp_image_list_layers (image); @@ -592,9 +592,9 @@ film (GimpProcedureConfig *config) /* Compose all images and layers */ picture_x0 = 0; picture_count = 0; - for (i = 0; i < images->length; i++) + for (i = 0; images[i] != NULL; i++) { - GimpImage *image = GIMP_IMAGE (images->data[i]); + GimpImage *image = images[i]; image_tmp = gimp_image_duplicate (image); width = gimp_image_get_width (image_tmp); @@ -663,7 +663,7 @@ film (GimpProcedureConfig *config) gimp_context_pop (); - gimp_object_array_free (images); + g_free (images); g_clear_object (&number_color); g_clear_object (&film_color); g_clear_object (&number_font); @@ -677,11 +677,11 @@ static gboolean check_filmvals (GimpProcedureConfig *config, GError **error) { - GimpFont *font = NULL; - GimpObjectArray *images; - gint film_height; - gint i, j; - gboolean success = FALSE; + GimpFont *font = NULL; + GimpImage **images; + gint film_height; + gint i, j; + gboolean success = FALSE; g_object_get (config, "images", &images, @@ -698,20 +698,20 @@ check_filmvals (GimpProcedureConfig *config, g_object_set (config, "number-font", gimp_context_get_font (), NULL); } - if (images != NULL) + if (images != NULL && images[0] != NULL) { - for (i = 0, j = 0; i < images->length; i++) + for (i = 0, j = 0; images[i] != NULL; i++) { - if (gimp_image_is_valid (GIMP_IMAGE (images->data[i]))) + if (gimp_image_is_valid (images[i])) { - images->data[j] = images->data[i]; + images[j] = images[i]; j++; } } if (j > 0) { - images->length = j; + images[j] = NULL; g_object_set (config, "images", images, NULL); @@ -719,11 +719,11 @@ check_filmvals (GimpProcedureConfig *config, } } - if (images == NULL || images->length == 0) + if (images == NULL || images[0] == NULL) g_set_error_literal (error, GIMP_PLUG_IN_ERROR, 0, _("\"Filmstrip\" cannot be run without any input images")); - gimp_object_array_free (images); + g_free (images); g_clear_object (&font); return success; @@ -1176,11 +1176,10 @@ film_dialog (GimpImage *image, if (run) { - GimpObjectArray *images_array; - GimpImage *images[MAX_FILM_PICTURES]; - gint num_images = 0; - gboolean iter_valid; - GtkTreeIter iter; + GimpImage *images[MAX_FILM_PICTURES + 1]; + gint num_images = 0; + gboolean iter_valid; + GtkTreeIter iter; for (iter_valid = gtk_tree_model_get_iter_first (filmint.image_list_film, &iter); @@ -1200,14 +1199,11 @@ film_dialog (GimpImage *image, num_images++; } } - - images_array = gimp_object_array_new (GIMP_TYPE_IMAGE, (GObject **) images, num_images, TRUE); + images[num_images] = NULL; g_object_set (config, - "images", images_array, + "images", images, NULL); - - gimp_object_array_free (images_array); } gtk_widget_destroy (dialog); diff --git a/plug-ins/common/guillotine.c b/plug-ins/common/guillotine.c index c8608f74ca..8b5f4b8839 100644 --- a/plug-ins/common/guillotine.c +++ b/plug-ins/common/guillotine.c @@ -125,17 +125,11 @@ guillotine_create_procedure (GimpPlugIn *plug_in, "Adam D. Moss (adam@foxbox.org)", "1998"); - gimp_procedure_add_int_return_value (procedure, "image-count", - "Number of images created", - "Number of images created", - 0, G_MAXINT, 0, - G_PARAM_READWRITE); - - gimp_procedure_add_object_array_return_value (procedure, "images", - "Output images", - "Output images", - GIMP_TYPE_IMAGE, - G_PARAM_READWRITE); + gimp_procedure_add_core_object_array_return_value (procedure, "images", + "Output images", + "Output images", + GIMP_TYPE_IMAGE, + G_PARAM_READWRITE); } return procedure; @@ -168,19 +162,18 @@ guillotine_run (GimpProcedure *procedure, image_list = guillotine (image, run_mode == GIMP_RUN_INTERACTIVE); num_images = g_list_length (image_list); - images = g_new (GimpImage *, num_images); + images = g_new0 (GimpImage *, num_images + 1); for (list = image_list, i = 0; list; list = g_list_next (list), i++) { - images[i] = g_object_ref (list->data); + images[i] = list->data; } g_list_free (image_list); - GIMP_VALUES_SET_INT (return_vals, 1, num_images); - GIMP_VALUES_TAKE_OBJECT_ARRAY (return_vals, 2, GIMP_TYPE_IMAGE, images, num_images); + GIMP_VALUES_TAKE_CORE_OBJECT_ARRAY (return_vals, 1, images); if (run_mode == GIMP_RUN_INTERACTIVE) gimp_displays_flush (); diff --git a/plug-ins/twain/twain.c b/plug-ins/twain/twain.c index 70cb1b8c32..39d6d9d515 100644 --- a/plug-ins/twain/twain.c +++ b/plug-ins/twain/twain.c @@ -216,17 +216,11 @@ twain_create_procedure (GimpPlugIn *plug_in, PLUG_IN_COPYRIGHT, PLUG_IN_VERSION); - gimp_procedure_add_int_return_value (procedure, "image-count", - "Number of acquired images", - "Number of acquired images", - 0, G_MAXINT, 0, - G_PARAM_READWRITE); - - gimp_procedure_add_object_array_return_value (procedure, "images", - "Array of acquired images", - "Array of acquired images", - GIMP_TYPE_IMAGE, - G_PARAM_READWRITE); + gimp_procedure_add_core_object_array_return_value (procedure, "images", + "Array of acquired images", + "Array of acquired images", + GIMP_TYPE_IMAGE, + G_PARAM_READWRITE); } return procedure; @@ -443,22 +437,20 @@ twain_run (GimpProcedure *procedure, */ num_images = g_list_length (image_list); - images = g_new (GimpImage *, num_images); + images = g_new0 (GimpImage *, num_images + 1); for (list = image_list, i = 0; list; list = g_list_next (list), i++) { - images[i] = g_object_ref (list->data); + images[i] = list->data; } g_list_free (image_list); /* Set return values */ - return_vals = gimp_procedure_new_return_values (procedure, status, - NULL); - GIMP_VALUES_SET_INT (return_vals, 1, num_images); - GIMP_VALUES_TAKE_OBJECT_ARRAY (return_vals, 2, GIMP_TYPE_IMAGE, images, num_images); + return_vals = gimp_procedure_new_return_values (procedure, status, NULL); + GIMP_VALUES_TAKE_CORE_OBJECT_ARRAY (return_vals, 1, images); return return_vals; }