diff options
Diffstat (limited to 'pdb/groups/gradient.pdb')
-rw-r--r-- | pdb/groups/gradient.pdb | 1488 |
1 files changed, 1488 insertions, 0 deletions
diff --git a/pdb/groups/gradient.pdb b/pdb/groups/gradient.pdb new file mode 100644 index 0000000..3e44257 --- /dev/null +++ b/pdb/groups/gradient.pdb @@ -0,0 +1,1488 @@ +# GIMP - The GNU Image Manipulation Program +# Copyright (C) 1995 Spencer Kimball and Peter Mattis + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +sub gradient_new { + $blurb = 'Creates a new gradient'; + $help = 'This procedure creates a new, uninitialized gradient'; + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The requested name of the new gradient' } + ); + + @outargs = ( + { name => 'actual_name', type => 'string', + desc => 'The actual new gradient name' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpData *data = gimp_data_factory_data_new (gimp->gradient_factory, + context, name); + + if (data) + actual_name = g_strdup (gimp_object_get_name (data)); + else + success = FALSE; +} +CODE + ); +} + +sub gradient_duplicate { + $blurb = 'Duplicates a gradient'; + $help = 'This procedure creates an identical gradient by a different name'; + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' } + ); + + @outargs = ( + { name => 'copy_name', type => 'string', + desc => "The name of the gradient's copy" } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient = gimp_pdb_get_gradient (gimp, name, GIMP_PDB_DATA_ACCESS_READ, error); + + if (gradient) + { + GimpGradient *gradient_copy = (GimpGradient *) + gimp_data_factory_data_duplicate (gimp->gradient_factory, + GIMP_DATA (gradient)); + + if (gradient_copy) + copy_name = g_strdup (gimp_object_get_name (gradient_copy)); + else + success = FALSE; + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_is_editable { + $blurb = 'Tests if gradient can be edited'; + $help = 'Returns TRUE if you have permission to change the gradient'; + + &bill_pdb_misc('2004', '2.4'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' } + ); + + @outargs = ( + { name => 'editable', type => 'boolean', + desc => 'TRUE if the gradient can be edited' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient = gimp_pdb_get_gradient (gimp, name, GIMP_PDB_DATA_ACCESS_READ, error); + + if (gradient) + editable = gimp_data_is_writable (GIMP_DATA (gradient)); + else + success = FALSE; +} +CODE + ); +} + +sub gradient_rename { + $blurb = 'Rename a gradient'; + $help = 'This procedure renames a gradient'; + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'new_name', type => 'string', non_empty => 1, + desc => 'The new name of the gradient' } + ); + + @outargs = ( + { name => 'actual_name', type => 'string', + desc => 'The actual new name of the gradient' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient = gimp_pdb_get_gradient (gimp, name, GIMP_PDB_DATA_ACCESS_RENAME, error); + + if (gradient) + { + gimp_object_set_name (GIMP_OBJECT (gradient), new_name); + actual_name = g_strdup (gimp_object_get_name (gradient)); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_delete { + $blurb = 'Deletes a gradient'; + $help = 'This procedure deletes a gradient'; + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient = gimp_pdb_get_gradient (gimp, name, GIMP_PDB_DATA_ACCESS_READ, error); + + if (gradient && gimp_data_is_deletable (GIMP_DATA (gradient))) + success = gimp_data_factory_data_delete (gimp->gradient_factory, + GIMP_DATA (gradient), + TRUE, error); + else + success = FALSE; +} +CODE + ); +} + +sub gradient_get_number_of_segments { + $blurb = 'Returns the number of segments of the specified gradient'; + + $help = <<'HELP'; +This procedure returns the number of segments of the specified gradient. +HELP + + $author = 'Lars-Peter Clausen <lars@metafoo.de>'; + $copyright = 'Lars-Peter Clausen'; + $date = '2008'; + $since = '2.6'; + + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' } + ); + + @outargs = ( + { name => 'num_segments', type => 'int32', + init => 0, desc => 'Number of segments' } + ); + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *seg; + + gradient = gimp_pdb_get_gradient (gimp, name, GIMP_PDB_DATA_ACCESS_READ, error); + + if (gradient) + { + for (seg = gradient->segments; seg; seg = seg->next) + num_segments++; + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_get_uniform_samples { + $blurb = 'Sample the specified in uniform parts.'; + + $help = <<'HELP'; +This procedure samples the active gradient in the +specified number of uniform parts. It returns a list of floating-point values +which correspond to the RGBA values for each sample. The minimum number of +samples to take is 2, in which case the returned colors will correspond to the +{ 0.0, 1.0 } positions in the gradient. For example, if the number of samples +is 3, the procedure will return the colors at positions { 0.0, 0.5, 1.0 }. +HELP + + &federico_pdb_misc('1997', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'num_samples', type => '2 <= int32', + desc => 'The number of samples to take' }, + { name => 'reverse', type => 'boolean', + desc => 'Use the reverse gradient' } + ); + + @outargs = ( + { name => 'color_samples', type => 'floatarray', 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)' } } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient = gimp_pdb_get_gradient (gimp, name, + GIMP_PDB_DATA_ACCESS_READ, + error); + + if (gradient) + { + GimpGradientSegment *seg = NULL; + gdouble pos = 0.0; + gdouble delta = 1.0 / (num_samples - 1); + gdouble *sample; + + num_color_samples = num_samples * 4; + + sample = color_samples = g_new (gdouble, num_color_samples); + + while (num_samples--) + { + GimpRGB color; + + seg = gimp_gradient_get_color_at (gradient, context, seg, + pos, reverse, + GIMP_GRADIENT_BLEND_RGB_PERCEPTUAL, + &color); + + *sample++ = color.r; + *sample++ = color.g; + *sample++ = color.b; + *sample++ = color.a; + + pos += delta; + } + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_get_custom_samples { + $blurb = 'Sample the specified gradient in custom positions.'; + + $help = <<'HELP'; +This procedure samples the active gradient in the specified number of +points. The procedure will sample the gradient in the specified +positions from the list. The left endpoint of the gradient corresponds +to position 0.0, and the right endpoint corresponds to 1.0. The +procedure returns a list of floating-point values which correspond to +the RGBA values for each sample. +HELP + + &federico_pdb_misc('1997', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'positions', type => 'floatarray', + desc => 'The list of positions to sample along the gradient', + array => { name => 'num_samples', type => '1 <= int32', + desc => 'The number of samples to take' } }, + { name => 'reverse', type => 'boolean', + desc => 'Use the reverse gradient' } + ); + + @outargs = ( + { name => 'color_samples', type => 'floatarray', 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)' } } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient = gimp_pdb_get_gradient (gimp, name, + GIMP_PDB_DATA_ACCESS_READ, + error); + + if (gradient) + { + GimpGradientSegment *seg = NULL; + gdouble *sample; + + num_color_samples = num_samples * 4; + + sample = color_samples = g_new (gdouble, num_color_samples); + + while (num_samples--) + { + GimpRGB color; + + seg = gimp_gradient_get_color_at (gradient, context, + seg, *positions, + reverse, + GIMP_GRADIENT_BLEND_RGB_PERCEPTUAL, + &color); + + *sample++ = color.r; + *sample++ = color.g; + *sample++ = color.b; + *sample++ = color.a; + + positions++; + } + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_get_left_color { + $blurb = 'Retrieves the left endpoint color of the specified segment'; + + $help = <<'HELP'; +This procedure retrieves the left endpoint color of the specified segment of +the specified gradient. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'segment', type => '0 <= int32', + desc => 'The index of the segment within the gradient' } + ); + + @outargs = ( + { name => 'color', type => 'color', void_ret => 1, + desc => 'The return color' }, + { name => 'opacity', type => 'float', + desc => 'The opacity of the endpoint' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *seg; + + gradient = gradient_get (gimp, name, GIMP_PDB_DATA_ACCESS_READ, segment, + &seg, error); + + if (seg) + { + gimp_gradient_segment_get_left_color (gradient, seg, &color); + opacity = color.a * 100.0; + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_get_right_color { + $blurb = 'Retrieves the right endpoint color of the specified segment'; + + $help = <<'HELP'; +This procedure retrieves the right endpoint color of the specified segment of +the specified gradient. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'segment', type => '0 <= int32', + desc => 'The index of the segment within the gradient' } + ); + + @outargs = ( + { name => 'color', type => 'color', void_ret => 1, + desc => 'The return color' }, + { name => 'opacity', type => 'float', + desc => 'The opacity of the endpoint' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *seg; + + gradient = gradient_get (gimp, name, GIMP_PDB_DATA_ACCESS_READ, segment, + &seg, error); + + if (seg) + { + gimp_gradient_segment_get_right_color (gradient, seg, &color); + opacity = color.a * 100.0; + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_set_left_color { + $blurb = 'Sets the left endpoint color of the specified segment'; + + $help = <<'HELP'; +This procedure sets the left endpoint color of the specified segment of +the specified gradient. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'segment', type => '0 <= int32', + desc => 'The index of the segment within the gradient' }, + { name => 'color', type => 'color', + desc => 'The color to set' }, + { name => 'opacity', type => '0 <= float <= 100.0', + desc => 'The opacity to set for the endpoint' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *seg; + + gradient = gradient_get (gimp, name, GIMP_PDB_DATA_ACCESS_WRITE, segment, + &seg, error); + + if (seg) + { + color.a = opacity / 100.0; + gimp_gradient_segment_set_left_color (gradient, seg, &color); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_set_right_color { + $blurb = 'Sets the right endpoint color of the specified segment'; + + $help = <<'HELP'; +This procedure sets the right endpoint color of the specified segment of +the specified gradient. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'segment', type => '0 <= int32', + desc => 'The index of the segment within the gradient' }, + { name => 'color', type => 'color', + desc => 'The color to set' }, + { name => 'opacity', type => '0 <= float <= 100.0', + desc => 'The opacity to set for the endpoint' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *seg; + + gradient = gradient_get (gimp, name, GIMP_PDB_DATA_ACCESS_WRITE, segment, + &seg, error); + + if (seg) + { + color.a = opacity / 100.0; + gimp_gradient_segment_set_right_color (gradient, seg, &color); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_get_left_pos { + $blurb = 'Retrieves the left endpoint position of the specified segment'; + + $help = <<'HELP'; +This procedure retrieves the left endpoint position of the specified segment of +the specified gradient. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'segment', type => '0 <= int32', + desc => 'The index of the segment within the gradient' } + ); + + @outargs = ( + { name => 'pos', type => 'float', void_ret => 1, + desc => 'The return position' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *seg; + + gradient = gradient_get (gimp, name, GIMP_PDB_DATA_ACCESS_READ, segment, + &seg, error); + + if (seg) + { + pos = gimp_gradient_segment_get_left_pos (gradient, seg); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_get_right_pos { + $blurb = 'Retrieves the right endpoint position of the specified segment'; + + $help = <<'HELP'; +This procedure retrieves the right endpoint position of the specified segment of +the specified gradient. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'segment', type => '0 <= int32', + desc => 'The index of the segment within the gradient' } + ); + + @outargs = ( + { name => 'pos', type => 'float', void_ret => 1, + desc => 'The return position' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *seg; + + gradient = gradient_get (gimp, name, GIMP_PDB_DATA_ACCESS_READ, segment, + &seg, error); + + if (seg) + { + pos = gimp_gradient_segment_get_right_pos (gradient, seg); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_get_middle_pos { + $blurb = 'Retrieves the middle point position of the specified segment'; + + $help = <<'HELP'; +This procedure retrieves the middle point position of the specified segment of +the specified gradient. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'segment', type => '0 <= int32', + desc => 'The index of the segment within the gradient' } + ); + + @outargs = ( + { name => 'pos', type => 'float', void_ret => 1, + desc => 'The return position' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *seg; + + gradient = gradient_get (gimp, name, GIMP_PDB_DATA_ACCESS_READ, segment, + &seg, error); + + if (seg) + { + pos = gimp_gradient_segment_get_middle_pos (gradient, seg); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_set_left_pos { + $blurb = 'Sets the left endpoint position of the specified segment'; + + $help = <<'HELP'; +This procedure sets the left endpoint position of the specified +segment of the specified gradient. The final position will be between +the position of the middle point to the left to the middle point of +the current segment. + +This procedure returns the final position. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'segment', type => '0 <= int32', + desc => 'The index of the segment within the gradient' }, + { name => 'pos', type => '0.0 <= float <= 1.0', + desc => 'The position to set the guidepoint to' } + ); + + @outargs = ( + { name => 'final_pos', type => 'float', void_ret => 1, + desc => 'The return position' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *seg; + + gradient = gradient_get (gimp, name, GIMP_PDB_DATA_ACCESS_WRITE, segment, + &seg, error); + + if (seg) + { + final_pos = gimp_gradient_segment_set_left_pos (gradient, seg, pos); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_set_right_pos { + $blurb = 'Sets the right endpoint position of the specified segment'; + + $help = <<'HELP'; +This procedure sets the right endpoint position of the specified +segment of the specified gradient. The final position will be between +the position of the middle point of the current segment and the middle +point of the segment to the right. + +This procedure returns the final position. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'segment', type => '0 <= int32', + desc => 'The index of the segment within the gradient' }, + { name => 'pos', type => '0.0 <= float <= 1.0', + desc => 'The position to set the guidepoint to' } + ); + + @outargs = ( + { name => 'final_pos', type => 'float', void_ret => 1, + desc => 'The return position' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *seg; + + gradient = gradient_get (gimp, name, GIMP_PDB_DATA_ACCESS_WRITE, segment, + &seg, error); + + if (seg) + { + final_pos = + gimp_gradient_segment_set_right_pos (gradient, seg, pos); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_set_middle_pos { + $blurb = 'Sets the middle point position of the specified segment'; + + $help = <<'HELP'; +This procedure sets the middle point position of the specified segment +of the specified gradient. The final position will be between the two +endpoints of the segment. + +This procedure returns the final position. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'segment', type => '0 <= int32', + desc => 'The index of the segment within the gradient' }, + { name => 'pos', type => '0.0 <= float <= 1.0', + desc => 'The position to set the guidepoint to' } + ); + + @outargs = ( + { name => 'final_pos', type => 'float', void_ret => 1, + desc => 'The return position' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *seg; + + gradient = gradient_get (gimp, name, GIMP_PDB_DATA_ACCESS_WRITE, segment, + &seg, error); + + if (seg) + { + final_pos = + gimp_gradient_segment_set_middle_pos (gradient, seg, pos); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_get_blending_function { + $blurb = "Retrieves the gradient segment's blending function"; + + $help = <<'HELP'; +This procedure retrieves the blending function of the segment at the +specified gradient name and segment index. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'segment', type => '0 <= int32', + desc => 'The index of the segment within the gradient' } + ); + + @outargs = ( + { name => 'blend_func', type => 'enum GimpGradientSegmentType', + void_ret => 1, + desc => 'The blending function of the segment' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *seg; + + gradient = gradient_get (gimp, name, GIMP_PDB_DATA_ACCESS_READ, segment, + &seg, error); + + if (seg) + { + blend_func = gimp_gradient_segment_get_blending_function (gradient, seg); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_get_coloring_type { + $blurb = "Retrieves the gradient segment's coloring type"; + + $help = <<'HELP'; +This procedure retrieves the coloring type of the segment at the +specified gradient name and segment index. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'segment', type => '0 <= int32', + desc => 'The index of the segment within the gradient' } + ); + + @outargs = ( + { name => 'coloring_type', type => 'enum GimpGradientSegmentColor', + void_ret => 1, + desc => 'The coloring type of the segment' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *seg; + + gradient = gradient_get (gimp, name, GIMP_PDB_DATA_ACCESS_READ, segment, + &seg, error); + + if (seg) + { + coloring_type = gimp_gradient_segment_get_coloring_type (gradient, seg); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_range_set_blending_function { + $blurb = 'Change the blending function of a segments range'; + + $help = <<'HELP'; +This function changes the blending function of a segment range to the +specified blending function. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'start_segment', type => '0 <= int32', + desc => 'The index of the first segment to operate on' }, + { name => 'end_segment', type => 'int32', + desc => 'The index of the last segment to operate on. If negative, + the selection will extend to the end of the string.' }, + { name => 'blending_function', type => 'enum GimpGradientSegmentType', + desc => 'The blending function' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *start_seg; + GimpGradientSegment *end_seg; + + gradient = gradient_get_range (gimp, name, start_segment, end_segment, + &start_seg, &end_seg, error); + + if (start_seg) + { + gimp_gradient_segment_range_set_blending_function (gradient, + start_seg, end_seg, + blending_function); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_range_set_coloring_type { + $blurb = 'Change the coloring type of a segments range'; + + $help = <<'HELP'; +This function changes the coloring type of a segment range to the +specified coloring type. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'start_segment', type => '0 <= int32', + desc => 'The index of the first segment to operate on' }, + { name => 'end_segment', type => 'int32', + desc => 'The index of the last segment to operate on. If negative, + the selection will extend to the end of the string.' }, + { name => 'coloring_type', type => 'enum GimpGradientSegmentColor', + desc => 'The coloring type' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *start_seg; + GimpGradientSegment *end_seg; + + gradient = gradient_get_range (gimp, name, start_segment, end_segment, + &start_seg, &end_seg, error); + + if (start_seg) + { + gimp_gradient_segment_range_set_coloring_type (gradient, + start_seg, end_seg, + coloring_type); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_range_flip { + $blurb = 'Flip the segment range'; + $help = 'This function flips a segment range.'; + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'start_segment', type => '0 <= int32', + desc => 'The index of the first segment to operate on' }, + { name => 'end_segment', type => 'int32', + desc => 'The index of the last segment to operate on. If negative, + the selection will extend to the end of the string.' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *start_seg; + GimpGradientSegment *end_seg; + + gradient = gradient_get_range (gimp, name, start_segment, end_segment, + &start_seg, &end_seg, error); + + if (start_seg) + { + gimp_gradient_segment_range_flip (gradient, + start_seg, end_seg, + NULL, NULL); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_range_replicate { + $blurb = 'Replicate the segment range'; + + $help = <<'HELP'; +This function replicates a segment range a given number of times. Instead +of the original segment range, several smaller scaled copies of it +will appear in equal widths. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'start_segment', type => '0 <= int32', + desc => 'The index of the first segment to operate on' }, + { name => 'end_segment', type => 'int32', + desc => 'The index of the last segment to operate on. If negative, + the selection will extend to the end of the string.' }, + { name => 'replicate_times', type => '2 <= int32 <= 20', + desc => 'The number of times to replicate' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *start_seg; + GimpGradientSegment *end_seg; + + gradient = gradient_get_range (gimp, name, start_segment, end_segment, + &start_seg, &end_seg, error); + + if (start_seg && gimp_data_is_writable (GIMP_DATA (gradient))) + { + gimp_gradient_segment_range_replicate (gradient, + start_seg, end_seg, + replicate_times, + NULL, NULL); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_range_split_midpoint { + $blurb = 'Splits each segment in the segment range at midpoint'; + + $help = <<'HELP'; +This function splits each segment in the segment range at its midpoint. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'start_segment', type => '0 <= int32', + desc => 'The index of the first segment to operate on' }, + { name => 'end_segment', type => 'int32', + desc => 'The index of the last segment to operate on. If negative, + the selection will extend to the end of the string.' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *start_seg; + GimpGradientSegment *end_seg; + + gradient = gradient_get_range (gimp, name, start_segment, end_segment, + &start_seg, &end_seg, error); + + if (start_seg) + { + gimp_gradient_segment_range_split_midpoint (gradient, context, + start_seg, end_seg, + GIMP_GRADIENT_BLEND_RGB_PERCEPTUAL, + NULL, NULL); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_range_split_uniform { + $blurb = 'Splits each segment in the segment range uniformly'; + + $help = <<'HELP'; +This function splits each segment in the segment range uniformly according +to the number of times specified by the parameter. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'start_segment', type => '0 <= int32', + desc => 'The index of the first segment to operate on' }, + { name => 'end_segment', type => 'int32', + desc => 'The index of the last segment to operate on. If negative, + the selection will extend to the end of the string.' }, + { name => 'split_parts', type => '2 <= int32 <= 1024', + desc => 'The number of uniform divisions to split each segment to' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *start_seg; + GimpGradientSegment *end_seg; + + gradient = gradient_get_range (gimp, name, start_segment, end_segment, + &start_seg, &end_seg, error); + + if (start_seg) + { + gimp_gradient_segment_range_split_uniform (gradient, context, + start_seg, end_seg, + split_parts, + GIMP_GRADIENT_BLEND_RGB_PERCEPTUAL, + NULL, NULL); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_range_delete { + $blurb = 'Delete the segment range'; + $help = 'This function deletes a segment range.'; + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'start_segment', type => '0 <= int32', + desc => 'The index of the first segment to operate on' }, + { name => 'end_segment', type => 'int32', + desc => 'The index of the last segment to operate on. If negative, + the selection will extend to the end of the string.' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *start_seg; + GimpGradientSegment *end_seg; + + gradient = gradient_get_range (gimp, name, start_segment, end_segment, + &start_seg, &end_seg, error); + + if (start_seg) + { + gimp_gradient_segment_range_delete (gradient, + start_seg, end_seg, + NULL, NULL); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_range_redistribute_handles { + $blurb = "Uniformly redistribute the segment range's handles"; + + $help = <<'HELP'; +This function redistributes the handles of the specified segment range of the +specified gradient, so they'll be evenly spaced. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'start_segment', type => '0 <= int32', + desc => 'The index of the first segment to operate on' }, + { name => 'end_segment', type => 'int32', + desc => 'The index of the last segment to operate on. If negative, + the selection will extend to the end of the string.' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *start_seg; + GimpGradientSegment *end_seg; + + gradient = gradient_get_range (gimp, name, start_segment, end_segment, + &start_seg, &end_seg, error); + + if (start_seg) + { + gimp_gradient_segment_range_redistribute_handles (gradient, + start_seg, end_seg); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_range_blend_colors { + $blurb = 'Blend the colors of the segment range.'; + + $help = <<'HELP'; +This function blends the colors (but not the opacity) of the segments' +range of the gradient. Using it, the colors' transition will be uniform +across the range. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'start_segment', type => '0 <= int32', + desc => 'The index of the first segment to operate on' }, + { name => 'end_segment', type => 'int32', + desc => 'The index of the last segment to operate on. If negative, + the selection will extend to the end of the string.' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *start_seg; + GimpGradientSegment *end_seg; + + gradient = gradient_get_range (gimp, name, start_segment, end_segment, + &start_seg, &end_seg, error); + + if (start_seg) + { + if (!end_seg) + end_seg = gimp_gradient_segment_get_last (start_seg); + + gimp_gradient_segment_range_blend (gradient, + start_seg, end_seg, + &start_seg->left_color, + &end_seg->right_color, + TRUE, FALSE); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_range_blend_opacity { + $blurb = 'Blend the opacity of the segment range.'; + + $help = <<'HELP'; +This function blends the opacity (but not the colors) of the segments' +range of the gradient. Using it, the opacity's transition will be uniform +across the range. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'start_segment', type => '0 <= int32', + desc => 'The index of the first segment to operate on' }, + { name => 'end_segment', type => 'int32', + desc => 'The index of the last segment to operate on. If negative, + the selection will extend to the end of the string.' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *start_seg; + GimpGradientSegment *end_seg; + + gradient = gradient_get_range (gimp, name, start_segment, end_segment, + &start_seg, &end_seg, error); + + if (start_seg) + { + if (!end_seg) + end_seg = gimp_gradient_segment_get_last (start_seg); + + gimp_gradient_segment_range_blend (gradient, + start_seg, end_seg, + &start_seg->left_color, + &end_seg->right_color, + FALSE, TRUE); + } + else + success = FALSE; +} +CODE + ); +} + +sub gradient_segment_range_move { + $blurb = 'Move the position of an entire segment range by a delta.'; + + $help = <<'HELP'; +This function moves the position of an entire segment range by a delta. The +actual delta (which is returned) will be limited by the control points of the +neighboring segments. +HELP + + &shlomi_pdb_misc('2003', '2.2'); + + @inargs = ( + { name => 'name', type => 'string', non_empty => 1, + desc => 'The gradient name' }, + { name => 'start_segment', type => '0 <= int32', + desc => 'The index of the first segment to operate on' }, + { name => 'end_segment', type => 'int32', + desc => 'The index of the last segment to operate on. If negative, + the selection will extend to the end of the string.' }, + { name => 'delta', type => '-1.0 <= float <= 1.0', + desc => 'The delta to move the segment range' }, + { name => 'control_compress', type => 'boolean', + desc => 'Whether or not to compress the neighboring segments' } + ); + + @outargs = ( + { name => 'final_delta', type => 'float', + desc => 'The final delta by which the range moved' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpGradient *gradient; + GimpGradientSegment *start_seg; + GimpGradientSegment *end_seg; + + gradient = gradient_get_range (gimp, name, start_segment, end_segment, + &start_seg, &end_seg, error); + + if (start_seg) + { + final_delta = gimp_gradient_segment_range_move (gradient, + start_seg, end_seg, + delta, + control_compress); + } + else + success = FALSE; +} +CODE + ); +} + +$extra{app}->{code} = <<'CODE'; +static GimpGradient * +gradient_get (Gimp *gimp, + const gchar *name, + GimpPDBDataAccess access, + gint segment, + GimpGradientSegment **seg, + GError **error) +{ + GimpGradient *gradient = gimp_pdb_get_gradient (gimp, name, access, error); + + *seg = NULL; + + if (gradient) + *seg = gimp_gradient_segment_get_nth (gradient->segments, segment); + + return gradient; +} + +static GimpGradient * +gradient_get_range (Gimp *gimp, + const gchar *name, + gint start_segment, + gint end_segment, + GimpGradientSegment **start_seg, + GimpGradientSegment **end_seg, + GError **error) +{ + GimpGradient *gradient = gimp_pdb_get_gradient (gimp, name, GIMP_PDB_DATA_ACCESS_WRITE, error); + + *start_seg = NULL; + *end_seg = NULL; + + if (end_segment >= 0 && end_segment < start_segment) + return NULL; + + if (gradient) + { + *start_seg = gimp_gradient_segment_get_nth (gradient->segments, + start_segment); + + if (*start_seg && end_segment >= 0) + *end_seg = gimp_gradient_segment_get_nth (*start_seg, + end_segment - + start_segment); + } + + return gradient; +} +CODE + + +@headers = qw(<string.h> + "core/gimp.h" + "core/gimpcontext.h" + "core/gimpgradient.h" + "core/gimpdatafactory.h" + "gimppdb-utils.h"); + +@procs = qw(gradient_new + gradient_duplicate + gradient_is_editable + gradient_rename + gradient_delete + gradient_get_number_of_segments + gradient_get_uniform_samples gradient_get_custom_samples + gradient_segment_get_left_color gradient_segment_set_left_color + gradient_segment_get_right_color gradient_segment_set_right_color + gradient_segment_get_left_pos gradient_segment_set_left_pos + gradient_segment_get_middle_pos gradient_segment_set_middle_pos + gradient_segment_get_right_pos gradient_segment_set_right_pos + gradient_segment_get_blending_function + gradient_segment_get_coloring_type + gradient_segment_range_set_blending_function + gradient_segment_range_set_coloring_type + gradient_segment_range_flip + gradient_segment_range_replicate + gradient_segment_range_split_midpoint + gradient_segment_range_split_uniform + gradient_segment_range_delete + gradient_segment_range_redistribute_handles + gradient_segment_range_blend_colors + gradient_segment_range_blend_opacity + gradient_segment_range_move); + +%exports = (app => [@procs], lib => [@procs]); + +$desc = 'Gradient'; +$doc_title = 'gimpgradient'; +$doc_short_desc = 'Functions operating on a single gradient.'; +$doc_long_desc = 'Functions operating on a single gradient.'; + +1; |