ExtrusionStyle: add StyleBuilder interface

This commit is contained in:
Emux 2016-12-11 11:40:57 +02:00
parent e9bb7aaae4
commit 02db7ca08d
2 changed files with 132 additions and 36 deletions

View File

@ -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) {

View File

@ -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<ExtrusionStyle> {
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<T extends ExtrusionBuilder<T>> extends StyleBuilder<T> {
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();
}
}