From 41ef59929317204f2a40d01bf331641b31976b42 Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Wed, 14 Dec 2011 18:31:57 +0000 Subject: Fix frame dimension calculations when required sizes don't fit the available space. svn path=/trunk/netsurf/; revision=13271 --- desktop/frames.c | 54 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 14 deletions(-) (limited to 'desktop/frames.c') diff --git a/desktop/frames.c b/desktop/frames.c index 02e1ccc54..644dc6c4f 100644 --- a/desktop/frames.c +++ b/desktop/frames.c @@ -402,7 +402,7 @@ void browser_window_recalculate_frameset(struct browser_window *bw) { int row, row2, col, index; struct browser_window *window; float relative; - int size, extent; + int size, extent, applied; int x, y; int new_width, new_height; @@ -462,14 +462,17 @@ void browser_window_recalculate_frameset(struct browser_window *bw) { avail_width -= widths[col][row]; } - /* try to distribute remainder to relative values in preference */ + /* distribute remainder to relative values in preference */ if ((relative > 0) && (avail_width > 0)) { for (col = 0; col < bw->cols; col++) { index = (row * bw->cols) + col; window = &bw->children[index]; - if (window->frame_width.unit == FRAME_DIMENSION_RELATIVE) { - size = avail_width * window->frame_width.value / relative; + if (window->frame_width.unit == + FRAME_DIMENSION_RELATIVE) { + size = avail_width * window-> + frame_width.value / + relative; avail_width -= size; relative -= window->frame_width.value; widths[col][row] += size; @@ -477,13 +480,23 @@ void browser_window_recalculate_frameset(struct browser_window *bw) { } } else if (bw_width != avail_width) { /* proportionally distribute error */ - extent = bw_width - avail_width; + extent = avail_width; + applied = 0; for (col = 0; col < bw->cols; col++) { if (col == bw->cols - 1) { - widths[col][row] = bw_width; + size = extent - applied; + widths[col][row] += (size > 0) ? + size : 0; } else { - size = bw_width * widths[col][row] / extent; - widths[col][row] = size; + /* Intermediate step: get absolute + * extent value */ + size = extent < 0 ? -extent : extent; + + /* Find size of cell adjustment */ + size = (widths[col][row] * extent) / + (bw_width - size); + applied += size; + widths[col][row] += size; } } } @@ -538,8 +551,11 @@ void browser_window_recalculate_frameset(struct browser_window *bw) { index = (row * bw->cols) + col; window = &bw->children[index]; - if (window->frame_height.unit == FRAME_DIMENSION_RELATIVE) { - size = avail_height * window->frame_height.value / relative; + if (window->frame_height.unit == + FRAME_DIMENSION_RELATIVE) { + size = avail_height * window-> + frame_height.value / + relative; avail_height -= size; relative -= window->frame_height.value; heights[col][row] += size; @@ -547,13 +563,23 @@ void browser_window_recalculate_frameset(struct browser_window *bw) { } } else if (bw_height != avail_height) { /* proportionally distribute error */ - extent = bw_height - avail_height; + extent = avail_height; + applied = 0; for (row = 0; row < bw->rows; row++) { if (row == bw->rows - 1) { - heights[col][row] = bw_height; + size = extent - applied; + heights[col][row] += (size > 0) ? + size : 0; } else { - size = bw_height * heights[col][row] / extent; - heights[col][row] = size; + /* Intermediate step: get absolute + * extent value */ + size = extent < 0 ? -extent : extent; + + /* Find size of cell adjustment */ + size = (heights[col][row] * extent) / + (bw_height - size); + applied += size; + heights[col][row] += size; } } } -- cgit v1.2.3