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.
This commit is contained in:
Téo Mazars 2013-02-12 18:36:15 +01:00 committed by Michael Natterer
parent a907741d8a
commit 4a5a6ef914
3 changed files with 13 additions and 6 deletions

View file

@ -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;
}
}

View file

@ -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.

View file

@ -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