From b3dba22613de912b01ae27ba30c73dfe4c05a340 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Thu, 10 Nov 2011 20:59:48 +0100 Subject: Basic background object rendering --- src/slide_render.c | 48 +++++++++++++++++++++++++++++++++++++++++++----- src/stylesheet.c | 13 +++++++++++++ src/stylesheet.h | 36 ++++++++++++++++++++++++++++++++++-- 3 files changed, 90 insertions(+), 7 deletions(-) diff --git a/src/slide_render.c b/src/slide_render.c index 0eb6098..c3e5ee2 100644 --- a/src/slide_render.c +++ b/src/slide_render.c @@ -35,6 +35,45 @@ #include "stylesheet.h" +static void render_bgblock(cairo_t *cr, struct bgblock *b) +{ + GdkColor col1; + GdkColor col2; + cairo_pattern_t *patt; + + cairo_rectangle(cr, b->min_x, b->min_y, + b->max_x - b->min_x, + b->max_y - b->min_y); + + switch ( b->type ) { + + case BGBLOCK_SOLID : + gdk_color_parse(b->colour1, &col1); + gdk_cairo_set_source_color(cr, &col1); + /* FIXME: Honour alpha as well */ + cairo_fill(cr); + break; + + case BGBLOCK_GRADIENT_Y : + patt = cairo_pattern_create_linear(0.0, b->min_y, + 0.0, b->max_y); + gdk_color_parse(b->colour1, &col1); + gdk_color_parse(b->colour2, &col2); + cairo_pattern_add_color_stop_rgb(patt, 0.0, col1.red/65535.0, + col1.green/65535.0, + col1.blue/65535.0); + cairo_pattern_add_color_stop_rgb(patt, 1.0, col2.red/65535.0, + col2.green/65535.0, + col2.blue/65535.0); + cairo_set_source(cr, patt); + cairo_fill(cr); + cairo_pattern_destroy(patt); + break; + + } +} + + static cairo_surface_t *render_slide(struct slide *s, int w, int h) { cairo_surface_t *surf; @@ -44,13 +83,12 @@ static cairo_surface_t *render_slide(struct slide *s, int w, int h) surf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w, h); cr = cairo_create(surf); - - cairo_rectangle(cr, 0.0, 0.0, w, h); - cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); - cairo_fill(cr); - cairo_scale(cr, w/s->parent->slide_width, h/s->parent->slide_height); + for ( i=0; iparent->ss->n_bgblocks; i++ ) { + render_bgblock(cr, &s->parent->ss->bgblocks[i]); + } + for ( i=0; inum_objects; i++ ) { struct object *o = s->objects[i]; diff --git a/src/stylesheet.c b/src/stylesheet.c index 323b3a4..a164029 100644 --- a/src/stylesheet.c +++ b/src/stylesheet.c @@ -570,6 +570,19 @@ void default_stylesheet(StyleSheet *ss) sty->valign = V_CENTER; sty->offset_x = +200.0; sty->offset_y = -300.0; + + ss->bgblocks = malloc(sizeof(struct bgblock)); + ss->n_bgblocks = 1; + ss->bgblocks[0].type = BGBLOCK_GRADIENT_Y; + ss->bgblocks[0].min_x = 0.0; + ss->bgblocks[0].max_x = 1024.0; + ss->bgblocks[0].min_y = 0.0; + ss->bgblocks[0].max_y = 768.0; + ss->bgblocks[0].colour1 = strdup("#000000000000"); + ss->bgblocks[0].alpha1 = 1.0; + ss->bgblocks[0].colour2 = strdup("#ffffffffffff"); + ss->bgblocks[0].alpha2 = 1.0; + } diff --git a/src/stylesheet.h b/src/stylesheet.h index cde0bcc..bdbf97e 100644 --- a/src/stylesheet.h +++ b/src/stylesheet.h @@ -70,10 +70,42 @@ struct style }; +enum bgblocktype +{ + BGBLOCK_SOLID, + BGBLOCK_GRADIENT_X, + BGBLOCK_GRADIENT_Y, + BGBLOCK_IMAGE, +}; + + +struct bgblock +{ + enum bgblocktype type; + double min_x; + double max_x; + double min_y; + double max_y; + + char *colour1; + double alpha1; + char *colour2; + double alpha2; + + struct image *image; + GdkPixbuf *scaled_pb; + int scaled_w; + int scaled_h; +}; + + struct _stylesheet { - struct style **styles; - int n_styles; + struct style **styles; + int n_styles; + + struct bgblock *bgblocks; + int n_bgblocks; /* Background stuff */ }; -- cgit v1.2.3