gimp r24753 - in trunk: . app/tools app/widgets libgimpwidgets menus themes/Default/images themes/Default/images/tools



Author: martinn
Date: Wed Jan 30 20:33:58 2008
New Revision: 24753
URL: http://svn.gnome.org/viewvc/gimp?rev=24753&view=rev

Log:
2008-01-30  Martin Nordholts  <martinn svn gnome org>

	Added a Polygon Select Tool which is a primitive selection tool
	based on Free Hand Select. Code filtered through David Gowers who
	also made the tool icon. This version of the tool is a for-now
	solution to bug #119646.

	* app/tools/gimppolygonselecttool.[ch]: The new tool.

	* app/tools/gimp-tools.c: Add the tool.

	* app/tools/Makefile.am: Add tool source.

	* app/widgets/gimphelp-ids.h: Add help id for the tool.

	* libgimpwidgets/gimpstock.[ch]: Setup for the new tool icon.

	* menus/image-menu.xml.in: Add action entry for the tool.

	* themes/Default/images/tools/stock-tool-polygon-select-{16,24}.png:
	Tool icon graphics.

	* themes/Default/images/Makefile.am: Add tool icon graphics.


Added:
   trunk/app/tools/gimppolygonselecttool.c
   trunk/app/tools/gimppolygonselecttool.h
   trunk/themes/Default/images/tools/stock-tool-polygon-select-16.png   (contents, props changed)
   trunk/themes/Default/images/tools/stock-tool-polygon-select-22.png   (contents, props changed)
Modified:
   trunk/ChangeLog
   trunk/app/tools/Makefile.am
   trunk/app/tools/gimp-tools.c
   trunk/app/widgets/gimphelp-ids.h
   trunk/libgimpwidgets/gimpstock.c
   trunk/libgimpwidgets/gimpstock.h
   trunk/menus/image-menu.xml.in
   trunk/themes/Default/images/Makefile.am

Modified: trunk/app/tools/Makefile.am
==============================================================================
--- trunk/app/tools/Makefile.am	(original)
+++ trunk/app/tools/Makefile.am	Wed Jan 30 20:33:58 2008
@@ -120,6 +120,8 @@
 	gimpperspectiveclonetool.h	\
 	gimpperspectivetool.c		\
 	gimpperspectivetool.h		\
+	gimppolygonselecttool.c		\
+	gimppolygonselecttool.h		\
 	gimpposterizetool.c		\
 	gimpposterizetool.h		\
 	gimprectangleselecttool.c	\

Modified: trunk/app/tools/gimp-tools.c
==============================================================================
--- trunk/app/tools/gimp-tools.c	(original)
+++ trunk/app/tools/gimp-tools.c	Wed Jan 30 20:33:58 2008
@@ -69,6 +69,7 @@
 #include "gimppenciltool.h"
 #include "gimpperspectiveclonetool.h"
 #include "gimpperspectivetool.h"
+#include "gimppolygonselecttool.h"
 #include "gimpposterizetool.h"
 #include "gimpthresholdtool.h"
 #include "gimprectangleselecttool.h"
@@ -167,6 +168,7 @@
     gimp_iscissors_tool_register,
     gimp_by_color_select_tool_register,
     gimp_fuzzy_select_tool_register,
+    gimp_polygon_select_tool_register,
     gimp_free_select_tool_register,
     gimp_ellipse_select_tool_register,
     gimp_rect_select_tool_register

Added: trunk/app/tools/gimppolygonselecttool.c
==============================================================================
--- (empty file)
+++ trunk/app/tools/gimppolygonselecttool.c	Wed Jan 30 20:33:58 2008
@@ -0,0 +1,615 @@
+/* GIMP - The GNU Image Manipulation Program
+ *
+ * A polygonal selection tool for GIMP
+ * Copyright (C) 2007 Martin Nordholts
+ *
+ * Based on gimpfreeselecttool.c which is
+ * 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 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 <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+
+#include "libgimpmath/gimpmath.h"
+#include "libgimpwidgets/gimpwidgets.h"
+
+#include "tools-types.h"
+
+#include "core/gimpchannel.h"
+#include "core/gimpchannel-select.h"
+#include "core/gimpimage.h"
+#include "core/gimplayer-floating-sel.h"
+
+#include "widgets/gimphelp-ids.h"
+
+#include "display/gimpdisplay.h"
+
+#include "gimppolygonselecttool.h"
+#include "gimpselectionoptions.h"
+#include "gimptoolcontrol.h"
+
+#include "gimp-intl.h"
+
+
+#define DEFAULT_MAX_INC         1024
+
+#define POINT_GRAB_THRESHOLD_SQ 100
+
+
+struct _GimpPolygonSelectToolPrivate
+{
+  /* Point which is part of he polygon already. */
+  GimpVector2       *grabbed_point;
+
+  /* Save the grabbed point state so we can cancel a movement
+   * operation.
+   */
+  GimpVector2        saved_grabbed_point;
+
+  /* Point which is used to draw the polygon but which is not part of
+   * it yet.
+   */
+  GimpVector2        pending_point;
+  gboolean           show_pending_point;
+
+  /* The points of the polygon. */
+  GimpVector2       *points;
+
+  /* The number of points used for the actual selection. */
+  gint               num_points;
+
+  gint               max_segs;
+};
+
+
+static void         gimp_polygon_select_tool_finalize       (GObject               *object);
+static void         gimp_polygon_select_tool_control        (GimpTool              *tool,
+                                                             GimpToolAction         action,
+                                                             GimpDisplay           *display);
+static void         gimp_polygon_select_tool_oper_update    (GimpTool              *tool,
+                                                             GimpCoords            *coords,
+                                                             GdkModifierType        state,
+                                                             gboolean               proximity,
+                                                             GimpDisplay           *display);
+static void         gimp_polygon_select_tool_button_press   (GimpTool              *tool,
+                                                             GimpCoords            *coords,
+                                                             guint32                time,
+                                                             GdkModifierType        state,
+                                                             GimpDisplay           *display);
+static void         gimp_polygon_select_tool_motion         (GimpTool              *tool,
+                                                             GimpCoords            *coords,
+                                                             guint32                time,
+                                                             GdkModifierType        state,
+                                                             GimpDisplay           *display);
+static void         gimp_polygon_select_tool_button_release (GimpTool              *tool,
+                                                             GimpCoords            *coords,
+                                                             guint32                time,
+                                                             GdkModifierType        state,
+                                                             GimpButtonReleaseType  release_type,
+                                                             GimpDisplay           *display);
+static gboolean     gimp_polygon_select_tool_key_press      (GimpTool              *tool,
+                                                             GdkEventKey           *kevent,
+                                                             GimpDisplay           *display);
+
+static void         gimp_polygon_select_tool_start          (GimpPolygonSelectTool    *poly_sel_tool,
+                                                             GimpDisplay              *display);
+static void         gimp_polygon_select_tool_commit         (GimpPolygonSelectTool    *poly_sel_tool,
+                                                             GimpDisplay              *display);
+static void         gimp_polygon_select_tool_halt           (GimpPolygonSelectTool    *poly_sel_tool);
+
+static void         gimp_polygon_select_tool_draw           (GimpDrawTool          *draw_tool);
+
+static void         gimp_polygon_select_tool_real_select    (GimpPolygonSelectTool    *poly_sel_tool,
+                                                             GimpDisplay           *display);
+
+static GimpVector2 *gimp_polygon_select_tool_add_point      (GimpPolygonSelectTool    *poly_sel_tool,
+                                                             gdouble                x,
+                                                             gdouble                y);
+static void         gimp_polygon_select_tool_remove_last    (GimpPolygonSelectTool    *poly_sel_tool);
+static void         gimp_polygon_select_tool_select_closet_point
+                                                         (GimpPolygonSelectTool    *poly_sel_tool,
+                                                          GimpDisplay              *display,
+                                                          GimpCoords               *coords);
+static gboolean     gimp_polygon_select_tool_should_close   (GimpPolygonSelectTool    *poly_sel_tool,
+                                                             GimpDisplay              *display,
+                                                             GimpCoords               *coords);
+
+
+G_DEFINE_TYPE (GimpPolygonSelectTool, gimp_polygon_select_tool,
+               GIMP_TYPE_SELECTION_TOOL);
+
+
+
+#define parent_class gimp_polygon_select_tool_parent_class
+
+
+void
+gimp_polygon_select_tool_register (GimpToolRegisterCallback  callback,
+                                gpointer                  data)
+{
+  (* callback) (GIMP_TYPE_POLYGON_SELECT_TOOL,
+                GIMP_TYPE_SELECTION_OPTIONS,
+                gimp_selection_options_gui,
+                0,
+                "gimp-polygon-select-tool",
+                _("Polygon Select"),
+                _("Polygon Select Tool: Select a hand-drawn polygon"),
+                N_("_Polygon Select"), "G",
+                NULL, GIMP_HELP_TOOL_POLYGON_SELECT,
+                GIMP_STOCK_TOOL_POLYGON_SELECT,
+                data);
+}
+
+static void
+gimp_polygon_select_tool_class_init (GimpPolygonSelectToolClass *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 (GimpPolygonSelectToolPrivate));
+
+  object_class->finalize     = gimp_polygon_select_tool_finalize;
+
+  tool_class->control        = gimp_polygon_select_tool_control;
+  tool_class->oper_update    = gimp_polygon_select_tool_oper_update;
+  tool_class->button_press   = gimp_polygon_select_tool_button_press;
+  tool_class->motion         = gimp_polygon_select_tool_motion;
+  tool_class->button_release = gimp_polygon_select_tool_button_release;
+  tool_class->key_press      = gimp_polygon_select_tool_key_press;
+
+  draw_tool_class->draw      = gimp_polygon_select_tool_draw;
+
+  klass->select              = gimp_polygon_select_tool_real_select;
+}
+
+static void
+gimp_polygon_select_tool_init (GimpPolygonSelectTool *poly_sel_tool)
+{
+  GimpTool *tool = GIMP_TOOL (poly_sel_tool);
+
+  poly_sel_tool->priv = G_TYPE_INSTANCE_GET_PRIVATE (poly_sel_tool,
+                                                     GIMP_TYPE_POLYGON_SELECT_TOOL,
+                                                     GimpPolygonSelectToolPrivate);
+
+  gimp_tool_control_set_scroll_lock (tool->control, FALSE);
+  gimp_tool_control_set_wants_click (tool->control, TRUE);
+  gimp_tool_control_set_tool_cursor (tool->control,
+                                     GIMP_TOOL_CURSOR_FREE_SELECT);
+
+  poly_sel_tool->priv->points   = NULL;
+  poly_sel_tool->priv->max_segs = 0;
+}
+
+static void
+gimp_polygon_select_tool_finalize (GObject *object)
+{
+  GimpPolygonSelectTool *poly_sel_tool = GIMP_POLYGON_SELECT_TOOL (object);
+
+  if (poly_sel_tool->priv->points)
+    {
+      g_free (poly_sel_tool->priv->points);
+      poly_sel_tool->priv->points = NULL;
+    }
+
+  G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gimp_polygon_select_tool_control (GimpTool       *tool,
+                               GimpToolAction  action,
+                               GimpDisplay    *display)
+{
+  switch (action)
+    {
+    case GIMP_TOOL_ACTION_PAUSE:
+    case GIMP_TOOL_ACTION_RESUME:
+      break;
+
+    case GIMP_TOOL_ACTION_HALT:
+      gimp_polygon_select_tool_halt (GIMP_POLYGON_SELECT_TOOL (tool));
+      break;
+    }
+
+  GIMP_TOOL_CLASS (parent_class)->control (tool, action, display);
+}
+
+static void
+gimp_polygon_select_tool_oper_update (GimpTool        *tool,
+                                   GimpCoords      *coords,
+                                   GdkModifierType  state,
+                                   gboolean         proximity,
+                                   GimpDisplay     *display)
+{
+  GimpPolygonSelectTool        *poly_sel_tool = GIMP_POLYGON_SELECT_TOOL (tool);
+  GimpPolygonSelectToolPrivate *priv          = poly_sel_tool->priv;
+
+  if (tool->display == display)
+    {
+      gimp_polygon_select_tool_select_closet_point (poly_sel_tool,
+                                                 display,
+                                                 coords);
+
+      gimp_draw_tool_pause (GIMP_DRAW_TOOL (tool));
+
+      if (priv->grabbed_point || priv->num_points == 0)
+        {
+          priv->show_pending_point = FALSE;
+        }
+      else
+        {
+          priv->show_pending_point = TRUE;
+
+          priv->pending_point.x    = coords->x;
+          priv->pending_point.y    = coords->y;
+        }
+
+      gimp_draw_tool_resume (GIMP_DRAW_TOOL (tool));
+    }
+}
+
+static void
+gimp_polygon_select_tool_button_press (GimpTool        *tool,
+                                       GimpCoords      *coords,
+                                       guint32          time,
+                                       GdkModifierType  state,
+                                       GimpDisplay     *display)
+{
+  GimpPolygonSelectTool        *poly_sel_tool = GIMP_POLYGON_SELECT_TOOL (tool);
+  GimpPolygonSelectToolPrivate *priv          = poly_sel_tool->priv;
+
+  if (display != tool->display)
+    {
+      gimp_polygon_select_tool_start (poly_sel_tool, display);
+
+      gimp_selection_tool_start_edit (GIMP_SELECTION_TOOL (poly_sel_tool),
+                                      coords);
+    }
+
+  if (priv->grabbed_point)
+    {
+      priv->saved_grabbed_point = *priv->grabbed_point;
+    }
+}
+
+static void
+gimp_polygon_select_tool_motion (GimpTool        *tool,
+                                 GimpCoords      *coords,
+                                 guint32          time,
+                                 GdkModifierType  state,
+                                 GimpDisplay     *display)
+{
+  if (tool->display == display)
+    {
+      GimpPolygonSelectTool        *poly_sel_tool = GIMP_POLYGON_SELECT_TOOL (tool);
+      GimpDrawTool                 *draw_tool     = GIMP_DRAW_TOOL (tool);
+      GimpPolygonSelectToolPrivate *priv          = poly_sel_tool->priv;
+
+      gimp_draw_tool_pause (draw_tool);
+
+      if (priv->grabbed_point)
+        {
+          priv->grabbed_point->x = coords->x;
+          priv->grabbed_point->y = coords->y;
+        }
+      else
+        {
+          priv->pending_point.x = coords->x;
+          priv->pending_point.y = coords->y;
+        }
+
+      gimp_draw_tool_resume (draw_tool);
+    }
+}
+
+static void
+gimp_polygon_select_tool_button_release (GimpTool              *tool,
+                                         GimpCoords            *coords,
+                                         guint32                time,
+                                         GdkModifierType        state,
+                                         GimpButtonReleaseType  release_type,
+                                         GimpDisplay           *display)
+{
+  GimpPolygonSelectTool        *poly_sel_tool = GIMP_POLYGON_SELECT_TOOL (tool);
+  GimpPolygonSelectToolPrivate *priv          = poly_sel_tool->priv;
+
+  switch (release_type)
+    {
+    case GIMP_BUTTON_RELEASE_CLICK:
+      if (gimp_polygon_select_tool_should_close (poly_sel_tool,
+                                              display,
+                                              coords))
+        {
+          gimp_polygon_select_tool_commit (poly_sel_tool,
+                                        display);
+          break;
+        }
+
+      /* Fall through */
+
+    case GIMP_BUTTON_RELEASE_NORMAL:
+      if (! priv->grabbed_point)
+        {
+          gimp_polygon_select_tool_add_point (poly_sel_tool, coords->x, coords->y);
+        }
+      else
+        {
+          /* We don't need to do anything since the grabbed point have
+           * already been moved in _motion.
+           */
+        }
+      break;
+
+    case GIMP_BUTTON_RELEASE_CANCEL:
+      {
+        gimp_draw_tool_pause (GIMP_DRAW_TOOL (poly_sel_tool));
+
+        if (priv->grabbed_point)
+          {
+            *priv->grabbed_point = priv->saved_grabbed_point;
+          }
+
+        gimp_draw_tool_resume (GIMP_DRAW_TOOL (poly_sel_tool));
+      }
+      break;
+
+    case GIMP_BUTTON_RELEASE_NO_MOTION:
+      if (gimp_image_floating_sel (display->image))
+        {
+          /*  If there is a floating selection, anchor it  */
+          floating_sel_anchor (gimp_image_floating_sel (display->image));
+        }
+      else
+        {
+          /*  Otherwise, clear the selection mask  */
+          gimp_channel_clear (gimp_image_get_mask (display->image), NULL, TRUE);
+        }
+      break;
+    }
+}
+
+static gboolean
+gimp_polygon_select_tool_key_press (GimpTool    *tool,
+                                    GdkEventKey *kevent,
+                                    GimpDisplay *display)
+{
+  GimpPolygonSelectTool *poly_sel_tool = GIMP_POLYGON_SELECT_TOOL (tool);
+  gboolean            handled_key   = FALSE;
+
+  switch (kevent->keyval)
+    {
+    case GDK_BackSpace:
+      gimp_polygon_select_tool_remove_last (poly_sel_tool);
+      handled_key = TRUE;
+      break;
+
+    case GDK_KP_Enter:
+    case GDK_Return:
+      gimp_polygon_select_tool_commit (poly_sel_tool, display);
+      handled_key = TRUE;
+      break;
+
+    case GDK_Escape:
+      gimp_polygon_select_tool_halt (poly_sel_tool);
+      handled_key = TRUE;
+      break;
+
+    default:
+      handled_key = FALSE;
+      break;
+    }
+
+  return handled_key;
+}
+
+static void
+gimp_polygon_select_tool_start (GimpPolygonSelectTool *poly_sel_tool,
+                                GimpDisplay        *display)
+{
+  GimpTool     *tool      = GIMP_TOOL (poly_sel_tool);
+  GimpDrawTool *draw_tool = GIMP_DRAW_TOOL (tool);
+
+  gimp_polygon_select_tool_halt (poly_sel_tool);
+
+  gimp_tool_control_activate (tool->control);
+
+  tool->display = display;
+
+  poly_sel_tool->priv->num_points         = 0;
+  poly_sel_tool->priv->grabbed_point      = NULL;
+  poly_sel_tool->priv->show_pending_point = FALSE;
+
+  gimp_draw_tool_start (draw_tool, display);
+}
+
+static void
+gimp_polygon_select_tool_commit (GimpPolygonSelectTool *poly_sel_tool,
+                                 GimpDisplay        *display)
+{
+  gimp_polygon_select_tool_select (poly_sel_tool, display);
+
+  gimp_polygon_select_tool_halt (poly_sel_tool);
+}
+
+static void
+gimp_polygon_select_tool_halt (GimpPolygonSelectTool *poly_sel_tool)
+{
+  GimpPolygonSelectToolPrivate *priv      = poly_sel_tool->priv;
+  GimpTool                     *tool      = GIMP_TOOL (poly_sel_tool);
+  GimpDrawTool                 *draw_tool = GIMP_DRAW_TOOL (poly_sel_tool);
+
+  if (gimp_draw_tool_is_active (draw_tool))
+    gimp_draw_tool_stop (draw_tool);
+
+  if (gimp_tool_control_is_active (tool->control))
+    gimp_tool_control_halt (tool->control);
+
+  priv->grabbed_point      = NULL;
+  priv->show_pending_point = FALSE;
+  priv->num_points         = 0;
+
+  tool->display            = NULL;
+}
+
+static void
+gimp_polygon_select_tool_draw (GimpDrawTool *draw_tool)
+{
+  GimpPolygonSelectTool *poly_sel_tool = GIMP_POLYGON_SELECT_TOOL (draw_tool);
+
+  gimp_draw_tool_draw_lines (draw_tool,
+                             (const gdouble *) poly_sel_tool->priv->points,
+                             poly_sel_tool->priv->num_points,
+                             FALSE, FALSE);
+
+  if (poly_sel_tool->priv->show_pending_point)
+    {
+      GimpPolygonSelectToolPrivate *priv;
+
+      priv = poly_sel_tool->priv;
+
+      gimp_draw_tool_draw_line (draw_tool,
+                                priv->points[priv->num_points - 1].x,
+                                priv->points[priv->num_points - 1].y,
+                                priv->pending_point.x,
+                                priv->pending_point.y,
+                                FALSE);
+    }
+}
+
+void
+gimp_polygon_select_tool_select (GimpPolygonSelectTool *poly_sel_tool,
+                                 GimpDisplay        *display)
+{
+  g_return_if_fail (GIMP_IS_POLYGON_SELECT_TOOL (poly_sel_tool));
+  g_return_if_fail (GIMP_IS_DISPLAY (display));
+
+  GIMP_POLYGON_SELECT_TOOL_GET_CLASS (poly_sel_tool)->select (poly_sel_tool, display);
+}
+
+
+static void
+gimp_polygon_select_tool_real_select (GimpPolygonSelectTool *poly_sel_tool,
+                                      GimpDisplay        *display)
+{
+  GimpSelectionOptions *options = GIMP_SELECTION_TOOL_GET_OPTIONS (poly_sel_tool);
+
+  gimp_channel_select_polygon (gimp_image_get_mask (display->image),
+                               Q_("command|Free Select"),
+                               poly_sel_tool->priv->num_points,
+                               poly_sel_tool->priv->points,
+                               options->operation,
+                               options->antialias,
+                               options->feather,
+                               options->feather_radius,
+                               options->feather_radius,
+                               TRUE);
+}
+
+static GimpVector2 *
+gimp_polygon_select_tool_add_point (GimpPolygonSelectTool *poly_sel_tool,
+                                    gdouble             x,
+                                    gdouble             y)
+{
+  if (poly_sel_tool->priv->num_points >= poly_sel_tool->priv->max_segs)
+    {
+      poly_sel_tool->priv->max_segs += DEFAULT_MAX_INC;
+
+      poly_sel_tool->priv->points = g_realloc (poly_sel_tool->priv->points,
+                                               sizeof (GimpVector2) * poly_sel_tool->priv->max_segs);
+    }
+
+  poly_sel_tool->priv->points[poly_sel_tool->priv->num_points].x = x;
+  poly_sel_tool->priv->points[poly_sel_tool->priv->num_points].y = y;
+
+  return &poly_sel_tool->priv->points[poly_sel_tool->priv->num_points++];
+}
+
+static void
+gimp_polygon_select_tool_remove_last (GimpPolygonSelectTool *poly_sel_tool)
+{
+  GimpPolygonSelectToolPrivate *priv      = poly_sel_tool->priv;
+  GimpDrawTool                 *draw_tool = GIMP_DRAW_TOOL (poly_sel_tool);
+
+  gimp_draw_tool_pause (draw_tool);
+
+  if (priv->num_points == 0)
+    {
+      gimp_polygon_select_tool_halt (poly_sel_tool);
+    }
+  else
+    {
+      priv->num_points--;
+    }
+
+  gimp_draw_tool_resume (draw_tool);
+}
+
+static void
+gimp_polygon_select_tool_select_closet_point (GimpPolygonSelectTool *poly_sel_tool,
+                                              GimpDisplay        *display,
+                                              GimpCoords         *coords)
+{
+  GimpPolygonSelectToolPrivate *priv             = poly_sel_tool->priv;
+  GimpDrawTool                 *draw_tool        = GIMP_DRAW_TOOL (poly_sel_tool);
+  gdouble                       shortest_dist_sq;
+  int                           i;
+
+  priv->grabbed_point = NULL;
+  shortest_dist_sq    = POINT_GRAB_THRESHOLD_SQ;
+
+  for (i = 0; i < priv->num_points; i++)
+    {
+      gdouble dist_sq;
+
+      dist_sq = gimp_draw_tool_calc_distance_square (draw_tool,
+                                                     display,
+                                                     coords->x,
+                                                     coords->y,
+                                                     priv->points[i].x,
+                                                     priv->points[i].y);
+      if (dist_sq < shortest_dist_sq)
+        {
+          priv->grabbed_point = &priv->points[i];
+        }
+    }
+}
+
+static gboolean
+gimp_polygon_select_tool_should_close (GimpPolygonSelectTool *poly_sel_tool,
+                                       GimpDisplay        *display,
+                                       GimpCoords         *coords)
+{
+  GimpPolygonSelectToolPrivate *priv          = poly_sel_tool->priv;
+  gboolean                      should_close  = FALSE;
+
+  if (priv->num_points > 0)
+    {
+      gdouble dist_sq;
+
+      dist_sq = gimp_draw_tool_calc_distance_square (GIMP_DRAW_TOOL (poly_sel_tool),
+                                                     display,
+                                                     coords->x,
+                                                     coords->y,
+                                                     priv->points[0].x,
+                                                     priv->points[0].y);
+      should_close = dist_sq < POINT_GRAB_THRESHOLD_SQ;
+    }
+
+  return should_close;
+}

Added: trunk/app/tools/gimppolygonselecttool.h
==============================================================================
--- (empty file)
+++ trunk/app/tools/gimppolygonselecttool.h	Wed Jan 30 20:33:58 2008
@@ -0,0 +1,70 @@
+/* GIMP - The GNU Image Manipulation Program
+ *
+ * A polygonal selection tool for GIMP
+ * Copyright (C) 2007 Martin Nordholts
+ *
+ * Based on gimpfreeselecttool.h which is
+ * 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 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.
+ */
+
+#ifndef GIMP_POLYGON_SELECT_TOOL_H
+#define GIMP_POLYGON_SELECT_TOOL_H
+
+
+#include "gimpselectiontool.h"
+
+
+#define GIMP_TYPE_POLYGON_SELECT_TOOL            (gimp_polygon_select_tool_get_type ())
+#define GIMP_POLYGON_SELECT_TOOL(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_POLYGON_SELECT_TOOL, GimpPolygonSelectTool))
+#define GIMP_POLYGON_SELECT_TOOL_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_POLYGON_SELECT_TOOL, GimpPolygonSelectToolClass))
+#define GIMP_IS_POLYGON_SELECT_TOOL(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_POLYGON_SELECT_TOOL))
+#define GIMP_IS_POLYGON_SELECT_TOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_POLYGON_SELECT_TOOL))
+#define GIMP_POLYGON_SELECT_TOOL_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_POLYGON_SELECT_TOOL, GimpPolygonSelectToolClass))
+
+
+typedef struct _GimpPolygonSelectTool        GimpPolygonSelectTool;
+typedef struct _GimpPolygonSelectToolPrivate GimpPolygonSelectToolPrivate;
+typedef struct _GimpPolygonSelectToolClass   GimpPolygonSelectToolClass;
+
+struct _GimpPolygonSelectTool
+{
+  GimpSelectionTool             parent_instance;
+
+  GimpPolygonSelectToolPrivate *priv;
+};
+
+struct _GimpPolygonSelectToolClass
+{
+  GimpSelectionToolClass  parent_class;
+
+  /*  virtual function  */
+
+  void (* select) (GimpPolygonSelectTool *poly_select_tool,
+                   GimpDisplay           *display);
+};
+
+
+void    gimp_polygon_select_tool_register (GimpToolRegisterCallback  callback,
+                                           gpointer                  data);
+
+GType   gimp_polygon_select_tool_get_type (void) G_GNUC_CONST;
+
+void    gimp_polygon_select_tool_select   (GimpPolygonSelectTool       *poly_sel,
+                                           GimpDisplay                 *display);
+
+
+#endif /* GIMP_POLYGON_SELECT_TOOL_H */

Modified: trunk/app/widgets/gimphelp-ids.h
==============================================================================
--- trunk/app/widgets/gimphelp-ids.h	(original)
+++ trunk/app/widgets/gimphelp-ids.h	Wed Jan 30 20:33:58 2008
@@ -267,6 +267,7 @@
 #define GIMP_HELP_TOOL_PENCIL                     "gimp-tool-pencil"
 #define GIMP_HELP_TOOL_PERSPECTIVE                "gimp-tool-perspective"
 #define GIMP_HELP_TOOL_PERSPECTIVE_CLONE          "gimp-tool-perspective-clone"
+#define GIMP_HELP_TOOL_POLYGON_SELECT             "gimp-tool-polygon-select"
 #define GIMP_HELP_TOOL_POSTERIZE                  "gimp-tool-posterize"
 #define GIMP_HELP_TOOL_RECT_SELECT                "gimp-tool-rect-select"
 #define GIMP_HELP_TOOL_ROTATE                     "gimp-tool-rotate"

Modified: trunk/libgimpwidgets/gimpstock.c
==============================================================================
--- trunk/libgimpwidgets/gimpstock.c	(original)
+++ trunk/libgimpwidgets/gimpstock.c	Wed Jan 30 20:33:58 2008
@@ -313,6 +313,7 @@
   { GIMP_STOCK_TOOL_PENCIL,              NULL,        0, 0, LIBGIMP_DOMAIN },
   { GIMP_STOCK_TOOL_PERSPECTIVE,  N_("_Transform"),   0, 0, LIBGIMP_DOMAIN },
   { GIMP_STOCK_TOOL_PERSPECTIVE_CLONE,   NULL,        0, 0, LIBGIMP_DOMAIN },
+  { GIMP_STOCK_TOOL_POLYGON_SELECT,      NULL,        0, 0, LIBGIMP_DOMAIN },
   { GIMP_STOCK_TOOL_POSTERIZE,           NULL,        0, 0, LIBGIMP_DOMAIN },
   { GIMP_STOCK_TOOL_RECT_SELECT,         NULL,        0, 0, LIBGIMP_DOMAIN },
   { GIMP_STOCK_TOOL_ROTATE,       N_("_Rotate"),      0, 0, LIBGIMP_DOMAIN },
@@ -463,6 +464,7 @@
   { GIMP_STOCK_TOOL_PENCIL,              stock_tool_pencil_22              },
   { GIMP_STOCK_TOOL_PERSPECTIVE,         stock_tool_perspective_22         },
   { GIMP_STOCK_TOOL_PERSPECTIVE_CLONE,   stock_tool_perspective_clone_22   },
+  { GIMP_STOCK_TOOL_POLYGON_SELECT,      stock_tool_polygon_select_22      },
   { GIMP_STOCK_TOOL_POSTERIZE,           stock_tool_posterize_22           },
   { GIMP_STOCK_TOOL_RECT_SELECT,         stock_tool_rect_select_22         },
   { GIMP_STOCK_TOOL_ROTATE,              stock_tool_rotate_22              },
@@ -624,6 +626,7 @@
   { GIMP_STOCK_TOOL_PENCIL,              stock_tool_pencil_16              },
   { GIMP_STOCK_TOOL_PERSPECTIVE,         stock_tool_perspective_16         },
   { GIMP_STOCK_TOOL_PERSPECTIVE_CLONE,   stock_tool_perspective_clone_16   },
+  { GIMP_STOCK_TOOL_POLYGON_SELECT,      stock_tool_polygon_select_16      },
   { GIMP_STOCK_TOOL_POSTERIZE,           stock_tool_posterize_16           },
   { GIMP_STOCK_TOOL_RECT_SELECT,         stock_tool_rect_select_16         },
   { GIMP_STOCK_TOOL_ROTATE,              stock_tool_rotate_16              },

Modified: trunk/libgimpwidgets/gimpstock.h
==============================================================================
--- trunk/libgimpwidgets/gimpstock.h	(original)
+++ trunk/libgimpwidgets/gimpstock.h	Wed Jan 30 20:33:58 2008
@@ -130,6 +130,7 @@
 #define GIMP_STOCK_TOOL_PENCIL              "gimp-tool-pencil"
 #define GIMP_STOCK_TOOL_PERSPECTIVE         "gimp-tool-perspective"
 #define GIMP_STOCK_TOOL_PERSPECTIVE_CLONE   "gimp-tool-perspective-clone"
+#define GIMP_STOCK_TOOL_POLYGON_SELECT      "gimp-tool-polygon-select"
 #define GIMP_STOCK_TOOL_POSTERIZE           "gimp-tool-posterize"
 #define GIMP_STOCK_TOOL_RECT_SELECT         "gimp-tool-rect-select"
 #define GIMP_STOCK_TOOL_ROTATE              "gimp-tool-rotate"

Modified: trunk/menus/image-menu.xml.in
==============================================================================
--- trunk/menus/image-menu.xml.in	(original)
+++ trunk/menus/image-menu.xml.in	Wed Jan 30 20:33:58 2008
@@ -492,6 +492,7 @@
 	<menuitem action="tools-rect-select" />
 	<menuitem action="tools-ellipse-select" />
 	<menuitem action="tools-free-select" />
+	<menuitem action="tools-polygon-select" />
 	<menuitem action="tools-foreground-select" />
 	<menuitem action="tools-fuzzy-select" />
 	<menuitem action="tools-by-color-select" />

Modified: trunk/themes/Default/images/Makefile.am
==============================================================================
--- trunk/themes/Default/images/Makefile.am	(original)
+++ trunk/themes/Default/images/Makefile.am	Wed Jan 30 20:33:58 2008
@@ -315,6 +315,8 @@
 	tools/stock-tool-perspective-22.png		\
 	tools/stock-tool-perspective-clone-16.png	\
 	tools/stock-tool-perspective-clone-22.png	\
+	tools/stock-tool-polygon-select-16.png		\
+	tools/stock-tool-polygon-select-22.png		\
 	tools/stock-tool-posterize-16.png		\
 	tools/stock-tool-posterize-22.png		\
 	tools/stock-tool-rect-select-16.png		\

Added: trunk/themes/Default/images/tools/stock-tool-polygon-select-16.png
==============================================================================
Binary file. No diff available.

Added: trunk/themes/Default/images/tools/stock-tool-polygon-select-22.png
==============================================================================
Binary file. No diff available.



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]