diff options
Diffstat (limited to 'src/mbgl/style/expression')
-rw-r--r-- | src/mbgl/style/expression/dsl.cpp | 6 | ||||
-rw-r--r-- | src/mbgl/style/expression/format_expression.cpp | 62 | ||||
-rw-r--r-- | src/mbgl/style/expression/formatted.cpp | 36 | ||||
-rw-r--r-- | src/mbgl/style/expression/is_constant.cpp | 10 |
4 files changed, 82 insertions, 32 deletions
diff --git a/src/mbgl/style/expression/dsl.cpp b/src/mbgl/style/expression/dsl.cpp index f5ff83a9e7..e7d90ba07b 100644 --- a/src/mbgl/style/expression/dsl.cpp +++ b/src/mbgl/style/expression/dsl.cpp @@ -189,13 +189,13 @@ std::unique_ptr<Expression> concat(std::vector<std::unique_ptr<Expression>> inpu std::unique_ptr<Expression> format(const char* value) { return std::make_unique<Literal>(Formatted(value)); } - + std::unique_ptr<Expression> format(std::unique_ptr<Expression> input) { std::vector<FormatExpressionSection> sections; - sections.emplace_back(std::move(input), nullopt, nullopt); + sections.emplace_back(std::move(input), nullopt, nullopt, nullopt); return std::make_unique<FormatExpression>(sections); } - + } // namespace dsl } // namespace expression } // namespace style diff --git a/src/mbgl/style/expression/format_expression.cpp b/src/mbgl/style/expression/format_expression.cpp index 144df4b160..b5e4ba62c4 100644 --- a/src/mbgl/style/expression/format_expression.cpp +++ b/src/mbgl/style/expression/format_expression.cpp @@ -1,8 +1,6 @@ #include <mbgl/style/conversion_impl.hpp> #include <mbgl/style/expression/format_expression.hpp> -#include <mbgl/style/expression/literal.hpp> -#include <mbgl/util/font_stack.hpp> -#include <mbgl/util/string.hpp> +#include <mbgl/style/expression/formatted.hpp> namespace mbgl { namespace style { @@ -10,15 +8,21 @@ namespace expression { FormatExpressionSection::FormatExpressionSection(std::unique_ptr<Expression> text_, optional<std::unique_ptr<Expression>> fontScale_, - optional<std::unique_ptr<Expression>> textFont_) + optional<std::unique_ptr<Expression>> textFont_, + optional<std::unique_ptr<Expression>> textColor_) : text(std::move(text_)) { if (fontScale_) { fontScale = std::shared_ptr<Expression>(std::move(*fontScale_)); } + if (textFont_) { textFont = std::shared_ptr<Expression>(std::move(*textFont_)); } + + if (textColor_) { + textColor = std::shared_ptr<Expression>(std::move(*textColor_)); + } } FormatExpression::FormatExpression(std::vector<FormatExpressionSection> sections_) @@ -53,7 +57,7 @@ ParseResult FormatExpression::parse(const Convertible& value, ParsingContext& ct return ParseResult(); } - const optional<Convertible> fontScaleOption = objectMember(options, "font-scale"); + const optional<Convertible> fontScaleOption = objectMember(options, kFormattedSectionFontScale); ParseResult fontScale; if (fontScaleOption) { fontScale = ctx.parse(*fontScaleOption, 1, {type::Number}); @@ -62,7 +66,7 @@ ParseResult FormatExpression::parse(const Convertible& value, ParsingContext& ct } } - const optional<Convertible> textFontOption = objectMember(options, "text-font"); + const optional<Convertible> textFontOption = objectMember(options, kFormattedSectionTextFont); ParseResult textFont; if (textFontOption) { textFont = ctx.parse(*textFontOption, 1, {type::Array(type::String)}); @@ -70,7 +74,20 @@ ParseResult FormatExpression::parse(const Convertible& value, ParsingContext& ct return ParseResult(); } } - sections.emplace_back(std::move(*text), std::move(fontScale), std::move(textFont)); + + const optional<Convertible> textColorOption = objectMember(options, kFormattedSectionTextColor); + ParseResult textColor; + if (textColorOption) { + textColor = ctx.parse(*textColorOption, 1, {type::Color}); + if (!textColor) { + return ParseResult(); + } + } + + sections.emplace_back(std::move(*text), + std::move(fontScale), + std::move(textFont), + std::move(textColor)); } return ParseResult(std::make_unique<FormatExpression>(std::move(sections))); @@ -85,6 +102,9 @@ void FormatExpression::eachChild(const std::function<void(const Expression&)>& f if (section.textFont) { fn(**section.textFont); } + if (section.textColor) { + fn(**section.textColor); + } } } @@ -108,6 +128,10 @@ bool FormatExpression::operator==(const Expression& e) const { (!lhsSection.textFont && rhsSection.textFont)) { return false; } + if ((lhsSection.textColor && (!rhsSection.textColor || **lhsSection.textColor != **rhsSection.textColor)) || + (!lhsSection.textColor && rhsSection.textColor)) { + return false; + } } return true; } @@ -115,15 +139,18 @@ bool FormatExpression::operator==(const Expression& e) const { } mbgl::Value FormatExpression::serialize() const { - std::vector<mbgl::Value> serialized{{ std::string("format") }}; + std::vector<mbgl::Value> serialized{{ getOperator() }}; for (const auto& section : sections) { serialized.push_back(section.text->serialize()); std::unordered_map<std::string, mbgl::Value> options; if (section.fontScale) { - options.emplace("font-scale", (*section.fontScale)->serialize()); + options.emplace(kFormattedSectionFontScale, (*section.fontScale)->serialize()); } if (section.textFont) { - options.emplace("text-font", (*section.textFont)->serialize()); + options.emplace(kFormattedSectionTextFont, (*section.textFont)->serialize()); + } + if (section.textColor) { + options.emplace(kFormattedSectionTextColor, (*section.textColor)->serialize()); } serialized.push_back(options); } @@ -164,7 +191,20 @@ EvaluationResult FormatExpression::evaluate(const EvaluationContext& params) con } evaluatedTextFont = *textFontValue; } - evaluatedSections.emplace_back(*evaluatedText, evaluatedFontScale, evaluatedTextFont); + + optional<Color> evaluatedTextColor; + if (section.textColor) { + auto textColorResult = (*section.textColor)->evaluate(params); + if (!textColorResult) { + return textColorResult.error(); + } + + evaluatedTextColor = fromExpressionValue<Color>(*textColorResult); + if (!evaluatedTextColor) { + return EvaluationError { "Format text-color option must evaluate to Color" }; + } + } + evaluatedSections.emplace_back(*evaluatedText, evaluatedFontScale, evaluatedTextFont, evaluatedTextColor); } return Formatted(evaluatedSections); } diff --git a/src/mbgl/style/expression/formatted.cpp b/src/mbgl/style/expression/formatted.cpp index 8232d0c698..3fa39b2cdc 100644 --- a/src/mbgl/style/expression/formatted.cpp +++ b/src/mbgl/style/expression/formatted.cpp @@ -1,18 +1,15 @@ #include <mbgl/style/expression/formatted.hpp> #include <mbgl/style/conversion_impl.hpp> -#include <mbgl/style/expression/is_constant.hpp> -#include <mbgl/style/expression/is_expression.hpp> -#include <mbgl/style/expression/literal.hpp> -#include <mbgl/style/expression/expression.hpp> -#include <mbgl/style/expression/type.hpp> -#include <mbgl/style/expression/compound_expression.hpp> -#include <mbgl/style/expression/boolean_operator.hpp> +#include <mbgl/style/conversion/constant.hpp> namespace mbgl { namespace style { - namespace expression { +const char* const kFormattedSectionFontScale = "font-scale"; +const char* const kFormattedSectionTextFont = "text-font"; +const char* const kFormattedSectionTextColor = "text-color"; + bool Formatted::operator==(const Formatted& other) const { if (other.sections.size() != sections.size()) { return false; @@ -22,14 +19,14 @@ bool Formatted::operator==(const Formatted& other) const { const auto& otherSection = other.sections.at(i); if (thisSection.text != otherSection.text || thisSection.fontScale != otherSection.fontScale || - thisSection.fontStack != otherSection.fontStack) { + thisSection.fontStack != otherSection.fontStack || + thisSection.textColor != otherSection.textColor) { return false; } } return true; } - - + std::string Formatted::toString() const { std::string result; for (const auto& section : sections) { @@ -37,7 +34,7 @@ std::string Formatted::toString() const { } return result; } - + } // namespace expression namespace conversion { @@ -65,6 +62,7 @@ optional<Formatted> Converter<Formatted>::operator()(const Convertible& value, E optional<double> fontScale; optional<FontStack> textFont; + optional<Color> textColor; if (sectionLength > 1) { Convertible sectionParams = arrayMember(section, 1); if (!isObject(sectionParams)) { @@ -72,12 +70,12 @@ optional<Formatted> Converter<Formatted>::operator()(const Convertible& value, E return nullopt; } - optional<Convertible> fontScaleMember = objectMember(sectionParams, "font-scale"); + optional<Convertible> fontScaleMember = objectMember(sectionParams, kFormattedSectionFontScale); if (fontScaleMember) { fontScale = toDouble(*fontScaleMember); } - optional<Convertible> textFontMember = objectMember(sectionParams, "text-font"); + optional<Convertible> textFontMember = objectMember(sectionParams, kFormattedSectionTextFont); if (textFontMember) { if (isArray(*textFontMember)) { std::vector<std::string> fontsVector; @@ -96,9 +94,17 @@ optional<Formatted> Converter<Formatted>::operator()(const Convertible& value, E return nullopt; } } + + optional<Convertible> textColorMember = objectMember(sectionParams, kFormattedSectionTextColor); + if (textColorMember) { + textColor = convert<Color>(*textColorMember, error); + if (!textColor) { + return nullopt; + } + } } - sections.push_back(FormattedSection(*sectionText, fontScale, textFont)); + sections.push_back(FormattedSection(*sectionText, fontScale, textFont, textColor)); } return Formatted(sections); } else if (optional<std::string> result = toString(value)) { diff --git a/src/mbgl/style/expression/is_constant.cpp b/src/mbgl/style/expression/is_constant.cpp index 3b20f49a86..9704168a41 100644 --- a/src/mbgl/style/expression/is_constant.cpp +++ b/src/mbgl/style/expression/is_constant.cpp @@ -17,18 +17,22 @@ bool isFeatureConstant(const Expression& expression) { return false; } else if (name == "has" && parameterCount && *parameterCount == 1) { return false; - } else if (0 == name.rfind(filter, 0)) { - // Legacy filters begin with "filter-" and are never constant. - return false; } else if ( name == "properties" || name == "geometry-type" || name == "id" ) { return false; + } else if (0u == name.rfind(filter, 0u)) { + // Legacy filters begin with "filter-" and are never constant. + return false; } } + if (expression.getKind() == Kind::FormatSectionOverride) { + return false; + } + if (expression.getKind() == Kind::CollatorExpression) { // Although the results of a Collator expression with fixed arguments // generally shouldn't change between executions, we can't serialize them |