diff options
Diffstat (limited to 'libstorycode')
-rw-r--r-- | libstorycode/narrative_render_cairo.c | 32 | ||||
-rw-r--r-- | libstorycode/narrative_render_cairo.h | 3 |
2 files changed, 35 insertions, 0 deletions
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; i<n->n_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 */ |