update and docs for TileLoaderHooks

- add complete() method to TileLoaderHooks
- use Inlist instead of array for hooks
This commit is contained in:
Hannes Janetzek 2014-06-16 23:25:59 +02:00
parent 978b5ead44
commit 2995de938e
5 changed files with 83 additions and 31 deletions

View File

@ -73,6 +73,10 @@ public class Poi3DLayer extends Layer implements Map.UpdateListener {
return true;
}
@Override
public void complete(MapTile tile, boolean success) {
}
});
mTileLayer = tileLayer;

View File

@ -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) {

View File

@ -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<LList<TileLoaderProcessHook>> mLoaderProcessHooks =
new List<LList<TileLoaderProcessHook>>();
public TileLoaderProcessHook[] loaderProcessHooks() {
return mLoaderProcessHooks;
}
public TileLoaderThemeHook[] loaderThemeHooks() {
return mLoaderThemeHooks;
}
private List<LList<TileLoaderThemeHook>> mLoaderThemeHooks =
new List<LList<TileLoaderThemeHook>>();
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<TileLoaderProcessHook>(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<TileLoaderThemeHook>(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<TileLoaderThemeHook> 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<TileLoaderProcessHook> 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<TileLoaderThemeHook> th = mLoaderThemeHooks.head();
while (th != null) {
th.data.complete(tile, success);
th = th.next;
}
LList<TileLoaderProcessHook> ph = mLoaderProcessHooks.head();
while (ph != null) {
ph.data.complete(tile, success);
ph = ph.next;
}
}
}

View File

@ -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);
}
}

View File

@ -103,4 +103,8 @@ public class LabelTileLoaderHook implements TileLoaderThemeHook {
return false;
}
@Override
public void complete(MapTile tile, boolean success) {
}
}