diff --git a/DataExtractionOSM/src/net/osmand/ToDoConstants.java b/DataExtractionOSM/src/net/osmand/ToDoConstants.java index b31011977d..6342e6a551 100644 --- a/DataExtractionOSM/src/net/osmand/ToDoConstants.java +++ b/DataExtractionOSM/src/net/osmand/ToDoConstants.java @@ -14,9 +14,10 @@ public class ToDoConstants { // POI index exclude building hno from categories!!! // Routing index !! // Identify coastline areas and pure ocean areas !!! - + // Extract & remove the code with multipolygons + // render different texts - + // FIXME layer and renderer 1) FIXME Layer 2 2) FIXME oneway 1 // TO try & to test diff --git a/DataExtractionOSM/src/net/osmand/binary/BinaryMapIndexReader.java b/DataExtractionOSM/src/net/osmand/binary/BinaryMapIndexReader.java index bfa2aadc90..2e095a5539 100644 --- a/DataExtractionOSM/src/net/osmand/binary/BinaryMapIndexReader.java +++ b/DataExtractionOSM/src/net/osmand/binary/BinaryMapIndexReader.java @@ -1326,9 +1326,9 @@ public class BinaryMapIndexReader { Map> encodingRules = new LinkedHashMap>(); TIntObjectMap decodingRules = new TIntObjectHashMap(); - int nameEncodingType = 0; - int refEncodingType = -1; - int coastlineEncodingType = 0; + public int nameEncodingType = 0; + public int refEncodingType = -1; + public int coastlineEncodingType = -1; public List getRoots() { return roots; diff --git a/OsmAnd/src/net/osmand/plus/render/MapRenderRepositories.java b/OsmAnd/src/net/osmand/plus/render/MapRenderRepositories.java index 42099adee9..bc1d6afa65 100644 --- a/OsmAnd/src/net/osmand/plus/render/MapRenderRepositories.java +++ b/OsmAnd/src/net/osmand/plus/render/MapRenderRepositories.java @@ -366,7 +366,7 @@ public class MapRenderRepositories { List res = c.searchMapIndex(searchRequest); for (BinaryMapDataObject r : res) { if (PerformanceFlags.checkForDuplicateObjectIds) { - if (ids.contains(r.getId())) { + if (ids.contains(r.getId()) && r.getId() > 0) { // do not add object twice continue; } @@ -375,10 +375,9 @@ public class MapRenderRepositories { count++; for (int i = 0; i < r.getTypes().length; i++) { - if ((r.getTypes()[i] & 0x3) == MapRenderingTypes.MULTY_POLYGON_TYPE) { + if (r.getTypes()[i] == r.getMapIndex().coastlineEncodingType) { // multy polygon r.getId() >> 3 - TagValuePair pair = r.getMapIndex().decodeType(MapRenderingTypes.getMainObjectType(r.getTypes()[i]), - MapRenderingTypes.getObjectSubType(r.getTypes()[i])); + TagValuePair pair = r.getMapIndex().decodeType(r.getTypes()[i]); if (pair != null) { pair = new TagValuePair(pair.tag, pair.value, r.getTypes()[i]); if (!multiPolygons.containsKey(pair)) { @@ -682,7 +681,6 @@ public class MapRenderRepositories { // delete direction last bit (to not show point) pl.setTag(type.tag); pl.setValue(type.value); - pl.setLayer(MapRenderingTypes.getNegativeWayLayer(type.additionalAttribute)); long dbId = 0; for (int km = 0; km < 2; km++) { List list = km == 0 ? directList : inverselist; diff --git a/OsmAnd/src/net/osmand/plus/render/OsmandRenderer.java b/OsmAnd/src/net/osmand/plus/render/OsmandRenderer.java index fa85a71e71..18d657c441 100644 --- a/OsmAnd/src/net/osmand/plus/render/OsmandRenderer.java +++ b/OsmAnd/src/net/osmand/plus/render/OsmandRenderer.java @@ -398,14 +398,22 @@ public class OsmandRenderer { for (int j = 0; j < o.getTypes().length; j++) { // put(orderMap, BinaryMapDataObject.getOrder(o.getTypes()[j]), sh + j, init); int wholeType = o.getTypes()[j]; - int mask = wholeType & 3; + + int mask = MapRenderingTypes.POINT_TYPE; + if(o.getPointsLength() > 1) { + if(o.isArea()){ + mask = MapRenderingTypes.POLYGON_TYPE; + } else { + mask = MapRenderingTypes.POLYLINE_TYPE; + } + } int layer = 0; if (mask != MapRenderingTypes.POINT_TYPE) { - layer = MapRenderingTypes.getNegativeWayLayer(wholeType); + // FIXME Layer +// layer = MapRenderingTypes.getNegativeWayLayer(wholeType); } - TagValuePair pair = o.getMapIndex().decodeType(MapRenderingTypes.getMainObjectType(wholeType), - MapRenderingTypes.getObjectSubType(wholeType)); + TagValuePair pair = o.getMapIndex().decodeType(wholeType); if (pair != null) { render.setTagValueZoomLayer(pair.tag, pair.value, rc.zoom, layer); render.setIntFilter(render.ALL.R_ORDER_TYPE, mask); @@ -447,25 +455,17 @@ public class OsmandRenderer { } } else { int mainType = obj.getTypes()[l]; - int t = mainType & 3; - int type = MapRenderingTypes.getMainObjectType(mainType); - int subtype = MapRenderingTypes.getObjectSubType(mainType); - TagValuePair pair = obj.getMapIndex().decodeType(type, subtype); - if (t == MapRenderingTypes.POINT_TYPE && !drawOnlyShadow) { + TagValuePair pair = obj.getMapIndex().decodeType(mainType); + if (obj.getPointsLength() == 1 && !drawOnlyShadow) { drawPoint(obj, render, canvas, rc, pair, renderText); - } else if (t == MapRenderingTypes.POLYLINE_TYPE) { - int layer = MapRenderingTypes.getNegativeWayLayer(mainType); - drawPolyline(obj, render, canvas, rc, pair, layer, drawOnlyShadow); - } else if (t == MapRenderingTypes.POLYGON_TYPE && !drawOnlyShadow) { + } else if (!obj.isArea()) { + // FIXME Layer + // int layer = MapRenderingTypes.getNegativeWayLayer(mainType); + drawPolyline(obj, render, canvas, rc, pair, 0, drawOnlyShadow); + } else if (obj.isArea() && !drawOnlyShadow) { drawPolygon(obj, render, canvas, rc, pair); - } else { - if (t == MapRenderingTypes.MULTY_POLYGON_TYPE && !(obj instanceof MultyPolygon)) { - // log this situation - return; - } } } - } @@ -533,10 +533,7 @@ public class OsmandRenderer { } } if (cnt > 0) { - String name = ((MultyPolygon) obj).getName(i); - if (name != null) { - textRenderer.renderText(name, render, rc, new TagValuePair(tag, value), xText / cnt, yText / cnt, null, null); - } + textRenderer.renderText(obj, render, rc, new TagValuePair(tag, value, 0), xText / cnt, yText / cnt, null, null); } } canvas.drawPath(path, paint); @@ -587,10 +584,7 @@ public class OsmandRenderer { if (updatePaint(render, paint, 1, false, rc)) { canvas.drawPath(path, paint); } - String name = obj.getName(); - if(name != null){ - textRenderer.renderText(name, render, rc, pair, xText / len, yText / len, null, null); - } + textRenderer.renderText(obj, render, rc, pair, xText / len, yText / len, null, null); } } @@ -677,11 +671,7 @@ public class OsmandRenderer { render.search(RenderingRulesStorage.POINT_RULES); String resId = render.getStringPropertyValue(render.ALL.R_ICON); - String name = null; - if (renderText) { - name = obj.getName(); - } - if(resId == null && name == null){ + if(resId == null && !renderText){ return; } int len = obj.getPointsLength(); @@ -704,8 +694,8 @@ public class OsmandRenderer { ico.resId = resId; rc.iconsToDraw.add(ico); } - if (name != null && name.trim().length() > 0) { - textRenderer.renderText(name, render, rc, pair, ps.x, ps.y, null, null); + if (renderText) { + textRenderer.renderText(obj, render, rc, pair, ps.x, ps.y, null, null); } } @@ -749,9 +739,10 @@ public class OsmandRenderer { return; } boolean oneway = false; - if(rc.zoom >= 16 && "highway".equals(pair.tag) && MapRenderingTypes.isOneWayWay(obj.getHighwayAttributes())){ //$NON-NLS-1$ - oneway = true; - } + //FIXME oneway +// if(rc.zoom >= 16 && "highway".equals(pair.tag) && MapRenderingTypes.isOneWayWay(obj.getHighwayAttributes())){ //$NON-NLS-1$ +// oneway = true; +// } rc.visible++; @@ -760,7 +751,7 @@ public class OsmandRenderer { float yMid = 0; int middle = obj.getPointsLength() / 2; PointF[] textPoints = null; - if (!drawOnlyShadow && obj.getName() != null && obj.getName().length() > 0) { + if (!drawOnlyShadow) { textPoints = new PointF[length]; } @@ -805,7 +796,7 @@ public class OsmandRenderer { } } if (textPoints != null) { - textRenderer.renderText(obj.getName(), render, rc, pair, xMid, yMid, path, textPoints); + textRenderer.renderText(obj, render, rc, pair, xMid, yMid, path, textPoints); } } } diff --git a/OsmAnd/src/net/osmand/plus/render/TextRenderer.java b/OsmAnd/src/net/osmand/plus/render/TextRenderer.java index f82117c893..9eac271df4 100644 --- a/OsmAnd/src/net/osmand/plus/render/TextRenderer.java +++ b/OsmAnd/src/net/osmand/plus/render/TextRenderer.java @@ -5,8 +5,8 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import net.osmand.binary.BinaryMapDataObject; import net.osmand.binary.BinaryMapIndexReader.TagValuePair; -import net.osmand.osm.MapRenderingTypes; import net.osmand.plus.render.OsmandRenderer.RenderingContext; import net.osmand.render.RenderingRuleSearchRequest; import net.osmand.render.RenderingRulesStorage; @@ -206,12 +206,6 @@ public class TextRenderer { for (int i = 0; i < size; i++) { TextDrawInfo text = rc.textToDraw.get(i); if (text.text != null && text.text.length() > 0) { - int d = text.text.indexOf(MapRenderingTypes.DELIM_CHAR); - // not used now functionality - // possibly it will be used specifying english names after that character - if (d > 0) { - text.text = text.text.substring(0, d); - } if (useEnglishNames) { text.text = Junidecode.unidecode(text.text); } @@ -329,22 +323,14 @@ public class TextRenderer { } } - public void renderText(String name, RenderingRuleSearchRequest render, RenderingContext rc, TagValuePair pair, + public void renderText(BinaryMapDataObject obj, RenderingRuleSearchRequest render, RenderingContext rc, TagValuePair pair, float xMid, float yMid, Path path, PointF[] points) { + // TODO other render text String ref = null; - if(name.charAt(0) == MapRenderingTypes.REF_CHAR){ - ref = name.substring(1); - name = ""; //$NON-NLS-1$ - for(int k = 0; k < ref.length(); k++){ - if(ref.charAt(k) == MapRenderingTypes.REF_CHAR){ - if(k < ref.length() - 1){ - name = ref.substring(k + 1); - } - ref = ref.substring(0, k); - break; - } - } + if(obj.getMapIndex().refEncodingType >= 0 ) { + ref = obj.getObjectNames().get(obj.getMapIndex().refEncodingType); } + String name = obj.getObjectNames().get(obj.getMapIndex().nameEncodingType); if(ref != null && ref.trim().length() > 0){ createTextDrawInfo(render, rc, pair, xMid, yMid, path, points, ref, true); }