diff options
author | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2015-08-03 01:36:19 +0300 |
---|---|---|
committer | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2015-08-05 15:19:00 +0300 |
commit | fa4636ffe4d2c00446292c229cd549cbaee9e20c (patch) | |
tree | 505e5fdad2051ebc47586e678935b1aa040853db /src/mbgl | |
parent | 9fd7e883a7515f97ec4edd097a0db5cbebce3ca1 (diff) | |
download | qtlocation-mapboxgl-fa4636ffe4d2c00446292c229cd549cbaee9e20c.tar.gz |
Map::nudgeTransitions no longer depends on client information
Clients no longer need to provide data (eg. if gesturing or in a custom
animation) to Map::nudgeTransitions().
Upon MapContext::renderSync(), a new atomic bool 'needsRepaint' in MapData
allows thread-safe communication between Map and MapContext.
Diffstat (limited to 'src/mbgl')
-rw-r--r-- | src/mbgl/map/map.cpp | 16 | ||||
-rw-r--r-- | src/mbgl/map/map_context.cpp | 16 | ||||
-rw-r--r-- | src/mbgl/map/map_context.hpp | 9 | ||||
-rw-r--r-- | src/mbgl/map/map_data.hpp | 9 |
4 files changed, 29 insertions, 21 deletions
diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index 4990d24fc2..fadd4c48d9 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -48,33 +48,31 @@ void Map::renderStill(StillImageCallback callback) { FrameData{ view.getFramebufferSize() }, callback); } -bool Map::renderSync() { +void Map::renderSync() { if (renderState == RenderState::never) { view.notifyMapChange(MapChangeWillStartRenderingMap); } view.notifyMapChange(MapChangeWillStartRenderingFrame); - MapContext::RenderResult result = context->invokeSync<MapContext::RenderResult>( - &MapContext::renderSync, transform->getState(), FrameData{ view.getFramebufferSize() }); + const bool fullyLoaded = context->invokeSync<bool>( + &MapContext::renderSync, transform->getState(), FrameData { view.getFramebufferSize() }); - view.notifyMapChange(result.fullyLoaded ? + view.notifyMapChange(fullyLoaded ? MapChangeDidFinishRenderingFrameFullyRendered : MapChangeDidFinishRenderingFrame); - if (!result.fullyLoaded) { + if (!fullyLoaded) { renderState = RenderState::partial; } else if (renderState != RenderState::fully) { renderState = RenderState::fully; view.notifyMapChange(MapChangeDidFinishRenderingMapFullyRendered); } - - return result.needsRerender; } -void Map::nudgeTransitions(bool forceRerender) { +void Map::nudgeTransitions() { UpdateType update_ = transform->updateTransitions(Clock::now()); - if (forceRerender) { + if (data->getNeedsRepaint()) { update_ |= static_cast<UpdateType>(Update::Repaint); } update(Update(update_)); diff --git a/src/mbgl/map/map_context.cpp b/src/mbgl/map/map_context.cpp index 4f8052f299..33e4e6d181 100644 --- a/src/mbgl/map/map_context.cpp +++ b/src/mbgl/map/map_context.cpp @@ -256,6 +256,9 @@ void MapContext::update() { if (!style) { updated = static_cast<UpdateType>(Update::Nothing); + } + + if (updated == static_cast<UpdateType>(Update::Nothing)) { return; } @@ -315,12 +318,12 @@ void MapContext::renderStill(const TransformState& state, const FrameData& frame asyncUpdate->send(); } -MapContext::RenderResult MapContext::renderSync(const TransformState& state, const FrameData& frame) { +bool MapContext::renderSync(const TransformState& state, const FrameData& frame) { assert(util::ThreadContext::currentlyOn(util::ThreadType::Map)); // Style was not loaded yet. if (!style) { - return { false, false }; + return false; } transformState = state; @@ -345,10 +348,11 @@ MapContext::RenderResult MapContext::renderSync(const TransformState& state, con viewInvalidated = false; - return RenderResult { - isLoaded(), - style->hasTransitions() || painter->needsAnimation() - }; + if (style->hasTransitions() || painter->needsAnimation()) { + data.setNeedsRepaint(true); + } + + return isLoaded(); } bool MapContext::isLoaded() const { diff --git a/src/mbgl/map/map_context.hpp b/src/mbgl/map/map_context.hpp index dd211d4a17..215f5d377a 100644 --- a/src/mbgl/map/map_context.hpp +++ b/src/mbgl/map/map_context.hpp @@ -38,16 +38,13 @@ public: MapContext(View&, FileSource&, MapData&); ~MapContext(); - struct RenderResult { - bool fullyLoaded; - bool needsRerender; - }; - void pause(); void triggerUpdate(const TransformState&, Update = Update::Nothing); void renderStill(const TransformState&, const FrameData&, Map::StillImageCallback callback); - RenderResult renderSync(const TransformState&, const FrameData&); + + // Triggers a synchronous render. Returns true if style has been fully loaded. + bool renderSync(const TransformState&, const FrameData&); void setStyleURL(const std::string&); void setStyleJSON(const std::string& json, const std::string& base); diff --git a/src/mbgl/map/map_data.hpp b/src/mbgl/map/map_data.hpp index aadc8dcd64..9eac6162eb 100644 --- a/src/mbgl/map/map_data.hpp +++ b/src/mbgl/map/map_data.hpp @@ -101,6 +101,14 @@ public: defaultTransitionDelay = delay; } + inline bool getNeedsRepaint() const { + return needsRepaint; + } + + inline void setNeedsRepaint(const bool needsRepaint_) { + needsRepaint = needsRepaint_; + } + util::exclusive<AnnotationManager> getAnnotationManager() { return util::exclusive<AnnotationManager>( &annotationManager, @@ -124,6 +132,7 @@ private: std::atomic<Duration> defaultFadeDuration; std::atomic<Duration> defaultTransitionDuration; std::atomic<Duration> defaultTransitionDelay; + std::atomic<bool> needsRepaint; // TODO: make private public: |