if (testing) {
System.out.println("monitor CANCELED!!!: " + thisid); //$NON-NLS-1$
}
return;
}
Tile tile = tiles.get(key);
if (tile != null && tile.getBufferedImage() != null
&& tile.getTileState() != WMSTile.INERROR) {
renderTile(graphics, tile, tileset.getCoordinateReferenceSystem(), style);
renderedTiles.add(key);
monitor.worked(tileWorth); // inc the monitor work by 1 tile
} else {
// set the tile blank (removing any previous content) and add it
// to be drawn later
renderBlankTile(graphics, tile, tileset.getCoordinateReferenceSystem());
notRenderedTiles.add(key);
}
}
setState(RENDERING);
// if the tilerange is not already completed, then load
// the missing tiles
if (!notRenderedTiles.isEmpty()) {
if (monitor.isCanceled()) {
setState(CANCELLED);
if (testing) {
System.out.println("monitor CANCELED!!!: " + thisid); //$NON-NLS-1$
}
return;
}
// set the listener on the tile range
range.addListener(listener);
// load the missing tiles by sending requests for them
range.loadTiles(monitor);
// block until all the missing tiles have come through (and draw them
// as they are added to the blocking queue
while( !notRenderedTiles.isEmpty() ) {
// check that the rendering is not canceled
if (monitor.isCanceled()) {
setState(CANCELLED);
if (testing) {
System.out.println("monitor CANCELED!!!: " + thisid); //$NON-NLS-1$
}
tilesToDraw_queue.clear();
return;
}
if (testing) {
System.out.println("BLOCKED: " + thisid); //$NON-NLS-1$
System.out.println("waiting on: " + notRenderedTiles.size() + " tiles"); //$NON-NLS-1$ //$NON-NLS-2$
}
Tile tile = null;
try {
tile = (Tile) tilesToDraw_queue.take(); // blocks until a tile is ready to
// take
if (testing) {
System.out.println("removed from queue: " + tile.getId()); //$NON-NLS-1$
}
} catch (InterruptedException ex) {
if (testing) {
System.out.println("InterruptedException trying to take: " + ex); //$NON-NLS-1$
}
}
if (testing) {
System.out.println("UNBLOCKED!!!: " + thisid); //$NON-NLS-1$
}
// check that the rendering is not canceled again after block
if (monitor.isCanceled()) {
setState(CANCELLED);
if (testing) {
System.out.println("monitor CANCELED!!!: " + thisid); //$NON-NLS-1$
}
tilesToDraw_queue.clear();
return;
}
// check that the tile's bounds are within the current
// context's bounds (if it's not, don't bother drawing it) and also
// only draw tiles that haven't already been drawn (panning fast
// can result in listeners being notified the same tile is ready multiple
// times but we don't want to draw it more than once per render cycle)
// ReferencedEnvelope viewbounds = getContext().getViewportModel().getBounds();
ReferencedEnvelope viewbounds = getContext().getImageBounds();
if (tile != null && tile.getBufferedImage() != null && viewbounds != null
&& viewbounds.intersects(tile.getBounds())
&& !renderedTiles.contains(tile.getId())) {
renderTile(graphics, tile, tileset.getCoordinateReferenceSystem(), style);
renderedTiles.add(tile.getId());
monitor.worked(tileWorth); // inc the monitor work by 1 tile
setState(RENDERING); // tell renderer new data is ready
}
// remove the tile from the not rendered list regardless
// of whether it was actually drawn (this is to prevent
// this render cycle from blocking endlessly waiting for tiles
// that either didn't return or had some error)
notRenderedTiles.remove(tile.getId());
}
}
if (testing) {
System.out.println("DONE!!!: " + thisid); //$NON-NLS-1$