aboutsummaryrefslogtreecommitdiff
path: root/libstorycode/narrative.c
diff options
context:
space:
mode:
Diffstat (limited to 'libstorycode/narrative.c')
-rw-r--r--libstorycode/narrative.c77
1 files changed, 76 insertions, 1 deletions
diff --git a/libstorycode/narrative.c b/libstorycode/narrative.c
index 18e2203..8cb54c3 100644
--- a/libstorycode/narrative.c
+++ b/libstorycode/narrative.c
@@ -41,8 +41,29 @@ Narrative *narrative_new()
return n;
}
+
+static void narrative_item_destroy(struct narrative_item *item)
+{
+ free(item->text);
+#ifdef HAVE_PANGO
+ if ( item->layout != NULL ) {
+ g_object_unref(item->layout);
+ }
+#endif
+#ifdef HAVE_CAIRO
+ if ( item->slide_thumbnail != NULL ) {
+ cairo_surface_destroy(item->slide_thumbnail);
+ }
+#endif
+}
+
+
void narrative_free(Narrative *n)
{
+ int i;
+ for ( i=0; i<n->n_items; i++ ) {
+ narrative_item_destroy(&n->items[i]);
+ }
free(n->items);
free(n);
}
@@ -51,10 +72,16 @@ void narrative_free(Narrative *n)
static struct narrative_item *add_item(Narrative *n)
{
struct narrative_item *new_items;
+ struct narrative_item *item;
new_items = realloc(n->items, (n->n_items+1)*sizeof(struct narrative_item));
if ( new_items == NULL ) return NULL;
n->items = new_items;
- return &n->items[n->n_items++];
+ item = &n->items[n->n_items++];
+ item->layout = NULL;
+ item->text = NULL;
+ item->slide = NULL;
+ item->slide_thumbnail = NULL;
+ return item;
}
@@ -111,3 +138,51 @@ void narrative_add_slide(Narrative *n, Slide *slide)
item->slide = slide;
item->slide_thumbnail = NULL;
}
+
+
+static void delete_item(Narrative *n, int del)
+{
+ int i;
+ narrative_item_destroy(&n->items[del]);
+ for ( i=del; i<n->n_items-1; i++ ) {
+ n->items[i] = n->items[i+1];
+ }
+ n->n_items--;
+}
+
+
+/* Delete from item i1 offset o1 to item i2 offset o2, inclusive */
+void narrative_delete_block(Narrative *n, int i1, size_t o1, int i2, size_t o2)
+{
+ int i;
+
+ /* Starting item */
+ if ( n->items[i1].type == NARRATIVE_ITEM_SLIDE ) {
+ delete_item(n, i1);
+ i1--;
+ i2--;
+ } else {
+ if ( i1 == i2 ) {
+ memmove(&n->items[i1].text[o1],
+ &n->items[i1].text[o2],
+ strlen(n->items[i1].text)-o2+1);
+ return; /* easy case */
+ } else {
+ n->items[i1].text[o1] = '\0';
+ }
+ }
+
+ /* Middle items */
+ for ( i=i1+1; i<i2; i++ ) {
+ delete_item(n, i);
+ i2--;
+ }
+
+ /* Last item */
+ if ( n->items[i2].type == NARRATIVE_ITEM_SLIDE ) {
+ delete_item(n, i2);
+ } else {
+ memmove(&n->items[i2].text[0],
+ &n->items[i2].text[o2], o2);
+ }
+}