package rabbitescape.render;
import rabbitescape.render.androidlike.Bitmap;
public class BitmapCache<T extends Bitmap>
{
private BitmapLoader<T> loader;
private final BitmapScaler<T> scaler;
private final ReLruCache<T> cache;
public BitmapCache(
BitmapLoader<T> loader,
BitmapScaler<T> scaler,
long cacheSize
)
{
this.loader = loader;
this.scaler = scaler;
this.cache = new ReLruCache<T>( cacheSize );
}
public T get( String fileName, int tileSize )
{
T ret = cache.get( fileName + tileSize );
if ( ret == null )
{
ret = loadBitmap( fileName, tileSize );
cache.put( fileName + tileSize, ret );
}
return ret;
}
public void recycle()
{
cache.recycle();
}
public void setLoader( BitmapLoader<T> loader )
{
this.loader = loader;
}
private T loadBitmap( String fileName, int tileSize )
{
// TODO: move this logic into loader - some loaders
// (including android?) can scale as they load,
// meanng we have less garbage to collect.
int unscaledSize = loader.sizeFor( tileSize );
T unscaled = loader.load( fileName, unscaledSize );
if ( unscaledSize == tileSize )
{
return unscaled;
}
else
{
double scale = tileSize / ( double )unscaledSize;
T ret = scaler.scale( unscaled, scale );
unscaled.recycle();
return ret;
}
}
}