Commit 4a5a6ef9 authored by Téo Mazars's avatar Téo Mazars Committed by Michael Natterer

Bug 684330 - Rectangle tool's "fixed size" option is off-by-one

ROUND() is consistent only on positive values, and bad rounding
creates an offset when negative values are involved. Introduce
SIGNED_ROUND() and use it in gimprectangletool.c. It should probably
be used in much more places.
parent a907741d
......@@ -4134,13 +4134,13 @@ gimp_rectangle_tool_update_int_rect (GimpRectangleTool *rect_tool)
{
GimpRectangleToolPrivate *priv = GIMP_RECTANGLE_TOOL_GET_PRIVATE (rect_tool);
priv->x1_int = ROUND (priv->x1);
priv->y1_int = ROUND (priv->y1);
priv->x1_int = SIGNED_ROUND (priv->x1);
priv->y1_int = SIGNED_ROUND (priv->y1);
if (gimp_rectangle_tool_rect_rubber_banding_func (rect_tool))
{
priv->width_int = (gint) ROUND (priv->x2) - priv->x1_int;
priv->height_int = (gint) ROUND (priv->y2) - priv->y1_int;
priv->width_int = (gint) SIGNED_ROUND (priv->x2) - priv->x1_int;
priv->height_int = (gint) SIGNED_ROUND (priv->y2) - priv->y1_int;
}
}
......
......@@ -74,10 +74,18 @@ G_BEGIN_DECLS
* ROUND:
* @x: the value to be rounded.
*
* This macro rounds its argument @x to the nearest integer.
* This macro rounds its positive argument @x to the nearest integer.
**/
#define ROUND(x) ((int) ((x) + 0.5))
/**
* SIGNED_ROUND:
* @x: the value to be rounded.
*
* This macro rounds its argument @x to the nearest integer.
**/
#define SIGNED_ROUND(x) ((int) ((((x) < 0) ? (x) - 0.5 : (x) + 0.5)))
/**
* SQR:
* @x: the value to be squared.
......
......@@ -66,7 +66,6 @@
#define MIDDLE 127
#define SIGNED_ROUND(x) ((int) (((x < 0) ? (x) - 0.5 : (x) + 0.5) ))
#define MIX_CHANNEL(a, b, m) (((a * m) + (b * (255 - m))) / 255)
#define UP_GRAPH 0x1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment