Bill Skaggs <weskaggs@primate.ucdavis.edu>

* app/tools/tools-enums.h
	* app/tools/gimptransformtool.[ch]: add support for handles at
	midpoints of edges.

	* app/tools/gimpscaletool.c: use midpoint handles for scaling
	with fixed width or height.  Fixes bug #344955.
This commit is contained in:
William Skaggs 2006-08-23 22:13:17 +00:00
parent bc3c41b648
commit 15620f36b2
5 changed files with 171 additions and 33 deletions

View File

@ -1,3 +1,12 @@
2006-08-23 Bill Skaggs <weskaggs@primate.ucdavis.edu>
* app/tools/tools-enums.h
* app/tools/gimptransformtool.[ch]: add support for handles at
midpoints of edges.
* app/tools/gimpscaletool.c: use midpoint handles for scaling
with fixed width or height. Fixes bug #344955.
2006-08-23 Sven Neumann <sven@gimp.org>
* libgimpbase/gimpbaseenums.[ch]: removed "(Fastest)" from "None"

View File

@ -105,13 +105,14 @@ gimp_scale_tool_init (GimpScaleTool *scale_tool)
gimp_tool_control_set_tool_cursor (tool->control, GIMP_TOOL_CURSOR_RESIZE);
tr_tool->undo_desc = Q_("command|Scale");
tr_tool->shell_desc = _("Scaling Information");
tr_tool->progress_text = _("Scaling");
tr_tool->undo_desc = Q_("command|Scale");
tr_tool->shell_desc = _("Scaling Information");
tr_tool->progress_text = _("Scaling");
tr_tool->use_grid = TRUE;
tr_tool->use_handles = TRUE;
tr_tool->use_center = TRUE;
tr_tool->use_grid = TRUE;
tr_tool->use_handles = TRUE;
tr_tool->use_center = TRUE;
tr_tool->use_mid_handles = TRUE;
}
static void
@ -198,6 +199,8 @@ gimp_scale_tool_motion (GimpTransformTool *tr_tool,
switch (tr_tool->function)
{
case TRANSFORM_HANDLE_N:
diff_x = 0; /* and fall through */
case TRANSFORM_HANDLE_NW:
x1 = &tr_tool->trans_info[X0];
y1 = &tr_tool->trans_info[Y0];
@ -206,6 +209,8 @@ gimp_scale_tool_motion (GimpTransformTool *tr_tool,
dir_x = dir_y = 1;
break;
case TRANSFORM_HANDLE_E:
diff_y = 0; /* and fall through */
case TRANSFORM_HANDLE_NE:
x1 = &tr_tool->trans_info[X1];
y1 = &tr_tool->trans_info[Y0];
@ -215,6 +220,8 @@ gimp_scale_tool_motion (GimpTransformTool *tr_tool,
dir_y = 1;
break;
case TRANSFORM_HANDLE_W:
diff_y = 0; /* and fall through */
case TRANSFORM_HANDLE_SW:
x1 = &tr_tool->trans_info[X0];
y1 = &tr_tool->trans_info[Y1];
@ -224,6 +231,8 @@ gimp_scale_tool_motion (GimpTransformTool *tr_tool,
dir_y = -1;
break;
case TRANSFORM_HANDLE_S:
diff_x = 0; /* and fall through */
case TRANSFORM_HANDLE_SE:
x1 = &tr_tool->trans_info[X1];
y1 = &tr_tool->trans_info[Y1];

View File

@ -212,6 +212,7 @@ gimp_transform_tool_init (GimpTransformTool *tr_tool)
tr_tool->use_grid = FALSE;
tr_tool->use_handles = FALSE;
tr_tool->use_center = FALSE;
tr_tool->use_mid_handles = FALSE;
tr_tool->ngx = 0;
tr_tool->ngy = 0;
tr_tool->grid_coords = NULL;
@ -593,6 +594,63 @@ gimp_transform_tool_oper_update (GimpTool *tool,
closest_dist = dist;
tr_tool->function = TRANSFORM_HANDLE_SE;
}
if (tr_tool->use_mid_handles)
{
gdouble x, y;
x = (tr_tool->tx1 + tr_tool->tx2) / 2.0;
y = (tr_tool->ty1 + tr_tool->ty2) / 2.0;
if (gimp_draw_tool_on_handle (draw_tool, display,
coords->x, coords->y,
GIMP_HANDLE_SQUARE,
x, y,
2 * HANDLE_SIZE, 2 * HANDLE_SIZE,
GTK_ANCHOR_CENTER,
FALSE))
{
tr_tool->function = TRANSFORM_HANDLE_N;
}
x = (tr_tool->tx2 + tr_tool->tx4) / 2.0;
y = (tr_tool->ty2 + tr_tool->ty4) / 2.0;
if (gimp_draw_tool_on_handle (draw_tool, display,
coords->x, coords->y,
GIMP_HANDLE_SQUARE,
x, y,
2 * HANDLE_SIZE, 2 * HANDLE_SIZE,
GTK_ANCHOR_CENTER,
FALSE))
{
tr_tool->function = TRANSFORM_HANDLE_E;
}
x = (tr_tool->tx3 + tr_tool->tx4) / 2.0;
y = (tr_tool->ty3 + tr_tool->ty4) / 2.0;
if (gimp_draw_tool_on_handle (draw_tool, display,
coords->x, coords->y,
GIMP_HANDLE_SQUARE,
x, y,
2 * HANDLE_SIZE, 2 * HANDLE_SIZE,
GTK_ANCHOR_CENTER,
FALSE))
{
tr_tool->function = TRANSFORM_HANDLE_S;
}
x = (tr_tool->tx3 + tr_tool->tx1) / 2.0;
y = (tr_tool->ty3 + tr_tool->ty1) / 2.0;
if (gimp_draw_tool_on_handle (draw_tool, display,
coords->x, coords->y,
GIMP_HANDLE_SQUARE,
x, y,
2 * HANDLE_SIZE, 2 * HANDLE_SIZE,
GTK_ANCHOR_CENTER,
FALSE))
{
tr_tool->function = TRANSFORM_HANDLE_W;
}
}
}
if (tr_tool->use_center &&
@ -643,6 +701,22 @@ gimp_transform_tool_cursor_update (GimpTool *tool,
cursor = GIMP_CURSOR_CORNER_BOTTOM_RIGHT;
break;
case TRANSFORM_HANDLE_N:
cursor = GIMP_CURSOR_SIDE_TOP;
break;
case TRANSFORM_HANDLE_E:
cursor = GIMP_CURSOR_SIDE_RIGHT;
break;
case TRANSFORM_HANDLE_S:
cursor = GIMP_CURSOR_SIDE_BOTTOM;
break;
case TRANSFORM_HANDLE_W:
cursor = GIMP_CURSOR_SIDE_LEFT;
break;
default:
cursor = GIMP_CURSOR_CROSSHAIR_SMALL;
break;
@ -766,6 +840,47 @@ gimp_transform_tool_draw (GimpDrawTool *draw_tool)
HANDLE_SIZE, HANDLE_SIZE,
GTK_ANCHOR_CENTER,
FALSE);
if (tr_tool->use_mid_handles)
{
gdouble x, y;
x = (tr_tool->tx1 + tr_tool->tx2) / 2.0;
y = (tr_tool->ty1 + tr_tool->ty2) / 2.0;
gimp_draw_tool_draw_handle (draw_tool,
GIMP_HANDLE_SQUARE,
x, y,
HANDLE_SIZE, HANDLE_SIZE,
GTK_ANCHOR_CENTER,
FALSE);
x = (tr_tool->tx2 + tr_tool->tx4) / 2.0;
y = (tr_tool->ty2 + tr_tool->ty4) / 2.0;
gimp_draw_tool_draw_handle (draw_tool,
GIMP_HANDLE_SQUARE,
x, y,
HANDLE_SIZE, HANDLE_SIZE,
GTK_ANCHOR_CENTER,
FALSE);
x = (tr_tool->tx3 + tr_tool->tx4) / 2.0;
y = (tr_tool->ty3 + tr_tool->ty4) / 2.0;
gimp_draw_tool_draw_handle (draw_tool,
GIMP_HANDLE_SQUARE,
x, y,
HANDLE_SIZE, HANDLE_SIZE,
GTK_ANCHOR_CENTER,
FALSE);
x = (tr_tool->tx3 + tr_tool->tx1) / 2.0;
y = (tr_tool->ty3 + tr_tool->ty1) / 2.0;
gimp_draw_tool_draw_handle (draw_tool,
GIMP_HANDLE_SQUARE,
x, y,
HANDLE_SIZE, HANDLE_SIZE,
GTK_ANCHOR_CENTER,
FALSE);
}
}
/* draw the center */

View File

@ -45,48 +45,49 @@ struct _GimpTransformTool
{
GimpDrawTool parent_instance;
gdouble startx; /* starting x coord */
gdouble starty; /* starting y coord */
gdouble startx; /* starting x coord */
gdouble starty; /* starting y coord */
gdouble curx; /* current x coord */
gdouble cury; /* current y coord */
gdouble curx; /* current x coord */
gdouble cury; /* current y coord */
gdouble lastx; /* last x coord */
gdouble lasty; /* last y coord */
gdouble lastx; /* last x coord */
gdouble lasty; /* last y coord */
GdkModifierType state; /* state of buttons and keys */
GdkModifierType state; /* state of buttons and keys */
gint x1, y1; /* upper left hand coordinate */
gint x2, y2; /* lower right hand coords */
gdouble cx, cy; /* center point (for rotation) */
gint x1, y1; /* upper left hand coordinate */
gint x2, y2; /* lower right hand coords */
gdouble cx, cy; /* center point (for rotation) */
gdouble tx1, ty1; /* transformed coords */
gdouble tx1, ty1; /* transformed coords */
gdouble tx2, ty2;
gdouble tx3, ty3;
gdouble tx4, ty4;
gdouble tcx, tcy;
GimpMatrix3 transform; /* transformation matrix */
TransInfo trans_info; /* transformation info */
GimpMatrix3 transform; /* transformation matrix */
TransInfo trans_info; /* transformation info */
TransInfo old_trans_info; /* for cancelling a drag operation */
TransInfo old_trans_info; /* for cancelling a drag operation */
TileManager *original; /* pointer to original tiles */
TileManager *original; /* pointer to original tiles */
TransformAction function; /* current tool activity */
TransformAction function; /* current tool activity */
gboolean use_grid; /* does the tool use the grid */
gboolean use_handles; /* uses the corner handles */
gboolean use_center; /* uses the center handle */
gboolean use_grid; /* does the tool use the grid */
gboolean use_handles; /* uses the corner handles */
gboolean use_center; /* uses the center handle */
gboolean use_mid_handles; /* use handles at midpoints of edges */
gint ngx, ngy; /* number of grid lines in original
* x and y directions
*/
gdouble *grid_coords; /* x and y coordinates of the grid
* endpoints (a total of (ngx+ngy)*2
* coordinate pairs)
*/
gdouble *tgrid_coords; /* transformed grid_coords */
gint ngx, ngy; /* number of grid lines in original
* x and y directions
*/
gdouble *grid_coords; /* x and y coordinates of the grid
* endpoints (a total of (ngx+ngy)*2
* coordinate pairs)
*/
gdouble *tgrid_coords; /* transformed grid_coords */
GimpTransformType type;
GimpTransformDirection direction;

View File

@ -174,6 +174,10 @@ typedef enum /*< skip >*/
TRANSFORM_HANDLE_NE, /* north east */
TRANSFORM_HANDLE_SW, /* south west */
TRANSFORM_HANDLE_SE, /* south east */
TRANSFORM_HANDLE_N, /* north */
TRANSFORM_HANDLE_S, /* south */
TRANSFORM_HANDLE_E, /* east */
TRANSFORM_HANDLE_W, /* west */
TRANSFORM_HANDLE_CENTER
} TransformAction;