improve rendering
git-svn-id: https://osmand.googlecode.com/svn/trunk@514 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
parent
5d851e8e6b
commit
56e60979b0
4 changed files with 79 additions and 30 deletions
|
@ -266,7 +266,8 @@ public class MapRenderRepositories {
|
|||
}
|
||||
try {
|
||||
int count = 0;
|
||||
List<MapRenderObject> local = new ArrayList<MapRenderObject>();
|
||||
cObjects = new ArrayList<MapRenderObject>();
|
||||
System.gc(); // to clear previous objects
|
||||
Set<Long> ids = new LinkedHashSet<Long>();
|
||||
for (Connection c : connections.keySet()) {
|
||||
RectF r = connections.get(c);
|
||||
|
@ -294,24 +295,25 @@ public class MapRenderRepositories {
|
|||
try {
|
||||
while (result.next()) {
|
||||
long id = result.getLong(1);
|
||||
if(ids.contains(id)){
|
||||
// do not add object twice
|
||||
continue;
|
||||
if (PerformanceFlags.checkForDuplicateObjectIds) {
|
||||
if (ids.contains(id)) {
|
||||
// do not add object twice
|
||||
continue;
|
||||
}
|
||||
ids.add(id);
|
||||
}
|
||||
ids.add(id);
|
||||
MapRenderObject obj = new MapRenderObject(id);
|
||||
obj.setData(result.getBytes(2));
|
||||
obj.setName(result.getString(3));
|
||||
obj.setType(result.getInt(4));
|
||||
count++;
|
||||
local.add(obj);
|
||||
cObjects.add(obj);
|
||||
}
|
||||
|
||||
} finally {
|
||||
result.close();
|
||||
}
|
||||
}
|
||||
cObjects = local;
|
||||
log.info(String
|
||||
.format("Search has been done in %s ms. %s results were found.", System.currentTimeMillis() - now, count)); //$NON-NLS-1$
|
||||
} catch (java.sql.SQLException e) {
|
||||
|
|
|
@ -100,8 +100,8 @@ public class OsmandRenderer implements Comparator<MapRenderObject> {
|
|||
|
||||
// use to calculate points
|
||||
PointF tempPoint = new PointF();
|
||||
float cosRotate;
|
||||
float sinRotate;
|
||||
float cosRotateTileSize;
|
||||
float sinRotateTileSize;
|
||||
|
||||
// These properties are used for rendering one object
|
||||
// polyline props
|
||||
|
@ -255,8 +255,8 @@ public class OsmandRenderer implements Comparator<MapRenderObject> {
|
|||
rc.width = width;
|
||||
rc.height = height;
|
||||
rc.tileDivisor = (int) (1 << (31 - zoom));
|
||||
rc.cosRotate = FloatMath.cos((float) Math.toRadians(rotate));
|
||||
rc.sinRotate = FloatMath.sin((float) Math.toRadians(rotate));
|
||||
rc.cosRotateTileSize = FloatMath.cos((float) Math.toRadians(rotate)) * TILE_SIZE;
|
||||
rc.sinRotateTileSize = FloatMath.sin((float) Math.toRadians(rotate)) * TILE_SIZE;
|
||||
bmp = Bitmap.createBitmap(width, height, Config.RGB_565);
|
||||
|
||||
Canvas cv = new Canvas(bmp);
|
||||
|
@ -287,6 +287,13 @@ public class OsmandRenderer implements Comparator<MapRenderObject> {
|
|||
List<RectF> boundsNotPathIntersect = new ArrayList<RectF>();
|
||||
List<RectF> boundsPathIntersect = new ArrayList<RectF>();
|
||||
int size = rc.textToDraw.size();
|
||||
Comparator<RectF> c = new Comparator<RectF>(){
|
||||
@Override
|
||||
public int compare(RectF object1, RectF object2) {
|
||||
return Float.compare(object1.left, object2.left);
|
||||
}
|
||||
|
||||
};
|
||||
next: for (int i = 0; i < size; i++) {
|
||||
TextDrawInfo text = rc.textToDraw.get(i);
|
||||
if(text.text != null){
|
||||
|
@ -303,18 +310,51 @@ public class OsmandRenderer implements Comparator<MapRenderObject> {
|
|||
bounds.set(text.centerX - 3 * text.textSize / 2, text.centerY - mes/2,
|
||||
text.centerX + 3 * text.textSize / 2, text.centerY + mes/2);
|
||||
}
|
||||
List<RectF> boundsIntersect = text.drawOnPath == null ? boundsNotPathIntersect : boundsPathIntersect;
|
||||
final int diff = 3;
|
||||
final int diff2 = 15;
|
||||
for(int j = 0; j < boundsIntersect.size() ; j++){
|
||||
RectF b = boundsIntersect.get(j);
|
||||
float x = Math.min(bounds.right, b.right) - Math.max(b.left, bounds.left);
|
||||
float y = Math.min(bounds.bottom, b.bottom) - Math.max(b.top, bounds.top);
|
||||
if((x > diff && y > diff2) || (x > diff2 && y > diff)){
|
||||
continue next;
|
||||
List<RectF> boundsIntersect = text.drawOnPath == null ? boundsNotPathIntersect : boundsPathIntersect;
|
||||
if(boundsIntersect.isEmpty()){
|
||||
boundsIntersect.add(bounds);
|
||||
} else {
|
||||
final int diff = 3;
|
||||
final int diff2 = 15;
|
||||
// implement binary search
|
||||
int index = Collections.binarySearch(boundsIntersect, bounds, c);
|
||||
if (index < 0) {
|
||||
index = -(index + 1);
|
||||
}
|
||||
// find sublist that is appropriate
|
||||
int e = index;
|
||||
while (e < boundsIntersect.size()) {
|
||||
if (boundsIntersect.get(e).left < bounds.right) {
|
||||
e++;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
int st = index - 1;
|
||||
while (st >= 0) {
|
||||
// that's not exact algorithm that replace comparison rect with each other
|
||||
// because of that comparison that is not obvious
|
||||
// (we store array sorted by left boundary, not by right) - that's euristic
|
||||
if (boundsIntersect.get(st).right > bounds.left) {
|
||||
st--;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (st < 0) {
|
||||
st = 0;
|
||||
}
|
||||
for (int j = st; j < e; j++) {
|
||||
RectF b = boundsIntersect.get(j);
|
||||
float x = Math.min(bounds.right, b.right) - Math.max(b.left, bounds.left);
|
||||
float y = Math.min(bounds.bottom, b.bottom) - Math.max(b.top, bounds.top);
|
||||
if ((x > diff && y > diff2) || (x > diff2 && y > diff)) {
|
||||
continue next;
|
||||
}
|
||||
}
|
||||
// store in list sorted by left boundary
|
||||
boundsIntersect.add(index, bounds);
|
||||
}
|
||||
boundsIntersect.add(bounds);
|
||||
|
||||
|
||||
// paintText.setShadowLayer(text.textShadow, 0, 0, Color.WHITE);
|
||||
|
@ -446,12 +486,11 @@ public class OsmandRenderer implements Comparator<MapRenderObject> {
|
|||
rc.pointCount ++;
|
||||
float tx = o.getPoint31XTile(ind) / rc.tileDivisor;
|
||||
float ty = o.getPoint31YTile(ind) / rc.tileDivisor;
|
||||
float dTileX = tx - rc.leftX;
|
||||
float dTileX = tx - rc.leftX;
|
||||
float dTileY = ty - rc.topY;
|
||||
float x = (rc.cosRotate * dTileX - rc.sinRotate * dTileY) * TILE_SIZE ;
|
||||
float y = (rc.sinRotate * dTileX + rc.cosRotate * dTileY) * TILE_SIZE ;
|
||||
float x = rc.cosRotateTileSize * dTileX - rc.sinRotateTileSize * dTileY;
|
||||
float y = rc.sinRotateTileSize * dTileX + rc.cosRotateTileSize * dTileY;
|
||||
rc.tempPoint.set(x, y);
|
||||
// rc.tempPoint.set(dTileX * TILE_SIZE, dTileY * TILE_SIZE);
|
||||
if(rc.tempPoint.x >= 0 && rc.tempPoint.x < rc.width &&
|
||||
rc.tempPoint.y >= 0 && rc.tempPoint.y < rc.height){
|
||||
rc.pointInsideCount++;
|
||||
|
|
12
OsmAnd/src/net/osmand/render/PerformanceFlags.java
Normal file
12
OsmAnd/src/net/osmand/render/PerformanceFlags.java
Normal file
|
@ -0,0 +1,12 @@
|
|||
package net.osmand.render;
|
||||
|
||||
public class PerformanceFlags {
|
||||
|
||||
// TimeLoadingMap = Rendering (%25) + Searching(%40) + Other
|
||||
|
||||
// It is needed to not draw object twice if user have map index that intersects by boundaries
|
||||
// Takes 25% TimeLoadingMap (?) - Long.valueOf - 12, add - 10, contains - 3.
|
||||
public static boolean checkForDuplicateObjectIds = true;
|
||||
|
||||
|
||||
}
|
|
@ -25,7 +25,6 @@ public class GPXLayer implements OsmandMapLayer {
|
|||
private RectF tileRect;
|
||||
private List<List<Location>> points = new ArrayList<List<Location>>();
|
||||
private Paint paint;
|
||||
private Paint paintPoint;
|
||||
|
||||
|
||||
private Path path;
|
||||
|
@ -38,7 +37,7 @@ public class GPXLayer implements OsmandMapLayer {
|
|||
boundsRect = new Rect(0, 0, view.getWidth(), view.getHeight());
|
||||
tileRect = new RectF();
|
||||
paint = new Paint();
|
||||
paint.setColor(Color.argb(190, 160, 10, 215));
|
||||
paint.setColor(Color.argb(180, 160, 10, 215));
|
||||
paint.setStyle(Style.STROKE);
|
||||
paint.setStrokeWidth(14);
|
||||
paint.setAntiAlias(true);
|
||||
|
@ -46,9 +45,6 @@ public class GPXLayer implements OsmandMapLayer {
|
|||
paint.setStrokeJoin(Join.ROUND);
|
||||
|
||||
|
||||
paintPoint = new Paint();
|
||||
paintPoint.setColor(Color.argb(190, 160, 10, 215));
|
||||
paintPoint.setStyle(Style.FILL_AND_STROKE);
|
||||
path = new Path();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue