[project @ 2005-07-21 21:48:41 by bursa]
Fix layout min max bug with blocks with negative margins. Add assert()s to check that 0 <= min_width <= max_width at the end of each layout_minmax_X() function. svn path=/import/netsurf/; revision=1813
This commit is contained in:
parent
1a1901d19b
commit
4e9457bee1
|
@ -139,9 +139,12 @@ struct box {
|
||||||
int scroll_x; /**< Horizontal scroll of descendants. */
|
int scroll_x; /**< Horizontal scroll of descendants. */
|
||||||
int scroll_y; /**< Vertical scroll of descendants. */
|
int scroll_y; /**< Vertical scroll of descendants. */
|
||||||
|
|
||||||
/**< Width of box taking all line breaks (including margins etc.). */
|
/** Width of box taking all line breaks (including margins etc). Must
|
||||||
|
* be non-negative. */
|
||||||
int min_width;
|
int min_width;
|
||||||
int max_width; /**< Width that would be taken with no line breaks. */
|
/** Width that would be taken with no line breaks. Must be
|
||||||
|
* non-negative. */
|
||||||
|
int max_width;
|
||||||
|
|
||||||
/**< Byte offset within a textual representation of this content. */
|
/**< Byte offset within a textual representation of this content. */
|
||||||
size_t byte_offset;
|
size_t byte_offset;
|
||||||
|
|
|
@ -322,6 +322,8 @@ bool layout_block_context(struct box *block, struct content *content)
|
||||||
* Calculate minimum and maximum width of a block.
|
* Calculate minimum and maximum width of a block.
|
||||||
*
|
*
|
||||||
* \param block box of type BLOCK, INLINE_BLOCK, or TABLE_CELL
|
* \param block box of type BLOCK, INLINE_BLOCK, or TABLE_CELL
|
||||||
|
* \post block->min_width and block->max_width filled in,
|
||||||
|
* 0 <= block->min_width <= block->max_width
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void layout_minmax_block(struct box *block)
|
void layout_minmax_block(struct box *block)
|
||||||
|
@ -375,10 +377,16 @@ void layout_minmax_block(struct box *block)
|
||||||
/* add margins, border, padding to min, max widths */
|
/* add margins, border, padding to min, max widths */
|
||||||
calculate_mbp_width(block->style, LEFT, &extra_fixed, &extra_frac);
|
calculate_mbp_width(block->style, LEFT, &extra_fixed, &extra_frac);
|
||||||
calculate_mbp_width(block->style, RIGHT, &extra_fixed, &extra_frac);
|
calculate_mbp_width(block->style, RIGHT, &extra_fixed, &extra_frac);
|
||||||
|
if (extra_fixed < 0)
|
||||||
|
extra_fixed = 0;
|
||||||
|
if (extra_frac < 0)
|
||||||
|
extra_frac = 0;
|
||||||
if (1.0 <= extra_frac)
|
if (1.0 <= extra_frac)
|
||||||
extra_frac = 0.9;
|
extra_frac = 0.9;
|
||||||
block->min_width = (min + extra_fixed) / (1.0 - extra_frac);
|
block->min_width = (min + extra_fixed) / (1.0 - extra_frac);
|
||||||
block->max_width = (max + extra_fixed) / (1.0 - extra_frac);
|
block->max_width = (max + extra_fixed) / (1.0 - extra_frac);
|
||||||
|
|
||||||
|
assert(0 <= block->min_width && block->min_width <= block->max_width);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -762,6 +770,8 @@ bool layout_inline_container(struct box *inline_container, int width,
|
||||||
* Calculate minimum and maximum width of an inline container.
|
* Calculate minimum and maximum width of an inline container.
|
||||||
*
|
*
|
||||||
* \param inline_container box of type INLINE_CONTAINER
|
* \param inline_container box of type INLINE_CONTAINER
|
||||||
|
* \post inline_container->min_width and inline_container->max_width filled in,
|
||||||
|
* 0 <= inline_container->min_width <= inline_container->max_width
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void layout_minmax_inline_container(struct box *inline_container)
|
void layout_minmax_inline_container(struct box *inline_container)
|
||||||
|
@ -786,6 +796,10 @@ void layout_minmax_inline_container(struct box *inline_container)
|
||||||
|
|
||||||
inline_container->min_width = min;
|
inline_container->min_width = min;
|
||||||
inline_container->max_width = max;
|
inline_container->max_width = max;
|
||||||
|
|
||||||
|
assert(0 <= inline_container->min_width &&
|
||||||
|
inline_container->min_width <=
|
||||||
|
inline_container->max_width);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1300,6 +1314,7 @@ bool layout_line(struct box *first, int width, int *y,
|
||||||
* \param line_min updated to minimum width of line starting at first
|
* \param line_min updated to minimum width of line starting at first
|
||||||
* \param line_max updated to maximum width of line starting at first
|
* \param line_max updated to maximum width of line starting at first
|
||||||
* \return first box in next line, or 0 if no more lines
|
* \return first box in next line, or 0 if no more lines
|
||||||
|
* \post 0 <= *line_min <= *line_max
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct box *layout_minmax_line(struct box *first,
|
struct box *layout_minmax_line(struct box *first,
|
||||||
|
@ -1408,6 +1423,8 @@ struct box *layout_minmax_line(struct box *first,
|
||||||
case CSS_WIDTH_LENGTH:
|
case CSS_WIDTH_LENGTH:
|
||||||
width = css_len2px(&b->style->width.value.
|
width = css_len2px(&b->style->width.value.
|
||||||
length, b->style);
|
length, b->style);
|
||||||
|
if (width < 0)
|
||||||
|
width = 0;
|
||||||
break;
|
break;
|
||||||
case CSS_WIDTH_PERCENT:
|
case CSS_WIDTH_PERCENT:
|
||||||
/*b->width = width *
|
/*b->width = width *
|
||||||
|
@ -1461,6 +1478,7 @@ struct box *layout_minmax_line(struct box *first,
|
||||||
LOG(("line_min %i, line_max %i", min, max));
|
LOG(("line_min %i, line_max %i", min, max));
|
||||||
|
|
||||||
assert(b != first);
|
assert(b != first);
|
||||||
|
assert(0 <= *line_min && *line_min <= *line_max);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1976,6 +1994,8 @@ bool layout_table(struct box *table, int available_width,
|
||||||
* Calculate minimum and maximum width of a table.
|
* Calculate minimum and maximum width of a table.
|
||||||
*
|
*
|
||||||
* \param table box of type TABLE
|
* \param table box of type TABLE
|
||||||
|
* \post table->min_width and table->max_width filled in,
|
||||||
|
* 0 <= table->min_width <= table->max_width
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void layout_minmax_table(struct box *table)
|
void layout_minmax_table(struct box *table)
|
||||||
|
@ -2112,6 +2132,8 @@ void layout_minmax_table(struct box *table)
|
||||||
table->max_width = (table_max + extra_fixed) / (1.0 - extra_frac);
|
table->max_width = (table_max + extra_fixed) / (1.0 - extra_frac);
|
||||||
table->min_width += (table->columns + 1) * border_spacing_h;
|
table->min_width += (table->columns + 1) * border_spacing_h;
|
||||||
table->max_width += (table->columns + 1) * border_spacing_h;
|
table->max_width += (table->columns + 1) * border_spacing_h;
|
||||||
|
|
||||||
|
assert(0 <= table->min_width && table->min_width <= table->max_width);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue