Bug 748762 - GIMP crashes when a selection is outside a layer boundary...

...and % is selected in rotate Tool

Refuse to start any transform tool (with an error message) if the
selection doesn't intersect with the layer.
This commit is contained in:
Michael Natterer 2015-05-02 00:00:39 -04:00
parent 072cb068b2
commit 93414342c3
1 changed files with 25 additions and 16 deletions

View File

@ -148,7 +148,7 @@ static TransformAction
static void gimp_transform_tool_halt (GimpTransformTool *tr_tool);
static void gimp_transform_tool_set_function (GimpTransformTool *tr_tool,
TransformAction function);
static void gimp_transform_tool_bounds (GimpTransformTool *tr_tool,
static gboolean gimp_transform_tool_bounds (GimpTransformTool *tr_tool,
GimpDisplay *display);
static void gimp_transform_tool_dialog (GimpTransformTool *tr_tool);
static void gimp_transform_tool_prepare (GimpTransformTool *tr_tool,
@ -281,6 +281,16 @@ gimp_transform_tool_initialize (GimpTool *tool,
gimp_transform_tool_halt (tr_tool);
/* Find the transform bounds for some tools (like scale,
* perspective) that actually need the bounds for initializing
*/
if (! gimp_transform_tool_bounds (tr_tool, display))
{
g_set_error (error, GIMP_ERROR, GIMP_FAILED,
_("The selection does not intersect with the layer."));
return FALSE;
}
/* Set the pointer to the active display */
tool->display = display;
tool->drawable = drawable;
@ -289,11 +299,6 @@ gimp_transform_tool_initialize (GimpTool *tool,
if (! tr_tool->gui)
gimp_transform_tool_dialog (tr_tool);
/* Find the transform bounds for some tools (like scale,
* perspective) that actually need the bounds for initializing
*/
gimp_transform_tool_bounds (tr_tool, display);
/* Inizialize the tool-specific trans_info, and adjust the
* tool dialog
*/
@ -1536,12 +1541,13 @@ gimp_transform_tool_transform_bounding_box (GimpTransformTool *tr_tool)
tr_tool->ty4) / 4.0;
}
static void
static gboolean
gimp_transform_tool_bounds (GimpTransformTool *tr_tool,
GimpDisplay *display)
{
GimpTransformOptions *options = GIMP_TRANSFORM_TOOL_GET_OPTIONS (tr_tool);
GimpImage *image = gimp_display_get_image (display);
GimpTransformOptions *options = GIMP_TRANSFORM_TOOL_GET_OPTIONS (tr_tool);
GimpImage *image = gimp_display_get_image (display);
gboolean non_empty = TRUE;
switch (options->type)
{
@ -1550,18 +1556,19 @@ gimp_transform_tool_bounds (GimpTransformTool *tr_tool,
GimpDrawable *drawable;
gint offset_x;
gint offset_y;
gint x, y;
gint width, height;
drawable = gimp_image_get_active_drawable (image);
gimp_item_get_offset (GIMP_ITEM (drawable), &offset_x, &offset_y);
gimp_item_mask_bounds (GIMP_ITEM (drawable),
&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;
non_empty = gimp_item_mask_intersect (GIMP_ITEM (drawable),
&x, &y, &width, &height);
tr_tool->x1 = x + offset_x;
tr_tool->y1 = y + offset_y;
tr_tool->x2 = x + width + offset_x;
tr_tool->y2 = y + height + offset_y;
}
break;
@ -1575,6 +1582,8 @@ gimp_transform_tool_bounds (GimpTransformTool *tr_tool,
tr_tool->aspect = ((gdouble) (tr_tool->x2 - tr_tool->x1) /
(gdouble) (tr_tool->y2 - tr_tool->y1));
return non_empty;
}
static void