package rabbitescape.ui.android; import android.graphics.Paint; import android.graphics.Path; import java.util.Iterator; import java.util.List; import rabbitescape.render.Vertex; import rabbitescape.render.androidlike.Canvas; public class AndroidCanvas implements Canvas<AndroidBitmap, AndroidPaint> { private final android.graphics.Canvas canvas; public AndroidCanvas( android.graphics.Canvas canvas ) { this.canvas = canvas; } @Override public void drawBitmap( AndroidBitmap bitmap, float left, float top, AndroidPaint paint ) { // v0.10.1 crashed on Nexus 10 in some levels with // "java.lang.RuntimeException: Canvas: trying to use a recycled bitmap" // This lock and check should protect us from using a bitmap that has been recycled. // I added the same lock into AndroidBitmap.recycle, so we should not get a race // condition here. // See https://github.com/andybalaam/rabbit-escape/issues/476 synchronized ( bitmap.bitmap ) { if ( !bitmap.bitmap.isRecycled() ) { canvas.drawBitmap(bitmap.bitmap, left, top, paint.paint); } } } @Override public int width() { return canvas.getWidth(); } @Override public int height() { return canvas.getHeight(); } @Override public void drawColor( AndroidPaint paint ) { canvas.drawColor( paint.paint.getColor() ); } @Override public void drawLine( float startX, float startY, float stopX, float stopY, AndroidPaint paint ) { this.canvas.drawLine(startX, startY, stopX, stopY, paint.paint); } @Override public void drawPath( rabbitescape.render.androidlike.Path rePath, AndroidPaint paint ) { List<Vertex> vertices = rePath.getVertices(); if ( vertices.size() == 0 ) { return; } android.graphics.Path aPath = new android.graphics.Path(); Iterator<Vertex> iterator = vertices.iterator(); Vertex start = vertices.get( 0 ); aPath.moveTo( start.x, start.y ); for ( int i = 1 ; i < vertices.size() ; i++ ) { Vertex v = vertices.get( i ); aPath.lineTo( v.x, v.y ); } canvas.drawPath( aPath, paint.paint ); } public void drawRect( rabbitescape.render.androidlike.Rect rect, AndroidPaint paint ) { this.canvas.drawRect( new android.graphics.Rect( rect.left, rect.top, rect.right, rect.bottom ) , paint.paint ); } public void drawText( String text, float x, float y, AndroidPaint paint ) { this.canvas.drawText( text, x, y, paint.paint); } }