mirror of
https://gitlab.gnome.org/GNOME/gimp
synced 2024-10-22 20:41:43 +00:00
eeec3cedb8
2003-02-07 Michael Natterer <mitch@gimp.org> Added object properties for almost all tool_options values and registered lots of enums with the type system: Part I (enum and type cleanup): * app/core/core-enums.[ch] * app/core/core-types.h: removed InternalOrientaionType and register GimpOrientationType. Register GimpChannelOps. Removed GimpToolOptionsGUIFunc. * app/xcf/xcf-private.h: added XcfOrientationType with the same values as the old InternalOrientationType * app/xcf/xcf-load.c * app/xcf/xcf-save.c: translate between GimpOrientationType and XcfOrientationType. * app/core/gimpdrawable-transform-utils.[ch] * app/core/gimpdrawable-transform.[ch] * app/core/gimpimage-crop.c * app/core/gimpimage-duplicate.c * app/core/gimpimage-guides.c * app/core/gimpimage-resize.c * app/core/gimpimage-scale.c * app/core/gimpimage.h * app/display/gimpdisplayshell.c * tools/pdbgen/stddefs.pdb * tools/pdbgen/pdb/transform_tools.pdb: changed accordingly. * app/pdb/guides_cmds.c * app/pdb/transform_tools_cmds.c * libgimp/gimpenums.h * libgimpproxy/gimpproxytypes.h * plug-ins/script-fu/script-fu-constants.c * tools/pdbgen/enums.pl: regenerated. * libgimptool/gimptoolenums.[ch]: added GimpTransformGridType. * libgimptool/gimptooltypes.h: removed GimpToolOptionsResetFunc, added GimpToolOptionsGUIFunc. Part II (tool options changes): * app/config/gimpconfig-utils.c (gimp_config_reset_properties): don't reset object properties because they have NULL as default value. * app/widgets/gimppropwidgets.[ch]: added gimp_prop_[enum|boolean]_radio_frame_new(), gimp_prop_paint_mode_menu_new() and gimp_prop_scale_entry_new(), which are all needed by the new tool options GUI code. * app/tools/tool_options.[ch]: removed the "reset_func" since the virtual reset() method is used now. * app/paint/gimpairbrushoptions.[ch] * app/paint/gimpcloneoptions.[ch] * app/paint/gimpconvolveoptions.[ch] * app/paint/gimpdodgeburnoptions.[ch] * app/paint/gimperaseroptions.[ch] * app/paint/gimppaintoptions.[ch] * app/paint/gimpsmudgeoptions.[ch]: added properties all over the place and removed the widget and default_value members from the structs. Renamed some values (e.g. s/type/clone_type/). Don't #include <gtk/gtk.h>. * app/paint/gimpairbrush.c * app/paint/gimpclone.c * app/paint/gimpconvolve.c * app/paint/gimpdodgeburn.c * app/paint/gimperaser.c * app/paint/gimppaintbrush.c * app/paint/gimppaintcore-stroke.c * app/paint/gimppaintcore.c * app/paint/gimppencil.c * app/paint/gimpsmudge.c * app/paint/paint-types.h * app/paint/paint.c: changed accordingly. Don't #include <gtk/gtk.h>. * tools/pdbgen/pdb/paint_tools.pdb: changed accordingly. * app/pdb/paint_tools_cmds.c: regenerated. * app/tools/gimpblendoptions.[ch] * app/tools/gimpbucketfilloptions.[ch] * app/tools/gimpcolorpickeroptions.[ch] * app/tools/gimpcropoptions.[ch] * app/tools/gimpflipoptions.[ch] * app/tools/gimpinkoptions.c * app/tools/gimpmagnifyoptions.[ch] * app/tools/gimpmeasureoptions.[ch] * app/tools/gimpmoveoptions.[ch] * app/tools/gimptextoptions.c * app/tools/paint_options.[ch] * app/tools/selection_options.[ch] * app/tools/transform_options.[ch]: ditto: added properties and removed widget and default_value stuff. Removed most reset functions. Use gimp_prop widgets all over the place, renamed some values as above. * app/tools/Makefile.am * app/tools/gimpairbrushtool.c * app/tools/gimpblendtool.c * app/tools/gimpbucketfilltool.c * app/tools/gimpbycolorselecttool.c * app/tools/gimpclonetool.c * app/tools/gimpconvolvetool.c * app/tools/gimpcroptool.c * app/tools/gimpdodgeburntool.c * app/tools/gimperasertool.c * app/tools/gimpfliptool.c * app/tools/gimpfuzzyselecttool.c * app/tools/gimpmagnifytool.c * app/tools/gimpmovetool.c * app/tools/gimpselectiontool.c * app/tools/gimpsheartool.c * app/tools/gimpsmudgetool.c * app/tools/gimptransformtool.c * app/tools/gimpvectoroptions.c: changed accordingly. Ported the paint_options GUI constructors to gimp_prop widgets. * app/widgets/gimpselectioneditor.c * app/gui/tool-options-dialog.c: changed accordingly.
206 lines
6.2 KiB
C
206 lines
6.2 KiB
C
/* The GIMP -- an image manipulation program
|
|
* Copyright (C) 1995-2001 Spencer Kimball, Peter Mattis, and others
|
|
*
|
|
* 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 2 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, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#include <glib-object.h>
|
|
|
|
#include "libgimpmath/gimpmath.h"
|
|
|
|
#include "core-types.h"
|
|
|
|
#include "gimpdrawable-transform-utils.h"
|
|
|
|
|
|
void
|
|
gimp_drawable_transform_matrix_rotate (gint x1,
|
|
gint y1,
|
|
gint x2,
|
|
gint y2,
|
|
gdouble angle,
|
|
GimpMatrix3 result)
|
|
{
|
|
gdouble cx;
|
|
gdouble cy;
|
|
|
|
cx = (gdouble) (x1 + x2) / 2.0;
|
|
cy = (gdouble) (y1 + y2) / 2.0;
|
|
|
|
gimp_matrix3_identity (result);
|
|
gimp_matrix3_translate (result, -cx, -cy);
|
|
gimp_matrix3_rotate (result, angle);
|
|
gimp_matrix3_translate (result, +cx, +cy);
|
|
}
|
|
|
|
void
|
|
gimp_drawable_transform_matrix_rotate_center (gdouble cx,
|
|
gdouble cy,
|
|
gdouble angle,
|
|
GimpMatrix3 result)
|
|
{
|
|
gimp_matrix3_identity (result);
|
|
gimp_matrix3_translate (result, -cx, -cy);
|
|
gimp_matrix3_rotate (result, angle);
|
|
gimp_matrix3_translate (result, +cx, +cy);
|
|
}
|
|
|
|
void
|
|
gimp_drawable_transform_matrix_scale (gint x1,
|
|
gint y1,
|
|
gint x2,
|
|
gint y2,
|
|
gdouble tx1,
|
|
gdouble ty1,
|
|
gdouble tx2,
|
|
gdouble ty2,
|
|
GimpMatrix3 result)
|
|
{
|
|
gdouble scalex;
|
|
gdouble scaley;
|
|
|
|
scalex = scaley = 1.0;
|
|
|
|
if ((x2 - x1) > 0)
|
|
scalex = (tx2 - tx1) / (gdouble) (x2 - x1);
|
|
|
|
if ((y2 - y1) > 0)
|
|
scaley = (ty2 - ty1) / (gdouble) (y2 - y1);
|
|
|
|
gimp_matrix3_identity (result);
|
|
gimp_matrix3_translate (result, -x1, -y1);
|
|
gimp_matrix3_scale (result, scalex, scaley);
|
|
gimp_matrix3_translate (result, tx1, ty1);
|
|
}
|
|
|
|
void
|
|
gimp_drawable_transform_matrix_shear (gint x1,
|
|
gint y1,
|
|
gint x2,
|
|
gint y2,
|
|
GimpOrientationType orientation,
|
|
gdouble amount,
|
|
GimpMatrix3 result)
|
|
{
|
|
gint width;
|
|
gint height;
|
|
gdouble cx;
|
|
gdouble cy;
|
|
|
|
width = x2 - x1;
|
|
height = y2 - y1;
|
|
|
|
if (width == 0)
|
|
width = 1;
|
|
if (height == 0)
|
|
height = 1;
|
|
|
|
cx = (gdouble) (x1 + x2) / 2.0;
|
|
cy = (gdouble) (y1 + y2) / 2.0;
|
|
|
|
gimp_matrix3_identity (result);
|
|
gimp_matrix3_translate (result, -cx, -cy);
|
|
|
|
if (orientation == GIMP_ORIENTATION_HORIZONTAL)
|
|
gimp_matrix3_xshear (result, amount / height);
|
|
else
|
|
gimp_matrix3_yshear (result, amount / width);
|
|
|
|
gimp_matrix3_translate (result, +cx, +cy);
|
|
}
|
|
|
|
void
|
|
gimp_drawable_transform_matrix_perspective (gint x1,
|
|
gint y1,
|
|
gint x2,
|
|
gint y2,
|
|
gdouble tx1,
|
|
gdouble ty1,
|
|
gdouble tx2,
|
|
gdouble ty2,
|
|
gdouble tx3,
|
|
gdouble ty3,
|
|
gdouble tx4,
|
|
gdouble ty4,
|
|
GimpMatrix3 result)
|
|
{
|
|
GimpMatrix3 matrix;
|
|
gdouble scalex;
|
|
gdouble scaley;
|
|
|
|
scalex = scaley = 1.0;
|
|
|
|
if ((x2 - x1) > 0)
|
|
scalex = 1.0 / (gdouble) (x2 - x1);
|
|
|
|
if ((y2 - y1) > 0)
|
|
scaley = 1.0 / (gdouble) (y2 - y1);
|
|
|
|
/* Determine the perspective transform that maps from
|
|
* the unit cube to the transformed coordinates
|
|
*/
|
|
{
|
|
gdouble dx1, dx2, dx3, dy1, dy2, dy3;
|
|
gdouble det1, det2;
|
|
|
|
dx1 = tx2 - tx4;
|
|
dx2 = tx3 - tx4;
|
|
dx3 = tx1 - tx2 + tx4 - tx3;
|
|
|
|
dy1 = ty2 - ty3;
|
|
dy2 = ty3 - ty4;
|
|
dy3 = ty1 - ty2 + ty4 - ty3;
|
|
|
|
/* Is the mapping affine? */
|
|
if ((dx3 == 0.0) && (dy3 == 0.0))
|
|
{
|
|
matrix[0][0] = tx2 - tx1;
|
|
matrix[0][1] = tx4 - tx2;
|
|
matrix[0][2] = tx1;
|
|
matrix[1][0] = ty2 - ty1;
|
|
matrix[1][1] = ty4 - ty2;
|
|
matrix[1][2] = ty1;
|
|
matrix[2][0] = 0.0;
|
|
matrix[2][1] = 0.0;
|
|
}
|
|
else
|
|
{
|
|
det1 = dx3 * dy2 - dy3 * dx2;
|
|
det2 = dx1 * dy2 - dy1 * dx2;
|
|
matrix[2][0] = det1 / det2;
|
|
det1 = dx1 * dy3 - dy1 * dx3;
|
|
det2 = dx1 * dy2 - dy1 * dx2;
|
|
matrix[2][1] = det1 / det2;
|
|
|
|
matrix[0][0] = tx2 - tx1 + matrix[2][0] * tx2;
|
|
matrix[0][1] = tx3 - tx1 + matrix[2][1] * tx3;
|
|
matrix[0][2] = tx1;
|
|
|
|
matrix[1][0] = ty2 - ty1 + matrix[2][0] * ty2;
|
|
matrix[1][1] = ty3 - ty1 + matrix[2][1] * ty3;
|
|
matrix[1][2] = ty1;
|
|
}
|
|
|
|
matrix[2][2] = 1.0;
|
|
}
|
|
|
|
gimp_matrix3_identity (result);
|
|
gimp_matrix3_translate (result, -x1, -y1);
|
|
gimp_matrix3_scale (result, scalex, scaley);
|
|
gimp_matrix3_mult (matrix, result);
|
|
}
|