[gimp/soc-2013-combined-selection-tool: 203/230] app: created backup error copy
- From: Ajay Ramanathan <ajayr src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/soc-2013-combined-selection-tool: 203/230] app: created backup error copy
- Date: Sat, 21 Sep 2013 03:18:02 +0000 (UTC)
commit 2cb7110350baa76bf4e69a6a49fca822a0e63737
Author: Ajay Ramanathan <ajay 010293 gmail com>
Date: Sun Jul 21 15:15:32 2013 +0530
app: created backup error copy
app/tools/gimpselectbyshapetool[Error].c | 1277 ++++++++++++++++++++++++++++++
app/tools/gimpselectbyshapetool[Error].h | 64 ++
2 files changed, 1341 insertions(+), 0 deletions(-)
---
diff --git a/app/tools/gimpselectbyshapetool[Error].c b/app/tools/gimpselectbyshapetool[Error].c
new file mode 100644
index 0000000..b659d34
--- /dev/null
+++ b/app/tools/gimpselectbyshapetool[Error].c
@@ -0,0 +1,1277 @@
+/* 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/>.
+ */
+
+#include "config.h"
+
+#include <gegl.h>
+#include <gtk/gtk.h>
+
+#include "libgimpmath/gimpmath.h"
+#include "libgimpwidgets/gimpwidgets.h"
+
+#include "tools-types.h"
+
+#include "core/gimpchannel.h"
+#include "core/gimpchannel-select.h"
+#include "core/gimplayer-floating-sel.h"
+#include "core/gimpimage.h"
+#include "core/gimpimage-undo.h"
+#include "core/gimppickable.h"
+#include "core/gimp-utils.h"
+#include "core/gimpundostack.h"
+
+#include "widgets/gimpdialogfactory.h"
+#include "widgets/gimphelp-ids.h"
+#include "widgets/gimpviewabledialog.h"
+#include "widgets/gimpwidgets-utils.h"
+
+#include "display/gimpcanvasgroup.h"
+#include "display/gimpdisplay.h"
+#include "display/gimpdisplayshell.h"
+#include "display/gimpdisplayshell-transform.h"
+#include "display/gimpdisplayshell-appearance.h"
+
+#include "gimpeditselectiontool.h"
+#include "gimpselectiontool.h"
+#include "gimpselectionoptions.h"
+#include "gimprectangletool.h"
+#include "gimprectangleoptions.h"
+#include "gimprectangleselecttool.h"
+#include "gimprectangleselectoptions.h"
+#include "gimptoolcontrol.h"
+
+#include "gimp-intl.h"
+
+
+typedef struct GimpRectangleSelectToolPrivate
+{
+ GimpChannelOps operation; /* remember for use when modifying */
+ gboolean use_saved_op; /* use operation or get from options */
+ gboolean saved_show_selection; /* used to remember existing value */
+ GimpUndo *undo;
+ GimpUndo *redo;
+
+ gboolean round_corners;
+ gdouble corner_radius;
+
+ gdouble press_x;
+ gdouble press_y;
+} GimpRectangleSelectToolPrivate;
+
+
+#define GIMP_RECTANGLE_SELECT_TOOL_GET_PRIVATE(obj) \
+ ((GimpRectangleSelectToolPrivate *) ((GimpRectangleSelectTool *) (obj))->priv)
+
+
+static void gimp_rectangle_select_tool_rectangle_tool_iface_init (GimpRectangleToolInterface *iface);
+
+static void gimp_rectangle_select_tool_constructed (GObject *object);
+
+static void gimp_rectangle_select_tool_control (GimpTool *tool,
+ GimpToolAction action,
+ GimpDisplay *display);
+static void gimp_rectangle_select_tool_button_press (GimpTool *tool,
+ const GimpCoords *coords,
+ guint32 time,
+ GdkModifierType state,
+ GimpButtonPressType press_type,
+ GimpDisplay *display);
+static void gimp_rectangle_select_tool_button_release (GimpTool *tool,
+ const GimpCoords *coords,
+ guint32 time,
+ GdkModifierType state,
+ GimpButtonReleaseType release_type,
+ GimpDisplay *display);
+static void gimp_rectangle_select_tool_active_modifier_key
+ (GimpTool *tool,
+ GdkModifierType key,
+ gboolean press,
+ GdkModifierType state,
+ GimpDisplay *display);
+static gboolean gimp_rectangle_select_tool_key_press (GimpTool *tool,
+ GdkEventKey *kevent,
+ GimpDisplay *display);
+static void gimp_rectangle_select_tool_oper_update (GimpTool *tool,
+ const GimpCoords *coords,
+ GdkModifierType state,
+ gboolean proximity,
+ GimpDisplay *display);
+static void gimp_rectangle_select_tool_cursor_update (GimpTool *tool,
+ const GimpCoords *coords,
+ GdkModifierType state,
+ GimpDisplay *display);
+static void gimp_rectangle_select_tool_draw (GimpDrawTool *draw_tool);
+static gboolean gimp_rectangle_select_tool_select (GimpRectangleTool *rect_tool,
+ gint x,
+ gint y,
+ gint w,
+ gint h);
+static gboolean gimp_rectangle_select_tool_execute (GimpRectangleTool *rect_tool,
+ gint x,
+ gint y,
+ gint w,
+ gint h);
+static void gimp_rectangle_select_tool_cancel (GimpRectangleTool *rect_tool);
+static gboolean gimp_rectangle_select_tool_rectangle_change_complete
+ (GimpRectangleTool *rect_tool);
+static void gimp_rectangle_select_tool_real_select (GimpRectangleSelectTool *rect_sel_tool,
+ GimpChannelOps operation,
+ gint x,
+ gint y,
+ gint w,
+ gint h);
+static GimpChannelOps
+ gimp_rectangle_select_tool_get_operation (GimpRectangleSelectTool *rect_sel_tool);
+static void gimp_rectangle_select_tool_update_option_defaults
+ (GimpRectangleSelectTool *rect_sel_tool,
+ gboolean ignore_pending);
+
+static void gimp_rectangle_select_tool_round_corners_notify
+ (GimpRectangleSelectOptions *options,
+ GParamSpec *pspec,
+ GimpRectangleSelectTool *rect_sel_tool);
+
+
+G_DEFINE_TYPE_WITH_CODE (GimpRectangleSelectTool, gimp_rectangle_select_tool,
+ GIMP_TYPE_SELECTION_TOOL,
+ G_IMPLEMENT_INTERFACE (GIMP_TYPE_RECTANGLE_TOOL,
+ gimp_rectangle_select_tool_rectangle_tool_iface_init))
+
+#define parent_class gimp_rectangle_select_tool_parent_class
+
+
+void
+gimp_select_by_shape_tool_register (GimpToolRegisterCallback callback,
+ gpointer data)
+{
+ (* callback) (GIMP_TYPE_SELECT_BY_SHAPE_TOOL,
+ GIMP_TYPE_RECTANGLE_SELECT_OPTIONS,
+ gimp_rectangle_select_options_gui,
+ 0,
+ "gimp-select-by-shape-tool",
+ _("Select by Shape"),
+ _("Select by Shape Tool: Selects a predefined shape"),
+ N_("_Select By Shape"), "<shift>S",
+ NULL, GIMP_HELP_TOOL_SELECT_BY_SHAPE,
+ GIMP_STOCK_TOOL_SELECT_BY_SHAPE,
+ data);
+}
+
+static void
+gimp_rectangle_select_tool_class_init (GimpRectangleSelectToolClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GimpToolClass *tool_class = GIMP_TOOL_CLASS (klass);
+ GimpDrawToolClass *draw_tool_class = GIMP_DRAW_TOOL_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (GimpRectangleSelectToolPrivate));
+
+ object_class->constructed = gimp_rectangle_select_tool_constructed;
+ object_class->set_property = gimp_rectangle_tool_set_property;
+ object_class->get_property = gimp_rectangle_tool_get_property;
+
+ tool_class->control = gimp_rectangle_select_tool_control;
+ tool_class->button_press = gimp_rectangle_select_tool_button_press;
+ tool_class->button_release = gimp_rectangle_select_tool_button_release;
+ tool_class->motion = gimp_rectangle_tool_motion;
+ tool_class->key_press = gimp_rectangle_select_tool_key_press;
+ tool_class->active_modifier_key = gimp_rectangle_select_tool_active_modifier_key;
+ tool_class->oper_update = gimp_rectangle_select_tool_oper_update;
+ tool_class->cursor_update = gimp_rectangle_select_tool_cursor_update;
+
+ draw_tool_class->draw = gimp_rectangle_select_tool_draw;
+
+ klass->select = gimp_rectangle_select_tool_real_select;
+
+ gimp_rectangle_tool_install_properties (object_class);
+}
+
+static void
+gimp_rectangle_select_tool_rectangle_tool_iface_init (GimpRectangleToolInterface *iface)
+{
+ iface->execute = gimp_rectangle_select_tool_execute;
+ iface->cancel = gimp_rectangle_select_tool_cancel;
+ iface->rectangle_change_complete = gimp_rectangle_select_tool_rectangle_change_complete;
+}
+
+static void
+gimp_rectangle_select_tool_init (GimpRectangleSelectTool *rect_sel_tool)
+{
+ GimpTool *tool = GIMP_TOOL (rect_sel_tool);
+ GimpRectangleSelectToolPrivate *priv;
+
+ gimp_rectangle_tool_init (GIMP_RECTANGLE_TOOL (rect_sel_tool));
+
+ rect_sel_tool->priv = G_TYPE_INSTANCE_GET_PRIVATE (rect_sel_tool,
+ GIMP_TYPE_RECTANGLE_SELECT_TOOL,
+ GimpRectangleSelectToolPrivate);
+
+ priv = GIMP_RECTANGLE_SELECT_TOOL_GET_PRIVATE (rect_sel_tool);
+
+ gimp_tool_control_set_wants_click (tool->control, TRUE);
+ gimp_tool_control_set_precision (tool->control,
+ GIMP_CURSOR_PRECISION_PIXEL_BORDER);
+ gimp_tool_control_set_tool_cursor (tool->control,
+ GIMP_TOOL_CURSOR_RECT_SELECT);
+ gimp_tool_control_set_preserve (tool->control, FALSE);
+ gimp_tool_control_set_dirty_mask (tool->control,
+ GIMP_DIRTY_IMAGE_SIZE |
+ GIMP_DIRTY_SELECTION);
+
+ priv->undo = NULL;
+ priv->redo = NULL;
+
+ priv->press_x = 0.0;
+ priv->press_y = 0.0;
+}
+
+static void
+gimp_rectangle_select_tool_constructed (GObject *object)
+{
+ GimpRectangleSelectTool *rect_sel_tool;
+ GimpRectangleSelectOptions *options;
+ GimpRectangleSelectToolPrivate *priv;
+
+ G_OBJECT_CLASS (parent_class)->constructed (object);
+
+ gimp_rectangle_tool_constructor (object);
+
+ rect_sel_tool = GIMP_RECTANGLE_SELECT_TOOL (object);
+ options = GIMP_RECTANGLE_SELECT_TOOL_GET_OPTIONS (rect_sel_tool);
+ priv = GIMP_RECTANGLE_SELECT_TOOL_GET_PRIVATE (rect_sel_tool);
+
+ priv->round_corners = options->round_corners;
+ priv->corner_radius = options->corner_radius;
+
+ g_signal_connect_object (options, "notify::round-corners",
+ G_CALLBACK (gimp_rectangle_select_tool_round_corners_notify),
+ object, 0);
+ g_signal_connect_object (options, "notify::corner-radius",
+ G_CALLBACK (gimp_rectangle_select_tool_round_corners_notify),
+ object, 0);
+
+ gimp_rectangle_select_tool_update_option_defaults (rect_sel_tool, FALSE);
+}
+
+static void
+gimp_rectangle_select_tool_control (GimpTool *tool,
+ GimpToolAction action,
+ GimpDisplay *display)
+{
+ gimp_rectangle_tool_control (tool, action, display);
+
+ GIMP_TOOL_CLASS (parent_class)->control (tool, action, display);
+}
+
+static void
+gimp_rectangle_select_tool_draw (GimpDrawTool *draw_tool)
+{
+ GimpRectangleSelectTool *rect_sel_tool;
+ GimpRectangleSelectToolPrivate *priv;
+ GimpCanvasGroup *stroke_group = NULL;
+
+ rect_sel_tool = GIMP_RECTANGLE_SELECT_TOOL (draw_tool);
+ priv = GIMP_RECTANGLE_SELECT_TOOL_GET_PRIVATE (rect_sel_tool);
+
+ if (priv->round_corners)
+ {
+ GimpCanvasItem *item;
+ gint x1, y1, x2, y2;
+ gdouble radius;
+ gint square_size;
+
+ g_object_get (rect_sel_tool,
+ "x1", &x1,
+ "y1", &y1,
+ "x2", &x2,
+ "y2", &y2,
+ NULL);
+
+ radius = MIN (priv->corner_radius,
+ MIN ((x2 - x1) / 2.0, (y2 - y1) / 2.0));
+
+ square_size = (int) (radius * 2);
+
+ stroke_group =
+ GIMP_CANVAS_GROUP (gimp_draw_tool_add_stroke_group (draw_tool));
+
+ item = gimp_draw_tool_add_arc (draw_tool, FALSE,
+ x1, y1,
+ square_size, square_size,
+ G_PI / 2.0, G_PI / 2.0);
+ gimp_canvas_group_add_item (stroke_group, item);
+ gimp_draw_tool_remove_item (draw_tool, item);
+
+ item = gimp_draw_tool_add_arc (draw_tool, FALSE,
+ x2 - square_size, y1,
+ square_size, square_size,
+ 0.0, G_PI / 2.0);
+ gimp_canvas_group_add_item (stroke_group, item);
+ gimp_draw_tool_remove_item (draw_tool, item);
+
+ item = gimp_draw_tool_add_arc (draw_tool, FALSE,
+ x2 - square_size, y2 - square_size,
+ square_size, square_size,
+ G_PI * 1.5, G_PI / 2.0);
+ gimp_canvas_group_add_item (stroke_group, item);
+ gimp_draw_tool_remove_item (draw_tool, item);
+
+ item = gimp_draw_tool_add_arc (draw_tool, FALSE,
+ x1, y2 - square_size,
+ square_size, square_size,
+ G_PI, G_PI / 2.0);
+ gimp_canvas_group_add_item (stroke_group, item);
+ gimp_draw_tool_remove_item (draw_tool, item);
+ }
+
+ gimp_rectangle_tool_draw (draw_tool, stroke_group);
+}
+
+static void
+gimp_rectangle_select_tool_button_press (GimpTool *tool,
+ const GimpCoords *coords,
+ guint32 time,
+ GdkModifierType state,
+ GimpButtonPressType press_type,
+ GimpDisplay *display)
+{
+ GimpRectangleTool *rectangle;
+ GimpRectangleSelectTool *rect_sel_tool;
+ GimpDisplayShell *shell;
+ GimpRectangleSelectToolPrivate *priv;
+ GimpRectangleFunction function;
+
+ rectangle = GIMP_RECTANGLE_TOOL (tool);
+ rect_sel_tool = GIMP_RECTANGLE_SELECT_TOOL (tool);
+ shell = gimp_display_get_shell (display);
+ priv = GIMP_RECTANGLE_SELECT_TOOL_GET_PRIVATE (rect_sel_tool);
+
+ if (tool->display && display != tool->display)
+ {
+ gimp_rectangle_tool_cancel (GIMP_RECTANGLE_TOOL (tool));
+ }
+
+ if (gimp_selection_tool_start_edit (GIMP_SELECTION_TOOL (tool),
+ display, coords))
+ {
+ /* In some cases we want to finish the rectangle select tool
+ * and hand over responsibility to the selection tool
+ */
+ gimp_rectangle_tool_execute (rectangle);
+ gimp_rectangle_tool_control (tool, GIMP_TOOL_ACTION_HALT, display);
+ gimp_rectangle_select_tool_update_option_defaults (rect_sel_tool,
+ TRUE);
+ return;
+ }
+
+ gimp_tool_control_activate (tool->control);
+
+ priv->saved_show_selection = gimp_display_shell_get_show_selection (shell);
+
+ /* if the shift or ctrl keys are down, we don't want to adjust, we
+ * want to create a new rectangle, regardless of pointer loc */
+ if (state & (gimp_get_extend_selection_mask () |
+ gimp_get_modify_selection_mask ()))
+ {
+ gimp_rectangle_tool_set_function (rectangle,
+ GIMP_RECTANGLE_TOOL_CREATING);
+ }
+
+ gimp_rectangle_tool_button_press (tool, coords, time, state, display);
+
+ priv->press_x = coords->x;
+ priv->press_y = coords->y;
+
+ /* if we have an existing rectangle in the current display, then
+ * we have already "executed", and need to undo at this point,
+ * unless the user has done something in the meantime
+ */
+ function = gimp_rectangle_tool_get_function (rectangle);
+
+ if (function == GIMP_RECTANGLE_TOOL_CREATING)
+ {
+ priv->use_saved_op = FALSE;
+ }
+ else
+ {
+ GimpImage *image = gimp_display_get_image (tool->display);
+ GimpUndoStack *undo_stack = gimp_image_get_undo_stack (image);
+ GimpUndoStack *redo_stack = gimp_image_get_redo_stack (image);
+ GimpUndo *undo;
+ GimpChannelOps operation;
+
+ undo = gimp_undo_stack_peek (undo_stack);
+
+ if (undo && priv->undo == undo)
+ {
+ /* prevent this change from halting the tool */
+ gimp_tool_control_push_preserve (tool->control, TRUE);
+
+ gimp_image_undo (image);
+
+ gimp_tool_control_pop_preserve (tool->control);
+
+ /* we will need to redo if the user cancels or executes */
+ priv->redo = gimp_undo_stack_peek (redo_stack);
+ }
+
+ /* if the operation is "Replace", turn off the marching ants,
+ because they are confusing */
+ operation = gimp_rectangle_select_tool_get_operation (rect_sel_tool);
+
+ if (operation == GIMP_CHANNEL_OP_REPLACE)
+ gimp_display_shell_set_show_selection (shell, FALSE);
+ }
+
+ priv->undo = NULL;
+}
+
+static void
+gimp_rectangle_select_tool_button_release (GimpTool *tool,
+ const GimpCoords *coords,
+ guint32 time,
+ GdkModifierType state,
+ GimpButtonReleaseType release_type,
+ GimpDisplay *display)
+{
+ GimpRectangleSelectTool *rect_sel_tool;
+ GimpRectangleSelectToolPrivate *priv;
+ GimpImage *image;
+
+ rect_sel_tool = GIMP_RECTANGLE_SELECT_TOOL (tool);
+ priv = GIMP_RECTANGLE_SELECT_TOOL_GET_PRIVATE (rect_sel_tool);
+
+ image = gimp_display_get_image (tool->display);
+
+ gimp_tool_control_halt (tool->control);
+
+ gimp_tool_pop_status (tool, display);
+ gimp_display_shell_set_show_selection (gimp_display_get_shell (display),
+ priv->saved_show_selection);
+
+ /*
+ * if the user has not moved the mouse, we need to redo the operation
+ * that was undone on button press.
+ */
+ if (release_type == GIMP_BUTTON_RELEASE_CLICK)
+ {
+ GimpUndoStack *redo_stack = gimp_image_get_redo_stack (image);
+ GimpUndo *redo = gimp_undo_stack_peek (redo_stack);
+
+ if (redo && priv->redo == redo)
+ {
+ /* prevent this from halting the tool */
+ gimp_tool_control_push_preserve (tool->control, TRUE);
+
+ gimp_image_redo (image);
+ priv->redo = NULL;
+
+ gimp_tool_control_pop_preserve (tool->control);
+ }
+ }
+
+ gimp_rectangle_tool_button_release (tool, coords, time, state, release_type,
+ display);
+
+ if (release_type == GIMP_BUTTON_RELEASE_CANCEL)
+ {
+ if (priv->redo)
+ {
+ /* prevent this from halting the tool */
+ gimp_tool_control_push_preserve (tool->control, TRUE);
+
+ gimp_image_redo (image);
+
+ gimp_tool_control_pop_preserve (tool->control);
+ }
+
+ priv->use_saved_op = TRUE; /* is this correct? */
+ }
+
+ priv->redo = NULL;
+}
+
+static void
+gimp_rectangle_select_tool_active_modifier_key (GimpTool *tool,
+ GdkModifierType key,
+ gboolean press,
+ GdkModifierType state,
+ GimpDisplay *display)
+{
+ GIMP_TOOL_CLASS (parent_class)->active_modifier_key (tool, key, press, state,
+ display);
+
+ gimp_rectangle_tool_active_modifier_key (tool, key, press, state, display);
+}
+
+static gboolean
+gimp_rectangle_select_tool_key_press (GimpTool *tool,
+ GdkEventKey *kevent,
+ GimpDisplay *display)
+{
+ return (gimp_rectangle_tool_key_press (tool, kevent, display) ||
+ gimp_edit_selection_tool_key_press (tool, kevent, display));
+}
+
+static void
+gimp_rectangle_select_tool_oper_update (GimpTool *tool,
+ const GimpCoords *coords,
+ GdkModifierType state,
+ gboolean proximity,
+ GimpDisplay *display)
+{
+ gimp_rectangle_tool_oper_update (tool, coords, state, proximity, display);
+
+ GIMP_TOOL_CLASS (parent_class)->oper_update (tool, coords, state, proximity,
+ display);
+}
+
+static void
+gimp_rectangle_select_tool_cursor_update (GimpTool *tool,
+ const GimpCoords *coords,
+ GdkModifierType state,
+ GimpDisplay *display)
+{
+ gimp_rectangle_tool_cursor_update (tool, coords, state, display);
+
+ /* override the previous if shift or ctrl are down */
+ if (state & (gimp_get_extend_selection_mask () |
+ gimp_get_modify_selection_mask ()))
+ {
+ gimp_tool_control_set_cursor (tool->control,
+ GIMP_CURSOR_CROSSHAIR_SMALL);
+ }
+
+ GIMP_TOOL_CLASS (parent_class)->cursor_update (tool, coords, state, display);
+}
+
+
+static gboolean
+gimp_rectangle_select_tool_select (GimpRectangleTool *rectangle,
+ gint x,
+ gint y,
+ gint w,
+ gint h)
+{
+ GimpTool *tool;
+ GimpRectangleSelectTool *rect_sel_tool;
+ GimpImage *image;
+ gboolean rectangle_exists;
+ GimpChannelOps operation;
+
+ tool = GIMP_TOOL (rectangle);
+ rect_sel_tool = GIMP_RECTANGLE_SELECT_TOOL (rectangle);
+
+ image = gimp_display_get_image (tool->display);
+
+ gimp_tool_pop_status (tool, tool->display);
+
+ rectangle_exists = (x <= gimp_image_get_width (image) &&
+ y <= gimp_image_get_height (image) &&
+ x + w >= 0 &&
+ y + h >= 0 &&
+ w > 0 &&
+ h > 0);
+
+ operation = gimp_rectangle_select_tool_get_operation (rect_sel_tool);
+
+ /* if rectangle exists, turn it into a selection */
+ if (rectangle_exists)
+ GIMP_RECTANGLE_SELECT_TOOL_GET_CLASS (rect_sel_tool)->select (rect_sel_tool,
+ operation,
+ x, y, w, h);
+
+ return rectangle_exists;
+}
+
+static void
+gimp_select_by_shape_tool_select (GimpRectangleSelectTool *rect_tool,
+ GimpChannelOps operation,
+ gint x,
+ gint y,
+ gint w,
+ gint h)
+{
+ GimpTool *tool = GIMP_TOOL (rect_tool);
+ GimpSelectionOptions *options = GIMP_SELECTION_TOOL_GET_OPTIONS (rect_tool);
+ GimpRectangleSelectOptions *sel_options = GIMP_RECTANGLE_SELECT_TOOL_GET_OPTIONS (tool);
+ GimpChannel *channel;
+ GimpImage *image;
+
+ channel = gimp_image_get_mask (gimp_display_get_image (tool->display));
+ image = gimp_display_get_image (tool->display);
+
+ switch(sel_options->shape_type)
+ {
+ case GIMP_SHAPE_RECTANGLE :
+ gimp_channel_select_rectangle (channel,
+ x, y, w, h,
+ operation,
+ options->feather,
+ options->feather_radius,
+ options->feather_radius,
+ TRUE);
+ break;
+
+ case GIMP_SHAPE_ELLIPSE :
+ gimp_channel_select_ellipse (channel,
+ x, y, w, h,
+ operation,
+ options->antialias,
+ options->feather,
+ options->feather_radius,
+ options->feather_radius,
+ TRUE);
+ break;
+
+ case GIMP_SHAPE_ROUNDED_RECT :
+ {
+ gdouble max = MIN (w / 2.0, h / 2.0);
+ //gdouble radius = MIN (sel_options->corner_radius, max);
+ gdouble radius = sel_options->corner_radius*max/100;
+
+ gimp_channel_select_round_rect (channel,
+ x, y, w, h,
+ radius,
+ radius,
+ operation,
+ options->antialias,
+ options->feather,
+ options->feather_radius,
+ options->feather_radius,
+ TRUE);
+ break;
+ }
+
+ /*case GIMP_SHAPE_SINGLE_ROW :
+ {
+ gdouble w1 = gimp_image_get_width (image);
+ gdouble h1 = gimp_image_get_height (image);
+
+ switch(sel_options->line_orientation)
+ {
+ case GIMP_ORIENTATION_HORIZONTAL :
+ gimp_channel_select_rectangle (channel,
+ 0, y, h1, 1,
+ operation,
+ options->feather,
+ options->feather_radius,
+ options->feather_radius,
+ TRUE);
+ break;
+
+ case GIMP_ORIENTATION_VERTICAL :
+ gimp_channel_select_rectangle (channel,
+ x, 0, 1, w1,
+ operation,
+ options->feather,
+ options->feather_radius,
+ options->feather_radius,
+ TRUE);
+ break;
+
+ case GIMP_ORIENTATION_UNKNOWN :
+ gimp_channel_select_rectangle (channel,
+ x, y, 1, 1,
+ operation,
+ options->feather,
+ options->feather_radius,
+ options->feather_radius,
+ TRUE);
+ break;
+ }
+
+ break;
+ }*/
+
+ case GIMP_SHAPE_N_POLYGON :
+ {
+ gimp_channel_select_ellipse (channel,
+ x, y, w, h,
+ operation,
+ options->antialias,
+ options->feather,
+ options->feather_radius,
+ options->feather_radius,
+ TRUE);
+ break;
+ }
+
+ }
+}
+
+static GimpChannelOps
+gimp_rectangle_select_tool_get_operation (GimpRectangleSelectTool *rect_sel_tool)
+{
+ GimpRectangleSelectToolPrivate *priv;
+ GimpSelectionOptions *options;
+
+ priv = GIMP_RECTANGLE_SELECT_TOOL_GET_PRIVATE (rect_sel_tool);
+ options = GIMP_SELECTION_TOOL_GET_OPTIONS (rect_sel_tool);
+
+ if (priv->use_saved_op)
+ return priv->operation;
+ else
+ return options->operation;
+}
+
+/**
+ * gimp_rectangle_select_tool_update_option_defaults:
+ * @crop_tool:
+ * @ignore_pending: %TRUE to ignore any pending crop rectangle.
+ *
+ * Sets the default Fixed: Aspect ratio and Fixed: Size option
+ * properties.
+ */
+static void
+gimp_rectangle_select_tool_update_option_defaults (GimpRectangleSelectTool *rect_sel_tool,
+ gboolean ignore_pending)
+{
+ GimpTool *tool;
+ GimpRectangleTool *rectangle_tool;
+ GimpRectangleOptions *rectangle_options;
+
+ tool = GIMP_TOOL (rect_sel_tool);
+ rectangle_tool = GIMP_RECTANGLE_TOOL (tool);
+ rectangle_options = GIMP_RECTANGLE_TOOL_GET_OPTIONS (rectangle_tool);
+
+ if (tool->display != NULL && !ignore_pending)
+ {
+ /* There is a pending rectangle and we should not ignore it, so
+ * set default Fixed: Size to the same as the current pending
+ * rectangle width/height.
+ */
+
+ gimp_rectangle_tool_pending_size_set (rectangle_tool,
+ G_OBJECT (rectangle_options),
+ "default-aspect-numerator",
+ "default-aspect-denominator");
+
+ g_object_set (G_OBJECT (rectangle_options),
+ "use-string-current", TRUE,
+ NULL);
+ }
+ else
+ {
+ g_object_set (G_OBJECT (rectangle_options),
+ "default-aspect-numerator", 1.0,
+ "default-aspect-denominator", 1.0,
+ NULL);
+
+ g_object_set (G_OBJECT (rectangle_options),
+ "use-string-current", FALSE,
+ NULL);
+ }
+}
+
+/*
+ * This function is called if the user clicks and releases the left
+ * button without moving it. There are the things we might want
+ * to do here:
+ * 1) If there is an existing rectangle and we are inside it, we
+ * convert it into a selection.
+ * 2) If there is an existing rectangle and we are outside it, we
+ * clear it.
+ * 3) If there is no rectangle and there is a floating selection,
+ * we anchor it.
+ * 4) If there is no rectangle and we are inside the selection, we
+ * create a rectangle from the selection bounds.
+ * 5) If there is no rectangle and we are outside the selection,
+ * we clear the selection.
+ */
+static gboolean
+gimp_rectangle_select_tool_execute (GimpRectangleTool *rectangle,
+ gint x,
+ gint y,
+ gint w,
+ gint h)
+{
+ GimpTool *tool = GIMP_TOOL (rectangle);
+ GimpRectangleSelectTool *rect_sel_tool;
+ GimpRectangleSelectToolPrivate *priv;
+
+ rect_sel_tool = GIMP_RECTANGLE_SELECT_TOOL (rectangle);
+ priv = GIMP_RECTANGLE_SELECT_TOOL_GET_PRIVATE (rect_sel_tool);
+
+ if (w == 0 && h == 0 && tool->display != NULL)
+ {
+ GimpImage *image = gimp_display_get_image (tool->display);
+ GimpChannel *selection = gimp_image_get_mask (image);
+ gint pressx;
+ gint pressy;
+
+ if (gimp_image_get_floating_selection (image))
+ {
+ floating_sel_anchor (gimp_image_get_floating_selection (image));
+ gimp_image_flush (image);
+ return TRUE;
+ }
+
+ pressx = ROUND (priv->press_x);
+ pressy = ROUND (priv->press_y);
+
+ /* if the click was inside the marching ants */
+ if (gimp_pickable_get_opacity_at (GIMP_PICKABLE (selection),
+ pressx, pressy) > 0.5)
+ {
+ gint x1, y1, x2, y2;
+
+ if (gimp_channel_bounds (selection, &x1, &y1, &x2, &y2))
+ {
+ g_object_set (rectangle,
+ "x1", x1,
+ "y1", y1,
+ "x2", x2,
+ "y2", y2,
+ NULL);
+ }
+
+ gimp_rectangle_tool_set_function (rectangle,
+ GIMP_RECTANGLE_TOOL_MOVING);
+ gimp_rectangle_select_tool_update_option_defaults (rect_sel_tool,
+ FALSE);
+
+ return FALSE;
+ }
+ else
+ {
+ GimpTool *tool = GIMP_TOOL (rectangle);
+ GimpChannelOps operation;
+
+ /* prevent this change from halting the tool */
+ gimp_tool_control_push_preserve (tool->control, TRUE);
+
+ /* We can conceptually think of a click outside of the
+ * selection as adding a 0px selection. Behave intuitivly
+ * for the current selection mode
+ */
+ operation = gimp_rectangle_select_tool_get_operation (rect_sel_tool);
+ switch (operation)
+ {
+ case GIMP_CHANNEL_OP_REPLACE:
+ case GIMP_CHANNEL_OP_INTERSECT:
+ gimp_channel_clear (selection, NULL, TRUE);
+ gimp_image_flush (image);
+ break;
+
+ case GIMP_CHANNEL_OP_ADD:
+ case GIMP_CHANNEL_OP_SUBTRACT:
+ default:
+ /* Do nothing */
+ break;
+ }
+
+ gimp_tool_control_pop_preserve (tool->control);
+ }
+ }
+
+ gimp_rectangle_select_tool_update_option_defaults (rect_sel_tool, FALSE);
+
+ /* Reset the automatic undo/redo mechanism */
+ priv->undo = NULL;
+ priv->redo = NULL;
+
+ return TRUE;
+}
+
+static void
+gimp_rectangle_select_tool_cancel (GimpRectangleTool *rectangle)
+{
+ GimpTool *tool;
+ GimpRectangleSelectTool *rect_sel_tool;
+ GimpRectangleSelectToolPrivate *priv;
+
+ tool = GIMP_TOOL (rectangle);
+ rect_sel_tool = GIMP_RECTANGLE_SELECT_TOOL (rectangle);
+ priv = GIMP_RECTANGLE_SELECT_TOOL_GET_PRIVATE (rect_sel_tool);
+
+ if (tool->display)
+ {
+ GimpImage *image = gimp_display_get_image (tool->display);
+ GimpUndoStack *undo_stack = gimp_image_get_undo_stack (image);
+ GimpUndo *undo = gimp_undo_stack_peek (undo_stack);
+
+ /* if we have an existing rectangle in the current display, then
+ * we have already "executed", and need to undo at this point,
+ * unless the user has done something in the meantime
+ */
+ if (undo && priv->undo == undo)
+ {
+ /* prevent this change from halting the tool */
+ gimp_tool_control_push_preserve (tool->control, TRUE);
+
+ gimp_image_undo (image);
+ gimp_image_flush (image);
+
+ gimp_tool_control_pop_preserve (tool->control);
+ }
+ }
+
+ gimp_rectangle_select_tool_update_option_defaults (rect_sel_tool, TRUE);
+
+ priv->undo = NULL;
+ priv->redo = NULL;
+}
+
+static gboolean
+gimp_rectangle_select_tool_rectangle_change_complete (GimpRectangleTool *rectangle)
+{
+ GimpTool *tool;
+ GimpRectangleSelectTool *rect_sel_tool;
+ GimpRectangleSelectToolPrivate *priv;
+
+ tool = GIMP_TOOL (rectangle);
+ rect_sel_tool = GIMP_RECTANGLE_SELECT_TOOL (tool);
+ priv = GIMP_RECTANGLE_SELECT_TOOL_GET_PRIVATE (rect_sel_tool);
+
+ /* prevent change in selection from halting the tool */
+ gimp_tool_control_push_preserve (tool->control, TRUE);
+
+ if (tool->display && ! gimp_tool_control_is_active (tool->control))
+ {
+ GimpImage *image = gimp_display_get_image (tool->display);
+ GimpUndoStack *undo_stack = gimp_image_get_undo_stack (image);
+ GimpUndo *undo = gimp_undo_stack_peek (undo_stack);
+ gint x1, y1, x2, y2;
+
+ /* if we got here via button release, we have already undone the
+ * previous operation. But if we got here by some other means,
+ * we need to undo it now.
+ */
+ if (undo && priv->undo == undo)
+ {
+ gimp_image_undo (image);
+ priv->undo = NULL;
+ }
+
+ g_object_get (rectangle,
+ "x1", &x1,
+ "y1", &y1,
+ "x2", &x2,
+ "y2", &y2,
+ NULL);
+
+ if (gimp_rectangle_select_tool_select (rectangle, x1, y1, x2 - x1, y2 - y1))
+ {
+ /* save the undo that we got when executing, but only if
+ * we actually selected something
+ */
+ priv->undo = gimp_undo_stack_peek (undo_stack);
+ priv->redo = NULL;
+ }
+
+ if (! priv->use_saved_op)
+ {
+ GimpSelectionOptions *options;
+
+ options = GIMP_SELECTION_TOOL_GET_OPTIONS (tool);
+
+ /* remember the operation now in case we modify the rectangle */
+ priv->operation = options->operation;
+ priv->use_saved_op = TRUE;
+ }
+
+ gimp_image_flush (image);
+ }
+
+ gimp_tool_control_pop_preserve (tool->control);
+
+ gimp_rectangle_select_tool_update_option_defaults (rect_sel_tool, FALSE);
+
+ return TRUE;
+}
+
+static void
+gimp_rectangle_select_tool_round_corners_notify (GimpRectangleSelectOptions *options,
+ GParamSpec *pspec,
+ GimpRectangleSelectTool *rect_sel_tool)
+{
+ GimpDrawTool *draw_tool = GIMP_DRAW_TOOL (rect_sel_tool);
+ GimpRectangleTool *rect_tool = GIMP_RECTANGLE_TOOL (rect_sel_tool);
+ GimpRectangleSelectToolPrivate *priv;
+
+ priv = GIMP_RECTANGLE_SELECT_TOOL_GET_PRIVATE (rect_sel_tool);
+
+ gimp_draw_tool_pause (draw_tool);
+
+ priv->round_corners = options->round_corners;
+ priv->corner_radius = options->corner_radius;
+
+ gimp_rectangle_select_tool_rectangle_change_complete (rect_tool);
+
+ gimp_draw_tool_resume (draw_tool);
+}
+
+-------------------------------------------------------------------------------------------------------------------------------------------
+
+static void gimp_select_by_shape_tool_draw (GimpDrawTool *draw_tool);
+
+static void gimp_select_by_shape_tool_select (GimpRectangleSelectTool *rect_tool,
+ GimpChannelOps operation,
+ gint x,
+ gint y,
+ gint w,
+ gint h);
+
+
+G_DEFINE_TYPE (GimpSelectByShapeTool, gimp_select_by_shape_tool,
+ GIMP_TYPE_RECTANGLE_SELECT_TOOL)
+
+#define parent_class gimp_select_by_shape_tool_parent_class
+
+
+
+
+static void
+gimp_select_by_shape_tool_class_init (GimpSelectByShapeToolClass *klass)
+{
+ GimpDrawToolClass *draw_tool_class = GIMP_DRAW_TOOL_CLASS (klass);
+ GimpRectangleSelectToolClass *rect_tool_class = GIMP_RECTANGLE_SELECT_TOOL_CLASS (klass);
+
+ draw_tool_class->draw = gimp_select_by_shape_tool_draw;
+
+ rect_tool_class->select = gimp_select_by_shape_tool_select;
+}
+
+static void
+gimp_select_by_shape_tool_init (GimpSelectByShapeTool *select_by_shape)
+{
+ GimpTool *tool = GIMP_TOOL (select_by_shape);
+
+ gimp_tool_control_set_tool_cursor (tool->control,
+ GIMP_TOOL_CURSOR_ELLIPSE_SELECT);
+ //Need to add new Cursors :'(
+}
+
+static void
+gimp_select_by_shape_tool_draw (GimpDrawTool *draw_tool)
+{
+ GimpCanvasGroup *stroke_group = NULL;
+
+ /*GimpSelectByShapeTool *rect_sel_tool;
+ GimpSelectByShape *priv;
+ GimpCanvasGroup *stroke_group = NULL;
+
+ gint x1, y1, x2, y2;
+
+ GIMP_DRAW_TOOL_CLASS (parent_class)->draw (draw_tool);
+
+ shp_sel_tool = GIMP_SELECT_BY_SHAPE_TOOL (draw_tool);
+ priv = GIMP_SELECT_BY_SHAPE_TOOL_GET (shp_sel_tool);
+
+ switch(priv->shape_type)
+ {
+ case GIMP_SHAPE_RECTANGLE :
+ gimp_rectangle_tool_draw (draw_tool, stroke_group);
+ break;
+
+ case GIMP_SHAPE_ELLIPSE :
+ {
+ g_object_get (draw_tool,
+ "x1", &x1,
+ "y1", &y1,
+ "x2", &x2,
+ "y2", &y2,
+ NULL);
+
+ gimp_draw_tool_add_arc (draw_tool,
+ FALSE,
+ x1, y1,
+ x2 - x1, y2 - y1,
+ 0.0, 2 * G_PI);
+ break;
+ }
+
+ case GIMP_SHAPE_ROUNDED_RECT :
+ {
+ GimpCanvasItem *item;
+ gint x1, y1, x2, y2;
+ gdouble radius;
+ gint square_size;
+
+ g_object_get (rect_sel_tool,
+ "x1", &x1,
+ "y1", &y1,
+ "x2", &x2,
+ "y2", &y2,
+ NULL);
+
+ radius = MIN (priv->corner_radius,
+ MIN ((x2 - x1) / 2.0, (y2 - y1) / 2.0));
+
+ square_size = (int) (radius * 2);
+
+ stroke_group =
+ GIMP_CANVAS_GROUP (gimp_draw_tool_add_stroke_group (draw_tool));
+
+ item = gimp_draw_tool_add_arc (draw_tool, FALSE,
+ x1, y1,
+ square_size, square_size,
+ G_PI / 2.0, G_PI / 2.0);
+ gimp_canvas_group_add_item (stroke_group, item);
+ gimp_draw_tool_remove_item (draw_tool, item);
+
+ item = gimp_draw_tool_add_arc (draw_tool, FALSE,
+ x2 - square_size, y1,
+ square_size, square_size,
+ 0.0, G_PI / 2.0);
+ gimp_canvas_group_add_item (stroke_group, item);
+ gimp_draw_tool_remove_item (draw_tool, item);
+
+ item = gimp_draw_tool_add_arc (draw_tool, FALSE,
+ x2 - square_size, y2 - square_size,
+ square_size, square_size,
+ G_PI * 1.5, G_PI / 2.0);
+ gimp_canvas_group_add_item (stroke_group, item);
+ gimp_draw_tool_remove_item (draw_tool, item);
+
+ item = gimp_draw_tool_add_arc (draw_tool, FALSE,
+ x1, y2 - square_size,
+ square_size, square_size,
+ G_PI, G_PI / 2.0);
+ gimp_canvas_group_add_item (stroke_group, item);
+ gimp_draw_tool_remove_item (draw_tool, item);
+ break;
+ }
+ default
+ {
+ gimp_rectangle_tool_draw (draw_tool, stroke_group);
+ break;
+ }
+ }*/
+ gimp_rectangle_tool_draw (draw_tool, stroke_group);
+}
+
+
+
+
+/*static void
+gimp_select_by_shape_tool_select (GimpRectangleSelectTool *rect_tool,
+ GimpChannelOps operation,
+ gint x,
+ gint y,
+ gint w,
+ gint h)
+{
+ GimpTool *tool = GIMP_TOOL (rect_tool);
+ GimpSelectionOptions *options = GIMP_SELECTION_TOOL_GET_OPTIONS (rect_tool);
+ GimpRectangleSelectOptions *sel_options = GIMP_RECTANGLE_SELECT_TOOL_GET_OPTIONS (tool);
+ GimpChannel *channel;
+ GimpImage *image;
+
+ channel = gimp_image_get_mask (gimp_display_get_image (tool->display));
+ image = gimp_display_get_image (tool->display);
+
+ switch(sel_options->shape_type)
+ {
+ case GIMP_SHAPE_RECTANGLE :
+ gimp_channel_select_rectangle (channel,
+ x, y, w, h,
+ operation,
+ options->feather,
+ options->feather_radius,
+ options->feather_radius,
+ TRUE);
+ break;
+
+ case GIMP_SHAPE_ELLIPSE :
+ gimp_channel_select_ellipse (channel,
+ x, y, w, h,
+ operation,
+ options->antialias,
+ options->feather,
+ options->feather_radius,
+ options->feather_radius,
+ TRUE);
+ break;
+
+ case GIMP_SHAPE_ROUNDED_RECT :
+ {
+ gdouble max = MIN (w / 2.0, h / 2.0);
+ //gdouble radius = MIN (sel_options->corner_radius, max);
+ gdouble radius = sel_options->corner_radius*max/100;
+
+ gimp_channel_select_round_rect (channel,
+ x, y, w, h,
+ radius,
+ radius,
+ operation,
+ options->antialias,
+ options->feather,
+ options->feather_radius,
+ options->feather_radius,
+ TRUE);
+ break;
+ }
+
+ case GIMP_SHAPE_SINGLE_ROW :
+ {
+ gdouble w1 = gimp_image_get_width (image);
+ gdouble h1 = gimp_image_get_height (image);
+
+ switch(sel_options->line_orientation)
+ {
+ case GIMP_ORIENTATION_HORIZONTAL :
+ gimp_channel_select_rectangle (channel,
+ 0, y, h1, 1,
+ operation,
+ options->feather,
+ options->feather_radius,
+ options->feather_radius,
+ TRUE);
+ break;
+
+ case GIMP_ORIENTATION_VERTICAL :
+ gimp_channel_select_rectangle (channel,
+ x, 0, 1, w1,
+ operation,
+ options->feather,
+ options->feather_radius,
+ options->feather_radius,
+ TRUE);
+ break;
+
+ case GIMP_ORIENTATION_UNKNOWN :
+ gimp_channel_select_rectangle (channel,
+ x, y, 1, 1,
+ operation,
+ options->feather,
+ options->feather_radius,
+ options->feather_radius,
+ TRUE);
+ break;
+ }
+
+ break;
+ }
+
+ case GIMP_SHAPE_N_POLYGON :
+ {
+ gimp_channel_select_ellipse (channel,
+ x, y, w, h,
+ operation,
+ options->antialias,
+ options->feather,
+ options->feather_radius,
+ options->feather_radius,
+ TRUE);
+ break;
+ }
+
+ }
+}
+*/
\ No newline at end of file
diff --git a/app/tools/gimpselectbyshapetool[Error].h b/app/tools/gimpselectbyshapetool[Error].h
new file mode 100644
index 0000000..42ab33f
--- /dev/null
+++ b/app/tools/gimpselectbyshapetool[Error].h
@@ -0,0 +1,64 @@
+/* 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/>.
+ */
+
+#ifndef __GIMP_SELECT_BY_SHAPE_TOOL_H__
+#define __GIMP_SELECT_BY_SHAPE_TOOL_H__
+
+
+#include "gimpselectiontool.h"
+
+
+#define GIMP_TYPE_SELECT_BY_SHAPE_TOOL (gimp_select_by_shape_tool_get_type ())
+#define GIMP_SELECT_BY_SHAPE_TOOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),
GIMP_TYPE_SELECT_BY_SHAPE_TOOL, GimpSelectByShapeTool))
+#define GIMP_SELECT_BY_SHAPE_TOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass),
GIMP_TYPE_SELECT_BY_SHAPE_TOOL, GimpSelectByShapeToolClass))
+#define GIMP_IS_SELECT_BY_SHAPE_TOOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj),
GIMP_TYPE_SELECT_BY_SHAPE_TOOL))
+#define GIMP_IS_SELECT_BY_SHAPE_TOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),
GIMP_TYPE_SELECT_BY_SHAPE_TOOL))
+#define GIMP_SELECT_BY_SHAPE_TOOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),
GIMP_TYPE_SELECT_BY_SHAPE_TOOL, GimpSelectByShapeToolClass))
+
+#define GIMP_RECTANGLE_SELECT_TOOL_GET_OPTIONS(t) (GIMP_RECTANGLE_SELECT_OPTIONS (gimp_tool_get_options
(GIMP_TOOL (t))))
+
+
+typedef struct _GimpSelectByShapeTool GimpSelectByShapeTool;
+typedef struct _GimpSelectByShapeToolClass GimpSelectByShapeToolClass;
+
+struct _GimpSelectByShapeTool
+{
+ GimpSelectionTool parent_instance;
+
+ gpointer priv;
+};
+
+struct _GimpSelectByShapeToolClass
+{
+ GimpSelectionToolClass parent_class;
+
+ void (* select) (GimpSelectByShapeTool *rect_select,
+ GimpChannelOps operation,
+ gint x,
+ gint y,
+ gint w,
+ gint h);
+};
+
+
+void gimp_select_by_shape_tool_register (GimpToolRegisterCallback callback,
+ gpointer data);
+
+GType gimp_select_by_shape_tool_get_type (void) G_GNUC_CONST;
+
+
+#endif /* __GIMP_SELECT_BY_SHAPE_TOOL_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]