app: change offsets parameters of GimpItem::translate() from int to double

so we can use it to precisely position paths; use SIGNED_ROUND() in
channel, layer etc. to snap to pixels.
This commit is contained in:
Michael Natterer 2018-04-23 01:08:54 +02:00
parent b1a36b044b
commit 7256f18447
6 changed files with 61 additions and 67 deletions

View File

@ -23,6 +23,7 @@
#include <gegl.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include "libgimpbase/gimpbase.h"
#include "libgimpmath/gimpmath.h"
#include "libgimpcolor/gimpcolor.h"
@ -89,8 +90,8 @@ static void gimp_channel_convert (GimpItem *item,
GimpImage *dest_image,
GType old_type);
static void gimp_channel_translate (GimpItem *item,
gint off_x,
gint off_y,
gdouble off_x,
gdouble off_y,
gboolean push_undo);
static void gimp_channel_scale (GimpItem *item,
gint new_width,
@ -634,82 +635,73 @@ gimp_channel_convert (GimpItem *item,
static void
gimp_channel_translate (GimpItem *item,
gint off_x,
gint off_y,
gdouble off_x,
gdouble off_y,
gboolean push_undo)
{
GimpChannel *channel = GIMP_CHANNEL (item);
GeglBuffer *tmp_buffer = NULL;
gint width, height;
gint x1, y1, x2, y2;
GimpChannel *channel = GIMP_CHANNEL (item);
gint x, y, width, height;
gimp_item_bounds (GIMP_ITEM (channel), &x1, &y1, &x2, &y2);
x2 += x1;
y2 += y1;
gimp_item_bounds (GIMP_ITEM (channel), &x, &y, &width, &height);
/* update the old area */
gimp_drawable_update (GIMP_DRAWABLE (item), x1, y1, x2 - x1, y2 - y1);
gimp_drawable_update (GIMP_DRAWABLE (item), x, y, width, height);
if (push_undo)
gimp_channel_push_undo (channel, NULL);
x1 = CLAMP ((x1 + off_x), 0, gimp_item_get_width (GIMP_ITEM (channel)));
y1 = CLAMP ((y1 + off_y), 0, gimp_item_get_height (GIMP_ITEM (channel)));
x2 = CLAMP ((x2 + off_x), 0, gimp_item_get_width (GIMP_ITEM (channel)));
y2 = CLAMP ((y2 + off_y), 0, gimp_item_get_height (GIMP_ITEM (channel)));
width = x2 - x1;
height = y2 - y1;
/* make sure width and height are non-zero */
if (width != 0 && height != 0)
if (gimp_rectangle_intersect (x + SIGNED_ROUND (off_x),
y + SIGNED_ROUND (off_y),
width, height,
0, 0,
gimp_item_get_width (GIMP_ITEM (channel)),
gimp_item_get_height (GIMP_ITEM (channel)),
&x, &y, &width, &height))
{
/* copy the portion of the mask we will keep to a temporary
* buffer
*/
tmp_buffer =
GeglBuffer *tmp_buffer =
gegl_buffer_new (GEGL_RECTANGLE (0, 0, width, height),
gimp_drawable_get_format (GIMP_DRAWABLE (channel)));
gegl_buffer_copy (gimp_drawable_get_buffer (GIMP_DRAWABLE (channel)),
GEGL_RECTANGLE (x1 - off_x, y1 - off_y, width, height),
GEGL_RECTANGLE (x - SIGNED_ROUND (off_x),
y - SIGNED_ROUND (off_y),
width, height),
GEGL_ABYSS_NONE,
tmp_buffer,
GEGL_RECTANGLE (0, 0, 0, 0));
}
/* clear the mask */
gegl_buffer_clear (gimp_drawable_get_buffer (GIMP_DRAWABLE (channel)),
NULL);
/* clear the mask */
gegl_buffer_clear (gimp_drawable_get_buffer (GIMP_DRAWABLE (channel)),
NULL);
if (width != 0 && height != 0)
{
/* copy the temp mask back to the mask */
gegl_buffer_copy (tmp_buffer, NULL, GEGL_ABYSS_NONE,
gimp_drawable_get_buffer (GIMP_DRAWABLE (channel)),
GEGL_RECTANGLE (x1, y1, 0, 0));
GEGL_RECTANGLE (x, y, 0, 0));
/* free the temporary mask */
g_object_unref (tmp_buffer);
}
/* calculate new bounds */
if (width == 0 || height == 0)
channel->x1 = x;
channel->y1 = y;
channel->x2 = x + width;
channel->y2 = y + height;
}
else
{
/* clear the mask */
gegl_buffer_clear (gimp_drawable_get_buffer (GIMP_DRAWABLE (channel)),
NULL);
channel->empty = TRUE;
channel->x1 = 0;
channel->y1 = 0;
channel->x2 = gimp_item_get_width (GIMP_ITEM (channel));
channel->y2 = gimp_item_get_height (GIMP_ITEM (channel));
}
else
{
channel->x1 = x1;
channel->y1 = y1;
channel->x2 = x2;
channel->y2 = y2;
}
/* update the new area */
gimp_drawable_update (GIMP_DRAWABLE (item),

View File

@ -148,8 +148,8 @@ static void gimp_item_real_start_transform (GimpItem *item,
static void gimp_item_real_end_transform (GimpItem *item,
gboolean push_undo);
static void gimp_item_real_translate (GimpItem *item,
gint offset_x,
gint offset_y,
gdouble offset_x,
gdouble offset_y,
gboolean push_undo);
static void gimp_item_real_scale (GimpItem *item,
gint new_width,
@ -612,15 +612,15 @@ gimp_item_real_rename (GimpItem *item,
static void
gimp_item_real_translate (GimpItem *item,
gint offset_x,
gint offset_y,
gdouble offset_x,
gdouble offset_y,
gboolean push_undo)
{
GimpItemPrivate *private = GET_PRIVATE (item);
gimp_item_set_offset (item,
private->offset_x + offset_x,
private->offset_y + offset_y);
private->offset_x + SIGNED_ROUND (offset_x),
private->offset_y + SIGNED_ROUND (offset_y));
}
static void
@ -1256,8 +1256,8 @@ gimp_item_end_transform (GimpItem *item,
*/
void
gimp_item_translate (GimpItem *item,
gint offset_x,
gint offset_y,
gdouble offset_x,
gdouble offset_y,
gboolean push_undo)
{
GimpItemClass *item_class;

View File

@ -78,8 +78,8 @@ struct _GimpItemClass
void (* end_transform) (GimpItem *item,
gboolean push_undo);
void (* translate) (GimpItem *item,
gint offset_x,
gint offset_y,
gdouble offset_x,
gdouble offset_y,
gboolean push_undo);
void (* scale) (GimpItem *item,
gint new_width,
@ -226,8 +226,8 @@ void gimp_item_end_transform (GimpItem *item,
gboolean push_undo);
void gimp_item_translate (GimpItem *item,
gint offset_x,
gint offset_y,
gdouble offset_x,
gdouble offset_y,
gboolean push_undo);
gboolean gimp_item_check_scaling (GimpItem *item,

View File

@ -136,8 +136,8 @@ static void gimp_layer_start_move (GimpItem *item,
static void gimp_layer_end_move (GimpItem *item,
gboolean push_undo);
static void gimp_layer_translate (GimpItem *item,
gint offset_x,
gint offset_y,
gdouble offset_x,
gdouble offset_y,
gboolean push_undo);
static void gimp_layer_scale (GimpItem *item,
gint new_width,
@ -1119,8 +1119,8 @@ gimp_layer_end_move (GimpItem *item,
static void
gimp_layer_translate (GimpItem *item,
gint offset_x,
gint offset_y,
gdouble offset_x,
gdouble offset_y,
gboolean push_undo)
{
GimpLayer *layer = GIMP_LAYER (item);
@ -1128,7 +1128,9 @@ gimp_layer_translate (GimpItem *item,
if (push_undo)
gimp_image_undo_push_item_displace (gimp_item_get_image (item), NULL, item);
GIMP_LAYER_GET_CLASS (layer)->translate (layer, offset_x, offset_y);
GIMP_LAYER_GET_CLASS (layer)->translate (layer,
SIGNED_ROUND (offset_x),
SIGNED_ROUND (offset_y));
if (layer->mask)
{

View File

@ -49,8 +49,8 @@
static gboolean gimp_selection_is_attached (GimpItem *item);
static GimpItemTree * gimp_selection_get_tree (GimpItem *item);
static void gimp_selection_translate (GimpItem *item,
gint offset_x,
gint offset_y,
gdouble offset_x,
gdouble offset_y,
gboolean push_undo);
static void gimp_selection_scale (GimpItem *item,
gint new_width,
@ -217,8 +217,8 @@ gimp_selection_get_tree (GimpItem *item)
static void
gimp_selection_translate (GimpItem *item,
gint offset_x,
gint offset_y,
gdouble offset_x,
gdouble offset_y,
gboolean push_undo)
{
GIMP_ITEM_CLASS (parent_class)->translate (item, offset_x, offset_y,

View File

@ -81,8 +81,8 @@ static void gimp_vectors_convert (GimpItem *item,
GimpImage *dest_image,
GType old_type);
static void gimp_vectors_translate (GimpItem *item,
gint offset_x,
gint offset_y,
gdouble offset_x,
gdouble offset_y,
gboolean push_undo);
static void gimp_vectors_scale (GimpItem *item,
gint new_width,
@ -441,8 +441,8 @@ gimp_vectors_convert (GimpItem *item,
static void
gimp_vectors_translate (GimpItem *item,
gint offset_x,
gint offset_y,
gdouble offset_x,
gdouble offset_y,
gboolean push_undo)
{
GimpVectors *vectors = GIMP_VECTORS (item);