From e506d6bcdddc2cda548e7e1dd064519b0856d534 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Mon, 26 May 2014 12:30:27 +0200 Subject: [PATCH] generalize stylesheet parse function --- include/llmr/style/properties.hpp | 13 +-- include/llmr/style/style_parser.hpp | 1 + include/llmr/style/value.hpp | 12 +++ src/renderer/painter_fill.cpp | 2 +- src/style/style.cpp | 8 +- src/style/style_parser.cpp | 128 ++++++++-------------------- 6 files changed, 62 insertions(+), 102 deletions(-) diff --git a/include/llmr/style/properties.hpp b/include/llmr/style/properties.hpp index f96c2cec9..aeb3e32c9 100644 --- a/include/llmr/style/properties.hpp +++ b/include/llmr/style/properties.hpp @@ -91,6 +91,10 @@ struct GenericClass { boost::optional translateAnchor; boost::optional opacity; boost::optional opacity_transition; + boost::optional prerender; + boost::optional prerenderBuffer; + boost::optional prerenderSize; + boost::optional prerenderBlur; }; struct GenericProperties { @@ -98,6 +102,10 @@ struct GenericProperties { std::array 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 stroke_color; boost::optional stroke_color_transition; boost::optional image; - boost::optional prerendered; - boost::optional 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; }; diff --git a/include/llmr/style/style_parser.hpp b/include/llmr/style/style_parser.hpp index 6668048ff..109b94f1f 100644 --- a/include/llmr/style/style_parser.hpp +++ b/include/llmr/style/style_parser.hpp @@ -30,6 +30,7 @@ private: const std::map &buckets, const std::map &layerBuckets); + void parseGenericClass(GenericClass &klass, JSVal value); FillClass parseFillClass(JSVal value); LineClass parseLineClass(JSVal value); IconClass parseIconClass(JSVal value); diff --git a/include/llmr/style/value.hpp b/include/llmr/style/value.hpp index 0dc53248b..f29590363 100644 --- a/include/llmr/style/value.hpp +++ b/include/llmr/style/value.hpp @@ -85,6 +85,18 @@ struct relaxed_equal { Value const &lhs; }; } + + +template +T toNumber(const Value &value) { + if (value.is()) return util::string_to_number()(value.get()); + else if (value.is()) return value.get(); + else if (value.is()) return value.get(); + else if (value.is()) return value.get(); + else if (value.is()) return value.get(); + else return 0; +} + } #endif diff --git a/src/renderer/painter_fill.cpp b/src/renderer/painter_fill.cpp index 6f28b6c0c..76f510c7d 100644 --- a/src/renderer/painter_fill.cpp +++ b/src/renderer/painter_fill.cpp @@ -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 diff --git a/src/style/style.cpp b/src/style/style.cpp index fce70eade..e3adc3c89 100644 --- a/src/style/style.cpp +++ b/src/style/style.cpp @@ -115,12 +115,12 @@ void Style::cascade(float z) { fill.image = layer.image.get(); } - if (layer.prerendered) { - fill.prerendered = layer.prerendered.get().evaluate(z); + if (layer.prerender) { + fill.prerender = layer.prerender.get(); } - if (layer.blur) { - fill.blur = layer.blur.get().evaluate(z); + if (layer.prerenderBlur) { + fill.prerenderBlur = layer.prerenderBlur.get(); } } diff --git a/src/style/style_parser.cpp b/src/style/style_parser.cpp index 52ef85f1d..b6e73147d 100644 --- a/src/style/style_parser.cpp +++ b/src/style/style_parser.cpp @@ -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(parseValue(value["prerender-buffer"])); + } + + if (value.HasMember("prerender-size")) { + klass.prerenderBuffer = toNumber(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 values = parseArray(value["translate"], 2); - klass.translate = std::array {{ 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 values = parseArray(value["dasharray"], 2); klass.dash_array = std::array {{ 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 values = parseArray(value["translate"], 2); - klass.translate = std::array {{ 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 values = parseArray(value["translate"], 2); - klass.translate = std::array {{ 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; }