move ThemeBuilder

This commit is contained in:
Hannes Janetzek 2014-03-31 15:23:08 +02:00
parent 120797fe96
commit dc70104676
3 changed files with 187 additions and 125 deletions

View File

@ -0,0 +1,126 @@
package org.oscim.test;
import java.util.ArrayList;
import java.util.Stack;
import org.oscim.theme.RenderTheme;
import org.oscim.theme.rule.Rule;
import org.oscim.theme.rule.Rule.Element;
import org.oscim.theme.rule.RuleBuilder;
import org.oscim.theme.rule.RuleBuilder.RuleType;
import org.oscim.theme.styles.AreaStyle.AreaBuilder;
import org.oscim.theme.styles.LineStyle.LineBuilder;
import org.oscim.theme.styles.RenderStyle;
import org.oscim.theme.styles.TextStyle.TextBuilder;
public class ThemeBuilder {
protected final ArrayList<RuleBuilder> mRulesList = new ArrayList<RuleBuilder>();
protected final Stack<RuleBuilder> mRuleStack = new Stack<RuleBuilder>();
protected int mLevels = 0;
protected int mMapBackground = 0xffffffff;
protected float mBaseTextSize = 1;
protected RuleBuilder mCurrentRule;
public RenderTheme build() {
int[] layer = new int[1];
Rule[] rules = new Rule[mRulesList.size()];
for (int i = 0, n = rules.length; i < n; i++)
rules[i] = mRulesList.get(i).onComplete(layer);
RenderTheme theme = new RenderTheme(mMapBackground, mBaseTextSize, rules, mLevels);
mRulesList.clear();
mRuleStack.clear();
return theme;
}
public ThemeBuilder pop() {
mRuleStack.pop();
if (mRuleStack.empty()) {
mRulesList.add(mCurrentRule);
} else {
mCurrentRule = mRuleStack.peek();
}
return this;
}
public ThemeBuilder push(RuleBuilder rule) {
if (!mRuleStack.empty())
mCurrentRule.addSubRule(rule);
mCurrentRule = rule;
mRuleStack.push(mCurrentRule);
return this;
}
public ThemeBuilder rules(RuleBuilder... rb) {
for (RuleBuilder r : rb) {
mRulesList.add(r);
}
return this;
}
public RuleBuilder pushParse(String keys, String values) {
return RuleBuilder.create(mRuleStack, keys, values)
.zoom(~0)
.element(Element.ANY);
}
public ThemeBuilder addStyle(RenderStyle style) {
mCurrentRule.addStyle(style);
return this;
}
protected void rules() {
};
public static LineBuilder line(int color, float width) {
return new LineBuilder()
.color(color)
.width(width);
}
public static AreaBuilder area(int color) {
return new AreaBuilder()
.color(color);
}
public static TextBuilder wayText(float size, int color) {
return new TextBuilder()
.setFontSize(size)
.setColor(color);
}
public static TextBuilder nodeText(float size, int color) {
return new TextBuilder()
.setFontSize(size)
.setColor(color)
.setCaption(true);
}
public static RuleBuilder matchKey(String key) {
return new RuleBuilder(RuleType.POSITIVE,
new String[] { key },
new String[] {});
}
public static RuleBuilder matchValue(String value) {
return new RuleBuilder(RuleType.POSITIVE,
new String[] {},
new String[] { value });
}
public static RuleBuilder matchKeyValue(String key, String value) {
return new RuleBuilder(RuleType.POSITIVE,
new String[] { key },
new String[] { value });
}
}

View File

@ -0,0 +1,61 @@
package org.oscim.test;
import org.oscim.backend.canvas.Color;
import org.oscim.backend.canvas.Paint.Cap;
import org.oscim.gdx.GdxMap;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.tile.vector.VectorTileLayer;
import org.oscim.layers.tile.vector.labeling.LabelLayer;
import org.oscim.theme.RenderTheme;
import org.oscim.tiling.source.oscimap4.OSciMap4TileSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ThemeBuilderTest extends GdxMap {
final Logger log = LoggerFactory.getLogger(MeshTest.class);
static class MyTheme extends ThemeBuilder {
public MyTheme() {
rules(
matchKeyValue("natural", "water")
.style(area(Color.BLUE)),
matchKeyValue("landuse", "forest")
.style(area(Color.GREEN)),
matchKeyValue("landuse", "residential")
.style(area(Color.LTGRAY)),
matchKey("highway")
.rules(matchValue("residential")
.style(line(Color.DKGRAY, 1.2f),
line(Color.WHITE, 1.1f)
.cap(Cap.ROUND)))
.style(line(Color.BLACK, 1)
.blur(0.5f)));
}
}
@Override
public void createLayers() {
VectorTileLayer l = mMap.setBaseMap(new OSciMap4TileSource());
RenderTheme t = new MyTheme().build();
mMap.setTheme(t);
//mMap.setTheme(VtmThemes.DEFAULT);
mMap.layers().add(new LabelLayer(mMap, l));
mMap.setMapPosition(53.08, 8.82, 1 << 17);
}
public static void main(String[] args) {
GdxMapApp.init();
GdxMapApp.run(new ThemeBuilderTest(), null, 400);
}
}

View File

@ -1,125 +0,0 @@
package org.oscim.theme;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Stack;
import org.oscim.core.GeometryBuffer.GeometryType;
import org.oscim.core.Tag;
import org.oscim.core.TagSet;
import org.oscim.theme.rule.Element;
import org.oscim.theme.rule.Rule;
import org.oscim.theme.rule.RuleBuilder;
import org.oscim.theme.rule.Selector;
import org.oscim.theme.rule.SingleKeyMatcher;
import org.oscim.theme.rule.SingleValueMatcher;
import org.oscim.theme.styles.AreaStyle;
import org.oscim.theme.styles.LineStyle;
import org.oscim.theme.styles.RenderStyle;
public class ThemeBuilder {
protected final ArrayList<RuleBuilder> mRulesList = new ArrayList<RuleBuilder>();
protected final Stack<RuleBuilder> mRuleStack = new Stack<RuleBuilder>();
protected int mLevels = 0;
protected int mMapBackground = 0xffffffff;
protected float mBaseTextSize = 1;
protected RuleBuilder mCurrentRule;
protected RenderTheme build() {
Rule[] rules = new Rule[mRulesList.size()];
for (int i = 0, n = rules.length; i < n; i++)
rules[i] = mRulesList.get(i).onComplete();
RenderTheme theme = new RenderTheme(mMapBackground, mBaseTextSize, rules, mLevels);
mRulesList.clear();
mRuleStack.clear();
return theme;
}
public ThemeBuilder pop() {
mRuleStack.pop();
if (mRuleStack.empty()) {
mRulesList.add(mCurrentRule);
} else {
mCurrentRule = mRuleStack.peek();
}
return this;
}
public ThemeBuilder push(RuleBuilder rule) {
if (!mRuleStack.empty())
mCurrentRule.addSubRule(rule);
mCurrentRule = rule;
mRuleStack.push(mCurrentRule);
return this;
}
public ThemeBuilder push(String key, String value) {
RuleBuilder b = new RuleBuilder(true, Element.ANY, ~0, 0,
key == null ? null : new SingleKeyMatcher(key),
value == null ? null : new SingleValueMatcher(value));
push(b);
return this;
}
public RuleBuilder pushParse(String keys, String values) {
return RuleBuilder.create(mRuleStack, keys, values)
.zoom(~0)
.element(Element.ANY);
}
public ThemeBuilder addStyle(RenderStyle style) {
mCurrentRule.addStyle(style);
return this;
}
public static void main(String[] args) {
ThemeBuilder b = new ThemeBuilder();
//b.pushParse("highway", "residential|primary|motorway")
b.push(RuleBuilder.get().select(Selector.FIRST))
.push("highway", null)
.addStyle(new LineStyle(1, 1, 1))
.pop()
.push(RuleBuilder.get().select(Selector.WHEN_MATCHED))
.addStyle(new AreaStyle(1, 1))
.pop()
.pop();
RenderTheme t = b.build();
TagSet tags = new TagSet(1);
RenderStyle[] styles;
tags.add(new Tag("ahighway", "residential"));
styles = t.matchElement(GeometryType.LINE, tags, 1);
System.out.println(Arrays.deepToString(styles));
// tags.clear();
// tags.add(new Tag("highway", "motorway"));
// styles = t.matchElement(GeometryType.LINE, tags, 1);
// out.println(styles);
//
// tags.clear();
// tags.add(new Tag("sup", "wup"));
// styles = t.matchElement(GeometryType.LINE, tags, 1);
// out.println(styles);
//
// tags.clear();
// tags.add(new Tag("highway", "motorway"));
// styles = t.matchElement(GeometryType.LINE, tags, 1);
// out.println(styles);
}
}