/** Holds four "strip images" -- 0=top, 1=bottom, 2=left, 3=right, 4=all */
Picture[] border = null;
- /**
- * The dirty() method walks up the tree, clipping the region being dirtied to each parent -- if this value is less than or
- * equal to surface.dirtiedTimeStamp, it means that the entire screen region covered by this box has been dirtied, so dirty()'s on
- * children can short-circuit.
- */
- int dirtiedTimeStamp = 0;
-
/** true iff the box's background image should be tiled */
boolean tile = false;
/** Adds the node's current actual geometry to the Surface's dirty list */
void dirty() {
dirty(pos(0), pos(1), size(0), size(1));
- if (surface != null) dirtiedTimeStamp = surface.dirtiedTimeStamp + 1;
}
/** Adds the intersection of (x,y,w,h) and the node's current actual geometry to the Surface's dirty list */
final void dirty(int x, int y, int w, int h) {
for(Box cur = this; cur != null; cur = cur.getParent()) {
- if (surface != null && cur.dirtiedTimeStamp > surface.dirtiedTimeStamp && cur.dirtiedTimeStamp < Integer.MAX_VALUE - 1) return;
w = min(x + w, cur.pos(0) + cur.size(0)) - max(x, cur.pos(0));
h = min(y + h, cur.pos(1) + cur.size(1)) - max(y, cur.pos(1));
x = max(x, cur.pos(0));
/** Renders self and children within the specified region. All rendering operations are clipped to xIn,yIn,wIn,hIn */
void render(int xIn, int yIn, int wIn, int hIn, DoubleBuffer buf) {
- dirtiedTimeStamp = surface.dirtiedTimeStamp;
if (surface.abort || invisible) return;
// intersect the x,y,w,h rendering window with ourselves; quit if it's empty
/** A list of all the Boxes on this Surface that should be notified of keyboard events */
Vec keywatchers = new Vec();
- /**
- * this is incremented every time we render; it acts as a sort of 'timestamp' to let Boxes to know if they have
- * been dirtied since the last rendering began (and hence should not propagate up dirty() requests from their children)
- */
- volatile int dirtiedTimeStamp = 0;
-
/** When set to true, render() should abort as soon as possible and restart the rendering process */
volatile boolean abort = false;
/** runs the prerender() and render() pipelines in the root Box to regenerate the backbuffer, then blits it to the screen */
public synchronized void render() {
- if (++dirtiedTimeStamp == Integer.MAX_VALUE - 1) dirtiedTimeStamp = 0;
-
// if the window size changed as a result of a user action, we have to update the root box's size
if (root.size(0) != width || root.size(1) != height) {