[gimp] app: improve gimp_channel_clear()
- From: Ell <ell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: improve gimp_channel_clear()
- Date: Thu, 17 Jan 2019 20:16:29 +0000 (UTC)
commit ac5e4f4c33688498e197a75e40a82f7349253af8
Author: Ell <ell_se yahoo com>
Date: Thu Jan 17 15:05:37 2019 -0500
app: improve gimp_channel_clear()
When clearing a channel, do nothing if the channel is already
empty; otherwise, align the cleared rectangle to the channel
buffer's tile grid, so that all affected tiles are dropped, rather
than zeroed. Furthermore, only update the affected region of the
channel.
app/core/gimpchannel.c | 33 +++++++++++++++++++++++++--------
1 file changed, 25 insertions(+), 8 deletions(-)
---
diff --git a/app/core/gimpchannel.c b/app/core/gimpchannel.c
index 42db772027..8e1ea2271d 100644
--- a/app/core/gimpchannel.c
+++ b/app/core/gimpchannel.c
@@ -37,6 +37,7 @@
#include "gegl/gimp-gegl-loops.h"
#include "gegl/gimp-gegl-mask.h"
#include "gegl/gimp-gegl-nodes.h"
+#include "gegl/gimp-gegl-utils.h"
#include "gimp.h"
#include "gimp-utils.h"
@@ -1258,6 +1259,13 @@ gimp_channel_real_clear (GimpChannel *channel,
const gchar *undo_desc,
gboolean push_undo)
{
+ GeglBuffer *buffer;
+ GeglRectangle rect;
+ GeglRectangle aligned_rect;
+
+ if (channel->bounds_known && channel->empty)
+ return;
+
if (push_undo)
{
if (! undo_desc)
@@ -1266,19 +1274,27 @@ gimp_channel_real_clear (GimpChannel *channel,
gimp_channel_push_undo (channel, undo_desc);
}
- if (channel->bounds_known && ! channel->empty)
+ buffer = gimp_drawable_get_buffer (GIMP_DRAWABLE (channel));
+
+ if (channel->bounds_known)
{
- gegl_buffer_clear (gimp_drawable_get_buffer (GIMP_DRAWABLE (channel)),
- GEGL_RECTANGLE (channel->x1, channel->y1,
- channel->x2 - channel->x1,
- channel->y2 - channel->y1));
+ rect.x = channel->x1;
+ rect.y = channel->y1;
+ rect.width = channel->x2 - channel->x1;
+ rect.height = channel->y2 - channel->y1;
}
else
{
- gegl_buffer_clear (gimp_drawable_get_buffer (GIMP_DRAWABLE (channel)),
- NULL);
+ rect.x = 0;
+ rect.y = 0;
+ rect.width = gimp_item_get_width (GIMP_ITEM (channel));
+ rect.height = gimp_item_get_height (GIMP_ITEM (channel));
}
+ gimp_gegl_rectangle_align_to_tile_grid (&aligned_rect, &rect, buffer);
+
+ gegl_buffer_clear (buffer, &aligned_rect);
+
/* we know the bounds */
channel->bounds_known = TRUE;
channel->empty = TRUE;
@@ -1287,7 +1303,8 @@ gimp_channel_real_clear (GimpChannel *channel,
channel->x2 = gimp_item_get_width (GIMP_ITEM (channel));
channel->y2 = gimp_item_get_height (GIMP_ITEM (channel));
- gimp_drawable_update (GIMP_DRAWABLE (channel), 0, 0, -1, -1);
+ gimp_drawable_update (GIMP_DRAWABLE (channel),
+ rect.x, rect.y, rect.width, rect.height);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]