2001-03-09 15:09:12 +08:00
|
|
|
/* The GIMP -- an image manipulation program
|
2001-03-01 14:56:57 +08:00
|
|
|
* 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 <stdlib.h>
|
|
|
|
|
|
|
|
#include <gtk/gtk.h>
|
|
|
|
|
|
|
|
#include "libgimpmath/gimpmath.h"
|
|
|
|
#include "libgimpwidgets/gimpwidgets.h"
|
|
|
|
|
2001-05-10 06:34:59 +08:00
|
|
|
#include "tools-types.h"
|
2002-05-03 20:45:22 +08:00
|
|
|
|
2002-05-11 07:30:09 +08:00
|
|
|
#ifdef __GNUC__
|
2002-05-03 20:45:22 +08:00
|
|
|
#warning FIXME #include "gui/gui-types.h"
|
2002-05-11 07:30:09 +08:00
|
|
|
#endif
|
2001-09-26 07:23:09 +08:00
|
|
|
#include "gui/gui-types.h"
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-05-15 19:25:25 +08:00
|
|
|
#include "base/tile-manager.h"
|
2001-04-07 23:58:26 +08:00
|
|
|
|
2001-07-07 20:17:23 +08:00
|
|
|
#include "core/gimp.h"
|
2003-05-13 21:57:11 +08:00
|
|
|
#include "core/gimpchannel.h"
|
2001-05-09 10:32:03 +08:00
|
|
|
#include "core/gimpcontext.h"
|
2001-11-20 02:23:43 +08:00
|
|
|
#include "core/gimpdrawable-transform.h"
|
2001-05-09 10:32:03 +08:00
|
|
|
#include "core/gimpimage.h"
|
|
|
|
#include "core/gimpimage-mask.h"
|
2003-02-13 19:23:50 +08:00
|
|
|
#include "core/gimpimage-undo.h"
|
2003-02-14 22:14:29 +08:00
|
|
|
#include "core/gimpimage-undo-push.h"
|
2003-05-12 23:56:36 +08:00
|
|
|
#include "core/gimpitem-linked.h"
|
2001-05-09 10:32:03 +08:00
|
|
|
#include "core/gimplayer.h"
|
|
|
|
#include "core/gimpmarshal.h"
|
2001-05-10 06:34:59 +08:00
|
|
|
#include "core/gimptoolinfo.h"
|
2001-05-09 10:32:03 +08:00
|
|
|
|
2003-05-03 02:43:15 +08:00
|
|
|
#include "widgets/gimpdialogfactory.h"
|
2002-11-14 19:54:57 +08:00
|
|
|
#include "widgets/gimpviewabledialog.h"
|
|
|
|
|
2001-09-26 07:23:09 +08:00
|
|
|
#include "display/gimpdisplay.h"
|
2001-10-13 20:52:30 +08:00
|
|
|
#include "display/gimpdisplay-foreach.h"
|
2002-02-22 23:08:47 +08:00
|
|
|
#include "display/gimpprogress.h"
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2003-05-03 02:43:15 +08:00
|
|
|
#include "gui/info-dialog.h"
|
|
|
|
|
2003-04-16 00:05:52 +08:00
|
|
|
#include "gimptoolcontrol.h"
|
2003-02-09 05:12:03 +08:00
|
|
|
#include "gimptransformoptions.h"
|
2003-02-14 22:14:29 +08:00
|
|
|
#include "gimptransformtool.h"
|
|
|
|
#include "gimptransformtool-undo.h"
|
2001-03-15 12:57:24 +08:00
|
|
|
|
2003-03-26 00:38:19 +08:00
|
|
|
#include "gimp-intl.h"
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-04-18 05:43:29 +08:00
|
|
|
|
2002-11-18 21:10:04 +08:00
|
|
|
#define HANDLE_SIZE 10
|
2001-11-20 02:23:43 +08:00
|
|
|
|
2001-11-12 22:45:58 +08:00
|
|
|
|
2001-11-20 02:23:43 +08:00
|
|
|
/* local function prototypes */
|
|
|
|
|
|
|
|
static void gimp_transform_tool_init (GimpTransformTool *tool);
|
|
|
|
static void gimp_transform_tool_class_init (GimpTransformToolClass *tool);
|
|
|
|
|
|
|
|
static void gimp_transform_tool_finalize (GObject *object);
|
|
|
|
|
|
|
|
static void gimp_transform_tool_control (GimpTool *tool,
|
2002-02-19 01:00:09 +08:00
|
|
|
GimpToolAction action,
|
2001-11-20 02:23:43 +08:00
|
|
|
GimpDisplay *gdisp);
|
|
|
|
static void gimp_transform_tool_button_press (GimpTool *tool,
|
|
|
|
GimpCoords *coords,
|
|
|
|
guint32 time,
|
|
|
|
GdkModifierType state,
|
|
|
|
GimpDisplay *gdisp);
|
|
|
|
static void gimp_transform_tool_button_release (GimpTool *tool,
|
|
|
|
GimpCoords *coords,
|
|
|
|
guint32 time,
|
|
|
|
GdkModifierType state,
|
|
|
|
GimpDisplay *gdisp);
|
|
|
|
static void gimp_transform_tool_motion (GimpTool *tool,
|
|
|
|
GimpCoords *coords,
|
|
|
|
guint32 time,
|
|
|
|
GdkModifierType state,
|
|
|
|
GimpDisplay *gdisp);
|
2001-11-30 00:44:51 +08:00
|
|
|
static void gimp_transform_tool_modifier_key (GimpTool *tool,
|
|
|
|
GdkModifierType key,
|
|
|
|
gboolean press,
|
|
|
|
GdkModifierType state,
|
|
|
|
GimpDisplay *gdisp);
|
2001-11-22 22:28:39 +08:00
|
|
|
static void gimp_transform_tool_oper_update (GimpTool *tool,
|
|
|
|
GimpCoords *coords,
|
|
|
|
GdkModifierType state,
|
|
|
|
GimpDisplay *gdisp);
|
2001-11-20 02:23:43 +08:00
|
|
|
static void gimp_transform_tool_cursor_update (GimpTool *tool,
|
|
|
|
GimpCoords *coords,
|
|
|
|
GdkModifierType state,
|
|
|
|
GimpDisplay *gdisp);
|
|
|
|
|
|
|
|
static void gimp_transform_tool_draw (GimpDrawTool *draw_tool);
|
|
|
|
|
2002-11-18 21:10:04 +08:00
|
|
|
static TileManager *
|
|
|
|
gimp_transform_tool_real_transform (GimpTransformTool *tr_tool,
|
|
|
|
GimpDisplay *gdisp);
|
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
static void gimp_transform_tool_reset (GimpTransformTool *tr_tool);
|
2001-11-20 02:23:43 +08:00
|
|
|
static void gimp_transform_tool_bounds (GimpTransformTool *tr_tool,
|
|
|
|
GimpDisplay *gdisp);
|
2002-11-14 19:54:57 +08:00
|
|
|
static void gimp_transform_tool_dialog (GimpTransformTool *tr_tool);
|
|
|
|
static void gimp_transform_tool_prepare (GimpTransformTool *tr_tool,
|
|
|
|
GimpDisplay *gdisp);
|
2001-11-20 02:23:43 +08:00
|
|
|
static void gimp_transform_tool_recalc (GimpTransformTool *tr_tool,
|
|
|
|
GimpDisplay *gdisp);
|
|
|
|
static void gimp_transform_tool_doit (GimpTransformTool *tr_tool,
|
|
|
|
GimpDisplay *gdisp);
|
|
|
|
static void gimp_transform_tool_grid_recalc (GimpTransformTool *tr_tool);
|
|
|
|
|
|
|
|
static void transform_reset_callback (GtkWidget *widget,
|
2002-11-14 19:54:57 +08:00
|
|
|
GimpTransformTool *tr_tool);
|
|
|
|
static void transform_cancel_callback (GtkWidget *widget,
|
|
|
|
GimpTransformTool *tr_tool);
|
|
|
|
static void transform_ok_callback (GtkWidget *widget,
|
|
|
|
GimpTransformTool *tr_tool);
|
2001-03-31 22:10:22 +08:00
|
|
|
|
2003-02-10 18:08:01 +08:00
|
|
|
static void gimp_transform_tool_notify_grid (GimpTransformOptions *options,
|
|
|
|
GParamSpec *pspec,
|
|
|
|
GimpTransformTool *tr_tool);
|
|
|
|
static void gimp_transform_tool_notify_path (GimpTransformOptions *options,
|
|
|
|
GParamSpec *pspec,
|
|
|
|
GimpTransformTool *tr_tool);
|
|
|
|
|
2001-03-31 22:10:22 +08:00
|
|
|
|
Port to glib/gtk+ 2.0 episode I (every segfault has it's beginning)
2001-07-24 Michael Natterer <mitch@gimp.org>
Port to glib/gtk+ 2.0 episode I (every segfault has it's beginning)
* configure.in: require glib/gtk+ >= 1.3.7, commented out the
gtkxmhtml stuff.
From now on, you will need glib, pango, atk and gtk+ HEAD from CVS
to hack or use GIMP HEAD.
Beware, it crashes randomly :)
* app/core/Makefile.am
* app/core/gimpmarshal.list: new file plus rules to generate
gimpmarshal.[ch] from it.
* app/core/*
* app/tools/*
* app/widgets/*
* libgimpwidgets/*: started to use the glib object system. All
core/ objects are still gtk objects however. All signals are
created using g_signal_new(). There are many gtk+ artefacts left.
Finally, we will _not_ use the gtk_signal_foo() wrappers and
friends any more.
* app/colormaps.c
* app/devices.[ch]
* app/disp_callbacks.c
* app/errorconsole.c
* app/file-save.[ch]
* app/interface.c
* app/module_db.c
* app/nav_window.c
* app/ops_buttons.c
* app/scroll.c
* app/user_install.c
* app/gui/about-dialog.c
* app/gui/brush-editor.c
* app/gui/brushes-commands.c
* app/gui/color-notebook.c
* app/gui/colormap-dialog.c
* app/gui/dialogs-commands.c
* app/gui/dialogs-constructors.c
* app/gui/file-commands.c
* app/gui/file-dialog-utils.c
* app/gui/file-new-dialog.c
* app/gui/file-open-dialog.[ch]
* app/gui/file-save-dialog.c
* app/gui/gradient-editor.c
* app/gui/gradients-commands.c
* app/gui/image-commands.c
* app/gui/info-dialog.[ch]
* app/gui/layer-select.c
* app/gui/layers-commands.c
* app/gui/menus.c
* app/gui/offset-dialog.c
* app/gui/palette-editor.c
* app/gui/palettes-commands.c
* app/gui/patterns-commands.c
* app/gui/preferences-dialog.c
* app/gui/resize-dialog.[ch]
* app/gui/splash.c
* app/gui/tips-dialog.c
* app/gui/tool-options-dialog.c
* app/gui/toolbox.c
* app/gui/tools-commands.c
* libgimp/gimpbrushmenu.c
* libgimp/gimpmenu.c
* libgimp/gimppatternmenu.c
* libgimp/gimpui.c
* libgimpbase/gimpenv.c: tons and tons of changes like "const
gchar*", switch from GdkDeviceInfo to GdkDevice (very incomplete
and currently disables), lots of s/gtk_signal/g_signal/,
removal/replacement of deprecated stuff,
s/GtkSignalFunc/GCallback/ and lots of small changes and fixes
while I was on it, zillions of warnings left...
* modules/Makefile.am: disabled the water color selector
temporarily (XInput issues).
* plug-ins/Makefile.am
* plug-ins/common/.cvsignore
* plug-ins/common/Makefile.am
* plug-ins/common/plugin-defs.pl: simply excluded all plug-ins
which did not build (including Script-Fu). They are trivial to
fix.
2001-07-25 05:27:11 +08:00
|
|
|
static GimpDrawToolClass *parent_class = NULL;
|
2001-03-31 22:10:22 +08:00
|
|
|
|
Port to glib/gtk+ 2.0 episode I (every segfault has it's beginning)
2001-07-24 Michael Natterer <mitch@gimp.org>
Port to glib/gtk+ 2.0 episode I (every segfault has it's beginning)
* configure.in: require glib/gtk+ >= 1.3.7, commented out the
gtkxmhtml stuff.
From now on, you will need glib, pango, atk and gtk+ HEAD from CVS
to hack or use GIMP HEAD.
Beware, it crashes randomly :)
* app/core/Makefile.am
* app/core/gimpmarshal.list: new file plus rules to generate
gimpmarshal.[ch] from it.
* app/core/*
* app/tools/*
* app/widgets/*
* libgimpwidgets/*: started to use the glib object system. All
core/ objects are still gtk objects however. All signals are
created using g_signal_new(). There are many gtk+ artefacts left.
Finally, we will _not_ use the gtk_signal_foo() wrappers and
friends any more.
* app/colormaps.c
* app/devices.[ch]
* app/disp_callbacks.c
* app/errorconsole.c
* app/file-save.[ch]
* app/interface.c
* app/module_db.c
* app/nav_window.c
* app/ops_buttons.c
* app/scroll.c
* app/user_install.c
* app/gui/about-dialog.c
* app/gui/brush-editor.c
* app/gui/brushes-commands.c
* app/gui/color-notebook.c
* app/gui/colormap-dialog.c
* app/gui/dialogs-commands.c
* app/gui/dialogs-constructors.c
* app/gui/file-commands.c
* app/gui/file-dialog-utils.c
* app/gui/file-new-dialog.c
* app/gui/file-open-dialog.[ch]
* app/gui/file-save-dialog.c
* app/gui/gradient-editor.c
* app/gui/gradients-commands.c
* app/gui/image-commands.c
* app/gui/info-dialog.[ch]
* app/gui/layer-select.c
* app/gui/layers-commands.c
* app/gui/menus.c
* app/gui/offset-dialog.c
* app/gui/palette-editor.c
* app/gui/palettes-commands.c
* app/gui/patterns-commands.c
* app/gui/preferences-dialog.c
* app/gui/resize-dialog.[ch]
* app/gui/splash.c
* app/gui/tips-dialog.c
* app/gui/tool-options-dialog.c
* app/gui/toolbox.c
* app/gui/tools-commands.c
* libgimp/gimpbrushmenu.c
* libgimp/gimpmenu.c
* libgimp/gimppatternmenu.c
* libgimp/gimpui.c
* libgimpbase/gimpenv.c: tons and tons of changes like "const
gchar*", switch from GdkDeviceInfo to GdkDevice (very incomplete
and currently disables), lots of s/gtk_signal/g_signal/,
removal/replacement of deprecated stuff,
s/GtkSignalFunc/GCallback/ and lots of small changes and fixes
while I was on it, zillions of warnings left...
* modules/Makefile.am: disabled the water color selector
temporarily (XInput issues).
* plug-ins/Makefile.am
* plug-ins/common/.cvsignore
* plug-ins/common/Makefile.am
* plug-ins/common/plugin-defs.pl: simply excluded all plug-ins
which did not build (including Script-Fu). They are trivial to
fix.
2001-07-25 05:27:11 +08:00
|
|
|
|
|
|
|
GType
|
2001-03-01 14:56:57 +08:00
|
|
|
gimp_transform_tool_get_type (void)
|
|
|
|
{
|
Port to glib/gtk+ 2.0 episode I (every segfault has it's beginning)
2001-07-24 Michael Natterer <mitch@gimp.org>
Port to glib/gtk+ 2.0 episode I (every segfault has it's beginning)
* configure.in: require glib/gtk+ >= 1.3.7, commented out the
gtkxmhtml stuff.
From now on, you will need glib, pango, atk and gtk+ HEAD from CVS
to hack or use GIMP HEAD.
Beware, it crashes randomly :)
* app/core/Makefile.am
* app/core/gimpmarshal.list: new file plus rules to generate
gimpmarshal.[ch] from it.
* app/core/*
* app/tools/*
* app/widgets/*
* libgimpwidgets/*: started to use the glib object system. All
core/ objects are still gtk objects however. All signals are
created using g_signal_new(). There are many gtk+ artefacts left.
Finally, we will _not_ use the gtk_signal_foo() wrappers and
friends any more.
* app/colormaps.c
* app/devices.[ch]
* app/disp_callbacks.c
* app/errorconsole.c
* app/file-save.[ch]
* app/interface.c
* app/module_db.c
* app/nav_window.c
* app/ops_buttons.c
* app/scroll.c
* app/user_install.c
* app/gui/about-dialog.c
* app/gui/brush-editor.c
* app/gui/brushes-commands.c
* app/gui/color-notebook.c
* app/gui/colormap-dialog.c
* app/gui/dialogs-commands.c
* app/gui/dialogs-constructors.c
* app/gui/file-commands.c
* app/gui/file-dialog-utils.c
* app/gui/file-new-dialog.c
* app/gui/file-open-dialog.[ch]
* app/gui/file-save-dialog.c
* app/gui/gradient-editor.c
* app/gui/gradients-commands.c
* app/gui/image-commands.c
* app/gui/info-dialog.[ch]
* app/gui/layer-select.c
* app/gui/layers-commands.c
* app/gui/menus.c
* app/gui/offset-dialog.c
* app/gui/palette-editor.c
* app/gui/palettes-commands.c
* app/gui/patterns-commands.c
* app/gui/preferences-dialog.c
* app/gui/resize-dialog.[ch]
* app/gui/splash.c
* app/gui/tips-dialog.c
* app/gui/tool-options-dialog.c
* app/gui/toolbox.c
* app/gui/tools-commands.c
* libgimp/gimpbrushmenu.c
* libgimp/gimpmenu.c
* libgimp/gimppatternmenu.c
* libgimp/gimpui.c
* libgimpbase/gimpenv.c: tons and tons of changes like "const
gchar*", switch from GdkDeviceInfo to GdkDevice (very incomplete
and currently disables), lots of s/gtk_signal/g_signal/,
removal/replacement of deprecated stuff,
s/GtkSignalFunc/GCallback/ and lots of small changes and fixes
while I was on it, zillions of warnings left...
* modules/Makefile.am: disabled the water color selector
temporarily (XInput issues).
* plug-ins/Makefile.am
* plug-ins/common/.cvsignore
* plug-ins/common/Makefile.am
* plug-ins/common/plugin-defs.pl: simply excluded all plug-ins
which did not build (including Script-Fu). They are trivial to
fix.
2001-07-25 05:27:11 +08:00
|
|
|
static GType tool_type = 0;
|
2001-03-01 14:56:57 +08:00
|
|
|
|
|
|
|
if (! tool_type)
|
|
|
|
{
|
2001-08-14 22:53:55 +08:00
|
|
|
static const GTypeInfo tool_info =
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
|
|
|
sizeof (GimpTransformToolClass),
|
2001-08-14 22:53:55 +08:00
|
|
|
(GBaseInitFunc) NULL,
|
|
|
|
(GBaseFinalizeFunc) NULL,
|
|
|
|
(GClassInitFunc) gimp_transform_tool_class_init,
|
|
|
|
NULL, /* class_finalize */
|
|
|
|
NULL, /* class_data */
|
|
|
|
sizeof (GimpTransformTool),
|
|
|
|
0, /* n_preallocs */
|
|
|
|
(GInstanceInitFunc) gimp_transform_tool_init,
|
2001-03-01 14:56:57 +08:00
|
|
|
};
|
|
|
|
|
2001-08-14 22:53:55 +08:00
|
|
|
tool_type = g_type_register_static (GIMP_TYPE_DRAW_TOOL,
|
|
|
|
"GimpTransformTool",
|
|
|
|
&tool_info, 0);
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
return tool_type;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gimp_transform_tool_class_init (GimpTransformToolClass *klass)
|
|
|
|
{
|
2001-08-14 22:53:55 +08:00
|
|
|
GObjectClass *object_class;
|
2001-03-09 15:09:12 +08:00
|
|
|
GimpToolClass *tool_class;
|
|
|
|
GimpDrawToolClass *draw_class;
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-08-14 22:53:55 +08:00
|
|
|
object_class = G_OBJECT_CLASS (klass);
|
|
|
|
tool_class = GIMP_TOOL_CLASS (klass);
|
|
|
|
draw_class = GIMP_DRAW_TOOL_CLASS (klass);
|
2001-03-01 14:56:57 +08:00
|
|
|
|
Port to glib/gtk+ 2.0 episode I (every segfault has it's beginning)
2001-07-24 Michael Natterer <mitch@gimp.org>
Port to glib/gtk+ 2.0 episode I (every segfault has it's beginning)
* configure.in: require glib/gtk+ >= 1.3.7, commented out the
gtkxmhtml stuff.
From now on, you will need glib, pango, atk and gtk+ HEAD from CVS
to hack or use GIMP HEAD.
Beware, it crashes randomly :)
* app/core/Makefile.am
* app/core/gimpmarshal.list: new file plus rules to generate
gimpmarshal.[ch] from it.
* app/core/*
* app/tools/*
* app/widgets/*
* libgimpwidgets/*: started to use the glib object system. All
core/ objects are still gtk objects however. All signals are
created using g_signal_new(). There are many gtk+ artefacts left.
Finally, we will _not_ use the gtk_signal_foo() wrappers and
friends any more.
* app/colormaps.c
* app/devices.[ch]
* app/disp_callbacks.c
* app/errorconsole.c
* app/file-save.[ch]
* app/interface.c
* app/module_db.c
* app/nav_window.c
* app/ops_buttons.c
* app/scroll.c
* app/user_install.c
* app/gui/about-dialog.c
* app/gui/brush-editor.c
* app/gui/brushes-commands.c
* app/gui/color-notebook.c
* app/gui/colormap-dialog.c
* app/gui/dialogs-commands.c
* app/gui/dialogs-constructors.c
* app/gui/file-commands.c
* app/gui/file-dialog-utils.c
* app/gui/file-new-dialog.c
* app/gui/file-open-dialog.[ch]
* app/gui/file-save-dialog.c
* app/gui/gradient-editor.c
* app/gui/gradients-commands.c
* app/gui/image-commands.c
* app/gui/info-dialog.[ch]
* app/gui/layer-select.c
* app/gui/layers-commands.c
* app/gui/menus.c
* app/gui/offset-dialog.c
* app/gui/palette-editor.c
* app/gui/palettes-commands.c
* app/gui/patterns-commands.c
* app/gui/preferences-dialog.c
* app/gui/resize-dialog.[ch]
* app/gui/splash.c
* app/gui/tips-dialog.c
* app/gui/tool-options-dialog.c
* app/gui/toolbox.c
* app/gui/tools-commands.c
* libgimp/gimpbrushmenu.c
* libgimp/gimpmenu.c
* libgimp/gimppatternmenu.c
* libgimp/gimpui.c
* libgimpbase/gimpenv.c: tons and tons of changes like "const
gchar*", switch from GdkDeviceInfo to GdkDevice (very incomplete
and currently disables), lots of s/gtk_signal/g_signal/,
removal/replacement of deprecated stuff,
s/GtkSignalFunc/GCallback/ and lots of small changes and fixes
while I was on it, zillions of warnings left...
* modules/Makefile.am: disabled the water color selector
temporarily (XInput issues).
* plug-ins/Makefile.am
* plug-ins/common/.cvsignore
* plug-ins/common/Makefile.am
* plug-ins/common/plugin-defs.pl: simply excluded all plug-ins
which did not build (including Script-Fu). They are trivial to
fix.
2001-07-25 05:27:11 +08:00
|
|
|
parent_class = g_type_class_peek_parent (klass);
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-08-14 22:53:55 +08:00
|
|
|
object_class->finalize = gimp_transform_tool_finalize;
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-11-09 03:14:51 +08:00
|
|
|
tool_class->control = gimp_transform_tool_control;
|
2001-03-01 14:56:57 +08:00
|
|
|
tool_class->button_press = gimp_transform_tool_button_press;
|
|
|
|
tool_class->button_release = gimp_transform_tool_button_release;
|
|
|
|
tool_class->motion = gimp_transform_tool_motion;
|
2001-11-30 00:44:51 +08:00
|
|
|
tool_class->modifier_key = gimp_transform_tool_modifier_key;
|
2001-11-22 22:28:39 +08:00
|
|
|
tool_class->oper_update = gimp_transform_tool_oper_update;
|
2001-03-01 14:56:57 +08:00
|
|
|
tool_class->cursor_update = gimp_transform_tool_cursor_update;
|
2001-03-09 15:09:12 +08:00
|
|
|
|
|
|
|
draw_class->draw = gimp_transform_tool_draw;
|
2002-11-14 19:54:57 +08:00
|
|
|
|
|
|
|
klass->dialog = NULL;
|
|
|
|
klass->prepare = NULL;
|
|
|
|
klass->motion = NULL;
|
|
|
|
klass->recalc = NULL;
|
2002-11-18 21:10:04 +08:00
|
|
|
klass->transform = gimp_transform_tool_real_transform;
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2002-11-14 19:54:57 +08:00
|
|
|
gimp_transform_tool_init (GimpTransformTool *tr_tool)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2001-11-20 02:23:43 +08:00
|
|
|
GimpTool *tool;
|
2001-03-31 22:10:22 +08:00
|
|
|
gint i;
|
2001-03-09 15:09:12 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
tool = GIMP_TOOL (tr_tool);
|
2001-11-20 02:23:43 +08:00
|
|
|
|
2002-06-17 01:13:39 +08:00
|
|
|
gimp_tool_control_set_scroll_lock (tool->control, TRUE);
|
|
|
|
gimp_tool_control_set_preserve (tool->control, FALSE);
|
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
tr_tool->function = TRANSFORM_CREATING;
|
|
|
|
tr_tool->original = NULL;
|
2001-03-09 15:09:12 +08:00
|
|
|
|
|
|
|
for (i = 0; i < TRAN_INFO_SIZE; i++)
|
2001-11-22 21:01:26 +08:00
|
|
|
{
|
2002-11-14 19:54:57 +08:00
|
|
|
tr_tool->trans_info[i] = 0.0;
|
|
|
|
tr_tool->old_trans_info[i] = 0.0;
|
2001-11-22 21:01:26 +08:00
|
|
|
}
|
2001-03-09 15:09:12 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
gimp_matrix3_identity (tr_tool->transform);
|
2001-03-31 22:10:22 +08:00
|
|
|
|
2003-02-10 18:08:01 +08:00
|
|
|
tr_tool->use_grid = TRUE;
|
|
|
|
tr_tool->use_center = TRUE;
|
|
|
|
tr_tool->ngx = 0;
|
|
|
|
tr_tool->ngy = 0;
|
|
|
|
tr_tool->grid_coords = NULL;
|
|
|
|
tr_tool->tgrid_coords = NULL;
|
|
|
|
|
|
|
|
tr_tool->notify_connected = FALSE;
|
|
|
|
tr_tool->show_path = FALSE;
|
2001-11-22 21:01:26 +08:00
|
|
|
|
2003-02-10 18:08:01 +08:00
|
|
|
tr_tool->shell_desc = NULL;
|
|
|
|
tr_tool->progress_text = _("Transforming...");
|
|
|
|
tr_tool->info_dialog = NULL;
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
|
|
|
|
2001-03-31 22:10:22 +08:00
|
|
|
static void
|
2001-08-14 22:53:55 +08:00
|
|
|
gimp_transform_tool_finalize (GObject *object)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2001-03-31 22:10:22 +08:00
|
|
|
GimpTransformTool *tr_tool;
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-03-31 22:10:22 +08:00
|
|
|
tr_tool = GIMP_TRANSFORM_TOOL (object);
|
|
|
|
|
|
|
|
if (tr_tool->original)
|
2001-08-14 22:53:55 +08:00
|
|
|
{
|
2003-05-27 01:02:06 +08:00
|
|
|
tile_manager_unref (tr_tool->original);
|
2001-08-14 22:53:55 +08:00
|
|
|
tr_tool->original = NULL;
|
|
|
|
}
|
2001-03-31 22:10:22 +08:00
|
|
|
|
2001-11-22 21:01:26 +08:00
|
|
|
if (tr_tool->info_dialog)
|
2001-08-14 22:53:55 +08:00
|
|
|
{
|
2001-11-22 21:01:26 +08:00
|
|
|
info_dialog_free (tr_tool->info_dialog);
|
|
|
|
tr_tool->info_dialog = NULL;
|
2001-08-14 22:53:55 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
if (tr_tool->grid_coords)
|
|
|
|
{
|
|
|
|
g_free (tr_tool->grid_coords);
|
|
|
|
tr_tool->grid_coords = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (tr_tool->tgrid_coords)
|
|
|
|
{
|
|
|
|
g_free (tr_tool->tgrid_coords);
|
|
|
|
tr_tool->tgrid_coords = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
G_OBJECT_CLASS (parent_class)->finalize (object);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2002-02-19 01:00:09 +08:00
|
|
|
gimp_transform_tool_control (GimpTool *tool,
|
|
|
|
GimpToolAction action,
|
|
|
|
GimpDisplay *gdisp)
|
2001-08-14 22:53:55 +08:00
|
|
|
{
|
2002-11-14 19:54:57 +08:00
|
|
|
GimpTransformTool *tr_tool;
|
2001-08-14 22:53:55 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
tr_tool = GIMP_TRANSFORM_TOOL (tool);
|
2001-03-31 22:10:22 +08:00
|
|
|
|
2001-08-14 22:53:55 +08:00
|
|
|
switch (action)
|
|
|
|
{
|
|
|
|
case PAUSE:
|
|
|
|
break;
|
2001-03-31 22:10:22 +08:00
|
|
|
|
2001-08-14 22:53:55 +08:00
|
|
|
case RESUME:
|
2002-11-14 19:54:57 +08:00
|
|
|
gimp_transform_tool_recalc (tr_tool, gdisp);
|
2001-08-14 22:53:55 +08:00
|
|
|
break;
|
2001-03-31 22:10:22 +08:00
|
|
|
|
2001-08-14 22:53:55 +08:00
|
|
|
case HALT:
|
2002-11-14 19:54:57 +08:00
|
|
|
gimp_transform_tool_reset (tr_tool);
|
2001-11-22 21:01:26 +08:00
|
|
|
return; /* don't upchain */
|
2001-08-14 22:53:55 +08:00
|
|
|
break;
|
2001-03-31 22:10:22 +08:00
|
|
|
|
2001-08-14 22:53:55 +08:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2001-11-20 02:23:43 +08:00
|
|
|
GIMP_TOOL_CLASS (parent_class)->control (tool, action, gdisp);
|
2001-03-31 22:10:22 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2001-11-09 03:14:51 +08:00
|
|
|
gimp_transform_tool_button_press (GimpTool *tool,
|
|
|
|
GimpCoords *coords,
|
|
|
|
guint32 time,
|
|
|
|
GdkModifierType state,
|
|
|
|
GimpDisplay *gdisp)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2001-11-20 02:23:43 +08:00
|
|
|
GimpTransformTool *tr_tool;
|
2001-11-12 22:45:58 +08:00
|
|
|
GimpDrawTool *draw_tool;
|
2001-11-01 05:20:09 +08:00
|
|
|
GimpDrawable *drawable;
|
|
|
|
gint off_x, off_y;
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-11-20 02:23:43 +08:00
|
|
|
tr_tool = GIMP_TRANSFORM_TOOL (tool);
|
2001-11-12 22:45:58 +08:00
|
|
|
draw_tool = GIMP_DRAW_TOOL (tool);
|
2001-03-01 14:56:57 +08:00
|
|
|
|
|
|
|
drawable = gimp_image_active_drawable (gdisp->gimage);
|
|
|
|
|
2003-02-14 22:14:29 +08:00
|
|
|
if (tr_tool->use_grid && ! tr_tool->notify_connected)
|
2003-02-10 18:08:01 +08:00
|
|
|
{
|
|
|
|
tr_tool->show_path =
|
|
|
|
GIMP_TRANSFORM_OPTIONS (tool->tool_info->tool_options)->show_path;
|
|
|
|
|
|
|
|
g_signal_connect_object (tool->tool_info->tool_options,
|
|
|
|
"notify::grid-type",
|
|
|
|
G_CALLBACK (gimp_transform_tool_notify_grid),
|
|
|
|
tr_tool, 0);
|
|
|
|
g_signal_connect_object (tool->tool_info->tool_options,
|
|
|
|
"notify::grid-size",
|
|
|
|
G_CALLBACK (gimp_transform_tool_notify_grid),
|
|
|
|
tr_tool, 0);
|
|
|
|
g_signal_connect_object (tool->tool_info->tool_options,
|
|
|
|
"notify::show-path",
|
|
|
|
G_CALLBACK (gimp_transform_tool_notify_path),
|
|
|
|
tr_tool, 0);
|
|
|
|
|
|
|
|
tr_tool->notify_connected = TRUE;
|
|
|
|
}
|
|
|
|
|
2001-11-22 22:28:39 +08:00
|
|
|
if (gdisp != tool->gdisp)
|
|
|
|
{
|
|
|
|
/* Initialisation stuff: if the cursor is clicked inside the current
|
|
|
|
* selection, show the bounding box and handles...
|
|
|
|
*/
|
2003-05-08 22:06:03 +08:00
|
|
|
gimp_item_offsets (GIMP_ITEM (drawable), &off_x, &off_y);
|
2001-11-22 22:28:39 +08:00
|
|
|
|
|
|
|
if (coords->x >= off_x &&
|
|
|
|
coords->y >= off_y &&
|
2003-05-08 21:12:46 +08:00
|
|
|
coords->x < (off_x + gimp_item_width (GIMP_ITEM (drawable))) &&
|
|
|
|
coords->y < (off_y + gimp_item_height (GIMP_ITEM (drawable))) &&
|
2002-11-14 19:54:57 +08:00
|
|
|
|
|
|
|
(gimp_image_mask_is_empty (gdisp->gimage) ||
|
|
|
|
gimp_image_mask_value (gdisp->gimage, coords->x, coords->y)))
|
2001-11-22 22:28:39 +08:00
|
|
|
{
|
2002-11-14 19:54:57 +08:00
|
|
|
if (GIMP_IS_LAYER (drawable) &&
|
|
|
|
gimp_layer_get_mask (GIMP_LAYER (drawable)))
|
2001-11-22 22:28:39 +08:00
|
|
|
{
|
2002-11-14 19:54:57 +08:00
|
|
|
g_message (_("Transformations do not work on\n"
|
|
|
|
"layers that contain layer masks."));
|
2003-01-03 21:59:23 +08:00
|
|
|
gimp_tool_control_halt (tool->control);
|
2002-11-14 19:54:57 +08:00
|
|
|
return;
|
|
|
|
}
|
2001-11-22 22:28:39 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
/* If the tool is already active, clear the current state
|
|
|
|
* and reset
|
|
|
|
*/
|
|
|
|
if (gimp_tool_control_is_active (tool->control))
|
|
|
|
{
|
|
|
|
g_warning ("%s: tool_already ACTIVE", G_GNUC_FUNCTION);
|
2001-11-22 22:28:39 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
gimp_transform_tool_reset (tr_tool);
|
|
|
|
}
|
2001-11-22 22:28:39 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
/* Set the pointer to the active display */
|
|
|
|
tool->gdisp = gdisp;
|
|
|
|
tool->drawable = drawable;
|
2003-05-12 23:56:36 +08:00
|
|
|
|
|
|
|
if (! gimp_tool_control_is_active (tool->control))
|
|
|
|
gimp_tool_control_activate (tool->control);
|
2001-11-22 22:28:39 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
/* Find the transform bounds for some tools (like scale,
|
|
|
|
* perspective) that actually need the bounds for
|
|
|
|
* initializing
|
|
|
|
*/
|
|
|
|
gimp_transform_tool_bounds (tr_tool, gdisp);
|
2001-11-22 22:28:39 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
/* Initialize the transform tool */
|
|
|
|
if (! tr_tool->info_dialog)
|
|
|
|
gimp_transform_tool_dialog (tr_tool);
|
2001-11-22 22:28:39 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
gimp_transform_tool_prepare (tr_tool, gdisp);
|
2001-11-22 22:28:39 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
/* Recalculate the transform tool */
|
|
|
|
gimp_transform_tool_recalc (tr_tool, gdisp);
|
2001-11-22 22:28:39 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
/* start drawing the bounding box and handles... */
|
|
|
|
gimp_draw_tool_start (GIMP_DRAW_TOOL (tool), gdisp);
|
GimpViewableDialogs everywhere, cleanup:
2002-09-01 Michael Natterer <mitch@gimp.org>
GimpViewableDialogs everywhere, cleanup:
* libgimpwidgets/gimpstock.c: added texts for the RESIZE, SCALE
and CROP stock items.
* app/widgets/gimpviewabledialog.c: update the title when the
viewable's name changes.
* app/gui/color-notebook.[ch]: added color_notebook_viewable_new()
which creates a GimpViewableDialog.
* app/widgets/gimpgradienteditor.[ch]
* app/gui/colormap-editor-commands.c
* app/gui/file-new-dialog.c
* app/gui/gradient-editor-commands.c
* app/gui/palette-editor-commands.c
* app/undo_history.c: use GimpViewableDialogs and the new
color_notebook constructor.
* app/gui/convert-dialog.c: #include "widgets/gimpviewabledialog.h"
* app/gui/image-commands.c
* app/gui/info-dialog.c
* app/gui/resize-dialog.c: minor cleanups.
* app/gui/info-window.c: cleaned up the whole thing, esp. the
"Extended" page. Added HSV color display to the color picker
frame. Set the icons as frame titles, stuff...
* app/tools/gimpimagemaptool.[ch]: removed "shell_title",
"shell_name" and "stock_id" from the GimpImageMapTool struct
because they can be obtained from the tool's GimpToolInfo object.
* app/tools/gimpbrightnesscontrasttool.c
* app/tools/gimpcolorbalancetool.c
* app/tools/gimpcurvestool.c
* app/tools/gimphuesaturationtool.c
* app/tools/gimplevelstool.c
* app/tools/gimpposterizetool.c
* app/tools/gimpthresholdtool.c: changed accordingly.
* app/tools/gimphistogramtool.c: same here: take values from
tool->tool_info instead of hardcoding them.
* app/tools/gimpcroptool.[ch]: removed the static crop dialog
variables and added them to the GimpCropTool struct. Feels safer
and makes the callback code much simpler. Use stock items for the
dialog's "Resize" and "Crop" buttons.
* app/tools/gimpmeasuretool.c
* app/tools/gimprotatetool.c: for consistency don't name the tools
"Blah Tool", also the dialog titles need to match the menu
entries.
Unrelated:
* libgimpwidgets/gimpwidgets.c: the recently changed, gtk-doc
comment was correct, as gtk-doc takes the parameter names from
the header, not the .c file.
* app/tools/gimptransformtool.c: set the transform tool's state to
TRANSFORM_CREATING after changing displays, so the initial matrix
components are saved correctly for the "Reset" function.
2002-09-01 16:44:57 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
/* find which handle we're dragging */
|
|
|
|
gimp_transform_tool_oper_update (tool, coords, state, gdisp);
|
|
|
|
|
|
|
|
tr_tool->function = TRANSFORM_CREATING;
|
2001-11-22 22:28:39 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
GimpViewableDialogs everywhere, cleanup:
2002-09-01 Michael Natterer <mitch@gimp.org>
GimpViewableDialogs everywhere, cleanup:
* libgimpwidgets/gimpstock.c: added texts for the RESIZE, SCALE
and CROP stock items.
* app/widgets/gimpviewabledialog.c: update the title when the
viewable's name changes.
* app/gui/color-notebook.[ch]: added color_notebook_viewable_new()
which creates a GimpViewableDialog.
* app/widgets/gimpgradienteditor.[ch]
* app/gui/colormap-editor-commands.c
* app/gui/file-new-dialog.c
* app/gui/gradient-editor-commands.c
* app/gui/palette-editor-commands.c
* app/undo_history.c: use GimpViewableDialogs and the new
color_notebook constructor.
* app/gui/convert-dialog.c: #include "widgets/gimpviewabledialog.h"
* app/gui/image-commands.c
* app/gui/info-dialog.c
* app/gui/resize-dialog.c: minor cleanups.
* app/gui/info-window.c: cleaned up the whole thing, esp. the
"Extended" page. Added HSV color display to the color picker
frame. Set the icons as frame titles, stuff...
* app/tools/gimpimagemaptool.[ch]: removed "shell_title",
"shell_name" and "stock_id" from the GimpImageMapTool struct
because they can be obtained from the tool's GimpToolInfo object.
* app/tools/gimpbrightnesscontrasttool.c
* app/tools/gimpcolorbalancetool.c
* app/tools/gimpcurvestool.c
* app/tools/gimphuesaturationtool.c
* app/tools/gimplevelstool.c
* app/tools/gimpposterizetool.c
* app/tools/gimpthresholdtool.c: changed accordingly.
* app/tools/gimphistogramtool.c: same here: take values from
tool->tool_info instead of hardcoding them.
* app/tools/gimpcroptool.[ch]: removed the static crop dialog
variables and added them to the GimpCropTool struct. Feels safer
and makes the callback code much simpler. Use stock items for the
dialog's "Resize" and "Crop" buttons.
* app/tools/gimpmeasuretool.c
* app/tools/gimprotatetool.c: for consistency don't name the tools
"Blah Tool", also the dialog titles need to match the menu
entries.
Unrelated:
* libgimpwidgets/gimpwidgets.c: the recently changed, gtk-doc
comment was correct, as gtk-doc takes the parameter names from
the header, not the .c file.
* app/tools/gimptransformtool.c: set the transform tool's state to
TRANSFORM_CREATING after changing displays, so the initial matrix
components are saved correctly for the "Reset" function.
2002-09-01 16:44:57 +08:00
|
|
|
if (tr_tool->function == TRANSFORM_CREATING &&
|
|
|
|
gimp_tool_control_is_active (tool->control))
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2001-11-22 21:01:26 +08:00
|
|
|
gint i;
|
|
|
|
|
2001-03-01 14:56:57 +08:00
|
|
|
/* Save the current transformation info */
|
|
|
|
for (i = 0; i < TRAN_INFO_SIZE; i++)
|
2001-11-22 21:01:26 +08:00
|
|
|
tr_tool->old_trans_info[i] = tr_tool->trans_info[i];
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* if we have already displayed the bounding box and handles,
|
|
|
|
* check to make sure that the display which currently owns the
|
|
|
|
* tool is the one which just received the button pressed event
|
|
|
|
*/
|
2001-11-20 02:23:43 +08:00
|
|
|
if (gdisp == tool->gdisp)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
|
|
|
/* Save the current pointer position */
|
2001-11-20 02:23:43 +08:00
|
|
|
tr_tool->lastx = tr_tool->startx = coords->x;
|
|
|
|
tr_tool->lasty = tr_tool->starty = coords->y;
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2003-05-12 23:56:36 +08:00
|
|
|
if (! gimp_tool_control_is_active (tool->control))
|
|
|
|
gimp_tool_control_activate (tool->control);
|
2001-03-31 22:10:22 +08:00
|
|
|
}
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
|
|
|
|
2001-03-31 22:10:22 +08:00
|
|
|
static void
|
2001-11-09 03:14:51 +08:00
|
|
|
gimp_transform_tool_button_release (GimpTool *tool,
|
|
|
|
GimpCoords *coords,
|
|
|
|
guint32 time,
|
|
|
|
GdkModifierType state,
|
|
|
|
GimpDisplay *gdisp)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2001-11-20 02:23:43 +08:00
|
|
|
GimpTransformTool *tr_tool;
|
2001-03-10 15:07:31 +08:00
|
|
|
gint i;
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-11-20 02:23:43 +08:00
|
|
|
tr_tool = GIMP_TRANSFORM_TOOL (tool);
|
2001-03-01 14:56:57 +08:00
|
|
|
|
|
|
|
/* if we are creating, there is nothing to be done...exit */
|
2002-11-18 07:56:13 +08:00
|
|
|
if (tr_tool->function == TRANSFORM_CREATING && tr_tool->use_grid)
|
2001-03-01 14:56:57 +08:00
|
|
|
return;
|
|
|
|
|
|
|
|
/* if the 3rd button isn't pressed, transform the selected mask */
|
2001-11-09 03:14:51 +08:00
|
|
|
if (! (state & GDK_BUTTON3_MASK))
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
|
|
|
/* Shift-clicking is another way to approve the transform */
|
2001-11-22 21:01:26 +08:00
|
|
|
if ((state & GDK_SHIFT_MASK) || ! tr_tool->use_grid)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2001-11-20 02:23:43 +08:00
|
|
|
gimp_transform_tool_doit (tr_tool, gdisp);
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2003-05-22 01:38:14 +08:00
|
|
|
#if 0
|
2001-03-01 14:56:57 +08:00
|
|
|
/* Only update the paths preview */
|
|
|
|
path_transform_current_path (gdisp->gimage,
|
2001-11-20 02:23:43 +08:00
|
|
|
tr_tool->transform, TRUE);
|
2003-05-22 01:38:14 +08:00
|
|
|
#endif
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2001-03-31 22:10:22 +08:00
|
|
|
gimp_draw_tool_pause (GIMP_DRAW_TOOL (tool));
|
2001-03-01 14:56:57 +08:00
|
|
|
|
|
|
|
/* Restore the previous transformation info */
|
|
|
|
for (i = 0; i < TRAN_INFO_SIZE; i++)
|
2001-11-22 21:01:26 +08:00
|
|
|
tr_tool->trans_info[i] = tr_tool->old_trans_info[i];
|
2001-03-01 14:56:57 +08:00
|
|
|
|
|
|
|
/* recalculate the tool's transformation matrix */
|
2001-11-20 02:23:43 +08:00
|
|
|
gimp_transform_tool_recalc (tr_tool, gdisp);
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-03-31 22:10:22 +08:00
|
|
|
gimp_draw_tool_resume (GIMP_DRAW_TOOL (tool));
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2003-05-22 01:38:14 +08:00
|
|
|
#if 0
|
2001-03-01 14:56:57 +08:00
|
|
|
/* Update the paths preview */
|
|
|
|
path_transform_current_path (gdisp->gimage,
|
2001-11-20 02:23:43 +08:00
|
|
|
tr_tool->transform, TRUE);
|
2003-05-22 01:38:14 +08:00
|
|
|
#endif
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-03-31 22:10:22 +08:00
|
|
|
static void
|
2001-11-09 03:14:51 +08:00
|
|
|
gimp_transform_tool_motion (GimpTool *tool,
|
|
|
|
GimpCoords *coords,
|
|
|
|
guint32 time,
|
|
|
|
GdkModifierType state,
|
|
|
|
GimpDisplay *gdisp)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2002-11-14 19:54:57 +08:00
|
|
|
GimpTransformToolClass *tr_tool_class;
|
|
|
|
GimpTransformTool *tr_tool;
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
tr_tool = GIMP_TRANSFORM_TOOL (tool);
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-11-22 21:01:26 +08:00
|
|
|
/* if we are creating, there is nothing to be done so exit. */
|
2002-11-18 07:56:13 +08:00
|
|
|
if (tr_tool->function == TRANSFORM_CREATING || ! tr_tool->use_grid)
|
2001-03-01 14:56:57 +08:00
|
|
|
return;
|
|
|
|
|
2001-03-31 22:10:22 +08:00
|
|
|
gimp_draw_tool_pause (GIMP_DRAW_TOOL (tool));
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
tr_tool->curx = coords->x;
|
|
|
|
tr_tool->cury = coords->y;
|
|
|
|
tr_tool->state = state;
|
2001-03-01 14:56:57 +08:00
|
|
|
|
|
|
|
/* recalculate the tool's transformation matrix */
|
2002-11-14 19:54:57 +08:00
|
|
|
tr_tool_class = GIMP_TRANSFORM_TOOL_GET_CLASS (tr_tool);
|
|
|
|
|
|
|
|
if (tr_tool_class->motion)
|
|
|
|
{
|
|
|
|
tr_tool_class->motion (tr_tool, gdisp);
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
if (tr_tool_class->recalc)
|
|
|
|
tr_tool_class->recalc (tr_tool, gdisp);
|
|
|
|
}
|
|
|
|
|
|
|
|
tr_tool->lastx = tr_tool->curx;
|
|
|
|
tr_tool->lasty = tr_tool->cury;
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-03-31 22:10:22 +08:00
|
|
|
gimp_draw_tool_resume (GIMP_DRAW_TOOL (tool));
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
|
|
|
|
2001-11-30 00:44:51 +08:00
|
|
|
static void
|
|
|
|
gimp_transform_tool_modifier_key (GimpTool *tool,
|
|
|
|
GdkModifierType key,
|
|
|
|
gboolean press,
|
|
|
|
GdkModifierType state,
|
|
|
|
GimpDisplay *gdisp)
|
|
|
|
{
|
2003-02-05 22:39:40 +08:00
|
|
|
GimpTransformOptions *options;
|
2001-11-30 00:44:51 +08:00
|
|
|
|
2003-02-05 22:39:40 +08:00
|
|
|
options = GIMP_TRANSFORM_OPTIONS (tool->tool_info->tool_options);
|
2001-11-30 00:44:51 +08:00
|
|
|
|
2003-02-08 01:12:21 +08:00
|
|
|
if (key == GDK_CONTROL_MASK)
|
2001-11-30 00:44:51 +08:00
|
|
|
{
|
2003-02-28 09:14:30 +08:00
|
|
|
g_object_set (options,
|
2003-02-08 01:12:21 +08:00
|
|
|
"constrain-1", ! options->constrain_1,
|
|
|
|
NULL);
|
2001-11-30 00:44:51 +08:00
|
|
|
}
|
2003-02-08 01:12:21 +08:00
|
|
|
else if (key == GDK_MOD1_MASK)
|
2001-11-30 00:44:51 +08:00
|
|
|
{
|
2003-02-28 09:14:30 +08:00
|
|
|
g_object_set (options,
|
2003-02-08 01:12:21 +08:00
|
|
|
"constrain-2", ! options->constrain_2,
|
|
|
|
NULL);
|
2001-11-30 00:44:51 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-11-22 22:28:39 +08:00
|
|
|
static void
|
|
|
|
gimp_transform_tool_oper_update (GimpTool *tool,
|
|
|
|
GimpCoords *coords,
|
|
|
|
GdkModifierType state,
|
|
|
|
GimpDisplay *gdisp)
|
|
|
|
{
|
|
|
|
GimpTransformTool *tr_tool;
|
|
|
|
GimpDrawTool *draw_tool;
|
|
|
|
|
|
|
|
tr_tool = GIMP_TRANSFORM_TOOL (tool);
|
|
|
|
draw_tool = GIMP_DRAW_TOOL (tool);
|
|
|
|
|
2002-11-18 07:56:13 +08:00
|
|
|
if (! tr_tool->use_grid)
|
|
|
|
return;
|
|
|
|
|
2001-11-22 22:28:39 +08:00
|
|
|
if (gdisp == tool->gdisp)
|
|
|
|
{
|
|
|
|
gdouble closest_dist;
|
|
|
|
gdouble dist;
|
|
|
|
|
|
|
|
closest_dist = gimp_draw_tool_calc_distance (draw_tool, gdisp,
|
|
|
|
coords->x, coords->y,
|
|
|
|
tr_tool->tx1, tr_tool->ty1);
|
|
|
|
tr_tool->function = TRANSFORM_HANDLE_1;
|
|
|
|
|
|
|
|
dist = gimp_draw_tool_calc_distance (draw_tool, gdisp,
|
|
|
|
coords->x, coords->y,
|
|
|
|
tr_tool->tx2, tr_tool->ty2);
|
|
|
|
if (dist < closest_dist)
|
|
|
|
{
|
|
|
|
closest_dist = dist;
|
|
|
|
tr_tool->function = TRANSFORM_HANDLE_2;
|
|
|
|
}
|
|
|
|
|
|
|
|
dist = gimp_draw_tool_calc_distance (draw_tool, gdisp,
|
|
|
|
coords->x, coords->y,
|
|
|
|
tr_tool->tx3, tr_tool->ty3);
|
|
|
|
if (dist < closest_dist)
|
|
|
|
{
|
|
|
|
closest_dist = dist;
|
|
|
|
tr_tool->function = TRANSFORM_HANDLE_3;
|
|
|
|
}
|
|
|
|
|
|
|
|
dist = gimp_draw_tool_calc_distance (draw_tool, gdisp,
|
|
|
|
coords->x, coords->y,
|
|
|
|
tr_tool->tx4, tr_tool->ty4);
|
|
|
|
if (dist < closest_dist)
|
|
|
|
{
|
|
|
|
closest_dist = dist;
|
|
|
|
tr_tool->function = TRANSFORM_HANDLE_4;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (gimp_draw_tool_on_handle (draw_tool, gdisp,
|
|
|
|
coords->x, coords->y,
|
|
|
|
GIMP_HANDLE_CIRCLE,
|
|
|
|
tr_tool->tcx, tr_tool->tcy,
|
2002-11-18 21:10:04 +08:00
|
|
|
HANDLE_SIZE, HANDLE_SIZE,
|
2001-11-22 22:28:39 +08:00
|
|
|
GTK_ANCHOR_CENTER,
|
|
|
|
FALSE))
|
|
|
|
{
|
|
|
|
tr_tool->function = TRANSFORM_HANDLE_CENTER;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-03-31 22:10:22 +08:00
|
|
|
static void
|
2001-11-09 03:14:51 +08:00
|
|
|
gimp_transform_tool_cursor_update (GimpTool *tool,
|
|
|
|
GimpCoords *coords,
|
|
|
|
GdkModifierType state,
|
|
|
|
GimpDisplay *gdisp)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2001-11-22 22:28:39 +08:00
|
|
|
GimpTransformTool *tr_tool;
|
|
|
|
GimpDrawable *drawable;
|
|
|
|
|
|
|
|
tr_tool = GIMP_TRANSFORM_TOOL (tool);
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2002-06-17 01:13:39 +08:00
|
|
|
if (tr_tool->use_grid)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2002-06-17 01:13:39 +08:00
|
|
|
GdkCursorType ctype = GDK_TOP_LEFT_ARROW;
|
|
|
|
GimpCursorModifier cmodifier = GIMP_CURSOR_MODIFIER_NONE;
|
2001-11-09 03:14:51 +08:00
|
|
|
|
2002-06-17 01:13:39 +08:00
|
|
|
if ((drawable = gimp_image_active_drawable (gdisp->gimage)))
|
|
|
|
{
|
|
|
|
if (GIMP_IS_LAYER (drawable) &&
|
|
|
|
gimp_layer_get_mask (GIMP_LAYER (drawable)))
|
|
|
|
{
|
|
|
|
ctype = GIMP_BAD_CURSOR;
|
|
|
|
}
|
2003-05-08 22:06:03 +08:00
|
|
|
else if (gimp_display_coords_in_active_drawable (gdisp, coords))
|
2002-06-17 01:13:39 +08:00
|
|
|
{
|
|
|
|
if (gimp_image_mask_is_empty (gdisp->gimage) ||
|
|
|
|
gimp_image_mask_value (gdisp->gimage, coords->x, coords->y))
|
|
|
|
{
|
|
|
|
ctype = GIMP_MOUSE_CURSOR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2001-11-22 22:28:39 +08:00
|
|
|
|
2002-06-17 01:13:39 +08:00
|
|
|
if (tr_tool->use_center && tr_tool->function == TRANSFORM_HANDLE_CENTER)
|
|
|
|
{
|
|
|
|
cmodifier = GIMP_CURSOR_MODIFIER_MOVE;
|
|
|
|
}
|
|
|
|
|
|
|
|
gimp_tool_control_set_cursor (tool->control, ctype);
|
|
|
|
gimp_tool_control_set_cursor_modifier (tool->control, cmodifier);
|
|
|
|
}
|
2002-02-05 01:43:01 +08:00
|
|
|
|
|
|
|
GIMP_TOOL_CLASS (parent_class)->cursor_update (tool, coords, state, gdisp);
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
|
|
|
|
2001-03-31 22:10:22 +08:00
|
|
|
static void
|
2001-11-12 22:45:58 +08:00
|
|
|
gimp_transform_tool_draw (GimpDrawTool *draw_tool)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2003-02-05 22:39:40 +08:00
|
|
|
GimpTransformTool *tr_tool;
|
|
|
|
GimpTransformOptions *options;
|
|
|
|
gint i, k, gci;
|
2001-11-12 22:45:58 +08:00
|
|
|
|
|
|
|
tr_tool = GIMP_TRANSFORM_TOOL (draw_tool);
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-11-22 21:01:26 +08:00
|
|
|
if (! tr_tool->use_grid)
|
|
|
|
return;
|
|
|
|
|
2003-02-14 22:14:29 +08:00
|
|
|
options = GIMP_TRANSFORM_OPTIONS (GIMP_TOOL (draw_tool)->tool_info->tool_options);
|
|
|
|
|
2001-03-01 14:56:57 +08:00
|
|
|
/* draw the bounding box */
|
2001-11-12 22:45:58 +08:00
|
|
|
gimp_draw_tool_draw_line (draw_tool,
|
|
|
|
tr_tool->tx1, tr_tool->ty1,
|
|
|
|
tr_tool->tx2, tr_tool->ty2,
|
|
|
|
FALSE);
|
|
|
|
gimp_draw_tool_draw_line (draw_tool,
|
|
|
|
tr_tool->tx2, tr_tool->ty2,
|
|
|
|
tr_tool->tx4, tr_tool->ty4,
|
|
|
|
FALSE);
|
|
|
|
gimp_draw_tool_draw_line (draw_tool,
|
|
|
|
tr_tool->tx3, tr_tool->ty3,
|
|
|
|
tr_tool->tx4, tr_tool->ty4,
|
|
|
|
FALSE);
|
|
|
|
gimp_draw_tool_draw_line (draw_tool,
|
|
|
|
tr_tool->tx3, tr_tool->ty3,
|
|
|
|
tr_tool->tx1, tr_tool->ty1,
|
|
|
|
FALSE);
|
2001-03-01 14:56:57 +08:00
|
|
|
|
|
|
|
/* Draw the grid */
|
|
|
|
|
2001-11-22 21:01:26 +08:00
|
|
|
if ((tr_tool->grid_coords != NULL) && (tr_tool->tgrid_coords != NULL))
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
|
|
|
gci = 0;
|
2001-03-09 15:09:12 +08:00
|
|
|
k = tr_tool->ngx + tr_tool->ngy;
|
2001-03-31 22:10:22 +08:00
|
|
|
|
2001-03-01 14:56:57 +08:00
|
|
|
for (i = 0; i < k; i++)
|
|
|
|
{
|
2001-11-12 22:45:58 +08:00
|
|
|
gimp_draw_tool_draw_line (draw_tool,
|
|
|
|
tr_tool->tgrid_coords[gci],
|
|
|
|
tr_tool->tgrid_coords[gci + 1],
|
|
|
|
tr_tool->tgrid_coords[gci + 2],
|
|
|
|
tr_tool->tgrid_coords[gci + 3],
|
|
|
|
FALSE);
|
2001-03-01 14:56:57 +08:00
|
|
|
gci += 4;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* draw the tool handles */
|
2001-11-16 05:17:36 +08:00
|
|
|
gimp_draw_tool_draw_handle (draw_tool,
|
|
|
|
GIMP_HANDLE_SQUARE,
|
|
|
|
tr_tool->tx1, tr_tool->ty1,
|
2002-11-18 21:10:04 +08:00
|
|
|
HANDLE_SIZE, HANDLE_SIZE,
|
2001-11-16 05:17:36 +08:00
|
|
|
GTK_ANCHOR_CENTER,
|
|
|
|
FALSE);
|
|
|
|
gimp_draw_tool_draw_handle (draw_tool,
|
|
|
|
GIMP_HANDLE_SQUARE,
|
|
|
|
tr_tool->tx2, tr_tool->ty2,
|
2002-11-18 21:10:04 +08:00
|
|
|
HANDLE_SIZE, HANDLE_SIZE,
|
2001-11-16 05:17:36 +08:00
|
|
|
GTK_ANCHOR_CENTER,
|
|
|
|
FALSE);
|
|
|
|
gimp_draw_tool_draw_handle (draw_tool,
|
|
|
|
GIMP_HANDLE_SQUARE,
|
|
|
|
tr_tool->tx3, tr_tool->ty3,
|
2002-11-18 21:10:04 +08:00
|
|
|
HANDLE_SIZE, HANDLE_SIZE,
|
2001-11-16 05:17:36 +08:00
|
|
|
GTK_ANCHOR_CENTER,
|
|
|
|
FALSE);
|
|
|
|
gimp_draw_tool_draw_handle (draw_tool,
|
|
|
|
GIMP_HANDLE_SQUARE,
|
|
|
|
tr_tool->tx4, tr_tool->ty4,
|
2002-11-18 21:10:04 +08:00
|
|
|
HANDLE_SIZE, HANDLE_SIZE,
|
2001-11-16 05:17:36 +08:00
|
|
|
GTK_ANCHOR_CENTER,
|
|
|
|
FALSE);
|
2001-03-01 14:56:57 +08:00
|
|
|
|
|
|
|
/* draw the center */
|
2001-11-22 22:28:39 +08:00
|
|
|
if (tr_tool->use_center)
|
|
|
|
{
|
|
|
|
gimp_draw_tool_draw_handle (draw_tool,
|
|
|
|
GIMP_HANDLE_FILLED_CIRCLE,
|
|
|
|
tr_tool->tcx, tr_tool->tcy,
|
2002-11-18 21:10:04 +08:00
|
|
|
HANDLE_SIZE, HANDLE_SIZE,
|
2001-11-22 22:28:39 +08:00
|
|
|
GTK_ANCHOR_CENTER,
|
|
|
|
FALSE);
|
|
|
|
}
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2003-02-10 18:08:01 +08:00
|
|
|
if (tr_tool->show_path)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
|
|
|
GimpMatrix3 tmp_matrix;
|
|
|
|
|
2001-11-20 02:23:43 +08:00
|
|
|
if (options->direction == GIMP_TRANSFORM_BACKWARD)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2001-03-09 15:09:12 +08:00
|
|
|
gimp_matrix3_invert (tr_tool->transform, tmp_matrix);
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2001-03-09 15:09:12 +08:00
|
|
|
gimp_matrix3_duplicate (tr_tool->transform, tmp_matrix);
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
|
|
|
|
2003-05-22 01:38:14 +08:00
|
|
|
#if 0
|
2001-11-12 22:45:58 +08:00
|
|
|
path_transform_draw_current (GIMP_TOOL (draw_tool)->gdisp,
|
|
|
|
draw_tool, tmp_matrix);
|
2003-05-22 01:38:14 +08:00
|
|
|
#endif
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-11-18 21:10:04 +08:00
|
|
|
static TileManager *
|
|
|
|
gimp_transform_tool_real_transform (GimpTransformTool *tr_tool,
|
|
|
|
GimpDisplay *gdisp)
|
|
|
|
{
|
2003-02-05 22:39:40 +08:00
|
|
|
GimpTool *tool;
|
|
|
|
GimpTransformOptions *options;
|
2003-05-12 23:56:36 +08:00
|
|
|
GimpDrawable *active_drawable;
|
|
|
|
GimpItem *active_item;
|
2003-02-05 22:39:40 +08:00
|
|
|
GimpProgress *progress;
|
2003-05-13 21:57:11 +08:00
|
|
|
gboolean clip_result;
|
2003-02-05 22:39:40 +08:00
|
|
|
TileManager *ret;
|
2002-11-18 21:10:04 +08:00
|
|
|
|
2003-02-05 22:39:40 +08:00
|
|
|
tool = GIMP_TOOL (tr_tool);
|
|
|
|
options = GIMP_TRANSFORM_OPTIONS (tool->tool_info->tool_options);
|
2002-11-18 21:10:04 +08:00
|
|
|
|
2003-05-12 23:56:36 +08:00
|
|
|
active_drawable = gimp_image_active_drawable (gdisp->gimage);
|
|
|
|
active_item = GIMP_ITEM (active_drawable);
|
|
|
|
|
2002-11-18 21:10:04 +08:00
|
|
|
if (tr_tool->info_dialog)
|
|
|
|
gtk_widget_set_sensitive (GTK_WIDGET (tr_tool->info_dialog->shell), FALSE);
|
|
|
|
|
|
|
|
progress = gimp_progress_start (gdisp, tr_tool->progress_text, FALSE,
|
|
|
|
NULL, NULL);
|
|
|
|
|
2003-05-12 23:56:36 +08:00
|
|
|
if (gimp_item_get_linked (active_item))
|
|
|
|
gimp_item_linked_transform (active_item, tr_tool->transform,
|
|
|
|
options->direction,
|
|
|
|
options->interpolation, options->clip,
|
|
|
|
progress ?
|
|
|
|
gimp_progress_update_and_flush : NULL,
|
|
|
|
progress);
|
2003-02-04 07:54:19 +08:00
|
|
|
|
2003-05-13 21:57:11 +08:00
|
|
|
clip_result = options->clip;
|
|
|
|
|
|
|
|
/* always clip unfloated channels so they keep their size */
|
|
|
|
if (GIMP_IS_CHANNEL (active_drawable) &&
|
|
|
|
tile_manager_bpp (tr_tool->original) == 1)
|
|
|
|
clip_result = TRUE;
|
|
|
|
|
2003-05-12 23:56:36 +08:00
|
|
|
ret = gimp_drawable_transform_tiles_affine (active_drawable,
|
2002-11-18 21:10:04 +08:00
|
|
|
tr_tool->original,
|
|
|
|
tr_tool->transform,
|
|
|
|
options->direction,
|
2003-05-12 23:56:36 +08:00
|
|
|
options->interpolation,
|
2003-05-13 21:57:11 +08:00
|
|
|
clip_result,
|
2002-11-18 21:10:04 +08:00
|
|
|
progress ?
|
|
|
|
gimp_progress_update_and_flush :
|
|
|
|
NULL,
|
|
|
|
progress);
|
|
|
|
|
|
|
|
if (progress)
|
|
|
|
gimp_progress_end (progress);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2001-11-20 02:23:43 +08:00
|
|
|
static void
|
|
|
|
gimp_transform_tool_doit (GimpTransformTool *tr_tool,
|
|
|
|
GimpDisplay *gdisp)
|
|
|
|
{
|
2002-02-24 01:29:19 +08:00
|
|
|
GimpTool *tool;
|
|
|
|
TileManager *new_tiles;
|
|
|
|
gboolean new_layer;
|
2001-11-20 02:23:43 +08:00
|
|
|
|
|
|
|
gimp_set_busy (gdisp->gimage->gimp);
|
|
|
|
|
|
|
|
tool = GIMP_TOOL (tr_tool);
|
|
|
|
|
|
|
|
/* undraw the tool before we muck around with the transform matrix */
|
|
|
|
gimp_draw_tool_pause (GIMP_DRAW_TOOL (tr_tool));
|
|
|
|
|
|
|
|
/* We're going to dirty this image, but we want to keep the tool
|
|
|
|
* around
|
|
|
|
*/
|
2002-05-03 19:31:08 +08:00
|
|
|
gimp_tool_control_set_preserve (tool->control, TRUE);
|
2001-11-20 02:23:43 +08:00
|
|
|
|
|
|
|
/* Start a transform undo group */
|
2003-02-13 19:23:50 +08:00
|
|
|
gimp_image_undo_group_start (gdisp->gimage, GIMP_UNDO_GROUP_TRANSFORM,
|
2003-02-14 22:14:29 +08:00
|
|
|
tool->tool_info->blurb);
|
2001-11-20 02:23:43 +08:00
|
|
|
|
|
|
|
/* With the old UI, if original is NULL, then this is the
|
|
|
|
* first transformation. In the new UI, it is always so, right?
|
|
|
|
*/
|
|
|
|
g_assert (tr_tool->original == NULL);
|
|
|
|
|
|
|
|
/* Copy the current selection to the transform tool's private
|
|
|
|
* selection pointer, so that the original source can be repeatedly
|
|
|
|
* modified.
|
|
|
|
*/
|
|
|
|
tool->drawable = gimp_image_active_drawable (gdisp->gimage);
|
|
|
|
|
|
|
|
tr_tool->original = gimp_drawable_transform_cut (tool->drawable,
|
|
|
|
&new_layer);
|
|
|
|
|
|
|
|
/* Send the request for the transformation to the tool...
|
|
|
|
*/
|
2002-11-18 21:10:04 +08:00
|
|
|
new_tiles = GIMP_TRANSFORM_TOOL_GET_CLASS (tr_tool)->transform (tr_tool,
|
|
|
|
gdisp);
|
2001-11-20 02:23:43 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
gimp_transform_tool_prepare (tr_tool, gdisp);
|
2001-11-20 02:23:43 +08:00
|
|
|
gimp_transform_tool_recalc (tr_tool, gdisp);
|
|
|
|
|
|
|
|
if (new_tiles)
|
|
|
|
{
|
|
|
|
/* paste the new transformed image to the gimage...also implement
|
|
|
|
* undo...
|
|
|
|
*/
|
|
|
|
/* FIXME: we should check if the drawable is still valid */
|
|
|
|
gimp_drawable_transform_paste (tool->drawable,
|
|
|
|
new_tiles,
|
|
|
|
new_layer);
|
2003-05-27 01:02:06 +08:00
|
|
|
tile_manager_unref (new_tiles);
|
2001-11-20 02:23:43 +08:00
|
|
|
|
|
|
|
/* Make a note of the new current drawable (since we may have
|
|
|
|
* a floating selection, etc now.
|
|
|
|
*/
|
|
|
|
tool->drawable = gimp_image_active_drawable (gdisp->gimage);
|
|
|
|
|
2003-02-14 22:14:29 +08:00
|
|
|
gimp_transform_tool_push_undo (gdisp->gimage, NULL,
|
|
|
|
tool->ID,
|
|
|
|
G_TYPE_FROM_INSTANCE (tool),
|
|
|
|
tr_tool->old_trans_info,
|
2003-05-18 18:44:09 +08:00
|
|
|
NULL);
|
2001-11-20 02:23:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* push the undo group end */
|
2003-02-13 19:23:50 +08:00
|
|
|
gimp_image_undo_group_end (gdisp->gimage);
|
2001-11-20 02:23:43 +08:00
|
|
|
|
|
|
|
/* We're done dirtying the image, and would like to be restarted
|
|
|
|
* if the image gets dirty while the tool exists
|
|
|
|
*/
|
2002-05-03 19:31:08 +08:00
|
|
|
gimp_tool_control_set_preserve (tool->control, FALSE);
|
2001-11-20 02:23:43 +08:00
|
|
|
|
|
|
|
gimp_unset_busy (gdisp->gimage->gimp);
|
|
|
|
|
2002-05-09 01:48:24 +08:00
|
|
|
gimp_image_flush (gdisp->gimage);
|
2001-11-20 02:23:43 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
gimp_transform_tool_reset (tr_tool);
|
2001-11-20 02:23:43 +08:00
|
|
|
}
|
|
|
|
|
2001-03-01 14:56:57 +08:00
|
|
|
void
|
2001-03-09 15:09:12 +08:00
|
|
|
gimp_transform_tool_transform_bounding_box (GimpTransformTool *tr_tool)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2001-11-22 22:28:39 +08:00
|
|
|
g_return_if_fail (GIMP_IS_TRANSFORM_TOOL (tr_tool));
|
2001-03-09 15:09:12 +08:00
|
|
|
|
|
|
|
gimp_matrix3_transform_point (tr_tool->transform,
|
|
|
|
tr_tool->x1, tr_tool->y1,
|
|
|
|
&tr_tool->tx1, &tr_tool->ty1);
|
|
|
|
gimp_matrix3_transform_point (tr_tool->transform,
|
|
|
|
tr_tool->x2, tr_tool->y1,
|
|
|
|
&tr_tool->tx2, &tr_tool->ty2);
|
|
|
|
gimp_matrix3_transform_point (tr_tool->transform,
|
|
|
|
tr_tool->x1, tr_tool->y2,
|
|
|
|
&tr_tool->tx3, &tr_tool->ty3);
|
|
|
|
gimp_matrix3_transform_point (tr_tool->transform,
|
|
|
|
tr_tool->x2, tr_tool->y2,
|
|
|
|
&tr_tool->tx4, &tr_tool->ty4);
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-03-31 22:10:22 +08:00
|
|
|
gimp_matrix3_transform_point (tr_tool->transform,
|
|
|
|
tr_tool->cx, tr_tool->cy,
|
|
|
|
&tr_tool->tcx, &tr_tool->tcy);
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-11-22 22:28:39 +08:00
|
|
|
if (tr_tool->grid_coords != NULL && tr_tool->tgrid_coords != NULL)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2001-11-22 22:28:39 +08:00
|
|
|
gint i, k;
|
|
|
|
gint gci;
|
|
|
|
|
2001-03-01 14:56:57 +08:00
|
|
|
gci = 0;
|
2001-11-22 22:28:39 +08:00
|
|
|
k = (tr_tool->ngx + tr_tool->ngy) * 2;
|
2001-03-31 22:10:22 +08:00
|
|
|
|
2001-03-01 14:56:57 +08:00
|
|
|
for (i = 0; i < k; i++)
|
|
|
|
{
|
2001-03-09 15:09:12 +08:00
|
|
|
gimp_matrix3_transform_point (tr_tool->transform,
|
|
|
|
tr_tool->grid_coords[gci],
|
2002-11-18 21:10:04 +08:00
|
|
|
tr_tool->grid_coords[gci + 1],
|
|
|
|
&tr_tool->tgrid_coords[gci],
|
|
|
|
&tr_tool->tgrid_coords[gci + 1]);
|
2001-03-01 14:56:57 +08:00
|
|
|
gci += 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-11-22 21:01:26 +08:00
|
|
|
static void
|
2002-11-14 19:54:57 +08:00
|
|
|
gimp_transform_tool_reset (GimpTransformTool *tr_tool)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2001-03-09 15:09:12 +08:00
|
|
|
GimpTool *tool;
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-03-31 22:10:22 +08:00
|
|
|
tool = GIMP_TOOL (tr_tool);
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-03-09 15:09:12 +08:00
|
|
|
if (tr_tool->original)
|
2001-03-31 22:10:22 +08:00
|
|
|
{
|
2003-05-27 01:02:06 +08:00
|
|
|
tile_manager_unref (tr_tool->original);
|
2001-03-31 22:10:22 +08:00
|
|
|
tr_tool->original = NULL;
|
|
|
|
}
|
2001-03-01 14:56:57 +08:00
|
|
|
|
|
|
|
/* inactivate the tool */
|
2001-03-09 15:09:12 +08:00
|
|
|
tr_tool->function = TRANSFORM_CREATING;
|
2001-11-22 21:01:26 +08:00
|
|
|
|
2001-03-31 22:10:22 +08:00
|
|
|
gimp_draw_tool_stop (GIMP_DRAW_TOOL (tr_tool));
|
2001-11-22 21:01:26 +08:00
|
|
|
|
|
|
|
if (tr_tool->info_dialog)
|
|
|
|
info_dialog_popdown (tr_tool->info_dialog);
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2003-01-03 21:59:23 +08:00
|
|
|
gimp_tool_control_halt (tool->control);
|
2001-03-01 14:56:57 +08:00
|
|
|
tool->gdisp = NULL;
|
|
|
|
tool->drawable = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2001-03-31 22:10:22 +08:00
|
|
|
gimp_transform_tool_bounds (GimpTransformTool *tr_tool,
|
2001-10-22 20:13:44 +08:00
|
|
|
GimpDisplay *gdisp)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2001-10-22 20:13:44 +08:00
|
|
|
TileManager *tiles;
|
|
|
|
GimpDrawable *drawable;
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-03-31 22:10:22 +08:00
|
|
|
tiles = tr_tool->original;
|
|
|
|
drawable = gimp_image_active_drawable (gdisp->gimage);
|
2001-03-01 14:56:57 +08:00
|
|
|
|
|
|
|
/* find the boundaries */
|
|
|
|
if (tiles)
|
|
|
|
{
|
2002-11-18 07:56:13 +08:00
|
|
|
tile_manager_get_offsets (tiles, &tr_tool->x1, &tr_tool->y1);
|
|
|
|
|
2001-03-09 15:09:12 +08:00
|
|
|
tr_tool->x2 = tr_tool->x1 + tile_manager_width (tiles);
|
|
|
|
tr_tool->y2 = tr_tool->y1 + tile_manager_height (tiles);
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-02-20 00:35:13 +08:00
|
|
|
gint offset_x, offset_y;
|
|
|
|
|
2003-05-08 22:06:03 +08:00
|
|
|
gimp_item_offsets (GIMP_ITEM (drawable), &offset_x, &offset_y);
|
2002-02-20 00:35:13 +08:00
|
|
|
|
2001-03-01 14:56:57 +08:00
|
|
|
gimp_drawable_mask_bounds (drawable,
|
2001-03-09 15:09:12 +08:00
|
|
|
&tr_tool->x1, &tr_tool->y1,
|
|
|
|
&tr_tool->x2, &tr_tool->y2);
|
|
|
|
tr_tool->x1 += offset_x;
|
|
|
|
tr_tool->y1 += offset_y;
|
|
|
|
tr_tool->x2 += offset_x;
|
|
|
|
tr_tool->y2 += offset_y;
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
2001-03-09 15:09:12 +08:00
|
|
|
|
2002-02-20 00:35:13 +08:00
|
|
|
tr_tool->cx = (gdouble) (tr_tool->x1 + tr_tool->x2) / 2.0;
|
|
|
|
tr_tool->cy = (gdouble) (tr_tool->y1 + tr_tool->y2) / 2.0;
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-11-20 02:23:43 +08:00
|
|
|
if (tr_tool->use_grid)
|
|
|
|
{
|
|
|
|
/* changing the bounds invalidates any grid we may have */
|
|
|
|
gimp_transform_tool_grid_recalc (tr_tool);
|
|
|
|
}
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2001-03-09 15:09:12 +08:00
|
|
|
gimp_transform_tool_grid_recalc (GimpTransformTool *tr_tool)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2003-02-05 22:39:40 +08:00
|
|
|
GimpTransformOptions *options;
|
2001-11-20 02:23:43 +08:00
|
|
|
|
2003-02-05 22:39:40 +08:00
|
|
|
options = GIMP_TRANSFORM_OPTIONS (GIMP_TOOL (tr_tool)->tool_info->tool_options);
|
2001-11-20 02:23:43 +08:00
|
|
|
|
2001-03-09 15:09:12 +08:00
|
|
|
if (tr_tool->grid_coords != NULL)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2001-03-09 15:09:12 +08:00
|
|
|
g_free (tr_tool->grid_coords);
|
|
|
|
tr_tool->grid_coords = NULL;
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
2001-03-31 22:10:22 +08:00
|
|
|
|
2001-03-09 15:09:12 +08:00
|
|
|
if (tr_tool->tgrid_coords != NULL)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2001-03-09 15:09:12 +08:00
|
|
|
g_free (tr_tool->tgrid_coords);
|
|
|
|
tr_tool->tgrid_coords = NULL;
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
2001-03-31 22:10:22 +08:00
|
|
|
|
2002-12-17 23:46:47 +08:00
|
|
|
switch (options->grid_type)
|
2001-11-20 02:23:43 +08:00
|
|
|
{
|
2003-02-08 01:12:21 +08:00
|
|
|
case GIMP_TRANSFORM_GRID_TYPE_N_LINES:
|
|
|
|
case GIMP_TRANSFORM_GRID_TYPE_SPACING:
|
2002-12-17 23:46:47 +08:00
|
|
|
{
|
|
|
|
GimpTool *tool;
|
|
|
|
gint i, gci;
|
|
|
|
gdouble *coords;
|
|
|
|
gint width, height;
|
|
|
|
|
|
|
|
width = MAX (1, tr_tool->x2 - tr_tool->x1);
|
|
|
|
height = MAX (1, tr_tool->y2 - tr_tool->y1);
|
|
|
|
|
|
|
|
tool = GIMP_TOOL (tr_tool);
|
|
|
|
|
2003-02-08 01:12:21 +08:00
|
|
|
if (options->grid_type == GIMP_TRANSFORM_GRID_TYPE_N_LINES)
|
2002-12-17 23:46:47 +08:00
|
|
|
{
|
|
|
|
if (width <= height)
|
|
|
|
{
|
|
|
|
tr_tool->ngx = options->grid_size;
|
|
|
|
tr_tool->ngy = tr_tool->ngx * MAX (1, height / width);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
tr_tool->ngy = options->grid_size;
|
|
|
|
tr_tool->ngx = tr_tool->ngy * MAX (1, width / height);
|
|
|
|
}
|
|
|
|
}
|
2003-02-08 01:12:21 +08:00
|
|
|
else /* GIMP_TRANSFORM_GRID_TYPE_SPACING */
|
2002-12-17 23:46:47 +08:00
|
|
|
{
|
|
|
|
gint grid_size = MAX (2, options->grid_size);
|
|
|
|
|
|
|
|
tr_tool->ngx = width / grid_size;
|
|
|
|
tr_tool->ngy = height / grid_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
tr_tool->grid_coords = coords =
|
|
|
|
g_new (gdouble, (tr_tool->ngx + tr_tool->ngy) * 4);
|
|
|
|
|
|
|
|
tr_tool->tgrid_coords =
|
|
|
|
g_new (gdouble, (tr_tool->ngx + tr_tool->ngy) * 4);
|
|
|
|
|
|
|
|
gci = 0;
|
|
|
|
|
|
|
|
for (i = 1; i <= tr_tool->ngx; i++)
|
|
|
|
{
|
|
|
|
coords[gci] = tr_tool->x1 + (((gdouble) i) / (tr_tool->ngx + 1) *
|
|
|
|
(tr_tool->x2 - tr_tool->x1));
|
|
|
|
coords[gci + 1] = tr_tool->y1;
|
|
|
|
coords[gci + 2] = coords[gci];
|
|
|
|
coords[gci + 3] = tr_tool->y2;
|
|
|
|
|
|
|
|
gci += 4;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 1; i <= tr_tool->ngy; i++)
|
|
|
|
{
|
|
|
|
coords[gci] = tr_tool->x1;
|
|
|
|
coords[gci + 1] = tr_tool->y1 + (((gdouble) i) / (tr_tool->ngy + 1) *
|
|
|
|
(tr_tool->y2 - tr_tool->y1));
|
|
|
|
coords[gci + 2] = tr_tool->x2;
|
|
|
|
coords[gci + 3] = coords[gci + 1];
|
|
|
|
|
|
|
|
gci += 4;
|
|
|
|
}
|
|
|
|
}
|
2002-02-20 00:35:13 +08:00
|
|
|
|
2002-12-17 23:46:47 +08:00
|
|
|
default:
|
|
|
|
break;
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2002-11-14 19:54:57 +08:00
|
|
|
gimp_transform_tool_dialog (GimpTransformTool *tr_tool)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2002-11-14 19:54:57 +08:00
|
|
|
if (GIMP_TRANSFORM_TOOL_GET_CLASS (tr_tool)->dialog)
|
|
|
|
{
|
|
|
|
GimpToolInfo *tool_info;
|
2003-02-27 02:08:26 +08:00
|
|
|
const gchar *stock_id;
|
2002-11-14 19:54:57 +08:00
|
|
|
|
|
|
|
tool_info = GIMP_TOOL (tr_tool)->tool_info;
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2003-02-27 02:08:26 +08:00
|
|
|
stock_id = gimp_viewable_get_stock_id (GIMP_VIEWABLE (tool_info));
|
2003-02-27 00:17:10 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
tr_tool->info_dialog =
|
|
|
|
info_dialog_new (NULL,
|
|
|
|
tool_info->blurb,
|
|
|
|
GIMP_OBJECT (tool_info)->name,
|
2003-02-27 00:17:10 +08:00
|
|
|
stock_id,
|
2002-11-14 19:54:57 +08:00
|
|
|
tr_tool->shell_desc,
|
2003-05-26 01:16:59 +08:00
|
|
|
gimp_standard_help_func, tool_info->help_data);
|
2002-11-14 19:54:57 +08:00
|
|
|
|
|
|
|
gimp_dialog_create_action_area (GIMP_DIALOG (tr_tool->info_dialog->shell),
|
|
|
|
|
|
|
|
GIMP_STOCK_RESET,
|
|
|
|
transform_reset_callback,
|
|
|
|
tr_tool, NULL, NULL, FALSE, FALSE,
|
|
|
|
|
|
|
|
GTK_STOCK_CANCEL,
|
|
|
|
transform_cancel_callback,
|
|
|
|
tr_tool, NULL, NULL, FALSE, TRUE,
|
|
|
|
|
2003-02-27 00:17:10 +08:00
|
|
|
stock_id,
|
2002-11-14 19:54:57 +08:00
|
|
|
transform_ok_callback,
|
|
|
|
tr_tool, NULL, NULL, TRUE, FALSE,
|
|
|
|
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
GIMP_TRANSFORM_TOOL_GET_CLASS (tr_tool)->dialog (tr_tool);
|
2003-05-03 02:43:15 +08:00
|
|
|
|
|
|
|
if (tr_tool->shell_identifier)
|
2003-05-29 01:23:54 +08:00
|
|
|
{
|
|
|
|
GimpDialogFactory *dialog_factory;
|
|
|
|
|
|
|
|
dialog_factory = gimp_dialog_factory_from_name ("toplevel");
|
2003-05-03 02:43:15 +08:00
|
|
|
|
2003-05-29 01:23:54 +08:00
|
|
|
gimp_dialog_factory_add_foreign (dialog_factory,
|
|
|
|
tr_tool->shell_identifier,
|
|
|
|
tr_tool->info_dialog->shell);
|
|
|
|
}
|
2002-11-14 19:54:57 +08:00
|
|
|
}
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
|
|
|
|
2001-11-20 02:23:43 +08:00
|
|
|
static void
|
2002-11-14 19:54:57 +08:00
|
|
|
gimp_transform_tool_prepare (GimpTransformTool *tr_tool,
|
|
|
|
GimpDisplay *gdisp)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2002-11-14 19:54:57 +08:00
|
|
|
if (tr_tool->info_dialog)
|
|
|
|
{
|
|
|
|
gimp_viewable_dialog_set_viewable (GIMP_VIEWABLE_DIALOG (tr_tool->info_dialog->shell),
|
|
|
|
GIMP_VIEWABLE (gimp_image_active_drawable (gdisp->gimage)));
|
|
|
|
|
|
|
|
gtk_widget_set_sensitive (GTK_WIDGET (tr_tool->info_dialog->shell), TRUE);
|
|
|
|
}
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
if (GIMP_TRANSFORM_TOOL_GET_CLASS (tr_tool)->prepare)
|
|
|
|
GIMP_TRANSFORM_TOOL_GET_CLASS (tr_tool)->prepare (tr_tool, gdisp);
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
|
|
|
|
2001-11-20 02:23:43 +08:00
|
|
|
static void
|
2002-11-14 19:54:57 +08:00
|
|
|
gimp_transform_tool_recalc (GimpTransformTool *tr_tool,
|
|
|
|
GimpDisplay *gdisp)
|
2001-03-01 14:56:57 +08:00
|
|
|
{
|
2002-11-14 19:54:57 +08:00
|
|
|
gimp_transform_tool_bounds (tr_tool, gdisp);
|
|
|
|
|
|
|
|
if (GIMP_TRANSFORM_TOOL_GET_CLASS (tr_tool)->recalc)
|
|
|
|
GIMP_TRANSFORM_TOOL_GET_CLASS (tr_tool)->recalc (tr_tool, gdisp);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
transform_reset_callback (GtkWidget *widget,
|
|
|
|
GimpTransformTool *tr_tool)
|
|
|
|
{
|
|
|
|
GimpTool *tool;
|
|
|
|
gint i;
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2002-11-14 19:54:57 +08:00
|
|
|
tool = GIMP_TOOL (tr_tool);
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-11-20 02:23:43 +08:00
|
|
|
gimp_draw_tool_pause (GIMP_DRAW_TOOL (tool));
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-11-20 02:23:43 +08:00
|
|
|
/* Restore the previous transformation info */
|
|
|
|
for (i = 0; i < TRAN_INFO_SIZE; i++)
|
2002-11-14 19:54:57 +08:00
|
|
|
tr_tool->trans_info[i] = tr_tool->old_trans_info[i];
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-11-20 02:23:43 +08:00
|
|
|
/* recalculate the tool's transformation matrix */
|
2002-11-14 19:54:57 +08:00
|
|
|
gimp_transform_tool_recalc (tr_tool, tool->gdisp);
|
2001-03-01 14:56:57 +08:00
|
|
|
|
2001-11-20 02:23:43 +08:00
|
|
|
gimp_draw_tool_resume (GIMP_DRAW_TOOL (tool));
|
2001-03-01 14:56:57 +08:00
|
|
|
}
|
2002-11-14 19:54:57 +08:00
|
|
|
|
|
|
|
static void
|
|
|
|
transform_cancel_callback (GtkWidget *widget,
|
|
|
|
GimpTransformTool *tr_tool)
|
|
|
|
{
|
|
|
|
gimp_transform_tool_reset (tr_tool);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
transform_ok_callback (GtkWidget *widget,
|
|
|
|
GimpTransformTool *tr_tool)
|
|
|
|
{
|
|
|
|
gimp_transform_tool_doit (tr_tool, GIMP_TOOL (tr_tool)->gdisp);
|
|
|
|
}
|
2003-02-10 18:08:01 +08:00
|
|
|
|
|
|
|
static void
|
|
|
|
gimp_transform_tool_notify_grid (GimpTransformOptions *options,
|
|
|
|
GParamSpec *pspec,
|
|
|
|
GimpTransformTool *tr_tool)
|
|
|
|
{
|
|
|
|
if (tr_tool->function == TRANSFORM_CREATING)
|
|
|
|
return;
|
|
|
|
|
|
|
|
gimp_draw_tool_pause (GIMP_DRAW_TOOL (tr_tool));
|
|
|
|
|
|
|
|
gimp_transform_tool_grid_recalc (tr_tool);
|
|
|
|
gimp_transform_tool_transform_bounding_box (tr_tool);
|
|
|
|
|
|
|
|
gimp_draw_tool_resume (GIMP_DRAW_TOOL (tr_tool));
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
gimp_transform_tool_notify_path (GimpTransformOptions *options,
|
|
|
|
GParamSpec *pspec,
|
|
|
|
GimpTransformTool *tr_tool)
|
|
|
|
{
|
|
|
|
if (tr_tool->function == TRANSFORM_CREATING)
|
|
|
|
return;
|
|
|
|
|
|
|
|
gimp_draw_tool_pause (GIMP_DRAW_TOOL (tr_tool));
|
|
|
|
|
|
|
|
tr_tool->show_path = options->show_path;
|
|
|
|
|
|
|
|
gimp_draw_tool_resume (GIMP_DRAW_TOOL (tr_tool));
|
|
|
|
}
|