app, libgimp*, pdb, plug-ins: change itemarray PDB type to use GimpCoreObjectArray.

This commit is contained in:
Jehan 2024-10-21 23:57:10 +02:00
parent 38c2cd3b15
commit 318f7451cd
11 changed files with 85 additions and 104 deletions

View file

@ -464,7 +464,6 @@ item_get_children_invoker (GimpProcedure *procedure,
gboolean success = TRUE; gboolean success = TRUE;
GimpValueArray *return_vals; GimpValueArray *return_vals;
GimpItem *item; GimpItem *item;
gint num_children = 0;
GimpItem **children = NULL; GimpItem **children = NULL;
item = g_value_get_object (gimp_value_array_index (args, 0)); item = g_value_get_object (gimp_value_array_index (args, 0));
@ -475,36 +474,29 @@ item_get_children_invoker (GimpProcedure *procedure,
if (container) if (container)
{ {
num_children = gimp_container_get_n_children (container); gsize num_children = gimp_container_get_n_children (container);
if (num_children)
{
GList *list; GList *list;
gint i; gint i;
children = g_new (GimpItem *, num_children); children = g_new0 (GimpItem *, num_children + 1);
for (list = GIMP_LIST (container)->queue->head, i = 0; for (list = GIMP_LIST (container)->queue->head, i = 0;
list; list; list = g_list_next (list), i++)
list = g_list_next (list), i++)
{ {
children[i] = g_object_ref (list->data); children[i] = list->data;
}
} }
} }
else else
{
success = FALSE; success = FALSE;
}
} }
return_vals = gimp_procedure_get_return_values (procedure, success, return_vals = gimp_procedure_get_return_values (procedure, success,
error ? *error : NULL); error ? *error : NULL);
if (success) if (success)
{ g_value_take_boxed (gimp_value_array_index (return_vals, 1), children);
g_value_set_int (gimp_value_array_index (return_vals, 1), num_children);
gimp_value_take_object_array (gimp_value_array_index (return_vals, 2), GIMP_TYPE_ITEM, (GObject **) children, num_children);
}
return return_vals; return return_vals;
} }
@ -1485,13 +1477,7 @@ register_item_procs (GimpPDB *pdb)
FALSE, FALSE,
GIMP_PARAM_READWRITE)); GIMP_PARAM_READWRITE));
gimp_procedure_add_return_value (procedure, gimp_procedure_add_return_value (procedure,
g_param_spec_int ("num-children", gimp_param_spec_core_object_array ("children",
"num children",
"The item's number of children",
0, G_MAXINT32, 0,
GIMP_PARAM_READWRITE));
gimp_procedure_add_return_value (procedure,
gimp_param_spec_object_array ("children",
"children", "children",
"The item's list of children", "The item's list of children",
GIMP_TYPE_ITEM, GIMP_TYPE_ITEM,

View file

@ -373,13 +373,13 @@ GList *
gimp_item_list_children (GimpItem *item) gimp_item_list_children (GimpItem *item)
{ {
GimpItem **children; GimpItem **children;
gint num_children;
GList *list = NULL; GList *list = NULL;
gint i; gint i;
children = gimp_item_get_children (item, &num_children); children = gimp_item_get_children (item);
for (i = 0; i < num_children; i++) if (children)
for (i = 0; children[i] != NULL; i++)
list = g_list_prepend (list, children[i]); list = g_list_prepend (list, children[i]);
g_free (children); g_free (children);

View file

@ -560,22 +560,19 @@ gimp_item_get_parent (GimpItem *item)
/** /**
* gimp_item_get_children: * gimp_item_get_children:
* @item: The item. * @item: The item.
* @num_children: (out): The item's number of children.
* *
* Returns the item's list of children. * Returns the item's list of children.
* *
* This procedure returns the list of items which are children of the * This procedure returns the list of items which are children of the
* specified item. The order is topmost to bottommost. * specified item. The order is topmost to bottommost.
* *
* Returns: (array length=num_children) (element-type GimpItem) (transfer container): * Returns: (element-type GimpItem) (array zero-terminated=1) (transfer container):
* The item's list of children. * The item's list of children.
* The returned value must be freed with g_free().
* *
* Since: 2.8 * Since: 2.8
**/ **/
GimpItem ** GimpItem **
gimp_item_get_children (GimpItem *item, gimp_item_get_children (GimpItem *item)
gint *num_children)
{ {
GimpValueArray *args; GimpValueArray *args;
GimpValueArray *return_vals; GimpValueArray *return_vals;
@ -590,13 +587,8 @@ gimp_item_get_children (GimpItem *item,
args); args);
gimp_value_array_unref (args); gimp_value_array_unref (args);
*num_children = 0;
if (GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS) if (GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS)
{ children = g_value_dup_boxed (gimp_value_array_index (return_vals, 1));
*num_children = GIMP_VALUES_GET_INT (return_vals, 1);
{ GimpObjectArray *a = g_value_get_boxed (gimp_value_array_index (return_vals, 2)); if (a) children = g_memdup2 (a->data, a->length * sizeof (gpointer)); };
}
gimp_value_array_unref (return_vals); gimp_value_array_unref (return_vals);

View file

@ -45,8 +45,7 @@ GimpImage* gimp_item_get_image (GimpItem *item);
gboolean gimp_item_delete (GimpItem *item); gboolean gimp_item_delete (GimpItem *item);
gboolean gimp_item_is_group (GimpItem *item); gboolean gimp_item_is_group (GimpItem *item);
GimpItem* gimp_item_get_parent (GimpItem *item); GimpItem* gimp_item_get_parent (GimpItem *item);
GimpItem** gimp_item_get_children (GimpItem *item, GimpItem** gimp_item_get_children (GimpItem *item);
gint *num_children);
gboolean gimp_item_get_expanded (GimpItem *item); gboolean gimp_item_get_expanded (GimpItem *item);
gboolean gimp_item_set_expanded (GimpItem *item, gboolean gimp_item_set_expanded (GimpItem *item,
gboolean expanded); gboolean expanded);

View file

@ -38,6 +38,7 @@ EXPORTS
gimp_component_type_get_type gimp_component_type_get_type
gimp_convert_palette_type_get_type gimp_convert_palette_type_get_type
gimp_convolve_type_get_type gimp_convolve_type_get_type
gimp_core_object_array_get_length
gimp_core_object_array_get_type gimp_core_object_array_get_type
gimp_cpu_accel_get_support gimp_cpu_accel_get_support
gimp_cpu_accel_set_use gimp_cpu_accel_set_use

View file

@ -870,7 +870,6 @@ gimp_color_array_get_length (GimpColorArray array)
*/ */
static GimpCoreObjectArray gimp_core_object_array_copy (GimpCoreObjectArray array); static GimpCoreObjectArray gimp_core_object_array_copy (GimpCoreObjectArray array);
static gsize gimp_core_object_array_get_length (GimpCoreObjectArray array);
GType GType
gimp_core_object_array_get_type (void) gimp_core_object_array_get_type (void)
@ -890,6 +889,23 @@ gimp_core_object_array_get_type (void)
return static_g_define_type_id; return static_g_define_type_id;
} }
/**
* gimp_core_object_array_get_length:
* @array: a %NULL-terminated array of objects.
*
* Returns: the number of [class@GObject.Object] in @array.
**/
gsize
gimp_core_object_array_get_length (GObject **array)
{
gsize length = 0;
while (array && array[length] != NULL)
length++;
return length;
}
/** /**
* gimp_core_object_array_copy: * gimp_core_object_array_copy:
* @array: an array of core_objects. * @array: an array of core_objects.
@ -918,23 +934,6 @@ gimp_core_object_array_copy (GimpCoreObjectArray array)
return copy; return copy;
} }
/**
* gimp_core_object_array_get_length:
* @array: an array of core_objects.
*
* Returns: the number of [class@GObject.Object] in @array.
**/
static gsize
gimp_core_object_array_get_length (GimpCoreObjectArray array)
{
gsize length = 0;
while (array && array[length] != NULL)
length++;
return length;
}
/* /*
* GIMP_TYPE_PARAM_CORE_OBJECT_ARRAY * GIMP_TYPE_PARAM_CORE_OBJECT_ARRAY

View file

@ -359,7 +359,8 @@ gint gimp_color_array_get_length (GimpColorArray array);
* The reason of existence for this alias is to have common arrays of * The reason of existence for this alias is to have common arrays of
* objects as a boxed type easy to use as plug-in's procedure argument. * objects as a boxed type easy to use as plug-in's procedure argument.
* *
* You should never have to interact with this type directly. * You should never have to interact with this type directly, though
* [func@Gimp.core_object_array_get_length] might be convenient.
* *
* Since: 3.0 * Since: 3.0
*/ */
@ -369,6 +370,7 @@ typedef GObject** GimpCoreObjectArray;
#define GIMP_VALUE_HOLDS_CORE_OBJECT_ARRAY(value) (G_TYPE_CHECK_VALUE_TYPE ((value), GIMP_TYPE_CORE_OBJECT_ARRAY)) #define GIMP_VALUE_HOLDS_CORE_OBJECT_ARRAY(value) (G_TYPE_CHECK_VALUE_TYPE ((value), GIMP_TYPE_CORE_OBJECT_ARRAY))
GType gimp_core_object_array_get_type (void) G_GNUC_CONST; GType gimp_core_object_array_get_type (void) G_GNUC_CONST;
gsize gimp_core_object_array_get_length (GObject **array);
/* /*

View file

@ -691,7 +691,7 @@ CODE
} }
elsif ($pdbtype eq 'itemarray') { elsif ($pdbtype eq 'itemarray') {
$pspec = <<CODE; $pspec = <<CODE;
gimp_param_spec_object_array ("$name", gimp_param_spec_core_object_array ("$name",
"$nick", "$nick",
"$blurb", "$blurb",
GIMP_TYPE_ITEM, GIMP_TYPE_ITEM,

View file

@ -491,9 +491,7 @@ HELP
@outargs = ( @outargs = (
{ name => 'children', type => 'itemarray', { name => 'children', type => 'itemarray',
desc => "The item's list of children", desc => "The item's list of children" }
array => { name => 'num_children',
desc => "The item's number of children" } }
); );
%invoke = ( %invoke = (
@ -503,26 +501,22 @@ HELP
if (container) if (container)
{ {
num_children = gimp_container_get_n_children (container); gsize num_children = gimp_container_get_n_children (container);
if (num_children)
{
GList *list; GList *list;
gint i; gint i;
children = g_new (GimpItem *, num_children); children = g_new0 (GimpItem *, num_children + 1);
for (list = GIMP_LIST (container)->queue->head, i = 0; for (list = GIMP_LIST (container)->queue->head, i = 0;
list; list; list = g_list_next (list), i++)
list = g_list_next (list), i++)
{ {
children[i] = g_object_ref (list->data); children[i] = list->data;
}
} }
} }
else else
{
success = FALSE; success = FALSE;
}
} }
CODE CODE
); );

View file

@ -123,17 +123,16 @@ package Gimp::CodeGen::pdb;
take_value_func => 'gimp_value_take_object_array ($value, GIMP_TYPE_IMAGE, (GObject **) $var, $var_len)' }, take_value_func => 'gimp_value_take_object_array ($value, GIMP_TYPE_IMAGE, (GObject **) $var, $var_len)' },
itemarray => { name => 'ITEMARRAY', itemarray => { name => 'ITEMARRAY',
gtype => 'GIMP_TYPE_OBJECT_ARRAY', gtype => 'GIMP_TYPE_CORE_OBJECT_ARRAY',
type => 'GimpItem **', type => 'GimpItem **',
const_type => 'const GimpItem **', const_type => 'const GimpItem **',
array => 1,
init_value => 'NULL', init_value => 'NULL',
in_annotate => '(element-type GimpItem)', in_annotate => '(element-type GimpItem) (array zero-terminated=1)',
out_annotate => '(element-type GimpItem) (transfer container)', out_annotate => '(element-type GimpItem) (array zero-terminated=1) (transfer container)',
get_value_func => '$var = (const GimpItem **) gimp_value_get_object_array ($value)', get_value_func => '$var = g_value_get_boxed ($value)',
dup_value_func => '{ GimpObjectArray *a = g_value_get_boxed (gimp_value_array_index ($value)); if (a) $var = g_memdup2 (a->data, a->length * sizeof (gpointer)); }', dup_value_func => '$var = g_value_dup_boxed (gimp_value_array_index ($value))',
set_value_func => 'gimp_value_set_object_array ($value, GIMP_TYPE_ITEM, (GObject **) $var, $var_len)', set_value_func => 'g_value_set_boxed ($value, $var)',
take_value_func => 'gimp_value_take_object_array ($value, GIMP_TYPE_ITEM, (GObject **) $var, $var_len)' }, take_value_func => 'g_value_take_boxed ($value, $var)' },
drawablearray => { name => 'DRAWABLEARRAY', drawablearray => { name => 'DRAWABLEARRAY',
gtype => 'GIMP_TYPE_CORE_OBJECT_ARRAY', gtype => 'GIMP_TYPE_CORE_OBJECT_ARRAY',

View file

@ -944,8 +944,15 @@ gui_single (GimpProcedure *procedure,
/* Enable "layers-as-pages" if more than one layer, or there's a single /* Enable "layers-as-pages" if more than one layer, or there's a single
* layer group has more than one layer */ * layer group has more than one layer */
layers = gimp_image_get_layers (multi_page.images[0], &n_layers); layers = gimp_image_get_layers (multi_page.images[0], &n_layers);
if (n_layers == 1 && gimp_item_is_group (GIMP_ITEM (layers[0]))) if (n_layers == 1 && gimp_item_is_group (GIMP_ITEM (layers[0])))
g_free (gimp_item_get_children (GIMP_ITEM (layers[0]), &n_layers)); {
GimpItem **children;
children = gimp_item_get_children (GIMP_ITEM (layers[0]));
n_layers = gimp_core_object_array_get_length ((GObject **) children);
g_free (children);
}
g_free (layers); g_free (layers);
gtk_widget_set_sensitive (widget, n_layers > 1); gtk_widget_set_sensitive (widget, n_layers > 1);
@ -1853,11 +1860,13 @@ draw_layer (GimpLayer **layers,
if (gimp_item_is_group (GIMP_ITEM (layer))) if (gimp_item_is_group (GIMP_ITEM (layer)))
{ {
GimpItem **children; GimpItem **children;
gint children_num; gint children_num = 0;
gint i; gint i;
children = gimp_item_get_children (GIMP_ITEM (layer), &children_num); children = gimp_item_get_children (GIMP_ITEM (layer));
for (i = 0; i < children_num; i++) children_num = gimp_core_object_array_get_length ((GObject **) children);
for (i = 0; children[i] != NULL; i++)
{ {
if (! draw_layer ((GimpLayer **) children, children_num, if (! draw_layer ((GimpLayer **) children, children_num,
config, single_image, i, config, single_image, i,