summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--render/layout.c34
1 files changed, 17 insertions, 17 deletions
diff --git a/render/layout.c b/render/layout.c
index 1f7901e8d..3dbc5e464 100644
--- a/render/layout.c
+++ b/render/layout.c
@@ -585,7 +585,7 @@ void layout_table(struct box * table, unsigned long width, struct box * cont,
unsigned int i;
unsigned int *row_span, *excess_y;
unsigned long table_width, min_width = 0, max_width = 0;
- unsigned long fixed_width = 0, total_percent = 0, auto_min_width = 0;
+ unsigned long required_width = 0;
unsigned long x, x0, x1;
unsigned long table_height = 0;
unsigned long *xs; /* array of column x positions */
@@ -627,14 +627,15 @@ void layout_table(struct box * table, unsigned long width, struct box * cont,
for (i = 0; i != columns; i++) {
if (col[i].type == COLUMN_WIDTH_FIXED)
- fixed_width += col[i].width;
- else if (col[i].type == COLUMN_WIDTH_PERCENT)
- total_percent += col[i].width;
- else
- auto_min_width += col[i].min;
+ required_width += col[i].width;
+ else if (col[i].type == COLUMN_WIDTH_PERCENT) {
+ unsigned long width = col[i].width * table_width / 100;
+ required_width += col[i].min < width ? width : col[i].min;
+ } else
+ required_width += col[i].min;
}
- if (table_width < fixed_width + total_percent * table_width / 100 + auto_min_width) {
+ if (table_width < required_width) {
/* table narrower than required width for columns:
* treat percentage widths as maximums */
for (i = 0; i != columns; i++) {
@@ -879,6 +880,7 @@ void calculate_inline_container_widths(struct box *box)
struct box *child;
unsigned long min = 0, max = 0, width;
char *word, *space;
+ int i, j;
for (child = box->children; child != 0; child = child->next) {
switch (child->type) {
@@ -900,17 +902,14 @@ void calculate_inline_container_widths(struct box *box)
/* TODO: add spaces */
/* min = widest word */
- for (word = child->text,
- space = strchr(child->text, ' ');
- space != 0;
- word = space + 1,
- space = strchr(word, ' ')) {
- width = font_width(child->font, word,
- (unsigned int) (space - word - 1));
+ i = 0;
+ do {
+ for (j = i; j != child->length && child->text[j] != ' '; j++)
+ ;
+ width = font_width(child->font, child->text + i, j - i);
if (min < width) min = width;
- }
- width = font_width(child->font, word, strlen(word));
- if (min < width) min = width;
+ i = j + 1;
+ } while (j != child->length);
} else if (child->gadget) {
child->width = gadget_width(child->gadget);
@@ -940,6 +939,7 @@ void calculate_inline_container_widths(struct box *box)
}
}
+ assert(min <= max);
box->min_width = min;
box->max_width = max;
}