/*
* $Id$
*
* Copyright (c) 2007 by Joel Uckelman
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License (LGPL) as published by the Free Software Foundation.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, copies are available
* at http://www.opensource.org.
*/
package VASSAL.tools.imageop;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
/**
* The abstract base class for {@link ImageOp}s which are
* a single tile. This class provides simpler implementations of the
* tile-related methods than does {@link AbstractTiledOp}, as objects
* instantiating this class' subclasses are all single tiles.
*
* @since 3.1.0
* @author Joel Uckelman
*/
public abstract class AbstractTileOpImpl extends AbstractOpImpl {
/**
* {@inheritDoc}
*
* This implementation is equivalent to {@link #getSize}.
*/
public Dimension getTileSize() {
return getSize();
}
/**
* {@inheritDoc}
*
* This implementation is equivalent to {@link #getHeight}.
*/
public int getTileHeight() {
return getHeight();
}
/**
* {@inheritDoc}
*
* This implementation is equivalent to {@link #getWidth}.
*/
public int getTileWidth() {
return getWidth();
}
/**
* {@inheritDoc}
*
* @return <code>1</code>, always
*/
public int getNumXTiles() {
return 1;
}
/**
* {@inheritDoc}
*
* @return <code>1</code>, always
*/
public int getNumYTiles() {
return 1;
}
/**
* {@inheritDoc}
*
* @return <code>getImage(obs)</code>, because there is only one tile
* @throws IndexOutOfBoundsException
* If <code>tileX != 0</code> or <code>tileY != 0</code>.
*/
public BufferedImage getTile(int tileX, int tileY, ImageOpObserver obs)
throws CancellationException, InterruptedException, ExecutionException
{
// we are but a single humble tile
if (tileX != 0 || tileY != 0)
throw new IndexOutOfBoundsException();
return getImage(obs);
}
/**
* {@inheritDoc}
*
* @return <code>getFutureImage(obs)</code>, because there is only one tile
* @throws IndexOutOfBoundsException
* If <code>tileX != 0</code> or <code>tileY != 0</code>.
*/
public Future<BufferedImage> getFutureTile(
int tileX, int tileY, ImageOpObserver obs) throws ExecutionException
{
// we are but a single humble tile
if (tileX != 0 || tileY != 0)
throw new IndexOutOfBoundsException();
return getFutureImage(obs);
}
public ImageOp getTileOp(int tileX, int tileY) {
// we are but a single humble tile
if (tileX != 0 || tileY != 0)
throw new IndexOutOfBoundsException();
return this;
}
/**
* {@inheritDoc}
*
* @throws IllegalArgumentException if <code>rect == null</code>.
*/
public Point[] getTileIndices(Rectangle rect) {
if (rect == null) throw new IllegalArgumentException();
return rect.intersects(new Rectangle(size)) ?
new Point[]{new Point(0,0)} : new Point[0];
}
}