From d73569f946220be2306fb51085e6e50fb52b21b3 Mon Sep 17 00:00:00 2001 From: Victor Shcherb Date: Fri, 24 Oct 2014 11:24:59 +0200 Subject: [PATCH] Add rendering attribute support as parameter --- .../net/osmand/binary/BinaryInspector.java | 6 +-- .../src/net/osmand/render/RenderingRule.java | 26 ++++++++--- .../render/RenderingRuleSearchRequest.java | 19 +++++--- .../osmand/render/RenderingRulesStorage.java | 43 ++++++++++--------- 4 files changed, 60 insertions(+), 34 deletions(-) diff --git a/OsmAnd-java/src/net/osmand/binary/BinaryInspector.java b/OsmAnd-java/src/net/osmand/binary/BinaryInspector.java index c7af5f2624..e8f437df18 100644 --- a/OsmAnd-java/src/net/osmand/binary/BinaryInspector.java +++ b/OsmAnd-java/src/net/osmand/binary/BinaryInspector.java @@ -61,13 +61,13 @@ public class BinaryInspector { if(args.length == 1 && "test".equals(args[0])) { in.inspector(new String[]{ //"-vpoi", - "-vmap", "-vmapobjects", +// "-vmap", "-vmapobjects", // "-vrouting", // "-vaddress", "-vcities", "-vstreets", "-vstreetgroups","-vbuildings", //"-zoom=16", //"-bbox=4,55,7,50", - "/home/victor/projects/osmand/osm-gen/Map.obf" -// "/home/victor/projects/osmand/osm-gen/Netherlands_europe.obf" +// "/home/victor/projects/osmand/osm-gen/Map.obf" + "/home/victor/projects/osmand/osm-gen/Ukraine_europe.obf" // "/home/victor/projects/osmand/osm-gen/World_basemap_2_b.obf___" // "/home/victor/projects/osmand/osm-gen/World_basemap_2.obf__" }); diff --git a/OsmAnd-java/src/net/osmand/render/RenderingRule.java b/OsmAnd-java/src/net/osmand/render/RenderingRule.java index f51c7e3759..74657b6f93 100644 --- a/OsmAnd-java/src/net/osmand/render/RenderingRule.java +++ b/OsmAnd-java/src/net/osmand/render/RenderingRule.java @@ -14,6 +14,7 @@ public class RenderingRule { private RenderingRuleProperty[] properties; private int[] intProperties; + private RenderingRule[] attributesRef; private float[] floatProperties; private List ifElseChildren; private List ifChildren; @@ -41,6 +42,7 @@ public class RenderingRule { ArrayList props = new ArrayList(attributes.size()); intProperties = new int[attributes.size()]; floatProperties = null; + attributesRef = null; int i = 0; Iterator> it = attributes.entrySet().iterator(); while (it.hasNext()) { @@ -48,18 +50,23 @@ public class RenderingRule { RenderingRuleProperty property = storage.PROPS.get(e.getKey()); if (property != null) { props.add(property); - - if (property.isString()) { - intProperties[i] = storage.getDictionaryValue(e.getValue()); + String vl = e.getValue(); + if(vl.startsWith("$")){ + if (attributesRef == null) { + attributesRef = new RenderingRule[attributes.size()]; + } + attributesRef[i] = storage.getRenderingAttributeRule(vl.substring(1)); + } else if (property.isString()) { + intProperties[i] = storage.getDictionaryValue(vl); } else if (property.isFloat()) { if (floatProperties == null) { // lazy creates floatProperties = new float[attributes.size()]; } - floatProperties[i] = property.parseFloatValue(e.getValue()); - intProperties[i] = property.parseIntValue(e.getValue()); + floatProperties[i] = property.parseFloatValue(vl); + intProperties[i] = property.parseIntValue(vl); } else { - intProperties[i] = property.parseIntValue(e.getValue()); + intProperties[i] = property.parseIntValue(vl); } i++; } @@ -114,6 +121,13 @@ public class RenderingRule { return intProperties[ind]; } + protected RenderingRule getAttrProp(int ind) { + if(attributesRef == null) { + return null; + } + return attributesRef[ind]; + } + protected float getFloatProp(int ind){ return floatProperties[ind]; } diff --git a/OsmAnd-java/src/net/osmand/render/RenderingRuleSearchRequest.java b/OsmAnd-java/src/net/osmand/render/RenderingRuleSearchRequest.java index 0f94db895f..56d04b461a 100644 --- a/OsmAnd-java/src/net/osmand/render/RenderingRuleSearchRequest.java +++ b/OsmAnd-java/src/net/osmand/render/RenderingRuleSearchRequest.java @@ -157,7 +157,7 @@ public class RenderingRuleSearchRequest { if(!input) { return false; } - if (!loadOutput) { + if (!loadOutput && !rule.isGroup()) { return true; } // accept it @@ -171,7 +171,8 @@ public class RenderingRuleSearchRequest { break; } } - if (match || !rule.isGroup()) { + boolean fit = (match || !rule.isGroup()); + if (fit && loadOutput) { if (rule.isGroup()) { loadOutputProperties(rule, false); } @@ -179,9 +180,8 @@ public class RenderingRuleSearchRequest { for (RenderingRule rr : rule.getIfChildren()) { visitRule(rr, loadOutput); } - return true; } - return false; + return fit; } @@ -191,7 +191,16 @@ public class RenderingRuleSearchRequest { RenderingRuleProperty rp = properties[i]; if (rp.isOutputProperty()) { if (!isSpecified(rp) || override) { - if (rp.isFloat()) { + RenderingRule rr = rule.getAttrProp(i); + if(rr != null) { + visitRule(rr, true); + if(isSpecified(storage.PROPS.R_ATTR_COLOR_VALUE)){ + values[rp.getId()] = getIntPropertyValue(storage.PROPS.R_ATTR_COLOR_VALUE); + } else if(isSpecified(storage.PROPS.R_ATTR_INT_VALUE)){ + values[rp.getId()] = getIntPropertyValue(storage.PROPS.R_ATTR_INT_VALUE); + fvalues[rp.getId()] = getFloatPropertyValue(storage.PROPS.R_ATTR_INT_VALUE); + } + } else if (rp.isFloat()) { fvalues[rp.getId()] = rule.getFloatProp(i); values[rp.getId()] = rule.getIntProp(i); } else { diff --git a/OsmAnd-java/src/net/osmand/render/RenderingRulesStorage.java b/OsmAnd-java/src/net/osmand/render/RenderingRulesStorage.java index 0625a5124b..9cb0422760 100644 --- a/OsmAnd-java/src/net/osmand/render/RenderingRulesStorage.java +++ b/OsmAnd-java/src/net/osmand/render/RenderingRulesStorage.java @@ -48,7 +48,7 @@ public class RenderingRulesStorage { public TIntObjectHashMap[] tagValueGlobalRules = new TIntObjectHashMap[LENGTH_RULES]; protected Map renderingAttributes = new LinkedHashMap(); - protected Map renderingConstants= new LinkedHashMap(); + protected Map renderingConstants = new LinkedHashMap(); private String renderingName; private String internalRenderingName; @@ -335,10 +335,13 @@ public class RenderingRulesStorage { String vl = parser.getAttributeValue(i); if (vl != null && vl.startsWith("$")) { String cv = vl.substring(1); - if (!renderingConstants.containsKey(cv)) { - throw new IllegalStateException("Rendering constant '" + cv + "' was not specified."); + if (!renderingConstants.containsKey(cv) && + !renderingAttributes.containsKey(cv)) { + throw new IllegalStateException("Rendering constant or attribute '" + cv + "' was not specified."); + } + if(renderingConstants.containsKey(cv)){ + vl = renderingConstants.get(cv); } - vl = renderingConstants.get(cv); } m.put(name, vl); } @@ -470,7 +473,7 @@ public class RenderingRulesStorage { }; storage.parseRulesFromXmlInputStream(is, resolver); - printAllRules(storage); +// printAllRules(storage); testSearch(storage); } @@ -479,22 +482,22 @@ public class RenderingRulesStorage { // int count = 100000; // for (int i = 0; i < count; i++) { RenderingRuleSearchRequest searchRequest = new RenderingRuleSearchRequest(storage); - searchRequest.setStringFilter(storage.PROPS.R_TAG, "natural"); - searchRequest.setStringFilter(storage.PROPS.R_VALUE, "tree"); - searchRequest.setStringFilter(storage.PROPS.R_ADDITIONAL, "leaf_type=broadleaved"); + searchRequest.setStringFilter(storage.PROPS.R_TAG, "highway"); + searchRequest.setStringFilter(storage.PROPS.R_VALUE, "primary"); +// searchRequest.setStringFilter(storage.PROPS.R_ADDITIONAL, "leaf_type=broadleaved"); // searchRequest.setIntFilter(storage.PROPS.R_LAYER, 1); - searchRequest.setIntFilter(storage.PROPS.R_MINZOOM, 18); - searchRequest.setIntFilter(storage.PROPS.R_MAXZOOM, 18); - // searchRequest.setBooleanFilter(storage.PROPS.R_NIGHT_MODE, true); - // searchRequest.setBooleanFilter(storage.PROPS.get("hmRendered"), true); - for (RenderingRuleProperty customProp : storage.PROPS.getCustomRules()) { - if (customProp.isBoolean()) { - searchRequest.setBooleanFilter(customProp, false); - } else { - searchRequest.setStringFilter(customProp, ""); - } - } - boolean res = searchRequest.search(POINT_RULES); + searchRequest.setIntFilter(storage.PROPS.R_MINZOOM, 9); + searchRequest.setIntFilter(storage.PROPS.R_MAXZOOM, 9); +// searchRequest.setBooleanFilter(storage.PROPS.R_NIGHT_MODE, true); +// for (RenderingRuleProperty customProp : storage.PROPS.getCustomRules()) { +// if (customProp.isBoolean()) { +// searchRequest.setBooleanFilter(customProp, false); +// } else { +// searchRequest.setStringFilter(customProp, ""); +// } +// } + searchRequest.setBooleanFilter(storage.PROPS.get("noPolygons"), true); + boolean res = searchRequest.search(LINE_RULES); System.out.println("Result " + res); printResult(searchRequest, System.out); // }