"lock-content" will be separate from "is-group" soon, so add separate checks for groups. Also remove some checks that were added to make wrappers invokable even though the group appeared locked.
1059 lines
38 KiB
Text
1059 lines
38 KiB
Text
# 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 <http://www.gnu.org/licenses/>.
|
|
|
|
# "Perlized" from C source by Manish Singh <yosh@gimp.org>
|
|
# Derived from old transform_tools by
|
|
# Joao S. O. Bueno Calligaris <gwidion@mpc.com.br>
|
|
|
|
# Drawable Transformations
|
|
|
|
# shortcuts
|
|
|
|
sub transform_invoke {
|
|
my ($progress_text, $assemble_matrix, $check) = @_;
|
|
my $success_check = 'gimp_pdb_item_is_attached (GIMP_ITEM (drawable), TRUE, error);';
|
|
|
|
if ($check) {
|
|
$success_check = "(gimp_pdb_item_is_attached (GIMP_ITEM (drawable), TRUE, error) && " . $check . ");";
|
|
}
|
|
|
|
%invoke = (
|
|
code => <<"CODE"
|
|
{
|
|
gint x, y, width, height;
|
|
|
|
success = $success_check
|
|
|
|
if (success &&
|
|
gimp_drawable_mask_intersect (drawable, &x, &y, &width, &height))
|
|
{
|
|
GimpMatrix3 matrix;
|
|
gint off_x, off_y;
|
|
|
|
gimp_item_get_offset (GIMP_ITEM (drawable), &off_x, &off_y);
|
|
|
|
x += off_x;
|
|
y += off_y;
|
|
|
|
/* Assemble the transformation matrix */
|
|
$assemble_matrix
|
|
|
|
if (progress)
|
|
gimp_progress_start (progress, _(\"$progress_text\"), FALSE);
|
|
|
|
/* Transform the selection */
|
|
success = gimp_drawable_transform_affine (drawable, context,
|
|
&matrix, transform_direction,
|
|
interpolation, recursion_level,
|
|
clip_result, progress);
|
|
|
|
if (progress)
|
|
gimp_progress_end (progress);
|
|
}
|
|
}
|
|
CODE
|
|
)
|
|
}
|
|
|
|
sub transform_default_invoke {
|
|
my ($progress_text, $assemble_matrix, $check) = @_;
|
|
my $success_check = 'gimp_pdb_item_is_attached (GIMP_ITEM (drawable), TRUE, error);';
|
|
|
|
if ($check) {
|
|
$success_check = "(gimp_pdb_item_is_attached (GIMP_ITEM (drawable), TRUE, error) && " . $check . ");";
|
|
}
|
|
|
|
%invoke = (
|
|
code => <<"CODE"
|
|
{
|
|
gint x, y, width, height;
|
|
|
|
success = $success_check
|
|
|
|
if (success &&
|
|
gimp_drawable_mask_intersect (drawable, &x, &y, &width, &height))
|
|
{
|
|
GimpMatrix3 matrix;
|
|
GimpInterpolationType interpolation_type = GIMP_INTERPOLATION_NONE;
|
|
gint off_x, off_y;
|
|
|
|
gimp_item_get_offset (GIMP_ITEM (drawable), &off_x, &off_y);
|
|
|
|
x += off_x;
|
|
y += off_y;
|
|
|
|
/* Assemble the transformation matrix */
|
|
$assemble_matrix
|
|
|
|
if (interpolate)
|
|
interpolation_type = gimp->config->interpolation_type;
|
|
|
|
if (progress)
|
|
gimp_progress_start (progress, _(\"$progress_text\"), FALSE);
|
|
|
|
/* Transform the selection */
|
|
success = gimp_drawable_transform_affine (drawable, context,
|
|
&matrix, GIMP_TRANSFORM_FORWARD,
|
|
interpolation_type, 3,
|
|
clip_result, progress);
|
|
|
|
if (progress)
|
|
gimp_progress_end (progress);
|
|
}
|
|
}
|
|
CODE
|
|
)
|
|
}
|
|
|
|
|
|
# The defs
|
|
|
|
sub drawable_transform_flip_simple {
|
|
$blurb = <<'BLURB';
|
|
Flip the specified drawable either vertically or horizontally.
|
|
BLURB
|
|
|
|
$help = <<'HELP';
|
|
This procedure flips the specified drawable if no selection exists. If
|
|
a selection exists, the portion of the drawable which lies under the
|
|
selection is cut from the drawable and made into a floating selection
|
|
which is then flipped. If auto_center is set to TRUE, the flip is
|
|
around the selection's center. Otherwise, the coordinate of the axis
|
|
needs to be specified.
|
|
|
|
The return value is the ID of the flipped drawable. If there was no
|
|
selection, this will be equal to the drawable ID supplied as input.
|
|
Otherwise, this will be the newly created and flipped drawable.
|
|
HELP
|
|
|
|
&joao_pdb_misc('2004', '2.2');
|
|
|
|
@inargs = (
|
|
{ name => 'drawable', type => 'drawable',
|
|
desc => 'The affected drawable' },
|
|
{ name => 'flip_type',
|
|
type => 'enum GimpOrientationType (no GIMP_ORIENTATION_UNKNOWN)',
|
|
desc => 'Type of flip' },
|
|
{ name => 'auto_center', type => 'boolean',
|
|
desc => 'Whether to automatically position the axis in the selection center' },
|
|
{ name => 'axis', type => 'float',
|
|
desc => 'coord. of flip axis' },
|
|
{ name => 'clip_result', type => 'boolean',
|
|
desc => 'Whether to clip results' }
|
|
);
|
|
|
|
@outargs = (
|
|
{ name => 'drawable', type => 'drawable', no_declare => 1,
|
|
desc => 'The flipped drawable' }
|
|
);
|
|
|
|
%invoke = (
|
|
code => <<'CODE'
|
|
{
|
|
gint x, y, width, height;
|
|
|
|
success = gimp_pdb_item_is_attached (GIMP_ITEM (drawable), TRUE, error);
|
|
|
|
if (success &&
|
|
gimp_drawable_mask_intersect (drawable, &x, &y, &width, &height))
|
|
{
|
|
success = gimp_drawable_transform_flip (drawable, context,
|
|
flip_type,
|
|
auto_center, axis,
|
|
clip_result);
|
|
}
|
|
}
|
|
CODE
|
|
);
|
|
}
|
|
|
|
|
|
sub drawable_transform_flip {
|
|
$blurb = <<'BLURB';
|
|
Flip the specified drawable around a given line.
|
|
BLURB
|
|
|
|
$help = <<'HELP';
|
|
This procedure flips the specified drawable if no selection exists. If
|
|
a selection exists, the portion of the drawable which lies under the
|
|
selection is cut from the drawable and made into a floating selection
|
|
which is then flipped. The axis to flip around is specified by
|
|
specifying two points from that line.
|
|
|
|
The return value is the ID of the flipped drawable. If there was no
|
|
selection, this will be equal to the drawable ID supplied as input.
|
|
Otherwise, this will be the newly created and flipped drawable. The clip
|
|
results parameter specifies wheter current selection will affect the transform.
|
|
HELP
|
|
|
|
&joao_pdb_misc('2004', '2.2');
|
|
|
|
@inargs = (
|
|
{ name => 'drawable', type => 'drawable',
|
|
desc => 'The affected drawable' },
|
|
{ name => 'x0', type => 'float',
|
|
desc => 'horz. coord. of one end of axis' },
|
|
{ name => 'y0', type => 'float',
|
|
desc => 'vert. coord. of one end of axis' },
|
|
{ name => 'x1', type => 'float',
|
|
desc => 'horz. coord. of other end of axis' },
|
|
{ name => 'y1', type => 'float',
|
|
desc => 'vert. coord. of other end of axis' },
|
|
{ name => 'transform_direction', type => 'enum GimpTransformDirection',
|
|
desc => 'Direction of transformation' },
|
|
{ name => 'interpolation', type => 'enum GimpInterpolationType',
|
|
desc => 'Type of interpolation' },
|
|
{ name => 'supersample', type => 'boolean',
|
|
desc => 'This parameter is ignored, supersampling is performed based on the interpolation type' },
|
|
{ name => 'recursion_level', type => '1 <= int32',
|
|
desc => 'Maximum recursion level used for supersampling (3 is a nice value)' },
|
|
{ name => 'clip_result', type => 'boolean',
|
|
desc => 'Whether to clip results' }
|
|
);
|
|
|
|
@outargs = (
|
|
{ name => 'drawable', type => 'drawable', no_declare => 1,
|
|
desc => 'The flipped drawable' }
|
|
);
|
|
|
|
transform_invoke ("Flipping", <<CODE);
|
|
gimp_matrix3_identity (&matrix);
|
|
gimp_transform_matrix_flip_free (&matrix,
|
|
x0, y0, x1, y1);
|
|
CODE
|
|
}
|
|
|
|
|
|
sub drawable_transform_flip_default {
|
|
$blurb = <<'BLURB';
|
|
Flip the specified drawable around a given line.
|
|
BLURB
|
|
|
|
$help = <<'HELP';
|
|
This procedure is a variant of gimp_drawable_transform_flip() which
|
|
uses no interpolation/supersampling at all, or default values
|
|
(depending on the 'interpolate' parameter).
|
|
HELP
|
|
|
|
&joao_pdb_misc('2004', '2.2');
|
|
|
|
@inargs = (
|
|
{ name => 'drawable', type => 'drawable',
|
|
desc => 'The affected drawable' },
|
|
{ name => 'x0', type => 'float',
|
|
desc => 'horz. coord. of one end of axis' },
|
|
{ name => 'y0', type => 'float',
|
|
desc => 'vert. coord. of one end of axis' },
|
|
{ name => 'x1', type => 'float',
|
|
desc => 'horz. coord. of other end of axis' },
|
|
{ name => 'y1', type => 'float',
|
|
desc => 'vert. coord. of other end of axis' },
|
|
{ name => 'interpolate', type => 'boolean',
|
|
desc => 'Whether to use interpolation and supersampling' },
|
|
{ name => 'clip_result', type => 'boolean',
|
|
desc => 'Whether to clip results' }
|
|
);
|
|
|
|
@outargs = (
|
|
{ name => 'drawable', type => 'drawable', no_declare => 1,
|
|
desc => 'The flipped drawable' }
|
|
);
|
|
|
|
transform_default_invoke ("Flipping", <<CODE);
|
|
gimp_matrix3_identity (&matrix);
|
|
gimp_transform_matrix_flip_free (&matrix,
|
|
x0, y0, x1, y1);
|
|
CODE
|
|
}
|
|
|
|
|
|
sub drawable_transform_perspective {
|
|
$blurb = <<'BLURB';
|
|
Perform a possibly non-affine transformation on the specified drawable, with extra parameters.
|
|
BLURB
|
|
|
|
$help = <<'HELP';
|
|
This procedure performs a possibly non-affine transformation on the
|
|
specified drawable by allowing the corners of the original bounding
|
|
box to be arbitrarily remapped to any values. The specified drawable
|
|
is remapped if no selection exists. However, if a selection exists,
|
|
the portion of the drawable which lies under the selection is cut from
|
|
the drawable and made into a floating selection which is then remapped
|
|
as specified. The return value is the ID of the remapped drawable. If
|
|
there was no selection, this will be equal to the drawable ID supplied
|
|
as input. Otherwise, this will be the newly created and remapped
|
|
drawable. The 4 coordinates specify the new locations of each corner
|
|
of the original bounding box. By specifying these values, any affine
|
|
transformation (rotation, scaling, translation) can be
|
|
affected. Additionally, these values can be specified such that the
|
|
resulting transformed drawable will appear to have been projected via
|
|
a perspective transform.
|
|
HELP
|
|
|
|
&joao_pdb_misc('2004', '2.2');
|
|
|
|
@inargs = (
|
|
{ name => 'drawable', type => 'drawable',
|
|
desc => 'The affected drawable' },
|
|
{ name => 'x0', type => 'float',
|
|
desc => 'The new x coordinate of upper-left corner of original
|
|
bounding box' },
|
|
{ name => 'y0', type => 'float',
|
|
desc => 'The new y coordinate of upper-left corner of original
|
|
bounding box' },
|
|
{ name => 'x1', type => 'float',
|
|
desc => 'The new x coordinate of upper-right corner of original
|
|
bounding box' },
|
|
{ name => 'y1', type => 'float',
|
|
desc => 'The new y coordinate of upper-right corner of original
|
|
bounding box' },
|
|
{ name => 'x2', type => 'float',
|
|
desc => 'The new x coordinate of lower-left corner of original
|
|
bounding box' },
|
|
{ name => 'y2', type => 'float',
|
|
desc => 'The new y coordinate of lower-left corner of original
|
|
bounding box' },
|
|
{ name => 'x3', type => 'float',
|
|
desc => 'The new x coordinate of lower-right corner of original
|
|
bounding box' },
|
|
{ name => 'y3', type => 'float',
|
|
desc => 'The new y coordinate of lower-right corner of original
|
|
bounding box' },
|
|
{ name => 'transform_direction', type => 'enum GimpTransformDirection',
|
|
desc => 'Direction of transformation' },
|
|
{ name => 'interpolation', type => 'enum GimpInterpolationType',
|
|
desc => 'Type of interpolation' },
|
|
{ name => 'supersample', type => 'boolean',
|
|
desc => 'This parameter is ignored, supersampling is performed based on the interpolation type' },
|
|
{ name => 'recursion_level', type => '1 <= int32',
|
|
desc => 'Maximum recursion level used for supersampling (3 is a nice value)' },
|
|
{ name => 'clip_result', type => 'enum GimpTransformResize',
|
|
desc => 'How to clip results' }
|
|
);
|
|
|
|
@outargs = (
|
|
{ name => 'drawable', type => 'drawable', no_declare => 1,
|
|
desc => 'The newly mapped drawable' }
|
|
);
|
|
|
|
transform_invoke ("Perspective", <<CODE);
|
|
gimp_matrix3_identity (&matrix);
|
|
gimp_transform_matrix_perspective (&matrix,
|
|
x, y, width, height,
|
|
x0, y0, x1, y1,
|
|
x2, y2, x3, y3);
|
|
CODE
|
|
}
|
|
|
|
|
|
sub drawable_transform_perspective_default {
|
|
$blurb = <<'BLURB';
|
|
Perform a possibly non-affine transformation on the specified drawable, with extra parameters.
|
|
BLURB
|
|
|
|
$help = <<'HELP';
|
|
This procedure is a variant of gimp_drawable_transform_perspective() which
|
|
uses no interpolation/supersampling at all, or default values
|
|
(depending on the 'interpolate' parameter).
|
|
HELP
|
|
|
|
&joao_pdb_misc('2004', '2.2');
|
|
|
|
@inargs = (
|
|
{ name => 'drawable', type => 'drawable',
|
|
desc => 'The affected drawable' },
|
|
{ name => 'x0', type => 'float',
|
|
desc => 'The new x coordinate of upper-left corner of original
|
|
bounding box' },
|
|
{ name => 'y0', type => 'float',
|
|
desc => 'The new y coordinate of upper-left corner of original
|
|
bounding box' },
|
|
{ name => 'x1', type => 'float',
|
|
desc => 'The new x coordinate of upper-right corner of original
|
|
bounding box' },
|
|
{ name => 'y1', type => 'float',
|
|
desc => 'The new y coordinate of upper-right corner of original
|
|
bounding box' },
|
|
{ name => 'x2', type => 'float',
|
|
desc => 'The new x coordinate of lower-left corner of original
|
|
bounding box' },
|
|
{ name => 'y2', type => 'float',
|
|
desc => 'The new y coordinate of lower-left corner of original
|
|
bounding box' },
|
|
{ name => 'x3', type => 'float',
|
|
desc => 'The new x coordinate of lower-right corner of original
|
|
bounding box' },
|
|
{ name => 'y3', type => 'float',
|
|
desc => 'The new y coordinate of lower-right corner of original
|
|
bounding box' },
|
|
{ name => 'interpolate', type => 'boolean',
|
|
desc => 'Whether to use interpolation and supersampling' },
|
|
{ name => 'clip_result', type => 'enum GimpTransformResize',
|
|
desc => 'How to clip results' }
|
|
);
|
|
|
|
@outargs = (
|
|
{ name => 'drawable', type => 'drawable', no_declare => 1,
|
|
desc => 'The newly mapped drawable' }
|
|
);
|
|
|
|
transform_default_invoke ("Perspective", <<CODE);
|
|
gimp_matrix3_identity (&matrix);
|
|
gimp_transform_matrix_perspective (&matrix,
|
|
x, y, width, height,
|
|
x0, y0, x1, y1,
|
|
x2, y2, x3, y3);
|
|
CODE
|
|
}
|
|
|
|
|
|
sub drawable_transform_rotate_simple {
|
|
$blurb = <<'BLURB';
|
|
Rotate the specified drawable about given coordinates through the specified angle.
|
|
BLURB
|
|
|
|
$help = <<'HELP';
|
|
This function rotates the specified drawable if no selection
|
|
exists. If a selection exists, the portion of the drawable which lies
|
|
under the selection is cut from the drawable and made into a floating
|
|
selection which is then rotated by the specified amount. The return
|
|
value is the ID of the rotated drawable. If there was no selection,
|
|
this will be equal to the drawable ID supplied as input. Otherwise,
|
|
this will be the newly created and rotated drawable.
|
|
HELP
|
|
|
|
&joao_pdb_misc('2004', '2.2');
|
|
|
|
@inargs = (
|
|
{ name => 'drawable', type => 'drawable',
|
|
desc => 'The affected drawable' },
|
|
{ name => 'rotate_type', type => 'enum GimpRotationType',
|
|
desc => 'Type of rotation' },
|
|
{ name => 'auto_center', type => 'boolean',
|
|
desc => 'Whether to automatically rotate around the selection center' },
|
|
{ name => 'center_x', type => 'int32',
|
|
desc => 'The hor. coordinate of the center of rotation' },
|
|
{ name => 'center_y', type => 'int32',
|
|
desc => 'The vert. coordinate of the center of rotation' },
|
|
{ name => 'clip_result', type => 'boolean',
|
|
desc => 'Whether to clip results' }
|
|
);
|
|
|
|
@outargs = (
|
|
{ name => 'drawable', type => 'drawable', no_declare => 1,
|
|
desc => 'The rotated drawable' }
|
|
);
|
|
|
|
%invoke = (
|
|
code => <<'CODE'
|
|
{
|
|
gint x, y, width, height;
|
|
|
|
success = gimp_pdb_item_is_attached (GIMP_ITEM (drawable), FALSE, error);
|
|
|
|
if (success &&
|
|
gimp_drawable_mask_intersect (drawable, &x, &y, &width, &height))
|
|
{
|
|
success = gimp_drawable_transform_rotate (drawable, context,
|
|
rotate_type,
|
|
auto_center, center_x, center_y,
|
|
clip_result);
|
|
}
|
|
}
|
|
CODE
|
|
);
|
|
}
|
|
|
|
sub drawable_transform_rotate {
|
|
$blurb = <<'BLURB';
|
|
Rotate the specified drawable about given coordinates through the
|
|
specified angle.
|
|
BLURB
|
|
|
|
$help = <<'HELP';
|
|
This function rotates the specified drawable if no selection
|
|
exists. If a selection exists, the portion of the drawable which lies
|
|
under the selection is cut from the drawable and made into a floating
|
|
selection which is then rotated by the specified amount. The return
|
|
value is the ID of the rotated drawable. If there was no selection,
|
|
this will be equal to the drawable ID supplied as input. Otherwise,
|
|
this will be the newly created and rotated drawable.
|
|
HELP
|
|
|
|
&joao_pdb_misc('2004', '2.2');
|
|
|
|
@inargs = (
|
|
{ name => 'drawable', type => 'drawable',
|
|
desc => 'The affected drawable' },
|
|
{ name => 'angle', type => 'float',
|
|
desc => 'The angle of rotation (radians)' },
|
|
{ name => 'auto_center', type => 'boolean',
|
|
desc => 'Whether to automatically rotate around the selection center' },
|
|
{ name => 'center_x', type => 'int32',
|
|
desc => 'The hor. coordinate of the center of rotation' },
|
|
{ name => 'center_y', type => 'int32',
|
|
desc => 'The vert. coordinate of the center of rotation' },
|
|
{ name => 'transform_direction', type => 'enum GimpTransformDirection',
|
|
desc => 'Direction of transformation' },
|
|
{ name => 'interpolation', type => 'enum GimpInterpolationType',
|
|
desc => 'Type of interpolation' },
|
|
{ name => 'supersample', type => 'boolean',
|
|
desc => 'This parameter is ignored, supersampling is performed based on the interpolation type' },
|
|
{ name => 'recursion_level', type => '1 <= int32',
|
|
desc => 'Maximum recursion level used for supersampling (3 is a nice value)' },
|
|
{ name => 'clip_result', type => 'enum GimpTransformResize',
|
|
desc => 'How to clip results' }
|
|
);
|
|
|
|
@outargs = (
|
|
{ name => 'drawable', type => 'drawable', no_declare => 1,
|
|
desc => 'The rotated drawable' }
|
|
);
|
|
|
|
transform_invoke ("Rotating", <<CODE);
|
|
gimp_matrix3_identity (&matrix);
|
|
if (auto_center)
|
|
gimp_transform_matrix_rotate_rect (&matrix,
|
|
x, y, width, height, angle);
|
|
else
|
|
gimp_transform_matrix_rotate_center (&matrix,
|
|
center_x, center_y, angle);
|
|
CODE
|
|
}
|
|
|
|
|
|
sub drawable_transform_rotate_default {
|
|
$blurb = <<'BLURB';
|
|
Rotate the specified drawable about given coordinates through the specified angle.
|
|
BLURB
|
|
|
|
$help = <<'HELP';
|
|
This procedure is a variant of gimp_drawable_transform_rotate() which
|
|
uses no interpolation/supersampling at all, or default values
|
|
(depending on the 'interpolate' parameter).
|
|
HELP
|
|
|
|
&joao_pdb_misc('2004', '2.2');
|
|
|
|
@inargs = (
|
|
{ name => 'drawable', type => 'drawable',
|
|
desc => 'The affected drawable' },
|
|
{ name => 'angle', type => 'float',
|
|
desc => 'The angle of rotation (radians)' },
|
|
{ name => 'auto_center', type => 'boolean',
|
|
desc => 'Whether to automatically rotate around the selection center' },
|
|
{ name => 'center_x', type => 'int32',
|
|
desc => 'The hor. coordinate of the center of rotation' },
|
|
{ name => 'center_y', type => 'int32',
|
|
desc => 'The vert. coordinate of the center of rotation' },
|
|
{ name => 'interpolate', type => 'boolean',
|
|
desc => 'Whether to use interpolation and supersampling' },
|
|
{ name => 'clip_result', type => 'enum GimpTransformResize',
|
|
desc => 'How to clip results' }
|
|
);
|
|
|
|
@outargs = (
|
|
{ name => 'drawable', type => 'drawable', no_declare => 1,
|
|
desc => 'The rotated drawable' }
|
|
);
|
|
|
|
transform_default_invoke ("Rotating", <<CODE);
|
|
gimp_matrix3_identity (&matrix);
|
|
if (auto_center)
|
|
gimp_transform_matrix_rotate_rect (&matrix,
|
|
x, y, width, height, angle);
|
|
else
|
|
gimp_transform_matrix_rotate_center (&matrix,
|
|
center_x, center_y, angle);
|
|
CODE
|
|
}
|
|
|
|
|
|
sub drawable_transform_scale {
|
|
$blurb = 'Scale the specified drawable with extra parameters';
|
|
|
|
$help = <<'HELP';
|
|
This procedure scales the specified drawable if no selection
|
|
exists. If a selection exists, the portion of the drawable which lies
|
|
under the selection is cut from the drawable and made into a floating
|
|
selection which is then scaled by the specified amount. The return
|
|
value is the ID of the scaled drawable. If there was no selection,
|
|
this will be equal to the drawable ID supplied as input. Otherwise,
|
|
this will be the newly created and scaled drawable.
|
|
HELP
|
|
|
|
&joao_pdb_misc('2004', '2.2');
|
|
|
|
@inargs = (
|
|
{ name => 'drawable', type => 'drawable',
|
|
desc => 'The affected drawable' },
|
|
{ name => 'x0', type => 'float',
|
|
desc => 'The new x coordinate of the upper-left corner of the
|
|
scaled region' },
|
|
{ name => 'y0', type => 'float',
|
|
desc => 'The new y coordinate of the upper-left corner of the
|
|
scaled region' },
|
|
{ name => 'x1', type => 'float',
|
|
desc => 'The new x coordinate of the lower-right corner of the
|
|
scaled region' },
|
|
{ name => 'y1', type => 'float',
|
|
desc => 'The new y coordinate of the lower-right corner of the
|
|
scaled region' },
|
|
{ name => 'transform_direction', type => 'enum GimpTransformDirection',
|
|
desc => 'Direction of transformation' },
|
|
{ name => 'interpolation', type => 'enum GimpInterpolationType',
|
|
desc => 'Type of interpolation' },
|
|
{ name => 'supersample', type => 'boolean',
|
|
desc => 'This parameter is ignored, supersampling is performed based on the interpolation type' },
|
|
{ name => 'recursion_level', type => '1 <= int32',
|
|
desc => 'Maximum recursion level used for supersampling (3 is a nice value)' },
|
|
{ name => 'clip_result', type => 'enum GimpTransformResize',
|
|
desc => 'How to clip results' }
|
|
);
|
|
|
|
@outargs = (
|
|
{ name => 'drawable', type => 'drawable', no_declare => 1,
|
|
desc => 'The scaled drawable' }
|
|
);
|
|
|
|
transform_invoke ("Scaling", <<CODE, 'x0 < x1 && y0 < y1');
|
|
gimp_matrix3_identity (&matrix);
|
|
gimp_transform_matrix_scale (&matrix,
|
|
x, y, width, height,
|
|
x0, y0, x1 - x0, y1 - y0);
|
|
CODE
|
|
}
|
|
|
|
|
|
sub drawable_transform_scale_default {
|
|
$blurb = 'Scale the specified drawable with extra parameters';
|
|
|
|
$help = <<'HELP';
|
|
This procedure is a variant of gimp_drawable_transform_scale() which
|
|
uses no interpolation/supersampling at all, or default values
|
|
(depending on the 'interpolate' parameter).
|
|
HELP
|
|
|
|
&joao_pdb_misc('2004', '2.2');
|
|
|
|
@inargs = (
|
|
{ name => 'drawable', type => 'drawable',
|
|
desc => 'The affected drawable' },
|
|
{ name => 'x0', type => 'float',
|
|
desc => 'The new x coordinate of the upper-left corner of the
|
|
scaled region' },
|
|
{ name => 'y0', type => 'float',
|
|
desc => 'The new y coordinate of the upper-left corner of the
|
|
scaled region' },
|
|
{ name => 'x1', type => 'float',
|
|
desc => 'The new x coordinate of the lower-right corner of the
|
|
scaled region' },
|
|
{ name => 'y1', type => 'float',
|
|
desc => 'The new y coordinate of the lower-right corner of the
|
|
scaled region' },
|
|
{ name => 'interpolate', type => 'boolean',
|
|
desc => 'Whether to use interpolation and supersampling' },
|
|
{ name => 'clip_result', type => 'enum GimpTransformResize',
|
|
desc => 'How to clip results' }
|
|
);
|
|
|
|
@outargs = (
|
|
{ name => 'drawable', type => 'drawable', no_declare => 1,
|
|
desc => 'The scaled drawable' }
|
|
);
|
|
|
|
transform_default_invoke ("Scaling", <<CODE, 'x0 < x1 && y0 < y1');
|
|
gimp_matrix3_identity (&matrix);
|
|
gimp_transform_matrix_scale (&matrix,
|
|
x, y, width, height,
|
|
x0, y0, x1 - x0, y1 - y0);
|
|
CODE
|
|
}
|
|
|
|
|
|
sub drawable_transform_shear {
|
|
$blurb = <<'BLURB';
|
|
Shear the specified drawable about its center by the specified magnitude, with extra parameters.
|
|
BLURB
|
|
|
|
$help = <<'HELP';
|
|
This procedure shears the specified drawable if no selection
|
|
exists. If a selection exists, the portion of the drawable which lies
|
|
under the selection is cut from the drawable and made into a floating
|
|
selection which is then sheard by the specified amount. The return
|
|
value is the ID of the sheard drawable. If there was no selection,
|
|
this will be equal to the drawable ID supplied as input. Otherwise,
|
|
this will be the newly created and sheard drawable. The shear type
|
|
parameter indicates whether the shear will be applied horizontally or
|
|
vertically. The magnitude can be either positive or negative and
|
|
indicates the extent (in pixels) to shear by.
|
|
HELP
|
|
|
|
&joao_pdb_misc('2004', '2.2');
|
|
|
|
@inargs = (
|
|
{ name => 'drawable', type => 'drawable',
|
|
desc => 'The affected drawable' },
|
|
{ name => 'shear_type',
|
|
type => 'enum GimpOrientationType (no GIMP_ORIENTATION_UNKNOWN)',
|
|
desc => 'Type of shear' },
|
|
{ name => 'magnitude', type => 'float',
|
|
desc => 'The magnitude of the shear' },
|
|
{ name => 'transform_direction', type => 'enum GimpTransformDirection',
|
|
desc => 'Direction of transformation' },
|
|
{ name => 'interpolation', type => 'enum GimpInterpolationType',
|
|
desc => 'Type of interpolation' },
|
|
{ name => 'supersample', type => 'boolean',
|
|
desc => 'This parameter is ignored, supersampling is performed based on the interpolation type' },
|
|
{ name => 'recursion_level', type => '1 <= int32',
|
|
desc => 'Maximum recursion level used for supersampling (3 is a nice value)' },
|
|
{ name => 'clip_result', type => 'enum GimpTransformResize',
|
|
desc => 'How to clip results' }
|
|
);
|
|
|
|
@outargs = (
|
|
{ name => 'drawable', type => 'drawable', no_declare => 1,
|
|
desc => 'The sheared drawable' }
|
|
);
|
|
|
|
transform_invoke ("Shearing", <<CODE);
|
|
gimp_matrix3_identity (&matrix);
|
|
gimp_transform_matrix_shear (&matrix,
|
|
x, y, width, height,
|
|
shear_type, magnitude);
|
|
CODE
|
|
}
|
|
|
|
|
|
sub drawable_transform_shear_default {
|
|
$blurb = <<'BLURB';
|
|
Shear the specified drawable about its center by the specified magnitude, with extra parameters.
|
|
BLURB
|
|
|
|
$help = <<'HELP';
|
|
This procedure is a variant of gimp_drawable_transform_shear() which
|
|
uses no interpolation/supersampling at all, or default values
|
|
(depending on the 'interpolate' parameter).
|
|
HELP
|
|
|
|
&joao_pdb_misc('2004', '2.2');
|
|
|
|
@inargs = (
|
|
{ name => 'drawable', type => 'drawable',
|
|
desc => 'The affected drawable' },
|
|
{ name => 'shear_type',
|
|
type => 'enum GimpOrientationType (no GIMP_ORIENTATION_UNKNOWN)',
|
|
desc => 'Type of shear' },
|
|
{ name => 'magnitude', type => 'float',
|
|
desc => 'The magnitude of the shear' },
|
|
{ name => 'interpolate', type => 'boolean',
|
|
desc => 'Whether to use interpolation and supersampling' },
|
|
{ name => 'clip_result', type => 'enum GimpTransformResize',
|
|
desc => 'How to clip results' }
|
|
);
|
|
|
|
@outargs = (
|
|
{ name => 'drawable', type => 'drawable', no_declare => 1,
|
|
desc => 'The sheared drawable' }
|
|
);
|
|
|
|
transform_default_invoke ("Shearing", <<CODE);
|
|
gimp_matrix3_identity (&matrix);
|
|
gimp_transform_matrix_shear (&matrix,
|
|
x, y, width, height,
|
|
shear_type, magnitude);
|
|
CODE
|
|
}
|
|
|
|
|
|
sub drawable_transform_2d {
|
|
$blurb = <<'BLURB';
|
|
Transform the specified drawable in 2d, with extra parameters.
|
|
BLURB
|
|
|
|
$help = <<'HELP';
|
|
This procedure transforms the specified drawable if no selection
|
|
exists. If a selection exists, the portion of the drawable which lies
|
|
under the selection is cut from the drawable and made into a floating
|
|
selection which is then transformed. The transformation is done by
|
|
scaling the image by the x and y scale factors about the point
|
|
(source_x, source_y), then rotating around the same point, then
|
|
translating that point to the new position (dest_x, dest_y). The
|
|
return value is the ID of the rotated drawable. If there was no
|
|
selection, this will be equal to the drawable ID supplied as
|
|
input. Otherwise, this will be the newly created and transformed
|
|
drawable.
|
|
HELP
|
|
|
|
&joao_pdb_misc('2004', '2.2');
|
|
|
|
@inargs = (
|
|
{ name => 'drawable', type => 'drawable',
|
|
desc => 'The affected drawable' },
|
|
{ name => 'source_x', type => 'float',
|
|
desc => 'X coordinate of the transformation center' },
|
|
{ name => 'source_y', type => 'float',
|
|
desc => 'Y coordinate of the transformation center' },
|
|
{ name => 'scale_x', type => 'float',
|
|
desc => 'Amount to scale in x direction' },
|
|
{ name => 'scale_y', type => 'float',
|
|
desc => 'Amount to scale in y direction' },
|
|
{ name => 'angle', type => 'float',
|
|
desc => 'The angle of rotation (radians)' },
|
|
{ name => 'dest_x', type => 'float',
|
|
desc => 'X coordinate of where the center goes' },
|
|
{ name => 'dest_y', type => 'float',
|
|
desc => 'Y coordinate of where the center goes' },
|
|
{ name => 'transform_direction', type => 'enum GimpTransformDirection',
|
|
desc => 'Direction of transformation' },
|
|
{ name => 'interpolation', type => 'enum GimpInterpolationType',
|
|
desc => 'Type of interpolation' },
|
|
{ name => 'supersample', type => 'boolean',
|
|
desc => 'This parameter is ignored, supersampling is performed based on the interpolation type' },
|
|
{ name => 'recursion_level', type => '1 <= int32',
|
|
desc => 'Maximum recursion level used for supersampling (3 is a nice value)' },
|
|
{ name => 'clip_result', type => 'enum GimpTransformResize',
|
|
desc => 'How to clip results' }
|
|
);
|
|
|
|
@outargs = (
|
|
{ name => 'drawable', type => 'drawable', no_declare => 1,
|
|
desc => 'The transformed drawable' }
|
|
);
|
|
|
|
transform_invoke ("2D Transform", <<CODE);
|
|
gimp_matrix3_identity (&matrix);
|
|
gimp_matrix3_translate (&matrix, -source_x, -source_y);
|
|
gimp_matrix3_scale (&matrix, scale_x, scale_y);
|
|
gimp_matrix3_rotate (&matrix, angle);
|
|
gimp_matrix3_translate (&matrix, dest_x, dest_y);
|
|
CODE
|
|
}
|
|
|
|
|
|
sub drawable_transform_2d_default {
|
|
$blurb = <<'BLURB';
|
|
Transform the specified drawable in 2d, with extra parameters.
|
|
BLURB
|
|
|
|
$help = <<'HELP';
|
|
This procedure is a variant of gimp_drawable_transform_2d() which
|
|
uses no interpolation/supersampling at all, or default values
|
|
(depending on the 'interpolate' parameter).
|
|
HELP
|
|
|
|
&joao_pdb_misc('2004', '2.2');
|
|
|
|
@inargs = (
|
|
{ name => 'drawable', type => 'drawable',
|
|
desc => 'The affected drawable' },
|
|
{ name => 'source_x', type => 'float',
|
|
desc => 'X coordinate of the transformation center' },
|
|
{ name => 'source_y', type => 'float',
|
|
desc => 'Y coordinate of the transformation center' },
|
|
{ name => 'scale_x', type => 'float',
|
|
desc => 'Amount to scale in x direction' },
|
|
{ name => 'scale_y', type => 'float',
|
|
desc => 'Amount to scale in y direction' },
|
|
{ name => 'angle', type => 'float',
|
|
desc => 'The angle of rotation (radians)' },
|
|
{ name => 'dest_x', type => 'float',
|
|
desc => 'X coordinate of where the center goes' },
|
|
{ name => 'dest_y', type => 'float',
|
|
desc => 'Y coordinate of where the center goes' },
|
|
{ name => 'interpolate', type => 'boolean',
|
|
desc => 'Whether to use interpolation and supersampling' },
|
|
{ name => 'clip_result', type => 'enum GimpTransformResize',
|
|
desc => 'How to clip results' }
|
|
);
|
|
|
|
@outargs = (
|
|
{ name => 'drawable', type => 'drawable', no_declare => 1,
|
|
desc => 'The transformed drawable' }
|
|
);
|
|
|
|
transform_default_invoke ("2D Transforming", <<CODE);
|
|
gimp_matrix3_identity (&matrix);
|
|
gimp_matrix3_translate (&matrix, -source_x, -source_y);
|
|
gimp_matrix3_scale (&matrix, scale_x, scale_y);
|
|
gimp_matrix3_rotate (&matrix, angle);
|
|
gimp_matrix3_translate (&matrix, dest_x, dest_y);
|
|
CODE
|
|
}
|
|
|
|
|
|
sub drawable_transform_matrix {
|
|
$blurb = <<'BLURB';
|
|
Transform the specified drawable in 2d, with extra parameters.
|
|
BLURB
|
|
|
|
$help = <<'HELP';
|
|
This procedure transforms the specified drawable if no selection
|
|
exists. If a selection exists, the portion of the drawable which lies
|
|
under the selection is cut from the drawable and made into a floating
|
|
selection which is then transformed. The transformation is done by
|
|
assembling a 3x3 matrix from the coefficients passed. The return
|
|
value is the ID of the rotated drawable. If there was no selection,
|
|
this will be equal to the drawable ID supplied as input. Otherwise,
|
|
this will be the newly created and transformed drawable.
|
|
HELP
|
|
|
|
&joao_pdb_misc('2004', '2.2');
|
|
|
|
@inargs = (
|
|
{ name => 'drawable', type => 'drawable',
|
|
desc => 'The affected drawable' },
|
|
{ name => 'coeff_0_0', type => 'float',
|
|
desc => 'coefficient (0,0) of the transformation matrix' },
|
|
{ name => 'coeff_0_1', type => 'float',
|
|
desc => 'coefficient (0,1) of the transformation matrix' },
|
|
{ name => 'coeff_0_2', type => 'float',
|
|
desc => 'coefficient (0,2) of the transformation matrix' },
|
|
{ name => 'coeff_1_0', type => 'float',
|
|
desc => 'coefficient (1,0) of the transformation matrix' },
|
|
{ name => 'coeff_1_1', type => 'float',
|
|
desc => 'coefficient (1,1) of the transformation matrix' },
|
|
{ name => 'coeff_1_2', type => 'float',
|
|
desc => 'coefficient (1,2) of the transformation matrix' },
|
|
{ name => 'coeff_2_0', type => 'float',
|
|
desc => 'coefficient (2,0) of the transformation matrix' },
|
|
{ name => 'coeff_2_1', type => 'float',
|
|
desc => 'coefficient (2,1) of the transformation matrix' },
|
|
{ name => 'coeff_2_2', type => 'float',
|
|
desc => 'coefficient (2,2) of the transformation matrix' },
|
|
{ name => 'transform_direction', type => 'enum GimpTransformDirection',
|
|
desc => 'Direction of transformation' },
|
|
{ name => 'interpolation', type => 'enum GimpInterpolationType',
|
|
desc => 'Type of interpolation' },
|
|
{ name => 'supersample', type => 'boolean',
|
|
desc => 'This parameter is ignored, supersampling is performed based on the interpolation type' },
|
|
{ name => 'recursion_level', type => '1 <= int32',
|
|
desc => 'Maximum recursion level used for supersampling (3 is a nice value)' },
|
|
{ name => 'clip_result', type => 'enum GimpTransformResize',
|
|
desc => 'How to clip results' }
|
|
);
|
|
|
|
@outargs = (
|
|
{ name => 'drawable', type => 'drawable', no_declare => 1,
|
|
desc => 'The transformed drawable' }
|
|
);
|
|
|
|
transform_invoke ("2D Transforming", <<CODE);
|
|
matrix.coeff[0][0] = coeff_0_0;
|
|
matrix.coeff[0][1] = coeff_0_1;
|
|
matrix.coeff[0][2] = coeff_0_2;
|
|
matrix.coeff[1][0] = coeff_1_0;
|
|
matrix.coeff[1][1] = coeff_1_1;
|
|
matrix.coeff[1][2] = coeff_1_2;
|
|
matrix.coeff[2][0] = coeff_2_0;
|
|
matrix.coeff[2][1] = coeff_2_1;
|
|
matrix.coeff[2][2] = coeff_2_2;
|
|
CODE
|
|
}
|
|
|
|
|
|
sub drawable_transform_matrix_default {
|
|
$blurb = <<'BLURB';
|
|
Transform the specified drawable in 2d, with extra parameters.
|
|
BLURB
|
|
|
|
$help = <<'HELP';
|
|
This procedure is a variant of gimp_drawable_transform_matrix() which
|
|
uses no interpolation/supersampling at all, or default values
|
|
(depending on the 'interpolate' parameter).
|
|
HELP
|
|
|
|
&joao_pdb_misc('2004', '2.2');
|
|
|
|
@inargs = (
|
|
{ name => 'drawable', type => 'drawable',
|
|
desc => 'The affected drawable' },
|
|
{ name => 'coeff_0_0', type => 'float',
|
|
desc => 'coefficient (0,0) of the transformation matrix' },
|
|
{ name => 'coeff_0_1', type => 'float',
|
|
desc => 'coefficient (0,1) of the transformation matrix' },
|
|
{ name => 'coeff_0_2', type => 'float',
|
|
desc => 'coefficient (0,2) of the transformation matrix' },
|
|
{ name => 'coeff_1_0', type => 'float',
|
|
desc => 'coefficient (1,0) of the transformation matrix' },
|
|
{ name => 'coeff_1_1', type => 'float',
|
|
desc => 'coefficient (1,1) of the transformation matrix' },
|
|
{ name => 'coeff_1_2', type => 'float',
|
|
desc => 'coefficient (1,2) of the transformation matrix' },
|
|
{ name => 'coeff_2_0', type => 'float',
|
|
desc => 'coefficient (2,0) of the transformation matrix' },
|
|
{ name => 'coeff_2_1', type => 'float',
|
|
desc => 'coefficient (2,1) of the transformation matrix' },
|
|
{ name => 'coeff_2_2', type => 'float',
|
|
desc => 'coefficient (2,2) of the transformation matrix' },
|
|
{ name => 'interpolate', type => 'boolean',
|
|
desc => 'Whether to use interpolation and supersampling' },
|
|
{ name => 'clip_result', type => 'enum GimpTransformResize',
|
|
desc => 'How to clip results' }
|
|
);
|
|
|
|
@outargs = (
|
|
{ name => 'drawable', type => 'drawable', no_declare => 1,
|
|
desc => 'The transformed drawable' }
|
|
);
|
|
|
|
transform_default_invoke ("2D Transforming", <<CODE);
|
|
matrix.coeff[0][0] = coeff_0_0;
|
|
matrix.coeff[0][1] = coeff_0_1;
|
|
matrix.coeff[0][2] = coeff_0_2;
|
|
matrix.coeff[1][0] = coeff_1_0;
|
|
matrix.coeff[1][1] = coeff_1_1;
|
|
matrix.coeff[1][2] = coeff_1_2;
|
|
matrix.coeff[2][0] = coeff_2_0;
|
|
matrix.coeff[2][1] = coeff_2_1;
|
|
matrix.coeff[2][2] = coeff_2_2;
|
|
CODE
|
|
}
|
|
|
|
|
|
@headers = qw("libgimpmath/gimpmath.h"
|
|
"config/gimpcoreconfig.h"
|
|
"core/gimp.h"
|
|
"core/gimp-transform-utils.h"
|
|
"core/gimpimage.h"
|
|
"core/gimpdrawable.h"
|
|
"core/gimpdrawable-transform.h"
|
|
"core/gimpprogress.h"
|
|
"gimppdb-utils.h"
|
|
"gimp-intl.h");
|
|
|
|
@procs = qw(drawable_transform_flip_simple
|
|
drawable_transform_flip
|
|
drawable_transform_flip_default
|
|
drawable_transform_perspective
|
|
drawable_transform_perspective_default
|
|
drawable_transform_rotate_simple
|
|
drawable_transform_rotate
|
|
drawable_transform_rotate_default
|
|
drawable_transform_scale
|
|
drawable_transform_scale_default
|
|
drawable_transform_shear
|
|
drawable_transform_shear_default
|
|
drawable_transform_2d
|
|
drawable_transform_2d_default
|
|
drawable_transform_matrix
|
|
drawable_transform_matrix_default);
|
|
|
|
%exports = (app => [@procs], lib => [@procs]);
|
|
|
|
$desc = 'Transformation procedures';
|
|
|
|
1;
|