ExtrusionStyle: add StyleBuilder interface
This commit is contained in:
parent
e9bb7aaae4
commit
02db7ca08d
@ -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) {
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user