From 2e56e3facc2dc61129cab560edc42e9b8a655d8e Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Sun, 16 Mar 2014 03:51:24 +0100 Subject: [PATCH] start BitmapTileLayer pool --- .../oscim/android/canvas/AndroidBitmap.java | 6 ++- .../layers/tile/bitmap/BitmapTileLayer.java | 37 +++++++++++++++++++ .../layers/tile/bitmap/BitmapTileLoader.java | 3 +- .../oscim/renderer/elements/BitmapLayer.java | 17 ++++++++- 4 files changed, 59 insertions(+), 4 deletions(-) diff --git a/vtm-android/src/org/oscim/android/canvas/AndroidBitmap.java b/vtm-android/src/org/oscim/android/canvas/AndroidBitmap.java index 592b59b6..69a155e7 100644 --- a/vtm-android/src/org/oscim/android/canvas/AndroidBitmap.java +++ b/vtm-android/src/org/oscim/android/canvas/AndroidBitmap.java @@ -25,12 +25,13 @@ import android.opengl.GLUtils; public class AndroidBitmap implements org.oscim.backend.canvas.Bitmap { final Bitmap mBitmap; + public AndroidBitmap(InputStream inputStream) { mBitmap = BitmapFactory.decodeStream(inputStream); } @Override - public boolean isValid(){ + public boolean isValid() { return mBitmap != null; } @@ -86,6 +87,9 @@ public class AndroidBitmap implements org.oscim.backend.canvas.Bitmap { @Override public void recycle() { + if (mBitmap == null) + return; + mBitmap.recycle(); } } diff --git a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java index fad8fd50..b03977ca 100644 --- a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java @@ -23,6 +23,7 @@ import org.oscim.layers.tile.TileLoader; import org.oscim.layers.tile.TileManager; import org.oscim.layers.tile.VectorTileRenderer; import org.oscim.map.Map; +import org.oscim.renderer.elements.TextureItem.TexturePool; import org.oscim.tiling.TileSource; import org.oscim.utils.FastMath; import org.slf4j.Logger; @@ -102,4 +103,40 @@ public class BitmapTileLayer extends TileLayer { protected TileLoader createLoader() { return new BitmapTileLoader(this, mTileSource); } + + final static int TEXTURE_HEIGHT = 256; + final static int TEXTURE_WIDTH = 256; + final static int POOL_FILL = 40; + + /** pool shared by TextLayers */ + final static TexturePool pool = new TexturePool(POOL_FILL, + TEXTURE_WIDTH, + TEXTURE_HEIGHT) { + + // int sum = 0; + // + // public TextureItem release(TextureItem item) { + // log.debug(getFill() + " " + sum + " release tex " + item.id); + // return super.release(item); + // }; + // + // public synchronized TextureItem get() { + // log.debug(getFill() + " " + sum + " get tex "); + // + // return super.get(); + // }; + // + // protected TextureItem createItem() { + // log.debug(getFill() + " " + (sum++) + " create tex "); + // + // return super.createItem(); + // }; + // + // protected void freeItem(TextureItem t) { + // log.debug(getFill() + " " + (sum--) + " free tex "); + // super.freeItem(t); + // + // }; + }; + } diff --git a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java index 742e3f9b..8454c68d 100644 --- a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java @@ -63,7 +63,8 @@ public class BitmapTileLoader extends TileLoader { throw new CancellationException(); BitmapLayer l = new BitmapLayer(false); - l.setBitmap(bitmap, Tile.SIZE, Tile.SIZE); + l.setBitmap(bitmap, Tile.SIZE, Tile.SIZE, BitmapTileLayer.pool); + ElementLayers layers = new ElementLayers(); layers.setTextureLayers(l); mTile.data = layers; diff --git a/vtm/src/org/oscim/renderer/elements/BitmapLayer.java b/vtm/src/org/oscim/renderer/elements/BitmapLayer.java index ccff308f..c67c846a 100644 --- a/vtm/src/org/oscim/renderer/elements/BitmapLayer.java +++ b/vtm/src/org/oscim/renderer/elements/BitmapLayer.java @@ -24,6 +24,7 @@ import org.oscim.renderer.GLState; import org.oscim.renderer.GLUtils; import org.oscim.renderer.GLViewport; import org.oscim.renderer.MapRenderer; +import org.oscim.renderer.elements.TextureItem.TexturePool; /** * Renderer for a single bitmap, width and height must be power of 2. @@ -54,13 +55,25 @@ public class BitmapLayer extends TextureLayer { /** * w/h sets also target dimension to render the bitmap. */ + public void setBitmap(Bitmap bitmap, int w, int h) { + setBitmap(bitmap, w, h, null); + } + + public void setBitmap(Bitmap bitmap, int w, int h, TexturePool pool) { + mWidth = w; mHeight = h; mBitmap = bitmap; - if (textures == null) - textures = new TextureItem(mBitmap); + if (textures == null) { + if (pool == null) + textures = new TextureItem(mBitmap); + else { + textures = pool.get(); + textures.bitmap = mBitmap; + } + } TextureItem t = textures; t.vertices = TextureLayer.INDICES_PER_SPRITE;