aboutsummaryrefslogtreecommitdiff
path: root/src/slide_render.c
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.org.uk>2011-10-01 20:51:22 +0200
committerThomas White <taw@bitwiz.org.uk>2011-10-01 20:51:22 +0200
commit9a5060c094813d908d4c9ef7b8631916939bb53d (patch)
tree06dbcf835efc3be3e32ce9c72a604ace1a52a6be /src/slide_render.c
parente705f42069f505bb8111a1fd7d8534ab3cacd5b8 (diff)
Use function pointers for object rendering and overlays
Diffstat (limited to 'src/slide_render.c')
-rw-r--r--src/slide_render.c177
1 files changed, 1 insertions, 176 deletions
diff --git a/src/slide_render.c b/src/slide_render.c
index 0a07560..50768c8 100644
--- a/src/slide_render.c
+++ b/src/slide_render.c
@@ -35,177 +35,6 @@
#include "stylesheet.h"
-static void calculate_size_from_style(struct object *o,
- double *peright, double *pebottom,
- double *pmw, double *pmh)
-{
- double max_width, max_height;
- double ebottom, eright, mw, mh;
-
- eright = o->parent->parent->slide_width - o->style->margin_right;
- ebottom = o->parent->parent->slide_height - o->style->margin_bottom;
- mw = o->parent->parent->slide_width;
- mh = o->parent->parent->slide_height;
-
- *peright = eright; *pebottom = ebottom;
- *pmw = mw; *pmh = mh;
-
- max_width = mw - o->style->margin_left - o->style->margin_right;
-
- /* Use the provided maximum width if it exists and is smaller */
- if ( o->style->use_max_width && (o->style->max_width < max_width) )
- {
- max_width = o->style->max_width;
- }
-
- max_height = mh - o->style->margin_top - o->style->margin_bottom;
-
- pango_layout_set_width(o->layout, max_width*PANGO_SCALE);
- pango_layout_set_height(o->layout, max_height*PANGO_SCALE);
- pango_layout_set_wrap(o->layout, PANGO_WRAP_WORD_CHAR);
- pango_layout_set_ellipsize(o->layout, PANGO_ELLIPSIZE_MIDDLE);
-
- switch ( o->style->halign ) {
- case J_LEFT :
- pango_layout_set_alignment(o->layout, PANGO_ALIGN_LEFT);
- break;
- case J_RIGHT :
- pango_layout_set_alignment(o->layout, PANGO_ALIGN_RIGHT);
- break;
- case J_CENTER :
- pango_layout_set_alignment(o->layout, PANGO_ALIGN_CENTER);
- break;
- }
-}
-
-
-static void calculate_position_from_style(struct object *o,
- double eright, double ebottom,
- double mw, double mh,
- double *pxo, double *pyo)
-{
- double xo, yo;
- PangoRectangle ink, logical;
-
- pango_layout_get_extents(o->layout, &ink, &logical);
- xo = ink.x/PANGO_SCALE; yo = logical.y/PANGO_SCALE;
-
- switch ( o->style->halign ) {
- case J_LEFT :
- o->x = -xo + o->style->margin_left;
- break;
- case J_RIGHT :
- o->x = -xo + eright - o->bb_width;
- break;
- case J_CENTER :
- o->x = mw/2.0 - o->bb_width/2.0 - xo + o->style->offset_x;
- break;
- }
-
- if ( o->style->halign == J_CENTER )
- {
- if ( o->x+xo < o->style->margin_left ) {
- o->x = o->style->margin_left - xo;
- }
-
- if ( o->x+xo + o->bb_width > mw-o->style->margin_right ) {
- o->x = mw-o->style->margin_right - xo - o->bb_width;
- }
- }
-
- switch ( o->style->valign ) {
- case V_TOP :
- o->y = o->style->margin_top;
- break;
- case V_BOTTOM :
- o->y = ebottom - o->bb_height;
- break;
- case V_CENTER :
- o->y = mh/2.0 - o->bb_height/2.0 + yo - o->style->offset_y;
- break;
- }
-
- if ( o->style->valign == V_CENTER ) {
-
- if ( o->y < o->style->margin_top ) {
- o->y = o->style->margin_top;
- }
-
- if ( o->y+yo + o->bb_height > mh - o->style->margin_bottom ) {
- o->y = mh-o->style->margin_bottom - yo - o->bb_height;
- }
- }
-
- *pxo = xo; *pyo = yo;
-}
-
-
-static void render_text_object(cairo_t *cr, struct object *o)
-{
- PangoRectangle ink, logical;
- double eright = 0.0;
- double ebottom = 0.0;
- double mw = 0.0;
- double mh = 0.0;
- double xo, yo;
- int furniture = 0;
- GdkColor col;
-
- furniture = o->style != o->parent->parent->ss->styles[0];
-
- o->layout = pango_cairo_create_layout(cr);
- pango_layout_set_text(o->layout, o->text, -1);
- o->fontdesc = pango_font_description_from_string(o->style->font);
- pango_layout_set_font_description(o->layout, o->fontdesc);
-
- if ( furniture ) {
- calculate_size_from_style(o, &eright, &ebottom, &mw, &mh);
- } else {
- pango_layout_set_alignment(o->layout, PANGO_ALIGN_LEFT);
- }
-
- pango_cairo_update_layout(cr, o->layout);
- pango_layout_get_extents(o->layout, &ink, &logical);
- o->bb_width = ink.width / PANGO_SCALE;
- o->bb_height = logical.height/PANGO_SCALE;
-
- if ( furniture ) {
- calculate_position_from_style(o, eright, ebottom,
- mw, mh, &xo, &yo);
- }
-
- cairo_move_to(cr, o->x, o->y);
- gdk_color_parse(o->style->colour, &col);
- gdk_cairo_set_source_color(cr, &col); /* FIXME: Honour alpha as well */
- pango_cairo_show_layout(cr, o->layout);
-
- if ( furniture ) {
- o->x += xo;
- o->y += yo;
- }
-}
-
-
-void draw_caret(cairo_t *cr, struct object *o)
-{
- int line, xpos;
- double xposd;
-
- assert(o->type == TEXT);
-
- pango_layout_index_to_line_x(o->layout, o->insertion_point,
- 0, &line, &xpos);
-
- xposd = xpos/PANGO_SCALE;
-
- cairo_move_to(cr, o->x+xposd, o->y);
- cairo_line_to(cr, o->x+xposd, o->y+o->bb_height);
- cairo_set_source_rgb(cr, 1.0, 0.5, 0.0);
- cairo_set_line_width(cr, 2.0);
- cairo_stroke(cr);
-}
-
-
int render_slide(struct slide *s)
{
cairo_surface_t *surf;
@@ -227,11 +56,7 @@ int render_slide(struct slide *s)
struct object *o = s->objects[i];
- switch ( o->type ) {
- case TEXT :
- render_text_object(cr, o);
- break;
- }
+ o->render_object(cr, o);
}