From 923019a34af52dbe652c5842d397471d41c2b945 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Wed, 24 Apr 2013 15:15:33 +0200 Subject: [PATCH] improve GeometryBuffer API --- src/org/oscim/core/GeometryBuffer.java | 64 +++++++++++++------ src/org/oscim/core/MapElement.java | 11 +--- .../oscim/database/mapfile/MapDatabase.java | 9 +-- .../oscim/database/oscimap/MapDatabase.java | 8 +-- src/org/oscim/database/pbmap/MapDatabase.java | 8 ++- src/org/oscim/database/test/MapDatabase.java | 14 ++-- src/org/oscim/layers/tile/MapTileLoader.java | 14 ++-- src/org/oscim/renderer/layer/LineLayer.java | 4 +- src/org/oscim/theme/RenderTheme.java | 12 ++-- 9 files changed, 80 insertions(+), 64 deletions(-) diff --git a/src/org/oscim/core/GeometryBuffer.java b/src/org/oscim/core/GeometryBuffer.java index 4f780f8a..9a718142 100644 --- a/src/org/oscim/core/GeometryBuffer.java +++ b/src/org/oscim/core/GeometryBuffer.java @@ -1,6 +1,20 @@ package org.oscim.core; public class GeometryBuffer { + public enum GeometryType { + + NONE(0), + POINT(1), + LINE(2), + POLY(3); + + private GeometryType(int type) { + nativeInt = type; + } + + public final int nativeInt; + + } // TODO // -- check indexPos < Short.Max @@ -11,7 +25,9 @@ public class GeometryBuffer { public int indexPos; public int pointPos; - public int mode; + //public int type; + // GEOM_* + public GeometryType type; public GeometryBuffer(float[] points, short[] index) { if (points == null) @@ -21,14 +37,17 @@ public class GeometryBuffer { this.points = points; this.index = index; - mode = 0; - indexPos = 0; - pointPos = 0; + this.type = GeometryType.NONE; + this.indexPos = 0; + this.pointPos = 0; } public GeometryBuffer(int numPoints, int numIndices) { this.points = new float[numPoints * 2]; this.index = new short[numIndices]; + this.type = GeometryType.NONE; + this.indexPos = 0; + this.pointPos = 0; } // ---- API ---- @@ -36,7 +55,7 @@ public class GeometryBuffer { index[0] = -1; indexPos = 0; pointPos = 0; - mode = 0; + type = GeometryType.NONE; } public void addPoint(float x, float y) { @@ -48,6 +67,15 @@ public class GeometryBuffer { index[indexPos] += 2; } + public boolean isPoly(){ + return type == GeometryType.POLY; + } + public boolean isLine(){ + return type == GeometryType.LINE; + } + public boolean isPoint(){ + return type == GeometryType.POINT; + } public void setPoint(int pos, float x, float y) { points[(pos << 1) + 0] = x; @@ -56,12 +84,12 @@ public class GeometryBuffer { public void startPoints() { if (CHECK_STATE) - setOrCheckMode(1); + setOrCheckMode(GeometryType.POINT); } public void startLine() { if (CHECK_STATE) - setOrCheckMode(2); + setOrCheckMode(GeometryType.LINE); // start next if ((index[0] >= 0) && (++indexPos >= index.length)) @@ -75,7 +103,7 @@ public class GeometryBuffer { public void startPolygon() { if (CHECK_STATE) - setOrCheckMode(3); + setOrCheckMode(GeometryType.POLY); if ((indexPos + 4) >= index.length) ensureIndexSize(indexPos + 4, true); @@ -100,7 +128,7 @@ public class GeometryBuffer { public void startHole() { if (CHECK_STATE) - checkMode(3); + checkMode(GeometryType.POLY); if ((indexPos + 3) >= index.length) ensureIndexSize(indexPos, true); @@ -115,8 +143,6 @@ public class GeometryBuffer { index[indexPos + 1] = -1; } - - // ---- internals ---- public float[] ensurePointSize(int size, boolean copy) { if (size * 2 < points.length) @@ -143,19 +169,19 @@ public class GeometryBuffer { return index; } - private void setOrCheckMode(int m) { - if (mode == m) + private void setOrCheckMode(GeometryType m) { + if (type == m) return; - if (mode != 0) - throw new IllegalArgumentException("GeometryBuffer not cleared " + m + "<>" + mode); + if (type != GeometryType.NONE) + throw new IllegalArgumentException("GeometryBuffer not cleared " + m + "<>" + type); - mode = m; + type = m; } - private void checkMode(int m) { - if (mode != m) - throw new IllegalArgumentException("GeometryBuffer not cleared " + m + "<>" + mode); + private void checkMode(GeometryType m) { + if (type != m) + throw new IllegalArgumentException("GeometryBuffer not cleared " + m + "<>" + type); } } diff --git a/src/org/oscim/core/MapElement.java b/src/org/oscim/core/MapElement.java index 56494ec9..714a6cef 100644 --- a/src/org/oscim/core/MapElement.java +++ b/src/org/oscim/core/MapElement.java @@ -23,17 +23,13 @@ package org.oscim.core; * dont keep a reference to it when passed as parameter. */ public class MapElement extends GeometryBuffer { - public static final int GEOM_NONE = 0; - public static final int GEOM_POINT = 1; - public static final int GEOM_LINE = 2; - public static final int GEOM_POLY = 3; + // osm layer of the way. public int layer; // osm tags of the way. public Tag[] tags; - // GEOM_* - public int geometryType; + // ---- random stuff, to be removed ---- // building tags @@ -50,9 +46,8 @@ public class MapElement extends GeometryBuffer { super(points, indices); } - public void set(Tag[] tags, int layer, int type) { + public void set(Tag[] tags, int layer) { this.layer = layer; this.tags = tags; - this.geometryType = type; } } diff --git a/src/org/oscim/database/mapfile/MapDatabase.java b/src/org/oscim/database/mapfile/MapDatabase.java index 78b071c3..d0b4c8ff 100644 --- a/src/org/oscim/database/mapfile/MapDatabase.java +++ b/src/org/oscim/database/mapfile/MapDatabase.java @@ -18,6 +18,7 @@ import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; +import org.oscim.core.GeometryBuffer.GeometryType; import org.oscim.core.MapElement; import org.oscim.core.Tag; import org.oscim.core.Tile; @@ -670,8 +671,8 @@ public class MapDatabase implements IMapDatabase { mElem.startPoints(); mElem.addPoint(longitude, latitude); - - mElem.set(curTags, layer, MapElement.GEOM_POINT); + mElem.type = GeometryType.POINT; + mElem.set(curTags, layer); mapDatabaseCallback.renderElement(mElem); // mGeom.points[0] = longitude; @@ -988,8 +989,8 @@ public class MapDatabase implements IMapDatabase { projectToTile(mElem.points, mElem.index); mElem.layer = layer; - mElem.geometryType = closed ? MapElement.GEOM_POLY : MapElement.GEOM_LINE; - mElem.tags = curTags; + mElem.type = closed ? GeometryType.POLY : GeometryType.LINE; + mElem.set(tags, layer); mapDatabaseCallback.renderElement(mElem); } diff --git a/src/org/oscim/database/oscimap/MapDatabase.java b/src/org/oscim/database/oscimap/MapDatabase.java index 70c205b0..1082a60e 100644 --- a/src/org/oscim/database/oscimap/MapDatabase.java +++ b/src/org/oscim/database/oscimap/MapDatabase.java @@ -23,6 +23,7 @@ import java.util.Arrays; import org.oscim.core.BoundingBox; import org.oscim.core.GeoPoint; +import org.oscim.core.GeometryBuffer.GeometryType; import org.oscim.core.MapElement; import org.oscim.core.Tag; import org.oscim.core.Tile; @@ -418,16 +419,15 @@ public class MapDatabase implements IMapDatabase { } mElem.tags = tags; - switch (type) { case TAG_TILE_LINE: - mElem.geometryType= MapElement.GEOM_LINE; + mElem.type= GeometryType.LINE; break; case TAG_TILE_POLY: - mElem.geometryType= MapElement.GEOM_POLY; + mElem.type= GeometryType.POLY; break; case TAG_TILE_POINT: - mElem.geometryType= MapElement.GEOM_POINT; + mElem.type= GeometryType.POINT; break; } diff --git a/src/org/oscim/database/pbmap/MapDatabase.java b/src/org/oscim/database/pbmap/MapDatabase.java index cbd42101..497a0c88 100644 --- a/src/org/oscim/database/pbmap/MapDatabase.java +++ b/src/org/oscim/database/pbmap/MapDatabase.java @@ -36,6 +36,7 @@ import java.util.Map; import org.oscim.core.BoundingBox; import org.oscim.core.GeoPoint; +import org.oscim.core.GeometryBuffer.GeometryType; import org.oscim.core.MapElement; import org.oscim.core.Tag; import org.oscim.core.Tile; @@ -448,8 +449,8 @@ public class MapDatabase implements IMapDatabase { // FIXME, remove all tiles from cache then remove this below //if (layer == 0) // layer = 5; - - mElement.set(tags, layer, polygon ? MapElement.GEOM_POLY : MapElement.GEOM_LINE); + mElement.type = polygon ? GeometryType.POLY : GeometryType.LINE; + mElement.set(tags, layer); mMapGenerator.renderElement(mElement); return true; } @@ -528,7 +529,8 @@ public class MapDatabase implements IMapDatabase { mElement.index[0] = (short)numNodes; - mElement.set(tags, layer, MapElement.GEOM_POINT); + mElement.type = GeometryType.POINT; + mElement.set(tags, layer); mMapGenerator.renderElement(mElement); return cnt; diff --git a/src/org/oscim/database/test/MapDatabase.java b/src/org/oscim/database/test/MapDatabase.java index 1888c774..c538786b 100644 --- a/src/org/oscim/database/test/MapDatabase.java +++ b/src/org/oscim/database/test/MapDatabase.java @@ -14,10 +14,6 @@ */ package org.oscim.database.test; -import static org.oscim.core.MapElement.GEOM_LINE; -import static org.oscim.core.MapElement.GEOM_POINT; -import static org.oscim.core.MapElement.GEOM_POLY; - import org.oscim.core.BoundingBox; import org.oscim.core.MapElement; import org.oscim.core.Tag; @@ -99,7 +95,7 @@ public class MapDatabase implements IMapDatabase { e.addPoint(x2, y2); e.addPoint(x1, y2); - e.set(mTags, 0, GEOM_POLY); + e.set(mTags, 0); mapDatabaseCallback.renderElement(e); if (renderWays) { @@ -120,7 +116,7 @@ public class MapDatabase implements IMapDatabase { e.addPoint(size / 2, size / 2); e.addPoint(size / 2, size / 2 + size); - e.set(mTagsWay, 0, GEOM_LINE); + e.set(mTagsWay, 0); mapDatabaseCallback.renderElement(e); e.clear(); @@ -137,7 +133,7 @@ public class MapDatabase implements IMapDatabase { e.addPoint(10, 0); e.addPoint(10, size); - e.set(mTagsWay, 1, GEOM_LINE); + e.set(mTagsWay, 1); mapDatabaseCallback.renderElement(e); } @@ -152,7 +148,7 @@ public class MapDatabase implements IMapDatabase { r + (float) Math.sin(d) * (r - 40)); } - e.set(mTagsBoundary, 1, GEOM_LINE); + e.set(mTagsBoundary, 1); mapDatabaseCallback.renderElement(e); } @@ -162,7 +158,7 @@ public class MapDatabase implements IMapDatabase { e.addPoint(size / 2, size / 2); mTagsPlace[1] = new Tag("name", tile.toString()); - e.set(mTagsPlace, 0, GEOM_POINT); + e.set(mTagsPlace, 0); mapDatabaseCallback.renderElement(e); } return QueryResult.SUCCESS; diff --git a/src/org/oscim/layers/tile/MapTileLoader.java b/src/org/oscim/layers/tile/MapTileLoader.java index 3846f297..722a3c27 100644 --- a/src/org/oscim/layers/tile/MapTileLoader.java +++ b/src/org/oscim/layers/tile/MapTileLoader.java @@ -14,13 +14,11 @@ */ package org.oscim.layers.tile; -import static org.oscim.core.MapElement.GEOM_LINE; -import static org.oscim.core.MapElement.GEOM_POINT; -import static org.oscim.core.MapElement.GEOM_POLY; import static org.oscim.layers.tile.MapTile.STATE_NONE; import java.util.Arrays; +import org.oscim.core.GeometryBuffer.GeometryType; import org.oscim.core.MapElement; import org.oscim.core.MercatorProjection; import org.oscim.core.Tag; @@ -131,12 +129,12 @@ public class MapTileLoader extends TileLoader implements IRenderCallback, IMapDa m.addPoint(s, 0); m.addPoint(0, 0); m.tags = new Tag[] { new Tag("debug", "box") }; - m.geometryType = GEOM_LINE; + m.type = GeometryType.LINE; m = mDebugPoint = new MapElement(); m.startPoints(); m.addPoint(s >> 1, 10); - m.geometryType = GEOM_POINT; + m.type = GeometryType.POINT; } /* (non-Javadoc) @@ -287,7 +285,7 @@ public class MapTileLoader extends TileLoader implements IRenderCallback, IMapDa mElement = element; - if (element.geometryType == GEOM_POINT) { + if (element.type == GeometryType.POINT) { // remove tags that should not be cached in Rendertheme filterTags(element.tags); @@ -304,7 +302,7 @@ public class MapTileLoader extends TileLoader implements IRenderCallback, IMapDa if (!filterTags(element.tags)) return; - boolean closed = element.geometryType == GEOM_POLY; + boolean closed = element.type == GeometryType.POLY; mDrawingLayer = getValidLayer(element.layer) * renderLevels; @@ -398,7 +396,7 @@ public class MapTileLoader extends TileLoader implements IRenderCallback, IMapDa } lineLayer.addLine(mElement.points, mElement.index, - mElement.geometryType == GEOM_POLY); + mElement.type == GeometryType.POLY); // keep reference for outline layer mCurLineLayer = lineLayer; diff --git a/src/org/oscim/renderer/layer/LineLayer.java b/src/org/oscim/renderer/layer/LineLayer.java index 844ffa11..771ab0e2 100644 --- a/src/org/oscim/renderer/layer/LineLayer.java +++ b/src/org/oscim/renderer/layer/LineLayer.java @@ -74,9 +74,9 @@ public final class LineLayer extends Layer { } public void addLine(GeometryBuffer geom) { - if (geom.mode == 3) + if (geom.isPoly()) addLine(geom.points, geom.index, -1, true); - else if (geom.mode == 2) + else if (geom.isLine()) addLine(geom.points, geom.index, -1, false); } diff --git a/src/org/oscim/theme/RenderTheme.java b/src/org/oscim/theme/RenderTheme.java index 18c14047..28cb9eff 100644 --- a/src/org/oscim/theme/RenderTheme.java +++ b/src/org/oscim/theme/RenderTheme.java @@ -14,12 +14,10 @@ */ package org.oscim.theme; -import static org.oscim.core.MapElement.GEOM_LINE; -import static org.oscim.core.MapElement.GEOM_POLY; - import java.util.ArrayList; import java.util.List; +import org.oscim.core.GeometryBuffer.GeometryType; import org.oscim.core.MapElement; import org.oscim.theme.renderinstruction.RenderInstruction; import org.oscim.theme.rule.Closed; @@ -175,9 +173,9 @@ public class RenderTheme implements IRenderTheme { // the item matching tags and zoomlevel RenderInstructionItem ri = null; - int type = element.geometryType; + int type = element.type.nativeInt; if (type < 1 || type > 3) { - Log.d(TAG, "invalid geometry type for RenderTheme " + type); + Log.d(TAG, "invalid geometry type for RenderTheme " + element.type.name()); return null; } @@ -215,11 +213,11 @@ public class RenderTheme implements IRenderTheme { List matches = cache.instructionList; matches.clear(); - if (type == GEOM_LINE) { + if (element.type == GeometryType.LINE) { for (int i = 0, n = mRules.length; i < n; i++) mRules[i].matchWay(element.tags, (byte) zoomLevel, Closed.NO, matches); - } else if (type == GEOM_POLY) { + } else if (element.type == GeometryType.POLY) { for (int i = 0, n = mRules.length; i < n; i++) mRules[i].matchWay(element.tags, (byte) zoomLevel, Closed.YES, matches);