diff options
Diffstat (limited to 'pdb/groups/paths.pdb')
-rw-r--r-- | pdb/groups/paths.pdb | 636 |
1 files changed, 636 insertions, 0 deletions
diff --git a/pdb/groups/paths.pdb b/pdb/groups/paths.pdb new file mode 100644 index 0000000..8116bd4 --- /dev/null +++ b/pdb/groups/paths.pdb @@ -0,0 +1,636 @@ +# 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/>. + +# "Perlized" from C source by Andy Thomas <alt@gimp.org> + +sub path_list { + &std_pdb_deprecated('gimp-image-get-vectors'); + + @inargs = ( + { name => 'image', type => 'image', + desc => 'The image to list the paths from' } + ); + + @outargs = ( + { name => 'path_list', type => 'stringarray', + desc => 'List of the paths belonging to this image', + array => { name => 'num_paths', + desc => 'The number of paths returned.' } } + ); + + %invoke = ( + code => <<'CODE' +{ + path_list = gimp_container_get_name_array (gimp_image_get_vectors (image), + &num_paths); +} +CODE + ); +} + +sub path_get_points { + &std_pdb_deprecated('gimp-vectors-stroke-get-points'); + + @inargs = ( + { name => 'image', type => 'image', + desc => 'The image to list the paths from' }, + { name => 'name', type => 'string', + desc => 'The name of the path whose points should be listed.' } + ); + + @outargs = ( + { name => 'path_type', type => 'int32', + desc => 'The type of the path. Currently only one type (1 = Bezier) + is supported' }, + { name => 'path_closed', type => 'int32', + desc => 'Return if the path is closed. (0 = path open, 1 = path + closed)' }, + { name => 'points_pairs', type => 'floatarray', + desc => 'The points in the path represented as 3 floats. The first is + the x pos, next is the y pos, last is the type of the pnt. + The type field is dependent on the path type. For beziers + (type 1 paths) the type can either be (1.0 = BEZIER_ANCHOR, + 2.0 = BEZIER_CONTROL, 3.0 = BEZIER_MOVE). Note all points + are returned in pixel resolution.', + array => { name => 'num_path_point_details', + desc => 'The number of points returned. Each point is + made up of (x, y, pnt_type) of floats.' } } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpVectors *vectors = gimp_image_get_vectors_by_name (image, name); + + if (vectors) + { + GimpVectorsCompatPoint *points; + gint num_points; + + path_type = 1; /* BEZIER (1.2 compat) */ + + points = gimp_vectors_compat_get_points (vectors, &num_points, + &path_closed); + + num_path_point_details = num_points * 3; + + if (points) + { + gdouble *curr_point; + gint i; + + points_pairs = g_new0 (gdouble, num_path_point_details); + + for (i = 0, curr_point = points_pairs; + i < num_points; + i++, curr_point += 3) + { + curr_point[0] = points[i].x; + curr_point[1] = points[i].y; + curr_point[2] = points[i].type; + } + + g_free (points); + } + else + success = FALSE; + } + else + success = FALSE; +} +CODE + ); +} + +sub path_get_current { + &std_pdb_deprecated('gimp-image-get-active-vectors'); + + @inargs = ( + { name => 'image', type => 'image', + desc => 'The image to get the current path from' }, + ); + + @outargs = ( + { name => 'name', type => 'string', + desc => 'The name of the current path.' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpVectors *vectors = gimp_image_get_active_vectors (image); + + if (vectors) + name = g_strdup (gimp_object_get_name (vectors)); + else + success = FALSE; +} +CODE + ); +} + +sub path_set_current { + &std_pdb_deprecated('gimp-image-set-active-vectors'); + + @inargs = ( + { name => 'image', type => 'image', + desc => 'The image in which a path will become current' }, + { name => 'name', type => 'string', + desc => 'The name of the path to make current.' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpVectors *vectors = gimp_image_get_vectors_by_name (image, name); + + if (vectors) + gimp_image_set_active_vectors (image, vectors); + else + success = FALSE; +} +CODE + ); +} + +sub path_set_points { + &std_pdb_deprecated('gimp-vectors-stroke-new-from-points'); + + @inargs = ( + { name => 'image', type => 'image', + desc => 'The image to set the paths in' }, + { name => 'name', type => 'string', + desc => 'The name of the path to create. If it exists then a unique + name will be created - query the list of paths if you want + to make sure that the name of the path you create is + unique. This will be set as the current path.' }, + { name => 'ptype', type => 'int32', dead => 1, + desc => 'The type of the path. Currently only one type (1 = Bezier) + is supported.' }, + { name => 'points_pairs', type => 'floatarray', + desc => 'The points in the path represented as 3 floats. The first is + the x pos, next is the y pos, last is the type of the pnt. + The type field is dependent on the path type. For beziers + (type 1 paths) the type can either be (1.0 = BEZIER_ANCHOR, + 2.0 = BEZIER_CONTROL, 3.0= BEZIER_MOVE). Note all points are + returned in pixel resolution.', + array => { name => 'num_path_points', + desc => 'The number of elements in the array, i.e. the number + of points in the path * 3. Each point is + made up of (x, y, type) of floats. Currently only + the creation of bezier curves is allowed. The type + parameter must be set to (1) to indicate a BEZIER + type curve. Note that for BEZIER curves, points + must be given in the following order: ACCACCAC... + If the path is not closed the last control + point is missed off. Points consist of three + control points (control/anchor/control) so for a + curve that is not closed there must be at least + two points passed (2 x,y pairs). If + (num_path_points/3) % 3 = 0 then the path is + assumed to be closed and the points are + ACCACCACCACC.' } } + ); + + %invoke = ( + code => <<'CODE' +{ + gboolean closed = FALSE; + + if ((num_path_points / 3) % 3 == 0) + closed = TRUE; + else if ((num_path_points / 3) % 3 != 2) + success = FALSE; + + if (success) + { + GimpVectors *vectors; + const gdouble *curr_point_pair; + GimpVectorsCompatPoint *points; + gint n_points; + gint i; + + n_points = num_path_points / 3; + + points = g_new0 (GimpVectorsCompatPoint, n_points); + + for (i = 0, curr_point_pair = points_pairs; + i < n_points; + i++, curr_point_pair += 3) + { + points[i].x = curr_point_pair[0]; + points[i].y = curr_point_pair[1]; + points[i].type = curr_point_pair[2]; + } + + vectors = gimp_vectors_compat_new (image, name, points, n_points, + closed); + + g_free (points); + + if (vectors) + success = gimp_image_add_vectors (image, vectors, NULL, 0, TRUE); + else + success = FALSE; + } +} +CODE + ); +} + +sub path_stroke_current { + &std_pdb_deprecated('gimp-edit-stroke-vectors'); + + @inargs = ( + { name => 'image', type => 'image', + desc => 'The image which contains the path to stroke' }, + ); + + %invoke = ( + headers => [ qw("core/gimpstrokeoptions.h") ], + code => <<'CODE' +{ + GimpVectors *vectors = gimp_image_get_active_vectors (image); + GimpDrawable *drawable = gimp_image_get_active_drawable (image); + + if (vectors && drawable && + gimp_pdb_item_is_modifiable (GIMP_ITEM (drawable), + GIMP_PDB_ITEM_CONTENT, error) && + gimp_pdb_item_is_not_group (GIMP_ITEM (drawable), error)) + { + GimpStrokeOptions *options; + GimpPaintOptions *paint_options; + + options = gimp_stroke_options_new (gimp, context, TRUE); + g_object_set (options, + "method", GIMP_STROKE_PAINT_METHOD, + NULL); + + paint_options = + gimp_pdb_context_get_paint_options (GIMP_PDB_CONTEXT (context), NULL); + paint_options = gimp_config_duplicate (GIMP_CONFIG (paint_options)); + + success = gimp_item_stroke (GIMP_ITEM (vectors), + drawable, context, options, paint_options, + TRUE, progress, error); + + g_object_unref (options); + g_object_unref (paint_options); + } + else + success = FALSE; +} +CODE + ); +} + +sub path_get_point_at_dist { + &std_pdb_deprecated('gimp-vectors-stroke-get-point-at-dist'); + + @inargs = ( + { name => 'image', type => 'image', + desc => 'The image the paths belongs to' }, + { name => 'distance', type => 'float', + desc => 'The distance along the path.' } + ); + + @outargs = ( + { name => 'x_point', type => 'int32', + desc => 'The x position of the point.' }, + { name => 'y_point', type => 'int32', + desc => 'The y position of the point.' }, + { name => 'slope', type => 'float', + desc => 'The slope (dy / dx) at the specified point.' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpVectors *vectors; + GimpStroke *stroke; + gdouble distance_along; + gdouble stroke_length; + gdouble stroke_distance; + GimpCoords position; + + vectors = gimp_image_get_active_vectors (image); + + if (vectors) + { + distance_along = 0.0; + stroke = gimp_vectors_stroke_get_next (vectors, NULL); + + while (stroke != NULL ) + { + stroke_length = gimp_stroke_get_length (stroke, 0.5); + + if (distance_along + stroke_length < distance) + { + distance_along += stroke_length; + } + else + { + stroke_distance = distance - distance_along; + stroke_distance = stroke_distance < 0 ? 0: stroke_distance; + + if (!gimp_stroke_get_point_at_dist (stroke, stroke_distance, 0.5, + &position, &slope)) + { + success = FALSE; + break; + } + else + { + success = TRUE; + x_point = ROUND (position.x); + y_point = ROUND (position.y); + break; + } + } + + stroke = gimp_vectors_stroke_get_next (vectors, stroke); + } + } + else + { + success = FALSE; + } +} +CODE + ); +} + +sub path_get_tattoo { + &std_pdb_deprecated('gimp-vectors-get-tattoo'); + + @inargs = ( + { name => 'image', type => 'image', + desc => 'The image' }, + { name => 'name', type => 'string', + desc => 'The name of the path whose tattoo should be obtained.' } + ); + + @outargs = ( + { name => 'tattoo', type => 'int32', + desc => 'The tattoo associated with the named path.' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpVectors *vectors = gimp_image_get_vectors_by_name (image, name); + + if (vectors) + tattoo = gimp_item_get_tattoo (GIMP_ITEM (vectors)); + else + success = FALSE; +} +CODE + ); +} + +sub path_set_tattoo { + &std_pdb_deprecated('gimp-vectors-set-tattoo'); + + @inargs = ( + { name => 'image', type => 'image', + desc => 'The image' }, + { name => 'name', type => 'string', + desc => 'the name of the path whose tattoo should be set' }, + { name => 'tattovalue', type => 'int32', + desc => "The tattoo associated with the name path. Only values + returned from 'path_get_tattoo' should be used here" } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpVectors *vectors = gimp_image_get_vectors_by_name (image, name); + + if (vectors) + gimp_item_set_tattoo (GIMP_ITEM (vectors), tattovalue); + else + success = FALSE; +} +CODE + ); +} + +sub get_path_by_tattoo { + &std_pdb_deprecated('gimp-image-get-vectors-by-tattoo'); + + @inargs = ( + { name => 'image', type => 'image', + desc => 'The image' }, + { name => 'tattoo', type => 'int32', + desc => 'The tattoo of the required path.' } + ); + + @outargs = ( + { name => 'name', type => 'string', + desc => 'The name of the path with the specified tattoo.' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpVectors *vectors = gimp_image_get_vectors_by_tattoo (image, tattoo); + + if (vectors) + name = g_strdup (gimp_object_get_name (vectors)); + else + success = FALSE; +} +CODE + ); +} + +sub path_delete { + &std_pdb_deprecated('gimp-image-remove-vectors'); + + @inargs = ( + { name => 'image', type => 'image', + desc => 'The image to delete the path from' }, + { name => 'name', type => 'string', + desc => 'The name of the path to delete.' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpVectors *vectors = gimp_image_get_vectors_by_name (image, name); + + if (vectors) + gimp_image_remove_vectors (image, vectors, TRUE, NULL); + else + success = FALSE; +} +CODE + ); +} + +sub path_get_locked { + &std_pdb_deprecated('gimp-vectors-get-linked'); + + @inargs = ( + { name => 'image', type => 'image', + desc => 'The image' }, + { name => 'name', type => 'string', + desc => 'The name of the path whose locked status should be + obtained.' } + ); + + @outargs = ( + { name => 'locked', type => 'boolean', + desc => 'TRUE if the path is locked, FALSE otherwise' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpVectors *vectors = gimp_image_get_vectors_by_name (image, name); + + if (vectors) + locked = gimp_item_get_linked (GIMP_ITEM (vectors)); + else + success = FALSE; +} +CODE + ); +} + +sub path_set_locked { + &std_pdb_deprecated('gimp-vectors-set-linked'); + + @inargs = ( + { name => 'image', type => 'image', + desc => 'The image' }, + { name => 'name', type => 'string', + desc => 'the name of the path whose locked status should be set' }, + { name => 'locked', type => 'boolean', + desc => 'Whether the path is locked' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpVectors *vectors = gimp_image_get_vectors_by_name (image, name); + + if (vectors) + gimp_item_set_linked (GIMP_ITEM (vectors), locked, TRUE); + else + success = FALSE; +} +CODE + ); +} + +sub path_to_selection { + &std_pdb_deprecated('gimp-vectors-to-selection'); + + @inargs = ( + { name => 'image', type => 'image', + desc => 'The image' }, + { name => 'name', type => 'string', + desc => 'The name of the path which should be made into selection.' }, + { name => 'op', type => 'enum GimpChannelOps', + desc => 'The desired operation with current selection' }, + { name => 'antialias', type => 'boolean', + desc => 'Antialias selection.' }, + { name => 'feather', type => 'boolean', + desc => 'Feather selection.' }, + { name => 'feather_radius_x', type => 'float', + desc => 'Feather radius x.' }, + { name => 'feather_radius_y', type => 'float', + desc => 'Feather radius y.' } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpVectors *vectors = gimp_image_get_vectors_by_name (image, name); + + if (vectors) + gimp_item_to_selection (GIMP_ITEM (vectors), + op, + antialias, + feather, + feather_radius_x, + feather_radius_y); + else + success = FALSE; +} +CODE + ); +} + +sub path_import { + &std_pdb_deprecated('gimp-vectors-import-from-file'); + + @inargs = ( + { name => 'image', type => 'image', + desc => 'The image' }, + { name => 'filename', type => 'string', allow_non_utf8 => 1, + desc => 'The name of the SVG file to import.' }, + { name => 'merge', type => 'boolean', + desc => 'Merge paths into a single vectors object.' }, + { name => 'scale', type => 'boolean', + desc => 'Scale the SVG to image dimensions.' } + ); + + %invoke = ( + headers => [ qw("vectors/gimpvectors-import.h") ], + code => <<'CODE' +{ + GFile *file = g_file_new_for_path (filename); + + success = gimp_vectors_import_file (image, file, + merge, scale, NULL, -1, NULL, NULL); + + g_object_unref (file); +} +CODE + ); +} + + +@headers = qw(<string.h> + "libgimpconfig/gimpconfig.h" + "libgimpmath/gimpmath.h" + "core/gimplist.h" + "vectors/gimpanchor.h" + "vectors/gimpbezierstroke.h" + "vectors/gimpvectors.h" + "vectors/gimpvectors-compat.h" + "gimppdb-utils.h" + "gimppdbcontext.h" + "gimp-intl.h"); + +@procs = qw(path_list path_get_current path_set_current path_delete + path_get_points path_set_points + path_stroke_current path_get_point_at_dist + path_get_tattoo path_set_tattoo get_path_by_tattoo + path_get_locked path_set_locked + path_to_selection path_import); + +%exports = (app => [@procs], lib => [@procs]); + +$desc = 'Paths'; +$doc_title = 'gimppaths'; +$doc_short_desc = 'Deprecated operations related to paths.'; +$doc_long_desc = 'Deprecated operations related to paths.'; + +1; |