aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.org.uk>2014-12-27 21:57:29 +0000
committerThomas White <taw@bitwiz.org.uk>2014-12-27 21:57:29 +0000
commita68d64edca4f67df49b9499272319cad93d38bbe (patch)
treee1f5084d006257713090bb7a2dc1f91976b91e7c /src
parentfb69111748d9d4eba92024799421ee2573418d15 (diff)
Draw from callbacks
Diffstat (limited to 'src')
-rw-r--r--src/narrative_window.c9
-rw-r--r--src/render.c33
-rw-r--r--src/sc_interp.c6
-rw-r--r--src/shape.h3
-rw-r--r--src/wrap.h6
5 files changed, 52 insertions, 5 deletions
diff --git a/src/narrative_window.c b/src/narrative_window.c
index 50fc3e9..7a66f14 100644
--- a/src/narrative_window.c
+++ b/src/narrative_window.c
@@ -199,11 +199,14 @@ static cairo_surface_t *render_thumbnail(SCInterpreter *scin, SCBlock *bl,
{
struct presentation *p = vp;
cairo_surface_t *surf;
-
- printf("thumbnail callback\n");
- show_sc_block(sc_interp_get_macro_real_block(scin), "");
+ cairo_t *cr;
surf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 256, 256);
+ cr = cairo_create(surf);
+ cairo_set_source_rgb(cr, 0.0, 0.5, 0.0);
+ cairo_paint(cr);
+ cairo_destroy(cr);
+
return surf;
}
diff --git a/src/render.c b/src/render.c
index e02c9ec..6a88116 100644
--- a/src/render.c
+++ b/src/render.c
@@ -59,6 +59,35 @@ static void render_glyph_box(cairo_t *cr, struct wrap_box *box)
}
+static void render_surface_box(cairo_t *cr, struct wrap_box *box)
+{
+ double ascd;
+ double x, y;
+
+ cairo_save(cr);
+
+ ascd = pango_units_to_double(box->ascent);
+
+ x = 0.0;
+ y = -ascd;
+ cairo_user_to_device(cr, &x, &y);
+
+ cairo_new_path(cr);
+ cairo_rectangle(cr, 0.0, -ascd, pango_units_to_double(box->width),
+ pango_units_to_double(box->height));
+
+ if ( box->surf == NULL ) {
+ cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 1.0);
+ fprintf(stderr, "Null surface box");
+ } else {
+ cairo_identity_matrix(cr);
+ cairo_set_source_surface(cr, box->surf, x, y);
+ }
+
+ cairo_fill(cr);
+ cairo_restore(cr);
+}
+
static void render_image_box(cairo_t *cr, struct wrap_box *box, ImageStore *is,
enum is_size isz)
@@ -157,6 +186,10 @@ static void render_boxes(struct wrap_line *line, cairo_t *cr, ImageStore *is,
render_image_box(cr, box, is, isz);
break;
+ case WRAP_BOX_SURFACE:
+ render_surface_box(cr, box);
+ break;
+
case WRAP_BOX_NOTHING :
break;
diff --git a/src/sc_interp.c b/src/sc_interp.c
index f628754..7d90b4f 100644
--- a/src/sc_interp.c
+++ b/src/sc_interp.c
@@ -184,8 +184,12 @@ static void do_callback(SCInterpreter *scin, SCBlock *bl, const char *name)
}
for ( i=0; i<cbl->n_callbacks; i++ ) {
+ cairo_surface_t *surf;
if ( strcmp(cbl->names[i], name) != 0 ) continue;
- cbl->funcs[i](scin, bl, cbl->vps[i]);
+ surf = cbl->funcs[i](scin, bl, cbl->vps[i]);
+ if ( surf == NULL ) return;
+ add_surface_box(sc_interp_get_frame(scin)->boxes, surf,
+ 256, 256); // FIXME: Box size
return;
}
diff --git a/src/shape.h b/src/shape.h
index 43356e0..e2a3e67 100644
--- a/src/shape.h
+++ b/src/shape.h
@@ -38,6 +38,9 @@ extern int split_words(struct wrap_line *boxes, PangoContext *pc,
extern void add_image_box(struct wrap_line *line, const char *filename,
int w, int h, int editable);
+extern void add_surface_box(struct wrap_line *line, cairo_surface_t *surf,
+ double w, double h);
+
extern void reshape_box(struct wrap_box *box);
#endif /* SHAPE_H */
diff --git a/src/wrap.h b/src/wrap.h
index 2d229ba..2f46233 100644
--- a/src/wrap.h
+++ b/src/wrap.h
@@ -38,7 +38,8 @@ enum wrap_box_type
WRAP_BOX_NOTHING,
WRAP_BOX_SENTINEL,
WRAP_BOX_PANGO,
- WRAP_BOX_IMAGE
+ WRAP_BOX_IMAGE,
+ WRAP_BOX_SURFACE
};
@@ -81,6 +82,9 @@ struct wrap_box
/* For type == WRAP_BOX_IMAGE */
char *filename;
+
+ /* For type == WRAP_BOX_SURFACE */
+ cairo_surface_t *surf;
};