diff --git a/src/org/oscim/theme/RenderTheme.java b/src/org/oscim/theme/RenderTheme.java index 9f275f1a..293cc3e2 100644 --- a/src/org/oscim/theme/RenderTheme.java +++ b/src/org/oscim/theme/RenderTheme.java @@ -215,28 +215,25 @@ public class RenderTheme implements IRenderTheme { matches.clear(); if (element.type == GeometryType.LINE) { - for (int i = 0, n = mRules.length; i < n; i++) - mRules[i].matchWay(element.tags, - (byte) zoomLevel, Closed.NO, matches); + for (Rule rule : mRules) + rule.matchWay(element.tags, zoomMask, Closed.NO, matches); } else if (element.type == GeometryType.POLY) { - for (int i = 0, n = mRules.length; i < n; i++) - mRules[i].matchWay(element.tags, - (byte) zoomLevel, Closed.YES, matches); + for (Rule rule : mRules) + rule.matchWay(element.tags, zoomMask, Closed.YES, matches); } else { - for (int i = 0, n = mRules.length; i < n; i++) - mRules[i].matchNode(element.tags, - (byte) zoomLevel, matches); + for (Rule rule : mRules) + rule.matchNode(element.tags, zoomMask, matches); } int size = matches.size(); - if (size > 1){ - for (int i = 0; i < size-1; i++){ + if (size > 1) { + for (int i = 0; i < size - 1; i++) { RenderInstruction r = matches.get(i); - for (int j = i + 1; j < size; j++){ - if (matches.get(j) == r){ + for (int j = i + 1; j < size; j++) { + if (matches.get(j) == r) { Log.d(TAG, "fix duplicate instruction! " + Arrays.deepToString(element.tags) - + ":"+ zoomLevel); + + ":" + zoomLevel); matches.remove(j--); size--; } @@ -309,7 +306,6 @@ public class RenderTheme implements IRenderTheme { return ri.list; } - void complete(List rulesList, int levels) { mLevels = levels; diff --git a/src/org/oscim/theme/rule/Closed.java b/src/org/oscim/theme/rule/Closed.java index 0aaa0014..f2499b6c 100644 --- a/src/org/oscim/theme/rule/Closed.java +++ b/src/org/oscim/theme/rule/Closed.java @@ -1,5 +1,6 @@ /* * Copyright 2010, 2011, 2012 mapsforge.org + * Copyright 2013 Hannes Janetzek * * This program is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free Software @@ -15,7 +16,8 @@ package org.oscim.theme.rule; public final class Closed { - public static final int ANY = 0; - public static final int NO = 1; - public static final int YES = 2; + public static final int NO = 1 << 0; + public static final int YES = 1 << 1; + public static final int ANY = NO | YES; + } diff --git a/src/org/oscim/theme/rule/Element.java b/src/org/oscim/theme/rule/Element.java index d3524866..bfcf8988 100644 --- a/src/org/oscim/theme/rule/Element.java +++ b/src/org/oscim/theme/rule/Element.java @@ -1,5 +1,6 @@ /* * Copyright 2010, 2011, 2012 mapsforge.org + * Copyright 2013 Hannes Janetzek * * This program is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free Software @@ -15,7 +16,7 @@ package org.oscim.theme.rule; final class Element { - public static final int ANY = 0; - public static final int NODE = 1; - public static final int WAY = 2; + public static final int NODE = 1 << 0; + public static final int WAY = 1 << 1; + public static final int ANY = NODE | WAY; } diff --git a/src/org/oscim/theme/rule/NegativeRule.java b/src/org/oscim/theme/rule/NegativeRule.java index bac3241a..7a68c8a3 100644 --- a/src/org/oscim/theme/rule/NegativeRule.java +++ b/src/org/oscim/theme/rule/NegativeRule.java @@ -19,9 +19,9 @@ import org.oscim.core.Tag; class NegativeRule extends Rule { final AttributeMatcher mAttributeMatcher; - NegativeRule(int element, int closed, byte zoomMin, byte zoomMax, + NegativeRule(int element, int closed, int zoom, AttributeMatcher attributeMatcher) { - super(element, closed, zoomMin, zoomMax); + super(element, closed, zoom); mAttributeMatcher = attributeMatcher; } diff --git a/src/org/oscim/theme/rule/PositiveRule.java b/src/org/oscim/theme/rule/PositiveRule.java index 05dd10d4..a5e64798 100644 --- a/src/org/oscim/theme/rule/PositiveRule.java +++ b/src/org/oscim/theme/rule/PositiveRule.java @@ -20,9 +20,9 @@ class PositiveRule extends Rule { final AttributeMatcher mKeyMatcher; final AttributeMatcher mValueMatcher; - PositiveRule(int element, int closed, byte zoomMin, byte zoomMax, + PositiveRule(int element, int closed, int zoom, AttributeMatcher keyMatcher, AttributeMatcher valueMatcher) { - super(element, closed, zoomMin, zoomMax); + super(element, closed, zoom); if (keyMatcher instanceof AnyMatcher) mKeyMatcher = null; diff --git a/src/org/oscim/theme/rule/Rule.java b/src/org/oscim/theme/rule/Rule.java index b252a2f7..ee1ade1c 100644 --- a/src/org/oscim/theme/rule/Rule.java +++ b/src/org/oscim/theme/rule/Rule.java @@ -45,18 +45,23 @@ public abstract class Rule { List valueList = new ArrayList(Arrays.asList(SPLIT_PATTERN .split(values))); + int zoom = 0; + for (int z = zoomMin; z <= zoomMax && z < 32; z++) + zoom |= (1 << z); + if (valueList.remove(STRING_NEGATION)) { AttributeMatcher attributeMatcher = new NegativeMatcher(keyList, valueList, false); - return new NegativeRule(element, closed, zoomMin, zoomMax, + return new NegativeRule(element, closed, zoom, attributeMatcher); } + + if (valueList.remove(STRING_EXCLUSIVE)) { AttributeMatcher attributeMatcher = new NegativeMatcher(keyList, valueList, true); - return new NegativeRule(element, closed, zoomMin, zoomMax, - attributeMatcher); + return new NegativeRule(element, closed, zoom, attributeMatcher); } AttributeMatcher keyMatcher = getKeyMatcher(keyList); AttributeMatcher valueMatcher = getValueMatcher(valueList); @@ -64,7 +69,7 @@ public abstract class Rule { keyMatcher = RuleOptimizer.optimize(keyMatcher, ruleStack); valueMatcher = RuleOptimizer.optimize(valueMatcher, ruleStack); - return new PositiveRule(element, closed, zoomMin, zoomMax, + return new PositiveRule(element, closed, zoom, keyMatcher, valueMatcher); } @@ -169,17 +174,15 @@ public abstract class Rule { private Rule[] mSubRuleArray; private RenderInstruction[] mRenderInstructionArray; - final byte mZoomMax; - final byte mZoomMin; + final int mZoom; final int mElement; final int mClosed; - Rule(int element, int closed, byte zoomMin, byte zoomMax) { + Rule(int element, int closed, int zoom) { mClosed = closed; mElement = element; - mZoomMin = zoomMin; - mZoomMax = zoomMax; + mZoom = zoom; mRenderInstructions = new ArrayList(4); mSubRules = new ArrayList(4); @@ -197,11 +200,10 @@ public abstract class Rule { abstract boolean matchesWay(Tag[] tags); - public void matchNode(Tag[] tags, byte zoomLevel, + public void matchNode(Tag[] tags, int zoomLevel, List matchingList) { - if ((mElement != Element.WAY) - && mZoomMin <= zoomLevel - && mZoomMax >= zoomLevel + if (((mElement & Element.NODE) != 0) + && ((mZoom & zoomLevel) != 0) && matchesNode(tags)) { for (int i = 0, n = mRenderInstructionArray.length; i < n; i++) @@ -213,23 +215,21 @@ public abstract class Rule { } } - public void matchWay(Tag[] tags, byte zoomLevel, + public void matchWay(Tag[] tags, int zoomLevel, int closed, List matchingList) { - if ((mElement != Element.NODE) - && mZoomMin <= zoomLevel - && mZoomMax >= zoomLevel - && (mClosed == closed || mClosed == Closed.ANY) + if (((mElement & Element.WAY) != 0) + && ((mZoom & zoomLevel) != 0) + && ((mClosed & closed) != 0) && (matchesWay(tags))) { // add instructions for this rule - for (int i = 0, n = mRenderInstructionArray.length; i < n; i++) - matchingList.add(mRenderInstructionArray[i]); + for (RenderInstruction ri : mRenderInstructionArray) + matchingList.add(ri); // check subrules - for (int i = 0, n = mSubRuleArray.length; i < n; i++) - mSubRuleArray[i].matchWay(tags, zoomLevel, closed, - matchingList); + for (Rule subRule : mSubRuleArray) + subRule.matchWay(tags, zoomLevel, closed, matchingList); } }