From e4a03dc0ca94ad2d9ca9b74b7ce16405b40b844f Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Mon, 31 Dec 2018 22:18:19 -0800 Subject: [PATCH] psppire-output-view: Render only the visible parts of tables. This greatly improves scrolling performance for large tables. --- src/output/cairo.c | 7 ++++--- src/output/cairo.h | 3 ++- src/ui/gui/psppire-output-view.c | 7 ++++++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/output/cairo.c b/src/output/cairo.c index 61944624a7..7c6cf925c6 100644 --- a/src/output/cairo.c +++ b/src/output/cairo.c @@ -1446,7 +1446,8 @@ static void xr_draw_chart (const struct chart_item *, cairo_t *, /* Draws onto CR */ void -xr_rendering_draw_all (struct xr_rendering *r, cairo_t *cr) +xr_rendering_draw (struct xr_rendering *r, cairo_t *cr, + int x0, int y0, int x1, int y1) { if (is_table_item (r->item)) { @@ -1454,8 +1455,8 @@ xr_rendering_draw_all (struct xr_rendering *r, cairo_t *cr) xr_set_cairo (xr, cr); - render_pager_draw (r->p); - + render_pager_draw_region (r->p, x0 * XR_POINT, y0 * XR_POINT, + (x1 - x0) * XR_POINT, (y1 - y0) * XR_POINT); } else xr_draw_chart (to_chart_item (r->item), cr, diff --git a/src/output/cairo.h b/src/output/cairo.h index 425811b450..a5fea7f7f2 100644 --- a/src/output/cairo.h +++ b/src/output/cairo.h @@ -42,7 +42,8 @@ void xr_rendering_destroy (struct xr_rendering *); void xr_rendering_apply_options (struct xr_rendering *, struct string_map *o); void xr_rendering_measure (struct xr_rendering *, int *w, int *h); -void xr_rendering_draw_all (struct xr_rendering *r, cairo_t *cr); +void xr_rendering_draw (struct xr_rendering *r, cairo_t *cr, + int x0, int y0, int x1, int y1); /* Functions for rendering a series of output items to a series of Cairo contexts, with pagination, possibly including headers. diff --git a/src/ui/gui/psppire-output-view.c b/src/ui/gui/psppire-output-view.c index 6f69819cd8..fc660896d1 100644 --- a/src/ui/gui/psppire-output-view.c +++ b/src/ui/gui/psppire-output-view.c @@ -104,8 +104,13 @@ layout_draw_callback (GtkWidget *widget, cairo_t *cr, gpointer data) static gboolean draw_callback (GtkWidget *widget, cairo_t *cr, gpointer data) { + GdkRectangle clip; + if (!gdk_cairo_get_clip_rectangle (cr, &clip)) + return TRUE; + struct xr_rendering *r = g_object_get_data (G_OBJECT (widget), "rendering"); - xr_rendering_draw_all (r, cr); + xr_rendering_draw (r, cr, clip.x, clip.y, + clip.x + clip.width, clip.y + clip.height); return TRUE; } -- 2.30.2