Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
6dfaab099a
5 changed files with 137 additions and 80 deletions
|
@ -48,7 +48,7 @@ public class RenderingContext {
|
|||
|
||||
// be aware field is using in C++
|
||||
public float screenDensityRatio = 1;
|
||||
public int shadowRenderingMode = ShadowRenderingMode.BLUR_SHADOW.value;
|
||||
public int shadowRenderingMode = ShadowRenderingMode.SOLID_SHADOW.value;
|
||||
public int shadowRenderingColor = 0xff969696;
|
||||
public String renderingDebugInfo;
|
||||
public double polygonMinSizeToDisplay;
|
||||
|
|
|
@ -120,6 +120,10 @@ public class MapRenderRepositories {
|
|||
return context;
|
||||
}
|
||||
|
||||
public OsmandRenderer getRenderer() {
|
||||
return renderer;
|
||||
}
|
||||
|
||||
public void initializeNewResource(final IProgress progress, File file, BinaryMapIndexReader reader) {
|
||||
if (files.containsKey(file.getAbsolutePath())) {
|
||||
closeConnection(files.get(file.getAbsolutePath()), file.getAbsolutePath());
|
||||
|
|
|
@ -92,7 +92,8 @@ public class OsmandRenderer {
|
|||
|
||||
|
||||
|
||||
/* package */static class RenderingContext extends net.osmand.RenderingContext {
|
||||
/* package */
|
||||
public static class RenderingContext extends net.osmand.RenderingContext {
|
||||
List<TextDrawInfo> textToDraw = new ArrayList<TextDrawInfo>();
|
||||
List<IconDrawInfo> iconsToDraw = new ArrayList<IconDrawInfo>();
|
||||
Paint[] oneWay ;
|
||||
|
@ -626,7 +627,7 @@ public class OsmandRenderer {
|
|||
}
|
||||
}
|
||||
|
||||
private boolean updatePaint(RenderingRuleSearchRequest req, Paint p, int ind, boolean area, RenderingContext rc){
|
||||
public boolean updatePaint(RenderingRuleSearchRequest req, Paint p, int ind, boolean area, RenderingContext rc){
|
||||
RenderingRuleProperty rColor;
|
||||
RenderingRuleProperty rStrokeW;
|
||||
RenderingRuleProperty rCap;
|
||||
|
|
|
@ -1,13 +1,11 @@
|
|||
package net.osmand.plus.views;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import net.osmand.access.AccessibleToast;
|
||||
import net.osmand.data.FavouritePoint;
|
||||
import net.osmand.data.LatLon;
|
||||
import net.osmand.data.LocationPoint;
|
||||
import net.osmand.data.QuadRect;
|
||||
import net.osmand.data.RotatedTileBox;
|
||||
import net.osmand.plus.GPXUtilities.WptPt;
|
||||
|
@ -17,20 +15,21 @@ import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
|
|||
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.base.FavoriteImageDrawable;
|
||||
import net.osmand.plus.sherpafy.TourInformation.StageFavorite;
|
||||
import net.osmand.plus.render.OsmandRenderer;
|
||||
import net.osmand.plus.render.OsmandRenderer.RenderingContext;
|
||||
import net.osmand.plus.views.MapTextLayer.MapTextProvider;
|
||||
import net.osmand.render.RenderingRuleSearchRequest;
|
||||
import net.osmand.render.RenderingRulesStorage;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.DashPathEffect;
|
||||
import android.graphics.ColorFilter;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Paint.Align;
|
||||
import android.graphics.Paint.Cap;
|
||||
import android.graphics.Paint.Join;
|
||||
import android.graphics.Paint.Style;
|
||||
import android.graphics.Path;
|
||||
import android.graphics.PointF;
|
||||
import android.graphics.PorterDuff.Mode;
|
||||
import android.graphics.PorterDuffColorFilter;
|
||||
import android.widget.Toast;
|
||||
|
||||
public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContextMenuProvider,
|
||||
|
@ -39,21 +38,24 @@ public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContex
|
|||
private OsmandMapTileView view;
|
||||
|
||||
private Paint paint;
|
||||
private Paint paint2;
|
||||
private boolean isPaint2;
|
||||
private Paint shadowPaint;
|
||||
private boolean isShadowPaint;
|
||||
private Paint paint_1;
|
||||
private boolean isPaint_1;
|
||||
private int cachedHash;
|
||||
private int cachedColor;
|
||||
|
||||
private Path path;
|
||||
private static final int startZoom = 7;
|
||||
|
||||
private RenderingRulesStorage cachedRrs;
|
||||
private boolean cachedNightMode;
|
||||
private int cachedColor;
|
||||
|
||||
private GpxSelectionHelper selectedGpxHelper;
|
||||
|
||||
private Paint paintBmp;
|
||||
private List<WptPt> cache = new ArrayList<WptPt>();
|
||||
private MapTextLayer textLayer;
|
||||
|
||||
private DashPathEffect pathEffect;
|
||||
|
||||
private Paint paintOuter;
|
||||
|
||||
|
@ -61,16 +63,25 @@ public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContex
|
|||
|
||||
private Paint paintTextIcon;
|
||||
|
||||
private OsmandRenderer osmandRenderer;
|
||||
|
||||
// private Drawable favoriteIcon;
|
||||
|
||||
|
||||
private void initUI() {
|
||||
paint = new Paint();
|
||||
paint.setStyle(Style.STROKE);
|
||||
paint.setStrokeWidth(14);
|
||||
paint.setAntiAlias(true);
|
||||
paint.setStrokeCap(Cap.ROUND);
|
||||
paint.setStrokeJoin(Join.ROUND);
|
||||
paint2 = new Paint();
|
||||
paint2.setStyle(Style.STROKE);
|
||||
paint2.setAntiAlias(true);
|
||||
shadowPaint = new Paint();
|
||||
shadowPaint.setStyle(Style.STROKE);
|
||||
shadowPaint.setAntiAlias(true);
|
||||
paint_1 = new Paint();
|
||||
paint_1.setStyle(Style.STROKE);
|
||||
paint_1.setAntiAlias(true);
|
||||
|
||||
|
||||
path = new Path();
|
||||
|
||||
|
@ -104,30 +115,49 @@ public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContex
|
|||
public void initLayer(OsmandMapTileView view) {
|
||||
this.view = view;
|
||||
selectedGpxHelper = view.getApplication().getSelectedGpxHelper();
|
||||
pathEffect = new DashPathEffect(new float[] { 5 * view.getDensity(),
|
||||
3 * view.getDensity()}, 3);
|
||||
osmandRenderer = view.getApplication().getResourceManager().getRenderer().getRenderer();
|
||||
initUI();
|
||||
}
|
||||
|
||||
|
||||
private int getColor(DrawSettings nightMode){
|
||||
private int updatePaints(int color, boolean routePoints, DrawSettings nightMode, RotatedTileBox tileBox){
|
||||
RenderingRulesStorage rrs = view.getApplication().getRendererRegistry().getCurrentSelectedRenderer();
|
||||
boolean n = nightMode != null && nightMode.isNightMode();
|
||||
if (rrs != cachedRrs || cachedNightMode != n) {
|
||||
cachedRrs = rrs;
|
||||
cachedNightMode = n;
|
||||
final boolean isNight = nightMode != null && nightMode.isNightMode();
|
||||
int hsh = calculateHash(rrs, routePoints, isNight, tileBox.getZoomScale());
|
||||
if (hsh != cachedHash) {
|
||||
cachedHash = hsh;
|
||||
cachedColor = view.getResources().getColor(R.color.gpx_track);
|
||||
if (cachedRrs != null) {
|
||||
if (rrs != null) {
|
||||
RenderingRuleSearchRequest req = new RenderingRuleSearchRequest(rrs);
|
||||
req.setBooleanFilter(rrs.PROPS.R_NIGHT_MODE, cachedNightMode);
|
||||
if (req.searchRenderingAttribute("gpxColor")) {
|
||||
cachedColor = req.getIntPropertyValue(rrs.PROPS.R_ATTR_COLOR_VALUE);
|
||||
req.setBooleanFilter(rrs.PROPS.R_NIGHT_MODE, isNight);
|
||||
if(routePoints) {
|
||||
req.setStringFilter(rrs.PROPS.R_ADDITIONAL, "routePoints=true");
|
||||
}
|
||||
if (req.searchRenderingAttribute("gpx")) {
|
||||
RenderingContext rc = new OsmandRenderer.RenderingContext(view.getContext());
|
||||
rc.setDensityValue((float) Math.pow(2, tileBox.getZoomScale()));
|
||||
cachedColor = req.getIntPropertyValue(rrs.PROPS.R_COLOR);
|
||||
osmandRenderer.updatePaint(req, paint, 0, false, rc);
|
||||
isPaint2 = osmandRenderer.updatePaint(req, paint2, 1, false, rc);
|
||||
isPaint_1 = osmandRenderer.updatePaint(req, paint_1, -1, false, rc);
|
||||
isShadowPaint = req.isSpecified(rrs.PROPS.R_SHADOW_RADIUS);
|
||||
if(isShadowPaint) {
|
||||
ColorFilter cf = new PorterDuffColorFilter(req.getIntPropertyValue(rrs.PROPS.R_SHADOW_COLOR), Mode.SRC_IN);
|
||||
shadowPaint.setColorFilter(cf);
|
||||
shadowPaint.setStrokeWidth(paint.getStrokeWidth() + 2 * rc.getComplexValue(req, rrs.PROPS.R_SHADOW_RADIUS));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
paint.setColor(color == 0 ? cachedColor : color);
|
||||
return cachedColor;
|
||||
}
|
||||
|
||||
private int calculateHash(Object... o) {
|
||||
return Arrays.hashCode(o);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) {
|
||||
List<SelectedGpxFile> selectedGPXFiles = selectedGpxHelper.getSelectedGPXFiles();
|
||||
|
@ -224,16 +254,15 @@ public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContex
|
|||
|
||||
private void drawSelectedFilesSegments(Canvas canvas, RotatedTileBox tileBox,
|
||||
List<SelectedGpxFile> selectedGPXFiles, DrawSettings settings) {
|
||||
int clr = getColor(settings);
|
||||
for (SelectedGpxFile g : selectedGPXFiles) {
|
||||
List<List<WptPt>> points = g.getPointsToDisplay();
|
||||
boolean routePoints = g.isRoutePoints();
|
||||
int fcolor = g.getColor() == 0 ? clr : g.getColor();
|
||||
paint.setColor(fcolor);
|
||||
drawSegments(canvas, tileBox, points, routePoints);
|
||||
updatePaints(g.getColor(), routePoints, settings, tileBox);
|
||||
drawSegments(canvas, tileBox, points);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private boolean isPointVisited(WptPt o) {
|
||||
boolean visit = false;
|
||||
String visited = o.getExtensionsToRead().get("VISITED_KEY");
|
||||
|
@ -251,16 +280,10 @@ public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContex
|
|||
return pts;
|
||||
}
|
||||
|
||||
private void drawSegments(Canvas canvas, RotatedTileBox tileBox, List<List<WptPt>> points, boolean routePoints) {
|
||||
private void drawSegments(Canvas canvas, RotatedTileBox tileBox, List<List<WptPt>> points) {
|
||||
final QuadRect latLonBounds = tileBox.getLatLonBounds();
|
||||
for (List<WptPt> l : points) {
|
||||
path.rewind();
|
||||
paint.setPathEffect(routePoints ? pathEffect : null);
|
||||
if (routePoints){
|
||||
paint.setStrokeCap(Cap.BUTT);
|
||||
} else {
|
||||
paint.setStrokeCap(Cap.ROUND);
|
||||
}
|
||||
int startIndex = -1;
|
||||
|
||||
for (int i = 0; i < l.size(); i++) {
|
||||
|
@ -301,7 +324,17 @@ public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContex
|
|||
int y = tb.getPixYFromLatNoRot(p.lat);
|
||||
path.lineTo(x, y);
|
||||
}
|
||||
if(isPaint_1) {
|
||||
canvas.drawPath(path, paint_1);
|
||||
}
|
||||
if(isShadowPaint) {
|
||||
canvas.drawPath(path, shadowPaint);
|
||||
}
|
||||
canvas.drawPath(path, paint);
|
||||
if(isPaint2) {
|
||||
canvas.drawPath(path, paint2);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
package net.osmand.plus.views;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import net.osmand.Location;
|
||||
import net.osmand.data.QuadRect;
|
||||
import net.osmand.data.RotatedTileBox;
|
||||
import net.osmand.plus.R;
|
||||
import net.osmand.plus.render.OsmandRenderer;
|
||||
import net.osmand.plus.render.OsmandRenderer.RenderingContext;
|
||||
import net.osmand.plus.routing.RoutingHelper;
|
||||
import net.osmand.render.RenderingRuleSearchRequest;
|
||||
import net.osmand.render.RenderingRulesStorage;
|
||||
|
@ -14,8 +17,7 @@ import android.graphics.Bitmap;
|
|||
import android.graphics.BitmapFactory;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.ColorMatrix;
|
||||
import android.graphics.ColorMatrixColorFilter;
|
||||
import android.graphics.ColorFilter;
|
||||
import android.graphics.Matrix;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Paint.Cap;
|
||||
|
@ -24,6 +26,8 @@ import android.graphics.Paint.Style;
|
|||
import android.graphics.Path;
|
||||
import android.graphics.PathMeasure;
|
||||
import android.graphics.PointF;
|
||||
import android.graphics.PorterDuff.Mode;
|
||||
import android.graphics.PorterDuffColorFilter;
|
||||
|
||||
public class RouteLayer extends OsmandMapLayer {
|
||||
|
||||
|
@ -32,18 +36,23 @@ public class RouteLayer extends OsmandMapLayer {
|
|||
private final RoutingHelper helper;
|
||||
private List<Location> points = new ArrayList<Location>();
|
||||
private Paint paint;
|
||||
private Paint paint2;
|
||||
private boolean isPaint2;
|
||||
private Paint shadowPaint;
|
||||
private boolean isShadowPaint;
|
||||
private Paint paint_1;
|
||||
private boolean isPaint_1;
|
||||
private int cachedHash;
|
||||
|
||||
private Path path;
|
||||
|
||||
// cache
|
||||
private RenderingRulesStorage cachedRrs;
|
||||
private boolean cachedNightMode;
|
||||
private int cachedColor;
|
||||
|
||||
private Bitmap coloredArrowUp;
|
||||
|
||||
private Paint paintIcon;
|
||||
|
||||
private OsmandRenderer osmandRenderer;
|
||||
|
||||
public RouteLayer(RoutingHelper helper){
|
||||
this.helper = helper;
|
||||
}
|
||||
|
@ -53,7 +62,6 @@ public class RouteLayer extends OsmandMapLayer {
|
|||
paint = new Paint();
|
||||
|
||||
paint.setStyle(Style.STROKE);
|
||||
paint.setStrokeWidth(14);
|
||||
paint.setAntiAlias(true);
|
||||
paint.setStrokeCap(Cap.ROUND);
|
||||
paint.setStrokeJoin(Join.ROUND);
|
||||
|
@ -70,53 +78,55 @@ public class RouteLayer extends OsmandMapLayer {
|
|||
@Override
|
||||
public void initLayer(OsmandMapTileView view) {
|
||||
this.view = view;
|
||||
osmandRenderer = view.getApplication().getResourceManager().getRenderer().getRenderer();
|
||||
initUI();
|
||||
}
|
||||
|
||||
|
||||
private int updateColor(DrawSettings nightMode){
|
||||
private void updatePaints(DrawSettings nightMode, RotatedTileBox tileBox){
|
||||
RenderingRulesStorage rrs = view.getApplication().getRendererRegistry().getCurrentSelectedRenderer();
|
||||
boolean n = nightMode != null && nightMode.isNightMode();
|
||||
if(coloredArrowUp == null) {
|
||||
Bitmap originalArrowUp = BitmapFactory.decodeResource(view.getResources(), R.drawable.h_arrow, null);
|
||||
coloredArrowUp = originalArrowUp;
|
||||
// coloredArrowUp = Bitmap.createScaledBitmap(originalArrowUp, originalArrowUp.getWidth() * 3 / 4,
|
||||
// originalArrowUp.getHeight() * 3 / 4, true);
|
||||
}
|
||||
if (rrs != cachedRrs || cachedNightMode != n) {
|
||||
cachedRrs = rrs;
|
||||
cachedNightMode = n;
|
||||
cachedColor = view.getResources().getColor(cachedNightMode?R.color.nav_track_fluorescent : R.color.nav_track);
|
||||
if (cachedRrs != null) {
|
||||
final boolean isNight = nightMode != null && nightMode.isNightMode();
|
||||
int hsh = calculateHash(rrs, isNight, tileBox.getZoomScale());
|
||||
if (hsh != cachedHash) {
|
||||
cachedHash = hsh;
|
||||
// cachedColor = view.getResources().getColor(R.color.nav_track);
|
||||
if (rrs != null) {
|
||||
RenderingRuleSearchRequest req = new RenderingRuleSearchRequest(rrs);
|
||||
req.setBooleanFilter(rrs.PROPS.R_NIGHT_MODE, cachedNightMode);
|
||||
if (req.searchRenderingAttribute("routeColor")) {
|
||||
cachedColor = req.getIntPropertyValue(rrs.PROPS.R_ATTR_COLOR_VALUE);
|
||||
req.setBooleanFilter(rrs.PROPS.R_NIGHT_MODE, isNight);
|
||||
if (req.searchRenderingAttribute("route")) {
|
||||
RenderingContext rc = new OsmandRenderer.RenderingContext(view.getContext());
|
||||
rc.setDensityValue((float) Math.pow(2, tileBox.getZoomScale()));
|
||||
// cachedColor = req.getIntPropertyValue(rrs.PROPS.R_COLOR);
|
||||
osmandRenderer.updatePaint(req, paint, 0, false, rc);
|
||||
isPaint2 = osmandRenderer.updatePaint(req, paint2, 1, false, rc);
|
||||
isPaint_1 = osmandRenderer.updatePaint(req, paint_1, -1, false, rc);
|
||||
isShadowPaint = req.isSpecified(rrs.PROPS.R_SHADOW_RADIUS);
|
||||
if(isShadowPaint) {
|
||||
ColorFilter cf = new PorterDuffColorFilter(req.getIntPropertyValue(rrs.PROPS.R_SHADOW_COLOR), Mode.SRC_IN);
|
||||
shadowPaint.setColorFilter(cf);
|
||||
shadowPaint.setStrokeWidth(paint.getStrokeWidth() + 2 * rc.getComplexValue(req, rrs.PROPS.R_SHADOW_RADIUS));
|
||||
}
|
||||
}
|
||||
paint.setColor(cachedColor);
|
||||
int r = Color.red(cachedColor);
|
||||
int g = Color.green(cachedColor);
|
||||
int b = Color.blue(cachedColor);
|
||||
ColorMatrix f = new ColorMatrix(new float[]{
|
||||
0, 0, 0, 0, r,
|
||||
0, 0, 0, 0, g,
|
||||
0, 0, 0, 0, b,
|
||||
0, 0, 0, 1, 0
|
||||
});
|
||||
ColorMatrix sat = new ColorMatrix();
|
||||
sat.setSaturation(0.3f);
|
||||
f.postConcat(sat);
|
||||
paintIcon.setColorFilter(new ColorMatrixColorFilter(f));
|
||||
}
|
||||
return cachedColor;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private int calculateHash(Object... o) {
|
||||
return Arrays.hashCode(o);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPrepareBufferImage(Canvas canvas, RotatedTileBox tileBox, DrawSettings settings) {
|
||||
path.reset();
|
||||
if (helper.getFinalLocation() != null && helper.getRoute().isCalculated()) {
|
||||
updateColor(settings);
|
||||
updatePaints(settings, tileBox);
|
||||
if(coloredArrowUp == null) {
|
||||
Bitmap originalArrowUp = BitmapFactory.decodeResource(view.getResources(), R.drawable.h_arrow, null);
|
||||
coloredArrowUp = originalArrowUp;
|
||||
// coloredArrowUp = Bitmap.createScaledBitmap(originalArrowUp, originalArrowUp.getWidth() * 3 / 4,
|
||||
// originalArrowUp.getHeight() * 3 / 4, true);
|
||||
}
|
||||
int w = tileBox.getPixWidth();
|
||||
int h = tileBox.getPixHeight();
|
||||
Location lastProjection = helper.getLastProjection();
|
||||
|
@ -158,7 +168,16 @@ public class RouteLayer extends OsmandMapLayer {
|
|||
int y = tb.getPixYFromLatNoRot(o.getLatitude());
|
||||
path.lineTo(x, y);
|
||||
}
|
||||
if(isPaint_1) {
|
||||
canvas.drawPath(path, paint_1);
|
||||
}
|
||||
if(isShadowPaint) {
|
||||
canvas.drawPath(path, shadowPaint);
|
||||
}
|
||||
canvas.drawPath(path, paint);
|
||||
if(isPaint2) {
|
||||
canvas.drawPath(path, paint2);
|
||||
}
|
||||
if(tb.getZoomAnimation() == 0) {
|
||||
drawArrowsOverPath(canvas, path, coloredArrowUp);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue