summaryrefslogtreecommitdiff
path: root/render
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2009-05-08 11:43:38 +0000
committerMichael Drake <tlsa@netsurf-browser.org>2009-05-08 11:43:38 +0000
commit65a888dd87287e474fd8ff84fc8e79ea57c7d66d (patch)
treeb5dfad743381b3e835f82c84029931695ab9dd3a /render
parent14a6c567480a508d948e3b753f38ed07a8d84d48 (diff)
downloadnetsurf-65a888dd87287e474fd8ff84fc8e79ea57c7d66d.tar.gz
netsurf-65a888dd87287e474fd8ff84fc8e79ea57c7d66d.tar.bz2
Handle percentage table heights. Spare height is still not distributed over cells.
svn path=/trunk/netsurf/; revision=7439
Diffstat (limited to 'render')
-rw-r--r--render/layout.c62
1 files changed, 52 insertions, 10 deletions
diff --git a/render/layout.c b/render/layout.c
index 65ff0c4a2..1d2aee836 100644
--- a/render/layout.c
+++ b/render/layout.c
@@ -2585,6 +2585,7 @@ bool layout_table(struct box *table, int available_width,
int required_width = 0;
int x, remainder = 0, count = 0;
int table_height = 0;
+ int min_height = 0;
int *xs; /* array of column x positions */
int auto_width;
int spare_width;
@@ -2592,6 +2593,7 @@ bool layout_table(struct box *table, int available_width,
int border_spacing_h = 0, border_spacing_v = 0;
int spare_height;
int positioned_columns = 0;
+ struct box *containing_block = NULL;
struct box *c;
struct box *row;
struct box *row_group;
@@ -2687,6 +2689,51 @@ bool layout_table(struct box *table, int available_width,
break;
}
+ /* Find any table height specified within CSS/HTML */
+ if (style->height.height == CSS_HEIGHT_LENGTH) {
+ /* This is the minimum height for the table (see 17.5.3) */
+ min_height = css_len2px(&style->height.value.length, style);
+ } else if (style->height.height == CSS_HEIGHT_PERCENT) {
+ /* This is the minimum height for the table (see 17.5.3) */ if (table->style->position == CSS_POSITION_ABSOLUTE &&
+ table->float_container) {
+ /* Table is absolutely positioned */
+ containing_block = table->float_container;
+ } else if (table->float_container &&
+ table->style->position !=
+ CSS_POSITION_ABSOLUTE &&
+ (table->style->float_ ==
+ CSS_FLOAT_LEFT ||
+ table->style->float_ ==
+ CSS_FLOAT_RIGHT)) {
+ /* Table is a float */
+ assert(table->parent && table->parent->parent &&
+ table->parent->parent->parent);
+ containing_block = table->parent->parent->parent;
+ } else if (table->parent && table->parent->type !=
+ BOX_INLINE_CONTAINER) {
+ /* Table is a block level element */
+ containing_block = table->parent;
+ } else if (table->parent && table->parent->type ==
+ BOX_INLINE_CONTAINER) {
+ /* Table is an inline block */
+ assert(table->parent->parent);
+ containing_block = table->parent->parent;
+ }
+ if (table->style->position == CSS_POSITION_ABSOLUTE ||
+ (containing_block &&
+ (containing_block->style->height.
+ height == CSS_HEIGHT_LENGTH ||
+ containing_block->style->height.
+ height == CSS_HEIGHT_PERCENT) &&
+ containing_block->height != AUTO)) {
+ /* Table is absolutely positioned or its
+ * containing block has a valid specified
+ * height. (CSS 2.1 Section 10.5) */
+ min_height = style->height.value.percent *
+ containing_block->height / 100;
+ }
+ }
+
/* calculate width required by cells */
for (i = 0; i != columns; i++) {
LOG(("table %p, column %u: type %s, width %i, min %i, max %i",
@@ -2961,6 +3008,10 @@ bool layout_table(struct box *table, int available_width,
row_group->height = row_group_height;
table_height += row_group_height;
}
+ /* Table height is either the height of the contents, or specified
+ * height if greater */
+ table_height = max(table_height, min_height);
+ /** \TODO distribute spare height over the row groups / rows / cells */
/* perform vertical alignment */
for (row_group = table->children; row_group;
@@ -3013,16 +3064,7 @@ bool layout_table(struct box *table, int available_width,
free(xs);
table->width = table_width;
-
- /* Take account of any table height specified within CSS/HTML */
- if (style->height.height == CSS_HEIGHT_LENGTH) {
- /* This is the minimum height for the table (see 17.5.3) */
- int min_height = css_len2px(&style->height.value.length, style);
-
- table->height = max(table_height, min_height);
- } else {
- table->height = table_height;
- }
+ table->height = table_height;
return true;
}