diff --git a/vtm-playground/src/org/oscim/test/gdx/poi3d/Poi3DLayer.java b/vtm-playground/src/org/oscim/test/gdx/poi3d/Poi3DLayer.java index d2b55c84..35967955 100644 --- a/vtm-playground/src/org/oscim/test/gdx/poi3d/Poi3DLayer.java +++ b/vtm-playground/src/org/oscim/test/gdx/poi3d/Poi3DLayer.java @@ -73,6 +73,10 @@ public class Poi3DLayer extends Layer implements Map.UpdateListener { return true; } + + @Override + public void complete(MapTile tile, boolean success) { + } }); mTileLayer = tileLayer; diff --git a/vtm/src/org/oscim/layers/tile/buildings/BuildingLayer.java b/vtm/src/org/oscim/layers/tile/buildings/BuildingLayer.java index 51ae59bc..7128b62b 100644 --- a/vtm/src/org/oscim/layers/tile/buildings/BuildingLayer.java +++ b/vtm/src/org/oscim/layers/tile/buildings/BuildingLayer.java @@ -123,6 +123,10 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook { return el; } + @Override + public void complete(MapTile tile, boolean success) { + } + // private int multi; // @Override // public void onInputEvent(Event event, MotionEvent e) { diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java index ce9ef8fc..f406cf3c 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java @@ -28,6 +28,8 @@ import org.oscim.theme.IRenderTheme; import org.oscim.theme.styles.RenderStyle; import org.oscim.tiling.TileSource; import org.oscim.tiling.TileSource.OpenResult; +import org.oscim.utils.pool.Inlist.List; +import org.oscim.utils.pool.LList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -125,38 +127,43 @@ public class VectorTileLayer extends TileLayer { return mTheme; } + /** + * Hook to intercept tile data processing. Called concurently by tile + * loader threads, so dont keep tile specific state. + */ public interface TileLoaderProcessHook { public boolean process(MapTile tile, ElementLayers layers, MapElement element); + + /** Called on loader thread when tile loading is completed */ + public void complete(MapTile tile, boolean success); } + /** + * Hook to intercept tile data processing after theme style lookup. Called + * concurently by tile loader threads, so dont keep tile specific state. See + * e.g. LabelTileLoaderHook. + */ public interface TileLoaderThemeHook { + /** Called for each RenderStyle found for a MapElement. */ public boolean render(MapTile tile, ElementLayers layers, MapElement element, RenderStyle style, int level); + + /** Called on loader thread when tile loading is completed */ + public void complete(MapTile tile, boolean success); } - private TileLoaderProcessHook[] mLoaderProcessHooks = new TileLoaderProcessHook[0]; - private TileLoaderThemeHook[] mLoaderThemeHooks = new TileLoaderThemeHook[0]; + private List> mLoaderProcessHooks = + new List>(); - public TileLoaderProcessHook[] loaderProcessHooks() { - return mLoaderProcessHooks; - } - - public TileLoaderThemeHook[] loaderThemeHooks() { - return mLoaderThemeHooks; - } + private List> mLoaderThemeHooks = + new List>(); public void addHook(TileLoaderProcessHook h) { - TileLoaderProcessHook[] tmp = mLoaderProcessHooks; - mLoaderProcessHooks = new TileLoaderProcessHook[tmp.length + 1]; - System.arraycopy(tmp, 0, mLoaderProcessHooks, 0, tmp.length); - mLoaderProcessHooks[tmp.length] = h; + mLoaderProcessHooks.append(new LList(h)); } public void addHook(TileLoaderThemeHook h) { - TileLoaderThemeHook[] tmp = mLoaderThemeHooks; - mLoaderThemeHooks = new TileLoaderThemeHook[tmp.length + 1]; - System.arraycopy(tmp, 0, mLoaderThemeHooks, 0, tmp.length); - mLoaderThemeHooks[tmp.length] = h; + mLoaderThemeHooks.append(new LList(h)); } @Override @@ -164,4 +171,44 @@ public class VectorTileLayer extends TileLayer { super.onDetach(); mTileSource.close(); } + + public void callThemeHooks(MapTile tile, ElementLayers layers, MapElement element, + RenderStyle style, int level) { + + LList th = mLoaderThemeHooks.head(); + while (th != null) { + if (th.data.render(tile, layers, element, style, level)) + return; + + th = th.next; + } + } + + public boolean callProcessHooks(MapTile tile, ElementLayers layers, MapElement element) { + + LList ph = mLoaderProcessHooks.head(); + while (ph != null) { + if (ph.data.process(tile, layers, element)) + return true; + ph = ph.next; + } + + return false; + } + + public void callHooksComplete(MapTile tile, boolean success) { + /* cannot use simple iterater as this function is called concurently */ + + LList th = mLoaderThemeHooks.head(); + while (th != null) { + th.data.complete(tile, success); + th = th.next; + } + + LList ph = mLoaderProcessHooks.head(); + while (ph != null) { + ph.data.complete(tile, success); + ph = ph.next; + } + } } diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java index 893ed3d4..b9f4cdd6 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java @@ -26,8 +26,6 @@ import org.oscim.core.TagSet; import org.oscim.core.Tile; import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.TileLoader; -import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderProcessHook; -import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderThemeHook; import org.oscim.renderer.elements.ElementLayers; import org.oscim.renderer.elements.LineLayer; import org.oscim.renderer.elements.LineTexLayer; @@ -130,6 +128,8 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac @Override public void completed(QueryResult result) { + mTileLayer.callHooksComplete(mTile, result == QueryResult.SUCCESS); + super.completed(result); clearState(); } @@ -173,9 +173,8 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac if (isCanceled() || mTile.state(CANCEL)) return; - for (TileLoaderProcessHook h : mTileLayer.loaderProcessHooks()) - if (h.process(mTile, mLayers, element)) - return; + if (mTileLayer.callProcessHooks(mTile, mLayers, element)) + return; TagSet tags = filterTags(element.tags); if (tags == null) @@ -296,16 +295,12 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac @Override public void renderSymbol(SymbolStyle symbol) { - for (TileLoaderThemeHook h : mTileLayer.loaderThemeHooks()) - if (h.render(mTile, mLayers, mElement, symbol, 0)) - break; + mTileLayer.callThemeHooks(mTile, mLayers, mElement, symbol, 0); } @Override public void renderExtrusion(ExtrusionStyle extrusion, int level) { - for (TileLoaderThemeHook h : mTileLayer.loaderThemeHooks()) - if (h.render(mTile, mLayers, mElement, extrusion, level)) - break; + mTileLayer.callThemeHooks(mTile, mLayers, mElement, extrusion, level); } @Override @@ -314,8 +309,6 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac @Override public void renderText(TextStyle text) { - for (TileLoaderThemeHook h : mTileLayer.loaderThemeHooks()) - if (h.render(mTile, mLayers, mElement, text, 0)) - break; + mTileLayer.callThemeHooks(mTile, mLayers, mElement, text, 0); } } diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java index 6a51a4ad..72322187 100644 --- a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java +++ b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java @@ -103,4 +103,8 @@ public class LabelTileLoaderHook implements TileLoaderThemeHook { return false; } + @Override + public void complete(MapTile tile, boolean success) { + } + }