summaryrefslogtreecommitdiff
path: root/src/mbgl/layer/symbol_layer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/layer/symbol_layer.cpp')
-rw-r--r--src/mbgl/layer/symbol_layer.cpp542
1 files changed, 364 insertions, 178 deletions
diff --git a/src/mbgl/layer/symbol_layer.cpp b/src/mbgl/layer/symbol_layer.cpp
index b3222f9368..de2428fd25 100644
--- a/src/mbgl/layer/symbol_layer.cpp
+++ b/src/mbgl/layer/symbol_layer.cpp
@@ -1,188 +1,374 @@
+// This file is generated. Edit scripts/generate-style-code.js, then run `make style-code`.
+
#include <mbgl/layer/symbol_layer.hpp>
-#include <mbgl/renderer/symbol_bucket.hpp>
-#include <mbgl/style/style_bucket_parameters.hpp>
+#include <mbgl/layer/symbol_layer_impl.hpp>
namespace mbgl {
-std::unique_ptr<StyleLayer> SymbolLayer::clone() const {
+SymbolLayer::SymbolLayer(const std::string& layerID)
+ : Layer(Type::Symbol, std::make_unique<Impl>())
+ , impl(static_cast<Impl*>(baseImpl.get())) {
+ impl->id = layerID;
+}
+
+SymbolLayer::SymbolLayer(const Impl& other)
+ : Layer(Type::Symbol, std::make_unique<Impl>(other))
+ , impl(static_cast<Impl*>(baseImpl.get())) {
+}
+
+SymbolLayer::~SymbolLayer() = default;
+
+std::unique_ptr<Layer> SymbolLayer::Impl::clone() const {
return std::make_unique<SymbolLayer>(*this);
}
-void SymbolLayer::parseLayout(const JSValue& value) {
- layout.symbolPlacement.parse("symbol-placement", value);
- layout.symbolSpacing.parse("symbol-spacing", value);
- layout.symbolAvoidEdges.parse("symbol-avoid-edges", value);
-
- layout.iconAllowOverlap.parse("icon-allow-overlap", value);
- layout.iconIgnorePlacement.parse("icon-ignore-placement", value);
- layout.iconOptional.parse("icon-optional", value);
- layout.iconRotationAlignment.parse("icon-rotation-alignment", value);
- layout.iconSize.parse("icon-size", value);
- layout.iconImage.parse("icon-image", value);
- layout.iconRotate.parse("icon-rotate", value);
- layout.iconPadding.parse("icon-padding", value);
- layout.iconKeepUpright.parse("icon-keep-upright", value);
- layout.iconOffset.parse("icon-offset", value);
-
- layout.textRotationAlignment.parse("text-rotation-alignment", value);
- layout.textField.parse("text-field", value);
- layout.textFont.parse("text-font", value);
- layout.textSize.parse("text-size", value);
- layout.textMaxWidth.parse("text-max-width", value);
- layout.textLineHeight.parse("text-line-height", value);
- layout.textLetterSpacing.parse("text-letter-spacing", value);
- layout.textJustify.parse("text-justify", value);
- layout.textAnchor.parse("text-anchor", value);
- layout.textMaxAngle.parse("text-max-angle", value);
- layout.textRotate.parse("text-rotate", value);
- layout.textPadding.parse("text-padding", value);
- layout.textKeepUpright.parse("text-keep-upright", value);
- layout.textTransform.parse("text-transform", value);
- layout.textOffset.parse("text-offset", value);
- layout.textAllowOverlap.parse("text-allow-overlap", value);
- layout.textIgnorePlacement.parse("text-ignore-placement", value);
- layout.textOptional.parse("text-optional", value);
-}
-
-void SymbolLayer::parsePaints(const JSValue& layer) {
- paint.iconOpacity.parse("icon-opacity", layer);
- paint.iconColor.parse("icon-color", layer);
- paint.iconHaloColor.parse("icon-halo-color", layer);
- paint.iconHaloWidth.parse("icon-halo-width", layer);
- paint.iconHaloBlur.parse("icon-halo-blur", layer);
- paint.iconTranslate.parse("icon-translate", layer);
- paint.iconTranslateAnchor.parse("icon-translate-anchor", layer);
-
- paint.textOpacity.parse("text-opacity", layer);
- paint.textColor.parse("text-color", layer);
- paint.textHaloColor.parse("text-halo-color", layer);
- paint.textHaloWidth.parse("text-halo-width", layer);
- paint.textHaloBlur.parse("text-halo-blur", layer);
- paint.textTranslate.parse("text-translate", layer);
- paint.textTranslateAnchor.parse("text-translate-anchor", layer);
-}
-
-void SymbolLayer::cascade(const StyleCascadeParameters& parameters) {
- paint.iconOpacity.cascade(parameters);
- paint.iconColor.cascade(parameters);
- paint.iconHaloColor.cascade(parameters);
- paint.iconHaloWidth.cascade(parameters);
- paint.iconHaloBlur.cascade(parameters);
- paint.iconTranslate.cascade(parameters);
- paint.iconTranslateAnchor.cascade(parameters);
-
- paint.textOpacity.cascade(parameters);
- paint.textColor.cascade(parameters);
- paint.textHaloColor.cascade(parameters);
- paint.textHaloWidth.cascade(parameters);
- paint.textHaloBlur.cascade(parameters);
- paint.textTranslate.cascade(parameters);
- paint.textTranslateAnchor.cascade(parameters);
-}
-
-bool SymbolLayer::recalculate(const StyleCalculationParameters& parameters) {
- bool hasTransitions = false;
-
- hasTransitions |= paint.iconOpacity.calculate(parameters);
- hasTransitions |= paint.iconColor.calculate(parameters);
- hasTransitions |= paint.iconHaloColor.calculate(parameters);
- hasTransitions |= paint.iconHaloWidth.calculate(parameters);
- hasTransitions |= paint.iconHaloBlur.calculate(parameters);
- hasTransitions |= paint.iconTranslate.calculate(parameters);
- hasTransitions |= paint.iconTranslateAnchor.calculate(parameters);
-
- hasTransitions |= paint.textOpacity.calculate(parameters);
- hasTransitions |= paint.textColor.calculate(parameters);
- hasTransitions |= paint.textHaloColor.calculate(parameters);
- hasTransitions |= paint.textHaloWidth.calculate(parameters);
- hasTransitions |= paint.textHaloBlur.calculate(parameters);
- hasTransitions |= paint.textTranslate.calculate(parameters);
- hasTransitions |= paint.textTranslateAnchor.calculate(parameters);
-
- // text-size and icon-size are layout properties but they also need to be evaluated as paint properties:
- layout.iconSize.calculate(parameters);
- layout.textSize.calculate(parameters);
- iconSize = layout.iconSize;
- textSize = layout.textSize;
-
- passes = ((paint.iconOpacity > 0 && (paint.iconColor.value[3] > 0 || paint.iconHaloColor.value[3] > 0) && iconSize > 0)
- || (paint.textOpacity > 0 && (paint.textColor.value[3] > 0 || paint.textHaloColor.value[3] > 0) && textSize > 0))
- ? RenderPass::Translucent : RenderPass::None;
-
- return hasTransitions;
-}
-
-std::unique_ptr<Bucket> SymbolLayer::createBucket(StyleBucketParameters& parameters) const {
- auto bucket = std::make_unique<SymbolBucket>(parameters.tileID.overscaleFactor(),
- parameters.tileID.overscaledZ,
- parameters.mode,
- id,
- parameters.layer.getName());
-
- bucket->layout = layout;
-
- StyleCalculationParameters p(parameters.tileID.overscaledZ);
- bucket->layout.symbolPlacement.calculate(p);
- if (bucket->layout.symbolPlacement.value == SymbolPlacementType::Line) {
- bucket->layout.iconRotationAlignment.value = RotationAlignmentType::Map;
- bucket->layout.textRotationAlignment.value = RotationAlignmentType::Map;
- };
- bucket->layout.symbolSpacing.calculate(p);
- bucket->layout.symbolAvoidEdges.calculate(p);
-
- bucket->layout.iconAllowOverlap.calculate(p);
- bucket->layout.iconIgnorePlacement.calculate(p);
- bucket->layout.iconOptional.calculate(p);
- bucket->layout.iconRotationAlignment.calculate(p);
- bucket->layout.iconImage.calculate(p);
- bucket->layout.iconPadding.calculate(p);
- bucket->layout.iconRotate.calculate(p);
- bucket->layout.iconKeepUpright.calculate(p);
- bucket->layout.iconOffset.calculate(p);
-
- bucket->layout.textRotationAlignment.calculate(p);
- bucket->layout.textField.calculate(p);
- bucket->layout.textFont.calculate(p);
- bucket->layout.textMaxWidth.calculate(p);
- bucket->layout.textLineHeight.calculate(p);
- bucket->layout.textLetterSpacing.calculate(p);
- bucket->layout.textMaxAngle.calculate(p);
- bucket->layout.textRotate.calculate(p);
- bucket->layout.textPadding.calculate(p);
- bucket->layout.textIgnorePlacement.calculate(p);
- bucket->layout.textOptional.calculate(p);
- bucket->layout.textJustify.calculate(p);
- bucket->layout.textAnchor.calculate(p);
- bucket->layout.textKeepUpright.calculate(p);
- bucket->layout.textTransform.calculate(p);
- bucket->layout.textOffset.calculate(p);
- bucket->layout.textAllowOverlap.calculate(p);
-
- bucket->layout.iconSize.calculate(StyleCalculationParameters(18));
- bucket->layout.textSize.calculate(StyleCalculationParameters(18));
- bucket->iconMaxSize = bucket->layout.iconSize;
- bucket->textMaxSize = bucket->layout.textSize;
- bucket->layout.iconSize.calculate(StyleCalculationParameters(p.z + 1));
- bucket->layout.textSize.calculate(StyleCalculationParameters(p.z + 1));
-
- bucket->parseFeatures(parameters.layer, filter);
-
- if (bucket->needsDependencies(parameters.glyphStore, parameters.spriteStore)) {
- parameters.partialParse = true;
- }
-
- // We do not add features if the parser is in a "partial" state because
- // the layer ordering needs to be respected when calculating text
- // collisions. Although, at this point, we requested all the resources
- // needed by this tile.
- if (!parameters.partialParse) {
- bucket->addFeatures(parameters.tileUID,
- *spriteAtlas,
- parameters.glyphAtlas,
- parameters.glyphStore);
- }
-
- return std::move(bucket);
+// Source
+
+void SymbolLayer::setSource(const std::string& sourceID, const std::string& sourceLayer) {
+ impl->source = sourceID;
+ impl->sourceLayer = sourceLayer;
+}
+
+const std::string& SymbolLayer::getSourceID() const {
+ return impl->source;
+}
+
+const std::string& SymbolLayer::getSourceLayer() const {
+ return impl->sourceLayer;
+}
+
+// Layout properties
+
+Function<SymbolPlacementType> SymbolLayer::getSymbolPlacement() const {
+ return *impl->layout.symbolPlacement.parsedValue;
+}
+
+void SymbolLayer::setSymbolPlacement(Function<SymbolPlacementType> value) {
+ impl->layout.symbolPlacement.parsedValue = value;
+}
+Function<float> SymbolLayer::getSymbolSpacing() const {
+ return *impl->layout.symbolSpacing.parsedValue;
+}
+
+void SymbolLayer::setSymbolSpacing(Function<float> value) {
+ impl->layout.symbolSpacing.parsedValue = value;
+}
+Function<bool> SymbolLayer::getSymbolAvoidEdges() const {
+ return *impl->layout.symbolAvoidEdges.parsedValue;
+}
+
+void SymbolLayer::setSymbolAvoidEdges(Function<bool> value) {
+ impl->layout.symbolAvoidEdges.parsedValue = value;
+}
+Function<bool> SymbolLayer::getIconAllowOverlap() const {
+ return *impl->layout.iconAllowOverlap.parsedValue;
+}
+
+void SymbolLayer::setIconAllowOverlap(Function<bool> value) {
+ impl->layout.iconAllowOverlap.parsedValue = value;
+}
+Function<bool> SymbolLayer::getIconIgnorePlacement() const {
+ return *impl->layout.iconIgnorePlacement.parsedValue;
+}
+
+void SymbolLayer::setIconIgnorePlacement(Function<bool> value) {
+ impl->layout.iconIgnorePlacement.parsedValue = value;
+}
+Function<bool> SymbolLayer::getIconOptional() const {
+ return *impl->layout.iconOptional.parsedValue;
+}
+
+void SymbolLayer::setIconOptional(Function<bool> value) {
+ impl->layout.iconOptional.parsedValue = value;
+}
+Function<RotationAlignmentType> SymbolLayer::getIconRotationAlignment() const {
+ return *impl->layout.iconRotationAlignment.parsedValue;
+}
+
+void SymbolLayer::setIconRotationAlignment(Function<RotationAlignmentType> value) {
+ impl->layout.iconRotationAlignment.parsedValue = value;
+}
+Function<float> SymbolLayer::getIconSize() const {
+ return *impl->layout.iconSize.parsedValue;
+}
+
+void SymbolLayer::setIconSize(Function<float> value) {
+ impl->layout.iconSize.parsedValue = value;
+}
+Function<std::string> SymbolLayer::getIconImage() const {
+ return *impl->layout.iconImage.parsedValue;
+}
+
+void SymbolLayer::setIconImage(Function<std::string> value) {
+ impl->layout.iconImage.parsedValue = value;
+}
+Function<float> SymbolLayer::getIconRotate() const {
+ return *impl->layout.iconRotate.parsedValue;
+}
+
+void SymbolLayer::setIconRotate(Function<float> value) {
+ impl->layout.iconRotate.parsedValue = value;
+}
+Function<float> SymbolLayer::getIconPadding() const {
+ return *impl->layout.iconPadding.parsedValue;
+}
+
+void SymbolLayer::setIconPadding(Function<float> value) {
+ impl->layout.iconPadding.parsedValue = value;
+}
+Function<bool> SymbolLayer::getIconKeepUpright() const {
+ return *impl->layout.iconKeepUpright.parsedValue;
+}
+
+void SymbolLayer::setIconKeepUpright(Function<bool> value) {
+ impl->layout.iconKeepUpright.parsedValue = value;
+}
+Function<std::array<float, 2>> SymbolLayer::getIconOffset() const {
+ return *impl->layout.iconOffset.parsedValue;
+}
+
+void SymbolLayer::setIconOffset(Function<std::array<float, 2>> value) {
+ impl->layout.iconOffset.parsedValue = value;
+}
+Function<RotationAlignmentType> SymbolLayer::getTextRotationAlignment() const {
+ return *impl->layout.textRotationAlignment.parsedValue;
+}
+
+void SymbolLayer::setTextRotationAlignment(Function<RotationAlignmentType> value) {
+ impl->layout.textRotationAlignment.parsedValue = value;
+}
+Function<std::string> SymbolLayer::getTextField() const {
+ return *impl->layout.textField.parsedValue;
+}
+
+void SymbolLayer::setTextField(Function<std::string> value) {
+ impl->layout.textField.parsedValue = value;
+}
+Function<std::vector<std::string>> SymbolLayer::getTextFont() const {
+ return *impl->layout.textFont.parsedValue;
+}
+
+void SymbolLayer::setTextFont(Function<std::vector<std::string>> value) {
+ impl->layout.textFont.parsedValue = value;
+}
+Function<float> SymbolLayer::getTextSize() const {
+ return *impl->layout.textSize.parsedValue;
+}
+
+void SymbolLayer::setTextSize(Function<float> value) {
+ impl->layout.textSize.parsedValue = value;
+}
+Function<float> SymbolLayer::getTextMaxWidth() const {
+ return *impl->layout.textMaxWidth.parsedValue;
+}
+
+void SymbolLayer::setTextMaxWidth(Function<float> value) {
+ impl->layout.textMaxWidth.parsedValue = value;
+}
+Function<float> SymbolLayer::getTextLineHeight() const {
+ return *impl->layout.textLineHeight.parsedValue;
+}
+
+void SymbolLayer::setTextLineHeight(Function<float> value) {
+ impl->layout.textLineHeight.parsedValue = value;
+}
+Function<float> SymbolLayer::getTextLetterSpacing() const {
+ return *impl->layout.textLetterSpacing.parsedValue;
+}
+
+void SymbolLayer::setTextLetterSpacing(Function<float> value) {
+ impl->layout.textLetterSpacing.parsedValue = value;
+}
+Function<TextJustifyType> SymbolLayer::getTextJustify() const {
+ return *impl->layout.textJustify.parsedValue;
+}
+
+void SymbolLayer::setTextJustify(Function<TextJustifyType> value) {
+ impl->layout.textJustify.parsedValue = value;
+}
+Function<TextAnchorType> SymbolLayer::getTextAnchor() const {
+ return *impl->layout.textAnchor.parsedValue;
+}
+
+void SymbolLayer::setTextAnchor(Function<TextAnchorType> value) {
+ impl->layout.textAnchor.parsedValue = value;
+}
+Function<float> SymbolLayer::getTextMaxAngle() const {
+ return *impl->layout.textMaxAngle.parsedValue;
+}
+
+void SymbolLayer::setTextMaxAngle(Function<float> value) {
+ impl->layout.textMaxAngle.parsedValue = value;
+}
+Function<float> SymbolLayer::getTextRotate() const {
+ return *impl->layout.textRotate.parsedValue;
+}
+
+void SymbolLayer::setTextRotate(Function<float> value) {
+ impl->layout.textRotate.parsedValue = value;
+}
+Function<float> SymbolLayer::getTextPadding() const {
+ return *impl->layout.textPadding.parsedValue;
+}
+
+void SymbolLayer::setTextPadding(Function<float> value) {
+ impl->layout.textPadding.parsedValue = value;
+}
+Function<bool> SymbolLayer::getTextKeepUpright() const {
+ return *impl->layout.textKeepUpright.parsedValue;
+}
+
+void SymbolLayer::setTextKeepUpright(Function<bool> value) {
+ impl->layout.textKeepUpright.parsedValue = value;
+}
+Function<TextTransformType> SymbolLayer::getTextTransform() const {
+ return *impl->layout.textTransform.parsedValue;
+}
+
+void SymbolLayer::setTextTransform(Function<TextTransformType> value) {
+ impl->layout.textTransform.parsedValue = value;
+}
+Function<std::array<float, 2>> SymbolLayer::getTextOffset() const {
+ return *impl->layout.textOffset.parsedValue;
+}
+
+void SymbolLayer::setTextOffset(Function<std::array<float, 2>> value) {
+ impl->layout.textOffset.parsedValue = value;
+}
+Function<bool> SymbolLayer::getTextAllowOverlap() const {
+ return *impl->layout.textAllowOverlap.parsedValue;
+}
+
+void SymbolLayer::setTextAllowOverlap(Function<bool> value) {
+ impl->layout.textAllowOverlap.parsedValue = value;
+}
+Function<bool> SymbolLayer::getTextIgnorePlacement() const {
+ return *impl->layout.textIgnorePlacement.parsedValue;
+}
+
+void SymbolLayer::setTextIgnorePlacement(Function<bool> value) {
+ impl->layout.textIgnorePlacement.parsedValue = value;
+}
+Function<bool> SymbolLayer::getTextOptional() const {
+ return *impl->layout.textOptional.parsedValue;
+}
+
+void SymbolLayer::setTextOptional(Function<bool> value) {
+ impl->layout.textOptional.parsedValue = value;
+}
+
+// Paint properties
+
+Function<float> SymbolLayer::getIconOpacity() const {
+ return impl->paint.iconOpacity.values.at(ClassID::Default);
+}
+
+void SymbolLayer::setIconOpacity(Function<float> value) {
+ impl->paint.iconOpacity.values.emplace(ClassID::Default, value);
+}
+
+Function<Color> SymbolLayer::getIconColor() const {
+ return impl->paint.iconColor.values.at(ClassID::Default);
+}
+
+void SymbolLayer::setIconColor(Function<Color> value) {
+ impl->paint.iconColor.values.emplace(ClassID::Default, value);
+}
+
+Function<Color> SymbolLayer::getIconHaloColor() const {
+ return impl->paint.iconHaloColor.values.at(ClassID::Default);
+}
+
+void SymbolLayer::setIconHaloColor(Function<Color> value) {
+ impl->paint.iconHaloColor.values.emplace(ClassID::Default, value);
+}
+
+Function<float> SymbolLayer::getIconHaloWidth() const {
+ return impl->paint.iconHaloWidth.values.at(ClassID::Default);
+}
+
+void SymbolLayer::setIconHaloWidth(Function<float> value) {
+ impl->paint.iconHaloWidth.values.emplace(ClassID::Default, value);
+}
+
+Function<float> SymbolLayer::getIconHaloBlur() const {
+ return impl->paint.iconHaloBlur.values.at(ClassID::Default);
+}
+
+void SymbolLayer::setIconHaloBlur(Function<float> value) {
+ impl->paint.iconHaloBlur.values.emplace(ClassID::Default, value);
+}
+
+Function<std::array<float, 2>> SymbolLayer::getIconTranslate() const {
+ return impl->paint.iconTranslate.values.at(ClassID::Default);
+}
+
+void SymbolLayer::setIconTranslate(Function<std::array<float, 2>> value) {
+ impl->paint.iconTranslate.values.emplace(ClassID::Default, value);
+}
+
+Function<TranslateAnchorType> SymbolLayer::getIconTranslateAnchor() const {
+ return impl->paint.iconTranslateAnchor.values.at(ClassID::Default);
+}
+
+void SymbolLayer::setIconTranslateAnchor(Function<TranslateAnchorType> value) {
+ impl->paint.iconTranslateAnchor.values.emplace(ClassID::Default, value);
+}
+
+Function<float> SymbolLayer::getTextOpacity() const {
+ return impl->paint.textOpacity.values.at(ClassID::Default);
+}
+
+void SymbolLayer::setTextOpacity(Function<float> value) {
+ impl->paint.textOpacity.values.emplace(ClassID::Default, value);
+}
+
+Function<Color> SymbolLayer::getTextColor() const {
+ return impl->paint.textColor.values.at(ClassID::Default);
+}
+
+void SymbolLayer::setTextColor(Function<Color> value) {
+ impl->paint.textColor.values.emplace(ClassID::Default, value);
+}
+
+Function<Color> SymbolLayer::getTextHaloColor() const {
+ return impl->paint.textHaloColor.values.at(ClassID::Default);
+}
+
+void SymbolLayer::setTextHaloColor(Function<Color> value) {
+ impl->paint.textHaloColor.values.emplace(ClassID::Default, value);
+}
+
+Function<float> SymbolLayer::getTextHaloWidth() const {
+ return impl->paint.textHaloWidth.values.at(ClassID::Default);
+}
+
+void SymbolLayer::setTextHaloWidth(Function<float> value) {
+ impl->paint.textHaloWidth.values.emplace(ClassID::Default, value);
+}
+
+Function<float> SymbolLayer::getTextHaloBlur() const {
+ return impl->paint.textHaloBlur.values.at(ClassID::Default);
+}
+
+void SymbolLayer::setTextHaloBlur(Function<float> value) {
+ impl->paint.textHaloBlur.values.emplace(ClassID::Default, value);
+}
+
+Function<std::array<float, 2>> SymbolLayer::getTextTranslate() const {
+ return impl->paint.textTranslate.values.at(ClassID::Default);
+}
+
+void SymbolLayer::setTextTranslate(Function<std::array<float, 2>> value) {
+ impl->paint.textTranslate.values.emplace(ClassID::Default, value);
+}
+
+Function<TranslateAnchorType> SymbolLayer::getTextTranslateAnchor() const {
+ return impl->paint.textTranslateAnchor.values.at(ClassID::Default);
+}
+
+void SymbolLayer::setTextTranslateAnchor(Function<TranslateAnchorType> value) {
+ impl->paint.textTranslateAnchor.values.emplace(ClassID::Default, value);
}
} // namespace mbgl