aboutsummaryrefslogtreecommitdiff
path: root/src/frame.c
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.org.uk>2016-03-28 18:01:54 +0200
committerThomas White <taw@bitwiz.org.uk>2016-03-28 18:01:54 +0200
commit3bebe8b1c2fec41a9c33b7310f27804bc1062db6 (patch)
treeaab58805c8c0e210f1e43a45299482dff99fac2b /src/frame.c
parent57dac45b3405edee4300c11411fbf712916437bb (diff)
Restore images
Diffstat (limited to 'src/frame.c')
-rw-r--r--src/frame.c78
1 files changed, 68 insertions, 10 deletions
diff --git a/src/frame.c b/src/frame.c
index d220436..2a29a2a 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -31,6 +31,7 @@
#include "sc_parse.h"
#include "frame.h"
+#include "imagestore.h"
struct text_run
@@ -42,14 +43,26 @@ struct text_run
double col[4];
};
+enum para_type
+{
+ PARA_TYPE_TEXT,
+ PARA_TYPE_IMAGE,
+ PARA_TYPE_CALLBACK
+};
struct _paragraph
{
+ enum para_type type;
+
int n_runs;
struct text_run *runs;
int open;
-
PangoLayout *layout;
+
+ char *filename;
+ double image_w;
+ double image_h;
+
double height;
};
@@ -341,6 +354,24 @@ void add_run(Paragraph *para, SCBlock *scblock, size_t offs_bytes,
}
+static Paragraph *create_paragraph(struct frame *fr)
+{
+ Paragraph **paras_new;
+ Paragraph *pnew;
+
+ paras_new = realloc(fr->paras, (fr->n_paras+1)*sizeof(Paragraph *));
+ if ( paras_new == NULL ) return NULL;
+
+ pnew = calloc(1, sizeof(struct _paragraph));
+ if ( pnew == NULL ) return NULL;
+
+ fr->paras = paras_new;
+ fr->paras[fr->n_paras++] = pnew;
+
+ return pnew;
+}
+
+
void add_callback_para(struct frame *fr, double w, double h,
SCCallbackDrawFunc draw_func,
SCCallbackClickFunc click_func, void *bvp,
@@ -353,7 +384,14 @@ void add_callback_para(struct frame *fr, double w, double h,
void add_image_para(struct frame *fr, const char *filename,
double w, double h, int editable)
{
- /* FIXME */
+ Paragraph *pnew;
+
+ pnew = create_paragraph(fr);
+
+ pnew->type = PARA_TYPE_IMAGE;
+ pnew->filename = strdup(filename);
+ pnew->image_w = w;
+ pnew->image_h = h;
}
@@ -370,7 +408,6 @@ double total_height(struct frame *fr)
Paragraph *last_open_para(struct frame *fr)
{
- Paragraph **paras_new;
Paragraph *pnew;
if ( (fr->paras != NULL) && (fr->paras[fr->n_paras-1]->open) ) {
@@ -378,15 +415,10 @@ Paragraph *last_open_para(struct frame *fr)
}
/* No open paragraph found, create a new one */
- paras_new = realloc(fr->paras, (fr->n_paras+1)*sizeof(Paragraph *));
- if ( paras_new == NULL ) return NULL;
-
- pnew = calloc(1, sizeof(struct _paragraph));
+ pnew = create_paragraph(fr);
if ( pnew == NULL ) return NULL;
- fr->paras = paras_new;
- fr->paras[fr->n_paras++] = pnew;
-
+ pnew->type = PARA_TYPE_TEXT;
pnew->open = 1;
pnew->n_runs = 0;
pnew->runs = NULL;
@@ -402,3 +434,29 @@ void close_last_paragraph(struct frame *fr)
if ( fr->paras == NULL ) return;
fr->paras[fr->n_paras-1]->open = 0;
}
+
+
+void render_paragraph(cairo_t *cr, Paragraph *para, ImageStore *is,
+ enum is_size isz)
+{
+ cairo_surface_t *surf;
+
+ switch ( para->type ) {
+
+ case PARA_TYPE_TEXT :
+ cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0);
+ pango_cairo_update_layout(cr, para->layout);
+ pango_cairo_show_layout(cr, para->layout);
+ cairo_fill(cr);
+ break;
+
+ case PARA_TYPE_IMAGE :
+ cairo_new_path(cr);
+ cairo_rectangle(cr, 0.0, 0.0, para->image_w, para->image_h);
+ surf = lookup_image(is, para->filename, para->image_w, isz);
+ cairo_set_source_surface(cr, surf, 0.0, 0.0);
+ cairo_fill(cr);
+ break;
+
+ }
+}