//#repeat col/row colspan/rowspan contentwidth/contentheight x/y width/height colMaxWidth/rowMaxHeight colWidth/rowHeight \
// HSHRINK/VSHRINK maxwidth/maxheight cols/rows minwidth/minheight colWidth/rowHeight x_slack/y_slack
// PHASE 1: compute column min/max sizes
+ int x_slack = width;
+ for(int i=0; i<cols; i++) x_slack -= colWidth[i];
for(Box child = firstPackedChild(); child != null; child = child.nextPackedSibling())
for(int i=child.col; i < child.col + child.colspan; i++) {
+ x_slack += colWidth[i];
colWidth[i] = max(colWidth[i], child.contentwidth / child.colspan);
+ x_slack -= colWidth[i];
colMaxWidth[i] = max(colMaxWidth[i], (child.test(HSHRINK) ? child.contentwidth : child.maxwidth) / child.colspan);
}
// PHASE 2: hand out slack
- int x_slack = width;
- for(int i=0; i<cols; i++) x_slack -= colWidth[i];
- // loop through until there are no more eligible children or all slack is handed out
- for(int eligible = cols, slacklevel = 0; x_slack > 0 && eligible > 0;) {
- int increment = max(1, x_slack / eligible);
- eligible = 0;
- for(short col=0, count=0; col < cols; col++) {
- if (colMaxWidth[col] <= colWidth[col]) continue;
- if (slacklevel + increment < colWidth[col]) { eligible++; continue; }
- int diff = min(increment, min(colMaxWidth[col] - colWidth[col], slacklevel + increment - colWidth[col]));
- eligible++;
- colWidth[col] += diff;
+ for(int startslack = 0; x_slack > 0 && cols > 0 && startslack != x_slack;) {
+ int increment = max(1, x_slack / cols);
+ startslack = x_slack;
+ for(short col=0; col < cols; col++) {
+ // FIXME: double check this
+ int diff = min(min(colMaxWidth[col], colWidth[col] + increment) - colWidth[col], x_slack);
x_slack -= diff;
+ colWidth[col] += diff;
}
- slacklevel += increment;
- }
+ }
//#end
- // PHASE 3: assign childrens' actual sizes
+ // Phase 3: assign childrens' actual sizes
for(Box child = getChild(0); child != null; child = child.nextSibling()) {
if (!child.test(VISIBLE)) continue;
int child_width, child_height, child_x, child_y;