psppire-output-view: Render only the visible parts of tables.
authorBen Pfaff <blp@cs.stanford.edu>
Tue, 1 Jan 2019 06:18:19 +0000 (22:18 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Tue, 1 Jan 2019 06:19:40 +0000 (22:19 -0800)
This greatly improves scrolling performance for large tables.

src/output/cairo.c
src/output/cairo.h
src/ui/gui/psppire-output-view.c

index 61944624a7ee088f040349e591ada53edd4468ba..7c6cf925c64ee2418cef9966066729c987637c0a 100644 (file)
@@ -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,
index 425811b450ff89e37260e52342040609389c1d7a..a5fea7f7f244d7aedf00a903f5ed0c3adf3a6210 100644 (file)
@@ -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.
index 6f69819cd8a7e1660b414fa21964a9f1c74d38d7..fc660896d155a98437143ca5d74f961e6097fac7 100644 (file)
@@ -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;
 }