Don't transform the tiles of group layers, use the item transform API instead. Go the same code path if there is no selection.
921 lines
33 KiB
Text
921 lines
33 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), NULL, TRUE, error);';
|
|
|
|
if ($check) {
|
|
$success_check = "(gimp_pdb_item_is_attached (GIMP_ITEM (drawable), NULL, TRUE, error) && " . $check . ");";
|
|
}
|
|
|
|
%invoke = (
|
|
code => <<"CODE"
|
|
{
|
|
gint x, y, width, height;
|
|
|
|
success = $success_check
|
|
|
|
if (success &&
|
|
gimp_item_mask_intersect (GIMP_ITEM (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);
|
|
|
|
if (! gimp_viewable_get_children (GIMP_VIEWABLE (drawable)) &&
|
|
! gimp_channel_is_empty (gimp_image_get_mask (gimp_item_get_image (GIMP_ITEM (drawable)))))
|
|
{
|
|
if (! gimp_drawable_transform_affine (drawable, context,
|
|
&matrix, transform_direction,
|
|
interpolation, recursion_level,
|
|
clip_result, progress))
|
|
{
|
|
success = FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
gimp_item_transform (GIMP_ITEM (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), NULL, TRUE, error);';
|
|
|
|
if ($check) {
|
|
$success_check = "(gimp_pdb_item_is_attached (GIMP_ITEM (drawable), NULL, TRUE, error) && " . $check . ");";
|
|
}
|
|
|
|
%invoke = (
|
|
code => <<"CODE"
|
|
{
|
|
gint x, y, width, height;
|
|
|
|
success = $success_check
|
|
|
|
if (success &&
|
|
gimp_item_mask_intersect (GIMP_ITEM (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);
|
|
|
|
if (! gimp_viewable_get_children (GIMP_VIEWABLE (drawable)) &&
|
|
! gimp_channel_is_empty (gimp_image_get_mask (gimp_item_get_image (GIMP_ITEM (drawable)))))
|
|
{
|
|
if (! gimp_drawable_transform_affine (drawable, context,
|
|
&matrix, GIMP_TRANSFORM_FORWARD,
|
|
interpolation_type, 3,
|
|
clip_result, progress))
|
|
{
|
|
success = FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
gimp_item_transform (GIMP_ITEM (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 {
|
|
&std_pdb_deprecated('gimp-item-transform-flip-simple');
|
|
&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), NULL, TRUE, error);
|
|
|
|
if (success &&
|
|
gimp_item_mask_intersect (GIMP_ITEM (drawable), &x, &y, &width, &height))
|
|
{
|
|
gimp_transform_get_flip_axis (x, y, width, height,
|
|
flip_type, auto_center, &axis);
|
|
|
|
if (! gimp_viewable_get_children (GIMP_VIEWABLE (drawable)) &&
|
|
! gimp_channel_is_empty (gimp_image_get_mask (gimp_item_get_image (GIMP_ITEM (drawable)))))
|
|
{
|
|
if (! gimp_drawable_transform_flip (drawable, context,
|
|
flip_type, axis, clip_result))
|
|
{
|
|
success = FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
gimp_item_flip (GIMP_ITEM (drawable), context,
|
|
flip_type, axis, clip_result);
|
|
}
|
|
}
|
|
}
|
|
CODE
|
|
);
|
|
}
|
|
|
|
|
|
sub drawable_transform_flip {
|
|
&std_pdb_deprecated('gimp-item-transform-flip');
|
|
&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 {
|
|
&std_pdb_deprecated('gimp-item-transform-flip');
|
|
&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 {
|
|
&std_pdb_deprecated('gimp-item-transform-perspective');
|
|
&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 {
|
|
&std_pdb_deprecated('gimp-item-transform-perspective');
|
|
&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 {
|
|
&std_pdb_deprecated('gimp-item-transform-rotate-simple');
|
|
&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), NULL, FALSE, error);
|
|
|
|
if (success &&
|
|
gimp_item_mask_intersect (GIMP_ITEM (drawable), &x, &y, &width, &height))
|
|
{
|
|
gdouble cx = center_x;
|
|
gdouble cy = center_y;
|
|
|
|
gimp_transform_get_rotate_center (x, y, width, height,
|
|
auto_center, &cx, &cy);
|
|
|
|
if (! gimp_viewable_get_children (GIMP_VIEWABLE (drawable)) &&
|
|
! gimp_channel_is_empty (gimp_image_get_mask (gimp_item_get_image (GIMP_ITEM (drawable)))))
|
|
{
|
|
if (! gimp_drawable_transform_rotate (drawable, context,
|
|
rotate_type, cx, cy,
|
|
clip_result))
|
|
{
|
|
success = FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
gimp_item_rotate (GIMP_ITEM (drawable), context,
|
|
rotate_type, cx, cy,
|
|
clip_result);
|
|
}
|
|
}
|
|
}
|
|
CODE
|
|
);
|
|
}
|
|
|
|
sub drawable_transform_rotate {
|
|
&std_pdb_deprecated('gimp-item-transform-rotate');
|
|
&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 {
|
|
&std_pdb_deprecated('gimp-item-transform-rotate');
|
|
&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 {
|
|
&std_pdb_deprecated('gimp-item-transform-scale');
|
|
&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 {
|
|
&std_pdb_deprecated('gimp-item-transform-scale');
|
|
&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 {
|
|
&std_pdb_deprecated('gimp-item-transform-shear');
|
|
&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 {
|
|
&std_pdb_deprecated('gimp-item-transform-shear');
|
|
&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 {
|
|
&std_pdb_deprecated('gimp-item-transform-2d');
|
|
&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 {
|
|
&std_pdb_deprecated('gimp-item-transform-2d');
|
|
&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 {
|
|
&std_pdb_deprecated('gimp-item-transform-matrix');
|
|
&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 {
|
|
&std_pdb_deprecated('gimp-item-transform-matrix');
|
|
&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/gimpchannel.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';
|
|
$doc_title = 'gimpdrawabletransform';
|
|
$doc_short_desc = 'Functions to perform transformatrions on drawables.';
|
|
$doc_long_desc = 'Functions to perform transformatrions on drawables.';
|
|
|
|
1;
|