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; return true;
} }
@Override
public void complete(MapTile tile, boolean success) {
}
}); });
mTileLayer = tileLayer; mTileLayer = tileLayer;

View File

@ -123,6 +123,10 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook {
return el; return el;
} }
@Override
public void complete(MapTile tile, boolean success) {
}
// private int multi; // private int multi;
// @Override // @Override
// public void onInputEvent(Event event, MotionEvent e) { // 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.theme.styles.RenderStyle;
import org.oscim.tiling.TileSource; import org.oscim.tiling.TileSource;
import org.oscim.tiling.TileSource.OpenResult; 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.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -125,38 +127,43 @@ public class VectorTileLayer extends TileLayer {
return mTheme; return mTheme;
} }
/**
* Hook to intercept tile data processing. Called concurently by tile
* loader threads, so dont keep tile specific state.
*/
public interface TileLoaderProcessHook { public interface TileLoaderProcessHook {
public boolean process(MapTile tile, ElementLayers layers, MapElement element); 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 { public interface TileLoaderThemeHook {
/** Called for each RenderStyle found for a MapElement. */
public boolean render(MapTile tile, ElementLayers layers, public boolean render(MapTile tile, ElementLayers layers,
MapElement element, RenderStyle style, int level); 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 List<LList<TileLoaderProcessHook>> mLoaderProcessHooks =
private TileLoaderThemeHook[] mLoaderThemeHooks = new TileLoaderThemeHook[0]; new List<LList<TileLoaderProcessHook>>();
public TileLoaderProcessHook[] loaderProcessHooks() { private List<LList<TileLoaderThemeHook>> mLoaderThemeHooks =
return mLoaderProcessHooks; new List<LList<TileLoaderThemeHook>>();
}
public TileLoaderThemeHook[] loaderThemeHooks() {
return mLoaderThemeHooks;
}
public void addHook(TileLoaderProcessHook h) { public void addHook(TileLoaderProcessHook h) {
TileLoaderProcessHook[] tmp = mLoaderProcessHooks; mLoaderProcessHooks.append(new LList<TileLoaderProcessHook>(h));
mLoaderProcessHooks = new TileLoaderProcessHook[tmp.length + 1];
System.arraycopy(tmp, 0, mLoaderProcessHooks, 0, tmp.length);
mLoaderProcessHooks[tmp.length] = h;
} }
public void addHook(TileLoaderThemeHook h) { public void addHook(TileLoaderThemeHook h) {
TileLoaderThemeHook[] tmp = mLoaderThemeHooks; mLoaderThemeHooks.append(new LList<TileLoaderThemeHook>(h));
mLoaderThemeHooks = new TileLoaderThemeHook[tmp.length + 1];
System.arraycopy(tmp, 0, mLoaderThemeHooks, 0, tmp.length);
mLoaderThemeHooks[tmp.length] = h;
} }
@Override @Override
@ -164,4 +171,44 @@ public class VectorTileLayer extends TileLayer {
super.onDetach(); super.onDetach();
mTileSource.close(); 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.core.Tile;
import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.MapTile;
import org.oscim.layers.tile.TileLoader; 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.ElementLayers;
import org.oscim.renderer.elements.LineLayer; import org.oscim.renderer.elements.LineLayer;
import org.oscim.renderer.elements.LineTexLayer; import org.oscim.renderer.elements.LineTexLayer;
@ -130,6 +128,8 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
@Override @Override
public void completed(QueryResult result) { public void completed(QueryResult result) {
mTileLayer.callHooksComplete(mTile, result == QueryResult.SUCCESS);
super.completed(result); super.completed(result);
clearState(); clearState();
} }
@ -173,8 +173,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
if (isCanceled() || mTile.state(CANCEL)) if (isCanceled() || mTile.state(CANCEL))
return; return;
for (TileLoaderProcessHook h : mTileLayer.loaderProcessHooks()) if (mTileLayer.callProcessHooks(mTile, mLayers, element))
if (h.process(mTile, mLayers, element))
return; return;
TagSet tags = filterTags(element.tags); TagSet tags = filterTags(element.tags);
@ -296,16 +295,12 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
@Override @Override
public void renderSymbol(SymbolStyle symbol) { public void renderSymbol(SymbolStyle symbol) {
for (TileLoaderThemeHook h : mTileLayer.loaderThemeHooks()) mTileLayer.callThemeHooks(mTile, mLayers, mElement, symbol, 0);
if (h.render(mTile, mLayers, mElement, symbol, 0))
break;
} }
@Override @Override
public void renderExtrusion(ExtrusionStyle extrusion, int level) { public void renderExtrusion(ExtrusionStyle extrusion, int level) {
for (TileLoaderThemeHook h : mTileLayer.loaderThemeHooks()) mTileLayer.callThemeHooks(mTile, mLayers, mElement, extrusion, level);
if (h.render(mTile, mLayers, mElement, extrusion, level))
break;
} }
@Override @Override
@ -314,8 +309,6 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
@Override @Override
public void renderText(TextStyle text) { public void renderText(TextStyle text) {
for (TileLoaderThemeHook h : mTileLayer.loaderThemeHooks()) mTileLayer.callThemeHooks(mTile, mLayers, mElement, text, 0);
if (h.render(mTile, mLayers, mElement, text, 0))
break;
} }
} }

View File

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