aboutsummaryrefslogtreecommitdiff
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
parent57dac45b3405edee4300c11411fbf712916437bb (diff)
Restore images
-rw-r--r--src/frame.c78
-rw-r--r--src/frame.h4
-rw-r--r--src/render.c12
3 files changed, 72 insertions, 22 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;
+
+ }
+}
diff --git a/src/frame.h b/src/frame.h
index 2652a27..b300c8d 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -32,6 +32,7 @@
#include "sc_parse.h"
#include "sc_interp.h"
+#include "imagestore.h"
typedef enum
@@ -106,8 +107,9 @@ extern double total_height(struct frame *fr);
extern Paragraph *last_open_para(struct frame *fr);
extern void close_last_paragraph(struct frame *fr);
-extern PangoLayout *paragraph_layout(Paragraph *para);
extern double paragraph_height(Paragraph *para);
+extern void render_paragraph(cairo_t *cr, Paragraph *para, ImageStore *is,
+ enum is_size isz);
extern void add_run(Paragraph *para, SCBlock *scblock, size_t offs_bytes,
size_t len_bytes, PangoFontDescription *fdesc,
diff --git a/src/render.c b/src/render.c
index 5373a9d..d64c8ed 100644
--- a/src/render.c
+++ b/src/render.c
@@ -194,16 +194,6 @@ static void do_background(cairo_t *cr, struct frame *fr)
}
-static void render_paragraph(cairo_t *cr, Paragraph *para)
-{
- PangoLayout *layout = paragraph_layout(para);
- cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0);
- pango_cairo_update_layout(cr, layout);
- pango_cairo_show_layout(cr, layout);
- cairo_fill(cr);
-}
-
-
static int draw_frame(cairo_t *cr, struct frame *fr, ImageStore *is,
enum is_size isz, double min_y, double max_y)
{
@@ -223,7 +213,7 @@ static int draw_frame(cairo_t *cr, struct frame *fr, ImageStore *is,
cairo_translate(cr, 0.0, hpos);
if ( (hpos + cur_h > min_y) && (hpos < max_y) ) {
- render_paragraph(cr, fr->paras[i]);
+ render_paragraph(cr, fr->paras[i], is, isz);
} /* else paragraph is not visible */
hpos += cur_h;