move Label/Symbol data from MapTile to LabelTileData

This commit is contained in:
Hannes Janetzek 2014-03-09 21:14:41 +01:00
parent 20d5c20e72
commit c234507edb
6 changed files with 67 additions and 29 deletions

View File

@ -105,14 +105,6 @@ public class MapTile extends Tile {
*/
public float distance;
/**
* FIXME move to VectorMapTile
* Tile data set by TileLoader.
*/
public final List<SymbolItem> symbols = new List<SymbolItem>();
public final List<TextItem> labels = new List<TextItem>();
/**
* Tile is in view region. Set by TileRenderer.
*/
@ -242,9 +234,6 @@ public class MapTile extends Tile {
data = data.next;
}
TextItem.pool.releaseAll(labels.clear());
SymbolItem.pool.releaseAll(symbols.clear());
// still needed?
state = State.NONE;
}

View File

@ -31,6 +31,8 @@ public class LabelLayer extends Layer implements Map.UpdateListener, TileManager
static final Logger log = LoggerFactory.getLogger(LabelLayer.class);
public final static String LABEL_DATA = LabelLayer.class.getName();
private final static long MAX_RELABEL_DELAY = 100;
private final LabelPlacement mLabelPlacer;

View File

@ -18,6 +18,10 @@ import org.oscim.utils.geom.OBB2D;
public class LabelPlacement {
static final boolean dbg = false;
public final static LabelTileData getLabels(MapTile tile) {
return (LabelTileData) tile.getData(LabelLayer.LABEL_DATA);
}
private final static float MIN_CAPTION_DIST = 5;
private final static float MIN_WAY_DIST = 3;
@ -176,7 +180,11 @@ public class LabelPlacement {
private Label addWayLabels(MapTile t, Label l, float dx, float dy,
double scale) {
for (TextItem ti : t.labels) {
LabelTileData ld = getLabels(t);
if (ld == null)
return l;
for (TextItem ti : ld.labels) {
if (ti.text.caption)
continue;
@ -229,7 +237,11 @@ public class LabelPlacement {
private Label addNodeLabels(MapTile t, Label l, float dx, float dy,
double scale, float cos, float sin) {
O: for (TextItem ti : t.labels) {
LabelTileData ld = getLabels(t);
if (ld == null)
return l;
O: for (TextItem ti : ld.labels) {
if (!ti.text.caption)
continue;
@ -447,7 +459,11 @@ public class LabelPlacement {
float dy = (float) (t.tileY * Tile.SIZE - tileY);
dx = flipLongitude(dx, maxx);
for (SymbolItem ti : t.symbols) {
LabelTileData ld = getLabels(t);
if (ld == null)
continue;
for (SymbolItem ti : ld.symbols) {
if (ti.texRegion == null)
continue;

View File

@ -0,0 +1,16 @@
package org.oscim.layers.tile.vector.labeling;
import org.oscim.layers.tile.MapTile.TileData;
import org.oscim.renderer.elements.SymbolItem;
import org.oscim.renderer.elements.TextItem;
public class LabelTileData extends TileData {
public final List<SymbolItem> symbols = new List<SymbolItem>();
public final List<TextItem> labels = new List<TextItem>();
@Override
protected void dispose() {
TextItem.pool.releaseAll(labels.clear());
SymbolItem.pool.releaseAll(symbols.clear());
}
}

View File

@ -3,27 +3,41 @@ package org.oscim.layers.tile.vector.labeling;
import static org.oscim.core.GeometryBuffer.GeometryType.LINE;
import static org.oscim.core.GeometryBuffer.GeometryType.POINT;
import static org.oscim.core.GeometryBuffer.GeometryType.POLY;
import static org.oscim.layers.tile.vector.labeling.LabelLayer.LABEL_DATA;
import org.oscim.core.MapElement;
import org.oscim.core.PointF;
import org.oscim.layers.tile.MapTile;
import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderHook;
import org.oscim.layers.tile.vector.WayDecorator;
import org.oscim.renderer.elements.ElementLayers;
import org.oscim.renderer.elements.SymbolItem;
import org.oscim.renderer.elements.TextItem;
import org.oscim.theme.styles.RenderStyle;
import org.oscim.theme.styles.Symbol;
import org.oscim.theme.styles.Text;
import org.oscim.theme.styles.SymbolStyle;
import org.oscim.theme.styles.TextStyle;
public class LabelTileLoaderHook implements TileLoaderHook {
//public final static LabelTileData EMPTY = new LabelTileData();
private LabelTileData get(MapTile tile) {
// FIXME could be 'this'..
LabelTileData ld = (LabelTileData) tile.getData(LABEL_DATA);
if (ld == null) {
ld = new LabelTileData();
tile.addData(LABEL_DATA, ld);
}
return ld;
}
@Override
public void render(MapTile tile, ElementLayers layers, MapElement element,
RenderStyle style, int level) {
if (style instanceof Text) {
Text text = (Text) style;
if (style instanceof TextStyle) {
LabelTileData ld = get(tile);
TextStyle text = (TextStyle) style;
if (element.type == LINE) {
String value = element.tags.getValue(text.textKey);
if (value == null || value.length() == 0)
@ -36,7 +50,7 @@ public class LabelTileLoaderHook implements TileLoaderHook {
break;
WayDecorator.renderText(null, element.points, value, text,
offset, length, tile);
offset, length, ld);
offset += length;
}
}
@ -57,7 +71,7 @@ public class LabelTileLoaderHook implements TileLoaderHook {
x /= (n / 2);
y /= (n / 2);
tile.labels.push(TextItem.pool.get().set(x, y, value, text));
ld.labels.push(TextItem.pool.get().set(x, y, value, text));
}
else if (element.type == POINT) {
String value = element.tags.getValue(text.textKey);
@ -66,22 +80,24 @@ public class LabelTileLoaderHook implements TileLoaderHook {
for (int i = 0, n = element.getNumPoints(); i < n; i++) {
PointF p = element.getPoint(i);
tile.labels.push(TextItem.pool.get().set(p.x, p.y, value, text));
ld.labels.push(TextItem.pool.get().set(p.x, p.y, value, text));
}
}
}
else if ((element.type == POINT) && (style instanceof Symbol)) {
Symbol symbol = (Symbol) style;
else if ((element.type == POINT) && (style instanceof SymbolStyle)) {
SymbolStyle symbol = (SymbolStyle) style;
if (symbol.texture == null)
return;
LabelTileData ld = get(tile);
for (int i = 0, n = element.getNumPoints(); i < n; i++) {
PointF p = element.getPoint(i);
SymbolItem it = SymbolItem.pool.get();
it.set(p.x, p.y, symbol.texture, true);
tile.symbols.push(it);
ld.symbols.push(it);
}
}
}

View File

@ -15,10 +15,9 @@
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.layers.tile.vector;
package org.oscim.layers.tile.vector.labeling;
import org.oscim.core.Tile;
import org.oscim.layers.tile.MapTile;
import org.oscim.renderer.elements.TextItem;
import org.oscim.theme.styles.TextStyle;
import org.oscim.utils.geom.GeometryUtils;
@ -27,7 +26,7 @@ import org.oscim.utils.geom.LineClipper;
public final class WayDecorator {
public static void renderText(LineClipper clipper, float[] coordinates, String string,
TextStyle text, int pos, int len, MapTile tile) {
TextStyle text, int pos, int len, LabelTileData ld) {
//TextItem items = textItems;
TextItem t = null;
@ -216,7 +215,7 @@ public final class WayDecorator {
t.length = (short) segmentLength;
t.edges = edge;
tile.labels.push(t);
ld.labels.push(t);
i = last;
}