From 414f42faac3f69ab079c11c782cc8fb2da0e888a Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Sat, 31 Jan 2009 13:26:28 +0000 Subject: Make inline boxes store the height of their line box and include in box tree dump. svn path=/trunk/netsurf/; revision=6319 --- render/box.c | 4 ++++ render/box.h | 1 + render/layout.c | 20 ++++++++++++++++++-- 3 files changed, 23 insertions(+), 2 deletions(-) (limited to 'render') diff --git a/render/box.c b/render/box.c index 08272d166..32ed2c5b5 100644 --- a/render/box.c +++ b/render/box.c @@ -102,6 +102,7 @@ struct box * box_create(struct css_style *style, box->parent = NULL; box->fallback = NULL; box->inline_end = NULL; + box->line_height = 0; box->float_children = NULL; box->float_container = NULL; box->next_float = NULL; @@ -576,6 +577,9 @@ void box_dump(FILE *stream, struct box *box, unsigned int depth) fprintf(stream, " "); fprintf(stream, "%p ", box); + if (box->type == BOX_INLINE || box->type == BOX_TEXT || + box->type == BOX_INLINE_END) + fprintf(stream, "lh%i ", box->line_height); fprintf(stream, "x%i y%i w%i h%i ", box->x, box->y, box->width, box->height); if (box->max_width != UNKNOWN_MAX_WIDTH) diff --git a/render/box.h b/render/box.h index 5d31a198b..c12e3c343 100644 --- a/render/box.h +++ b/render/box.h @@ -201,6 +201,7 @@ struct box { * corresponding to this INLINE_END box. */ struct box *inline_end; bool inline_new_line; + int line_height; /** First float child box, or 0. Float boxes are in the tree twice, in * this list for the block box which defines the area for floats, and diff --git a/render/layout.c b/render/layout.c index ba18502a5..bd22abb43 100644 --- a/render/layout.c +++ b/render/layout.c @@ -1420,6 +1420,7 @@ bool layout_inline_container(struct box *inline_container, int width, if ((!c->object && c->text && (c->length || is_pre)) || c->type == BOX_BR) has_text_children = true; + c->line_height = 0; } /** \todo fix wrapping so that a box with horizontal scrollbar will @@ -2126,6 +2127,16 @@ bool layout_line(struct box *first, int *width, int *y, (d->style->position == CSS_POSITION_ABSOLUTE || d->style->position == CSS_POSITION_FIXED)) continue; + if (d->type == BOX_INLINE && d->inline_end && + d->next != d->inline_end) { + if (d->height > d->inline_end->line_height) + d->inline_end->line_height = d->height; + for (struct box *il = d; il != d->inline_end; + il = il->next) { + if (d->height > il->line_height) + il->line_height = d->height; + } + } if ((d->type == BOX_INLINE && (d->object || d->gadget)) || d->type == BOX_INLINE_BLOCK) { h = d->margin[TOP] + d->border[TOP] + d->padding[TOP] + @@ -2134,9 +2145,14 @@ bool layout_line(struct box *first, int *width, int *y, if (used_height < h) used_height = h; } - if (d->type == BOX_TEXT && d->height > used_height) - used_height = d->height; + if (d->line_height > used_height) + used_height = d->line_height; } + + /* Set the line_height for the boxes on the current line */ + for (d = first; d != b; d = d->next) + d->line_height = used_height; + first->inline_new_line = true; assert(b != first || (move_y && 0 < used_height && (left || right))); -- cgit v1.2.3