osm-focus/src/dk/network42/osmfocus/PaintConfig.java

406 lines
14 KiB
Java

package dk.network42.osmfocus;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.preference.PreferenceManager;
import android.util.Log;
public class PaintConfig {
private static final String TAG = "PaintConfig";
public static final float DEFAULT_ZOOM = 2.5f;
Paint debughud = new Paint();
Paint bounds = new Paint();
Paint paint = new Paint();
Paint waystroke = new Paint();
Paint waystroke2 = new Paint();
Paint wayfill2 = new Paint();
Paint service = new Paint();
Paint service2 = new Paint();
Paint waystrokesec = new Paint(); // secondary+primary roads
Paint waystrokesec2 = new Paint();
Paint waystroketert = new Paint(); // tertiary+unclassifed roads
Paint waystroketert2 = new Paint();
Paint waystroke_undef = new Paint();
Paint rail = new Paint(); // tertiary+unclassifed roads
Paint rail2 = new Paint();
Paint track = new Paint();
Paint path = new Paint();
Paint water = new Paint();
Paint buildings = new Paint();
Paint buildings2 = new Paint();
Paint nature = new Paint();
Paint gps = new Paint();
Paint gps2 = new Paint();
Paint tag = new Paint();
Paint tagback = new Paint();
Paint tagback2 = new Paint();
Paint tagback2stroke = new Paint();
Paint tagback3 = new Paint();
Paint tagframe = new Paint();
Paint horizon = new Paint();
Paint[] focus = new Paint[8];
Paint[] focus2 = new Paint[8];
Paint fade = new Paint();
Paint tileerr = new Paint();
Paint attrib = new Paint();
int mLayer;
Matrix viewmatrix = new Matrix();
Matrix inv = new Matrix();
float[] pts = new float[2]; // Scratchpad
float[] pts2 = new float[2]; // Scratchpad
boolean wireframe = false;
float tagtextsize = 18;
boolean antialias = true;
float mHUDspacing, mListSpacing;
float mScale = DEFAULT_ZOOM;
float densityScale;
//int mBackMapType = MAPTYPE_OSM;
int mBackMapType = MapLayer.MAPTYPE_INTERNAL;
public void setLayer(int layer) { mLayer = layer; }
public int getLayer() { return mLayer; }
public void setScale(float scale, Context ctx) {
mScale = scale;
update(ctx);
}
public float getScale() { return mScale; }
public void update(Context ctx) {
densityScale = ctx.getResources().getDisplayMetrics().density;
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
//Log.d(TAG, "Pref:LabelSize=" + sharedPrefs.getString("pref_labelsize", "15"));
tagtextsize = densityScale * Float.parseFloat(sharedPrefs.getString("pref_labelsize", "15.0"));
//wireframe = sharedPrefs.getBoolean("pref_wireframe", false);
//Toast toast = Toast.makeText(ctx, "Textsize="+tagtextsize, Toast.LENGTH_SHORT);
//toast.show();
debughud.setColor(Color.BLACK);
debughud.setAntiAlias(antialias);
debughud.setStrokeWidth(0);
debughud.setTextSize(tagtextsize);
mHUDspacing = tagtextsize;
attrib.setColor(Color.GRAY);
attrib.setAntiAlias(antialias);
attrib.setStrokeWidth(0);
attrib.setTextSize(densityScale*10);
bounds.setColor(Color.BLACK);
bounds.setStrokeWidth(0);
bounds.setStyle(Paint.Style.STROKE);
paint.setColor(Color.BLACK);
paint.setAntiAlias(antialias);
paint.setStrokeWidth(0);
paint.setStyle(Paint.Style.STROKE);
paint.setTextSize(tagtextsize);
mListSpacing = paint.getTextSize()+1;
fade.setColor(Color.BLACK);
fade.setStrokeWidth(0);
fade.setAlpha(42); // Larger means less opaque
tileerr.setColor(Color.RED);
tileerr.setAlpha(42); // Larger means less opaque
waystroke.setColor(Color.rgb(190, 190, 190));
waystroke.setAntiAlias(antialias);
waystroke.setStrokeWidth(6);
waystroke.setStrokeJoin(Paint.Join.ROUND);
waystroke.setStrokeCap(Paint.Cap.ROUND);
waystroke.setStyle(Paint.Style.STROKE);
waystroke2.setColor(Color.rgb(254, 254, 254));
waystroke2.setAntiAlias(antialias);
waystroke2.setStrokeWidth(5);
waystroke2.setStrokeJoin(Paint.Join.ROUND);
waystroke2.setStrokeCap(Paint.Cap.ROUND);
waystroke2.setStyle(Paint.Style.STROKE);
wayfill2.set(waystroke2);
wayfill2.setStyle(Paint.Style.FILL_AND_STROKE);
service.set(waystroke);
service.setStrokeWidth(3);
service2.set(waystroke2);
service2.setStrokeWidth(2.4f);
waystrokesec.setColor(Color.rgb(163, 123, 72));
waystrokesec.setAntiAlias(antialias);
waystrokesec.setStrokeWidth(10);
waystrokesec.setStrokeJoin(Paint.Join.ROUND);
waystrokesec.setStrokeCap(Paint.Cap.ROUND);
waystrokesec.setStyle(Paint.Style.STROKE);
waystrokesec2.setColor(Color.rgb(237, 237, 201));
waystrokesec2.setAntiAlias(antialias);
waystrokesec2.setStrokeWidth(8);
waystrokesec2.setStrokeJoin(Paint.Join.ROUND);
waystrokesec2.setStrokeCap(Paint.Cap.ROUND);
waystrokesec2.setStyle(Paint.Style.STROKE);
waystroketert.setColor(Color.rgb(190, 190, 190));
waystroketert.setAntiAlias(antialias);
waystroketert.setStrokeWidth(10);
waystroketert.setStrokeJoin(Paint.Join.ROUND);
waystroketert.setStrokeCap(Paint.Cap.ROUND);
waystroketert.setStyle(Paint.Style.STROKE);
waystroketert2.setColor(Color.rgb(254, 254, 254));
waystroketert2.setAntiAlias(antialias);
waystroketert2.setStrokeWidth(8);
waystroketert2.setStrokeJoin(Paint.Join.ROUND);
waystroketert2.setStrokeCap(Paint.Cap.ROUND);
waystroketert2.setStyle(Paint.Style.STROKE);
waystroke_undef.setColor(Color.rgb(210,210,210));
waystroke_undef.setAntiAlias(antialias);
waystroke_undef.setStrokeWidth(0);
waystroke_undef.setStyle(Paint.Style.STROKE);
waystroke_undef.setTextSize(16);
//waypaint_undef.setPathEffect(new DashPathEffect(new float[] {1,2}, 0));
rail.setColor(Color.rgb(190, 190, 190));
rail.setAntiAlias(antialias);
rail.setStrokeWidth(2.5f);
rail.setStyle(Paint.Style.STROKE);
rail2.setColor(Color.rgb(254, 254, 254));
rail2.setAntiAlias(antialias);
rail2.setStrokeWidth(2);
rail2.setStyle(Paint.Style.STROKE);
rail2.setPathEffect(new DashPathEffect(new float[] {2f,2f}, 0));
path.setColor(Color.rgb(190, 108, 108)); // Paths and cycleways
path.setAntiAlias(antialias);
path.setStrokeWidth(1.5f);
path.setStyle(Paint.Style.STROKE);
path.setPathEffect(new DashPathEffect(new float[] {4f,1.5f}, 0));
track.set(path);
track.setColor(Color.rgb(156, 107, 8));
track.setStrokeWidth(2.5f);
buildings.setColor(Color.rgb(224, 224, 224)); // Fill
buildings.setAntiAlias(antialias);
buildings.setStrokeWidth(0);
buildings2.setColor(Color.rgb(145, 145, 145)); // Outline
buildings2.setAntiAlias(antialias);
buildings2.setStrokeWidth(0);
buildings2.setStyle(Paint.Style.STROKE);
nature.setColor(Color.rgb(212, 228, 196));
nature.setAntiAlias(antialias);
nature.setStrokeWidth(0);
water.setColor(Color.rgb(181, 208, 208));
water.setAntiAlias(antialias);
water.setStrokeWidth(0);
gps.setColor(Color.rgb(0, 0, 192)); // Circle defining physical location and accuracy
gps.setAntiAlias(antialias);
gps.setStrokeWidth(0);
gps.setAlpha(32);
gps2.setColor(Color.rgb(0, 0, 200));
gps2.setAntiAlias(antialias);
gps2.setStrokeWidth(0);
gps2.setStyle(Paint.Style.STROKE);
tag.setColor(Color.rgb(0, 0, 0));
tag.setAntiAlias(antialias);
tag.setStrokeWidth(0);
tag.setTextSize(tagtextsize);
tagback.setColor(Color.rgb(230, 230, 140));
tagback.setAntiAlias(antialias);
tagback.setStrokeWidth(0);
//tagback.setAlpha(190);
tagback2.setColor(Color.rgb(160, 240, 160));
tagback2.setAntiAlias(antialias);
tagback2.setStrokeWidth(0);
//tagback2stroke.setAlpha(190);
tagback2stroke.setColor(Color.rgb(160, 240, 160));
tagback2stroke.setAntiAlias(antialias);
tagback2stroke.setStrokeWidth(4);
//tagback2stroke.setAlpha(200);
tagback3.setColor(Color.WHITE);
tagback3.setAntiAlias(antialias);
tagback3.setStrokeWidth(0);
//tagback3.setAlpha(220);
tagframe.setColor(Color.BLACK);
tagframe.setAntiAlias(antialias);
tagframe.setStrokeWidth(1);
tagframe.setStyle(Paint.Style.STROKE);
horizon.setColor(Color.rgb(0, 0, 200));
horizon.setAntiAlias(antialias);
horizon.setStrokeWidth(0);
horizon.setStyle(Paint.Style.STROKE);
for (int ii=0; ii<8; ii++) { // highlighted objects
focus[ii] = new Paint();
switch (ii%8) {
// See http://developer.android.com/design/style/color.html
case 0:
focus[ii].setColor(Color.rgb(0xff, 0x44, 0x44));
break;
case 1:
focus[ii].setColor(Color.rgb(0xff, 0xbb, 0x33));
break;
case 2:
focus[ii].setColor(Color.rgb(0x99, 0xcc, 0));
break;
case 3:
focus[ii].setColor(Color.rgb(0xaa, 0x66, 0xcc));
break;
case 4:
focus[ii].setColor(Color.rgb(0x33, 0xb5, 0xe5));
break;
// Darker variants below
case 5:
focus[ii].setColor(Color.rgb(0xcc, 0, 0));
break;
case 6:
focus[ii].setColor(Color.rgb(0xff, 0x88, 0));
break;
case 7:
focus[ii].setColor(Color.rgb(0x66, 0x99, 0));
break;
}
focus[ii].setAntiAlias(antialias);
focus[ii].setStrokeWidth(densityScale * 3/mScale); // Used with global scaling
focus[ii].setStrokeCap(Paint.Cap.ROUND);
focus[ii].setStyle(Paint.Style.STROKE);
//focus[ii].setAlpha(42); // Larger means less opaque
focus2[ii] = new Paint(focus[ii]);
focus2[ii].setStrokeWidth(densityScale * 1.5f); // Used with screen scaling
}
}
// FIXME: Autoset when modifying viewmatrix, add methods for updating viewmatrix and autoset in these
private void setInvertM() {
assert viewmatrix.invert(inv);
viewmatrix.invert(inv);
}
// Convert from world coords (not mercator projected) to screen coords
public float[] world2view(double lon, double lat) {
float [] pts = new float[]{(float)lon*MapView.prescale, (float)GeoMath.latToMercator(lat)*MapView.prescale};
viewmatrix.mapPoints(pts);
return pts;
}
// Convert from view coords to world coords (not mercator projected)
public double[] view2world(float x, float y) {
pts[0] = x;
pts[1] = y;
double [] ptsd = new double[2];
setInvertM();
inv.mapPoints(pts);
ptsd[0] = pts[0]/MapView.prescale;
ptsd[1] = GeoMath.mercatorToLat(pts[1]/MapView.prescale);
return ptsd;
}
public void view2world(RectF rect) {
setInvertM();
pts[0] = rect.left;
pts[1] = rect.top;
inv.mapPoints(pts);
rect.left = pts[0]/MapView.prescale;
rect.top = (float) GeoMath.mercatorToLat(pts[1]/MapView.prescale);
pts[0] = rect.right;
pts[1] = rect.bottom;
inv.mapPoints(pts);
rect.right = pts[0]/MapView.prescale;
rect.bottom = (float) GeoMath.mercatorToLat(pts[1]/MapView.prescale);
}
boolean hasTag(OsmElement e, OsmElement multiPolyOuter, String key, String val) {
return ((multiPolyOuter==null && e.hasTag(key, val)) || (multiPolyOuter!=null && multiPolyOuter.hasTag(key, val)));
}
boolean hasTagKey(OsmElement e, OsmElement multiPolyOuter, String key) {
return ((multiPolyOuter==null && e.hasTagKey(key)) || (multiPolyOuter!=null && multiPolyOuter.hasTagKey(key)));
}
// Small hack
public Paint look, look2, nodelook;
public void getWayPaints(OsmElement e, OsmElement multiPolyOuter) {
look = look2 = nodelook = null;
if (hasTag(e, multiPolyOuter, "natural", "water")) {
if (getLayer()==0) {
look = water;
}
} else if (hasTag(e, multiPolyOuter, "natural", "scrub") || hasTag(e, multiPolyOuter, "landuse", "forest") ||
hasTag(e, multiPolyOuter, "landuse", "grass") || hasTagKey(e, multiPolyOuter, "natural")) {
if (getLayer()==0) {
look = nature;
}
} else if (hasTagKey(e, multiPolyOuter, "building")) {
if (getLayer()==0) {
look = buildings;
look2 = buildings2;
}
} else if (hasTag(e, multiPolyOuter, "highway", "residential") ||
hasTag(e, multiPolyOuter, "highway", "living_street") ||
hasTag(e, multiPolyOuter, "highway", "pedestrian")) {
if (getLayer()==1) {
look = waystroke;
} else if (getLayer()==2) {
if (e.mIsArea) {
look = wayfill2;
} else {
look = waystroke2;
}
}
} else if (hasTag(e, multiPolyOuter, "highway", "service")) {
if (getLayer()==1) {
look = service;
} else if (getLayer()==2) {
look = service2;
}
} else if (hasTag(e, multiPolyOuter, "highway", "secondary") || hasTag(e, multiPolyOuter, "highway", "primary") ||
hasTag(e, multiPolyOuter, "highway", "trunk") || hasTag(e, multiPolyOuter, "highway", "motorway")) {
if (getLayer()==1) {
look = waystrokesec;
} else if (getLayer()==2) {
look = waystrokesec2;
}
} else if (hasTag(e, multiPolyOuter, "highway", "tertiary") || hasTag(e, multiPolyOuter, "highway", "unclassified")) {
if (getLayer()==1) {
look = waystroketert;
} else if (getLayer()==2) {
look = waystroketert2;
}
} else if (hasTag(e, multiPolyOuter, "highway", "path") || hasTag(e, multiPolyOuter, "highway", "cycleway") ||
hasTag(e, multiPolyOuter, "highway", "footway")) {
if (getLayer()==1) {
look = path;
}
} else if (hasTag(e, multiPolyOuter, "railway", "rail")) {
if (getLayer()==1) {
look = rail;
} else if (getLayer()==1) {
look = rail2;
}
} else if (hasTag(e, multiPolyOuter, "highway", "track")) {
if (getLayer()==1) {
look = track;
}
} else if (multiPolyOuter==null) {
if (getLayer()==1) {
look = waystroke_undef;
nodelook = paint;
}
}
}
}