summaryrefslogtreecommitdiff
path: root/src/mbgl
diff options
context:
space:
mode:
authorBruno de Oliveira Abinader <bruno@mapbox.com>2015-08-03 01:36:19 +0300
committerBruno de Oliveira Abinader <bruno@mapbox.com>2015-08-05 15:19:00 +0300
commitfa4636ffe4d2c00446292c229cd549cbaee9e20c (patch)
tree505e5fdad2051ebc47586e678935b1aa040853db /src/mbgl
parent9fd7e883a7515f97ec4edd097a0db5cbebce3ca1 (diff)
downloadqtlocation-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.cpp16
-rw-r--r--src/mbgl/map/map_context.cpp16
-rw-r--r--src/mbgl/map/map_context.hpp9
-rw-r--r--src/mbgl/map/map_data.hpp9
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: