mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-12-24 04:56:50 +03:00
Don't attempt to basline-align non text related inlines.
svn path=/trunk/netsurf/; revision=8762
This commit is contained in:
parent
010774fb25
commit
48e3221458
269
render/layout.c
269
render/layout.c
@ -99,7 +99,7 @@ static void place_float_below(struct box *c, int width, int cx, int y,
|
||||
static bool layout_table(struct box *box, int available_width,
|
||||
struct content *content);
|
||||
static void layout_move_children(struct box *box, int x, int y);
|
||||
static void calculate_mbp_width(const css_computed_style *style,
|
||||
static void calculate_mbp_width(const css_computed_style *style,
|
||||
unsigned int side, bool margin, bool border, bool padding,
|
||||
int *fixed, float *frac);
|
||||
static void layout_lists(struct box *box,
|
||||
@ -141,8 +141,8 @@ bool layout_document(struct content *content, int width, int height)
|
||||
layout_block_find_dimensions(width, height, 0, 0, doc);
|
||||
doc->x = doc->margin[LEFT] + doc->border[LEFT].width;
|
||||
doc->y = doc->margin[TOP] + doc->border[TOP].width;
|
||||
width -= doc->margin[LEFT] + doc->border[LEFT].width +
|
||||
doc->padding[LEFT] + doc->padding[RIGHT] +
|
||||
width -= doc->margin[LEFT] + doc->border[LEFT].width +
|
||||
doc->padding[LEFT] + doc->padding[RIGHT] +
|
||||
doc->border[RIGHT].width + doc->margin[RIGHT];
|
||||
if (width < 0)
|
||||
width = 0;
|
||||
@ -155,7 +155,7 @@ bool layout_document(struct content *content, int width, int height)
|
||||
doc->border[BOTTOM].width + doc->margin[BOTTOM] <
|
||||
height) {
|
||||
doc->height = height - (doc->y + doc->padding[TOP] +
|
||||
doc->padding[BOTTOM] +
|
||||
doc->padding[BOTTOM] +
|
||||
doc->border[BOTTOM].width +
|
||||
doc->margin[BOTTOM]);
|
||||
if (doc->children)
|
||||
@ -274,7 +274,7 @@ bool layout_block_context(struct box *block, int viewport_height,
|
||||
gadget_unit = CSS_UNIT_EM;
|
||||
gadget_size = INTTOFIX(1);
|
||||
if (block->height == AUTO)
|
||||
block->height = FIXTOINT(nscss_len2px(gadget_size,
|
||||
block->height = FIXTOINT(nscss_len2px(gadget_size,
|
||||
gadget_unit, block->style));
|
||||
}
|
||||
|
||||
@ -322,9 +322,9 @@ bool layout_block_context(struct box *block, int viewport_height,
|
||||
*/
|
||||
|
||||
if (box->style &&
|
||||
(css_computed_position(box->style) ==
|
||||
(css_computed_position(box->style) ==
|
||||
CSS_POSITION_ABSOLUTE ||
|
||||
css_computed_position(box->style) ==
|
||||
css_computed_position(box->style) ==
|
||||
CSS_POSITION_FIXED)) {
|
||||
box->x = box->parent->padding[LEFT];
|
||||
/* absolute positioned; this element will establish
|
||||
@ -335,7 +335,7 @@ bool layout_block_context(struct box *block, int viewport_height,
|
||||
|
||||
/* Clearance. */
|
||||
y = 0;
|
||||
if (box->style && css_computed_clear(box->style) !=
|
||||
if (box->style && css_computed_clear(box->style) !=
|
||||
CSS_CLEAR_NONE)
|
||||
y = layout_clear(block->float_children,
|
||||
css_computed_clear(box->style));
|
||||
@ -447,7 +447,7 @@ bool layout_block_context(struct box *block, int viewport_height,
|
||||
/* Unless the box has an overflow style of visible, the box
|
||||
* establishes a new block context. */
|
||||
if (box->type == BOX_BLOCK && box->style &&
|
||||
css_computed_overflow(box->style) !=
|
||||
css_computed_overflow(box->style) !=
|
||||
CSS_OVERFLOW_VISIBLE) {
|
||||
cy += max_pos_margin - max_neg_margin;
|
||||
box->y += max_pos_margin - max_neg_margin;
|
||||
@ -549,7 +549,7 @@ bool layout_block_context(struct box *block, int viewport_height,
|
||||
layout_block_add_scrollbar(box, BOTTOM);
|
||||
}
|
||||
|
||||
cy += box->height + box->padding[BOTTOM] +
|
||||
cy += box->height + box->padding[BOTTOM] +
|
||||
box->border[BOTTOM].width;
|
||||
max_pos_margin = max_neg_margin = 0;
|
||||
if (max_pos_margin < box->margin[BOTTOM])
|
||||
@ -558,7 +558,7 @@ bool layout_block_context(struct box *block, int viewport_height,
|
||||
max_neg_margin = -box->margin[BOTTOM];
|
||||
cx -= box->x;
|
||||
y = box->y + box->padding[TOP] + box->height +
|
||||
box->padding[BOTTOM] +
|
||||
box->padding[BOTTOM] +
|
||||
box->border[BOTTOM].width;
|
||||
advance_to_next_box:
|
||||
if (!box->next) {
|
||||
@ -580,7 +580,7 @@ bool layout_block_context(struct box *block, int viewport_height,
|
||||
|
||||
/* Apply any min-height and max-height to
|
||||
* boxes in normal flow */
|
||||
if (box->style &&
|
||||
if (box->style &&
|
||||
css_computed_position(box->style) !=
|
||||
CSS_POSITION_ABSOLUTE &&
|
||||
layout_apply_minmax_height(box,
|
||||
@ -625,7 +625,7 @@ bool layout_block_context(struct box *block, int viewport_height,
|
||||
layout_block_add_scrollbar(block, BOTTOM);
|
||||
}
|
||||
|
||||
if (block->style && css_computed_position(block->style) !=
|
||||
if (block->style && css_computed_position(block->style) !=
|
||||
CSS_POSITION_ABSOLUTE) {
|
||||
/* Block is in normal flow */
|
||||
layout_apply_minmax_height(block, NULL);
|
||||
@ -907,7 +907,7 @@ bool layout_apply_minmax_height(struct box *box, struct box *container)
|
||||
css_unit unit = CSS_UNIT_PX;
|
||||
|
||||
if (containing_block) {
|
||||
htype = css_computed_height(containing_block->style,
|
||||
htype = css_computed_height(containing_block->style,
|
||||
&length, &unit);
|
||||
}
|
||||
|
||||
@ -921,8 +921,8 @@ bool layout_apply_minmax_height(struct box *box, struct box *container)
|
||||
CSS_POSITION_ABSOLUTE ||
|
||||
htype == CSS_HEIGHT_SET)) {
|
||||
/* Box is absolutely positioned or its
|
||||
* containing block has a valid
|
||||
* specified height. (CSS 2.1
|
||||
* containing block has a valid
|
||||
* specified height. (CSS 2.1
|
||||
* Section 10.5) */
|
||||
h = FIXTOFLT(length) *
|
||||
containing_block->height / 100;
|
||||
@ -932,7 +932,7 @@ bool layout_apply_minmax_height(struct box *box, struct box *container)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
h = FIXTOINT(nscss_len2px(length, unit,
|
||||
h = FIXTOINT(nscss_len2px(length, unit,
|
||||
box->style));
|
||||
if (h < box->height) {
|
||||
box->height = h;
|
||||
@ -951,8 +951,8 @@ bool layout_apply_minmax_height(struct box *box, struct box *container)
|
||||
CSS_POSITION_ABSOLUTE ||
|
||||
htype == CSS_HEIGHT_SET)) {
|
||||
/* Box is absolutely positioned or its
|
||||
* containing block has a valid
|
||||
* specified height. (CSS 2.1
|
||||
* containing block has a valid
|
||||
* specified height. (CSS 2.1
|
||||
* Section 10.5) */
|
||||
h = FIXTOFLT(length) *
|
||||
containing_block->height / 100;
|
||||
@ -962,7 +962,7 @@ bool layout_apply_minmax_height(struct box *box, struct box *container)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
h = FIXTOINT(nscss_len2px(length, unit,
|
||||
h = FIXTOINT(nscss_len2px(length, unit,
|
||||
box->style));
|
||||
if (h > box->height) {
|
||||
box->height = h;
|
||||
@ -1045,8 +1045,8 @@ int layout_solve_width(int available_width, int width, int lm, int rm,
|
||||
if (margin[RIGHT] == AUTO) margin[RIGHT] = rm;
|
||||
|
||||
width = available_width -
|
||||
(margin[LEFT] + border[LEFT].width +
|
||||
padding[LEFT] + padding[RIGHT] +
|
||||
(margin[LEFT] + border[LEFT].width +
|
||||
padding[LEFT] + padding[RIGHT] +
|
||||
border[RIGHT].width + margin[RIGHT]);
|
||||
width = width < 0 ? 0 : width;
|
||||
auto_width = true;
|
||||
@ -1078,14 +1078,14 @@ int layout_solve_width(int available_width, int width, int lm, int rm,
|
||||
} else if (!auto_width && margin[LEFT] == AUTO) {
|
||||
margin[LEFT] = available_width - lm -
|
||||
(border[LEFT].width + padding[LEFT] + width +
|
||||
padding[RIGHT] + border[RIGHT].width +
|
||||
padding[RIGHT] + border[RIGHT].width +
|
||||
margin[RIGHT]);
|
||||
margin[LEFT] = margin[LEFT] < lm ? lm : margin[LEFT];
|
||||
} else if (!auto_width) {
|
||||
/* margin-right auto or "over-constrained" */
|
||||
margin[RIGHT] = available_width - rm -
|
||||
(margin[LEFT] + border[LEFT].width +
|
||||
padding[LEFT] + width + padding[RIGHT] +
|
||||
padding[LEFT] + width + padding[RIGHT] +
|
||||
border[RIGHT].width);
|
||||
}
|
||||
|
||||
@ -1111,7 +1111,7 @@ void layout_float_find_dimensions(int available_width,
|
||||
int *margin = box->margin;
|
||||
int *padding = box->padding;
|
||||
struct box_border *border = box->border;
|
||||
int scrollbar_width =
|
||||
int scrollbar_width =
|
||||
(css_computed_overflow(style) == CSS_OVERFLOW_SCROLL ||
|
||||
css_computed_overflow(style) == CSS_OVERFLOW_AUTO) ?
|
||||
SCROLLBAR_WIDTH : 0;
|
||||
@ -1155,27 +1155,27 @@ void layout_float_find_dimensions(int available_width,
|
||||
box->gadget->type == GADGET_FILE) {
|
||||
if (width == AUTO) {
|
||||
size = INTTOFIX(10);
|
||||
width = FIXTOINT(nscss_len2px(size, unit,
|
||||
width = FIXTOINT(nscss_len2px(size, unit,
|
||||
box->style));
|
||||
}
|
||||
if (box->gadget->type == GADGET_FILE &&
|
||||
height == AUTO) {
|
||||
size = FLTTOFIX(1.5);
|
||||
height = FIXTOINT(nscss_len2px(size, unit,
|
||||
height = FIXTOINT(nscss_len2px(size, unit,
|
||||
box->style));
|
||||
}
|
||||
}
|
||||
if (box->gadget->type == GADGET_TEXTAREA) {
|
||||
if (width == AUTO) {
|
||||
size = INTTOFIX(10);
|
||||
width = FIXTOINT(nscss_len2px(size, unit,
|
||||
width = FIXTOINT(nscss_len2px(size, unit,
|
||||
box->style));
|
||||
} else {
|
||||
width -= scrollbar_width;
|
||||
}
|
||||
if (height == AUTO) {
|
||||
size = INTTOFIX(4);
|
||||
height = FIXTOINT(nscss_len2px(size, unit,
|
||||
height = FIXTOINT(nscss_len2px(size, unit,
|
||||
box->style));
|
||||
}
|
||||
}
|
||||
@ -1241,10 +1241,10 @@ void layout_find_dimensions(int available_width, int viewport_height,
|
||||
|
||||
if (wtype == CSS_WIDTH_SET) {
|
||||
if (unit == CSS_UNIT_PCT) {
|
||||
*width = (FIXTOFLT(value) * available_width)
|
||||
*width = (FIXTOFLT(value) * available_width)
|
||||
/ 100;
|
||||
} else {
|
||||
*width = FIXTOINT(nscss_len2px(value, unit,
|
||||
*width = FIXTOINT(nscss_len2px(value, unit,
|
||||
style));
|
||||
}
|
||||
} else {
|
||||
@ -1272,7 +1272,7 @@ void layout_find_dimensions(int available_width, int viewport_height,
|
||||
if (unit == CSS_UNIT_PCT) {
|
||||
enum css_height cbhtype;
|
||||
|
||||
if (css_computed_position(box->style) ==
|
||||
if (css_computed_position(box->style) ==
|
||||
CSS_POSITION_ABSOLUTE) {
|
||||
/* Box is absolutely positioned */
|
||||
assert(box->float_container);
|
||||
@ -1285,11 +1285,11 @@ void layout_find_dimensions(int available_width, int viewport_height,
|
||||
css_computed_float(box->style) ==
|
||||
CSS_FLOAT_RIGHT)) {
|
||||
/* Box is a float */
|
||||
assert(box->parent &&
|
||||
assert(box->parent &&
|
||||
box->parent->parent &&
|
||||
box->parent->parent->parent);
|
||||
|
||||
containing_block =
|
||||
containing_block =
|
||||
box->parent->parent->parent;
|
||||
} else if (box->parent && box->parent->type !=
|
||||
BOX_INLINE_CONTAINER) {
|
||||
@ -1317,13 +1317,13 @@ void layout_find_dimensions(int available_width, int viewport_height,
|
||||
CSS_POSITION_ABSOLUTE ||
|
||||
cbhtype == CSS_HEIGHT_SET)) {
|
||||
/* Box is absolutely positioned or its
|
||||
* containing block has a valid
|
||||
* specified height.
|
||||
* containing block has a valid
|
||||
* specified height.
|
||||
* (CSS 2.1 Section 10.5) */
|
||||
*height = FIXTOFLT(value) *
|
||||
containing_block->height /
|
||||
containing_block->height /
|
||||
100;
|
||||
} else if ((!box->parent ||
|
||||
} else if ((!box->parent ||
|
||||
!box->parent->parent) &&
|
||||
viewport_height >= 0) {
|
||||
/* If root element or it's child
|
||||
@ -1336,7 +1336,7 @@ void layout_find_dimensions(int available_width, int viewport_height,
|
||||
*height = AUTO;
|
||||
}
|
||||
} else {
|
||||
*height = FIXTOINT(nscss_len2px(value, unit,
|
||||
*height = FIXTOINT(nscss_len2px(value, unit,
|
||||
style));
|
||||
}
|
||||
} else {
|
||||
@ -1362,10 +1362,10 @@ void layout_find_dimensions(int available_width, int viewport_height,
|
||||
|
||||
if (type == CSS_MAX_WIDTH_SET) {
|
||||
if (unit == CSS_UNIT_PCT) {
|
||||
*max_width = (FIXTOFLT(value) *
|
||||
*max_width = (FIXTOFLT(value) *
|
||||
available_width) / 100;
|
||||
} else {
|
||||
*max_width = FIXTOINT(nscss_len2px(value, unit,
|
||||
*max_width = FIXTOINT(nscss_len2px(value, unit,
|
||||
style));
|
||||
}
|
||||
} else {
|
||||
@ -1395,7 +1395,7 @@ void layout_find_dimensions(int available_width, int viewport_height,
|
||||
*min_width = (FIXTOFLT(value) *
|
||||
available_width) / 100;
|
||||
} else {
|
||||
*min_width = FIXTOINT(nscss_len2px(value, unit,
|
||||
*min_width = FIXTOINT(nscss_len2px(value, unit,
|
||||
style));
|
||||
}
|
||||
} else {
|
||||
@ -1421,7 +1421,7 @@ void layout_find_dimensions(int available_width, int viewport_height,
|
||||
|
||||
switch (i) {
|
||||
case TOP:
|
||||
type = css_computed_margin_top(style,
|
||||
type = css_computed_margin_top(style,
|
||||
&value, &unit);
|
||||
break;
|
||||
case RIGHT:
|
||||
@ -1458,7 +1458,7 @@ void layout_find_dimensions(int available_width, int viewport_height,
|
||||
|
||||
switch (i) {
|
||||
case TOP:
|
||||
type = css_computed_padding_top(style,
|
||||
type = css_computed_padding_top(style,
|
||||
&value, &unit);
|
||||
break;
|
||||
case RIGHT:
|
||||
@ -1479,7 +1479,7 @@ void layout_find_dimensions(int available_width, int viewport_height,
|
||||
padding[i] = available_width *
|
||||
FIXTOFLT(value) / 100;
|
||||
} else {
|
||||
padding[i] = FIXTOINT(nscss_len2px(value, unit,
|
||||
padding[i] = FIXTOINT(nscss_len2px(value, unit,
|
||||
style));
|
||||
}
|
||||
}
|
||||
@ -1488,7 +1488,7 @@ void layout_find_dimensions(int available_width, int viewport_height,
|
||||
if (border && box->type != BOX_TABLE_CELL) {
|
||||
enum css_border_width wtype;
|
||||
enum css_border_style bstyle = CSS_BORDER_STYLE_NONE;
|
||||
enum css_border_color bcolor =
|
||||
enum css_border_color bcolor =
|
||||
CSS_BORDER_COLOR_TRANSPARENT;
|
||||
css_color color = 0;
|
||||
css_fixed value = 0;
|
||||
@ -1496,17 +1496,17 @@ void layout_find_dimensions(int available_width, int viewport_height,
|
||||
|
||||
switch (i) {
|
||||
case TOP:
|
||||
wtype = css_computed_border_top_width(style,
|
||||
wtype = css_computed_border_top_width(style,
|
||||
&value, &unit);
|
||||
bstyle = css_computed_border_top_style(style);
|
||||
bcolor = css_computed_border_top_color(style,
|
||||
bcolor = css_computed_border_top_color(style,
|
||||
&color);
|
||||
break;
|
||||
case RIGHT:
|
||||
wtype = css_computed_border_right_width(style,
|
||||
&value, &unit);
|
||||
bstyle = css_computed_border_right_style(style);
|
||||
bcolor = css_computed_border_right_color(style,
|
||||
bcolor = css_computed_border_right_color(style,
|
||||
&color);
|
||||
break;
|
||||
case BOTTOM:
|
||||
@ -1521,7 +1521,7 @@ void layout_find_dimensions(int available_width, int viewport_height,
|
||||
wtype = css_computed_border_left_width(style,
|
||||
&value, &unit);
|
||||
bstyle = css_computed_border_left_style(style);
|
||||
bcolor = css_computed_border_left_color(style,
|
||||
bcolor = css_computed_border_left_color(style,
|
||||
&color);
|
||||
break;
|
||||
}
|
||||
@ -1535,10 +1535,10 @@ void layout_find_dimensions(int available_width, int viewport_height,
|
||||
/* spec unclear: following Mozilla */
|
||||
border[i].width = 0;
|
||||
else
|
||||
border[i].width = FIXTOINT(nscss_len2px(value,
|
||||
border[i].width = FIXTOINT(nscss_len2px(value,
|
||||
unit, style));
|
||||
|
||||
/* Special case for border-collapse: make all borders
|
||||
/* Special case for border-collapse: make all borders
|
||||
* on table/table-row-group/table-row zero width. */
|
||||
if (css_computed_border_collapse(style) ==
|
||||
CSS_BORDER_COLLAPSE_COLLAPSE &&
|
||||
@ -1905,9 +1905,9 @@ bool layout_line(struct box *first, int *width, int *y,
|
||||
if (b->type == BOX_FLOAT_LEFT || b->type == BOX_FLOAT_RIGHT)
|
||||
continue;
|
||||
if (b->type == BOX_INLINE_BLOCK &&
|
||||
(css_computed_position(b->style) ==
|
||||
(css_computed_position(b->style) ==
|
||||
CSS_POSITION_ABSOLUTE ||
|
||||
css_computed_position(b->style) ==
|
||||
css_computed_position(b->style) ==
|
||||
CSS_POSITION_FIXED))
|
||||
continue;
|
||||
|
||||
@ -1921,13 +1921,13 @@ bool layout_line(struct box *first, int *width, int *y,
|
||||
if (!layout_float(b, *width, content))
|
||||
return false;
|
||||
h = b->border[TOP].width + b->padding[TOP] + b->height +
|
||||
b->padding[BOTTOM] +
|
||||
b->padding[BOTTOM] +
|
||||
b->border[BOTTOM].width;
|
||||
if (height < h)
|
||||
height = h;
|
||||
x += b->margin[LEFT] + b->border[LEFT].width +
|
||||
b->padding[LEFT] + b->width +
|
||||
b->padding[RIGHT] +
|
||||
b->padding[RIGHT] +
|
||||
b->border[RIGHT].width +
|
||||
b->margin[RIGHT];
|
||||
space_after = 0;
|
||||
@ -1950,7 +1950,7 @@ bool layout_line(struct box *first, int *width, int *y,
|
||||
b->inline_end->border[RIGHT] =
|
||||
b->border[RIGHT];
|
||||
} else {
|
||||
x += b->padding[RIGHT] +
|
||||
x += b->padding[RIGHT] +
|
||||
b->border[RIGHT].width +
|
||||
b->margin[RIGHT];
|
||||
}
|
||||
@ -2034,7 +2034,7 @@ bool layout_line(struct box *first, int *width, int *y,
|
||||
if (unit == CSS_UNIT_PCT) {
|
||||
b->width = *width * FIXTOFLT(value) / 100;
|
||||
} else {
|
||||
b->width = FIXTOINT(nscss_len2px(value, unit,
|
||||
b->width = FIXTOINT(nscss_len2px(value, unit,
|
||||
b->style));
|
||||
}
|
||||
} else {
|
||||
@ -2044,12 +2044,12 @@ bool layout_line(struct box *first, int *width, int *y,
|
||||
/* height */
|
||||
htype = css_computed_height(b->style, &value, &unit);
|
||||
if (htype == CSS_HEIGHT_SET) {
|
||||
b->height = FIXTOINT(nscss_len2px(value, unit,
|
||||
b->height = FIXTOINT(nscss_len2px(value, unit,
|
||||
b->style));
|
||||
} else {
|
||||
b->height = AUTO;
|
||||
}
|
||||
|
||||
|
||||
if (b->object) {
|
||||
if (b->width == AUTO && b->height == AUTO) {
|
||||
b->width = b->object->width;
|
||||
@ -2072,10 +2072,10 @@ bool layout_line(struct box *first, int *width, int *y,
|
||||
} else {
|
||||
/* form control with no object */
|
||||
if (b->width == AUTO)
|
||||
b->width = FIXTOINT(nscss_len2px(INTTOFIX(1),
|
||||
b->width = FIXTOINT(nscss_len2px(INTTOFIX(1),
|
||||
CSS_UNIT_EM, b->style));
|
||||
if (b->height == AUTO)
|
||||
b->height = FIXTOINT(nscss_len2px(INTTOFIX(1),
|
||||
b->height = FIXTOINT(nscss_len2px(INTTOFIX(1),
|
||||
CSS_UNIT_EM, b->style));
|
||||
}
|
||||
|
||||
@ -2116,9 +2116,9 @@ bool layout_line(struct box *first, int *width, int *y,
|
||||
for (x = x_previous = 0, b = first; x <= x1 - x0 && b; b = b->next) {
|
||||
LOG(("pass 2: b %p, x %i", b, x));
|
||||
if (b->type == BOX_INLINE_BLOCK &&
|
||||
(css_computed_position(b->style) ==
|
||||
(css_computed_position(b->style) ==
|
||||
CSS_POSITION_ABSOLUTE ||
|
||||
css_computed_position(b->style) ==
|
||||
css_computed_position(b->style) ==
|
||||
CSS_POSITION_FIXED)) {
|
||||
b->x = x + space_after;
|
||||
|
||||
@ -2143,7 +2143,7 @@ bool layout_line(struct box *first, int *width, int *y,
|
||||
b->x += b->margin[LEFT] + b->border[LEFT].width;
|
||||
x = b->x + b->padding[LEFT] + b->width;
|
||||
} else if (b->type == BOX_INLINE_END) {
|
||||
x += b->padding[RIGHT] +
|
||||
x += b->padding[RIGHT] +
|
||||
b->border[RIGHT].width +
|
||||
b->margin[RIGHT];
|
||||
} else {
|
||||
@ -2185,31 +2185,31 @@ bool layout_line(struct box *first, int *width, int *y,
|
||||
|
||||
if (!layout_float(d, *width, content))
|
||||
return false;
|
||||
LOG(("%p : %d %d", d, d->margin[TOP],
|
||||
LOG(("%p : %d %d", d, d->margin[TOP],
|
||||
d->border[TOP].width));
|
||||
d->x = d->margin[LEFT] + d->border[LEFT].width;
|
||||
d->y = d->margin[TOP] + d->border[TOP].width;
|
||||
b->width = d->margin[LEFT] + d->border[LEFT].width +
|
||||
d->padding[LEFT] + d->width +
|
||||
d->padding[RIGHT] +
|
||||
d->padding[RIGHT] +
|
||||
d->border[RIGHT].width +
|
||||
d->margin[RIGHT];
|
||||
b->height = d->margin[TOP] + d->border[TOP].width +
|
||||
d->padding[TOP] + d->height +
|
||||
d->padding[BOTTOM] +
|
||||
d->padding[BOTTOM] +
|
||||
d->border[BOTTOM].width +
|
||||
d->margin[BOTTOM];
|
||||
|
||||
if (b->width > (x1 - x0) - x)
|
||||
place_below = true;
|
||||
if (d->style && (css_computed_clear(d->style) ==
|
||||
if (d->style && (css_computed_clear(d->style) ==
|
||||
CSS_CLEAR_NONE ||
|
||||
(css_computed_clear(d->style) ==
|
||||
(css_computed_clear(d->style) ==
|
||||
CSS_CLEAR_LEFT && left == 0) ||
|
||||
(css_computed_clear(d->style) ==
|
||||
CSS_CLEAR_RIGHT &&
|
||||
(css_computed_clear(d->style) ==
|
||||
CSS_CLEAR_RIGHT &&
|
||||
right == 0) ||
|
||||
(css_computed_clear(d->style) ==
|
||||
(css_computed_clear(d->style) ==
|
||||
CSS_CLEAR_BOTH &&
|
||||
left == 0 && right == 0)) &&
|
||||
(!place_below ||
|
||||
@ -2449,17 +2449,17 @@ bool layout_line(struct box *first, int *width, int *y,
|
||||
d->x += x0;
|
||||
}
|
||||
if (d->type == BOX_INLINE_BLOCK &&
|
||||
(css_computed_position(d->style) ==
|
||||
(css_computed_position(d->style) ==
|
||||
CSS_POSITION_ABSOLUTE ||
|
||||
css_computed_position(d->style) ==
|
||||
css_computed_position(d->style) ==
|
||||
CSS_POSITION_FIXED))
|
||||
continue;
|
||||
if ((d->type == BOX_INLINE && (d->object || d->gadget)) ||
|
||||
d->type == BOX_INLINE_BLOCK) {
|
||||
h = d->margin[TOP] + d->border[TOP].width +
|
||||
d->padding[TOP] + d->height +
|
||||
d->padding[BOTTOM] +
|
||||
d->border[BOTTOM].width +
|
||||
h = d->margin[TOP] + d->border[TOP].width +
|
||||
d->padding[TOP] + d->height +
|
||||
d->padding[BOTTOM] +
|
||||
d->border[BOTTOM].width +
|
||||
d->margin[BOTTOM];
|
||||
if (used_height < h)
|
||||
used_height = h;
|
||||
@ -2476,10 +2476,11 @@ bool layout_line(struct box *first, int *width, int *y,
|
||||
/* align baselines of all text boxes by moving their y so that their
|
||||
* 0.75 point is aligned */
|
||||
for (d = first; d != b; d = d->next) {
|
||||
if (d->type == BOX_INLINE || d->type == BOX_BR ||
|
||||
if ((d->type == BOX_INLINE && d->inline_end) ||
|
||||
d->type == BOX_BR ||
|
||||
d->type == BOX_TEXT ||
|
||||
d->type == BOX_INLINE_END) {
|
||||
d->y += 0.75 * used_height - 0.75 * d->height;
|
||||
d->y += 0.75 * (used_height - d->height);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2657,7 +2658,7 @@ struct box *layout_minmax_line(struct box *first,
|
||||
b->width = width * FIXTOFLT(value) / 100
|
||||
*/
|
||||
} else {
|
||||
width = FIXTOINT(nscss_len2px(value, unit,
|
||||
width = FIXTOINT(nscss_len2px(value, unit,
|
||||
b->style));
|
||||
if (width < 0)
|
||||
width = 0;
|
||||
@ -2694,7 +2695,7 @@ struct box *layout_minmax_line(struct box *first,
|
||||
} else {
|
||||
/* form control with no object */
|
||||
if (width == AUTO)
|
||||
width = FIXTOINT(nscss_len2px(INTTOFIX(1),
|
||||
width = FIXTOINT(nscss_len2px(INTTOFIX(1),
|
||||
CSS_UNIT_EM, b->style));
|
||||
}
|
||||
|
||||
@ -2899,7 +2900,7 @@ bool layout_table(struct box *table, int available_width,
|
||||
}
|
||||
|
||||
/* border-spacing is used in the separated borders model */
|
||||
if (css_computed_border_collapse(style) ==
|
||||
if (css_computed_border_collapse(style) ==
|
||||
CSS_BORDER_COLLAPSE_SEPARATE) {
|
||||
css_fixed h = 0, v = 0;
|
||||
css_unit hu = CSS_UNIT_PX, vu = CSS_UNIT_PX;
|
||||
@ -2917,12 +2918,12 @@ bool layout_table(struct box *table, int available_width,
|
||||
table_width = ceil(available_width *
|
||||
FIXTOFLT(value) / 100);
|
||||
} else {
|
||||
table_width =
|
||||
table_width =
|
||||
FIXTOINT(nscss_len2px(value, unit, style));
|
||||
}
|
||||
|
||||
/* specified width includes border */
|
||||
table_width -= table->border[LEFT].width +
|
||||
table_width -= table->border[LEFT].width +
|
||||
table->border[RIGHT].width;
|
||||
table_width = table_width < 0 ? 0 : table_width;
|
||||
|
||||
@ -2944,9 +2945,9 @@ bool layout_table(struct box *table, int available_width,
|
||||
htype = css_computed_height(style, &value, &unit);
|
||||
if (htype == CSS_HEIGHT_SET) {
|
||||
if (unit == CSS_UNIT_PCT) {
|
||||
/* This is the minimum height for the table
|
||||
/* This is the minimum height for the table
|
||||
* (see 17.5.3) */
|
||||
if (css_computed_position(table->style) ==
|
||||
if (css_computed_position(table->style) ==
|
||||
CSS_POSITION_ABSOLUTE) {
|
||||
/* Table is absolutely positioned */
|
||||
assert(table->float_container);
|
||||
@ -2961,7 +2962,7 @@ bool layout_table(struct box *table, int available_width,
|
||||
/* Table is a float */
|
||||
assert(table->parent && table->parent->parent &&
|
||||
table->parent->parent->parent);
|
||||
containing_block =
|
||||
containing_block =
|
||||
table->parent->parent->parent;
|
||||
} else if (table->parent && table->parent->type !=
|
||||
BOX_INLINE_CONTAINER) {
|
||||
@ -2982,7 +2983,7 @@ bool layout_table(struct box *table, int available_width,
|
||||
&ignored, &unit);
|
||||
}
|
||||
|
||||
if (containing_block &&
|
||||
if (containing_block &&
|
||||
containing_block->height != AUTO &&
|
||||
(css_computed_position(table->style) ==
|
||||
CSS_POSITION_ABSOLUTE ||
|
||||
@ -2994,7 +2995,7 @@ bool layout_table(struct box *table, int available_width,
|
||||
containing_block->height / 100;
|
||||
}
|
||||
} else {
|
||||
/* This is the minimum height for the table
|
||||
/* This is the minimum height for the table
|
||||
* (see 17.5.3) */
|
||||
min_height = FIXTOINT(nscss_len2px(value, unit, style));
|
||||
}
|
||||
@ -3205,12 +3206,12 @@ bool layout_table(struct box *table, int available_width,
|
||||
htype = css_computed_height(c->style,
|
||||
&value, &unit);
|
||||
|
||||
if (htype == CSS_HEIGHT_SET &&
|
||||
if (htype == CSS_HEIGHT_SET &&
|
||||
unit != CSS_UNIT_PCT) {
|
||||
/* some sites use height="1" or similar
|
||||
* to attempt to make cells as small as
|
||||
* possible, so treat it as a minimum */
|
||||
int h = FIXTOINT(nscss_len2px(value,
|
||||
int h = FIXTOINT(nscss_len2px(value,
|
||||
unit, c->style));
|
||||
if (c->height < h)
|
||||
c->height = h;
|
||||
@ -3219,7 +3220,7 @@ bool layout_table(struct box *table, int available_width,
|
||||
*/
|
||||
if (c->height < row_height)
|
||||
c->height = row_height;
|
||||
c->x = xs[c->start_column] +
|
||||
c->x = xs[c->start_column] +
|
||||
c->border[LEFT].width;
|
||||
c->y = c->border[TOP].width;
|
||||
for (i = 0; i != c->columns; i++) {
|
||||
@ -3381,7 +3382,7 @@ void layout_minmax_table(struct box *table,
|
||||
}
|
||||
|
||||
/* border-spacing is used in the separated borders model */
|
||||
if (css_computed_border_collapse(table->style) ==
|
||||
if (css_computed_border_collapse(table->style) ==
|
||||
CSS_BORDER_COLLAPSE_SEPARATE) {
|
||||
css_fixed h = 0, v = 0;
|
||||
css_unit hu = CSS_UNIT_PX, vu = CSS_UNIT_PX;
|
||||
@ -3571,7 +3572,7 @@ void calculate_mbp_width(const css_computed_style *style, unsigned int side,
|
||||
len_func width;
|
||||
uint8_t (*style)(const css_computed_style *style);
|
||||
} border_funcs[4] = {
|
||||
{ css_computed_border_top_width,
|
||||
{ css_computed_border_top_width,
|
||||
css_computed_border_top_style },
|
||||
{ css_computed_border_right_width,
|
||||
css_computed_border_right_style },
|
||||
@ -3595,7 +3596,7 @@ void calculate_mbp_width(const css_computed_style *style, unsigned int side,
|
||||
if (unit == CSS_UNIT_PCT) {
|
||||
*frac += FIXTOFLT(value) * 0.01;
|
||||
} else {
|
||||
*fixed += FIXTOINT(nscss_len2px(value, unit,
|
||||
*fixed += FIXTOINT(nscss_len2px(value, unit,
|
||||
style));
|
||||
}
|
||||
}
|
||||
@ -3603,7 +3604,7 @@ void calculate_mbp_width(const css_computed_style *style, unsigned int side,
|
||||
|
||||
/* border */
|
||||
if (border) {
|
||||
if (border_funcs[side].style(style) !=
|
||||
if (border_funcs[side].style(style) !=
|
||||
CSS_BORDER_STYLE_NONE) {
|
||||
border_funcs[side].width(style, &value, &unit);
|
||||
|
||||
@ -3705,7 +3706,7 @@ void layout_position_relative(struct box *root, struct box *fp, int fx, int fy)
|
||||
continue;
|
||||
|
||||
/* If relatively positioned, get offsets */
|
||||
if (box->style && css_computed_position(box->style) ==
|
||||
if (box->style && css_computed_position(box->style) ==
|
||||
CSS_POSITION_RELATIVE)
|
||||
layout_compute_relative_offset(box, &x, &y);
|
||||
else
|
||||
@ -3714,9 +3715,9 @@ void layout_position_relative(struct box *root, struct box *fp, int fx, int fy)
|
||||
/* Adjust float coordinates.
|
||||
* (note float x and y are relative to their block formatting
|
||||
* context box and not their parent) */
|
||||
if (box->style && (css_computed_float(box->style) ==
|
||||
if (box->style && (css_computed_float(box->style) ==
|
||||
CSS_FLOAT_LEFT ||
|
||||
css_computed_float(box->style) ==
|
||||
css_computed_float(box->style) ==
|
||||
CSS_FLOAT_RIGHT) &&
|
||||
(fx != 0 || fy != 0)) {
|
||||
/* box is a float and there is a float offset to
|
||||
@ -3747,7 +3748,7 @@ void layout_position_relative(struct box *root, struct box *fp, int fx, int fy)
|
||||
|
||||
/* Ignore things we're not interested in. */
|
||||
if (!box->style || (box->style &&
|
||||
css_computed_position(box->style) !=
|
||||
css_computed_position(box->style) !=
|
||||
CSS_POSITION_RELATIVE))
|
||||
continue;
|
||||
|
||||
@ -3783,10 +3784,10 @@ void layout_compute_relative_offset(struct box *box, int *x, int *y)
|
||||
struct box *containing_block;
|
||||
|
||||
assert(box && box->parent && box->style &&
|
||||
css_computed_position(box->style) ==
|
||||
css_computed_position(box->style) ==
|
||||
CSS_POSITION_RELATIVE);
|
||||
|
||||
if (box->float_container && (css_computed_float(box->style) ==
|
||||
if (box->float_container && (css_computed_float(box->style) ==
|
||||
CSS_FLOAT_LEFT ||
|
||||
css_computed_float(box->style) == CSS_FLOAT_RIGHT)) {
|
||||
containing_block = box->float_container;
|
||||
@ -3864,24 +3865,24 @@ bool layout_position_absolute(struct box *box,
|
||||
for (c = box->children; c; c = c->next) {
|
||||
if ((c->type == BOX_BLOCK || c->type == BOX_TABLE ||
|
||||
c->type == BOX_INLINE_BLOCK) &&
|
||||
(css_computed_position(c->style) ==
|
||||
(css_computed_position(c->style) ==
|
||||
CSS_POSITION_ABSOLUTE ||
|
||||
css_computed_position(c->style) ==
|
||||
css_computed_position(c->style) ==
|
||||
CSS_POSITION_FIXED)) {
|
||||
if (!layout_absolute(c, containing_block,
|
||||
cx, cy, content))
|
||||
return false;
|
||||
if (!layout_position_absolute(c, c, 0, 0, content))
|
||||
return false;
|
||||
} else if (c->style && css_computed_position(c->style) ==
|
||||
} else if (c->style && css_computed_position(c->style) ==
|
||||
CSS_POSITION_RELATIVE) {
|
||||
if (!layout_position_absolute(c, c, 0, 0, content))
|
||||
return false;
|
||||
} else {
|
||||
int px, py;
|
||||
if (c->style && (css_computed_float(c->style) ==
|
||||
if (c->style && (css_computed_float(c->style) ==
|
||||
CSS_FLOAT_LEFT ||
|
||||
css_computed_float(c->style) ==
|
||||
css_computed_float(c->style) ==
|
||||
CSS_FLOAT_RIGHT)) {
|
||||
/* Float x/y coords are relative to nearest
|
||||
* ansestor with float_children, rather than
|
||||
@ -3972,8 +3973,8 @@ bool layout_absolute(struct box *box, struct box *containing_block,
|
||||
|
||||
/* 10.3.7 */
|
||||
LOG(("%i + %i + %i + %i + %i + %i + %i + %i + %i = %i",
|
||||
left, margin[LEFT], border[LEFT].width,
|
||||
padding[LEFT], width, padding[RIGHT],
|
||||
left, margin[LEFT], border[LEFT].width,
|
||||
padding[LEFT], width, padding[RIGHT],
|
||||
border[RIGHT].width, margin[RIGHT], right,
|
||||
containing_block->width));
|
||||
if (left == AUTO && width == AUTO && right == AUTO) {
|
||||
@ -4019,17 +4020,17 @@ bool layout_absolute(struct box *box, struct box *containing_block,
|
||||
margin[LEFT] = containing_block->width -
|
||||
left - border[LEFT].width -
|
||||
padding[LEFT] - width - padding[RIGHT] -
|
||||
border[RIGHT].width - margin[RIGHT] -
|
||||
border[RIGHT].width - margin[RIGHT] -
|
||||
right;
|
||||
} else if (margin[RIGHT] == AUTO) {
|
||||
margin[RIGHT] = containing_block->width -
|
||||
left - margin[LEFT] -
|
||||
left - margin[LEFT] -
|
||||
border[LEFT].width -
|
||||
padding[LEFT] - width - padding[RIGHT] -
|
||||
border[RIGHT].width - right;
|
||||
} else {
|
||||
right = containing_block->width -
|
||||
left - margin[LEFT] -
|
||||
left - margin[LEFT] -
|
||||
border[LEFT].width -
|
||||
padding[LEFT] - width - padding[RIGHT] -
|
||||
border[RIGHT].width - margin[RIGHT];
|
||||
@ -4058,7 +4059,7 @@ bool layout_absolute(struct box *box, struct box *containing_block,
|
||||
left = containing_block->width -
|
||||
margin[LEFT] - border[LEFT].width -
|
||||
padding[LEFT] - width - padding[RIGHT] -
|
||||
border[RIGHT].width - margin[RIGHT] -
|
||||
border[RIGHT].width - margin[RIGHT] -
|
||||
right;
|
||||
} else if (left == AUTO && width != AUTO && right == AUTO) {
|
||||
|
||||
@ -4070,7 +4071,7 @@ bool layout_absolute(struct box *box, struct box *containing_block,
|
||||
|
||||
left = static_left;
|
||||
right = containing_block->width -
|
||||
left - margin[LEFT] -
|
||||
left - margin[LEFT] -
|
||||
border[LEFT].width -
|
||||
padding[LEFT] - width - padding[RIGHT] -
|
||||
border[RIGHT].width - margin[RIGHT];
|
||||
@ -4090,7 +4091,7 @@ bool layout_absolute(struct box *box, struct box *containing_block,
|
||||
width = min_width;
|
||||
|
||||
right = containing_block->width -
|
||||
left - margin[LEFT] -
|
||||
left - margin[LEFT] -
|
||||
border[LEFT].width -
|
||||
padding[LEFT] - width - padding[RIGHT] -
|
||||
border[RIGHT].width - margin[RIGHT];
|
||||
@ -4105,14 +4106,14 @@ bool layout_absolute(struct box *box, struct box *containing_block,
|
||||
left = containing_block->width -
|
||||
margin[LEFT] - border[LEFT].width -
|
||||
padding[LEFT] - width - padding[RIGHT] -
|
||||
border[RIGHT].width - margin[RIGHT] -
|
||||
border[RIGHT].width - margin[RIGHT] -
|
||||
right;
|
||||
} else if (left != AUTO && width == AUTO && right != AUTO) {
|
||||
width = containing_block->width -
|
||||
left - margin[LEFT] -
|
||||
left - margin[LEFT] -
|
||||
border[LEFT].width -
|
||||
padding[LEFT] - padding[RIGHT] -
|
||||
border[RIGHT].width - margin[RIGHT] -
|
||||
border[RIGHT].width - margin[RIGHT] -
|
||||
right;
|
||||
|
||||
/* Adjust for {min|max}-width */
|
||||
@ -4130,15 +4131,15 @@ bool layout_absolute(struct box *box, struct box *containing_block,
|
||||
width = min_width;
|
||||
|
||||
right = containing_block->width -
|
||||
left - margin[LEFT] -
|
||||
left - margin[LEFT] -
|
||||
border[LEFT].width -
|
||||
padding[LEFT] - width - padding[RIGHT] -
|
||||
border[RIGHT].width - margin[RIGHT];
|
||||
}
|
||||
}
|
||||
LOG(("%i + %i + %i + %i + %i + %i + %i + %i + %i = %i",
|
||||
left, margin[LEFT], border[LEFT].width, padding[LEFT],
|
||||
width, padding[RIGHT], border[RIGHT].width,
|
||||
left, margin[LEFT], border[LEFT].width, padding[LEFT],
|
||||
width, padding[RIGHT], border[RIGHT].width,
|
||||
margin[RIGHT], right,
|
||||
containing_block->width));
|
||||
|
||||
@ -4169,8 +4170,8 @@ bool layout_absolute(struct box *box, struct box *containing_block,
|
||||
|
||||
/* 10.6.4 */
|
||||
LOG(("%i + %i + %i + %i + %i + %i + %i + %i + %i = %i",
|
||||
top, margin[TOP], border[TOP].width, padding[TOP],
|
||||
height, padding[BOTTOM], border[BOTTOM].width,
|
||||
top, margin[TOP], border[TOP].width, padding[TOP],
|
||||
height, padding[BOTTOM], border[BOTTOM].width,
|
||||
margin[BOTTOM], bottom,
|
||||
containing_block->height));
|
||||
if (top == AUTO && height == AUTO && bottom == AUTO) {
|
||||
@ -4257,8 +4258,8 @@ bool layout_absolute(struct box *box, struct box *containing_block,
|
||||
}
|
||||
}
|
||||
LOG(("%i + %i + %i + %i + %i + %i + %i + %i + %i = %i",
|
||||
top, margin[TOP], border[TOP].width, padding[TOP],
|
||||
height, padding[BOTTOM], border[BOTTOM].width,
|
||||
top, margin[TOP], border[TOP].width, padding[TOP],
|
||||
height, padding[BOTTOM], border[BOTTOM].width,
|
||||
margin[BOTTOM], bottom,
|
||||
containing_block->height));
|
||||
|
||||
@ -4309,7 +4310,7 @@ void layout_compute_offsets(struct box *box,
|
||||
type = css_computed_left(box->style, &value, &unit);
|
||||
if (type == CSS_LEFT_SET) {
|
||||
if (unit == CSS_UNIT_PCT) {
|
||||
*left = (FIXTOFLT(value) *
|
||||
*left = (FIXTOFLT(value) *
|
||||
containing_block->width) / 100;
|
||||
} else {
|
||||
*left = FIXTOINT(nscss_len2px(value, unit, box->style));
|
||||
@ -4322,10 +4323,10 @@ void layout_compute_offsets(struct box *box,
|
||||
type = css_computed_right(box->style, &value, &unit);
|
||||
if (type == CSS_RIGHT_SET) {
|
||||
if (unit == CSS_UNIT_PCT) {
|
||||
*right = (FIXTOFLT(value) *
|
||||
*right = (FIXTOFLT(value) *
|
||||
containing_block->width) / 100;
|
||||
} else {
|
||||
*right = FIXTOINT(nscss_len2px(value, unit,
|
||||
*right = FIXTOINT(nscss_len2px(value, unit,
|
||||
box->style));
|
||||
}
|
||||
} else {
|
||||
@ -4336,7 +4337,7 @@ void layout_compute_offsets(struct box *box,
|
||||
type = css_computed_top(box->style, &value, &unit);
|
||||
if (type == CSS_TOP_SET) {
|
||||
if (unit == CSS_UNIT_PCT) {
|
||||
*top = (FIXTOFLT(value) *
|
||||
*top = (FIXTOFLT(value) *
|
||||
containing_block->height) / 100;
|
||||
} else {
|
||||
*top = FIXTOINT(nscss_len2px(value, unit, box->style));
|
||||
@ -4349,10 +4350,10 @@ void layout_compute_offsets(struct box *box,
|
||||
type = css_computed_bottom(box->style, &value, &unit);
|
||||
if (type == CSS_BOTTOM_SET) {
|
||||
if (unit == CSS_UNIT_PCT) {
|
||||
*bottom = (FIXTOFLT(value) *
|
||||
*bottom = (FIXTOFLT(value) *
|
||||
containing_block->height) / 100;
|
||||
} else {
|
||||
*bottom = FIXTOINT(nscss_len2px(value, unit,
|
||||
*bottom = FIXTOINT(nscss_len2px(value, unit,
|
||||
box->style));
|
||||
}
|
||||
} else {
|
||||
@ -4427,7 +4428,7 @@ void layout_calculate_descendant_bboxes(struct box *box)
|
||||
|
||||
layout_calculate_descendant_bboxes(child);
|
||||
|
||||
if (box->style && css_computed_overflow(box->style) ==
|
||||
if (box->style && css_computed_overflow(box->style) ==
|
||||
CSS_OVERFLOW_HIDDEN)
|
||||
continue;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user