update and docs for TileLoaderHooks
- add complete() method to TileLoaderHooks - use Inlist instead of array for hooks
This commit is contained in:
parent
978b5ead44
commit
2995de938e
@ -73,6 +73,10 @@ public class Poi3DLayer extends Layer implements Map.UpdateListener {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void complete(MapTile tile, boolean success) {
|
||||
}
|
||||
});
|
||||
mTileLayer = tileLayer;
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -103,4 +103,8 @@ public class LabelTileLoaderHook implements TileLoaderThemeHook {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void complete(MapTile tile, boolean success) {
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user