aboutsummaryrefslogtreecommitdiff
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
parenta716de927edbe4aaeb2025c6f11d988ca3ee05b9 (diff)
Image rendering
-rw-r--r--libstorycode/imagestore.c (renamed from src-old/imagestore.c)1
-rw-r--r--libstorycode/imagestore.h (renamed from src-old/imagestore.h)0
-rw-r--r--libstorycode/slide_render_cairo.c45
-rw-r--r--libstorycode/slide_render_cairo.h3
-rw-r--r--meson.build5
-rw-r--r--src/pdfstorycode.c12
6 files changed, 48 insertions, 18 deletions
diff --git a/src-old/imagestore.c b/libstorycode/imagestore.c
index 61ebcfb..5eb50fb 100644
--- a/src-old/imagestore.c
+++ b/libstorycode/imagestore.c
@@ -36,7 +36,6 @@
#include <gdk-pixbuf/gdk-pixbuf.h>
#include "imagestore.h"
-#include "utils.h"
#define MAX_SIZES (32)
diff --git a/src-old/imagestore.h b/libstorycode/imagestore.h
index 0d4df24..0d4df24 100644
--- a/src-old/imagestore.h
+++ b/libstorycode/imagestore.h
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 :
diff --git a/libstorycode/slide_render_cairo.h b/libstorycode/slide_render_cairo.h
index afbdec3..4f8fd68 100644
--- a/libstorycode/slide_render_cairo.h
+++ b/libstorycode/slide_render_cairo.h
@@ -28,8 +28,9 @@
#endif
#include "presentation.h"
+#include "imagestore.h"
-extern int slide_render_cairo(Slide *s, cairo_t *cr, Stylesheet *stylesheet,
+extern int slide_render_cairo(Slide *s, cairo_t *cr, ImageStore *is, Stylesheet *stylesheet,
int slide_number, PangoLanguage *lang,
PangoContext *pc);
diff --git a/meson.build b/meson.build
index 814da89..6a57efc 100644
--- a/meson.build
+++ b/meson.build
@@ -19,6 +19,7 @@ subdir('po')
# Dependencies
gnome = import('gnome')
+gdk_dep = dependency('gdk-3.0', required : true)
gtk_dep = dependency('gtk+-3.0', required : true)
glib_dep = dependency('glib-2.0', required : true)
gio_dep = dependency('gio-2.0', required : true)
@@ -27,6 +28,7 @@ pango_dep = dependency('pango', required : true)
pangocairo_dep = dependency('pangocairo', required : true)
gdkpixbuf_dep = dependency('gdk-pixbuf-2.0', required : true)
cc = meson.get_compiler('c')
+mdep = cc.find_library('m', required : false)
if pangocairo_dep.found()
add_project_arguments('-DHAVE_PANGO', language : 'c')
@@ -67,12 +69,13 @@ libstorycode = library('storycode',
'libstorycode/stylesheet.c',
'libstorycode/storycode.c',
'libstorycode/slide_render_cairo.c',
+ 'libstorycode/imagestore.c',
storycode_lex_ch,
storycode_parse_ch,
],
include_directories : libstorycode_includes,
dependencies : [cairo_dep, pango_dep, gdkpixbuf_dep,
- pangocairo_dep],
+ pangocairo_dep, mdep, gdk_dep, gio_dep],
install : true)
libstorycode_dep = declare_dependency(include_directories : libstorycode_includes,
diff --git a/src/pdfstorycode.c b/src/pdfstorycode.c
index a0d9115..ad1d706 100644
--- a/src/pdfstorycode.c
+++ b/src/pdfstorycode.c
@@ -37,13 +37,14 @@
#include "storycode.h"
#include "presentation.h"
#include "slide.h"
+#include "imagestore.h"
#include "slide_render_cairo.h"
#include <libintl.h>
#define _(x) gettext(x)
-static int render_slides_to_pdf(Presentation *p, const char *filename)
+static int render_slides_to_pdf(Presentation *p, ImageStore *is, const char *filename)
{
double w = 2048.0;
cairo_surface_t *surf;
@@ -66,14 +67,13 @@ static int render_slides_to_pdf(Presentation *p, const char *filename)
double log_w, log_h;
s = presentation_slide(p, i);
- describe_slide(s);
slide_get_logical_size(s, &log_w, &log_h);
cairo_pdf_surface_set_size(surf, w, w*(log_h/log_w));
cairo_save(cr);
cairo_scale(cr, w/log_w, w/log_w);
- slide_render_cairo(s, cr, presentation_get_stylesheet(p),
+ slide_render_cairo(s, cr, is, presentation_get_stylesheet(p),
i, pango_language_get_default(), pc);
cairo_show_page(cr);
cairo_restore(cr);
@@ -94,6 +94,7 @@ int main(int argc, char *argv[])
const char *text;
size_t len;
Presentation *p;
+ ImageStore *is;
file = g_file_new_for_commandline_arg(argv[1]);
bytes = g_file_load_bytes(file, NULL, NULL, NULL);
@@ -101,8 +102,11 @@ int main(int argc, char *argv[])
p = storycode_parse_presentation(text);
g_bytes_unref(bytes);
+ is = imagestore_new(".");
+ imagestore_set_parent(is, g_file_get_parent(file));
+
/* Render each slide to PDF */
- render_slides_to_pdf(p, "slides.pdf");
+ render_slides_to_pdf(p, is, "slides.pdf");
return 0;
}