From 8afb702e583c2dfc8a72e9647870a1f1da0a8ff2 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Fri, 6 Dec 2019 22:59:44 +0100 Subject: Defer rendering of slide thumbnails until the first time they're drawn --- libstorycode/gtk/gtknarrativeview.c | 1 + libstorycode/narrative_render_cairo.c | 20 +++++++++++++++----- libstorycode/narrative_render_cairo.h | 4 ++-- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/libstorycode/gtk/gtknarrativeview.c b/libstorycode/gtk/gtknarrativeview.c index e13e106..97da45b 100644 --- a/libstorycode/gtk/gtknarrativeview.c +++ b/libstorycode/gtk/gtknarrativeview.c @@ -610,6 +610,7 @@ static gboolean gtknv_draw_sig(GtkWidget *da, cairo_t *cr, GtkNarrativeView *e) /* Contents */ narrative_render_cairo(e->n, cr, narrative_get_stylesheet(e->n), + narrative_get_imagestore(e->n), e->scroll_pos, e->scroll_pos+e->visible_height); /* Editing overlay */ diff --git a/libstorycode/narrative_render_cairo.c b/libstorycode/narrative_render_cairo.c index 0e65878..e38d43f 100644 --- a/libstorycode/narrative_render_cairo.c +++ b/libstorycode/narrative_render_cairo.c @@ -157,7 +157,7 @@ static cairo_surface_t *render_thumbnail(Slide *s, Stylesheet *ss, ImageStore *i } -static void wrap_slide(struct narrative_item *item, Stylesheet *ss, ImageStore *is, int sel_block) +static void wrap_slide(struct narrative_item *item, Stylesheet *ss, int sel_block) { double w, h; @@ -168,8 +168,7 @@ static void wrap_slide(struct narrative_item *item, Stylesheet *ss, ImageStore * if ( item->slide_thumbnail != NULL ) { cairo_surface_destroy(item->slide_thumbnail); } - item->slide_thumbnail = render_thumbnail(item->slide, ss, is, - item->obj_w, item->obj_h); + item->slide_thumbnail = NULL; item->selected = sel_block; } @@ -340,7 +339,7 @@ int narrative_wrap_range(Narrative *n, Stylesheet *stylesheet, PangoLanguage *la break; case NARRATIVE_ITEM_SLIDE : - wrap_slide(&n->items[i], stylesheet, is, sel_block); + wrap_slide(&n->items[i], stylesheet, sel_block); break; case NARRATIVE_ITEM_EOP : @@ -493,7 +492,7 @@ int narrative_render_item_cairo(Narrative*n, cairo_t *cr, int i) /* NB You must first call narrative_wrap() */ -int narrative_render_cairo(Narrative *n, cairo_t *cr, Stylesheet *stylesheet, +int narrative_render_cairo(Narrative *n, cairo_t *cr, Stylesheet *stylesheet, ImageStore *is, double min_y, double max_y) { int i, r; @@ -543,7 +542,18 @@ int narrative_render_cairo(Narrative *n, cairo_t *cr, Stylesheet *stylesheet, double cur_h = narrative_item_get_height(n, i); if ( (hpos + cur_h > min_y) && (hpos < max_y) ) { + struct narrative_item *item = &n->items[i]; + + /* If this is a slide, make sure the thumbnail has been rendered */ + if ( (item->type == NARRATIVE_ITEM_SLIDE) + && (item->slide_thumbnail == NULL) ) + { + item->slide_thumbnail = render_thumbnail(item->slide, stylesheet, is, + item->obj_w, item->obj_h); + } + narrative_render_item_cairo(n, cr, i); + } /* else paragraph is not visible */ cairo_translate(cr, 0.0, cur_h); diff --git a/libstorycode/narrative_render_cairo.h b/libstorycode/narrative_render_cairo.h index 5234357..4933078 100644 --- a/libstorycode/narrative_render_cairo.h +++ b/libstorycode/narrative_render_cairo.h @@ -50,7 +50,7 @@ extern size_t narrative_pos_trail_to_offset(Narrative *n, int i, int offs, int t extern int narrative_render_item_cairo(Narrative*n, cairo_t *cr, int i); -extern int narrative_render_cairo(Narrative *n, cairo_t *cr, - Stylesheet *stylesheet, double min_y, double max_y); +extern int narrative_render_cairo(Narrative *n, cairo_t *cr, Stylesheet *stylesheet, ImageStore *is, + double min_y, double max_y); #endif /* NARRATIVE_RENDER_CAIRO_H */ -- cgit v1.2.3