summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ganv/canvas-base.h6
-rw-r--r--src/canvas-base.c82
2 files changed, 26 insertions, 62 deletions
diff --git a/ganv/canvas-base.h b/ganv/canvas-base.h
index 80afc8c..1543841 100644
--- a/ganv/canvas-base.h
+++ b/ganv/canvas-base.h
@@ -480,12 +480,6 @@ void ganv_canvas_base_update_now(GanvCanvasBase* canvas);
*/
GanvItem* ganv_canvas_base_get_item_at(GanvCanvasBase* canvas, double x, double y);
-/* For use only by item type implementations. Request that the canvas eventually
- * redraw the specified region. The region is specified as a microtile
- * array. This function takes over responsibility for freeing the uta argument.
- */
-void ganv_canvas_base_request_redraw_uta(GanvCanvasBase* canvas, ArtUta* uta);
-
/* For use only by item type implementations. Request that the canvas
* eventually redraw the specified region, specified in canvas pixel
* coordinates. The region contains (x1, y1) but not (x2, y2).
diff --git a/src/canvas-base.c b/src/canvas-base.c
index ec55d99..d8cb534 100644
--- a/src/canvas-base.c
+++ b/src/canvas-base.c
@@ -2836,11 +2836,8 @@ ganv_canvas_base_expose(GtkWidget* widget, GdkEventExpose* event)
rect.y1 = rects[i].y + rects[i].height - canvas->zoom_yofs;
if (canvas->need_update || canvas->need_redraw) {
- ArtUta* uta;
-
/* Update or drawing is scheduled, so just mark exposed area as dirty */
- uta = art_uta_from_irect(&rect);
- ganv_canvas_base_request_redraw_uta(canvas, uta);
+ ganv_canvas_base_request_redraw(canvas, rect.x0, rect.y0, rect.x1, rect.y1);
} else {
/* No pending updates, draw exposed area immediately */
ganv_canvas_base_paint_rect(canvas, rect.x0, rect.y0, rect.x1, rect.y1);
@@ -3464,31 +3461,45 @@ get_visible_region(GanvCanvasBase* canvas, ArtIRect* visible)
}
/**
- * ganv_canvas_base_request_redraw_uta:
+ * ganv_canvas_base_request_redraw:
* @canvas: A canvas.
- * @uta: Microtile array that specifies the area to be redrawn. It will
- * be freed by this function, so the argument you pass will be invalid
- * after you call this function.
+ * @x1: Leftmost coordinate of the rectangle to be redrawn.
+ * @y1: Upper coordinate of the rectangle to be redrawn.
+ * @x2: Rightmost coordinate of the rectangle to be redrawn, plus 1.
+ * @y2: Lower coordinate of the rectangle to be redrawn, plus 1.
*
- * Informs a canvas that the specified area, given as a microtile array, needs
- * to be repainted. To be used only by item implementations.
+ * Informs a canvas that the specified area needs to be repainted. To be used
+ * only by item implementations.
**/
void
-ganv_canvas_base_request_redraw_uta(GanvCanvasBase* canvas,
- ArtUta* uta)
+ganv_canvas_base_request_redraw(GanvCanvasBase* canvas, int x1, int y1, int x2, int y2)
{
+ ArtUta* uta;
+ ArtIRect bbox;
ArtIRect visible;
+ ArtIRect clip;
g_return_if_fail(GANV_IS_CANVAS_BASE(canvas));
- g_return_if_fail(uta != NULL);
- if (!GTK_WIDGET_DRAWABLE(canvas)) {
- art_uta_free(uta);
+ if (!GTK_WIDGET_DRAWABLE(canvas) || (x1 >= x2) || (y1 >= y2)) {
return;
}
+ bbox.x0 = x1;
+ bbox.y0 = y1;
+ bbox.x1 = x2;
+ bbox.y1 = y2;
+
get_visible_region(canvas, &visible);
+ art_irect_intersect(&clip, &bbox, &visible);
+
+ if (art_irect_empty(&clip)) {
+ return;
+ }
+
+ uta = art_uta_from_irect(&clip);
+
if (canvas->need_redraw) {
ArtUta* new_uta;
@@ -3518,48 +3529,7 @@ ganv_canvas_base_request_redraw_uta(GanvCanvasBase* canvas,
canvas->need_redraw = TRUE;
add_idle(canvas);
}
-}
-/**
- * ganv_canvas_base_request_redraw:
- * @canvas: A canvas.
- * @x1: Leftmost coordinate of the rectangle to be redrawn.
- * @y1: Upper coordinate of the rectangle to be redrawn.
- * @x2: Rightmost coordinate of the rectangle to be redrawn, plus 1.
- * @y2: Lower coordinate of the rectangle to be redrawn, plus 1.
- *
- * Convenience function that informs a canvas that the specified rectangle needs
- * to be repainted. This function converts the rectangle to a microtile array
- * and feeds it to ganv_canvas_base_request_redraw_uta(). The rectangle includes
- * @x1 and @y1, but not @x2 and @y2. To be used only by item implementations.
- **/
-void
-ganv_canvas_base_request_redraw(GanvCanvasBase* canvas, int x1, int y1, int x2, int y2)
-{
- ArtUta* uta;
- ArtIRect bbox;
- ArtIRect visible;
- ArtIRect clip;
-
- g_return_if_fail(GANV_IS_CANVAS_BASE(canvas));
-
- if (!GTK_WIDGET_DRAWABLE(canvas) || (x1 >= x2) || (y1 >= y2)) {
- return;
- }
-
- bbox.x0 = x1;
- bbox.y0 = y1;
- bbox.x1 = x2;
- bbox.y1 = y2;
-
- get_visible_region(canvas, &visible);
-
- art_irect_intersect(&clip, &bbox, &visible);
-
- if (!art_irect_empty(&clip)) {
- uta = art_uta_from_irect(&clip);
- ganv_canvas_base_request_redraw_uta(canvas, uta);
- }
}
/**