diff options
author | Anand Thakker <anandthakker@users.noreply.github.com> | 2018-02-21 21:39:33 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-21 21:39:33 -0500 |
commit | b16893f903b3f81803d59cdfa3253a3fb09cfd3e (patch) | |
tree | 565ba4b762b796d7c6a18f850f2c3d2c7babdc5e /include | |
parent | 0525fd1e4a207040b6268ee0b2a9634d8fa37753 (diff) | |
download | qtlocation-mapboxgl-b16893f903b3f81803d59cdfa3253a3fb09cfd3e.tar.gz |
Correctly parse constant expressions in dds style properties (#11282)
* Correctly parse constant expressions in dds style properties
Closes #10849
* Clarify
Diffstat (limited to 'include')
-rw-r--r-- | include/mbgl/style/conversion/data_driven_property_value.hpp | 21 | ||||
-rw-r--r-- | include/mbgl/style/expression/literal.hpp | 4 |
2 files changed, 22 insertions, 3 deletions
diff --git a/include/mbgl/style/conversion/data_driven_property_value.hpp b/include/mbgl/style/conversion/data_driven_property_value.hpp index 8880d28fb1..5f4395f35a 100644 --- a/include/mbgl/style/conversion/data_driven_property_value.hpp +++ b/include/mbgl/style/conversion/data_driven_property_value.hpp @@ -8,6 +8,8 @@ #include <mbgl/style/expression/is_expression.hpp> #include <mbgl/style/expression/is_constant.hpp> #include <mbgl/style/expression/find_zoom_curve.hpp> +#include <mbgl/style/expression/literal.hpp> +#include <mbgl/style/expression/value.hpp> #include <unordered_set> @@ -32,12 +34,25 @@ struct Converter<DataDrivenPropertyValue<T>> { return {}; } - if (isFeatureConstant(**expression)) { + bool featureConstant = isFeatureConstant(**expression); + bool zoomConstant = isZoomConstant(**expression); + + if (featureConstant && !zoomConstant) { return DataDrivenPropertyValue<T>(CameraFunction<T>(std::move(*expression))); - } else if (isZoomConstant(**expression)) { + } else if (!featureConstant && zoomConstant) { return DataDrivenPropertyValue<T>(SourceFunction<T>(std::move(*expression))); - } else { + } else if (!featureConstant && !zoomConstant) { return DataDrivenPropertyValue<T>(CompositeFunction<T>(std::move(*expression))); + } else { + // If an expression is neither zoom- nor feature-dependent, it + // should have been reduced to a Literal when it was parsed. + auto literal = dynamic_cast<Literal*>(expression->get()); + assert(literal); + optional<T> constant = fromExpressionValue<T>(literal->getValue()); + if (!constant) { + return {}; + } + return DataDrivenPropertyValue<T>(*constant); } } else if (!isObject(value)) { optional<T> constant = convert<T>(value, error); diff --git a/include/mbgl/style/expression/literal.hpp b/include/mbgl/style/expression/literal.hpp index 82983d78af..a5c5fa109d 100644 --- a/include/mbgl/style/expression/literal.hpp +++ b/include/mbgl/style/expression/literal.hpp @@ -32,6 +32,10 @@ public: std::vector<optional<Value>> possibleOutputs() const override { return {{ value }}; } + + Value getValue() const { + return value; + } private: Value value; |