aboutsummaryrefslogtreecommitdiff
path: root/src/slide_render.c
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.org.uk>2011-10-17 22:13:51 +0100
committerThomas White <taw@bitwiz.org.uk>2011-10-17 22:13:51 +0100
commita11196f4e47c312ff787d3990e0aa8edefa3e395 (patch)
treeb43a99972750dc62aae39380e3bbdc2e9b856984 /src/slide_render.c
parentc124f153354b6f63aa5f40dbe8e99b6b23cb416b (diff)
New slide redraw logic
This way is much more straightforward, and allows rendering in many different sizes
Diffstat (limited to 'src/slide_render.c')
-rw-r--r--src/slide_render.c63
1 files changed, 48 insertions, 15 deletions
diff --git a/src/slide_render.c b/src/slide_render.c
index e68499a..c0734df 100644
--- a/src/slide_render.c
+++ b/src/slide_render.c
@@ -35,23 +35,22 @@
#include "stylesheet.h"
-int render_slide(struct slide *s)
+static cairo_surface_t *render_slide(struct slide *s, int w, int h)
{
cairo_surface_t *surf;
cairo_t *cr;
int i;
- surf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,
- s->parent->slide_width,
- s->parent->slide_height);
+ surf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w, h);
cr = cairo_create(surf);
- cairo_rectangle(cr, 0.0, 0.0,
- s->parent->slide_width, s->parent->slide_height);
+ cairo_rectangle(cr, 0.0, 0.0, w, h);
cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
cairo_fill(cr);
+ /* FIXME: Set scale such that nominal size fits */
+
for ( i=0; i<s->num_objects; i++ ) {
struct object *o = s->objects[i];
@@ -62,20 +61,54 @@ int render_slide(struct slide *s)
cairo_destroy(cr);
- if ( s->render_cache != NULL ) cairo_surface_destroy(s->render_cache);
- s->render_cache = surf;
- s->render_cache_seq = s->object_seq;
-
- return 0;
+ return surf;
}
-void check_redraw_slide(struct slide *s)
+void redraw_slide(struct slide *s)
{
- /* Update necessary? */
- if ( s->object_seq <= s->render_cache_seq ) return;
+ int w, h;
+
+ if ( s->rendered_thumb != NULL ) {
+ cairo_surface_destroy(s->rendered_thumb);
+ }
+
+ w = s->parent->thumb_slide_width;
+ h = (s->parent->slide_height/s->parent->slide_width) * w;
+ s->rendered_thumb = render_slide(s, w, h);
+ /* FIXME: Request redraw for slide sorter if open */
+
+ /* Is this slide currently open in the editor? */
+ if ( s == s->parent->cur_edit_slide ) {
+
+ if ( s->rendered_edit != NULL ) {
+ cairo_surface_destroy(s->rendered_edit);
+ }
+
+ w = s->parent->edit_slide_width;
+ h = (s->parent->slide_height/s->parent->slide_width) * w;
+ s->rendered_edit = render_slide(s, w, h);
- render_slide(s);
+ gdk_window_invalidate_rect(s->parent->drawingarea->window,
+ NULL, FALSE);
+
+ }
+
+ /* Is this slide currently being displayed on the projector? */
+ if ( s == s->parent->cur_proj_slide ) {
+
+ if ( s->rendered_proj != NULL ) {
+ cairo_surface_destroy(s->rendered_proj);
+ }
+
+ w = s->parent->proj_slide_width;
+ h = (s->parent->slide_height/s->parent->slide_width) * w;
+ s->rendered_proj = render_slide(s, w, h);
+
+ gdk_window_invalidate_rect(s->parent->ss_drawingarea->window,
+ NULL, FALSE);
+
+ }
}