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.
(cherry picked from commit 4a5a6ef914
)
This commit is contained in:

committed by
Michael Natterer

parent
6f1b26ddf7
commit
606532f5a8
@ -4133,13 +4133,13 @@ gimp_rectangle_tool_update_int_rect (GimpRectangleTool *rect_tool)
|
|||||||
{
|
{
|
||||||
GimpRectangleToolPrivate *priv = GIMP_RECTANGLE_TOOL_GET_PRIVATE (rect_tool);
|
GimpRectangleToolPrivate *priv = GIMP_RECTANGLE_TOOL_GET_PRIVATE (rect_tool);
|
||||||
|
|
||||||
priv->x1_int = ROUND (priv->x1);
|
priv->x1_int = SIGNED_ROUND (priv->x1);
|
||||||
priv->y1_int = ROUND (priv->y1);
|
priv->y1_int = SIGNED_ROUND (priv->y1);
|
||||||
|
|
||||||
if (gimp_rectangle_tool_rect_rubber_banding_func (rect_tool))
|
if (gimp_rectangle_tool_rect_rubber_banding_func (rect_tool))
|
||||||
{
|
{
|
||||||
priv->width_int = (gint) ROUND (priv->x2) - priv->x1_int;
|
priv->width_int = (gint) SIGNED_ROUND (priv->x2) - priv->x1_int;
|
||||||
priv->height_int = (gint) ROUND (priv->y2) - priv->y1_int;
|
priv->height_int = (gint) SIGNED_ROUND (priv->y2) - priv->y1_int;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,10 +74,18 @@ G_BEGIN_DECLS
|
|||||||
* ROUND:
|
* ROUND:
|
||||||
* @x: the value to be rounded.
|
* @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))
|
#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:
|
* SQR:
|
||||||
* @x: the value to be squared.
|
* @x: the value to be squared.
|
||||||
|
@ -66,7 +66,6 @@
|
|||||||
|
|
||||||
#define MIDDLE 127
|
#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 MIX_CHANNEL(a, b, m) (((a * m) + (b * (255 - m))) / 255)
|
||||||
|
|
||||||
#define UP_GRAPH 0x1
|
#define UP_GRAPH 0x1
|
||||||
|
Reference in New Issue
Block a user