update LineBuilder

This commit is contained in:
Hannes Janetzek 2014-03-17 22:01:03 +01:00
parent f80b4ee2b1
commit 4e473bf242
3 changed files with 146 additions and 132 deletions

View File

@ -758,9 +758,9 @@ public final class LineLayer extends RenderElement {
MercatorProjection.groundResolution(v.pos)); MercatorProjection.groundResolution(v.pos));
} }
if (line.fade < v.pos.zoomLevel) { if (line.fadeScale < v.pos.zoomLevel) {
GLUtils.setColor(uLineColor, line.color, 1); GLUtils.setColor(uLineColor, line.color, 1);
} else if (line.fade > v.pos.zoomLevel) { } else if (line.fadeScale > v.pos.zoomLevel) {
continue; continue;
} else { } else {
float alpha = (float) (scale > 1.2 ? scale : 1.2) - 1; float alpha = (float) (scale > 1.2 ? scale : 1.2) - 1;

View File

@ -17,6 +17,10 @@
*/ */
package org.oscim.theme; package org.oscim.theme;
import static java.lang.Boolean.parseBoolean;
import static java.lang.Float.parseFloat;
import static java.lang.Integer.parseInt;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
@ -42,6 +46,7 @@ import org.oscim.theme.styles.Area.AreaBuilder;
import org.oscim.theme.styles.Circle; import org.oscim.theme.styles.Circle;
import org.oscim.theme.styles.Extrusion; import org.oscim.theme.styles.Extrusion;
import org.oscim.theme.styles.Line; import org.oscim.theme.styles.Line;
import org.oscim.theme.styles.Line.LineBuilder;
import org.oscim.theme.styles.LineSymbol; import org.oscim.theme.styles.LineSymbol;
import org.oscim.theme.styles.RenderStyle; import org.oscim.theme.styles.RenderStyle;
import org.oscim.theme.styles.Symbol; import org.oscim.theme.styles.Symbol;
@ -129,6 +134,7 @@ public class XmlThemeBuilder extends DefaultHandler {
private final TextBuilder mTextBuilder = new TextBuilder(); private final TextBuilder mTextBuilder = new TextBuilder();
private final AreaBuilder mAreaBuilder = new AreaBuilder(); private final AreaBuilder mAreaBuilder = new AreaBuilder();
private final LineBuilder mLineBuilder = new LineBuilder();
private RuleBuilder mCurrentRule; private RuleBuilder mCurrentRule;
private TextureAtlas mTextureAtlas; private TextureAtlas mTextureAtlas;
@ -333,41 +339,16 @@ public class XmlThemeBuilder extends DefaultHandler {
*/ */
private Line createLine(Line line, String elementName, Attributes attributes, private Line createLine(Line line, String elementName, Attributes attributes,
int level, boolean isOutline) { int level, boolean isOutline) {
LineBuilder b = mLineBuilder.set(line);
// Style name b.isOutline(isOutline);
String style = null; b.level(level);
float width = 0;
Cap cap = Cap.ROUND;
// Extras
int fade = -1;
boolean fixed = false;
float blur = 0;
// Stipple
int stipple = 0;
float stippleWidth = 1;
int color = Color.TRANSPARENT;
int stippleColor = Color.BLACK;
if (line != null) {
color = line.color;
fixed = line.fixed;
fade = line.fadeScale;
cap = line.cap;
blur = line.blur;
stipple = line.stipple;
stippleColor = line.stippleColor;
stippleWidth = line.stippleWidth;
}
for (int i = 0; i < attributes.getLength(); ++i) { for (int i = 0; i < attributes.getLength(); ++i) {
String name = attributes.getLocalName(i); String name = attributes.getLocalName(i);
String value = attributes.getValue(i); String value = attributes.getValue(i);
if ("id".equals(name)) if ("id".equals(name))
style = value; b.style = value;
else if ("src".equals(name)) else if ("src".equals(name))
;// src = value; ;// src = value;
@ -379,34 +360,43 @@ public class XmlThemeBuilder extends DefaultHandler {
;// ignore ;// ignore
else if ("stroke".equals(name)) else if ("stroke".equals(name))
color = Color.parseColor(value); b.color(value);
else if ("width".equals(name) || "stroke-width".equals(name))
width = Float.parseFloat(value);
else if ("width".equals(name) || "stroke-width".equals(name)) {
float width = parseFloat(value);
if (line == null) {
validateNonNegative("width", width);
} else {
/* use stroke width relative to 'line' */
width += line.width;
if (width <= 0)
width = 1;
}
b.width = width;
}
else if ("cap".equals(name) || "stroke-linecap".equals(name)) else if ("cap".equals(name) || "stroke-linecap".equals(name))
cap = Cap.valueOf(value.toUpperCase()); b.cap = Cap.valueOf(value.toUpperCase());
else if ("fix".equals(name)) else if ("fix".equals(name))
fixed = Boolean.parseBoolean(value); b.fixed = parseBoolean(value);
else if ("stipple".equals(name)) else if ("stipple".equals(name))
stipple = Integer.parseInt(value); b.stipple = parseInt(value);
else if ("stipple-stroke".equals(name)) else if ("stipple-stroke".equals(name))
stippleColor = Color.parseColor(value); b.stippleColor(value);
else if ("stipple-width".equals(name)) else if ("stipple-width".equals(name))
stippleWidth = Float.parseFloat(value); b.stippleWidth = parseFloat(value);
else if ("fade".equals(name)) else if ("fade".equals(name))
fade = Integer.parseInt(value); b.fadeScale = Integer.parseInt(value);
else if ("min".equals(name)) else if ("min".equals(name))
; //min = Float.parseFloat(value); ; //min = Float.parseFloat(value);
else if ("blur".equals(name)) else if ("blur".equals(name))
blur = Float.parseFloat(value); b.blur = parseFloat(value);
else if ("style".equals(name)) else if ("style".equals(name))
; // ignore ; // ignore
@ -417,21 +407,7 @@ public class XmlThemeBuilder extends DefaultHandler {
else else
logUnknownAttribute(elementName, name, value, i); logUnknownAttribute(elementName, name, value, i);
} }
return b.build();
// inherit properties from 'line'
if (line != null) {
// use stroke width relative to 'line'
width = line.width + width;
if (width <= 0)
width = 1;
} else if (!isOutline) {
validateNonNegative("width", width);
}
return new Line(level, style, color, width, cap, fixed,
stipple, stippleColor, stippleWidth,
fade, blur, isOutline);
} }
private void handleAreaElement(String localName, Attributes attributes, boolean isStyle) private void handleAreaElement(String localName, Attributes attributes, boolean isStyle)

View File

@ -17,76 +17,22 @@
*/ */
package org.oscim.theme.styles; package org.oscim.theme.styles;
import static org.oscim.backend.canvas.Color.parseColor;
import org.oscim.backend.canvas.Color; import org.oscim.backend.canvas.Color;
import org.oscim.backend.canvas.Paint.Cap; import org.oscim.backend.canvas.Paint.Cap;
import org.oscim.theme.IRenderTheme.Callback; import org.oscim.theme.IRenderTheme.Callback;
/**
* Represents a polyline on the map.
*/
public final class Line extends RenderStyle { public final class Line extends RenderStyle {
public final static class LineBuilder {
public int level;
public String style;
public float width;
public int color;
public Cap cap;
public boolean outline;
public boolean fixed;
public int fade;
public float blur;
public int stipple;
public int stippleColor;
public float stippleWidth;
public LineBuilder set(Line line) {
this.level = line.level;
this.style = line.style;
this.width = line.width;
this.color = line.color;
this.cap = line.cap;
this.outline = line.outline;
this.fixed = line.fixed;
this.fade = line.fade;
this.blur = line.blur;
this.stipple = line.stipple;
this.stippleColor = line.stippleColor;
this.stippleWidth = line.stippleWidth;
return this;
}
public LineBuilder setColor(int color) {
this.color = color;
return this;
}
public LineBuilder setStippleColor(int color) {
this.stippleColor = color;
return this;
}
public LineBuilder setColor(String color) {
this.color = Color.parseColor(color);
return this;
}
public Line build() {
return new Line(this);
}
}
final int level; final int level;
public final String style; public final String style;
public final float width; public final float width;
public final int color; public final int color;
public final Cap cap; public final Cap cap;
public final boolean outline; public final boolean outline;
public final boolean fixed; public final boolean fixed;
public final int fade; public final int fadeScale;
public final float blur; public final float blur;
public final int stipple; public final int stipple;
@ -101,7 +47,7 @@ public final class Line extends RenderStyle {
this.cap = builer.cap; this.cap = builer.cap;
this.outline = builer.outline; this.outline = builer.outline;
this.fixed = builer.fixed; this.fixed = builer.fixed;
this.fade = builer.fade; this.fadeScale = builer.fadeScale;
this.blur = builer.blur; this.blur = builer.blur;
this.stipple = builer.stipple; this.stipple = builer.stipple;
this.stippleColor = builer.stippleColor; this.stippleColor = builer.stippleColor;
@ -111,27 +57,12 @@ public final class Line extends RenderStyle {
public Line(int level, String style, int color, float width, public Line(int level, String style, int color, float width,
Cap cap, boolean fixed, Cap cap, boolean fixed,
int stipple, int stippleColor, float stippleWidth, int stipple, int stippleColor, float stippleWidth,
int fade, float blur, boolean isOutline) { int fadeScale, float blur, boolean isOutline) {
this.level = level; this.level = level;
this.style = style; this.style = style;
this.outline = isOutline; this.outline = isOutline;
// paint = new Paint(Paint.ANTI_ALIAS_FLAG);
//
// if (src != null) {
// Shader shader = BitmapUtils.createBitmapShader(src);
// paint.setShader(shader);
// }
//
// paint.setStyle(Style.STROKE);
// paint.setColor(stroke);
// if (strokeDasharray != null) {
// paint.setPathEffect(new DashPathEffect(strokeDasharray, 0));
// }
//GlUtils.changeSaturation(color, 1.02f);
this.cap = cap; this.cap = cap;
this.color = color; this.color = color;
this.width = width; this.width = width;
@ -142,7 +73,7 @@ public final class Line extends RenderStyle {
this.stippleWidth = stippleWidth; this.stippleWidth = stippleWidth;
this.blur = blur; this.blur = blur;
this.fade = fade; this.fadeScale = fadeScale;
} }
public Line(int stroke, float width) { public Line(int stroke, float width) {
@ -161,4 +92,111 @@ public final class Line extends RenderStyle {
public void renderWay(Callback renderCallback) { public void renderWay(Callback renderCallback) {
renderCallback.renderWay(this, level); renderCallback.renderWay(this, level);
} }
public final static class LineBuilder {
public int level;
public String style;
public float width;
public int color;
public Cap cap;
public boolean outline;
public boolean fixed;
public int fadeScale;
public float blur;
public int stipple;
public int stippleColor;
public float stippleWidth;
public LineBuilder set(Line line) {
if (line == null)
return reset();
this.level = line.level;
this.style = line.style;
this.width = line.width;
this.color = line.color;
this.cap = line.cap;
this.outline = line.outline;
this.fixed = line.fixed;
this.fadeScale = line.fadeScale;
this.blur = line.blur;
this.stipple = line.stipple;
this.stippleColor = line.stippleColor;
this.stippleWidth = line.stippleWidth;
return this;
}
public LineBuilder reset() {
level = -1;
style = null;
color = Color.BLACK;
cap = Cap.ROUND;
width = 1;
fixed = false;
fadeScale = -1;
blur = 0;
stipple = 0;
stippleWidth = 1;
stippleColor = Color.BLACK;
return this;
}
public LineBuilder style(String name) {
this.style = name;
return this;
}
public LineBuilder level(int level) {
this.level = level;
return this;
}
public LineBuilder color(int color) {
this.color = color;
return this;
}
public LineBuilder width(float width) {
this.width = width;
return this;
}
public LineBuilder blur(float blur) {
this.blur = blur;
return this;
}
public LineBuilder fadeScale(int zoom) {
this.fadeScale = zoom;
return this;
}
public LineBuilder stippleColor(int color) {
this.stippleColor = color;
return this;
}
public LineBuilder color(String color) {
this.color = parseColor(color);
return this;
}
public LineBuilder stippleColor(String color) {
this.stippleColor = parseColor(color);
return this;
}
public LineBuilder isOutline(boolean outline) {
this.outline = outline;
return this;
}
public Line build() {
return new Line(this);
}
}
} }