cleanups: theme/rule:

- rename destroy -> dispose
- use EMPTY_RULES array to avoid null checks
- squash: RuleVisitor
This commit is contained in:
Hannes Janetzek 2014-03-13 01:59:31 +01:00
parent b879830045
commit 14e5e28998
4 changed files with 54 additions and 41 deletions

View File

@ -24,6 +24,7 @@ import org.oscim.core.GeometryBuffer.GeometryType;
import org.oscim.core.TagSet; import org.oscim.core.TagSet;
import org.oscim.theme.rule.Element; import org.oscim.theme.rule.Element;
import org.oscim.theme.rule.Rule; import org.oscim.theme.rule.Rule;
import org.oscim.theme.rule.Rule.RuleVisitor;
import org.oscim.theme.styles.RenderStyle; import org.oscim.theme.styles.RenderStyle;
import org.oscim.utils.LRUCache; import org.oscim.utils.LRUCache;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -93,7 +94,7 @@ public class RenderTheme implements IRenderTheme {
mStyleCache[i].cache.clear(); mStyleCache[i].cache.clear();
for (Rule rule : mRules) for (Rule rule : mRules)
rule.onDestroy(); rule.dispose();
} }
@Override @Override
@ -259,4 +260,10 @@ public class RenderTheme implements IRenderTheme {
for (Rule rule : mRules) for (Rule rule : mRules)
rule.updateStyles(); rule.updateStyles();
} }
public void traverseRules(RuleVisitor visitor) {
for (Rule rule : mRules)
rule.apply(visitor);
}
} }

View File

@ -22,9 +22,11 @@ import org.oscim.core.Tag;
import org.oscim.theme.styles.RenderStyle; import org.oscim.theme.styles.RenderStyle;
public abstract class Rule { public abstract class Rule {
public final static RenderStyle[] EMPTY_STYLE = new RenderStyle[0];
public final static Rule[] EMPTY_RULES = new Rule[0];
private final Rule[] subRules; private final Rule[] subRules;
private final RenderStyle[] styles; public final RenderStyle[] styles;
private final int zoom; private final int zoom;
private final int element; private final int element;
@ -34,8 +36,9 @@ public abstract class Rule {
Rule(int element, int zoom, int selector, Rule[] subRules, RenderStyle[] styles) { Rule(int element, int zoom, int selector, Rule[] subRules, RenderStyle[] styles) {
this.element = element; this.element = element;
this.zoom = zoom; this.zoom = zoom;
this.subRules = subRules;
this.styles = styles; this.subRules = (subRules == null) ? EMPTY_RULES : subRules;
this.styles = (styles == null) ? EMPTY_STYLE : styles;
selectFirstMatch = (selector & Selector.FIRST) != 0; selectFirstMatch = (selector & Selector.FIRST) != 0;
selectWhenMatched = (selector & Selector.WHEN_MATCHED) != 0; selectWhenMatched = (selector & Selector.WHEN_MATCHED) != 0;
@ -48,7 +51,7 @@ public abstract class Rule {
if (((element & type) != 0) && ((zoom & zoomLevel) != 0) && (matchesTags(tags))) { if (((element & type) != 0) && ((zoom & zoomLevel) != 0) && (matchesTags(tags))) {
boolean matched = false; boolean matched = false;
if (subRules != null) { if (subRules != EMPTY_RULES) {
if (selectFirstMatch) { if (selectFirstMatch) {
/* only add first matching rule and when-matched rules iff a /* only add first matching rule and when-matched rules iff a
* previous rule matched */ * previous rule matched */
@ -73,7 +76,7 @@ public abstract class Rule {
} }
} }
if (styles == null) if (styles == EMPTY_STYLE)
/* matched if styles where added */ /* matched if styles where added */
return matched; return matched;
@ -89,59 +92,62 @@ public abstract class Rule {
return false; return false;
} }
public void onDestroy() { public void dispose() {
if (styles != null) for (RenderStyle ri : styles)
for (RenderStyle ri : styles) ri.dispose();
ri.destroy();
if (subRules != null) for (Rule subRule : subRules)
for (Rule subRule : subRules) subRule.dispose();
subRule.onDestroy();
} }
public void scaleTextSize(float scaleFactor) { public void scaleTextSize(float scaleFactor) {
if (styles != null) for (RenderStyle ri : styles)
for (RenderStyle ri : styles) ri.scaleTextSize(scaleFactor);
ri.scaleTextSize(scaleFactor);
if (subRules != null) for (Rule subRule : subRules)
for (Rule subRule : subRules) subRule.scaleTextSize(scaleFactor);
subRule.scaleTextSize(scaleFactor);
} }
public void updateStyles() { public void updateStyles() {
if (styles != null) for (RenderStyle ri : styles)
for (RenderStyle ri : styles) ri.update();
ri.update();
if (subRules != null) for (Rule subRule : subRules)
for (Rule subRule : subRules) subRule.updateStyles();
subRule.updateStyles();
} }
public static class RuleVisitor { public static class RuleVisitor {
boolean apply(Rule r) { public void apply(Rule r) {
if (r.subRules != null) for (Rule subRule : r.subRules)
for (Rule subRule : r.subRules) this.apply(subRule);
this.apply(subRule); }
}
return true; public static class TextSizeVisitor extends RuleVisitor {
float scaleFactor = 1;
public void setScaleFactor(float scaleFactor) {
this.scaleFactor = scaleFactor;
}
@Override
public void apply(Rule r) {
for (RenderStyle ri : r.styles)
ri.scaleTextSize(scaleFactor);
super.apply(r);
} }
} }
public static class UpdateVisitor extends RuleVisitor { public static class UpdateVisitor extends RuleVisitor {
@Override @Override
boolean apply(Rule r) { public void apply(Rule r) {
if (r.styles != null) for (RenderStyle ri : r.styles)
for (RenderStyle ri : r.styles) ri.update();
ri.update(); super.apply(r);
return super.apply(r);
} }
} }
public boolean apply(RuleVisitor v) { public void apply(RuleVisitor v) {
v.apply(this);
return v.apply(this);
} }
} }

View File

@ -41,7 +41,7 @@ public abstract class RenderStyle {
/** /**
* Destroys this RenderInstruction and cleans up all its internal resources. * Destroys this RenderInstruction and cleans up all its internal resources.
*/ */
public void destroy() { public void dispose() {
} }
/** /**

View File

@ -32,7 +32,7 @@ public final class Symbol extends RenderStyle {
} }
@Override @Override
public void destroy() { public void dispose() {
} }
@Override @Override