package rabbitescape.ui.android;
import android.content.res.Resources;
import android.graphics.BitmapFactory;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import rabbitescape.render.BitmapLoader;
import rabbitescape.render.FailedToLoadImage;
import static rabbitescape.engine.util.Util.reAssert;
public class AndroidBitmapLoader implements BitmapLoader<AndroidBitmap>
{
private static final int[] SIZES = new int[] { 32, 64, 128 };
private final Resources resources;
public AndroidBitmapLoader( Resources resources )
{
this.resources = resources;
}
@Override
public AndroidBitmap load( String name, int tileSize )
{
reAssert( Arrays.binarySearch( SIZES, tileSize ) >= 0 );
String resourcePath = "images" + tileSize + "/" + name + ".png";
try
{
InputStream assetStream = resources.getAssets().open( resourcePath );
try
{
return new AndroidBitmap( BitmapFactory.decodeStream( assetStream ) );
}
finally
{
assetStream.close();
}
}
catch ( IOException e )
{
throw new FailedToLoadImage( name, e );
}
}
@Override
public int sizeFor( int tileSize )
{
// Return the smallest size that is >= tileSize
// Could share this code with SwingBitmapLoader, but I'm
// not convinced we will always want the same implementation
// here and there. E.g. maybe on one platform scaling up is
// better than down.
for ( int size : SIZES )
{
if ( tileSize <= size )
{
return size;
}
}
return SIZES[ SIZES.length - 1 ];
}
}