summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer/layers/render_background_layer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer/layers/render_background_layer.cpp')
-rw-r--r--src/mbgl/renderer/layers/render_background_layer.cpp33
1 files changed, 20 insertions, 13 deletions
diff --git a/src/mbgl/renderer/layers/render_background_layer.cpp b/src/mbgl/renderer/layers/render_background_layer.cpp
index b633ad0671..d5ba8c879f 100644
--- a/src/mbgl/renderer/layers/render_background_layer.cpp
+++ b/src/mbgl/renderer/layers/render_background_layer.cpp
@@ -14,25 +14,30 @@ namespace mbgl {
using namespace style;
-RenderBackgroundLayer::RenderBackgroundLayer(Immutable<style::BackgroundLayer::Impl> _impl)
- : RenderLayer(std::move(_impl)),
- unevaluated(impl().paint.untransitioned()) {
+inline const BackgroundLayer::Impl& impl(const Immutable<style::Layer::Impl>& impl) {
+ return static_cast<const style::BackgroundLayer::Impl&>(*impl);
}
-const style::BackgroundLayer::Impl& RenderBackgroundLayer::impl() const {
- return static_cast<const style::BackgroundLayer::Impl&>(*baseImpl);
+RenderBackgroundLayer::RenderBackgroundLayer(Immutable<style::BackgroundLayer::Impl> _impl)
+ : RenderLayer(makeMutable<BackgroundLayerProperties>(std::move(_impl))),
+ unevaluated(impl(baseImpl).paint.untransitioned()) {
}
+RenderBackgroundLayer::~RenderBackgroundLayer() = default;
+
void RenderBackgroundLayer::transition(const TransitionParameters &parameters) {
- unevaluated = impl().paint.transitioned(parameters, std::move(unevaluated));
+ unevaluated = impl(baseImpl).paint.transitioned(parameters, std::move(unevaluated));
}
void RenderBackgroundLayer::evaluate(const PropertyEvaluationParameters &parameters) {
- evaluated = unevaluated.evaluate(parameters);
- crossfade = parameters.getCrossfadeParameters();
-
- passes = evaluated.get<style::BackgroundOpacity>() > 0 ? RenderPass::Translucent
- : RenderPass::None;
+ auto properties = makeMutable<BackgroundLayerProperties>(
+ staticImmutableCast<BackgroundLayer::Impl>(baseImpl),
+ parameters.getCrossfadeParameters(),
+ unevaluated.evaluate(parameters));
+
+ passes = properties->evaluated.get<style::BackgroundOpacity>() > 0 ? RenderPass::Translucent
+ : RenderPass::None;
+ evaluatedProperties = std::move(properties);
}
bool RenderBackgroundLayer::hasTransition() const {
@@ -40,7 +45,7 @@ bool RenderBackgroundLayer::hasTransition() const {
}
bool RenderBackgroundLayer::hasCrossfade() const {
- return crossfade.t != 1;
+ return static_cast<const BackgroundLayerProperties&>(*evaluatedProperties).crossfade.t != 1;
}
void RenderBackgroundLayer::render(PaintParameters& parameters, RenderSource*) {
@@ -81,7 +86,8 @@ void RenderBackgroundLayer::render(PaintParameters& parameters, RenderSource*) {
getID()
);
};
-
+ const auto& evaluated = static_cast<const BackgroundLayerProperties&>(*evaluatedProperties).evaluated;
+ const auto& crossfade = static_cast<const BackgroundLayerProperties&>(*evaluatedProperties).crossfade;
if (!evaluated.get<BackgroundPattern>().to.empty()) {
optional<ImagePosition> imagePosA = parameters.imageManager.getPattern(evaluated.get<BackgroundPattern>().from);
optional<ImagePosition> imagePosB = parameters.imageManager.getPattern(evaluated.get<BackgroundPattern>().to);
@@ -123,6 +129,7 @@ void RenderBackgroundLayer::render(PaintParameters& parameters, RenderSource*) {
}
optional<Color> RenderBackgroundLayer::getSolidBackground() const {
+ const auto& evaluated = static_cast<const BackgroundLayerProperties&>(*evaluatedProperties).evaluated;
if (!evaluated.get<BackgroundPattern>().from.empty()) {
return nullopt;
}