diff --git a/vtm/src/org/oscim/theme/XmlThemeBuilder.java b/vtm/src/org/oscim/theme/XmlThemeBuilder.java index 1cc31d23..7d8794e3 100644 --- a/vtm/src/org/oscim/theme/XmlThemeBuilder.java +++ b/vtm/src/org/oscim/theme/XmlThemeBuilder.java @@ -41,6 +41,7 @@ import org.oscim.theme.styles.AreaStyle.AreaBuilder; import org.oscim.theme.styles.CircleStyle; import org.oscim.theme.styles.CircleStyle.CircleBuilder; import org.oscim.theme.styles.ExtrusionStyle; +import org.oscim.theme.styles.ExtrusionStyle.ExtrusionBuilder; import org.oscim.theme.styles.LineStyle; import org.oscim.theme.styles.LineStyle.LineBuilder; import org.oscim.theme.styles.RenderStyle; @@ -124,6 +125,7 @@ public class XmlThemeBuilder extends DefaultHandler { private final AreaBuilder mAreaBuilder = AreaStyle.builder(); private final CircleBuilder mCircleBuilder = CircleStyle.builder(); + private final ExtrusionBuilder mExtrusionBuilder = ExtrusionStyle.builder(); private final LineBuilder mLineBuilder = LineStyle.builder(); private final SymbolBuilder mSymbolBuilder = SymbolStyle.builder(); private final TextBuilder mTextBuilder = TextStyle.builder(); @@ -1028,37 +1030,33 @@ public class XmlThemeBuilder extends DefaultHandler { } private ExtrusionStyle createExtrusion(String elementName, Attributes attributes, int level) { - String cat = null; - int colorSide = 0; - int colorTop = 0; - int colorLine = 0; - int defaultHeight = 0; + ExtrusionBuilder b = mExtrusionBuilder.reset(); + b.level(level); for (int i = 0; i < attributes.getLength(); ++i) { String name = attributes.getLocalName(i); String value = attributes.getValue(i); if ("cat".equals(name)) - cat = value; + b.cat(value); else if ("side-color".equals(name)) - colorSide = Color.parseColor(value); + b.colorSide(Color.parseColor(value)); else if ("top-color".equals(name)) - colorTop = Color.parseColor(value); + b.colorTop(Color.parseColor(value)); else if ("line-color".equals(name)) - colorLine = Color.parseColor(value); + b.colorLine(Color.parseColor(value)); else if ("default-height".equals(name)) - defaultHeight = Integer.parseInt(value); + b.defaultHeight(Integer.parseInt(value)); else logUnknownAttribute(elementName, name, value, i); } - return new ExtrusionStyle(level, colorSide, colorTop, colorLine, defaultHeight) - .setCat(cat); + return b.build(); } private String getStringAttribute(Attributes attributes, String name) { diff --git a/vtm/src/org/oscim/theme/styles/ExtrusionStyle.java b/vtm/src/org/oscim/theme/styles/ExtrusionStyle.java index a5d666aa..87eeba4e 100644 --- a/vtm/src/org/oscim/theme/styles/ExtrusionStyle.java +++ b/vtm/src/org/oscim/theme/styles/ExtrusionStyle.java @@ -19,54 +19,152 @@ package org.oscim.theme.styles; import org.oscim.backend.canvas.Color; +import static org.oscim.backend.canvas.Color.parseColor; + public class ExtrusionStyle extends RenderStyle { - public ExtrusionStyle(int level, int colorSides, int colorTop, int colorLine, int defaultHeight) { + public final int colorLine; + public final int colorSide; + public final int colorTop; + public final int defaultHeight; + private final int level; + public final float[] colors; + + public ExtrusionStyle(int level, int colorSide, int colorTop, int colorLine, int defaultHeight) { + this.level = level; + + this.colorSide = colorSide; + this.colorTop = colorTop; + this.colorLine = colorLine; this.colors = new float[16]; - fillColors(colorSides, colorTop, colorLine, colors); + fillColors(colorSide, colorTop, colorLine, colors); this.defaultHeight = defaultHeight; - this.level = level; } - public static void fillColors(int sides, int top, int lines, float[] colors) { + public ExtrusionStyle(ExtrusionBuilder b) { + this.level = b.level; + + this.colorSide = b.colorSide; + this.colorTop = b.colorTop; + this.colorLine = b.colorLine; + this.colors = new float[16]; + fillColors(colorSide, colorTop, colorLine, colors); + + this.defaultHeight = b.defaultHeight; + } + + public static void fillColors(int side, int top, int line, float[] colors) { float a = Color.aToFloat(top); colors[0] = a * Color.rToFloat(top); colors[1] = a * Color.gToFloat(top); colors[2] = a * Color.bToFloat(top); colors[3] = a; - a = Color.aToFloat(sides); - colors[4] = a * Color.rToFloat(sides); - colors[5] = a * Color.gToFloat(sides); - colors[6] = a * Color.bToFloat(sides); + a = Color.aToFloat(side); + colors[4] = a * Color.rToFloat(side); + colors[5] = a * Color.gToFloat(side); + colors[6] = a * Color.bToFloat(side); colors[7] = a; - a = Color.aToFloat(sides); - colors[8] = a * Color.rToFloat(sides); - colors[9] = a * Color.gToFloat(sides); - colors[10] = a * Color.bToFloat(sides); + a = Color.aToFloat(side); + colors[8] = a * Color.rToFloat(side); + colors[9] = a * Color.gToFloat(side); + colors[10] = a * Color.bToFloat(side); colors[11] = a; - a = Color.aToFloat(lines); - colors[12] = a * Color.rToFloat(lines); - colors[13] = a * Color.gToFloat(lines); - colors[14] = a * Color.bToFloat(lines); + a = Color.aToFloat(line); + colors[12] = a * Color.rToFloat(line); + colors[13] = a * Color.gToFloat(line); + colors[14] = a * Color.bToFloat(line); colors[15] = a; } - @Override - public void renderWay(Callback cb) { - cb.renderExtrusion(this, this.level); - } - @Override public ExtrusionStyle current() { return (ExtrusionStyle) mCurrent; } - private final int level; - public final float[] colors; - public final int defaultHeight; + @Override + public void renderWay(Callback cb) { + cb.renderExtrusion(this, this.level); + } + + public static class ExtrusionBuilder> extends StyleBuilder { + + public int colorSide; + public int colorTop; + public int colorLine; + public int defaultHeight; + + public ExtrusionBuilder() { + } + + public T set(ExtrusionStyle extrusion) { + if (extrusion == null) + return reset(); + + this.level = extrusion.level; + this.colorSide = extrusion.colorSide; + this.colorTop = extrusion.colorTop; + this.colorLine = extrusion.colorLine; + this.defaultHeight = extrusion.defaultHeight; + + return self(); + } + + public T colorSide(int colorSide) { + this.colorSide = colorSide; + return self(); + } + + public T colorSide(String colorSide) { + this.colorSide = parseColor(colorSide); + return self(); + } + + public T colorTop(int colorTop) { + this.colorTop = colorTop; + return self(); + } + + public T colorTop(String colorTop) { + this.colorTop = parseColor(colorTop); + return self(); + } + + public T colorLine(int colorLine) { + this.colorLine = colorLine; + return self(); + } + + public T colorLine(String colorLine) { + this.colorLine = parseColor(colorLine); + return self(); + } + + public T defaultHeight(int defaultHeight) { + this.defaultHeight = defaultHeight; + return self(); + } + + public T reset() { + level = -1; + colorSide = Color.TRANSPARENT; + colorTop = Color.TRANSPARENT; + colorLine = Color.TRANSPARENT; + defaultHeight = 0; + return self(); + } + + public ExtrusionStyle build() { + return new ExtrusionStyle(this); + } + } + + @SuppressWarnings("rawtypes") + public static ExtrusionBuilder builder() { + return new ExtrusionBuilder(); + } }