[gimp] app: keep the draw tool's items around in a GimpCanvasGroup
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: keep the draw tool's items around in a GimpCanvasGroup
- Date: Sat, 25 Sep 2010 15:20:47 +0000 (UTC)
commit df44ced093f797e895c32d6e23a5132e77559829
Author: Michael Natterer <mitch gimp org>
Date: Sat Sep 25 17:20:08 2010 +0200
app: keep the draw tool's items around in a GimpCanvasGroup
which reduces the number of invalidations on the canvas to one.
app/tools/gimpdrawtool.c | 55 +++++++++++++++++++++-------------------------
app/tools/gimpdrawtool.h | 2 +-
2 files changed, 26 insertions(+), 31 deletions(-)
---
diff --git a/app/tools/gimpdrawtool.c b/app/tools/gimpdrawtool.c
index b959c4f..09c42c4 100644
--- a/app/tools/gimpdrawtool.c
+++ b/app/tools/gimpdrawtool.c
@@ -36,6 +36,7 @@
#include "display/gimpcanvasarc.h"
#include "display/gimpcanvasboundary.h"
#include "display/gimpcanvascorner.h"
+#include "display/gimpcanvasgroup.h"
#include "display/gimpcanvasguide.h"
#include "display/gimpcanvashandle.h"
#include "display/gimpcanvasline.h"
@@ -106,7 +107,7 @@ gimp_draw_tool_init (GimpDrawTool *draw_tool)
{
draw_tool->display = NULL;
draw_tool->paused_count = 0;
- draw_tool->items = NULL;
+ draw_tool->item = NULL;
}
static void
@@ -172,35 +173,38 @@ static void
gimp_draw_tool_add_item (GimpDrawTool *draw_tool,
GimpCanvasItem *item)
{
- draw_tool->items = g_list_append (draw_tool->items, g_object_ref (item));
+ if (! draw_tool->item)
+ draw_tool->item = gimp_canvas_group_new ();
+
+ gimp_canvas_group_add_item (GIMP_CANVAS_GROUP (draw_tool->item), item);
}
static void
gimp_draw_tool_clear_items (GimpDrawTool *draw_tool)
{
- if (draw_tool->items)
+ if (draw_tool->item)
{
- g_list_foreach (draw_tool->items, (GFunc) g_object_unref, NULL);
- g_list_free (draw_tool->items);
- draw_tool->items = NULL;
+ g_object_unref (draw_tool->item);
+ draw_tool->item = NULL;
}
}
static void
gimp_draw_tool_invalidate_items (GimpDrawTool *draw_tool)
{
- GimpDisplayShell *shell = gimp_display_get_shell (draw_tool->display);
- GdkWindow *window = gtk_widget_get_window (shell->canvas);
- GList *list;
-
- for (list = draw_tool->items; list; list = g_list_next (list))
+ if (draw_tool->item)
{
- GimpCanvasItem *item = list->data;
- GdkRegion *region;
+ GimpDisplayShell *shell = gimp_display_get_shell (draw_tool->display);
+ GdkWindow *window = gtk_widget_get_window (shell->canvas);
+ GdkRegion *region;
+
+ region = gimp_canvas_item_get_extents (draw_tool->item, shell);
- region = gimp_canvas_item_get_extents (item, shell);
- gdk_window_invalidate_region (window, region, TRUE);
- gdk_region_destroy (region);
+ if (region)
+ {
+ gdk_window_invalidate_region (window, region, TRUE);
+ gdk_region_destroy (region);
+ }
}
}
@@ -289,25 +293,16 @@ void
gimp_draw_tool_draw_items (GimpDrawTool *draw_tool,
cairo_t *cr)
{
- GimpDisplayShell *shell;
- GdkWindow *window;
- GList *list;
-
g_return_if_fail (GIMP_IS_DRAW_TOOL (draw_tool));
g_return_if_fail (cr != NULL);
- if (! gimp_draw_tool_is_active (draw_tool) ||
- draw_tool->paused_count > 0)
- return;
-
- shell = gimp_display_get_shell (draw_tool->display);
- window = gtk_widget_get_window (shell->canvas);
-
- for (list = draw_tool->items; list; list = g_list_next (list))
+ if (draw_tool->item &&
+ gimp_draw_tool_is_active (draw_tool) &&
+ draw_tool->paused_count == 0)
{
- GimpCanvasItem *item = list->data;
+ GimpDisplayShell *shell = gimp_display_get_shell (draw_tool->display);
- gimp_canvas_item_draw (item, shell, cr);
+ gimp_canvas_item_draw (draw_tool->item, shell, cr);
}
}
diff --git a/app/tools/gimpdrawtool.h b/app/tools/gimpdrawtool.h
index e10775b..32d9c55 100644
--- a/app/tools/gimpdrawtool.h
+++ b/app/tools/gimpdrawtool.h
@@ -42,7 +42,7 @@ struct _GimpDrawTool
gint paused_count; /* count to keep track of multiple pauses */
- GList *items;
+ GimpCanvasItem *item;
};
struct _GimpDrawToolClass
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]