Class AbstractOpImpl
- All Implemented Interfaces:
ImageOp
,Op<BufferedImage>
- Direct Known Subclasses:
AbstractTiledOpImpl
,AbstractTileOpImpl
Image
. ImageOp
is the base class for all such
operations. The results of all operations are memoized (using a
memory-sensitive cache), so retrieving results is both fast and
memory-efficient.
Warning: For efficiency reasons, the methods getImage()
and getTile(java.awt.Point, VASSAL.tools.imageop.ImageOpObserver)
do not return Image
s
defensively, nor do the Future<Image>
s returned by
getFutureImage(VASSAL.tools.imageop.ImageOpObserver)
and getFutureTile(java.awt.Point, VASSAL.tools.imageop.ImageOpObserver)
. That is, the
Image
returned is possibly the one retained internally by
the ImageOp
. Therefore, Image
s obtained from
an ImageOp
must not be altered, as this might
interfere with image caching. If an Image
obtained this way
needs to be modified, copy the Image
first and alter the
copy.
- Since:
- 3.1.0
- Author:
- Joel Uckelman
-
Field Summary
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionstatic void
abstract BufferedImage
eval()
Runs theOp
.protected abstract void
fixSize()
Submits a request for theBufferedImage
produced by this operation, and returns a reference to that request.abstract Future
<BufferedImage> getFutureTile
(int tileX, int tileY, ImageOpObserver obs) Submits a request for tile(tileX,tileY)
, and returns a reference to that request.getFutureTile
(Point p, ImageOpObserver obs) Submits a request for tile(tileX,tileY)
, and returns a reference to that request.int
Returns the height of theBufferedImage
which would be returned byImageOp.getImage()
.getImage()
Calculates theBufferedImage
produced by this operation.getImage
(ImageOpObserver obs) Calculates theBufferedImage
produced by this operation, and reports completion or failure to the specifiedImageOpObserver
.abstract int
Returns the number of tiles along the x-axis.abstract int
Returns the number of tiles along the y-axis.getSize()
Returns the size of theBufferedImage
which would be returned byImageOp.getImage()
.protected Dimension
A utility method for retrieving the size of the computedImage
from the cache if theImage
is cached.abstract BufferedImage
getTile
(int tileX, int tileY, ImageOpObserver obs) Calculates tile(tileX,tileY)
, and reports completion or failure to the specifiedImageOpObserver
.getTile
(Point p, ImageOpObserver obs) Calculates tile(p.x,p.y)
, and reports completion or failure to the specifiedImageOpObserver
.abstract int
Returns the standard height of theBufferedImage
tiles which are returned byImageOp.getTile(java.awt.Point, VASSAL.tools.imageop.ImageOpObserver)
.abstract Point[]
getTileIndices
(Rectangle rect) Returns an array ofPoint
s representing the tiles intersecting the givenRectangle
.abstract ImageOp
getTileOp
(int tileX, int tileY) Returns anImageOp
which can produce the requested tile.Returns anImageOp
which can produce the requested tile.abstract Dimension
Returns the standard size of theBufferedImage
tiles which are returned byImageOp.getTile(java.awt.Point, VASSAL.tools.imageop.ImageOpObserver)
.abstract int
Returns the standard width of theBufferedImage
tiles which are returned byImageOp.getTile(java.awt.Point, VASSAL.tools.imageop.ImageOpObserver)
.int
getWidth()
Returns the width of theBufferedImage
which would be returned byImageOp.getImage()
.Methods inherited from class VASSAL.tools.opcache.AbstractOpImpl
get, get, getFuture, getSources, newKey, update
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface VASSAL.tools.opcache.Op
getSources, newKey, update
-
Field Details
-
size
The cached size of this operation's resultingImage
. -
cache
The cache which contains calculatedImage
s.
-
-
Constructor Details
-
AbstractOpImpl
public AbstractOpImpl()
-
-
Method Details
-
clearCache
public static void clearCache() -
eval
Runs theOp
. This method should be called only by the caching framework.- Specified by:
eval
in interfaceImageOp
- Specified by:
eval
in interfaceOp<BufferedImage>
- Specified by:
eval
in classAbstractOpImpl<BufferedImage>
- Returns:
- the result of running this
Op
- Throws:
Exception
- The operation represented by thisImageOp
could be anything, so any exception may be thrown.
-
getImage
Calculates theBufferedImage
produced by this operation. Calls to this method are memoized to prevent redundant computations.Warning:
BufferedImage
s returned by this method must not be modified. -
getImage
public BufferedImage getImage(ImageOpObserver obs) throws CancellationException, InterruptedException, ExecutionException Calculates theBufferedImage
produced by this operation, and reports completion or failure to the specifiedImageOpObserver
. Calls to this method are memoized to prevent redundant computations. If a non-null
observer is given, then the operation may be done asynchronously. If the observer isnull
, then this method will block on completion of the operation.When a non-blocking call is made (i.e., when
obs != null
), the cache is checked and if the image is found, it is returned immediately. If the image is already being calculated,obs
is notified when the pre-existing request completes. Otherwise, a new request is queued andobs
is notified when that completes.When a blocking call is made (i.e., when
obs == null
), the cache is checked and if the image is found, it is returned immediately. If the image is already being calculated, this method blocks on the completion of the existing calculation. Otherwise, a new calculation is started and this method blocks on it. In all cases, when a calculation is completed, the result is cached.Warning:
BufferedImage
s returned by this method must not be modified.- Specified by:
getImage
in interfaceImageOp
- Parameters:
obs
- the observer to be notified on completion- Returns:
- the resulting
BufferedImage
- Throws:
CancellationException
- if the operation was cancelledInterruptedException
- if the operation was interruptedExecutionException
- if the operation failed- See Also:
-
getFutureImage
Submits a request for theBufferedImage
produced by this operation, and returns a reference to that request. If a non-null
observer is given, then the operation may be done asynchronously. If the observer isnull
, then this method will block on completion of the operation.This implementation uses a memory-sensitive cache to memoize calls to
getFutureImage
. It returns aFuture<BufferedImage>
so that the request may be cancelled if no longer needed.Future
s are returned immediately, except in the case where the is no observer and no pre-existingFuture
for thisImageOp
'sBufferedImage
, in which case this method blocks on completion of the computation.Warning:
BufferedImage
s obtained from theFuture
s returned by this method must not be modified.- Specified by:
getFutureImage
in interfaceImageOp
- Parameters:
obs
- the observer to be notified on completion- Returns:
- a
Future
for the resultingBufferedImage
- Throws:
ExecutionException
- if the operation failed- See Also:
-
getSizeFromCache
A utility method for retrieving the size of the computedImage
from the cache if theImage
is cached.- Returns:
- the size of the cached
Image
, ornull
if theImage
isn't cached
-
fixSize
protected abstract void fixSize() -
getSize
Returns the size of theBufferedImage
which would be returned byImageOp.getImage()
. The size is cached so that it need not be recalculated on each call. -
getWidth
public int getWidth()Returns the width of theBufferedImage
which would be returned byImageOp.getImage()
. The width is cached so that it need not be recalculated on each call. -
getHeight
public int getHeight()Returns the height of theBufferedImage
which would be returned byImageOp.getImage()
. The height is cached so that it need not be recalculated on each call. -
getTileSize
Returns the standard size of theBufferedImage
tiles which are returned byImageOp.getTile(java.awt.Point, VASSAL.tools.imageop.ImageOpObserver)
. Tiles which are in the extreme right column will not have full width if theBufferedImage
width is not an integral multiple of the tile width. Similarly, tiles in the bottom row will not have full height if theBufferedImage
height is not an integral multiple of the tile height.- Specified by:
getTileSize
in interfaceImageOp
- Returns:
- the size of
BufferedImage
tiles in pixels - See Also:
-
getTileHeight
public abstract int getTileHeight()Returns the standard height of theBufferedImage
tiles which are returned byImageOp.getTile(java.awt.Point, VASSAL.tools.imageop.ImageOpObserver)
.- Specified by:
getTileHeight
in interfaceImageOp
- Returns:
- the height of
BufferedImage
tiles in pixels - See Also:
-
getTileWidth
public abstract int getTileWidth()Returns the standard width of theBufferedImage
tiles which are returned byImageOp.getTile(java.awt.Point, VASSAL.tools.imageop.ImageOpObserver)
.- Specified by:
getTileWidth
in interfaceImageOp
- Returns:
- the width of
BufferedImage
tiles in pixels - See Also:
-
getNumXTiles
public abstract int getNumXTiles()Returns the number of tiles along the x-axis. There will always be at least one column of tiles. The number of columns should equal(int) Math.ceil((double) getWidth() / getTileWidth())
.- Specified by:
getNumXTiles
in interfaceImageOp
- Returns:
- the number of tiles along the x-axis
-
getNumYTiles
public abstract int getNumYTiles()Returns the number of tiles along the y-axis. There will always be at least one row of tiles. The number of rows should equal(int) Math.ceil((double) getHeight() / getTileHeight())
.- Specified by:
getNumYTiles
in interfaceImageOp
- Returns:
- the number of tiles along the y-axis
-
getTile
public BufferedImage getTile(Point p, ImageOpObserver obs) throws CancellationException, InterruptedException, ExecutionException Calculates tile(p.x,p.y)
, and reports completion or failure to the specifiedImageOpObserver
. If a non-null
observer is given, then the operation may be done asynchronously. If the observer isnull
, then this method will block on completion of the operation. Tiles are numbered from zero, so the tile in the upper-left corner of the mainBufferedImage
is(0,0)
. Note thatp.x
andp.y
are indices into the tile array, not pixel locations.This convenience method is equivalent to
getTile(p.x, p.y, obs)
.Warning:
BufferedImage
s returned by this method must not be modified.- Specified by:
getTile
in interfaceImageOp
- Parameters:
p
- the position of the requested tileobs
- the observer- Returns:
- the resulting
BufferedImage
- Throws:
CancellationException
- if the operation was cancelledInterruptedException
- if the operation was interruptedExecutionException
- if the operation failed
-
getTile
public abstract BufferedImage getTile(int tileX, int tileY, ImageOpObserver obs) throws CancellationException, InterruptedException, ExecutionException Calculates tile(tileX,tileY)
, and reports completion or failure to the specifiedImageOpObserver
. If a non-null
observer is given, then the operation may be done asynchronously. If the observer isnull
, then this method will block on completion of the operation. Tiles are numbered from zero, so the tile in the upper-left corner of the mainBufferedImage
is(0,0)
. Note thattileX
andtileY
are indices into the tile array, not pixel locations.Warning:
BufferedImage
s returned by this method must not be modified.- Specified by:
getTile
in interfaceImageOp
- Parameters:
tileX
- the x position of the requested tiletileY
- the y position of the requested tileobs
- the observer to be notified on completion- Returns:
- the resulting
BufferedImage
- Throws:
CancellationException
- if the operation was cancelledInterruptedException
- if the operation was interruptedExecutionException
- if the operation failed
-
getFutureTile
Submits a request for tile(tileX,tileY)
, and returns a reference to that request. If a non-null
observer is given, then the operation may be done asynchronously. If the observer isnull
, then this method will block on completion of the operation. Tiles are numbered from zero, so the tile in the upper-left corner of the mainBufferedImage
is(0,0)
. Note thattileX
andtileY
are indices into the tile array, not pixel locations.This convenience method is equivalent to
getFutureTile(p.x, p.y, obs)
.Warning:
BufferedImage
s obtained from theFuture
s returned by this method must not be modified.- Specified by:
getFutureTile
in interfaceImageOp
- Parameters:
p
- the position of the requested tileobs
- the observer to be notified on completion- Returns:
- a
Future
for the resultingBufferedImage
- Throws:
ExecutionException
- if the operation failed
-
getFutureTile
public abstract Future<BufferedImage> getFutureTile(int tileX, int tileY, ImageOpObserver obs) throws ExecutionException Submits a request for tile(tileX,tileY)
, and returns a reference to that request. If a non-null
observer is given, then the operation may be done asynchronously. If the observer isnull
, then this method will block on completion of the operation. Tiles are numbered from zero, so the tile in the upper-left corner of the mainBufferedImage
is(0,0)
. Note thattileX
andtileY
are indices into the tile array, not pixel locations.Warning:
BufferedImage
s obtained from theFuture
s returned by this method must not be modified.- Specified by:
getFutureTile
in interfaceImageOp
- Parameters:
tileX
- the x position of the requested tiletileY
- the y position of the requested tileobs
- the observer to be notified on completion- Returns:
- a
Future
for the resultingBufferedImage
- Throws:
ExecutionException
- if the operation failed
-
getTileOp
Returns anImageOp
which can produce the requested tile.This convenience method is equivalent to
getTileOp(p.x, p.y)
. -
getTileOp
Returns anImageOp
which can produce the requested tile. -
getTileIndices
Returns an array ofPoint
s representing the tiles intersecting the givenRectangle
.- Specified by:
getTileIndices
in interfaceImageOp
- Parameters:
rect
- the rectangle- Returns:
- the positions of the tiles hit by the rectangle
-