generalize stylesheet parse function
This commit is contained in:
@@ -91,6 +91,10 @@ struct GenericClass {
|
||||
boost::optional<TranslateAnchor> translateAnchor;
|
||||
boost::optional<FunctionProperty> opacity;
|
||||
boost::optional<PropertyTransition> opacity_transition;
|
||||
boost::optional<bool> prerender;
|
||||
boost::optional<float> prerenderBuffer;
|
||||
boost::optional<uint16_t> prerenderSize;
|
||||
boost::optional<bool> prerenderBlur;
|
||||
};
|
||||
|
||||
struct GenericProperties {
|
||||
@@ -98,6 +102,10 @@ struct GenericProperties {
|
||||
std::array<float, 2> translate = {{ 0, 0 }};
|
||||
TranslateAnchor translateAnchor = TranslateAnchor::Map;
|
||||
float opacity = 1.0;
|
||||
bool prerender = false;
|
||||
float prerenderBuffer = 1.0f / 32.0f;
|
||||
uint16_t prerenderSize = 256;
|
||||
bool prerenderBlur = false;
|
||||
};
|
||||
|
||||
struct IconClass : public GenericClass {
|
||||
@@ -145,8 +153,6 @@ struct FillClass : public GenericClass {
|
||||
boost::optional<Color> stroke_color;
|
||||
boost::optional<PropertyTransition> stroke_color_transition;
|
||||
boost::optional<std::string> image;
|
||||
boost::optional<FunctionProperty> prerendered;
|
||||
boost::optional<FunctionProperty> blur;
|
||||
};
|
||||
|
||||
struct FillProperties : public GenericProperties {
|
||||
@@ -154,9 +160,6 @@ struct FillProperties : public GenericProperties {
|
||||
bool antialias = true;
|
||||
Color fill_color = {{ 0, 0, 0, 1 }};
|
||||
Color stroke_color = {{ 0, 0, 0, 1 }};
|
||||
bool prerendered = false;
|
||||
float prerenderBuffer = 1.0f / 32.0f;
|
||||
uint16_t prerenderSize = 256;
|
||||
float blur = 0.0f;
|
||||
std::string image;
|
||||
};
|
||||
|
||||
@@ -30,6 +30,7 @@ private:
|
||||
const std::map<std::string, BucketDescription> &buckets,
|
||||
const std::map<std::string, std::string> &layerBuckets);
|
||||
|
||||
void parseGenericClass(GenericClass &klass, JSVal value);
|
||||
FillClass parseFillClass(JSVal value);
|
||||
LineClass parseLineClass(JSVal value);
|
||||
IconClass parseIconClass(JSVal value);
|
||||
|
||||
@@ -85,6 +85,18 @@ struct relaxed_equal {
|
||||
Value const &lhs;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
template <typename T>
|
||||
T toNumber(const Value &value) {
|
||||
if (value.is<std::string>()) return util::string_to_number<T>()(value.get<std::string>());
|
||||
else if (value.is<bool>()) return value.get<bool>();
|
||||
else if (value.is<int64_t>()) return value.get<int64_t>();
|
||||
else if (value.is<uint64_t>()) return value.get<uint64_t>();
|
||||
else if (value.is<double>()) return value.get<double>();
|
||||
else return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -152,7 +152,7 @@ void Painter::renderFill(FillBucket& bucket, const std::string& layer_name, cons
|
||||
if (!properties.enabled) return;
|
||||
|
||||
|
||||
if (properties.prerendered) {
|
||||
if (properties.prerender) {
|
||||
if (pass == Translucent) {
|
||||
// Buffer value around the 0..4096 extent that will be drawn into the 256x256 pixel
|
||||
// texture. We later scale the texture so that the actual bounds will align with this
|
||||
|
||||
@@ -115,12 +115,12 @@ void Style::cascade(float z) {
|
||||
fill.image = layer.image.get();
|
||||
}
|
||||
|
||||
if (layer.prerendered) {
|
||||
fill.prerendered = layer.prerendered.get().evaluate<bool>(z);
|
||||
if (layer.prerender) {
|
||||
fill.prerender = layer.prerender.get();
|
||||
}
|
||||
|
||||
if (layer.blur) {
|
||||
fill.blur = layer.blur.get().evaluate<float>(z);
|
||||
if (layer.prerenderBlur) {
|
||||
fill.prerenderBlur = layer.prerenderBlur.get();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -500,10 +500,8 @@ PropertyTransition StyleParser::parseTransition(JSVal value, std::string propert
|
||||
return transition;
|
||||
}
|
||||
|
||||
FillClass StyleParser::parseFillClass(JSVal value) {
|
||||
FillClass klass;
|
||||
|
||||
if (value.HasMember("enabled")) {
|
||||
void StyleParser::parseGenericClass(GenericClass &klass, JSVal value) {
|
||||
if (value.HasMember("enabled")) {
|
||||
klass.enabled = parseFunction(value["enabled"]);
|
||||
}
|
||||
|
||||
@@ -517,6 +515,33 @@ FillClass StyleParser::parseFillClass(JSVal value) {
|
||||
klass.translateAnchor = parseTranslateAnchor(value["translate-anchor"]);
|
||||
}
|
||||
|
||||
if (value.HasMember("opacity")) {
|
||||
klass.opacity = parseFunction(value["opacity"]);
|
||||
klass.opacity_transition = parseTransition(value, "opacity");
|
||||
}
|
||||
|
||||
if (value.HasMember("prerender")) {
|
||||
klass.prerender = parseBoolean(value["prerender"]);
|
||||
}
|
||||
|
||||
if (value.HasMember("prerender-buffer")) {
|
||||
klass.prerenderBuffer = toNumber<double>(parseValue(value["prerender-buffer"]));
|
||||
}
|
||||
|
||||
if (value.HasMember("prerender-size")) {
|
||||
klass.prerenderBuffer = toNumber<uint64_t>(parseValue(value["prerender-size"]));
|
||||
}
|
||||
|
||||
if (value.HasMember("prerender-blur")) {
|
||||
klass.prerenderBlur = parseBoolean(value["prerender-blur"]);
|
||||
}
|
||||
}
|
||||
|
||||
FillClass StyleParser::parseFillClass(JSVal value) {
|
||||
FillClass klass;
|
||||
|
||||
parseGenericClass(klass, value);
|
||||
|
||||
if (value.HasMember("winding")) {
|
||||
throw std::runtime_error("winding in stylesheets not yet supported");
|
||||
}
|
||||
@@ -537,42 +562,17 @@ FillClass StyleParser::parseFillClass(JSVal value) {
|
||||
klass.antialias = parseBoolean(value["antialias"]);
|
||||
}
|
||||
|
||||
if (value.HasMember("prerendered")) {
|
||||
klass.prerendered = parseBoolean(value["prerendered"]);
|
||||
}
|
||||
|
||||
if (value.HasMember("blur")) {
|
||||
klass.blur = parseFunction(value["blur"]);
|
||||
}
|
||||
|
||||
if (value.HasMember("image")) {
|
||||
klass.image = parseString(value["image"]);
|
||||
}
|
||||
|
||||
if (value.HasMember("opacity")) {
|
||||
klass.opacity = parseFunction(value["opacity"]);
|
||||
klass.opacity_transition = parseTransition(value, "opacity");
|
||||
}
|
||||
|
||||
return klass;
|
||||
}
|
||||
|
||||
LineClass StyleParser::parseLineClass(JSVal value) {
|
||||
LineClass klass;
|
||||
|
||||
if (value.HasMember("enabled")) {
|
||||
klass.enabled = parseFunction(value["enabled"]);
|
||||
}
|
||||
|
||||
if (value.HasMember("translate")) {
|
||||
std::vector<FunctionProperty> values = parseArray(value["translate"], 2);
|
||||
klass.translate = std::array<FunctionProperty, 2> {{ values[0], values[1] }};
|
||||
klass.translate_transition = parseTransition(value, "translate");
|
||||
}
|
||||
|
||||
if (value.HasMember("translate-anchor")) {
|
||||
klass.translateAnchor = parseTranslateAnchor(value["translate-anchor"]);
|
||||
}
|
||||
parseGenericClass(klass, value);
|
||||
|
||||
if (value.HasMember("color")) {
|
||||
klass.color = parseColor(value["color"]);
|
||||
@@ -584,11 +584,6 @@ LineClass StyleParser::parseLineClass(JSVal value) {
|
||||
klass.width_transition = parseTransition(value, "width");
|
||||
}
|
||||
|
||||
if (value.HasMember("opacity")) {
|
||||
klass.opacity = parseFunction(value["opacity"]);
|
||||
klass.opacity_transition = parseTransition(value, "opacity");
|
||||
}
|
||||
|
||||
if (value.HasMember("dasharray")) {
|
||||
std::vector<FunctionProperty> values = parseArray(value["dasharray"], 2);
|
||||
klass.dash_array = std::array<FunctionProperty, 2> {{ values[0], values[1] }};
|
||||
@@ -601,30 +596,13 @@ LineClass StyleParser::parseLineClass(JSVal value) {
|
||||
IconClass StyleParser::parseIconClass(JSVal value) {
|
||||
IconClass klass;
|
||||
|
||||
if (value.HasMember("enabled")) {
|
||||
klass.enabled = parseFunction(value["enabled"]);
|
||||
}
|
||||
|
||||
if (value.HasMember("translate")) {
|
||||
std::vector<FunctionProperty> values = parseArray(value["translate"], 2);
|
||||
klass.translate = std::array<FunctionProperty, 2> {{ values[0], values[1] }};
|
||||
klass.translate_transition = parseTransition(value, "translate");
|
||||
}
|
||||
|
||||
if (value.HasMember("translate-anchor")) {
|
||||
klass.translateAnchor = parseTranslateAnchor(value["translate-anchor"]);
|
||||
}
|
||||
parseGenericClass(klass, value);
|
||||
|
||||
if (value.HasMember("color")) {
|
||||
klass.color = parseColor(value["color"]);
|
||||
klass.color_transition = parseTransition(value, "color");
|
||||
}
|
||||
|
||||
if (value.HasMember("opacity")) {
|
||||
klass.opacity = parseFunction(value["opacity"]);
|
||||
klass.opacity_transition = parseTransition(value, "opacity");
|
||||
}
|
||||
|
||||
if (value.HasMember("image")) {
|
||||
klass.image = parseString(value["image"]);
|
||||
}
|
||||
@@ -649,19 +627,7 @@ IconClass StyleParser::parseIconClass(JSVal value) {
|
||||
TextClass StyleParser::parseTextClass(JSVal value) {
|
||||
TextClass klass;
|
||||
|
||||
if (value.HasMember("enabled")) {
|
||||
klass.enabled = parseFunction(value["enabled"]);
|
||||
}
|
||||
|
||||
if (value.HasMember("translate")) {
|
||||
std::vector<FunctionProperty> values = parseArray(value["translate"], 2);
|
||||
klass.translate = std::array<FunctionProperty, 2> {{ values[0], values[1] }};
|
||||
klass.translate_transition = parseTransition(value, "translate");
|
||||
}
|
||||
|
||||
if (value.HasMember("translate-anchor")) {
|
||||
klass.translateAnchor = parseTranslateAnchor(value["translate-anchor"]);
|
||||
}
|
||||
parseGenericClass(klass, value);
|
||||
|
||||
if (value.HasMember("color")) {
|
||||
klass.color = parseColor(value["color"]);
|
||||
@@ -695,25 +661,13 @@ TextClass StyleParser::parseTextClass(JSVal value) {
|
||||
klass.always_visible = parseFunction(value["alwaysVisible"]);
|
||||
}
|
||||
|
||||
if (value.HasMember("opacity")) {
|
||||
klass.opacity = parseFunction(value["opacity"]);
|
||||
klass.opacity_transition = parseTransition(value, "opacity");
|
||||
}
|
||||
|
||||
return klass;
|
||||
}
|
||||
|
||||
RasterClass StyleParser::parseRasterClass(JSVal value) {
|
||||
RasterClass klass;
|
||||
|
||||
if (value.HasMember("enabled")) {
|
||||
klass.enabled = parseFunction(value["enabled"]);
|
||||
}
|
||||
|
||||
if (value.HasMember("opacity")) {
|
||||
klass.opacity = parseFunction(value["opacity"]);
|
||||
klass.opacity_transition = parseTransition(value, "opacity");
|
||||
}
|
||||
parseGenericClass(klass, value);
|
||||
|
||||
return klass;
|
||||
}
|
||||
@@ -721,14 +675,7 @@ RasterClass StyleParser::parseRasterClass(JSVal value) {
|
||||
CompositeClass StyleParser::parseCompositeClass(JSVal value) {
|
||||
CompositeClass klass;
|
||||
|
||||
if (value.HasMember("enabled")) {
|
||||
klass.enabled = parseFunction(value["enabled"]);
|
||||
}
|
||||
|
||||
if (value.HasMember("opacity")) {
|
||||
klass.opacity = parseFunction(value["opacity"]);
|
||||
klass.opacity_transition = parseTransition(value, "opacity");
|
||||
}
|
||||
parseGenericClass(klass, value);
|
||||
|
||||
return klass;
|
||||
}
|
||||
@@ -736,16 +683,13 @@ CompositeClass StyleParser::parseCompositeClass(JSVal value) {
|
||||
BackgroundClass StyleParser::parseBackgroundClass(JSVal value) {
|
||||
BackgroundClass klass;
|
||||
|
||||
parseGenericClass(klass, value);
|
||||
|
||||
if (value.HasMember("color")) {
|
||||
klass.color = parseColor(value["color"]);
|
||||
klass.color_transition = parseTransition(value, "color");
|
||||
}
|
||||
|
||||
if (value.HasMember("opacity")) {
|
||||
klass.opacity = parseFunction(value["opacity"]);
|
||||
klass.opacity_transition = parseTransition(value, "opacity");
|
||||
}
|
||||
|
||||
return klass;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user