aboutsummaryrefslogtreecommitdiff
path: root/libstorycode/slide_render_cairo.c
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.me.uk>2019-02-23 11:18:20 +0100
committerThomas White <taw@bitwiz.me.uk>2019-02-23 11:18:20 +0100
commite2523695223db657fb2c348a47b318b5c2d998ce (patch)
treeaf0640749d20ebd7a81a27dfd903b7e1d24bc5cf /libstorycode/slide_render_cairo.c
parenta716de927edbe4aaeb2025c6f11d988ca3ee05b9 (diff)
Image rendering
Diffstat (limited to 'libstorycode/slide_render_cairo.c')
-rw-r--r--libstorycode/slide_render_cairo.c45
1 files changed, 34 insertions, 11 deletions
diff --git a/libstorycode/slide_render_cairo.c b/libstorycode/slide_render_cairo.c
index 8e1eeba..b3c8a8f 100644
--- a/libstorycode/slide_render_cairo.c
+++ b/libstorycode/slide_render_cairo.c
@@ -31,11 +31,13 @@
#include <assert.h>
#include <string.h>
#include <stdlib.h>
+#include <math.h>
#include "presentation.h"
#include "slide.h"
#include "narrative.h"
#include "stylesheet.h"
+#include "imagestore.h"
#include "slide_priv.h"
@@ -117,21 +119,41 @@ static void render_text(struct slide_item *item, cairo_t *cr, PangoContext *pc,
static void render_image(struct slide_item *item, cairo_t *cr,
- double parent_w, double parent_h)
+ ImageStore *is, double parent_w, double parent_h)
{
- cairo_rectangle(cr, lcalc(item->geom.x, parent_w),
- lcalc(item->geom.y, parent_h),
- lcalc(item->geom.w, parent_w),
- lcalc(item->geom.h, parent_h));
- cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
- cairo_set_line_width(cr, 1.0);
- cairo_stroke_preserve(cr);
- cairo_set_source_rgba(cr, 0.0, 0.5, 0.0, 0.5);
+ double x, y, w, h;
+ double wd, hd;
+ cairo_surface_t *surf;
+
+ x = lcalc(item->geom.x, parent_w);
+ y = lcalc(item->geom.y, parent_h);
+ w = lcalc(item->geom.w, parent_w);
+ h = lcalc(item->geom.h, parent_h);
+
+ wd = w; hd = h;
+ cairo_user_to_device_distance(cr, &wd, &hd);
+ surf = lookup_image(is, item->filename, wd);
+ if ( surf == NULL ) return;
+
+ cairo_user_to_device(cr, &x, &y);
+ x = rint(x); y = rint(y);
+ cairo_device_to_user(cr, &x, &y);
+
+ cairo_save(cr);
+ cairo_new_path(cr);
+ cairo_rectangle(cr, x, y, w, h);
+ cairo_translate(cr, x, y);
+ cairo_scale(cr, w/wd, h/hd);
+ cairo_set_source_surface(cr, surf, 0.0, 0.0);
+ cairo_pattern_t *patt = cairo_get_source(cr);
+ cairo_pattern_set_extend(patt, CAIRO_EXTEND_NONE);
+ cairo_pattern_set_filter(patt, CAIRO_FILTER_BEST);
cairo_fill(cr);
+ cairo_restore(cr);
}
-int slide_render_cairo(Slide *s, cairo_t *cr, Stylesheet *stylesheet,
+int slide_render_cairo(Slide *s, cairo_t *cr, ImageStore *is, Stylesheet *stylesheet,
int slide_number, PangoLanguage *lang, PangoContext *pc)
{
int i;
@@ -151,7 +173,8 @@ int slide_render_cairo(Slide *s, cairo_t *cr, Stylesheet *stylesheet,
break;
case SLIDE_ITEM_IMAGE :
- render_image(&s->items[i], cr, s->logical_w, s->logical_h);
+ render_image(&s->items[i], cr, is,
+ s->logical_w, s->logical_h);
break;
default :