aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.me.uk>2020-01-14 23:11:56 +0100
committerThomas White <taw@bitwiz.me.uk>2020-01-14 23:11:56 +0100
commitcc22260c8e70e01b8944ad1c62e20a65ffe9876f (patch)
tree15aa10da198d3e426acc6d399fa39f158d054985
parentb2660879dc21df26ad12526072a75726091225e5 (diff)
Add narrative_get_item_range()
-rw-r--r--libstorycode/narrative_render_cairo.c32
-rw-r--r--libstorycode/narrative_render_cairo.h3
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 */