diff options
-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.c | 45 | ||||
-rw-r--r-- | libstorycode/slide_render_cairo.h | 3 | ||||
-rw-r--r-- | meson.build | 5 | ||||
-rw-r--r-- | src/pdfstorycode.c | 12 |
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; } |