add TileLoaderProcessHook to intercept MapElement processing

This commit is contained in:
Hannes Janetzek 2014-03-10 04:42:26 +01:00
parent 402e4c3cd6
commit 8f94fa7ac5
4 changed files with 39 additions and 22 deletions

View File

@ -21,7 +21,7 @@ import org.oscim.core.MercatorProjection;
import org.oscim.core.Tag; import org.oscim.core.Tag;
import org.oscim.layers.Layer; import org.oscim.layers.Layer;
import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.MapTile;
import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderHook; import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderThemeHook;
import org.oscim.map.Map; import org.oscim.map.Map;
import org.oscim.renderer.ExtrusionRenderer; import org.oscim.renderer.ExtrusionRenderer;
import org.oscim.renderer.GLViewport; import org.oscim.renderer.GLViewport;
@ -31,7 +31,7 @@ import org.oscim.theme.styles.ExtrusionStyle;
import org.oscim.theme.styles.RenderStyle; import org.oscim.theme.styles.RenderStyle;
import org.oscim.utils.FastMath; import org.oscim.utils.FastMath;
public class BuildingLayer extends Layer implements TileLoaderHook { public class BuildingLayer extends Layer implements TileLoaderThemeHook {
//static final Logger log = LoggerFactory.getLogger(BuildingOverlay.class); //static final Logger log = LoggerFactory.getLogger(BuildingOverlay.class);
final ExtrusionRenderer mExtLayer; final ExtrusionRenderer mExtLayer;

View File

@ -123,23 +123,37 @@ public class VectorTileLayer extends TileLayer {
return mTheme; return mTheme;
} }
public interface TileLoaderHook { public interface TileLoaderProcessHook {
public boolean process(MapTile tile, ElementLayers layers, MapElement element);
}
public interface TileLoaderThemeHook {
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);
} }
private TileLoaderHook[] mLoaderHooks = new TileLoaderHook[0]; private TileLoaderProcessHook[] mLoaderProcessHooks = new TileLoaderProcessHook[0];
private TileLoaderThemeHook[] mLoaderThemeHooks = new TileLoaderThemeHook[0];
public TileLoaderHook[] getLoaderHooks() { public TileLoaderProcessHook[] loaderProcessHooks() {
return mLoaderHooks; return mLoaderProcessHooks;
} }
public void addHook(TileLoaderHook h) { public TileLoaderThemeHook[] loaderThemeHooks() {
int length = mLoaderHooks.length; return mLoaderThemeHooks;
TileLoaderHook[] tmp = new TileLoaderHook[length + 1];
System.arraycopy(mLoaderHooks, 0, tmp, 0, length);
tmp[length] = h;
mLoaderHooks = tmp;
} }
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;
}
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;
}
} }

View File

@ -27,7 +27,8 @@ import org.oscim.core.Tag;
import org.oscim.core.TagSet; import org.oscim.core.TagSet;
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.TileLoaderHook; 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;
@ -166,10 +167,6 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
* E.g. to replace tags that should not be cached in Rendertheme * E.g. to replace tags that should not be cached in Rendertheme
*/ */
protected TagSet filterTags(TagSet tagSet) { protected TagSet filterTags(TagSet tagSet) {
// if (filterHooks != null){
// tagSet =
// }
return tagSet; return tagSet;
} }
@ -179,6 +176,10 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
if (isCanceled() || mTile.state(CANCEL)) if (isCanceled() || mTile.state(CANCEL))
throw new CancellationException(); throw new CancellationException();
for (TileLoaderProcessHook h : mTileLayer.loaderProcessHooks())
if (h.process(mTile, mLayers, element))
return;
TagSet tags = filterTags(element.tags); TagSet tags = filterTags(element.tags);
if (tags == null) if (tags == null)
return; return;
@ -292,14 +293,16 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
} }
} }
@Override
public void renderSymbol(SymbolStyle symbol) { public void renderSymbol(SymbolStyle symbol) {
for (TileLoaderHook h : mTileLayer.getLoaderHooks()) for (TileLoaderThemeHook h : mTileLayer.loaderThemeHooks())
if (h.render(mTile, mLayers, mElement, symbol, 0)) if (h.render(mTile, mLayers, mElement, symbol, 0))
break; break;
} }
@Override
public void renderExtrusion(ExtrusionStyle extrusion, int level) { public void renderExtrusion(ExtrusionStyle extrusion, int level) {
for (TileLoaderHook h : mTileLayer.getLoaderHooks()) for (TileLoaderThemeHook h : mTileLayer.loaderThemeHooks())
if (h.render(mTile, mLayers, mElement, extrusion, level)) if (h.render(mTile, mLayers, mElement, extrusion, level))
break; break;
} }
@ -310,7 +313,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
@Override @Override
public void renderText(TextStyle text) { public void renderText(TextStyle text) {
for (TileLoaderHook h : mTileLayer.getLoaderHooks()) for (TileLoaderThemeHook h : mTileLayer.loaderThemeHooks())
if (h.render(mTile, mLayers, mElement, text, 0)) if (h.render(mTile, mLayers, mElement, text, 0))
break; break;
} }

View File

@ -8,7 +8,7 @@ import static org.oscim.layers.tile.vector.labeling.LabelLayer.LABEL_DATA;
import org.oscim.core.MapElement; import org.oscim.core.MapElement;
import org.oscim.core.PointF; import org.oscim.core.PointF;
import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.MapTile;
import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderHook; 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.SymbolItem; import org.oscim.renderer.elements.SymbolItem;
import org.oscim.renderer.elements.TextItem; import org.oscim.renderer.elements.TextItem;
@ -16,7 +16,7 @@ import org.oscim.theme.styles.RenderStyle;
import org.oscim.theme.styles.SymbolStyle; import org.oscim.theme.styles.SymbolStyle;
import org.oscim.theme.styles.TextStyle; import org.oscim.theme.styles.TextStyle;
public class LabelTileLoaderHook implements TileLoaderHook { public class LabelTileLoaderHook implements TileLoaderThemeHook {
//public final static LabelTileData EMPTY = new LabelTileData(); //public final static LabelTileData EMPTY = new LabelTileData();