aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/layout.c32
-rw-r--r--src/layout.h4
-rw-r--r--src/mainwindow.c54
-rw-r--r--src/render.c74
-rw-r--r--src/render.h8
-rw-r--r--tests/render_test.c4
-rw-r--r--tests/render_test_sc1.c4
7 files changed, 121 insertions, 59 deletions
diff --git a/src/layout.c b/src/layout.c
index 10cb686..9a4a10f 100644
--- a/src/layout.c
+++ b/src/layout.c
@@ -43,8 +43,7 @@ static void copy_lop_from_style(struct frame *fr, struct style *style)
}
-static void layout_subframe(struct frame *fr, double w, double h,
- PangoContext *pc)
+static void layout_subframe(struct frame *fr, double w, double h)
{
int i;
@@ -56,8 +55,6 @@ static void layout_subframe(struct frame *fr, double w, double h,
struct frame *child;
double child_w, child_h;
double offs_x, offs_y;
- PangoFontDescription *fontdesc;
- PangoRectangle extents;
child = fr->rendering_order[i];
@@ -75,25 +72,8 @@ static void layout_subframe(struct frame *fr, double w, double h,
child_w -= (fr->lop.pad_l + fr->lop.pad_r);
child_h -= (fr->lop.pad_t + fr->lop.pad_b);
- /* Put the contents inside, and see how much space is needed */
- if ( child->pl == NULL ) {
- child->pl = pango_layout_new(pc);
- pango_layout_set_justify(child->pl, 1);
- pango_layout_set_ellipsize(child->pl, 1);
- }
- pango_layout_set_width(child->pl, child_w*PANGO_SCALE);
- pango_layout_set_height(child->pl, child_h*PANGO_SCALE);
-
- /* FIXME: Check for Level 1 markup e.g. image */
- pango_layout_set_text(child->pl, child->sc, -1);
-
- fontdesc = pango_font_description_from_string("Sans 12");
- pango_layout_set_font_description(child->pl, fontdesc);
- pango_font_description_free(fontdesc);
-
- pango_layout_get_extents(child->pl, NULL, &extents);
- child_w = extents.width / PANGO_SCALE;
- child_h = extents.height / PANGO_SCALE;
+ child_w = 150.0;
+ child_h = 30.0; /* FIXME! */
/* Now, apply the minimum size if given */
if ( child->lop.min_w > 0.0 ) {
@@ -127,14 +107,14 @@ static void layout_subframe(struct frame *fr, double w, double h,
/* Record values and recurse */
child->offs_x = offs_x;
child->offs_y = offs_y;
- layout_subframe(child, child_w, child_h, pc);
+ layout_subframe(child, child_w, child_h);
}
}
-void layout_frame(struct frame *fr, double w, double h, PangoContext *pc)
+void layout_frame(struct frame *fr, double w, double h)
{
copy_lop_from_style(fr, fr->style);
- layout_subframe(fr, w, h, pc);
+ layout_subframe(fr, w, h);
}
diff --git a/src/layout.h b/src/layout.h
index 8d7dd49..d037157 100644
--- a/src/layout.h
+++ b/src/layout.h
@@ -65,8 +65,6 @@ struct layout_parameters
/* Calculate layout for frame (and all its children) based on size */
-extern void layout_frame(struct frame *fr, double w, double h,
- PangoContext *pc);
-
+extern void layout_frame(struct frame *fr, double w, double h);
#endif /* LAYOUT_H */
diff --git a/src/mainwindow.c b/src/mainwindow.c
index c5d152a..e36be11 100644
--- a/src/mainwindow.c
+++ b/src/mainwindow.c
@@ -49,7 +49,7 @@ static void rerender_slide(struct presentation *p, PangoContext *pc)
w = p->thumb_slide_width;
h = (p->slide_height/p->slide_width) * w;
- s->rendered_thumb = render_slide(s, w, h, pc);
+ s->rendered_thumb = render_slide(s, w, h);
if ( s->rendered_edit != NULL ) {
cairo_surface_destroy(s->rendered_edit);
@@ -57,8 +57,8 @@ static void rerender_slide(struct presentation *p, PangoContext *pc)
w = p->edit_slide_width;
h = (p->slide_height/p->slide_width) * w;
- s->rendered_edit = render_slide(s, w, h, pc);
-printf("rendered %p -> %p\n", s, s->rendered_edit);
+ s->rendered_edit = render_slide(s, w, h);
+
/* Is this slide currently being displayed on the projector? */
if ( s == s->parent->cur_proj_slide ) {
@@ -68,7 +68,7 @@ printf("rendered %p -> %p\n", s, s->rendered_edit);
w = s->parent->proj_slide_width;
h = (s->parent->slide_height/s->parent->slide_width) * w;
- s->rendered_proj = render_slide(s, w, h, pc);
+ s->rendered_proj = render_slide(s, w, h);
}
}
@@ -535,8 +535,7 @@ static gint add_furniture(GtkWidget *widget, struct presentation *p)
fr->style = sty;
set_edit(p, p->cur_edit_slide);
fr->sc = "Hello";
- layout_frame(p->cur_edit_slide->top, p->slide_width, p->slide_height,
- p->pc);
+ layout_frame(p->cur_edit_slide->top, p->slide_width, p->slide_height);
set_selection(p, fr);
rerender_slide(p, p->pc);
redraw(p);
@@ -735,6 +734,44 @@ static void draw_editing_box(cairo_t *cr, struct frame *fr)
}
+static void draw_caret(cairo_t *cr, struct frame *fr)
+{
+#if 0
+ double xposd, yposd, cx;
+ double clow, chigh;
+ PangoRectangle pos;
+ const double t = 1.8;
+
+ pango_layout_get_cursor_pos(o->layout,
+ o->insertion_point+o->insertion_trail,
+ &pos, NULL);
+
+ xposd = pos.x/PANGO_SCALE;
+ cx = o->base.x - o->offs_x + xposd;
+ yposd = pos.y/PANGO_SCALE;
+ clow = o->base.y - o->offs_y + yposd;
+ chigh = clow + (pos.height/PANGO_SCALE);
+
+ cairo_move_to(cr, cx, clow);
+ cairo_line_to(cr, cx, chigh);
+
+ cairo_move_to(cr, cx-t, clow-t);
+ cairo_line_to(cr, cx, clow);
+ cairo_move_to(cr, cx+t, clow-t);
+ cairo_line_to(cr, cx, clow);
+
+ cairo_move_to(cr, cx-t, chigh+t);
+ cairo_line_to(cr, cx, chigh);
+ cairo_move_to(cr, cx+t, chigh+t);
+ cairo_line_to(cr, cx, chigh);
+
+ cairo_set_source_rgb(cr, 0.86, 0.0, 0.0);
+ cairo_set_line_width(cr, 1.0);
+ cairo_stroke(cr);
+#endif
+}
+
+
static void draw_overlay(cairo_t *cr, struct presentation *p)
{
int i;
@@ -742,6 +779,11 @@ static void draw_overlay(cairo_t *cr, struct presentation *p)
for ( i=0; i<p->n_selection; i++ ) {
draw_editing_box(cr, p->selection[i]);
}
+
+ /* If only one frame is selected, draw the caret */
+ if ( p->n_selection == 1 ) {
+ draw_caret(cr, p->selection[0]);
+ }
}
diff --git a/src/render.c b/src/render.c
index da2a4fc..b0c5078 100644
--- a/src/render.c
+++ b/src/render.c
@@ -38,30 +38,74 @@
#include "frame.h"
-/* Render Level 1 Storycode */
-int render_sc(struct frame *fr, cairo_t *cr, double w, double h,
- PangoContext *pc)
+struct renderstuff
+{
+ cairo_t *cr;
+ PangoContext *pc;
+ PangoFontMap *fontmap;
+ PangoFont *font;
+ struct frame *fr;
+};
+
+
+static void render_segment(gpointer data, gpointer user_data)
{
+ struct renderstuff *s = user_data;
+ PangoItem *item = data;
+ PangoGlyphString *glyphs;
GdkColor col;
- if ( fr->pl != NULL ) {
+ glyphs = pango_glyph_string_new();
- pango_cairo_update_layout(cr, fr->pl);
+ pango_shape(s->fr->sc+item->offset, item->length, &item->analysis,
+ glyphs);
- /* FIXME: Honour alpha as well */
- gdk_color_parse("#000000", &col);
- gdk_cairo_set_source_color(cr, &col);
+ /* FIXME: Honour alpha as well */
+ gdk_color_parse("#000000", &col);
+ gdk_cairo_set_source_color(s->cr, &col);
+ pango_cairo_show_glyph_string(s->cr, s->font, glyphs);
- pango_cairo_show_layout(cr, fr->pl);
+ pango_glyph_string_free(glyphs);
+ pango_item_free(item);
+}
- //g_object_unref(G_OBJECT(layout));
+
+/* Render Level 1 Storycode */
+int render_sc(struct frame *fr, cairo_t *cr, double w, double h)
+{
+ PangoFontDescription *fontdesc;
+ struct renderstuff s;
+ GList *list;
+
+ if ( fr->sc == NULL ) return 0;
+
+ s.pc = pango_cairo_create_context(cr);
+ s.fr = fr;
+ s.cr = cr;
+
+ /* Find and load font */
+ s.fontmap = pango_cairo_font_map_get_default();
+ fontdesc = pango_font_description_from_string("Serif 20");
+ s.font = pango_font_map_load_font(s.fontmap, s.pc, fontdesc);
+ if ( s.font == NULL ) {
+ fprintf(stderr, "Failed to load font.\n");
+ return 1;
}
+ /* Create glyph string */
+ list = pango_itemize(s.pc, fr->sc, 0, strlen(fr->sc), NULL, NULL);
+ g_list_foreach(list, render_segment, &s);
+
+ g_list_free(list);
+ pango_font_description_free(fontdesc);
+ g_object_unref(s.fontmap);
+ g_object_unref(s.pc);
+
return 0;
}
-int render_frame(struct frame *fr, cairo_t *cr, PangoContext *pc)
+int render_frame(struct frame *fr, cairo_t *cr)
{
int i;
int d = 0;
@@ -99,7 +143,7 @@ int render_frame(struct frame *fr, cairo_t *cr, PangoContext *pc)
cairo_move_to(cr, fr->lop.pad_l, fr->lop.pad_t);
w = fr->w - (fr->lop.pad_l + fr->lop.pad_r);
h = fr->h - (fr->lop.pad_t + fr->lop.pad_b);
- render_sc(fr, cr, w, h, pc);
+ render_sc(fr, cr, w, h);
d = 1;
@@ -111,7 +155,7 @@ int render_frame(struct frame *fr, cairo_t *cr, PangoContext *pc)
cairo_translate(cr, fr->rendering_order[i]->offs_x,
fr->rendering_order[i]->offs_y);
- render_frame(fr->rendering_order[i], cr, pc);
+ render_frame(fr->rendering_order[i], cr);
}
@@ -124,7 +168,7 @@ int render_frame(struct frame *fr, cairo_t *cr, PangoContext *pc)
}
-cairo_surface_t *render_slide(struct slide *s, int w, int h, PangoContext *pc)
+cairo_surface_t *render_slide(struct slide *s, int w, int h)
{
cairo_surface_t *surf;
cairo_t *cr;
@@ -150,7 +194,7 @@ cairo_surface_t *render_slide(struct slide *s, int w, int h, PangoContext *pc)
cairo_set_font_options(cr, fopts);
printf("rendered to %p %ix%i\n", surf, w, h);
- render_frame(s->top, cr, pc);
+ render_frame(s->top, cr);
cairo_font_options_destroy(fopts);
cairo_destroy(cr);
diff --git a/src/render.h b/src/render.h
index 4b5b607..4bc47f2 100644
--- a/src/render.h
+++ b/src/render.h
@@ -29,12 +29,10 @@
#include "presentation.h"
-extern int render_sc(const char *sc, cairo_t *cr, double w, double h,
- PangoContext *pc);
+extern int render_sc(const char *sc, cairo_t *cr, double w, double h);
-extern int render_frame(struct frame *fr, cairo_t *cr, PangoContext *pc);
+extern int render_frame(struct frame *fr, cairo_t *cr);
-extern cairo_surface_t *render_slide(struct slide *s, int w, int h,
- PangoContext *pc);
+extern cairo_surface_t *render_slide(struct slide *s, int w, int h);
#endif /* RENDER_H */
diff --git a/tests/render_test.c b/tests/render_test.c
index 027847a..c800cdb 100644
--- a/tests/render_test.c
+++ b/tests/render_test.c
@@ -60,8 +60,8 @@ static gboolean draw_sig(GtkWidget *da, cairo_t *cr, struct frame *fr)
gtk_widget_get_allocation(da, &allocation);
- layout_frame(fr, allocation.width, allocation.height, pc);
- render_frame(fr, cr, pc);
+ layout_frame(fr, allocation.width, allocation.height);
+ render_frame(fr, cr);
return FALSE;
}
diff --git a/tests/render_test_sc1.c b/tests/render_test_sc1.c
index 3b0d6a9..154a08f 100644
--- a/tests/render_test_sc1.c
+++ b/tests/render_test_sc1.c
@@ -61,8 +61,8 @@ static gboolean draw_sig(GtkWidget *da, cairo_t *cr, struct frame *fr)
gtk_widget_get_allocation(da, &allocation);
- layout_frame(fr, allocation.width, allocation.height, pc);
- render_frame(fr, cr, pc);
+ layout_frame(fr, allocation.width, allocation.height);
+ render_frame(fr, cr);
return FALSE;
}