diff --git a/src/org/oscim/renderer/layer/Layer.java b/src/org/oscim/renderer/layer/Layer.java index adff2d23..d17b8843 100644 --- a/src/org/oscim/renderer/layer/Layer.java +++ b/src/org/oscim/renderer/layer/Layer.java @@ -16,10 +16,11 @@ package org.oscim.renderer.layer; import java.nio.ShortBuffer; +import org.oscim.utils.pool.Inlist; /** * @authorHannes Janetzek */ -public abstract class Layer { +public abstract class Layer extends Inlist{ public final static byte LINE = 0; public final static byte POLYGON = 1; public final static byte TEXLINE = 2; @@ -31,8 +32,6 @@ public abstract class Layer { public byte type = -1; - public Layer next; - // drawing order from bottom to top int level; diff --git a/src/org/oscim/renderer/layer/TextItem.java b/src/org/oscim/renderer/layer/TextItem.java index fcaad86b..7cf74566 100644 --- a/src/org/oscim/renderer/layer/TextItem.java +++ b/src/org/oscim/renderer/layer/TextItem.java @@ -43,8 +43,6 @@ public class TextItem extends Inlist { TextItem ti = pool.get(); - ti.next = null; - ti.x = orig.x; ti.y = orig.y; @@ -56,6 +54,22 @@ public class TextItem extends Inlist { return ti; } + public static boolean shareText(TextItem ti1, TextItem ti2){ + if (ti1.text != ti2.text) + return false; + + if (ti1.string == ti2.string) + return true; + + if (ti1.string.equals(ti2.string)){ + // make strings unique, should be done only once.. + ti1.string = ti2.string; + return true; + } + + return false; + } + public TextItem set(float x, float y, String string, Text text) { this.x = x; this.y = y; diff --git a/src/org/oscim/renderer/overlays/TextOverlay.java b/src/org/oscim/renderer/overlays/TextOverlay.java index 192ce74d..3c5334f4 100644 --- a/src/org/oscim/renderer/overlays/TextOverlay.java +++ b/src/org/oscim/renderer/overlays/TextOverlay.java @@ -21,11 +21,15 @@ package org.oscim.renderer.overlays; // 2. compare previous to current state // 2.1 test for new labels to be placed // 2.2 handle collisions +// 2.3 try to place labels along a way +// 2.4 use 4 point labeling // 3 join segments that belong to one feature // 4 handle zoom-level changes // 5 R-Tree might be handy // +import java.util.HashMap; + import org.oscim.core.MapPosition; import org.oscim.core.Tile; import org.oscim.generator.JobTile; @@ -47,6 +51,7 @@ import org.oscim.theme.renderinstruction.Line; import org.oscim.utils.FastMath; import org.oscim.utils.OBB2D; import org.oscim.utils.PausableThread; +import org.oscim.utils.pool.LList; import org.oscim.utils.pool.Pool; import org.oscim.view.MapView; import org.oscim.view.MapViewPosition; @@ -72,34 +77,46 @@ public class TextOverlay extends BasicOverlay { // TextLayer that is ready to be added to 'layers' private TextLayer mNextLayer; - // local pool, avoids synchronized TextItem.get()/release() - - - class LabelPool extends Pool{ - Label releaseAndGetNext(Label l){ - if (l.item != null){ + // thread local pool + class LabelPool extends Pool { + Label releaseAndGetNext(Label l) { + if (l.item != null) TextItem.pool.release(l.item); - l.item = null; - } + + // drop references + l.item = null; + l.tile = null; + l.string = null; Label ret = (Label) l.next; + super.release(l); return ret; } + @Override + protected TextItem createItem() { + return new Label(); + } } private final LabelPool mPool = new LabelPool(); + // list of previous labels private Label mPrevLabels; + + // list of current labels private Label mLabels; private final float[] mTmpCoords = new float[8]; - //private HashMap mItemMap; - //private Label mNewLabels; - //private final HashMap mActiveTiles; + private final HashMap mActiveTiles; + + class LabelTile { + Tile tile; + LList