diff options
Diffstat (limited to 'src/mbgl/layer')
-rw-r--r-- | src/mbgl/layer/background_layer.cpp | 31 | ||||
-rw-r--r-- | src/mbgl/layer/background_layer.hpp | 18 | ||||
-rw-r--r-- | src/mbgl/layer/circle_layer.cpp | 46 | ||||
-rw-r--r-- | src/mbgl/layer/circle_layer.hpp | 25 | ||||
-rw-r--r-- | src/mbgl/layer/fill_layer.cpp | 59 | ||||
-rw-r--r-- | src/mbgl/layer/fill_layer.hpp | 22 | ||||
-rw-r--r-- | src/mbgl/layer/line_layer.cpp | 76 | ||||
-rw-r--r-- | src/mbgl/layer/line_layer.hpp | 31 | ||||
-rw-r--r-- | src/mbgl/layer/raster_layer.cpp | 57 | ||||
-rw-r--r-- | src/mbgl/layer/raster_layer.hpp | 22 | ||||
-rw-r--r-- | src/mbgl/layer/symbol_layer.cpp | 113 | ||||
-rw-r--r-- | src/mbgl/layer/symbol_layer.hpp | 37 |
12 files changed, 290 insertions, 247 deletions
diff --git a/src/mbgl/layer/background_layer.cpp b/src/mbgl/layer/background_layer.cpp index 0a86e2db14..51000e53ba 100644 --- a/src/mbgl/layer/background_layer.cpp +++ b/src/mbgl/layer/background_layer.cpp @@ -1,5 +1,4 @@ #include <mbgl/layer/background_layer.hpp> -#include <mbgl/style/property_parsing.hpp> #include <mbgl/renderer/bucket.hpp> namespace mbgl { @@ -7,34 +6,32 @@ namespace mbgl { std::unique_ptr<StyleLayer> BackgroundLayer::clone() const { std::unique_ptr<BackgroundLayer> result = std::make_unique<BackgroundLayer>(); result->copy(*this); - result->paints.paints = paints.paints; + result->paint = paint; return std::move(result); } void BackgroundLayer::parsePaints(const JSVal& layer) { - paints.parseEach(layer, [&] (ClassProperties& paint, const JSVal& value) { - parseProperty<Function<float>>("background-opacity", PropertyKey::BackgroundOpacity, paint, value); - parseProperty<Function<Color>>("background-color", PropertyKey::BackgroundColor, paint, value); - parseProperty<Function<Faded<std::string>>>("background-pattern", PropertyKey::BackgroundImage, paint, value); - }); + paint.opacity.parse("background-opacity", layer); + paint.color.parse("background-color", layer); + paint.pattern.parse("background-pattern", layer); } void BackgroundLayer::cascade(const StyleCascadeParameters& parameters) { - paints.cascade(parameters); + paint.opacity.cascade(parameters); + paint.color.cascade(parameters); + paint.pattern.cascade(parameters); } -bool BackgroundLayer::hasTransitions() const { - return paints.hasTransitions(); -} +bool BackgroundLayer::recalculate(const StyleCalculationParameters& parameters) { + bool hasTransitions = false; -void BackgroundLayer::recalculate(const StyleCalculationParameters& parameters) { - paints.removeExpiredTransitions(parameters.now); + hasTransitions |= paint.opacity.calculate(parameters); + hasTransitions |= paint.color.calculate(parameters); + hasTransitions |= paint.pattern.calculate(parameters); - paints.calculateTransitioned(PropertyKey::BackgroundOpacity, properties.opacity, parameters); - paints.calculateTransitioned(PropertyKey::BackgroundColor, properties.color, parameters); - paints.calculate(PropertyKey::BackgroundImage, properties.image, parameters); + passes = paint.opacity > 0 ? RenderPass::Translucent : RenderPass::None; - passes = properties.isVisible() ? RenderPass::Translucent : RenderPass::None; + return hasTransitions; } std::unique_ptr<Bucket> BackgroundLayer::createBucket(StyleBucketParameters&) const { diff --git a/src/mbgl/layer/background_layer.hpp b/src/mbgl/layer/background_layer.hpp index 11d06b2cd2..a65b9e0183 100644 --- a/src/mbgl/layer/background_layer.hpp +++ b/src/mbgl/layer/background_layer.hpp @@ -2,11 +2,17 @@ #define MBGL_BACKGROUND_LAYER #include <mbgl/style/style_layer.hpp> -#include <mbgl/style/style_properties.hpp> -#include <mbgl/style/paint_properties_map.hpp> +#include <mbgl/style/paint_property.hpp> namespace mbgl { +class BackgroundPaintProperties { +public: + PaintProperty<float> opacity = 1.0f; + PaintProperty<Color> color = { {{ 0, 0, 0, 1 }} }; + PaintProperty<std::string, Faded<std::string>> pattern = { "" }; +}; + class BackgroundLayer : public StyleLayer { public: std::unique_ptr<StyleLayer> clone() const override; @@ -15,15 +21,11 @@ public: void parsePaints(const JSVal&) override; void cascade(const StyleCascadeParameters&) override; - void recalculate(const StyleCalculationParameters&) override; + bool recalculate(const StyleCalculationParameters&) override; std::unique_ptr<Bucket> createBucket(StyleBucketParameters&) const override; - bool hasTransitions() const override; - - PaintPropertiesMap paints; - - BackgroundPaintProperties properties; + BackgroundPaintProperties paint; }; } diff --git a/src/mbgl/layer/circle_layer.cpp b/src/mbgl/layer/circle_layer.cpp index 7680136555..e33476a4a8 100644 --- a/src/mbgl/layer/circle_layer.cpp +++ b/src/mbgl/layer/circle_layer.cpp @@ -1,5 +1,4 @@ #include <mbgl/layer/circle_layer.hpp> -#include <mbgl/style/property_parsing.hpp> #include <mbgl/style/style_bucket_parameters.hpp> #include <mbgl/renderer/circle_bucket.hpp> @@ -8,40 +7,41 @@ namespace mbgl { std::unique_ptr<StyleLayer> CircleLayer::clone() const { std::unique_ptr<CircleLayer> result = std::make_unique<CircleLayer>(); result->copy(*this); - result->paints.paints = paints.paints; + result->paint = paint; return std::move(result); } void CircleLayer::parsePaints(const JSVal& layer) { - paints.parseEach(layer, [&] (ClassProperties& paint, const JSVal& value) { - parseProperty<Function<float>>("circle-radius", PropertyKey::CircleRadius, paint, value); - parseProperty<Function<Color>>("circle-color", PropertyKey::CircleColor, paint, value); - parseProperty<Function<float>>("circle-opacity", PropertyKey::CircleOpacity, paint, value); - parseProperty<Function<std::array<float,2>>>("circle-translate", PropertyKey::CircleTranslate, paint, value); - parseProperty<Function<TranslateAnchorType>>("circle-translate-anchor", PropertyKey::CircleTranslateAnchor, paint, value); - parseProperty<Function<float>>("circle-blur", PropertyKey::CircleBlur, paint, value); - }); + paint.radius.parse("circle-radius", layer); + paint.color.parse("circle-color", layer); + paint.opacity.parse("circle-opacity", layer); + paint.translate.parse("circle-translate", layer); + paint.translateAnchor.parse("circle-translate-anchor", layer); + paint.blur.parse("circle-blur", layer); } void CircleLayer::cascade(const StyleCascadeParameters& parameters) { - paints.cascade(parameters); + paint.radius.cascade(parameters); + paint.color.cascade(parameters); + paint.opacity.cascade(parameters); + paint.translate.cascade(parameters); + paint.translateAnchor.cascade(parameters); + paint.blur.cascade(parameters); } -bool CircleLayer::hasTransitions() const { - return paints.hasTransitions(); -} +bool CircleLayer::recalculate(const StyleCalculationParameters& parameters) { + bool hasTransitions = false; -void CircleLayer::recalculate(const StyleCalculationParameters& parameters) { - paints.removeExpiredTransitions(parameters.now); + hasTransitions |= paint.radius.calculate(parameters); + hasTransitions |= paint.color.calculate(parameters); + hasTransitions |= paint.opacity.calculate(parameters); + hasTransitions |= paint.translate.calculate(parameters); + hasTransitions |= paint.translateAnchor.calculate(parameters); + hasTransitions |= paint.blur.calculate(parameters); - paints.calculateTransitioned(PropertyKey::CircleRadius, properties.radius, parameters); - paints.calculateTransitioned(PropertyKey::CircleColor, properties.color, parameters); - paints.calculateTransitioned(PropertyKey::CircleOpacity, properties.opacity, parameters); - paints.calculateTransitioned(PropertyKey::CircleTranslate, properties.translate, parameters); - paints.calculate(PropertyKey::CircleTranslateAnchor, properties.translateAnchor, parameters); - paints.calculateTransitioned(PropertyKey::CircleBlur, properties.blur, parameters); + passes = paint.isVisible() ? RenderPass::Translucent : RenderPass::None; - passes = properties.isVisible() ? RenderPass::Translucent : RenderPass::None; + return hasTransitions; } std::unique_ptr<Bucket> CircleLayer::createBucket(StyleBucketParameters& parameters) const { diff --git a/src/mbgl/layer/circle_layer.hpp b/src/mbgl/layer/circle_layer.hpp index 29cdf513df..eac9a915cc 100644 --- a/src/mbgl/layer/circle_layer.hpp +++ b/src/mbgl/layer/circle_layer.hpp @@ -2,11 +2,24 @@ #define MBGL_CIRCLE_LAYER #include <mbgl/style/style_layer.hpp> -#include <mbgl/style/style_properties.hpp> -#include <mbgl/style/paint_properties_map.hpp> +#include <mbgl/style/paint_property.hpp> namespace mbgl { +class CirclePaintProperties { +public: + PaintProperty<float> radius = 5.0f; + PaintProperty<Color> color = { {{ 0, 0, 0, 1 }} }; + PaintProperty<float> opacity = 1.0f; + PaintProperty<std::array<float, 2>> translate = { {{ 0, 0 }} }; + PaintProperty<TranslateAnchorType> translateAnchor = TranslateAnchorType::Map; + PaintProperty<float> blur = 0; + + bool isVisible() const { + return radius > 0 && color.value[3] > 0 && opacity > 0; + } +}; + class CircleLayer : public StyleLayer { public: std::unique_ptr<StyleLayer> clone() const override; @@ -15,15 +28,11 @@ public: void parsePaints(const JSVal&) override; void cascade(const StyleCascadeParameters&) override; - void recalculate(const StyleCalculationParameters&) override; + bool recalculate(const StyleCalculationParameters&) override; std::unique_ptr<Bucket> createBucket(StyleBucketParameters&) const override; - bool hasTransitions() const override; - - PaintPropertiesMap paints; - - CirclePaintProperties properties; + CirclePaintProperties paint; }; } diff --git a/src/mbgl/layer/fill_layer.cpp b/src/mbgl/layer/fill_layer.cpp index ad68a240fc..52a6b8fe55 100644 --- a/src/mbgl/layer/fill_layer.cpp +++ b/src/mbgl/layer/fill_layer.cpp @@ -1,5 +1,4 @@ #include <mbgl/layer/fill_layer.hpp> -#include <mbgl/style/property_parsing.hpp> #include <mbgl/style/style_bucket_parameters.hpp> #include <mbgl/renderer/fill_bucket.hpp> @@ -8,56 +7,54 @@ namespace mbgl { std::unique_ptr<StyleLayer> FillLayer::clone() const { std::unique_ptr<FillLayer> result = std::make_unique<FillLayer>(); result->copy(*this); - result->paints.paints = paints.paints; + result->paint = paint; return std::move(result); } void FillLayer::parsePaints(const JSVal& layer) { - paints.parseEach(layer, [&] (ClassProperties& paint, const JSVal& value) { - parseProperty<Function<bool>>("fill-antialias", PropertyKey::FillAntialias, paint, value); - parseProperty<Function<float>>("fill-opacity", PropertyKey::FillOpacity, paint, value); - parseProperty<PropertyTransition>("fill-opacity-transition", PropertyKey::FillOpacity, paint, value); - parseProperty<Function<Color>>("fill-color", PropertyKey::FillColor, paint, value); - parseProperty<PropertyTransition>("fill-color-transition", PropertyKey::FillColor, paint, value); - parseProperty<Function<Color>>("fill-outline-color", PropertyKey::FillOutlineColor, paint, value); - parseProperty<PropertyTransition>("fill-outline-color-transition", PropertyKey::FillOutlineColor, paint, value); - parseProperty<Function<std::array<float, 2>>>("fill-translate", PropertyKey::FillTranslate, paint, value); - parseProperty<PropertyTransition>("fill-translate-transition", PropertyKey::FillTranslate, paint, value); - parseProperty<Function<TranslateAnchorType>>("fill-translate-anchor", PropertyKey::FillTranslateAnchor, paint, value); - parseProperty<Function<Faded<std::string>>>("fill-pattern", PropertyKey::FillImage, paint, value); - }); + paint.antialias.parse("fill-antialias", layer); + paint.opacity.parse("fill-opacity", layer); + paint.color.parse("fill-color", layer); + paint.outlineColor.parse("fill-outline-color", layer); + paint.translate.parse("fill-translate", layer); + paint.translateAnchor.parse("fill-translate-anchor", layer); + paint.pattern.parse("fill-pattern", layer); } void FillLayer::cascade(const StyleCascadeParameters& parameters) { - paints.cascade(parameters); -} - -bool FillLayer::hasTransitions() const { - return paints.hasTransitions(); + paint.antialias.cascade(parameters); + paint.opacity.cascade(parameters); + paint.color.cascade(parameters); + paint.outlineColor.cascade(parameters); + paint.translate.cascade(parameters); + paint.translateAnchor.cascade(parameters); + paint.pattern.cascade(parameters); } -void FillLayer::recalculate(const StyleCalculationParameters& parameters) { - paints.removeExpiredTransitions(parameters.now); +bool FillLayer::recalculate(const StyleCalculationParameters& parameters) { + bool hasTransitions = false; - paints.calculate(PropertyKey::FillAntialias, properties.antialias, parameters); - paints.calculateTransitioned(PropertyKey::FillOpacity, properties.opacity, parameters); - paints.calculateTransitioned(PropertyKey::FillColor, properties.fill_color, parameters); - paints.calculateTransitioned(PropertyKey::FillOutlineColor, properties.stroke_color, parameters); - paints.calculateTransitioned(PropertyKey::FillTranslate, properties.translate, parameters); - paints.calculate(PropertyKey::FillTranslateAnchor, properties.translateAnchor, parameters); - paints.calculate(PropertyKey::FillImage, properties.image, parameters); + hasTransitions |= paint.antialias.calculate(parameters); + hasTransitions |= paint.opacity.calculate(parameters); + hasTransitions |= paint.color.calculate(parameters); + hasTransitions |= paint.outlineColor.calculate(parameters); + hasTransitions |= paint.translate.calculate(parameters); + hasTransitions |= paint.translateAnchor.calculate(parameters); + hasTransitions |= paint.pattern.calculate(parameters); passes = RenderPass::None; - if (properties.antialias) { + if (paint.antialias) { passes |= RenderPass::Translucent; } - if (!properties.image.from.empty() || (properties.fill_color[3] * properties.opacity) < 1.0f) { + if (!paint.pattern.value.from.empty() || (paint.color.value[3] * paint.opacity) < 1.0f) { passes |= RenderPass::Translucent; } else { passes |= RenderPass::Opaque; } + + return hasTransitions; } std::unique_ptr<Bucket> FillLayer::createBucket(StyleBucketParameters& parameters) const { diff --git a/src/mbgl/layer/fill_layer.hpp b/src/mbgl/layer/fill_layer.hpp index 5a543889c5..c0ed228d48 100644 --- a/src/mbgl/layer/fill_layer.hpp +++ b/src/mbgl/layer/fill_layer.hpp @@ -2,11 +2,21 @@ #define MBGL_FILL_LAYER #include <mbgl/style/style_layer.hpp> -#include <mbgl/style/style_properties.hpp> -#include <mbgl/style/paint_properties_map.hpp> +#include <mbgl/style/paint_property.hpp> namespace mbgl { +class FillPaintProperties { +public: + PaintProperty<bool> antialias = true; + PaintProperty<float> opacity = 1.0f; + PaintProperty<Color> color = { {{ 0, 0, 0, 1 }} }; + PaintProperty<Color> outlineColor = { {{ 0, 0, 0, -1 }} }; + PaintProperty<std::array<float, 2>> translate = { {{ 0, 0 }} }; + PaintProperty<TranslateAnchorType> translateAnchor = TranslateAnchorType::Map; + PaintProperty<std::string, Faded<std::string>> pattern = { "" }; +}; + class FillLayer : public StyleLayer { public: std::unique_ptr<StyleLayer> clone() const override; @@ -15,15 +25,11 @@ public: void parsePaints(const JSVal&) override; void cascade(const StyleCascadeParameters&) override; - void recalculate(const StyleCalculationParameters&) override; + bool recalculate(const StyleCalculationParameters&) override; std::unique_ptr<Bucket> createBucket(StyleBucketParameters&) const override; - bool hasTransitions() const override; - - PaintPropertiesMap paints; - - FillPaintProperties properties; + FillPaintProperties paint; }; } diff --git a/src/mbgl/layer/line_layer.cpp b/src/mbgl/layer/line_layer.cpp index fa1f22d5f7..f4453f819d 100644 --- a/src/mbgl/layer/line_layer.cpp +++ b/src/mbgl/layer/line_layer.cpp @@ -1,5 +1,4 @@ #include <mbgl/layer/line_layer.hpp> -#include <mbgl/style/property_parsing.hpp> #include <mbgl/style/style_bucket_parameters.hpp> #include <mbgl/renderer/line_bucket.hpp> #include <mbgl/map/tile_id.hpp> @@ -10,7 +9,7 @@ std::unique_ptr<StyleLayer> LineLayer::clone() const { std::unique_ptr<LineLayer> result = std::make_unique<LineLayer>(); result->copy(*this); result->layout = layout; - result->paints.paints = paints.paints; + result->paint = paint; return std::move(result); } @@ -22,52 +21,51 @@ void LineLayer::parseLayout(const JSVal& value) { } void LineLayer::parsePaints(const JSVal& layer) { - paints.parseEach(layer, [&] (ClassProperties& paint, const JSVal& value) { - parseProperty<Function<float>>("line-opacity", PropertyKey::LineOpacity, paint, value); - parseProperty<PropertyTransition>("line-opacity-transition", PropertyKey::LineOpacity, paint, value); - parseProperty<Function<Color>>("line-color", PropertyKey::LineColor, paint, value); - parseProperty<PropertyTransition>("line-color-transition", PropertyKey::LineColor, paint, value); - parseProperty<Function<std::array<float,2>>>("line-translate", PropertyKey::LineTranslate, paint, value); - parseProperty<PropertyTransition>("line-translate-transition", PropertyKey::LineTranslate, paint, value); - parseProperty<Function<TranslateAnchorType>>("line-translate-anchor", PropertyKey::LineTranslateAnchor, paint, value); - parseProperty<Function<float>>("line-width", PropertyKey::LineWidth, paint, value); - parseProperty<PropertyTransition>("line-width-transition", PropertyKey::LineWidth, paint, value); - parseProperty<Function<float>>("line-gap-width", PropertyKey::LineGapWidth, paint, value); - parseProperty<PropertyTransition>("line-gap-width-transition", PropertyKey::LineGapWidth, paint, value); - parseProperty<Function<float>>("line-blur", PropertyKey::LineBlur, paint, value); - parseProperty<PropertyTransition>("line-blur-transition", PropertyKey::LineBlur, paint, value); - parseProperty<Function<Faded<std::vector<float>>>>("line-dasharray", PropertyKey::LineDashArray, paint, value); - parseProperty<Function<Faded<std::string>>>("line-pattern", PropertyKey::LineImage, paint, value); - }); + paint.opacity.parse("line-opacity", layer); + paint.color.parse("line-color", layer); + paint.translate.parse("line-translate", layer); + paint.translateAnchor.parse("line-translate-anchor", layer); + paint.width.parse("line-width", layer); + paint.gapWidth.parse("line-gap-width", layer); + paint.blur.parse("line-blur", layer); + paint.dasharray.parse("line-dasharray", layer); + paint.pattern.parse("line-pattern", layer); } void LineLayer::cascade(const StyleCascadeParameters& parameters) { - paints.cascade(parameters); -} - -bool LineLayer::hasTransitions() const { - return paints.hasTransitions(); + paint.opacity.cascade(parameters); + paint.color.cascade(parameters); + paint.translate.cascade(parameters); + paint.translateAnchor.cascade(parameters); + paint.width.cascade(parameters); + paint.gapWidth.cascade(parameters); + paint.blur.cascade(parameters); + paint.dasharray.cascade(parameters); + paint.pattern.cascade(parameters); } -void LineLayer::recalculate(const StyleCalculationParameters& parameters) { - paints.removeExpiredTransitions(parameters.now); - - paints.calculateTransitioned(PropertyKey::LineOpacity, properties.opacity, parameters); - paints.calculateTransitioned(PropertyKey::LineColor, properties.color, parameters); - paints.calculateTransitioned(PropertyKey::LineTranslate, properties.translate, parameters); - paints.calculate(PropertyKey::LineTranslateAnchor, properties.translateAnchor, parameters); - paints.calculateTransitioned(PropertyKey::LineWidth, properties.width, parameters); - paints.calculateTransitioned(PropertyKey::LineGapWidth, properties.gap_width, parameters); - paints.calculateTransitioned(PropertyKey::LineBlur, properties.blur, parameters); - paints.calculate(PropertyKey::LineDashArray, properties.dash_array, parameters); - paints.calculate(PropertyKey::LineImage, properties.image, parameters); - +bool LineLayer::recalculate(const StyleCalculationParameters& parameters) { // for scaling dasharrays StyleCalculationParameters dashArrayParams = parameters; dashArrayParams.z = std::floor(dashArrayParams.z); - paints.calculate(PropertyKey::LineWidth, properties.dash_line_width, dashArrayParams); + paint.width.calculate(dashArrayParams); + paint.dashLineWidth = paint.width; + + bool hasTransitions = false; + + hasTransitions |= paint.opacity.calculate(parameters); + hasTransitions |= paint.color.calculate(parameters); + hasTransitions |= paint.translate.calculate(parameters); + hasTransitions |= paint.translateAnchor.calculate(parameters); + hasTransitions |= paint.width.calculate(parameters); + hasTransitions |= paint.gapWidth.calculate(parameters); + hasTransitions |= paint.blur.calculate(parameters); + hasTransitions |= paint.dasharray.calculate(parameters); + hasTransitions |= paint.pattern.calculate(parameters); + + passes = paint.isVisible() ? RenderPass::Translucent : RenderPass::None; - passes = properties.isVisible() ? RenderPass::Translucent : RenderPass::None; + return hasTransitions; } std::unique_ptr<Bucket> LineLayer::createBucket(StyleBucketParameters& parameters) const { diff --git a/src/mbgl/layer/line_layer.hpp b/src/mbgl/layer/line_layer.hpp index d35461131e..639ba34f57 100644 --- a/src/mbgl/layer/line_layer.hpp +++ b/src/mbgl/layer/line_layer.hpp @@ -2,9 +2,8 @@ #define MBGL_LINE_LAYER #include <mbgl/style/style_layer.hpp> -#include <mbgl/style/style_properties.hpp> -#include <mbgl/style/paint_properties_map.hpp> #include <mbgl/style/layout_property.hpp> +#include <mbgl/style/paint_property.hpp> namespace mbgl { @@ -16,6 +15,26 @@ public: LayoutProperty<float> roundLimit = 1.0f; }; +class LinePaintProperties { +public: + PaintProperty<float> opacity = 1.0f; + PaintProperty<Color> color = { {{ 0, 0, 0, 1 }} }; + PaintProperty<std::array<float, 2>> translate = { {{ 0, 0 }} }; + PaintProperty<TranslateAnchorType> translateAnchor = TranslateAnchorType::Map; + PaintProperty<float> width = 1; + PaintProperty<float> gapWidth = 0; + PaintProperty<float> blur = 0; + PaintProperty<std::vector<float>, Faded<std::vector<float>>> dasharray = { {} }; + PaintProperty<std::string, Faded<std::string>> pattern = { "" }; + + // Special case + float dashLineWidth = 1; + + bool isVisible() const { + return opacity > 0 && color.value[3] > 0 && width > 0; + } +}; + class LineLayer : public StyleLayer { public: std::unique_ptr<StyleLayer> clone() const override; @@ -24,16 +43,12 @@ public: void parsePaints(const JSVal&) override; void cascade(const StyleCascadeParameters&) override; - void recalculate(const StyleCalculationParameters&) override; + bool recalculate(const StyleCalculationParameters&) override; std::unique_ptr<Bucket> createBucket(StyleBucketParameters&) const override; - bool hasTransitions() const override; - LineLayoutProperties layout; - PaintPropertiesMap paints; - - LinePaintProperties properties; + LinePaintProperties paint; }; } diff --git a/src/mbgl/layer/raster_layer.cpp b/src/mbgl/layer/raster_layer.cpp index 3e3536afc3..5a7e686441 100644 --- a/src/mbgl/layer/raster_layer.cpp +++ b/src/mbgl/layer/raster_layer.cpp @@ -1,5 +1,4 @@ #include <mbgl/layer/raster_layer.hpp> -#include <mbgl/style/property_parsing.hpp> #include <mbgl/renderer/bucket.hpp> namespace mbgl { @@ -7,48 +6,44 @@ namespace mbgl { std::unique_ptr<StyleLayer> RasterLayer::clone() const { std::unique_ptr<RasterLayer> result = std::make_unique<RasterLayer>(); result->copy(*this); - result->paints.paints = paints.paints; + result->paint = paint; return std::move(result); } void RasterLayer::parsePaints(const JSVal& layer) { - paints.parseEach(layer, [&] (ClassProperties& paint, const JSVal& value) { - parseProperty<Function<float>>("raster-opacity", PropertyKey::RasterOpacity, paint, value); - parseProperty<PropertyTransition>("raster-opacity-transition", PropertyKey::RasterOpacity, paint, value); - parseProperty<Function<float>>("raster-hue-rotate", PropertyKey::RasterHueRotate, paint, value); - parseProperty<PropertyTransition>("raster-hue-rotate-transition", PropertyKey::RasterHueRotate, paint, value); - parseProperty<Function<float>>("raster-brightness-min", PropertyKey::RasterBrightnessLow, paint, value); - parseProperty<Function<float>>("raster-brightness-max", PropertyKey::RasterBrightnessHigh, paint, value); - parseProperty<PropertyTransition>("raster-brightness-transition", PropertyKey::RasterBrightness, paint, value); - parseProperty<Function<float>>("raster-saturation", PropertyKey::RasterSaturation, paint, value); - parseProperty<PropertyTransition>("raster-saturation-transition", PropertyKey::RasterSaturation, paint, value); - parseProperty<Function<float>>("raster-contrast", PropertyKey::RasterContrast, paint, value); - parseProperty<PropertyTransition>("raster-contrast-transition", PropertyKey::RasterContrast, paint, value); - parseProperty<Function<float>>("raster-fade-duration", PropertyKey::RasterFade, paint, value); - parseProperty<PropertyTransition>("raster-fade-duration-transition", PropertyKey::RasterFade, paint, value); - }); + paint.opacity.parse("raster-opacity", layer); + paint.hueRotate.parse("raster-hue-rotate", layer); + paint.brightnessMin.parse("raster-brightness-min", layer); + paint.brightnessMax.parse("raster-brightness-max", layer); + paint.saturation.parse("raster-saturation", layer); + paint.contrast.parse("raster-contrast", layer); + paint.fadeDuration.parse("raster-fade-duration", layer); } void RasterLayer::cascade(const StyleCascadeParameters& parameters) { - paints.cascade(parameters); + paint.opacity.cascade(parameters); + paint.hueRotate.cascade(parameters); + paint.brightnessMin.cascade(parameters); + paint.brightnessMax.cascade(parameters); + paint.saturation.cascade(parameters); + paint.contrast.cascade(parameters); + paint.fadeDuration.cascade(parameters); } -bool RasterLayer::hasTransitions() const { - return paints.hasTransitions(); -} +bool RasterLayer::recalculate(const StyleCalculationParameters& parameters) { + bool hasTransitions = false; -void RasterLayer::recalculate(const StyleCalculationParameters& parameters) { - paints.removeExpiredTransitions(parameters.now); + hasTransitions |= paint.opacity.calculate(parameters); + hasTransitions |= paint.hueRotate.calculate(parameters); + hasTransitions |= paint.brightnessMin.calculate(parameters); + hasTransitions |= paint.brightnessMax.calculate(parameters); + hasTransitions |= paint.saturation.calculate(parameters); + hasTransitions |= paint.contrast.calculate(parameters); + hasTransitions |= paint.fadeDuration.calculate(parameters); - paints.calculateTransitioned(PropertyKey::RasterOpacity, properties.opacity, parameters); - paints.calculateTransitioned(PropertyKey::RasterHueRotate, properties.hue_rotate, parameters); - paints.calculateTransitioned(PropertyKey::RasterBrightnessLow, properties.brightness[0], parameters); - paints.calculateTransitioned(PropertyKey::RasterBrightnessHigh, properties.brightness[1], parameters); - paints.calculateTransitioned(PropertyKey::RasterSaturation, properties.saturation, parameters); - paints.calculateTransitioned(PropertyKey::RasterContrast, properties.contrast, parameters); - paints.calculateTransitioned(PropertyKey::RasterFade, properties.fade, parameters); + passes = paint.opacity > 0 ? RenderPass::Translucent : RenderPass::None; - passes = properties.isVisible() ? RenderPass::Translucent : RenderPass::None; + return hasTransitions; } std::unique_ptr<Bucket> RasterLayer::createBucket(StyleBucketParameters&) const { diff --git a/src/mbgl/layer/raster_layer.hpp b/src/mbgl/layer/raster_layer.hpp index 650ffc8ef1..800236016d 100644 --- a/src/mbgl/layer/raster_layer.hpp +++ b/src/mbgl/layer/raster_layer.hpp @@ -2,11 +2,21 @@ #define MBGL_RASTER_LAYER #include <mbgl/style/style_layer.hpp> -#include <mbgl/style/style_properties.hpp> -#include <mbgl/style/paint_properties_map.hpp> +#include <mbgl/style/paint_property.hpp> namespace mbgl { +class RasterPaintProperties { +public: + PaintProperty<float> opacity = 1.0f; + PaintProperty<float> hueRotate = 0.0f; + PaintProperty<float> brightnessMin = 0.0f; + PaintProperty<float> brightnessMax = 1.0f; + PaintProperty<float> saturation = 0.0f; + PaintProperty<float> contrast = 0.0f; + PaintProperty<float> fadeDuration = 0.0f; +}; + class RasterLayer : public StyleLayer { public: std::unique_ptr<StyleLayer> clone() const override; @@ -15,15 +25,11 @@ public: void parsePaints(const JSVal&) override; void cascade(const StyleCascadeParameters&) override; - void recalculate(const StyleCalculationParameters&) override; + bool recalculate(const StyleCalculationParameters&) override; std::unique_ptr<Bucket> createBucket(StyleBucketParameters&) const override; - bool hasTransitions() const override; - - PaintPropertiesMap paints; - - RasterPaintProperties properties; + RasterPaintProperties paint; }; } diff --git a/src/mbgl/layer/symbol_layer.cpp b/src/mbgl/layer/symbol_layer.cpp index 932e500c5e..76c4970deb 100644 --- a/src/mbgl/layer/symbol_layer.cpp +++ b/src/mbgl/layer/symbol_layer.cpp @@ -1,8 +1,6 @@ #include <mbgl/layer/symbol_layer.hpp> #include <mbgl/renderer/symbol_bucket.hpp> #include <mbgl/map/tile_id.hpp> -#include <mbgl/style/property_evaluator.hpp> -#include <mbgl/style/property_parsing.hpp> #include <mbgl/style/style_bucket_parameters.hpp> namespace mbgl { @@ -11,7 +9,7 @@ std::unique_ptr<StyleLayer> SymbolLayer::clone() const { std::unique_ptr<SymbolLayer> result = std::make_unique<SymbolLayer>(); result->copy(*this); result->layout = layout; - result->paints.paints = paints.paints; + result->paint = paint; return std::move(result); } @@ -52,71 +50,70 @@ void SymbolLayer::parseLayout(const JSVal& value) { } void SymbolLayer::parsePaints(const JSVal& layer) { - paints.parseEach(layer, [&] (ClassProperties& paint, const JSVal& value) { - parseProperty<Function<float>>("icon-opacity", PropertyKey::IconOpacity, paint, value); - parseProperty<PropertyTransition>("icon-opacity-transition", PropertyKey::IconOpacity, paint, value); - parseProperty<Function<Color>>("icon-color", PropertyKey::IconColor, paint, value); - parseProperty<PropertyTransition>("icon-color-transition", PropertyKey::IconColor, paint, value); - parseProperty<Function<Color>>("icon-halo-color", PropertyKey::IconHaloColor, paint, value); - parseProperty<PropertyTransition>("icon-halo-color-transition", PropertyKey::IconHaloColor, paint, value); - parseProperty<Function<float>>("icon-halo-width", PropertyKey::IconHaloWidth, paint, value); - parseProperty<PropertyTransition>("icon-halo-width-transition", PropertyKey::IconHaloWidth, paint, value); - parseProperty<Function<float>>("icon-halo-blur", PropertyKey::IconHaloBlur, paint, value); - parseProperty<PropertyTransition>("icon-halo-blur-transition", PropertyKey::IconHaloBlur, paint, value); - parseProperty<Function<std::array<float, 2>>>("icon-translate", PropertyKey::IconTranslate, paint, value); - parseProperty<PropertyTransition>("icon-translate-transition", PropertyKey::IconTranslate, paint, value); - parseProperty<Function<TranslateAnchorType>>("icon-translate-anchor", PropertyKey::IconTranslateAnchor, paint, value); - - parseProperty<Function<float>>("text-opacity", PropertyKey::TextOpacity, paint, value); - parseProperty<PropertyTransition>("text-opacity-transition", PropertyKey::TextOpacity, paint, value); - parseProperty<Function<Color>>("text-color", PropertyKey::TextColor, paint, value); - parseProperty<PropertyTransition>("text-color-transition", PropertyKey::TextColor, paint, value); - parseProperty<Function<Color>>("text-halo-color", PropertyKey::TextHaloColor, paint, value); - parseProperty<PropertyTransition>("text-halo-color-transition", PropertyKey::TextHaloColor, paint, value); - parseProperty<Function<float>>("text-halo-width", PropertyKey::TextHaloWidth, paint, value); - parseProperty<PropertyTransition>("text-halo-width-transition", PropertyKey::TextHaloWidth, paint, value); - parseProperty<Function<float>>("text-halo-blur", PropertyKey::TextHaloBlur, paint, value); - parseProperty<PropertyTransition>("text-halo-blur-transition", PropertyKey::TextHaloBlur, paint, value); - parseProperty<Function<std::array<float, 2>>>("text-translate", PropertyKey::TextTranslate, paint, value); - parseProperty<PropertyTransition>("text-translate-transition", PropertyKey::TextTranslate, paint, value); - parseProperty<Function<TranslateAnchorType>>("text-translate-anchor", PropertyKey::TextTranslateAnchor, paint, value); - }); + paint.icon.opacity.parse("icon-opacity", layer); + paint.icon.color.parse("icon-color", layer); + paint.icon.haloColor.parse("icon-halo-color", layer); + paint.icon.haloWidth.parse("icon-halo-width", layer); + paint.icon.haloBlur.parse("icon-halo-blur", layer); + paint.icon.translate.parse("icon-translate", layer); + paint.icon.translateAnchor.parse("icon-translate-anchor", layer); + + paint.text.opacity.parse("text-opacity", layer); + paint.text.color.parse("text-color", layer); + paint.text.haloColor.parse("text-halo-color", layer); + paint.text.haloWidth.parse("text-halo-width", layer); + paint.text.haloBlur.parse("text-halo-blur", layer); + paint.text.translate.parse("text-translate", layer); + paint.text.translateAnchor.parse("text-translate-anchor", layer); } void SymbolLayer::cascade(const StyleCascadeParameters& parameters) { - paints.cascade(parameters); + paint.icon.opacity.cascade(parameters); + paint.icon.color.cascade(parameters); + paint.icon.haloColor.cascade(parameters); + paint.icon.haloWidth.cascade(parameters); + paint.icon.haloBlur.cascade(parameters); + paint.icon.translate.cascade(parameters); + paint.icon.translateAnchor.cascade(parameters); + + paint.text.opacity.cascade(parameters); + paint.text.color.cascade(parameters); + paint.text.haloColor.cascade(parameters); + paint.text.haloWidth.cascade(parameters); + paint.text.haloBlur.cascade(parameters); + paint.text.translate.cascade(parameters); + paint.text.translateAnchor.cascade(parameters); } -bool SymbolLayer::hasTransitions() const { - return paints.hasTransitions(); -} - -void SymbolLayer::recalculate(const StyleCalculationParameters& parameters) { - paints.removeExpiredTransitions(parameters.now); - - paints.calculateTransitioned(PropertyKey::IconOpacity, properties.icon.opacity, parameters); - paints.calculateTransitioned(PropertyKey::IconColor, properties.icon.color, parameters); - paints.calculateTransitioned(PropertyKey::IconHaloColor, properties.icon.halo_color, parameters); - paints.calculateTransitioned(PropertyKey::IconHaloWidth, properties.icon.halo_width, parameters); - paints.calculateTransitioned(PropertyKey::IconHaloBlur, properties.icon.halo_blur, parameters); - paints.calculateTransitioned(PropertyKey::IconTranslate, properties.icon.translate, parameters); - paints.calculate(PropertyKey::IconTranslateAnchor, properties.icon.translate_anchor, parameters); - - paints.calculateTransitioned(PropertyKey::TextOpacity, properties.text.opacity, parameters); - paints.calculateTransitioned(PropertyKey::TextColor, properties.text.color, parameters); - paints.calculateTransitioned(PropertyKey::TextHaloColor, properties.text.halo_color, parameters); - paints.calculateTransitioned(PropertyKey::TextHaloWidth, properties.text.halo_width, parameters); - paints.calculateTransitioned(PropertyKey::TextHaloBlur, properties.text.halo_blur, parameters); - paints.calculateTransitioned(PropertyKey::TextTranslate, properties.text.translate, parameters); - paints.calculate(PropertyKey::TextTranslateAnchor, properties.text.translate_anchor, parameters); +bool SymbolLayer::recalculate(const StyleCalculationParameters& parameters) { + bool hasTransitions = false; + + hasTransitions |= paint.icon.opacity.calculate(parameters); + hasTransitions |= paint.icon.color.calculate(parameters); + hasTransitions |= paint.icon.haloColor.calculate(parameters); + hasTransitions |= paint.icon.haloWidth.calculate(parameters); + hasTransitions |= paint.icon.haloBlur.calculate(parameters); + hasTransitions |= paint.icon.translate.calculate(parameters); + hasTransitions |= paint.icon.translateAnchor.calculate(parameters); + + hasTransitions |= paint.text.opacity.calculate(parameters); + hasTransitions |= paint.text.color.calculate(parameters); + hasTransitions |= paint.text.haloColor.calculate(parameters); + hasTransitions |= paint.text.haloWidth.calculate(parameters); + hasTransitions |= paint.text.haloBlur.calculate(parameters); + hasTransitions |= paint.text.translate.calculate(parameters); + hasTransitions |= paint.text.translateAnchor.calculate(parameters); // text-size and icon-size are layout properties but they also need to be evaluated as paint properties: layout.icon.size.calculate(parameters); layout.text.size.calculate(parameters); - properties.icon.size = layout.icon.size; - properties.text.size = layout.text.size; + paint.icon.size = layout.icon.size; + paint.text.size = layout.text.size; + + passes = (paint.icon.isVisible() || paint.text.isVisible()) + ? RenderPass::Translucent : RenderPass::None; - passes = properties.isVisible() ? RenderPass::Translucent : RenderPass::None; + return hasTransitions; } std::unique_ptr<Bucket> SymbolLayer::createBucket(StyleBucketParameters& parameters) const { diff --git a/src/mbgl/layer/symbol_layer.hpp b/src/mbgl/layer/symbol_layer.hpp index 3871d7a2d4..9e4555350a 100644 --- a/src/mbgl/layer/symbol_layer.hpp +++ b/src/mbgl/layer/symbol_layer.hpp @@ -2,9 +2,8 @@ #define MBGL_SYMBOL_LAYER #include <mbgl/style/style_layer.hpp> -#include <mbgl/style/style_properties.hpp> -#include <mbgl/style/paint_properties_map.hpp> #include <mbgl/style/layout_property.hpp> +#include <mbgl/style/paint_property.hpp> namespace mbgl { @@ -55,6 +54,32 @@ public: float textMaxSize = 16.0f; }; +class SymbolPaintProperties { +public: + class PaintProperties { + public: + PaintProperties(float size_) : size(size_) {} + + PaintProperty<float> opacity = 1.0f; + PaintProperty<Color> color = { {{ 0, 0, 0, 1 }} }; + PaintProperty<Color> haloColor = { {{ 0, 0, 0, 0 }} }; + PaintProperty<float> haloWidth = 0.0f; + PaintProperty<float> haloBlur = 0.0f; + PaintProperty<std::array<float, 2>> translate = { {{ 0, 0 }} }; + PaintProperty<TranslateAnchorType> translateAnchor = TranslateAnchorType::Map; + + // Special case + float size; + + bool isVisible() const { + return opacity > 0 && (color.value[3] > 0 || haloColor.value[3] > 0) && size > 0; + } + }; + + PaintProperties icon { 1.0f }; + PaintProperties text { 16.0f }; +}; + class SymbolLayer : public StyleLayer { public: std::unique_ptr<StyleLayer> clone() const override; @@ -63,16 +88,12 @@ public: void parsePaints(const JSVal&) override; void cascade(const StyleCascadeParameters&) override; - void recalculate(const StyleCalculationParameters&) override; + bool recalculate(const StyleCalculationParameters&) override; std::unique_ptr<Bucket> createBucket(StyleBucketParameters&) const override; - bool hasTransitions() const override; - SymbolLayoutProperties layout; - PaintPropertiesMap paints; - - SymbolPaintProperties properties; + SymbolPaintProperties paint; }; } |