generalize stylesheet parse function

This commit is contained in:
Konstantin Käfer
2014-05-26 12:30:27 +02:00
parent a7c3b8b6f5
commit e506d6bcdd
6 changed files with 62 additions and 102 deletions

View File

@@ -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;
};

View File

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

View File

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

View File

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

View File

@@ -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();
}
}

View File

@@ -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;
}