add SymbolLayer to labeling
This commit is contained in:
parent
8dcb83ee8f
commit
7d3c9d1413
@ -20,7 +20,7 @@ import org.oscim.renderer.sublayers.LineLayer;
|
|||||||
import org.oscim.renderer.sublayers.TextItem;
|
import org.oscim.renderer.sublayers.TextItem;
|
||||||
import org.oscim.theme.renderinstruction.Line;
|
import org.oscim.theme.renderinstruction.Line;
|
||||||
|
|
||||||
public class Debug {
|
class Debug {
|
||||||
|
|
||||||
private final static float[] mDebugPoints = new float[4];
|
private final static float[] mDebugPoints = new float[4];
|
||||||
|
|
||||||
|
|||||||
@ -40,8 +40,10 @@ import org.oscim.renderer.sublayers.Layer;
|
|||||||
import org.oscim.renderer.sublayers.Layers;
|
import org.oscim.renderer.sublayers.Layers;
|
||||||
import org.oscim.renderer.sublayers.LineRenderer;
|
import org.oscim.renderer.sublayers.LineRenderer;
|
||||||
import org.oscim.renderer.sublayers.PolygonRenderer;
|
import org.oscim.renderer.sublayers.PolygonRenderer;
|
||||||
|
import org.oscim.renderer.sublayers.SymbolLayer;
|
||||||
import org.oscim.renderer.sublayers.TextItem;
|
import org.oscim.renderer.sublayers.TextItem;
|
||||||
import org.oscim.renderer.sublayers.TextLayer;
|
import org.oscim.renderer.sublayers.TextLayer;
|
||||||
|
import org.oscim.renderer.sublayers.TextureLayer;
|
||||||
import org.oscim.renderer.sublayers.TextureRenderer;
|
import org.oscim.renderer.sublayers.TextureRenderer;
|
||||||
import org.oscim.utils.FastMath;
|
import org.oscim.utils.FastMath;
|
||||||
import org.oscim.utils.OBB2D;
|
import org.oscim.utils.OBB2D;
|
||||||
@ -55,7 +57,7 @@ import android.os.AsyncTask;
|
|||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
|
|
||||||
public class TextRenderLayer extends BasicRenderLayer {
|
class TextRenderLayer extends BasicRenderLayer {
|
||||||
private final static String TAG = TextRenderLayer.class.getName();
|
private final static String TAG = TextRenderLayer.class.getName();
|
||||||
private final static float MIN_CAPTION_DIST = 5;
|
private final static float MIN_CAPTION_DIST = 5;
|
||||||
private final static float MIN_WAY_DIST = 3;
|
private final static float MIN_WAY_DIST = 3;
|
||||||
@ -65,14 +67,34 @@ public class TextRenderLayer extends BasicRenderLayer {
|
|||||||
private final MapViewPosition mMapViewPosition;
|
private final MapViewPosition mMapViewPosition;
|
||||||
private final TileSet mTileSet;
|
private final TileSet mTileSet;
|
||||||
|
|
||||||
private MapPosition mTmpPos;
|
|
||||||
|
|
||||||
// TextLayer that is updating
|
class TextureLayers {
|
||||||
private TextLayer mTmpLayer;
|
boolean ready;
|
||||||
// TextLayer that is ready to be added to 'layers'
|
|
||||||
private TextLayer mNextLayer;
|
|
||||||
|
|
||||||
// thread local pool
|
final TextureLayer l;
|
||||||
|
final TextLayer textLayer;
|
||||||
|
final SymbolLayer symbolLayer;
|
||||||
|
|
||||||
|
final MapPosition pos;
|
||||||
|
|
||||||
|
TextureLayers() {
|
||||||
|
pos = new MapPosition();
|
||||||
|
|
||||||
|
symbolLayer = new SymbolLayer();
|
||||||
|
textLayer = new TextLayer();
|
||||||
|
|
||||||
|
l = symbolLayer;
|
||||||
|
l.next = textLayer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// used by GL thread
|
||||||
|
private TextureLayers mCurLayer;
|
||||||
|
|
||||||
|
// used by labeling thread
|
||||||
|
private TextureLayers mNextLayer;
|
||||||
|
|
||||||
|
// thread local pool (labeling)
|
||||||
class LabelPool extends Pool<TextItem> {
|
class LabelPool extends Pool<TextItem> {
|
||||||
Label releaseAndGetNext(Label l) {
|
Label releaseAndGetNext(Label l) {
|
||||||
if (l.item != null)
|
if (l.item != null)
|
||||||
@ -98,9 +120,6 @@ public class TextRenderLayer extends BasicRenderLayer {
|
|||||||
|
|
||||||
private final LabelPool mPool = new LabelPool();
|
private final LabelPool mPool = new LabelPool();
|
||||||
|
|
||||||
// list of previous labels
|
|
||||||
private Label mPrevLabels;
|
|
||||||
|
|
||||||
// list of current labels
|
// list of current labels
|
||||||
private Label mLabels;
|
private Label mLabels;
|
||||||
|
|
||||||
@ -113,7 +132,6 @@ public class TextRenderLayer extends BasicRenderLayer {
|
|||||||
LList<Label> labels;
|
LList<Label> labels;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private float mSquareRadius;
|
private float mSquareRadius;
|
||||||
private int mRelabelCnt;
|
private int mRelabelCnt;
|
||||||
private final TileRenderLayer mTileLayer;
|
private final TileRenderLayer mTileLayer;
|
||||||
@ -124,11 +142,14 @@ public class TextRenderLayer extends BasicRenderLayer {
|
|||||||
mMapViewPosition = mapView.getMapViewPosition();
|
mMapViewPosition = mapView.getMapViewPosition();
|
||||||
mTileLayer = baseLayer;
|
mTileLayer = baseLayer;
|
||||||
mTileSet = new TileSet();
|
mTileSet = new TileSet();
|
||||||
|
|
||||||
layers.textureLayers = new TextLayer();
|
layers.textureLayers = new TextLayer();
|
||||||
mTmpLayer = new TextLayer();
|
layers.textureLayers.next = new SymbolLayer();
|
||||||
|
|
||||||
|
mCurLayer = new TextureLayers();
|
||||||
|
mNextLayer = new TextureLayers();
|
||||||
|
|
||||||
//mActiveTiles = new HashMap<MapTile, LabelTile>();
|
//mActiveTiles = new HashMap<MapTile, LabelTile>();
|
||||||
mTmpPos = new MapPosition();
|
|
||||||
mRelabelCnt = 0;
|
mRelabelCnt = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -263,7 +284,7 @@ public class TextRenderLayer extends BasicRenderLayer {
|
|||||||
|
|
||||||
boolean updateLabels() {
|
boolean updateLabels() {
|
||||||
// nextLayer is not loaded yet
|
// nextLayer is not loaded yet
|
||||||
if (mTmpLayer == null)
|
if (mNextLayer.ready)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// get current tiles
|
// get current tiles
|
||||||
@ -274,7 +295,8 @@ public class TextRenderLayer extends BasicRenderLayer {
|
|||||||
//Log.d(TAG, "no tiles "+ mTileSet.getSerial());
|
//Log.d(TAG, "no tiles "+ mTileSet.getSerial());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
MapPosition pos = mTmpPos;
|
|
||||||
|
MapPosition pos = mNextLayer.pos;
|
||||||
|
|
||||||
synchronized (mMapViewPosition) {
|
synchronized (mMapViewPosition) {
|
||||||
changedPos = mMapViewPosition.getMapPosition(pos);
|
changedPos = mMapViewPosition.getMapPosition(pos);
|
||||||
@ -315,7 +337,10 @@ public class TextRenderLayer extends BasicRenderLayer {
|
|||||||
double tileX = (pos.x * (Tile.SIZE << zoom));
|
double tileX = (pos.x * (Tile.SIZE << zoom));
|
||||||
double tileY = (pos.y * (Tile.SIZE << zoom));
|
double tileY = (pos.y * (Tile.SIZE << zoom));
|
||||||
|
|
||||||
for (Label l = mPrevLabels; l != null;) {
|
Label prevLabels = mLabels;
|
||||||
|
mLabels = null;
|
||||||
|
|
||||||
|
for (Label l = prevLabels; l != null;) {
|
||||||
if (l.text.caption) {
|
if (l.text.caption) {
|
||||||
l = mPool.releaseAndGetNext(l);
|
l = mPool.releaseAndGetNext(l);
|
||||||
continue;
|
continue;
|
||||||
@ -515,31 +540,21 @@ public class TextRenderLayer extends BasicRenderLayer {
|
|||||||
ti.y2 = tmp;
|
ti.y2 = tmp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// temporary used Label
|
||||||
// temporarily used Label
|
|
||||||
mPool.release(l);
|
mPool.release(l);
|
||||||
|
|
||||||
//reuse text layer
|
TextLayer tl = mNextLayer.textLayer;
|
||||||
TextLayer tl = mTmpLayer;
|
|
||||||
mTmpLayer = null;
|
|
||||||
|
|
||||||
tl.labels = mLabels;
|
tl.labels = mLabels;
|
||||||
// draw text to bitmaps and create vertices
|
// draw text to bitmaps and create vertices
|
||||||
tl.prepare();
|
tl.prepare();
|
||||||
|
|
||||||
// after 'prepare' TextLayer does not need TextItems
|
|
||||||
mPrevLabels = mLabels;
|
|
||||||
mLabels = null;
|
|
||||||
tl.labels = null;
|
tl.labels = null;
|
||||||
|
|
||||||
// remove tile locks
|
// remove tile locks
|
||||||
mTileLayer.releaseTiles(mTileSet);
|
mTileLayer.releaseTiles(mTileSet);
|
||||||
|
|
||||||
// pass new labels for rendering
|
|
||||||
//synchronized (this) {
|
|
||||||
mNextLayer = tl;
|
|
||||||
mDebugLayer = dbg;
|
mDebugLayer = dbg;
|
||||||
//}
|
mNextLayer.ready = true;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -548,9 +563,12 @@ public class TextRenderLayer extends BasicRenderLayer {
|
|||||||
public synchronized void update(MapPosition pos, boolean changed,
|
public synchronized void update(MapPosition pos, boolean changed,
|
||||||
Matrices matrices) {
|
Matrices matrices) {
|
||||||
|
|
||||||
if (mNextLayer != null) {
|
if (mNextLayer.ready) {
|
||||||
// keep text layer, not recrating its canvas each time
|
// exchange current with next layers
|
||||||
mTmpLayer = (TextLayer) layers.textureLayers;
|
TextureLayers tmp = mCurLayer;
|
||||||
|
mCurLayer = mNextLayer;
|
||||||
|
mNextLayer = tmp;
|
||||||
|
mNextLayer.ready = false;
|
||||||
|
|
||||||
// clear textures and text items from previous layer
|
// clear textures and text items from previous layer
|
||||||
layers.clear();
|
layers.clear();
|
||||||
@ -561,13 +579,8 @@ public class TextRenderLayer extends BasicRenderLayer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// set new TextLayer to be uploaded and rendered
|
// set new TextLayer to be uploaded and rendered
|
||||||
layers.textureLayers = mNextLayer;
|
layers.textureLayers = mCurLayer.l;
|
||||||
mNextLayer = null;
|
mMapPosition = mCurLayer.pos;
|
||||||
|
|
||||||
// make the 'labeled' MapPosition current
|
|
||||||
MapPosition tmp = mMapPosition;
|
|
||||||
mMapPosition = mTmpPos;
|
|
||||||
mTmpPos = tmp;
|
|
||||||
|
|
||||||
this.newData = true;
|
this.newData = true;
|
||||||
}
|
}
|
||||||
@ -591,8 +604,6 @@ public class TextRenderLayer extends BasicRenderLayer {
|
|||||||
if (!isCancelled() && labelsChanged)
|
if (!isCancelled() && labelsChanged)
|
||||||
mMapView.render();
|
mMapView.render();
|
||||||
|
|
||||||
//Log.d(TAG, "relabel " + labelsChanged);
|
|
||||||
|
|
||||||
mLastRun = System.currentTimeMillis();
|
mLastRun = System.currentTimeMillis();
|
||||||
mLabelTask = null;
|
mLabelTask = null;
|
||||||
return null;
|
return null;
|
||||||
@ -605,8 +616,8 @@ public class TextRenderLayer extends BasicRenderLayer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* private */void cleanup() {
|
/* private */void cleanup() {
|
||||||
mPool.releaseAll(mPrevLabels);
|
mPool.releaseAll(mLabels);
|
||||||
mPrevLabels = null;
|
mLabels = null;
|
||||||
mTileSet.clear();
|
mTileSet.clear();
|
||||||
mLabelTask = null;
|
mLabelTask = null;
|
||||||
}
|
}
|
||||||
@ -614,13 +625,11 @@ public class TextRenderLayer extends BasicRenderLayer {
|
|||||||
private final Runnable mLabelUpdate = new Runnable() {
|
private final Runnable mLabelUpdate = new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
||||||
if (mLabelTask == null) {
|
if (mLabelTask == null) {
|
||||||
mLabelTask = new LabelTask();
|
mLabelTask = new LabelTask();
|
||||||
mLabelTask.execute();
|
mLabelTask.execute();
|
||||||
} else {
|
} else {
|
||||||
postLabelTask(50);
|
postLabelTask(50);
|
||||||
//Log.d(TAG, "repost");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user