refactor TileLayer:

- set specific TileRenderer in sub-class constructor
- remove TileLoader generics from TileLayer
This commit is contained in:
Hannes Janetzek 2014-02-16 22:52:31 +01:00
parent 5cffe3a3b3
commit adb56c7613
9 changed files with 50 additions and 55 deletions

View File

@ -36,7 +36,7 @@ public class PathOverlayActivity extends BitmapTileMapActivity {
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mBitmapLayer.getTileRenderer().setBitmapAlpha(0.5f); mBitmapLayer.tileRenderer().setBitmapAlpha(0.5f);
createLayers(1, true); createLayers(1, true);

View File

@ -147,7 +147,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
} }
} }
public void setTileDataSource(ITileDataSource mapDatabase) { public void setDataSource(ITileDataSource mapDatabase) {
if (mTileDataSource != null) if (mTileDataSource != null)
mTileDataSource.destroy(); mTileDataSource.destroy();

View File

@ -30,6 +30,7 @@ import org.oscim.renderer.elements.ElementLayers;
import org.oscim.tiling.MapTile; import org.oscim.tiling.MapTile;
import org.oscim.tiling.TileLoader; import org.oscim.tiling.TileLoader;
import org.oscim.tiling.TileManager; import org.oscim.tiling.TileManager;
import org.oscim.tiling.TileRenderer;
import org.oscim.tiling.source.ITileDataSink; import org.oscim.tiling.source.ITileDataSink;
import org.oscim.tiling.source.ITileDataSource; import org.oscim.tiling.source.ITileDataSource;
import org.oscim.tiling.source.ITileDataSource.QueryResult; import org.oscim.tiling.source.ITileDataSource.QueryResult;
@ -38,7 +39,7 @@ import org.oscim.utils.FastMath;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class BitmapTileLayer extends TileLayer<TileLoader> { public class BitmapTileLayer extends TileLayer {
protected static final Logger log = LoggerFactory.getLogger(BitmapTileLayer.class); protected static final Logger log = LoggerFactory.getLogger(BitmapTileLayer.class);
@ -65,7 +66,8 @@ public class BitmapTileLayer extends TileLayer<TileLoader> {
public BitmapTileLayer(Map map, TileSource tileSource, int cacheLimit) { public BitmapTileLayer(Map map, TileSource tileSource, int cacheLimit) {
super(map, tileSource.getZoomLevelMin(), tileSource.getZoomLevelMax(), cacheLimit); super(map, tileSource.getZoomLevelMin(), tileSource.getZoomLevelMax(), cacheLimit);
mTileSource = tileSource; mTileSource = tileSource;
initLoader(); setRenderer(new TileRenderer(mTileManager));
initLoader(4);
} }
@Override @Override
@ -96,7 +98,7 @@ public class BitmapTileLayer extends TileLayer<TileLoader> {
break; break;
} }
mRenderLayer.setBitmapAlpha(alpha); tileRenderer().setBitmapAlpha(alpha);
} }
@Override @Override

View File

@ -16,18 +16,18 @@
*/ */
package org.oscim.layers.tile; package org.oscim.layers.tile;
import java.util.ArrayList;
import org.oscim.core.MapPosition; import org.oscim.core.MapPosition;
import org.oscim.layers.Layer; import org.oscim.layers.Layer;
import org.oscim.map.Map; import org.oscim.map.Map;
import org.oscim.map.Map.UpdateListener;
import org.oscim.tiling.TileLoader; import org.oscim.tiling.TileLoader;
import org.oscim.tiling.TileManager; import org.oscim.tiling.TileManager;
import org.oscim.tiling.TileRenderer; import org.oscim.tiling.TileRenderer;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public abstract class TileLayer<T extends TileLoader> extends Layer implements Map.UpdateListener { public abstract class TileLayer extends Layer implements UpdateListener {
static final Logger log = LoggerFactory.getLogger(TileLayer.class); static final Logger log = LoggerFactory.getLogger(TileLayer.class);
private final static int MAX_ZOOMLEVEL = 17; private final static int MAX_ZOOMLEVEL = 17;
@ -35,10 +35,8 @@ public abstract class TileLayer<T extends TileLoader> extends Layer implements M
private final static int CACHE_LIMIT = 150; private final static int CACHE_LIMIT = 150;
protected final TileManager mTileManager; protected final TileManager mTileManager;
protected final TileRenderer mRenderLayer;
protected final int mNumTileLoader = 4; protected TileLoader[] mTileLoader;
protected final ArrayList<T> mTileLoader;
public TileLayer(Map map) { public TileLayer(Map map) {
this(map, MIN_ZOOMLEVEL, MAX_ZOOMLEVEL, CACHE_LIMIT); this(map, MIN_ZOOMLEVEL, MAX_ZOOMLEVEL, CACHE_LIMIT);
@ -46,39 +44,36 @@ public abstract class TileLayer<T extends TileLoader> extends Layer implements M
public TileLayer(Map map, int minZoom, int maxZoom, int cacheLimit) { public TileLayer(Map map, int minZoom, int maxZoom, int cacheLimit) {
super(map); super(map);
/* TileManager responsible for adding visible tiles
// TileManager responsible for adding visible tiles * to load queue and managing in-memory tile cache. */
// to load queue and managing in-memory tile cache.
mTileManager = new TileManager(map, minZoom, maxZoom, cacheLimit); mTileManager = new TileManager(map, minZoom, maxZoom, cacheLimit);
// Instantiate TileLoader threads
mTileLoader = new ArrayList<T>();
// RenderLayer is working in GL Thread and actually
// drawing loaded tiles to screen.
mRenderer = mRenderLayer = new TileRenderer(mTileManager);
} }
protected void initLoader() { abstract protected TileLoader createLoader(TileManager tm);
for (int i = 0; i < mNumTileLoader; i++) {
T tileGenerator = createLoader(mTileManager); protected void setRenderer(TileRenderer renderer) {
mTileLoader.add(tileGenerator); mRenderer = renderer;
tileGenerator.start();
}
} }
abstract protected T createLoader(TileManager tm); public TileRenderer tileRenderer() {
public TileRenderer getTileRenderer() {
return (TileRenderer) mRenderer; return (TileRenderer) mRenderer;
} }
protected void initLoader(int numLoaders) {
mTileLoader = new TileLoader[numLoaders];
for (int i = 0; i < numLoaders; i++) {
mTileLoader[i] = createLoader(mTileManager);
mTileLoader[i].start();
}
}
@Override @Override
public void onMapUpdate(MapPosition mapPosition, boolean changed, boolean clear) { public void onMapUpdate(MapPosition mapPosition, boolean changed, boolean clear) {
if (clear) { if (clear) {
// sync with TileRenderer // sync with TileRenderer
synchronized (mRenderLayer) { synchronized (mRenderer) {
mRenderLayer.clearTiles(); tileRenderer().clearTiles();
mTileManager.init(); mTileManager.init();
} }
@ -91,7 +86,7 @@ public abstract class TileLayer<T extends TileLoader> extends Layer implements M
@Override @Override
public void onDetach() { public void onDetach() {
for (T loader : mTileLoader) { for (TileLoader loader : mTileLoader) {
loader.pause(); loader.pause();
loader.interrupt(); loader.interrupt();
loader.cleanup(); loader.cleanup();
@ -99,27 +94,26 @@ public abstract class TileLayer<T extends TileLoader> extends Layer implements M
} }
void notifyLoaders() { void notifyLoaders() {
for (int i = 0; i < mNumTileLoader; i++) { for (TileLoader loader : mTileLoader)
mTileLoader.get(i).go(); loader.go();
}
} }
protected void pauseLoaders(boolean wait) { protected void pauseLoaders(boolean wait) {
for (T loader : mTileLoader) { for (TileLoader loader : mTileLoader) {
if (!loader.isPausing()) if (!loader.isPausing())
loader.pause(); loader.pause();
} }
if (!wait) if (!wait)
return; return;
for (T loader : mTileLoader) { for (TileLoader loader : mTileLoader) {
if (!loader.isPausing()) if (!loader.isPausing())
loader.awaitPausing(); loader.awaitPausing();
} }
} }
protected void resumeLoaders() { protected void resumeLoaders() {
for (T loader : mTileLoader) for (TileLoader loader : mTileLoader)
loader.proceed(); loader.proceed();
} }
} }

View File

@ -21,7 +21,6 @@ import org.oscim.backend.canvas.Paint.Cap;
import org.oscim.core.GeometryBuffer; import org.oscim.core.GeometryBuffer;
import org.oscim.core.Tile; import org.oscim.core.Tile;
import org.oscim.layers.tile.TileLayer; import org.oscim.layers.tile.TileLayer;
import org.oscim.layers.tile.example.TestTileLayer.TestTileLoader;
import org.oscim.map.Map; import org.oscim.map.Map;
import org.oscim.renderer.elements.ElementLayers; import org.oscim.renderer.elements.ElementLayers;
import org.oscim.renderer.elements.LineLayer; import org.oscim.renderer.elements.LineLayer;
@ -32,7 +31,7 @@ import org.oscim.tiling.TileManager;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
public class TestTileLayer extends TileLayer<TestTileLoader> { public class TestTileLayer extends TileLayer {
static final Logger log = LoggerFactory.getLogger(TestTileLayer.class); static final Logger log = LoggerFactory.getLogger(TestTileLayer.class);
public TestTileLayer(Map map) { public TestTileLayer(Map map) {

View File

@ -29,7 +29,7 @@ public class BuildingLayer extends Layer {
public BuildingLayer(Map map, VectorTileLayer tileLayer) { public BuildingLayer(Map map, VectorTileLayer tileLayer) {
super(map); super(map);
mExtLayer = new ExtrusionRenderer(tileLayer.getTileRenderer()) { mExtLayer = new ExtrusionRenderer(tileLayer.tileRenderer()) {
private long mStartTime; private long mStartTime;
@Override @Override

View File

@ -21,7 +21,7 @@ import org.oscim.map.Map;
import org.oscim.theme.IRenderTheme; import org.oscim.theme.IRenderTheme;
import org.oscim.tiling.TileLoader; import org.oscim.tiling.TileLoader;
import org.oscim.tiling.TileManager; import org.oscim.tiling.TileManager;
import org.oscim.tiling.source.ITileDataSource; import org.oscim.tiling.TileRenderer;
import org.oscim.tiling.source.TileSource; import org.oscim.tiling.source.TileSource;
import org.oscim.tiling.source.TileSource.OpenResult; import org.oscim.tiling.source.TileSource.OpenResult;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -32,19 +32,21 @@ import org.slf4j.LoggerFactory;
* {@link VectorTileLoader} that load and assemble vector tiles * {@link VectorTileLoader} that load and assemble vector tiles
* for rendering. * for rendering.
*/ */
public class VectorTileLayer extends TileLayer<VectorTileLoader> { public class VectorTileLayer extends TileLayer {
static final Logger log = LoggerFactory.getLogger(VectorTileLayer.class); static final Logger log = LoggerFactory.getLogger(VectorTileLayer.class);
private TileSource mTileSource; private TileSource mTileSource;
public VectorTileLayer(Map map) { public VectorTileLayer(Map map) {
super(map); super(map);
initLoader(); setRenderer(new TileRenderer(mTileManager));
initLoader(4);
} }
public VectorTileLayer(Map map, int minZoom, int maxZoom, int cacheLimit) { public VectorTileLayer(Map map, int minZoom, int maxZoom, int cacheLimit) {
super(map, minZoom, maxZoom, cacheLimit); super(map, minZoom, maxZoom, cacheLimit);
initLoader(); setRenderer(new TileRenderer(mTileManager));
initLoader(4);
} }
@Override @Override
@ -75,10 +77,8 @@ public class VectorTileLayer extends TileLayer<VectorTileLoader> {
mTileSource = tileSource; mTileSource = tileSource;
for (int i = 0; i < mNumTileLoader; i++) { for (TileLoader l : mTileLoader)
ITileDataSource tileDataSource = tileSource.getDataSource(); ((VectorTileLoader) l).setDataSource(tileSource.getDataSource());
mTileLoader.get(i).setTileDataSource(tileDataSource);
}
mMap.clearMap(); mMap.clearMap();
resumeLoaders(); resumeLoaders();
@ -96,10 +96,10 @@ public class VectorTileLayer extends TileLayer<VectorTileLoader> {
pauseLoaders(true); pauseLoaders(true);
mTileManager.clearJobs(); mTileManager.clearJobs();
for (VectorTileLoader g : mTileLoader) for (TileLoader l : mTileLoader)
g.setRenderTheme(theme); ((VectorTileLoader) l).setRenderTheme(theme);
mRenderLayer.setOverdrawColor(theme.getMapBackground()); tileRenderer().setOverdrawColor(theme.getMapBackground());
resumeLoaders(); resumeLoaders();
} }

View File

@ -158,7 +158,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
} }
} }
public void setTileDataSource(ITileDataSource mapDatabase) { public void setDataSource(ITileDataSource mapDatabase) {
if (mTileDataSource != null) if (mTileDataSource != null)
mTileDataSource.destroy(); mTileDataSource.destroy();

View File

@ -43,7 +43,7 @@ public class LabelLayer extends Layer implements Map.InputListener, Map.UpdateLi
super(map); super(map);
l.getManager().events.bind(this); l.getManager().events.bind(this);
mLabelPlacer = new LabelPlacement(map, l.getTileRenderer()); mLabelPlacer = new LabelPlacement(map, l.tileRenderer());
mWorker = new Worker(map); mWorker = new Worker(map);
mRenderer = new TextRenderer(mWorker); mRenderer = new TextRenderer(mWorker);
} }