/*
* Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 3 of the License, or (at your option)
* any later version.
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, see http://www.gnu.org/licenses/
*/
package com.bc.ceres.glayer.jaitests;
import junit.framework.TestCase;
import javax.media.jai.*;
import javax.media.jai.operator.FormatDescriptor;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.util.HashSet;
public class PlanarImageTest extends TestCase {
public void testThatTileSchedulerFiresEventsForAlreadyAvailableTiles() {
final RenderedOp tiledImage = createTiledAndCachedImage();
final Point[] indices = tiledImage.getTileIndices(new Rectangle(1, 1, 511, 511));
assertNotNull(indices);
assertEquals(16, indices.length);
final Raster[] expectedTiles = tiledImage.getTiles();
final MyTileComputationListener listener = new MyTileComputationListener(16);
tiledImage.addTileComputationListener(listener);
tiledImage.queueTiles(indices);
try {
synchronized (listener) {
listener.wait(1000);
}
} catch (InterruptedException e) {
fail();
}
assertEquals(listener.expectedSize, listener.computedTiles.size());
for (Raster expectedTile : expectedTiles) {
assertTrue(listener.computedTiles.contains(expectedTile));
}
}
private static RenderedOp createTiledAndCachedImage() {
final BufferedImage image = new BufferedImage(512, 512, BufferedImage.TYPE_INT_ARGB);
final ImageLayout imageLayout = new ImageLayout();
imageLayout.setTileWidth(128);
imageLayout.setTileHeight(128);
final RenderingHints hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, imageLayout);
hints.add(new RenderingHints(JAI.KEY_TILE_CACHE, JAI.getDefaultInstance().getTileCache()));
return FormatDescriptor.create(image, image.getSampleModel().getDataType(), hints);
}
private static class MyTileComputationListener implements TileComputationListener {
private final int expectedSize;
private HashSet<Raster> computedTiles;
private MyTileComputationListener(int expectedSize) {
this.expectedSize = expectedSize;
computedTiles = new HashSet<Raster>(expectedSize * 2);
}
public synchronized void tileComputed(Object o, TileRequest[] tileRequests, PlanarImage planarImage, int tileX, int tileY, Raster raster) {
computedTiles.add(raster);
if (computedTiles.size() == expectedSize) {
notify();
}
}
public void tileCancelled(Object o, TileRequest[] tileRequests, PlanarImage planarImage, int tileX, int tileY) {
}
public void tileComputationFailure(Object o, TileRequest[] tileRequests, PlanarImage planarImage, int tileX, int tileY, Throwable throwable) {
}
}
}