Render themes: "base-stroke-width", fix #422

This commit is contained in:
Emux 2017-10-03 19:23:18 +03:00
parent 67b911a7df
commit 1d7ece5a65
2 changed files with 28 additions and 20 deletions

View File

@ -71,6 +71,7 @@ import static java.lang.Float.parseFloat;
import static java.lang.Integer.parseInt; import static java.lang.Integer.parseInt;
public class XmlMapsforgeThemeBuilder extends DefaultHandler { public class XmlMapsforgeThemeBuilder extends DefaultHandler {
private static final Logger log = LoggerFactory.getLogger(XmlMapsforgeThemeBuilder.class); private static final Logger log = LoggerFactory.getLogger(XmlMapsforgeThemeBuilder.class);
private static final int RENDER_THEME_VERSION = 6; private static final int RENDER_THEME_VERSION = 6;
@ -150,6 +151,7 @@ public class XmlMapsforgeThemeBuilder extends DefaultHandler {
int mLevels = 0; int mLevels = 0;
int mMapBackground = 0xffffffff; int mMapBackground = 0xffffffff;
private float mStrokeScale = 1;
float mTextScale = 1; float mTextScale = 1;
final ThemeFile mTheme; final ThemeFile mTheme;
@ -282,7 +284,7 @@ public class XmlMapsforgeThemeBuilder extends DefaultHandler {
checkState(localName, Element.RENDERING_INSTRUCTION); checkState(localName, Element.RENDERING_INSTRUCTION);
handleLineElement(localName, attributes, false, false); handleLineElement(localName, attributes, false, false);
} else if ("pathText".equals(localName)) { } else if ("text".equals(localName) || "pathText".equals(localName)) {
checkState(localName, Element.RENDERING_INSTRUCTION); checkState(localName, Element.RENDERING_INSTRUCTION);
handleTextElement(localName, attributes, false, false); handleTextElement(localName, attributes, false, false);
@ -519,7 +521,7 @@ public class XmlMapsforgeThemeBuilder extends DefaultHandler {
b.color(value); b.color(value);
else if ("width".equals(name) || "stroke-width".equals(name)) { else if ("width".equals(name) || "stroke-width".equals(name)) {
b.strokeWidth = parseFloat(value) * mScale2; b.strokeWidth = parseFloat(value) * mScale2 * mStrokeScale;
if (line == null) { if (line == null) {
if (!isOutline) if (!isOutline)
validateNonNegative("width", b.strokeWidth); validateNonNegative("width", b.strokeWidth);
@ -536,7 +538,7 @@ public class XmlMapsforgeThemeBuilder extends DefaultHandler {
b.fixed = parseBoolean(value); b.fixed = parseBoolean(value);
else if ("stipple".equals(name)) else if ("stipple".equals(name))
b.stipple = Math.round(parseInt(value) * mScale2); b.stipple = Math.round(parseInt(value) * mScale2 * mStrokeScale);
else if ("stipple-stroke".equals(name)) else if ("stipple-stroke".equals(name))
b.stippleColor(value); b.stippleColor(value);
@ -559,7 +561,7 @@ public class XmlMapsforgeThemeBuilder extends DefaultHandler {
else if ("dasharray".equals(name) || "stroke-dasharray".equals(name)) { else if ("dasharray".equals(name) || "stroke-dasharray".equals(name)) {
b.dashArray = parseFloatArray(value); b.dashArray = parseFloatArray(value);
for (int j = 0; j < b.dashArray.length; ++j) { for (int j = 0; j < b.dashArray.length; ++j) {
b.dashArray[j] = b.dashArray[j] * mScale; b.dashArray[j] = b.dashArray[j] * mScale * mStrokeScale;
} }
} else if ("symbol-width".equals(name)) } else if ("symbol-width".equals(name))
@ -704,7 +706,7 @@ public class XmlMapsforgeThemeBuilder extends DefaultHandler {
else if ("stroke-width".equals(name)) { else if ("stroke-width".equals(name)) {
float strokeWidth = Float.parseFloat(value); float strokeWidth = Float.parseFloat(value);
validateNonNegative("stroke-width", strokeWidth); validateNonNegative("stroke-width", strokeWidth);
b.strokeWidth = strokeWidth * mScale; b.strokeWidth = strokeWidth * mScale * mStrokeScale;
} else if ("fade".equals(name)) } else if ("fade".equals(name))
b.fadeScale = Integer.parseInt(value); b.fadeScale = Integer.parseInt(value);
@ -885,10 +887,11 @@ public class XmlMapsforgeThemeBuilder extends DefaultHandler {
mapBackground = Color.parseColor(value); mapBackground = Color.parseColor(value);
if (mThemeCallback != null) if (mThemeCallback != null)
mapBackground = mThemeCallback.getColor(mapBackground); mapBackground = mThemeCallback.getColor(mapBackground);
} else if ("base-stroke-width".equals(name)) } else if ("base-stroke-width".equals(name))
baseStrokeWidth = Float.parseFloat(value); baseStrokeWidth = Float.parseFloat(value);
else if ("base-text-scale".equals(name)) else if ("base-text-scale".equals(name) || "base-text-size".equals(name))
baseTextScale = Float.parseFloat(value); baseTextScale = Float.parseFloat(value);
else else
@ -905,6 +908,7 @@ public class XmlMapsforgeThemeBuilder extends DefaultHandler {
validateNonNegative("base-text-scale", baseTextScale); validateNonNegative("base-text-scale", baseTextScale);
mMapBackground = mapBackground; mMapBackground = mapBackground;
mStrokeScale = baseStrokeWidth;
mTextScale = baseTextScale; mTextScale = baseTextScale;
} }
@ -967,10 +971,10 @@ public class XmlMapsforgeThemeBuilder extends DefaultHandler {
else if ("font-family".equals(name)) else if ("font-family".equals(name))
b.fontFamily = FontFamily.valueOf(value.toUpperCase(Locale.ENGLISH)); b.fontFamily = FontFamily.valueOf(value.toUpperCase(Locale.ENGLISH));
else if ("font-style".equals(name)) else if ("style".equals(name) || "font-style".equals(name))
b.fontStyle = FontStyle.valueOf(value.toUpperCase(Locale.ENGLISH)); b.fontStyle = FontStyle.valueOf(value.toUpperCase(Locale.ENGLISH));
else if ("font-size".equals(name)) else if ("size".equals(name) || "font-size".equals(name))
b.fontSize = Float.parseFloat(value); b.fontSize = Float.parseFloat(value);
else if ("fill".equals(name)) else if ("fill".equals(name))
@ -1062,7 +1066,7 @@ public class XmlMapsforgeThemeBuilder extends DefaultHandler {
String value = attributes.getValue(i); String value = attributes.getValue(i);
if ("r".equals(name) || "radius".equals(name)) if ("r".equals(name) || "radius".equals(name))
b.radius(Float.parseFloat(value) * mScale); b.radius(Float.parseFloat(value) * mScale * mStrokeScale);
else if ("cat".equals(name)) else if ("cat".equals(name))
b.cat(value); b.cat(value);
@ -1077,7 +1081,7 @@ public class XmlMapsforgeThemeBuilder extends DefaultHandler {
b.strokeColor(Color.parseColor(value)); b.strokeColor(Color.parseColor(value));
else if ("stroke-width".equals(name)) else if ("stroke-width".equals(name))
b.strokeWidth(Float.parseFloat(value) * mScale); b.strokeWidth(Float.parseFloat(value) * mScale * mStrokeScale);
else else
logUnknownAttribute(elementName, name, value, i); logUnknownAttribute(elementName, name, value, i);

View File

@ -70,6 +70,7 @@ import static java.lang.Float.parseFloat;
import static java.lang.Integer.parseInt; import static java.lang.Integer.parseInt;
public class XmlThemeBuilder extends DefaultHandler { public class XmlThemeBuilder extends DefaultHandler {
private static final Logger log = LoggerFactory.getLogger(XmlThemeBuilder.class); private static final Logger log = LoggerFactory.getLogger(XmlThemeBuilder.class);
private static final int RENDER_THEME_VERSION = 1; private static final int RENDER_THEME_VERSION = 1;
@ -147,6 +148,7 @@ public class XmlThemeBuilder extends DefaultHandler {
int mLevels = 0; int mLevels = 0;
int mMapBackground = 0xffffffff; int mMapBackground = 0xffffffff;
private float mStrokeScale = 1;
float mTextScale = 1; float mTextScale = 1;
final ThemeFile mTheme; final ThemeFile mTheme;
@ -276,7 +278,7 @@ public class XmlThemeBuilder extends DefaultHandler {
checkState(localName, Element.RENDERING_INSTRUCTION); checkState(localName, Element.RENDERING_INSTRUCTION);
handleLineElement(localName, attributes, false, false); handleLineElement(localName, attributes, false, false);
} else if ("text".equals(localName)) { } else if ("text".equals(localName) || "pathText".equals(localName)) {
checkState(localName, Element.RENDERING_INSTRUCTION); checkState(localName, Element.RENDERING_INSTRUCTION);
handleTextElement(localName, attributes, false, false); handleTextElement(localName, attributes, false, false);
@ -511,7 +513,7 @@ public class XmlThemeBuilder extends DefaultHandler {
b.color(value); b.color(value);
else if ("width".equals(name) || "stroke-width".equals(name)) { else if ("width".equals(name) || "stroke-width".equals(name)) {
b.strokeWidth = parseFloat(value) * mScale2; b.strokeWidth = parseFloat(value) * mScale2 * mStrokeScale;
if (line == null) { if (line == null) {
if (!isOutline) if (!isOutline)
validateNonNegative("width", b.strokeWidth); validateNonNegative("width", b.strokeWidth);
@ -528,7 +530,7 @@ public class XmlThemeBuilder extends DefaultHandler {
b.fixed = parseBoolean(value); b.fixed = parseBoolean(value);
else if ("stipple".equals(name)) else if ("stipple".equals(name))
b.stipple = Math.round(parseInt(value) * mScale2); b.stipple = Math.round(parseInt(value) * mScale2 * mStrokeScale);
else if ("stipple-stroke".equals(name)) else if ("stipple-stroke".equals(name))
b.stippleColor(value); b.stippleColor(value);
@ -551,7 +553,7 @@ public class XmlThemeBuilder extends DefaultHandler {
else if ("dasharray".equals(name) || "stroke-dasharray".equals(name)) { else if ("dasharray".equals(name) || "stroke-dasharray".equals(name)) {
b.dashArray = parseFloatArray(value); b.dashArray = parseFloatArray(value);
for (int j = 0; j < b.dashArray.length; ++j) { for (int j = 0; j < b.dashArray.length; ++j) {
b.dashArray[j] = b.dashArray[j] * mScale; b.dashArray[j] = b.dashArray[j] * mScale * mStrokeScale;
} }
} else if ("symbol-width".equals(name)) } else if ("symbol-width".equals(name))
@ -696,7 +698,7 @@ public class XmlThemeBuilder extends DefaultHandler {
else if ("stroke-width".equals(name)) { else if ("stroke-width".equals(name)) {
float strokeWidth = Float.parseFloat(value); float strokeWidth = Float.parseFloat(value);
validateNonNegative("stroke-width", strokeWidth); validateNonNegative("stroke-width", strokeWidth);
b.strokeWidth = strokeWidth * mScale; b.strokeWidth = strokeWidth * mScale * mStrokeScale;
} else if ("fade".equals(name)) } else if ("fade".equals(name))
b.fadeScale = Integer.parseInt(value); b.fadeScale = Integer.parseInt(value);
@ -877,10 +879,11 @@ public class XmlThemeBuilder extends DefaultHandler {
mapBackground = Color.parseColor(value); mapBackground = Color.parseColor(value);
if (mThemeCallback != null) if (mThemeCallback != null)
mapBackground = mThemeCallback.getColor(mapBackground); mapBackground = mThemeCallback.getColor(mapBackground);
} else if ("base-stroke-width".equals(name)) } else if ("base-stroke-width".equals(name))
baseStrokeWidth = Float.parseFloat(value); baseStrokeWidth = Float.parseFloat(value);
else if ("base-text-scale".equals(name)) else if ("base-text-scale".equals(name) || "base-text-size".equals(name))
baseTextScale = Float.parseFloat(value); baseTextScale = Float.parseFloat(value);
else else
@ -897,6 +900,7 @@ public class XmlThemeBuilder extends DefaultHandler {
validateNonNegative("base-text-scale", baseTextScale); validateNonNegative("base-text-scale", baseTextScale);
mMapBackground = mapBackground; mMapBackground = mapBackground;
mStrokeScale = baseStrokeWidth;
mTextScale = baseTextScale; mTextScale = baseTextScale;
} }
@ -956,10 +960,10 @@ public class XmlThemeBuilder extends DefaultHandler {
else if ("font-family".equals(name)) else if ("font-family".equals(name))
b.fontFamily = FontFamily.valueOf(value.toUpperCase(Locale.ENGLISH)); b.fontFamily = FontFamily.valueOf(value.toUpperCase(Locale.ENGLISH));
else if ("style".equals(name)) else if ("style".equals(name) || "font-style".equals(name))
b.fontStyle = FontStyle.valueOf(value.toUpperCase(Locale.ENGLISH)); b.fontStyle = FontStyle.valueOf(value.toUpperCase(Locale.ENGLISH));
else if ("size".equals(name)) else if ("size".equals(name) || "font-size".equals(name))
b.fontSize = Float.parseFloat(value); b.fontSize = Float.parseFloat(value);
else if ("fill".equals(name)) else if ("fill".equals(name))
@ -1039,7 +1043,7 @@ public class XmlThemeBuilder extends DefaultHandler {
String value = attributes.getValue(i); String value = attributes.getValue(i);
if ("r".equals(name) || "radius".equals(name)) if ("r".equals(name) || "radius".equals(name))
b.radius(Float.parseFloat(value) * mScale); b.radius(Float.parseFloat(value) * mScale * mStrokeScale);
else if ("cat".equals(name)) else if ("cat".equals(name))
b.cat(value); b.cat(value);
@ -1054,7 +1058,7 @@ public class XmlThemeBuilder extends DefaultHandler {
b.strokeColor(Color.parseColor(value)); b.strokeColor(Color.parseColor(value));
else if ("stroke-width".equals(name)) else if ("stroke-width".equals(name))
b.strokeWidth(Float.parseFloat(value) * mScale); b.strokeWidth(Float.parseFloat(value) * mScale * mStrokeScale);
else else
logUnknownAttribute(elementName, name, value, i); logUnknownAttribute(elementName, name, value, i);