diff --git a/include/mbgl/style/data_driven_property_value.hpp b/include/mbgl/style/data_driven_property_value.hpp index 5d7c59636..0a1fce29c 100644 --- a/include/mbgl/style/data_driven_property_value.hpp +++ b/include/mbgl/style/data_driven_property_value.hpp @@ -50,6 +50,15 @@ public: return !value.template is>() && !value.template is>(); } + bool isExpression() const { + return value.match( + [] (const Undefined&) { return false; }, + [] (const T&) { return false; }, + [] (const CameraFunction& fn) { return fn.isExpression; }, + [] (const SourceFunction& fn) { return fn.isExpression; }, + [] (const CompositeFunction& fn) { return fn.isExpression; }); + } + template auto match(Ts&&... ts) const { return value.match(std::forward(ts)...); diff --git a/include/mbgl/style/function/camera_function.hpp b/include/mbgl/style/function/camera_function.hpp index 1da5d2c60..97ba633e4 100644 --- a/include/mbgl/style/function/camera_function.hpp +++ b/include/mbgl/style/function/camera_function.hpp @@ -27,15 +27,16 @@ public: IntervalStops>>; CameraFunction(std::unique_ptr expression_) - : expression(std::move(expression_)), + : isExpression(true), + expression(std::move(expression_)), zoomCurve(expression::findZoomCurveChecked(expression.get())) { assert(!expression::isZoomConstant(*expression)); assert(expression::isFeatureConstant(*expression)); } - CameraFunction(Stops stops_) - : stops(std::move(stops_)), + CameraFunction(const Stops& stops) + : isExpression(false), expression(stops.match([&] (const auto& s) { return expression::Convert::toExpression(s); })), @@ -76,12 +77,10 @@ public: } bool useIntegerZoom = false; + bool isExpression; const expression::Expression& getExpression() const { return *expression; } - // retained for compatibility with pre-expression function API - Stops stops; - private: std::shared_ptr expression; const variant zoomCurve; diff --git a/include/mbgl/style/function/composite_function.hpp b/include/mbgl/style/function/composite_function.hpp index f391b101a..614c345c2 100644 --- a/include/mbgl/style/function/composite_function.hpp +++ b/include/mbgl/style/function/composite_function.hpp @@ -51,16 +51,16 @@ public: CompositeCategoricalStops>>; CompositeFunction(std::unique_ptr expression_) - : expression(std::move(expression_)), + : isExpression(true), + expression(std::move(expression_)), zoomCurve(expression::findZoomCurveChecked(expression.get())) { assert(!expression::isZoomConstant(*expression)); assert(!expression::isFeatureConstant(*expression)); } - CompositeFunction(std::string property_, Stops stops_, optional defaultValue_ = {}) - : property(std::move(property_)), - stops(std::move(stops_)), + CompositeFunction(const std::string& property, const Stops& stops, optional defaultValue_ = {}) + : isExpression(false), defaultValue(std::move(defaultValue_)), expression(stops.match([&] (const auto& s) { return expression::Convert::toExpression(property, s); @@ -113,12 +113,11 @@ public: const expression::Expression& getExpression() const { return *expression; } - std::string property; - Stops stops; - optional defaultValue; bool useIntegerZoom = false; + bool isExpression; private: + optional defaultValue; std::shared_ptr expression; const variant zoomCurve; }; diff --git a/include/mbgl/style/function/source_function.hpp b/include/mbgl/style/function/source_function.hpp index d3caa90ee..5b51d0bf8 100644 --- a/include/mbgl/style/function/source_function.hpp +++ b/include/mbgl/style/function/source_function.hpp @@ -30,15 +30,15 @@ public: IdentityStops>>; SourceFunction(std::unique_ptr expression_) - : expression(std::move(expression_)) + : isExpression(true), + expression(std::move(expression_)) { assert(expression::isZoomConstant(*expression)); assert(!expression::isFeatureConstant(*expression)); } - SourceFunction(std::string property_, Stops stops_, optional defaultValue_ = {}) - : property(std::move(property_)), - stops(std::move(stops_)), + SourceFunction(const std::string& property, const Stops& stops, optional defaultValue_ = {}) + : isExpression(false), defaultValue(std::move(defaultValue_)), expression(stops.match([&] (const IdentityStops&) { return expression::Convert::fromIdentityFunction(expression::valueTypeToExpressionType(), property); @@ -67,15 +67,12 @@ public: } bool useIntegerZoom = false; + bool isExpression; const expression::Expression& getExpression() const { return *expression; } - // retained for compatibility with pre-expression function API - std::string property; - Stops stops; - optional defaultValue; - private: + optional defaultValue; std::shared_ptr expression; }; diff --git a/platform/node/test/ignores.json b/platform/node/test/ignores.json index 702cadcba..79debab58 100644 --- a/platform/node/test/ignores.json +++ b/platform/node/test/ignores.json @@ -36,7 +36,6 @@ "render-tests/regressions/mapbox-gl-js#2769": "https://github.com/mapbox/mapbox-gl-native/issues/10619", "render-tests/regressions/mapbox-gl-js#3682": "https://github.com/mapbox/mapbox-gl-js/issues/3682", "render-tests/regressions/mapbox-gl-js#5370": "skip - https://github.com/mapbox/mapbox-gl-native/pull/9439", - "render-tests/regressions/mapbox-gl-js#5599": "https://github.com/mapbox/mapbox-gl-native/issues/10399", "render-tests/regressions/mapbox-gl-js#5740": "https://github.com/mapbox/mapbox-gl-native/issues/10619", "render-tests/regressions/mapbox-gl-js#5982": "https://github.com/mapbox/mapbox-gl-native/issues/10619", "render-tests/regressions/mapbox-gl-native#7357": "https://github.com/mapbox/mapbox-gl-native/issues/7357", diff --git a/src/mbgl/layout/symbol_layout.cpp b/src/mbgl/layout/symbol_layout.cpp index 3bf85407c..82a925582 100644 --- a/src/mbgl/layout/symbol_layout.cpp +++ b/src/mbgl/layout/symbol_layout.cpp @@ -126,7 +126,7 @@ SymbolLayout::SymbolLayout(const BucketParameters& parameters, if (hasText) { std::string u8string = layout.evaluate(zoom, ft); - if (layout.get().isConstant()) { + if (layout.get().isConstant() && !leader.layout.get().isExpression()) { u8string = util::replaceTokens(u8string, getValue); } @@ -159,7 +159,7 @@ SymbolLayout::SymbolLayout(const BucketParameters& parameters, if (hasIcon) { std::string icon = layout.evaluate(zoom, ft); - if (layout.get().isConstant()) { + if (layout.get().isConstant() && !leader.layout.get().isExpression()) { icon = util::replaceTokens(icon, getValue); } ft.icon = icon;