summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Bursa <james@netsurf-browser.org>2006-04-09 18:59:07 +0000
committerJames Bursa <james@netsurf-browser.org>2006-04-09 18:59:07 +0000
commit3e5490c6fd1341f8c4b4a0c38f818f73e491d7b1 (patch)
treec9dcc46323d1c5015281e000d9a13b7ffbb1d238
parent5bb7337e88660317cb1b5effcdc5a9816b319756 (diff)
downloadnetsurf-3e5490c6fd1341f8c4b4a0c38f818f73e491d7b1.tar.gz
netsurf-3e5490c6fd1341f8c4b4a0c38f818f73e491d7b1.tar.bz2
Move word that doesn't fit next to float below float correctly (fixes crash on ofsted site).
svn path=/trunk/netsurf/; revision=2516
-rw-r--r--render/layout.c62
1 files changed, 38 insertions, 24 deletions
diff --git a/render/layout.c b/render/layout.c
index db2d34c90..a5d42cecc 100644
--- a/render/layout.c
+++ b/render/layout.c
@@ -1287,7 +1287,6 @@ bool layout_line(struct box *first, int width, int *y,
split_box = b;
move_y = true;
inline_count++;
-/* fprintf(stderr, "layout_line: '%.*s' %li %li\n", b->length, b->text, xp, x); */
} else if (b->type == BOX_BR) {
b->x = x;
b->width = 0;
@@ -1302,7 +1301,6 @@ bool layout_line(struct box *first, int width, int *y,
LOG(("float %p", b));
d = b->children;
d->float_children = 0;
-/* css_dump_style(b->style); */
if (!layout_float(d, width, content))
return false;
@@ -1316,8 +1314,10 @@ bool layout_line(struct box *first, int width, int *y,
d->padding[TOP] + d->height +
d->padding[BOTTOM] + d->border[BOTTOM] +
d->margin[BOTTOM];
- if (b->width < (x1 - x0) - x || (left == 0 && right == 0 && x == 0)) {
- /* fits next to this line, or this line is empty with no floats */
+ if (b->width < (x1 - x0) - x ||
+ (left == 0 && right == 0 && x == 0)) {
+ /* fits next to this line, or this line is empty
+ * with no floats */
if (b->type == BOX_FLOAT_LEFT) {
b->x = cx + x0;
x0 += b->width;
@@ -1328,12 +1328,10 @@ bool layout_line(struct box *first, int width, int *y,
right = b;
}
b->y = cy;
-/* fprintf(stderr, "layout_line: float fits %li %li, edges %li %li\n", */
-/* b->x, b->y, x0, x1); */
} else {
/* doesn't fit: place below */
- place_float_below(b, width, cx, cy + height + 1, cont);
-/* fprintf(stderr, "layout_line: float doesn't fit %li %li\n", b->x, b->y); */
+ place_float_below(b, width,
+ cx, cy + height + 1, cont);
}
if (cont->float_children == b) {
LOG(("float %p already placed", b));
@@ -1375,17 +1373,16 @@ bool layout_line(struct box *first, int width, int *y,
nsfont_width(split_box->style, split_box->text,
space, &w);
- LOG(("splitting: split_box %p, space %zu, w %i, left %p, "
- "right %p, inline_count %u",
- split_box, space, w, left, right,
- inline_count));
-
- LOG(("Text was: '%s'", split_box->text));
-
+ LOG(("splitting: split_box %p \"%.*s\", space %zu, w %i, "
+ "left %p, right %p, inline_count %u",
+ split_box, (int) split_box->length,
+ split_box->text, space, w,
+ left, right, inline_count));
+
if ((space == 0 || x1 - x0 <= x + space_before + w) &&
!left && !right && inline_count == 1) {
- /* first word doesn't fit, but no floats and first
- on line so force in */
+ /* first word of box doesn't fit, but no floats and
+ * first box on line so force in */
if (space == 0) {
/* only one word in this box or not text */
b = split_box->next;
@@ -1416,12 +1413,30 @@ bool layout_line(struct box *first, int width, int *y,
b = c2;
}
x += space_before + w;
-/* fprintf(stderr, "layout_line: overflow, forcing\n"); */
- } else if (space == 0 || x1 - x0 <= x + space_before + w) {
- /* first word doesn't fit, but full width not
- available so leave for later */
+ LOG(("forcing"));
+ } else if ((space == 0 || x1 - x0 <= x + space_before + w) &&
+ inline_count == 1) {
+ /* first word of first box doesn't fit, but a float is
+ * taking some of the width so move below it */
+ assert(left || right);
+ used_height = 0;
+ if (left) {
+ LOG(("cy %i, left->y %i, left->height %i",
+ cy, left->y, left->height));
+ used_height = left->y + left->height - cy + 1;
+ LOG(("used_height %i", used_height));
+ }
+ if (right && used_height <
+ right->y + right->height - cy + 1)
+ used_height = right->y + right->height - cy + 1;
+ assert(0 < used_height);
+ b = split_box;
+ LOG(("moving below float"));
+ } else if (space == 0 || x1 - x0 <= x + space_before + w) {
+ /* first word of box doesn't fit so leave box for next
+ * line */
b = split_box;
-/* fprintf(stderr, "layout_line: overflow, leaving\n"); */
+ LOG(("leaving for next line"));
} else {
/* fit as many words as possible */
assert(space != 0);
@@ -1431,7 +1446,6 @@ bool layout_line(struct box *first, int width, int *y,
x1 - x0 - x - space_before, &space, &w);
LOG(("'%.*s' %i %zu %i", (int) split_box->length,
split_box->text, x1 - x0, space, w));
-/* assert(space == split_box->length || split_box->text[space] = ' '); */
if (space == 0)
space = 1;
if (space != split_box->length) {
@@ -1460,7 +1474,7 @@ bool layout_line(struct box *first, int width, int *y,
b = c2;
}
x += space_before + w;
-/* fprintf(stderr, "layout_line: overflow, fit\n"); */
+ LOG(("fitting words"));
}
move_y = true;
}