diff --git a/app/pdb/gradient-cmds.c b/app/pdb/gradient-cmds.c index ba0b2ea8bd..1e45a2b673 100644 --- a/app/pdb/gradient-cmds.c +++ b/app/pdb/gradient-cmds.c @@ -215,8 +215,7 @@ gradient_get_custom_samples_invoker (GimpProcedure *procedure, gsize num_samples; const gdouble *positions; gboolean reverse; - gsize num_color_samples = 0; - gdouble *color_samples = NULL; + GeglColor **color_samples = NULL; gradient = g_value_get_object (gimp_value_array_index (args, 0)); positions = gimp_value_get_double_array (gimp_value_array_index (args, 1), &num_samples); @@ -226,30 +225,21 @@ gradient_get_custom_samples_invoker (GimpProcedure *procedure, { if (gradient) { - GimpGradientSegment *seg = NULL; - gdouble *sample; + GimpGradientSegment *seg = NULL; + GeglColor **sample; - num_color_samples = num_samples * 4; - - sample = color_samples = g_new0 (gdouble, num_color_samples); + sample = color_samples = g_new0 (GeglColor *, num_samples + 1); while (num_samples--) { - GeglColor *color = NULL; - seg = gimp_gradient_get_color_at (gradient, context, seg, *positions, reverse, GIMP_GRADIENT_BLEND_RGB_PERCEPTUAL, - &color); + sample); - if (color) - gegl_color_get_pixel (color, babl_format ("R'G'B'A double"), sample); - - sample += 4; + sample++; positions++; - - g_clear_object (&color); } } else @@ -260,7 +250,7 @@ gradient_get_custom_samples_invoker (GimpProcedure *procedure, error ? *error : NULL); if (success) - gimp_value_take_double_array (gimp_value_array_index (return_vals, 1), color_samples, num_color_samples); + g_value_take_boxed (gimp_value_array_index (return_vals, 1), color_samples); return return_vals; } @@ -1384,7 +1374,7 @@ register_gradient_procs (GimpPDB *pdb) "gimp-gradient-get-custom-samples"); gimp_procedure_set_static_help (procedure, "Sample the gradient in custom positions.", - "Samples the color of the gradient at positions from a list. The left endpoint of the gradient corresponds to position 0.0, and the right endpoint corresponds to 1.0. Returns a list of floating-point values, four for each sample (RGBA.)", + "Samples the color of the gradient at positions from a list. The left endpoint of the gradient corresponds to position 0.0, and the right endpoint corresponds to 1.0. Returns a list of colors, one for each sample.", NULL); gimp_procedure_set_static_attribution (procedure, "Federico Mena Quintero", @@ -1410,10 +1400,11 @@ register_gradient_procs (GimpPDB *pdb) FALSE, GIMP_PARAM_READWRITE)); gimp_procedure_add_return_value (procedure, - gimp_param_spec_double_array ("color-samples", - "color samples", - "Color samples: { R1, G1, B1, A1, ..., Rn, Gn, Bn, An }", - GIMP_PARAM_READWRITE)); + g_param_spec_boxed ("color-samples", + "color samples", + "Color samples", + GIMP_TYPE_COLOR_ARRAY, + GIMP_PARAM_READWRITE)); gimp_pdb_register_procedure (pdb, procedure); g_object_unref (procedure); diff --git a/libgimp/gimpgradient_pdb.c b/libgimp/gimpgradient_pdb.c index 50274bbe31..9281adbd0d 100644 --- a/libgimp/gimpgradient_pdb.c +++ b/libgimp/gimpgradient_pdb.c @@ -199,33 +199,30 @@ gimp_gradient_get_uniform_samples (GimpGradient *gradient, * @num_samples: The number of samples to take. * @positions: (array length=num_samples) (element-type gdouble): The list of positions to sample along the gradient. * @reverse: Use the reverse gradient. - * @num_color_samples: (out): Length of the color_samples array (4 * num_samples). - * @color_samples: (out) (array length=num_color_samples) (element-type gdouble) (transfer full): Color samples: { R1, G1, B1, A1, ..., Rn, Gn, Bn, An }. * * Sample the gradient in custom positions. * * Samples the color of the gradient at positions from a list. The left * endpoint of the gradient corresponds to position 0.0, and the right - * endpoint corresponds to 1.0. Returns a list of floating-point - * values, four for each sample (RGBA.) + * endpoint corresponds to 1.0. Returns a list of colors, one for each + * sample. * - * Returns: TRUE on success. + * Returns: (array zero-terminated=1) (transfer full): Color samples. + * The returned value must be freed with gimp_color_array_free(). * * Since: 2.2 **/ -gboolean -gimp_gradient_get_custom_samples (GimpGradient *gradient, - gsize num_samples, - const gdouble *positions, - gboolean reverse, - gsize *num_color_samples, - gdouble **color_samples) +GeglColor ** +gimp_gradient_get_custom_samples (GimpGradient *gradient, + gsize num_samples, + const gdouble *positions, + gboolean reverse) { GimpValueArray *args; GimpValueArray *return_vals; - gboolean success = TRUE; + GeglColor **color_samples = NULL; - g_return_val_if_fail (num_samples >= 1, FALSE); + g_return_val_if_fail (num_samples >= 1, NULL); args = gimp_value_array_new_from_types (NULL, GIMP_TYPE_GRADIENT, gradient, @@ -239,19 +236,12 @@ gimp_gradient_get_custom_samples (GimpGradient *gradient, args); gimp_value_array_unref (args); - *num_color_samples = 0; - *color_samples = NULL; - - success = GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS; - - if (success) - { - *color_samples = GIMP_VALUES_DUP_DOUBLE_ARRAY (return_vals, 1, num_color_samples); - } + if (GIMP_VALUES_GET_ENUM (return_vals, 0) == GIMP_PDB_SUCCESS) + color_samples = gimp_color_array_copy (g_value_get_boxed (gimp_value_array_index (return_vals, 1))); gimp_value_array_unref (return_vals); - return success; + return color_samples; } /** diff --git a/libgimp/gimpgradient_pdb.h b/libgimp/gimpgradient_pdb.h index 848fc75221..22bd32ad39 100644 --- a/libgimp/gimpgradient_pdb.h +++ b/libgimp/gimpgradient_pdb.h @@ -32,94 +32,92 @@ G_BEGIN_DECLS /* For information look into the C source or the html documentation */ -GimpGradient* gimp_gradient_new (const gchar *name); -GimpGradient* gimp_gradient_get_by_name (const gchar *name); -gint gimp_gradient_get_number_of_segments (GimpGradient *gradient); -GeglColor** gimp_gradient_get_uniform_samples (GimpGradient *gradient, - gint num_samples, - gboolean reverse); -gboolean gimp_gradient_get_custom_samples (GimpGradient *gradient, - gsize num_samples, - const gdouble *positions, - gboolean reverse, - gsize *num_color_samples, - gdouble **color_samples); -GeglColor* gimp_gradient_segment_get_left_color (GimpGradient *gradient, - gint segment); -gboolean gimp_gradient_segment_set_left_color (GimpGradient *gradient, - gint segment, - GeglColor *color); -GeglColor* gimp_gradient_segment_get_right_color (GimpGradient *gradient, - gint segment); -gboolean gimp_gradient_segment_set_right_color (GimpGradient *gradient, - gint segment, - GeglColor *color); -gboolean gimp_gradient_segment_get_left_pos (GimpGradient *gradient, - gint segment, - gdouble *pos); -gboolean gimp_gradient_segment_set_left_pos (GimpGradient *gradient, - gint segment, - gdouble pos, - gdouble *final_pos); -gboolean gimp_gradient_segment_get_middle_pos (GimpGradient *gradient, - gint segment, - gdouble *pos); -gboolean gimp_gradient_segment_set_middle_pos (GimpGradient *gradient, - gint segment, - gdouble pos, - gdouble *final_pos); -gboolean gimp_gradient_segment_get_right_pos (GimpGradient *gradient, - gint segment, - gdouble *pos); -gboolean gimp_gradient_segment_set_right_pos (GimpGradient *gradient, - gint segment, - gdouble pos, - gdouble *final_pos); -gboolean gimp_gradient_segment_get_blending_function (GimpGradient *gradient, - gint segment, - GimpGradientSegmentType *blend_func); -gboolean gimp_gradient_segment_get_coloring_type (GimpGradient *gradient, - gint segment, - GimpGradientSegmentColor *coloring_type); -gboolean gimp_gradient_segment_range_set_blending_function (GimpGradient *gradient, - gint start_segment, - gint end_segment, - GimpGradientSegmentType blending_function); -gboolean gimp_gradient_segment_range_set_coloring_type (GimpGradient *gradient, - gint start_segment, - gint end_segment, - GimpGradientSegmentColor coloring_type); -gboolean gimp_gradient_segment_range_flip (GimpGradient *gradient, - gint start_segment, - gint end_segment); -gboolean gimp_gradient_segment_range_replicate (GimpGradient *gradient, - gint start_segment, - gint end_segment, - gint replicate_times); -gboolean gimp_gradient_segment_range_split_midpoint (GimpGradient *gradient, - gint start_segment, - gint end_segment); -gboolean gimp_gradient_segment_range_split_uniform (GimpGradient *gradient, - gint start_segment, - gint end_segment, - gint split_parts); -gboolean gimp_gradient_segment_range_delete (GimpGradient *gradient, - gint start_segment, - gint end_segment); -gboolean gimp_gradient_segment_range_redistribute_handles (GimpGradient *gradient, - gint start_segment, - gint end_segment); -gboolean gimp_gradient_segment_range_blend_colors (GimpGradient *gradient, - gint start_segment, - gint end_segment); -gboolean gimp_gradient_segment_range_blend_opacity (GimpGradient *gradient, - gint start_segment, - gint end_segment); -gdouble gimp_gradient_segment_range_move (GimpGradient *gradient, - gint start_segment, - gint end_segment, - gdouble delta, - gboolean control_compress); +GimpGradient* gimp_gradient_new (const gchar *name); +GimpGradient* gimp_gradient_get_by_name (const gchar *name); +gint gimp_gradient_get_number_of_segments (GimpGradient *gradient); +GeglColor** gimp_gradient_get_uniform_samples (GimpGradient *gradient, + gint num_samples, + gboolean reverse); +GeglColor** gimp_gradient_get_custom_samples (GimpGradient *gradient, + gsize num_samples, + const gdouble *positions, + gboolean reverse); +GeglColor* gimp_gradient_segment_get_left_color (GimpGradient *gradient, + gint segment); +gboolean gimp_gradient_segment_set_left_color (GimpGradient *gradient, + gint segment, + GeglColor *color); +GeglColor* gimp_gradient_segment_get_right_color (GimpGradient *gradient, + gint segment); +gboolean gimp_gradient_segment_set_right_color (GimpGradient *gradient, + gint segment, + GeglColor *color); +gboolean gimp_gradient_segment_get_left_pos (GimpGradient *gradient, + gint segment, + gdouble *pos); +gboolean gimp_gradient_segment_set_left_pos (GimpGradient *gradient, + gint segment, + gdouble pos, + gdouble *final_pos); +gboolean gimp_gradient_segment_get_middle_pos (GimpGradient *gradient, + gint segment, + gdouble *pos); +gboolean gimp_gradient_segment_set_middle_pos (GimpGradient *gradient, + gint segment, + gdouble pos, + gdouble *final_pos); +gboolean gimp_gradient_segment_get_right_pos (GimpGradient *gradient, + gint segment, + gdouble *pos); +gboolean gimp_gradient_segment_set_right_pos (GimpGradient *gradient, + gint segment, + gdouble pos, + gdouble *final_pos); +gboolean gimp_gradient_segment_get_blending_function (GimpGradient *gradient, + gint segment, + GimpGradientSegmentType *blend_func); +gboolean gimp_gradient_segment_get_coloring_type (GimpGradient *gradient, + gint segment, + GimpGradientSegmentColor *coloring_type); +gboolean gimp_gradient_segment_range_set_blending_function (GimpGradient *gradient, + gint start_segment, + gint end_segment, + GimpGradientSegmentType blending_function); +gboolean gimp_gradient_segment_range_set_coloring_type (GimpGradient *gradient, + gint start_segment, + gint end_segment, + GimpGradientSegmentColor coloring_type); +gboolean gimp_gradient_segment_range_flip (GimpGradient *gradient, + gint start_segment, + gint end_segment); +gboolean gimp_gradient_segment_range_replicate (GimpGradient *gradient, + gint start_segment, + gint end_segment, + gint replicate_times); +gboolean gimp_gradient_segment_range_split_midpoint (GimpGradient *gradient, + gint start_segment, + gint end_segment); +gboolean gimp_gradient_segment_range_split_uniform (GimpGradient *gradient, + gint start_segment, + gint end_segment, + gint split_parts); +gboolean gimp_gradient_segment_range_delete (GimpGradient *gradient, + gint start_segment, + gint end_segment); +gboolean gimp_gradient_segment_range_redistribute_handles (GimpGradient *gradient, + gint start_segment, + gint end_segment); +gboolean gimp_gradient_segment_range_blend_colors (GimpGradient *gradient, + gint start_segment, + gint end_segment); +gboolean gimp_gradient_segment_range_blend_opacity (GimpGradient *gradient, + gint start_segment, + gint end_segment); +gdouble gimp_gradient_segment_range_move (GimpGradient *gradient, + gint start_segment, + gint end_segment, + gdouble delta, + gboolean control_compress); G_END_DECLS diff --git a/pdb/groups/gradient.pdb b/pdb/groups/gradient.pdb index 16d721ab7b..f265149d8c 100644 --- a/pdb/groups/gradient.pdb +++ b/pdb/groups/gradient.pdb @@ -196,7 +196,7 @@ sub gradient_get_custom_samples { Samples the color of the gradient at positions from a list. The left endpoint of the gradient corresponds to position 0.0, and the right endpoint corresponds to 1.0. -Returns a list of floating-point values, four for each sample (RGBA.) +Returns a list of colors, one for each sample. HELP &federico_pdb_misc('1997', '2.2'); @@ -212,10 +212,8 @@ HELP ); @outargs = ( - { name => 'color_samples', type => 'doublearray', void_ret => 1, - desc => 'Color samples: { R1, G1, B1, A1, ..., Rn, Gn, Bn, An }', - array => { desc => 'Length of the color_samples array (4 * - num_samples)' } } + { name => 'color_samples', type => 'colorarray', + desc => 'Color samples' } ); %invoke = ( @@ -223,30 +221,21 @@ HELP { if (gradient) { - GimpGradientSegment *seg = NULL; - gdouble *sample; + GimpGradientSegment *seg = NULL; + GeglColor **sample; - num_color_samples = num_samples * 4; - - sample = color_samples = g_new0 (gdouble, num_color_samples); + sample = color_samples = g_new0 (GeglColor *, num_samples + 1); while (num_samples--) { - GeglColor *color = NULL; - seg = gimp_gradient_get_color_at (gradient, context, seg, *positions, reverse, GIMP_GRADIENT_BLEND_RGB_PERCEPTUAL, - &color); + sample); - if (color) - gegl_color_get_pixel (color, babl_format ("R'G'B'A double"), sample); - - sample += 4; + sample++; positions++; - - g_clear_object (&color); } } else