aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.me.uk>2019-12-06 22:59:44 +0100
committerThomas White <taw@bitwiz.me.uk>2019-12-06 22:59:44 +0100
commit8afb702e583c2dfc8a72e9647870a1f1da0a8ff2 (patch)
treeb3f74681e2729097081536f728f2f803d8fdf4be
parentbbc6b6deaaa4a467c9f66e4200d769648f231450 (diff)
Defer rendering of slide thumbnails until the first time they're drawn
-rw-r--r--libstorycode/gtk/gtknarrativeview.c1
-rw-r--r--libstorycode/narrative_render_cairo.c20
-rw-r--r--libstorycode/narrative_render_cairo.h4
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 */