diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/layout.c | 32 | ||||
-rw-r--r-- | src/layout.h | 4 | ||||
-rw-r--r-- | src/mainwindow.c | 54 | ||||
-rw-r--r-- | src/render.c | 74 | ||||
-rw-r--r-- | src/render.h | 8 |
5 files changed, 117 insertions, 55 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 */ |