bool DrawRule::eval(const StyleContext& _ctx) { for (auto& param : parameters) { if (param.function >= 0) { if (!_ctx.evalStyle(param.function, param.key, param.value)) { if (StyleParam::isRequired(param.key)){ return false; } } } if (param.stops) { if (StyleParam::isColor(param.key)) { param.value = param.stops->evalColor(_ctx.getGlobalZoom()); } else if (StyleParam::isWidth(param.key)) { param.value = param.stops->evalWidth(_ctx.getGlobalZoom()); } else { param.value = param.stops->evalFloat(_ctx.getGlobalZoom()); } } } return true; }
void DrawRuleMergeSet::apply(const Feature& _feature, const SceneLayer& _layer, StyleContext& _ctx, TileBuilder& _builder) { // If no rules matched the feature, return immediately if (!match(_feature, _layer, _ctx)) { return; } // For each matched rule, find the style to be used and // build the feature with the rule's parameters for (auto& rule : m_matchedRules) { StyleBuilder* style = _builder.getStyleBuilder(rule.getStyleName()); if (!style) { LOGE("Invalid style %s", rule.getStyleName().c_str()); continue; } bool visible; if (rule.get(StyleParamKey::visible, visible) && !visible) { continue; } bool valid = true; for (size_t i = 0; i < StyleParamKeySize; ++i) { if (!rule.active[i]) { rule.params[i].param = nullptr; continue; } auto*& param = rule.params[i].param; // Evaluate JS functions and Stops if (param->function >= 0) { // Copy param into 'evaluated' and point param to the evaluated StyleParam. m_evaluated[i] = *param; param = &m_evaluated[i]; if (!_ctx.evalStyle(param->function, param->key, m_evaluated[i].value)) { if (StyleParam::isRequired(param->key)) { valid = false; break; } else { rule.active[i] = false; } } } else if (param->stops) { m_evaluated[i] = *param; param = &m_evaluated[i]; Stops::eval(*param->stops, param->key, _ctx.getGlobalZoom(), m_evaluated[i].value); } } if (valid) { // build outline explicitly with outline style const auto& outlineStyleName = rule.findParameter(StyleParamKey::outline_style); if (outlineStyleName) { auto& styleName = outlineStyleName.value.get<std::string>(); auto* outlineStyle = _builder.getStyleBuilder(styleName); if (!outlineStyle) { LOGE("Invalid style %s", styleName.c_str()); } else { rule.isOutlineOnly = true; outlineStyle->addFeature(_feature, rule); rule.isOutlineOnly = false; } } // build feature with style style->addFeature(_feature, rule); } } }