// as external events have occured, check the state of box
if (texture != null) {
if (texture.isLoaded) { minwidth = min(texture.width, maxwidth); minheight = min(texture.height, maxheight); }
- else { JS res = texture.stream; texture = null; throw new JSExn("image not found: "+res); }
+ else { JS res = texture.stream; texture = null; throw new JSExn("image not found: "+res.unclone()); }
+ } else {
+ Log.warn(Box.class, "perform() called with null texture");
}
-
MARK_REPACK;
MARK_REFLOW;
MARK_RESIZE;
// static stuff so we don't have to keep reallocating
private static int[] numRowsInCol = new int[65535];
private static LENGTH[] colWidth = new LENGTH[65535];
- private static LENGTH[] colMinWidth = new LENGTH[65535];
private static LENGTH[] colMaxWidth = new LENGTH[65535];
private static LENGTH[] rowHeight = new LENGTH[65535];
- private static LENGTH[] rowMinHeight = new LENGTH[65535];
private static LENGTH[] rowMaxHeight = new LENGTH[65535];
static { for(int i=0; i<rowMaxHeight.length; i++) { rowMaxHeight[i] = MAX_LENGTH; colMaxWidth[i] = MAX_LENGTH; } }
}
//#end
- //#repeat contentwidth/contentheight colMinWidth/rowMinHeight colspan/rowspan col/row cols/rows minwidth/minheight \
- // textwidth/textheight maxwidth/maxheight colWidth/rowHeight
+ //#repeat contentwidth/contentheight colWidth/rowHeight colspan/rowspan col/row cols/rows minwidth/minheight \
+ // textwidth/textheight maxwidth/maxheight
contentwidth = 0;
- for(Box child = firstPackedChild(); child != null; child = child.nextPackedSibling()) {
- colMinWidth[child.col] = max(colMinWidth[child.col], child.contentwidth / child.colspan);
- colWidth[child.col] = 0;
- }
- for(int i=0; i<cols; i++) { contentwidth += colMinWidth[i]; colMinWidth[i] = 0; }
+ for(Box child = firstPackedChild(); child != null; child = child.nextPackedSibling())
+ colWidth[child.col] = max(colWidth[child.col], child.contentwidth / child.colspan);
+ for(int i=0; i<cols; i++) { contentwidth += colWidth[i]; colWidth[i] = 0; }
contentwidth = bound(minwidth, max(font == null || text == null ? 0 : font.textwidth(text), contentwidth), maxwidth);
//#end
}
void resize_children() {
- int eligible;
//#repeat col/row colspan/rowspan contentwidth/contentheight x/y width/height colMaxWidth/rowMaxHeight colWidth/rowHeight \
- // colMinWidth/rowMinHeight HSHRINK/VSHRINK maxwidth/maxheight cols/rows minwidth/minheight colWidth/rowHeight \
- // x_slack/y_slack
+ // 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;
- eligible = 0;
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++) {
- colMinWidth[i] = max(colWidth[i], child.contentwidth / child.colspan);
+ x_slack += colWidth[i];
+ colWidth[i] = max(colWidth[i], child.contentwidth / child.colspan);
+ x_slack -= colWidth[i];
colMaxWidth[i] = min(colMaxWidth[i], child.test(HSHRINK) ? child.contentwidth : child.maxwidth) / child.colspan;
- colWidth[i] = 0;
- eligible++;
}
// PHASE 2: hand out slack
for(int startslack = 0; x_slack > 0 && cols > 0 && startslack != x_slack;) {
- if (eligible == 0) break;
- int increment = x_slack / eligible;
- eligible = 0;
+ 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);
- if (colWidth[col] + diff < colMinWidth[col]) diff = colMinWidth[col] - colWidth[col];
- if (diff == 0) continue;
- eligible++;
x_slack -= diff;
colWidth[col] += diff;
}
int globaly = parenty + (parent == null ? 0 : y);
// intersect the x,y,w,h rendering window with ourselves; quit if it's empty
-
if (test(CLIP)) {
- cx1 = max(cx1, parent == null ? 0 : globalx);
- cy1 = max(cy1, parent == null ? 0 : globaly);
+ cx1 = max(cx1, globalx);
+ cy1 = max(cy1, globaly);
cx2 = min(cx2, globalx + width);
cy2 = min(cy2, globaly + height);
if (cx2 <= cx1 || cy2 <= cy1) return;
fillcolor = newfillcolor;
} else if(value instanceof JS) {
texture = Picture.load((JS)value, this);
+ if (texture != null) perform();
} else {
throw new JSExn("fill must be null, a String, or a stream, not a " + value.getClass());
}