package rabbitescape.ui.swing; import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.CoreMatchers.*; import static rabbitescape.ui.swing.Tools.*; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Test; import rabbitescape.render.BitmapCache; import rabbitescape.render.Renderer; import rabbitescape.render.Sprite; public class TestSwingRendering { private SwingBitmapLoader loader; private BitmapCache<SwingBitmap> cache; @Before public void setUp() { loader = new SwingBitmapLoader(); cache = new BitmapCache<SwingBitmap>( loader, new SwingBitmapScaler(), Runtime.getRuntime().maxMemory() / 8 ); } @After public void tearDown() { cache.recycle(); } @Test public void Draw_sprites_on_grid_lines_unscaled() { List<Sprite> sprites = new ArrayList<Sprite>(); sprites.add( sprite( 0, 0, 0, 0 ) ); sprites.add( sprite( 1, 0, 0, 0 ) ); sprites.add( sprite( 0, 1, 0, 0 ) ); sprites.add( sprite( 1, 1, 0, 0 ) ); sprites.add( sprite( 1, 2, 0, 0 ) ); SwingBitmapCanvas output = blankCanvas( 64, 96 ); Renderer<SwingBitmap, SwingPaint> renderer = new Renderer<SwingBitmap, SwingPaint>( 0, 0, 32, cache ); renderer.render( output, sprites, new SwingPaint( null ) ); SwingBitmap expected = loader.load( "sixx", 32 ); assertThat( output.bitmap, equalTo( expected ) ); } @Test public void Renderer_can_be_offset() { List<Sprite> sprites = new ArrayList<Sprite>(); sprites.add( sprite( 0, 0, 0, 0 ) ); SwingBitmapCanvas output = blankCanvas( 35, 34 ); Renderer<SwingBitmap, SwingPaint> renderer = new Renderer<SwingBitmap, SwingPaint>( 3, 2, 32, cache ); renderer.render( output, sprites, new SwingPaint( null ) ); SwingBitmap expected = loader.load( "x32", 32 ); assertThat( output.bitmap, equalTo( expected ) ); } @Test public void Renderer_tile_size_can_be_non_32() { List<Sprite> sprites = new ArrayList<Sprite>(); sprites.add( sprite( 1, 1, 0, 0 ) ); SwingBitmapCanvas output = blankCanvas( 35, 34 ); Renderer<SwingBitmap, SwingPaint> renderer = new Renderer<SwingBitmap, SwingPaint>( 3, 2, 16, cache ); // ... but the renderer gets to say what size it wants (16). renderer.render( output, sprites, new SwingPaint( null ) ); SwingBitmap expected = loader.load( "x16-32", 32 ); assertThat( output.bitmap, equalTo( expected ) ); } @Test public void Sprites_can_be_offset_individually() { List<Sprite> sprites = new ArrayList<Sprite>(); sprites.add( sprite( 0, 0, 3, 2 ) ); // the Sprite is offset SwingBitmapCanvas output = blankCanvas( 35, 34 ); Renderer<SwingBitmap, SwingPaint> renderer = new Renderer<SwingBitmap, SwingPaint>( 0, 0, 32, cache ); // the Renderer is not renderer.render( output, sprites, new SwingPaint( null ) ); SwingBitmap expected = loader.load( "x32", 32 ); assertThat( output.bitmap, equalTo( expected ) ); } @Test public void Sprites_offset_is_scaled_relative_to_tile_size() { List<Sprite> sprites = new ArrayList<Sprite>(); sprites.add( sprite( 1, 1, 6, 4 ) ); SwingBitmapCanvas output = blankCanvas( 35, 34 ); Renderer<SwingBitmap, SwingPaint> renderer = new Renderer<SwingBitmap, SwingPaint>( 0, 0, 16, cache ); renderer.render( output, sprites, new SwingPaint( null ) ); assertThat( sprites.get( 0 ).offsetX( 16 ), equalTo( 3 ) ); assertThat( sprites.get( 0 ).offsetY( 16 ), equalTo( 2 ) ); SwingBitmap expected = loader.load( "x16-32", 32 ); assertThat( output.bitmap, equalTo( expected ) ); } // -- /** * @return a SwingImageCanvas that has its background set to the magic * "none" colour that that I chose to be RGB 64, 177, 170. */ private SwingBitmapCanvas blankCanvas( int width, int height ) { SwingBitmap outBitmap = new SwingBitmap( "output", width, height ); BufferedImage image = outBitmap.image; Graphics2D gfx = image.createGraphics(); gfx.setColor( new Color( 64, 177, 170 ) ); gfx.fillRect( 0, 0, outBitmap.image.getWidth(), outBitmap.image.getHeight() ); return new SwingBitmapCanvas( outBitmap ); } private Sprite sprite( int tileX, int tileY, int offsetX, int offsetY ) { return new Sprite( "x", null, tileX, tileY, offsetX, offsetY ); } }