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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void complete(MapTile tile, boolean success) {
|
||||||
|
}
|
||||||
});
|
});
|
||||||
mTileLayer = tileLayer;
|
mTileLayer = tileLayer;
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,9 +173,8 @@ 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);
|
||||||
if (tags == null)
|
if (tags == null)
|
||||||
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -103,4 +103,8 @@ public class LabelTileLoaderHook implements TileLoaderThemeHook {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void complete(MapTile tile, boolean success) {
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user