summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2009-01-31 13:26:28 +0000
committerMichael Drake <tlsa@netsurf-browser.org>2009-01-31 13:26:28 +0000
commit414f42faac3f69ab079c11c782cc8fb2da0e888a (patch)
treee02c2af3ffcfc29e0c203a17e69d457c15fe496f
parentbce01f90bcdc3dd9d574d4bf40897c4d576dc9aa (diff)
downloadnetsurf-414f42faac3f69ab079c11c782cc8fb2da0e888a.tar.gz
netsurf-414f42faac3f69ab079c11c782cc8fb2da0e888a.tar.bz2
Make inline boxes store the height of their line box and include in box tree dump.
svn path=/trunk/netsurf/; revision=6319
-rw-r--r--render/box.c4
-rw-r--r--render/box.h1
-rw-r--r--render/layout.c20
3 files changed, 23 insertions, 2 deletions
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)));