summaryrefslogtreecommitdiff
path: root/render
diff options
context:
space:
mode:
Diffstat (limited to 'render')
-rw-r--r--render/layout.c386
1 files changed, 192 insertions, 194 deletions
diff --git a/render/layout.c b/render/layout.c
index 08f6ee260..1bf77fbcf 100644
--- a/render/layout.c
+++ b/render/layout.c
@@ -736,34 +736,34 @@ bool layout_apply_minmax_height(struct box *box) {
if (box->style) {
/* max-height */
switch (box->style->max_height.max_height) {
- case CSS_MAX_HEIGHT_LENGTH:
- h = css_len2px(&box->style->max_height.value.
- length, box->style);
- if (h < box->height) {
- box->height = h;
- updated = true;
- }
- break;
- case CSS_MAX_HEIGHT_PERCENT:
- /* percentage heights not yet implemented */
- default:
- break;
+ case CSS_MAX_HEIGHT_LENGTH:
+ h = css_len2px(&box->style->max_height.value.length,
+ box->style);
+ if (h < box->height) {
+ box->height = h;
+ updated = true;
+ }
+ break;
+ case CSS_MAX_HEIGHT_PERCENT:
+ /* percentage heights not yet implemented */
+ default:
+ break;
}
/* min-height */
switch (box->style->min_height.min_height) {
- case CSS_MIN_HEIGHT_LENGTH:
- h = css_len2px(&box->style->min_height.value.
- length, box->style);
- if (h > box->height) {
- box->height = h;
- updated = true;
- }
- break;
- case CSS_MIN_HEIGHT_PERCENT:
- /* percentage heights not yet implemented */
- default:
- break;
+ case CSS_MIN_HEIGHT_LENGTH:
+ h = css_len2px(&box->style->min_height.value.length,
+ box->style);
+ if (h > box->height) {
+ box->height = h;
+ updated = true;
+ }
+ break;
+ case CSS_MIN_HEIGHT_PERCENT:
+ /* percentage heights not yet implemented */
+ default:
+ break;
}
}
return updated;
@@ -989,99 +989,90 @@ void layout_find_dimensions(int available_width,
if (width) {
switch (style->width.width) {
- case CSS_WIDTH_LENGTH:
- *width = css_len2px(&style->width.value.length,
- style);
- break;
- case CSS_WIDTH_PERCENT:
- *width = (style->width.value.percent *
- available_width) / 100;
- /* gadget widths include margins,
- * borders and padding */
- if (box->gadget) {
- calculate_mbp_width(style,
- LEFT, &fixed, &frac);
- calculate_mbp_width(style,
- RIGHT, &fixed, &frac);
- *width -= frac + fixed;
- *width = *width > 0 ?
- *width : 0;
- }
- break;
- case CSS_WIDTH_AUTO:
- default:
- *width = AUTO;
- break;
+ case CSS_WIDTH_LENGTH:
+ *width = css_len2px(&style->width.value.length, style);
+ break;
+ case CSS_WIDTH_PERCENT:
+ *width = (style->width.value.percent *
+ available_width) / 100;
+ /* gadget widths include margins,
+ * borders and padding */
+ if (box->gadget) {
+ calculate_mbp_width(style, LEFT, &fixed, &frac);
+ calculate_mbp_width(style, RIGHT, &fixed,
+ &frac);
+ *width -= frac + fixed;
+ *width = *width > 0 ? *width : 0;
+ }
+ break;
+ case CSS_WIDTH_AUTO:
+ default:
+ *width = AUTO;
+ break;
}
}
if (height) {
switch (style->height.height) {
- case CSS_HEIGHT_LENGTH:
- *height = css_len2px(&style->height.length,
- style);
- break;
- case CSS_HEIGHT_AUTO:
- default:
- *height = AUTO;
- break;
+ case CSS_HEIGHT_LENGTH:
+ *height = css_len2px(&style->height.length, style);
+ break;
+ case CSS_HEIGHT_AUTO:
+ default:
+ *height = AUTO;
+ break;
}
}
if (max_width) {
switch (style->max_width.max_width) {
- case CSS_MAX_WIDTH_LENGTH:
- *max_width = css_len2px(&style->max_width.value.
- length, style);
- break;
- case CSS_MAX_WIDTH_PERCENT:
- *max_width = (style->max_width.value.percent *
- available_width) / 100;
- /* gadget widths include margins,
- * borders and padding */
- if (box->gadget) {
- calculate_mbp_width(style,
- LEFT, &fixed, &frac);
- calculate_mbp_width(style,
- RIGHT, &fixed, &frac);
- *max_width -= frac + fixed;
- *max_width = *max_width > 0 ?
- *max_width : 0;
- }
- break;
- case CSS_MAX_WIDTH_NONE:
- default:
- /* Inadmissible */
- *max_width = -1;
- break;
+ case CSS_MAX_WIDTH_LENGTH:
+ *max_width = css_len2px(&style->max_width.value.length,
+ style);
+ break;
+ case CSS_MAX_WIDTH_PERCENT:
+ *max_width = (style->max_width.value.percent *
+ available_width) / 100;
+ /* gadget widths include margins,
+ * borders and padding */
+ if (box->gadget) {
+ calculate_mbp_width(style, LEFT, &fixed, &frac);
+ calculate_mbp_width(style, RIGHT, &fixed,
+ &frac);
+ *max_width -= frac + fixed;
+ *max_width = *max_width > 0 ? *max_width : 0;
+ }
+ break;
+ case CSS_MAX_WIDTH_NONE:
+ default:
+ /* Inadmissible */
+ *max_width = -1;
+ break;
}
}
if (min_width) {
switch (style->min_width.min_width) {
- case CSS_MIN_WIDTH_LENGTH:
- *min_width = css_len2px(&style->min_width.value.
- length, style);
- break;
- case CSS_MIN_WIDTH_PERCENT:
- *min_width = (style->min_width.value.percent *
- available_width) / 100;
- /* gadget widths include margins,
- * borders and padding */
- if (box->gadget) {
- calculate_mbp_width(style,
- LEFT, &fixed, &frac);
- calculate_mbp_width(style,
- RIGHT, &fixed, &frac);
- *min_width -= frac + fixed;
- *min_width = *min_width > 0 ?
- *min_width : 0;
- }
- break;
- default:
- /* Inadmissible */
- *min_width = 0;
- break;
+ case CSS_MIN_WIDTH_LENGTH:
+ *min_width = css_len2px(&style->min_width.value.
+ length, style);
+ break;
+ case CSS_MIN_WIDTH_PERCENT:
+ *min_width = (style->min_width.value.percent *
+ available_width) / 100;
+ /* gadget widths include margins,
+ * borders and padding */
+ if (box->gadget) {
+ calculate_mbp_width(style, LEFT, &fixed, &frac);
+ calculate_mbp_width(style, RIGHT, &fixed,
+ &frac);
+ *min_width -= frac + fixed; *min_width = *min_width > 0 ? *min_width : 0;
+ }
+ break;
+ default:
+ /* Inadmissible */
+ *min_width = 0;
+ break;
}
}
@@ -1310,17 +1301,15 @@ int line_height(struct css_style *style)
font_len = option_font_min_size * css_screen_dpi / 720.0;
switch (style->line_height.size) {
- case CSS_LINE_HEIGHT_LENGTH:
- return css_len2px(&style->line_height.value.length,
- style);
+ case CSS_LINE_HEIGHT_LENGTH:
+ return css_len2px(&style->line_height.value.length, style);
- case CSS_LINE_HEIGHT_ABSOLUTE:
- return style->line_height.value.absolute * font_len;
+ case CSS_LINE_HEIGHT_ABSOLUTE:
+ return style->line_height.value.absolute * font_len;
- case CSS_LINE_HEIGHT_PERCENT:
- default:
- return style->line_height.value.percent * font_len
- / 100.0;
+ case CSS_LINE_HEIGHT_PERCENT:
+ default:
+ return style->line_height.value.percent * font_len / 100.0;
}
}
@@ -1531,31 +1520,29 @@ bool layout_line(struct box *first, int *width, int *y,
/* calculate box width */
switch (b->style->width.width) {
- case CSS_WIDTH_LENGTH:
- b->width = css_len2px(&b->style->width.value.
- length, b->style);
- break;
- case CSS_WIDTH_PERCENT:
- b->width = *width *
- b->style->width.value.percent /
- 100;
- break;
- case CSS_WIDTH_AUTO:
- default:
- b->width = AUTO;
- break;
+ case CSS_WIDTH_LENGTH:
+ b->width = css_len2px(&b->style->width.value.length,
+ b->style);
+ break;
+ case CSS_WIDTH_PERCENT:
+ b->width = *width * b->style->width.value.percent / 100;
+ break;
+ case CSS_WIDTH_AUTO:
+ default:
+ b->width = AUTO;
+ break;
}
/* height */
switch (b->style->height.height) {
- case CSS_HEIGHT_LENGTH:
- b->height = css_len2px(&b->style->height.length,
- b->style);
- break;
- case CSS_HEIGHT_AUTO:
- default:
- b->height = AUTO;
- break;
+ case CSS_HEIGHT_LENGTH:
+ b->height = css_len2px(&b->style->height.length,
+ b->style);
+ break;
+ case CSS_HEIGHT_AUTO:
+ default:
+ b->height = AUTO;
+ break;
}
if (b->object) {
@@ -1897,9 +1884,15 @@ bool layout_line(struct box *first, int *width, int *y,
/* set positions */
switch (first->parent->parent->style->text_align) {
- case CSS_TEXT_ALIGN_RIGHT: x0 = x1 - x; break;
- case CSS_TEXT_ALIGN_CENTER: x0 = (x0 + (x1 - x)) / 2; break;
- default: break; /* leave on left */
+ case CSS_TEXT_ALIGN_RIGHT:
+ x0 = x1 - x;
+ break;
+ case CSS_TEXT_ALIGN_CENTER:
+ x0 = (x0 + (x1 - x)) / 2;
+ break;
+ default:
+ /* leave on left */
+ break;
}
for (d = first; d != b; d = d->next) {
@@ -2091,33 +2084,32 @@ struct box *layout_minmax_line(struct box *first,
/* calculate box width */
switch (b->style->width.width) {
- case CSS_WIDTH_LENGTH:
- width = css_len2px(&b->style->width.value.
- length, b->style);
- if (width < 0)
- width = 0;
- break;
- case CSS_WIDTH_PERCENT:
- /*b->width = width *
- b->style->width.value.percent /
- 100;
- break;*/
- case CSS_WIDTH_AUTO:
- default:
- width = AUTO;
- break;
+ case CSS_WIDTH_LENGTH:
+ width = css_len2px(&b->style->width.value.length,
+ b->style);
+ if (width < 0)
+ width = 0;
+ break;
+ case CSS_WIDTH_PERCENT:
+ /*
+ b->width = width * b->style->width.value.percent / 100;
+ break;
+ */
+ case CSS_WIDTH_AUTO:
+ default:
+ width = AUTO;
+ break;
}
/* height */
switch (b->style->height.height) {
- case CSS_HEIGHT_LENGTH:
- height = css_len2px(&b->style->height.length,
- b->style);
- break;
- case CSS_HEIGHT_AUTO:
- default:
- height = AUTO;
- break;
+ case CSS_HEIGHT_LENGTH:
+ height = css_len2px(&b->style->height.length, b->style);
+ break;
+ case CSS_HEIGHT_AUTO:
+ default:
+ height = AUTO;
+ break;
}
if (b->object) {
@@ -2169,13 +2161,12 @@ struct box *layout_minmax_line(struct box *first,
int layout_text_indent(struct css_style *style, int width)
{
switch (style->text_indent.size) {
- case CSS_TEXT_INDENT_LENGTH:
- return css_len2px(&style->text_indent.value.length,
- style);
- case CSS_TEXT_INDENT_PERCENT:
- return width * style->text_indent.value.percent / 100;
- default:
- return 0;
+ case CSS_TEXT_INDENT_LENGTH:
+ return css_len2px(&style->text_indent.value.length, style);
+ case CSS_TEXT_INDENT_PERCENT:
+ return width * style->text_indent.value.percent / 100;
+ default:
+ return 0;
}
}
@@ -2551,8 +2542,9 @@ bool layout_table(struct box *table, int available_width,
free(xs);
return false;
}
- /* warning: c->descendant_y0 and c->descendant_y1 used as temporary
- * storage until after vertical alignment is complete */
+ /* warning: c->descendant_y0 and
+ * c->descendant_y1 used as temporary storage
+ * until after vertical alignment is complete */
c->descendant_y0 = c->height;
c->descendant_y1 = c->padding[BOTTOM];
if (c->style->height.height ==
@@ -2627,38 +2619,44 @@ bool layout_table(struct box *table, int available_width,
}
/* perform vertical alignment */
- for (row_group = table->children; row_group; row_group = row_group->next) {
+ for (row_group = table->children; row_group;
+ row_group = row_group->next) {
for (row = row_group->children; row; row = row->next) {
for (c = row->children; c; c = c->next) {
- /* unextended bottom padding is in c->descendant_y1, and unextended
+ /* unextended bottom padding is in
+ * c->descendant_y1, and unextended
* cell height is in c->descendant_y0 */
- spare_height = (c->padding[BOTTOM] - c->descendant_y1) +
+ spare_height = (c->padding[BOTTOM] -
+ c->descendant_y1) +
(c->height - c->descendant_y0);
switch (c->style->vertical_align.type) {
- case CSS_VERTICAL_ALIGN_SUB:
- case CSS_VERTICAL_ALIGN_SUPER:
- case CSS_VERTICAL_ALIGN_TEXT_TOP:
- case CSS_VERTICAL_ALIGN_TEXT_BOTTOM:
- case CSS_VERTICAL_ALIGN_LENGTH:
- case CSS_VERTICAL_ALIGN_PERCENT:
- case CSS_VERTICAL_ALIGN_BASELINE:
- /* todo: baseline alignment, for now just use ALIGN_TOP */
- case CSS_VERTICAL_ALIGN_TOP:
- break;
- case CSS_VERTICAL_ALIGN_MIDDLE:
- c->padding[TOP] += spare_height / 2;
- c->padding[BOTTOM] -= spare_height / 2;
- layout_move_children(c, 0, spare_height / 2);
- break;
- case CSS_VERTICAL_ALIGN_BOTTOM:
- c->padding[TOP] += spare_height;
- c->padding[BOTTOM] -= spare_height;
- layout_move_children(c, 0, spare_height);
- break;
- case CSS_VERTICAL_ALIGN_NOT_SET:
- case CSS_VERTICAL_ALIGN_INHERIT:
- assert(0);
- break;
+ case CSS_VERTICAL_ALIGN_SUB:
+ case CSS_VERTICAL_ALIGN_SUPER:
+ case CSS_VERTICAL_ALIGN_TEXT_TOP:
+ case CSS_VERTICAL_ALIGN_TEXT_BOTTOM:
+ case CSS_VERTICAL_ALIGN_LENGTH:
+ case CSS_VERTICAL_ALIGN_PERCENT:
+ case CSS_VERTICAL_ALIGN_BASELINE:
+ /* todo: baseline alignment, for now
+ * just use ALIGN_TOP */
+ case CSS_VERTICAL_ALIGN_TOP:
+ break;
+ case CSS_VERTICAL_ALIGN_MIDDLE:
+ c->padding[TOP] += spare_height / 2;
+ c->padding[BOTTOM] -= spare_height / 2;
+ layout_move_children(c, 0,
+ spare_height / 2);
+ break;
+ case CSS_VERTICAL_ALIGN_BOTTOM:
+ c->padding[TOP] += spare_height;
+ c->padding[BOTTOM] -= spare_height;
+ layout_move_children(c, 0,
+ spare_height);
+ break;
+ case CSS_VERTICAL_ALIGN_NOT_SET:
+ case CSS_VERTICAL_ALIGN_INHERIT:
+ assert(0);
+ break;
}
}
}