From cc22260c8e70e01b8944ad1c62e20a65ffe9876f Mon Sep 17 00:00:00 2001 From: Thomas White Date: Tue, 14 Jan 2020 23:11:56 +0100 Subject: Add narrative_get_item_range() --- libstorycode/narrative_render_cairo.c | 32 ++++++++++++++++++++++++++++++++ libstorycode/narrative_render_cairo.h | 3 +++ 2 files changed, 35 insertions(+) diff --git a/libstorycode/narrative_render_cairo.c b/libstorycode/narrative_render_cairo.c index e00ea78..f23f18c 100644 --- a/libstorycode/narrative_render_cairo.c +++ b/libstorycode/narrative_render_cairo.c @@ -505,6 +505,38 @@ int narrative_render_item_cairo(Narrative*n, cairo_t *cr, int i) } +/* Given a y-coordinate range, works out which range of items (inclusive) + * are at least partially within the range */ +void narrative_get_item_range(Narrative *n, double min_y, double max_y, + int *start_item, int *end_item) +{ + int i; + double hpos = 0.0; + + *start_item = n->n_items; + for ( i=0; in_items; i++ ) { + + double cur_h = narrative_item_get_height(n, i); + + if ( hpos + cur_h < min_y ) goto next; + + if ( *start_item == n->n_items ) { + *start_item = i; + } + + if ( hpos > max_y ) { + *end_item = i -1; + return; + } +next: + hpos += cur_h; + + } + + *end_item = n->n_items - 1; +} + + /* NB You must first call narrative_wrap() */ int narrative_render_cairo(Narrative *n, cairo_t *cr, Stylesheet *stylesheet, ImageStore *is, double min_y, double max_y) diff --git a/libstorycode/narrative_render_cairo.h b/libstorycode/narrative_render_cairo.h index 0da0ce6..265b3d9 100644 --- a/libstorycode/narrative_render_cairo.h +++ b/libstorycode/narrative_render_cairo.h @@ -55,4 +55,7 @@ extern int narrative_render_cairo(Narrative *n, cairo_t *cr, Stylesheet *stylesh extern void narrative_sort_positions(struct edit_pos *a, struct edit_pos *b); +extern void narrative_get_item_range(Narrative *n, double min_y, double max_y, + int *start_item, int *end_item); + #endif /* NARRATIVE_RENDER_CAIRO_H */ -- cgit v1.2.3