From 891e3c9bff47bde012672aa699280400124d2447 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Thu, 21 Mar 2019 23:21:41 +0100 Subject: Expose SlideItem as an opaque type --- libstorycode/gtk/gtkslideview.c | 22 ++++----- libstorycode/gtk/gtkslideview.h | 2 +- libstorycode/slide.c | 96 ++++++++++++++++++++++++++++++++++++--- libstorycode/slide.h | 9 ++++ libstorycode/slide_priv.c | 80 -------------------------------- libstorycode/slide_priv.h | 12 +---- libstorycode/slide_render_cairo.c | 4 +- meson.build | 1 - 8 files changed, 114 insertions(+), 112 deletions(-) diff --git a/libstorycode/gtk/gtkslideview.c b/libstorycode/gtk/gtkslideview.c index 4a0102f..f3d7d59 100644 --- a/libstorycode/gtk/gtkslideview.c +++ b/libstorycode/gtk/gtkslideview.c @@ -118,7 +118,7 @@ static gint destroy_sig(GtkWidget *window, GtkSlideView *e) } -static void draw_editing_box(cairo_t *cr, struct slide_item *item, +static void draw_editing_box(cairo_t *cr, SlideItem *item, Stylesheet *stylesheet, double slide_w, double slide_h, double xmin, double ymin, double width, double height) { @@ -157,7 +157,7 @@ static void draw_resize_handle(cairo_t *cr, double x, double y) } -static size_t pos_trail_to_offset(struct slide_item *item, int para, +static size_t pos_trail_to_offset(SlideItem *item, int para, size_t offs, int trail) { glong char_offs; @@ -171,7 +171,7 @@ static size_t pos_trail_to_offset(struct slide_item *item, int para, } -static double para_top(struct slide_item *item, int pnum) +static double para_top(SlideItem *item, int pnum) { int i; double py = 0.0; @@ -184,7 +184,7 @@ static double para_top(struct slide_item *item, int pnum) } -static int get_cursor_pos(struct slide_item *item, Stylesheet *stylesheet, +static int get_cursor_pos(SlideItem *item, Stylesheet *stylesheet, struct slide_pos cpos, double slide_w, double slide_h, double *x, double *y, double *h) { @@ -210,7 +210,7 @@ static int get_cursor_pos(struct slide_item *item, Stylesheet *stylesheet, static void draw_caret(cairo_t *cr, Stylesheet *stylesheet, - struct slide_item *item, struct slide_pos cpos, + SlideItem *item, struct slide_pos cpos, double frx, double fry, double slide_w, double slide_h) { double cx, clow, chigh, h; @@ -335,7 +335,7 @@ static gboolean draw_sig(GtkWidget *da, cairo_t *cr, GtkSlideView *e) } -static int within_frame(struct slide_item *item, Stylesheet *ss, +static int within_frame(SlideItem *item, Stylesheet *ss, double slide_w, double slide_h, double xp, double yp) { @@ -351,7 +351,7 @@ static int within_frame(struct slide_item *item, Stylesheet *ss, } -static struct slide_item *find_frame_at_position(Slide *s, Stylesheet *ss, +static SlideItem *find_frame_at_position(Slide *s, Stylesheet *ss, double slide_w, double slide_h, double x, double y) { @@ -524,7 +524,7 @@ static int is_text(enum slide_item_type type) } -static int find_cursor(struct slide_item *item, Stylesheet *stylesheet, +static int find_cursor(SlideItem *item, Stylesheet *stylesheet, double x, double y, struct slide_pos *pos, double slide_w, double slide_h) { @@ -632,7 +632,7 @@ static gboolean button_press_sig(GtkWidget *da, GdkEventButton *event, enum drag_corner c; gdouble x, y; Stylesheet *stylesheet; - struct slide_item *clicked; + SlideItem *clicked; int shift; double slide_w, slide_h; double frx, fry, frw, frh; @@ -879,7 +879,7 @@ static gboolean button_release_sig(GtkWidget *da, GdkEventButton *event, } -static size_t end_offset_of_para(struct slide_item *item, int pnum) +static size_t end_offset_of_para(SlideItem *item, int pnum) { assert(pnum >= 0); if ( is_text(item->type) ) return 0; @@ -945,7 +945,7 @@ static int slide_positions_equal(struct slide_pos a, struct slide_pos b) } -static void insert_text_in_paragraph(struct slide_item *item, int para, +static void insert_text_in_paragraph(SlideItem *item, int para, size_t offs, char *t) { char *n = malloc(strlen(t) + strlen(item->paragraphs[para]) + 1); diff --git a/libstorycode/gtk/gtkslideview.h b/libstorycode/gtk/gtkslideview.h index 610463d..0221fca 100644 --- a/libstorycode/gtk/gtkslideview.h +++ b/libstorycode/gtk/gtkslideview.h @@ -105,7 +105,7 @@ struct _gtkslideview double visible_height; /* Location of the cursor */ - struct slide_item *cursor_frame; + SlideItem *cursor_frame; struct slide_pos cpos; /* Border surrounding actual slide within drawingarea */ diff --git a/libstorycode/slide.c b/libstorycode/slide.c index f24e713..959693d 100644 --- a/libstorycode/slide.c +++ b/libstorycode/slide.c @@ -52,12 +52,12 @@ void slide_free(Slide *s) } -static struct slide_item *add_item(Slide *s) +static SlideItem *add_item(Slide *s) { - struct slide_item *new_items; - struct slide_item *item; + SlideItem *new_items; + SlideItem *item; - new_items = realloc(s->items, (s->n_items+1)*sizeof(struct slide_item)); + new_items = realloc(s->items, (s->n_items+1)*sizeof(SlideItem)); if ( new_items == NULL ) return NULL; s->items = new_items; item = &s->items[s->n_items++]; @@ -70,7 +70,7 @@ static struct slide_item *add_item(Slide *s) int slide_add_image(Slide *s, char *filename, struct frame_geom geom) { - struct slide_item *item; + SlideItem *item; item = add_item(s); if ( item == NULL ) return 1; @@ -88,7 +88,7 @@ int add_text_item(Slide *s, char **text, int n_text, struct frame_geom geom, enum alignment alignment, enum slide_item_type slide_item) { int i; - struct slide_item *item; + SlideItem *item; item = add_item(s); if ( item == NULL ) return 1; @@ -122,7 +122,7 @@ int add_text_item(Slide *s, char **text, int n_text, struct frame_geom geom, int slide_add_footer(Slide *s) { - struct slide_item *item; + SlideItem *item; item = add_item(s); if ( item == NULL ) return 1; @@ -225,3 +225,85 @@ int slide_get_logical_size(Slide *s, Stylesheet *ss, double *w, double *h) *h = s->logical_h; return 0; } + + +static enum style_element styel_for_slideitem(enum slide_item_type t) +{ + switch ( t ) { + + case SLIDE_ITEM_TEXT : + return STYEL_SLIDE_TEXT; + + case SLIDE_ITEM_IMAGE : + return STYEL_SLIDE_IMAGE; + + case SLIDE_ITEM_PRESTITLE : + return STYEL_SLIDE_PRESTITLE; + + case SLIDE_ITEM_SLIDETITLE : + return STYEL_SLIDE_SLIDETITLE; + + case SLIDE_ITEM_FOOTER : + return STYEL_SLIDE_FOOTER; + + } + + fprintf(stderr, "Invalid slide item %i\n", t); + return STYEL_SLIDE_TEXT; +} + + +static double lcalc(struct length l, double pd) +{ + if ( l.unit == LENGTH_UNIT ) { + return l.len; + } else { + return l.len * pd; + } +} + + +void slide_item_get_geom(SlideItem *item, Stylesheet *ss, + double *x, double *y, double *w, double *h, + double slide_w, double slide_h) +{ + struct frame_geom geom; + + if ( (item->type == SLIDE_ITEM_TEXT) + || (item->type == SLIDE_ITEM_IMAGE) ) + { + geom = item->geom; + } else { + if ( stylesheet_get_geometry(ss, styel_for_slideitem(item->type), &geom) ) { + *x = 0.0; *y = 0.0; + *w = 0.0; *h = 0.0; + return; + } + } + + *x = lcalc(geom.x, slide_w); + *y = lcalc(geom.y, slide_h); + *w = lcalc(geom.w, slide_w); + *h = lcalc(geom.h, slide_h); +} + + +void slide_item_get_padding(SlideItem *item, Stylesheet *ss, + double *l, double *r, double *t, double *b, + double slide_w, double slide_h) +{ + struct length padding[4]; + double frx, fry, frw, frh; + + if ( stylesheet_get_padding(ss, styel_for_slideitem(item->type), padding) ) { + *l = 0.0; *r = 0.0; *t = 0.0; *b = 0.0; + return; + } + + slide_item_get_geom(item, ss, &frx, &fry, &frw, &frh, slide_w, slide_h); + + *l = lcalc(padding[0], frw); + *r = lcalc(padding[1], frh); + *t = lcalc(padding[2], frw); + *b = lcalc(padding[3], frh); +} diff --git a/libstorycode/slide.h b/libstorycode/slide.h index e9e5875..6242d08 100644 --- a/libstorycode/slide.h +++ b/libstorycode/slide.h @@ -45,6 +45,15 @@ extern int slide_set_logical_size(Slide *s, double w, double h); extern int slide_get_logical_size(Slide *s, Stylesheet *ss, double *w, double *h); +/* Slide items */ +extern void slide_item_get_geom(SlideItem *item, Stylesheet *ss, + double *x, double *y, double *w, double *h, + double slide_w, double slide_h); + +extern void slide_item_get_padding(SlideItem *item, Stylesheet *ss, + double *l, double *r, double *t, double *b, + double slide_w, double slide_h); + /* For debugging, not really part of API */ extern void describe_slide(Slide *s); diff --git a/libstorycode/slide_priv.c b/libstorycode/slide_priv.c index f3cf14c..efe502b 100644 --- a/libstorycode/slide_priv.c +++ b/libstorycode/slide_priv.c @@ -24,83 +24,3 @@ #include "slide_priv.h" -static double lcalc(struct length l, double pd) -{ - if ( l.unit == LENGTH_UNIT ) { - return l.len; - } else { - return l.len * pd; - } -} - - -static enum style_element styel_for_slideitem(enum slide_item_type t) -{ - switch ( t ) { - - case SLIDE_ITEM_TEXT : - return STYEL_SLIDE_TEXT; - - case SLIDE_ITEM_IMAGE : - return STYEL_SLIDE_IMAGE; - - case SLIDE_ITEM_PRESTITLE : - return STYEL_SLIDE_PRESTITLE; - - case SLIDE_ITEM_SLIDETITLE : - return STYEL_SLIDE_SLIDETITLE; - - case SLIDE_ITEM_FOOTER : - return STYEL_SLIDE_FOOTER; - - } - - fprintf(stderr, "Invalid slide item %i\n", t); - return STYEL_SLIDE_TEXT; -} - - -void slide_item_get_geom(struct slide_item *item, Stylesheet *ss, - double *x, double *y, double *w, double *h, - double slide_w, double slide_h) -{ - struct frame_geom geom; - - if ( (item->type == SLIDE_ITEM_TEXT) - || (item->type == SLIDE_ITEM_IMAGE) ) - { - geom = item->geom; - } else { - if ( stylesheet_get_geometry(ss, styel_for_slideitem(item->type), &geom) ) { - *x = 0.0; *y = 0.0; - *w = 0.0; *h = 0.0; - return; - } - } - - *x = lcalc(geom.x, slide_w); - *y = lcalc(geom.y, slide_h); - *w = lcalc(geom.w, slide_w); - *h = lcalc(geom.h, slide_h); -} - - -void slide_item_get_padding(struct slide_item *item, Stylesheet *ss, - double *l, double *r, double *t, double *b, - double slide_w, double slide_h) -{ - struct length padding[4]; - double frx, fry, frw, frh; - - if ( stylesheet_get_padding(ss, styel_for_slideitem(item->type), padding) ) { - *l = 0.0; *r = 0.0; *t = 0.0; *b = 0.0; - return; - } - - slide_item_get_geom(item, ss, &frx, &fry, &frw, &frh, slide_w, slide_h); - - *l = lcalc(padding[0], frw); - *r = lcalc(padding[1], frh); - *t = lcalc(padding[2], frw); - *b = lcalc(padding[3], frh); -} diff --git a/libstorycode/slide_priv.h b/libstorycode/slide_priv.h index 878982a..0d80663 100644 --- a/libstorycode/slide_priv.h +++ b/libstorycode/slide_priv.h @@ -39,7 +39,7 @@ enum slide_item_type }; -struct slide_item +struct _slideitem { enum slide_item_type type; @@ -65,15 +65,7 @@ struct _slide double logical_w; double logical_h; int n_items; - struct slide_item *items; + SlideItem *items; }; -extern void slide_item_get_geom(struct slide_item *item, Stylesheet *ss, - double *x, double *y, double *w, double *h, - double slide_w, double slide_h); - -extern void slide_item_get_padding(struct slide_item *item, Stylesheet *ss, - double *l, double *r, double *t, double *b, - double slide_w, double slide_h); - #endif /* SLIDE_PRIV_H */ diff --git a/libstorycode/slide_render_cairo.c b/libstorycode/slide_render_cairo.c index e74a13f..5b6bfc7 100644 --- a/libstorycode/slide_render_cairo.c +++ b/libstorycode/slide_render_cairo.c @@ -63,7 +63,7 @@ static PangoAlignment to_pangoalignment(enum alignment align) } -static void render_text(struct slide_item *item, cairo_t *cr, PangoContext *pc, +static void render_text(SlideItem *item, cairo_t *cr, PangoContext *pc, Stylesheet *ss, enum style_element el, double parent_w, double parent_h) { @@ -146,7 +146,7 @@ static void render_text(struct slide_item *item, cairo_t *cr, PangoContext *pc, } -static void render_image(struct slide_item *item, cairo_t *cr, +static void render_image(SlideItem *item, cairo_t *cr, Stylesheet *ss, ImageStore *is, double parent_w, double parent_h) { diff --git a/meson.build b/meson.build index c33cdc0..5d9d5d4 100644 --- a/meson.build +++ b/meson.build @@ -71,7 +71,6 @@ libstorycode = library('storycode', 'libstorycode/slide_render_cairo.c', 'libstorycode/narrative_render_cairo.c', 'libstorycode/imagestore.c', - 'libstorycode/slide_priv.c', storycode_lex_ch, storycode_parse_ch, ], -- cgit v1.2.3