void PolygonStyleBuilder::parseRule(const DrawRule& _rule, const Properties& _props) { _rule.get(StyleParamKey::color, m_params.color); _rule.get(StyleParamKey::extrude, m_params.extrude); _rule.get(StyleParamKey::order, m_params.order); if (Tangram::getDebugFlag(Tangram::DebugFlags::proxy_colors)) { m_params.color <<= (m_zoom % 6); } auto& extrude = m_params.extrude; m_params.minHeight = getLowerExtrudeMeters(extrude, _props) * m_tileUnitsPerMeter; m_params.height = getUpperExtrudeMeters(extrude, _props) * m_tileUnitsPerMeter; }
bool StyleBuilder::checkRule(const DrawRule& _rule) const { uint32_t checkColor; uint32_t checkOrder; if (!_rule.get(StyleParamKey::color, checkColor)) { if (!m_hasColorShaderBlock) { return false; } } if (!_rule.get(StyleParamKey::order, checkOrder)) { return false; } return true; }
PolylineStyle::Parameters PolylineStyle::parseRule(const DrawRule& _rule) const { Parameters p; uint32_t cap = 0, join = 0; _rule.get(StyleParamKey::order, p.order); _rule.get(StyleParamKey::color, p.color); _rule.get(StyleParamKey::width, p.width); _rule.get(StyleParamKey::cap, cap); _rule.get(StyleParamKey::join, join); p.cap = static_cast<CapTypes>(cap); p.join = static_cast<JoinTypes>(join); if (_rule.get(StyleParamKey::outline_color, p.outlineColor) | _rule.get(StyleParamKey::outline_width, p.outlineWidth) | _rule.get(StyleParamKey::outline_cap, cap) | _rule.get(StyleParamKey::outline_join, join)) { p.outlineOn = true; p.outlineCap = static_cast<CapTypes>(cap); p.outlineJoin = static_cast<JoinTypes>(join); } return p; }
bool Style::checkRule(const DrawRule& _rule) const { uint32_t checkColor; uint32_t checkOrder; if (!_rule.get(StyleParamKey::color, checkColor)) { const auto& blocks = m_shaderProgram->getSourceBlocks(); if (blocks.find("color") == blocks.end() && blocks.find("filter") == blocks.end()) { return false; // No color parameter or color block? NO SOUP FOR YOU } } if (!_rule.get(StyleParamKey::order, checkOrder)) { return false; } return true; }
bool PointStyleBuilder::checkRule(const DrawRule& _rule) const { uint32_t checkColor; // require a color or texture atlas/texture to be valid if (!_rule.get(StyleParamKey::color, checkColor) && !m_style.texture() && !m_style.spriteAtlas()) { return false; } return true; }
PolylineStyle::Parameters PolylineStyle::parseRule(const DrawRule& _rule) const { Parameters p; _rule.getValue(StyleParamKey::order, p.order); _rule.getColor(StyleParamKey::color, p.color); _rule.getValue(StyleParamKey::width, p.width); _rule.getLineCap(StyleParamKey::cap, p.cap); _rule.getLineJoin(StyleParamKey::join, p.join); if (_rule.getColor(StyleParamKey::outline_color, p.outlineColor) | _rule.getValue(StyleParamKey::outline_width, p.outlineWidth) | _rule.getLineCap(StyleParamKey::outline_cap, p.outlineCap) | _rule.getLineJoin(StyleParamKey::outline_join, p.outlineJoin)) { p.outlineOn = true; } return p; }
void Style::buildFeature(Tile& _tile, const Feature& _feat, const DrawRule& _rule) const { if (!checkRule(_rule)) { return; } bool visible; if (_rule.get(StyleParamKey::visible, visible) && !visible) { return; } auto& mesh = _tile.getMesh(*this); if (!mesh) { mesh.reset(newMesh()); } switch (_feat.geometryType) { case GeometryType::points: for (auto& point : _feat.points) { buildPoint(point, _rule, _feat.props, *mesh, _tile); } break; case GeometryType::lines: for (auto& line : _feat.lines) { buildLine(line, _rule, _feat.props, *mesh, _tile); } break; case GeometryType::polygons: for (auto& polygon : _feat.polygons) { buildPolygon(polygon, _rule, _feat.props, *mesh, _tile); } break; default: break; } }
TextStyle::Parameters TextStyleBuilder::applyRule(const DrawRule& _rule, const Properties& _props, bool _iconText) const { const static std::string defaultWeight("400"); const static std::string defaultStyle("normal"); const static std::string defaultFamily("default"); TextStyle::Parameters p; _rule.get(StyleParamKey::text_source, p.text); if (!_rule.isJSFunction(StyleParamKey::text_source)) { if (p.text.empty()) { p.text = _props.getString(key_name); } else { p.text = resolveTextSource(p.text, _props); } } if (p.text.empty()) { return p; } auto fontFamily = _rule.get<std::string>(StyleParamKey::text_font_family); fontFamily = (!fontFamily) ? &defaultFamily : fontFamily; auto fontWeight = _rule.get<std::string>(StyleParamKey::text_font_weight); fontWeight = (!fontWeight) ? &defaultWeight : fontWeight; auto fontStyle = _rule.get<std::string>(StyleParamKey::text_font_style); fontStyle = (!fontStyle) ? &defaultStyle : fontStyle; _rule.get(StyleParamKey::text_font_size, p.fontSize); p.fontSize *= m_style.pixelScale(); p.font = m_style.context()->getFont(*fontFamily, *fontStyle, *fontWeight, p.fontSize); _rule.get(StyleParamKey::text_font_fill, p.fill); _rule.get(StyleParamKey::text_font_stroke_color, p.strokeColor); _rule.get(StyleParamKey::text_font_stroke_width, p.strokeWidth); p.strokeWidth *= m_style.pixelScale(); _rule.get(StyleParamKey::transition_hide_time, p.labelOptions.hideTransition.time); _rule.get(StyleParamKey::transition_selected_time, p.labelOptions.selectTransition.time); _rule.get(StyleParamKey::transition_show_time, p.labelOptions.showTransition.time); uint32_t priority; if (_iconText) { if (_rule.get(StyleParamKey::text_priority, priority)) { p.labelOptions.priority = (float)priority; } _rule.get(StyleParamKey::text_collide, p.labelOptions.collide); _rule.get(StyleParamKey::text_interactive, p.interactive); _rule.get(StyleParamKey::text_offset, p.labelOptions.offset); p.labelOptions.offset *= m_style.pixelScale(); _rule.get(StyleParamKey::text_anchor, p.labelOptions.anchors); if (p.labelOptions.anchors.count == 0) { p.labelOptions.anchors.anchor = { LabelProperty::Anchor::bottom, LabelProperty::Anchor::top, LabelProperty::Anchor::right, LabelProperty::Anchor::left }; p.labelOptions.anchors.count = 4; } _rule.get(StyleParamKey::text_transition_hide_time, p.labelOptions.hideTransition.time); _rule.get(StyleParamKey::text_transition_selected_time, p.labelOptions.selectTransition.time); _rule.get(StyleParamKey::text_transition_show_time, p.labelOptions.showTransition.time); } else { if (_rule.get(StyleParamKey::priority, priority)) { p.labelOptions.priority = (float)priority; } _rule.get(StyleParamKey::collide, p.labelOptions.collide); _rule.get(StyleParamKey::interactive, p.interactive); _rule.get(StyleParamKey::offset, p.labelOptions.offset); p.labelOptions.offset *= m_style.pixelScale(); _rule.get(StyleParamKey::anchor, p.labelOptions.anchors); if (p.labelOptions.anchors.count == 0) { p.labelOptions.anchors.anchor = { LabelProperty::Anchor::center }; p.labelOptions.anchors.count = 1; } } _rule.get(StyleParamKey::text_wrap, p.maxLineWidth); size_t repeatGroupHash = 0; std::string repeatGroup; if (_rule.get(StyleParamKey::text_repeat_group, repeatGroup)) { hash_combine(repeatGroupHash, repeatGroup); } else { repeatGroupHash = _rule.getParamSetHash(); } StyleParam::Width repeatDistance; if (_rule.get(StyleParamKey::text_repeat_distance, repeatDistance)) { p.labelOptions.repeatDistance = repeatDistance.value; } else { p.labelOptions.repeatDistance = View::s_pixelsPerTile; } hash_combine(repeatGroupHash, p.text); p.labelOptions.repeatGroup = repeatGroupHash; p.labelOptions.repeatDistance *= m_style.pixelScale(); if (p.interactive) { // TODO optimization: for icon-text use the parent's properties p.labelOptions.properties = std::make_shared<Properties>(_props); } if (auto* transform = _rule.get<std::string>(StyleParamKey::text_transform)) { TextLabelProperty::transform(*transform, p.transform); } if (auto* align = _rule.get<std::string>(StyleParamKey::text_align)) { bool res = TextLabelProperty::align(*align, p.align); if (!res && p.labelOptions.anchors.count > 0) { p.align = TextLabelProperty::alignFromAnchor(p.labelOptions.anchors[0]); } } _rule.get(StyleParamKey::text_required, p.labelOptions.required); // TODO style option? p.labelOptions.buffer = p.fontSize * 0.25f; std::hash<TextStyle::Parameters> hash; p.labelOptions.paramHash = hash(p); p.lineSpacing = 2 * m_style.pixelScale(); return p; }