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 | |
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.
-rw-r--r-- | android/cpp/jni.cpp | 6 | ||||
-rw-r--r-- | android/cpp/native_map_view.cpp | 8 | ||||
-rw-r--r-- | android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java | 3 | ||||
-rw-r--r-- | android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/NativeMapView.java | 6 | ||||
-rw-r--r-- | include/mbgl/android/native_map_view.hpp | 2 | ||||
-rw-r--r-- | include/mbgl/map/map.hpp | 8 | ||||
-rw-r--r-- | platform/default/glfw_view.cpp | 7 | ||||
-rw-r--r-- | platform/ios/MGLMapView.mm | 10 | ||||
-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 |
12 files changed, 48 insertions, 52 deletions
diff --git a/android/cpp/jni.cpp b/android/cpp/jni.cpp index 476d43729c..6d7def861c 100644 --- a/android/cpp/jni.cpp +++ b/android/cpp/jni.cpp @@ -412,11 +412,11 @@ void JNICALL nativeUpdate(JNIEnv *env, jobject obj, jlong nativeMapViewPtr) { nativeMapView->getMap().update(mbgl::Update::Repaint); } -void JNICALL nativeOnInvalidate(JNIEnv *env, jobject obj, jlong nativeMapViewPtr, jboolean inProgress) { +void JNICALL nativeOnInvalidate(JNIEnv *env, jobject obj, jlong nativeMapViewPtr) { mbgl::Log::Debug(mbgl::Event::JNI, "nativeOnInvalidate"); assert(nativeMapViewPtr != 0); NativeMapView *nativeMapView = reinterpret_cast<NativeMapView *>(nativeMapViewPtr); - nativeMapView->onInvalidate(inProgress); + nativeMapView->onInvalidate(); } void JNICALL nativeViewResize(JNIEnv *env, jobject obj, jlong nativeMapViewPtr, jint width, jint height) { @@ -1440,7 +1440,7 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { {"nativePause", "(J)V", reinterpret_cast<void *>(&nativePause)}, {"nativeResume", "(J)V", reinterpret_cast<void *>(&nativeResume)}, {"nativeUpdate", "(J)V", reinterpret_cast<void *>(&nativeUpdate)}, - {"nativeOnInvalidate", "(JZ)V", reinterpret_cast<void *>(&nativeOnInvalidate)}, + {"nativeOnInvalidate", "(J)V", reinterpret_cast<void *>(&nativeOnInvalidate)}, {"nativeViewResize", "(JII)V", reinterpret_cast<void *>(static_cast<void JNICALL ( *)(JNIEnv *, jobject, jlong, jint, jint)>(&nativeViewResize))}, diff --git a/android/cpp/native_map_view.cpp b/android/cpp/native_map_view.cpp index 9a24bddfe5..d0581212df 100644 --- a/android/cpp/native_map_view.cpp +++ b/android/cpp/native_map_view.cpp @@ -761,7 +761,7 @@ void NativeMapView::updateFps() { env = nullptr; } -void NativeMapView::onInvalidate(bool inProgress) { +void NativeMapView::onInvalidate() { mbgl::Log::Debug(mbgl::Event::Android, "NativeMapView::onInvalidate()"); const bool dirty = !clean.test_and_set(); @@ -776,10 +776,8 @@ void NativeMapView::onInvalidate(bool inProgress) { map.setSourceTileCacheSize(cacheSize); - const bool needsRerender = map.renderSync(); - if (!inProgress) { - map.nudgeTransitions(needsRerender); - } + map.renderSync(); + map.nudgeTransitions(); } } diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java index 473f33a1ad..1ecf7f11bd 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java @@ -1285,8 +1285,7 @@ public class MapView extends SurfaceView { post(new Runnable() { @Override public void run() { - boolean inProgress = mRotateGestureDetector.isInProgress() || mScaleGestureDetector.isInProgress(); - mNativeMapView.invalidate(inProgress); + mNativeMapView.invalidate(); } }); } diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/NativeMapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/NativeMapView.java index cc65de52f4..774c20a054 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/NativeMapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/NativeMapView.java @@ -96,8 +96,8 @@ class NativeMapView { nativeUpdate(mNativeMapViewPtr); } - public void invalidate(boolean inProgress) { - nativeOnInvalidate(mNativeMapViewPtr, inProgress); + public void invalidate() { + nativeOnInvalidate(mNativeMapViewPtr); } public void resizeView(int width, int height) { @@ -463,7 +463,7 @@ class NativeMapView { private native void nativeUpdate(long nativeMapViewPtr); - private native void nativeOnInvalidate(long nativeMapViewPtr, boolean inProgress); + private native void nativeOnInvalidate(long nativeMapViewPtr); private native void nativeViewResize(long nativeMapViewPtr, int width, int height); diff --git a/include/mbgl/android/native_map_view.hpp b/include/mbgl/android/native_map_view.hpp index 1ea67a0da8..3ae3d6ed91 100644 --- a/include/mbgl/android/native_map_view.hpp +++ b/include/mbgl/android/native_map_view.hpp @@ -49,7 +49,7 @@ public: void enableFps(bool enable); void updateFps(); - void onInvalidate(bool inProgress); + void onInvalidate(); void resizeView(int width, int height); void resizeFramebuffer(int width, int height); diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index e35a738d63..ae43dc8a8f 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -66,11 +66,11 @@ public: using StillImageCallback = std::function<void(std::exception_ptr, std::unique_ptr<const StillImage>)>; void renderStill(StillImageCallback callback); - // Triggers a synchronous or asynchronous render. - bool renderSync(); + // Triggers a synchronous render. + void renderSync(); - // Nudges transitions one step, possibly notifying of the need for a rerender. - void nudgeTransitions(bool forceRerender); + // Nudges transitions one step, possibly notifying of the need for a rerender, if any. + void nudgeTransitions(); // Notifies the Map thread that the state has changed and an update might be necessary. void update(Update update); diff --git a/platform/default/glfw_view.cpp b/platform/default/glfw_view.cpp index 8336b32939..078c26feef 100644 --- a/platform/default/glfw_view.cpp +++ b/platform/default/glfw_view.cpp @@ -336,11 +336,8 @@ void GLFWView::run() { glfwWaitEvents(); const bool dirty = !clean.test_and_set(); if (dirty) { - const bool needsRerender = map->renderSync(); - GLFWView *view = reinterpret_cast<GLFWView *>(glfwGetWindowUserPointer(window)); - if (!view->tracking || !view->rotating) { - map->nudgeTransitions(needsRerender); - } + map->renderSync(); + map->nudgeTransitions(); } } } diff --git a/platform/ios/MGLMapView.mm b/platform/ios/MGLMapView.mm index e95305d0c6..81338f2889 100644 --- a/platform/ios/MGLMapView.mm +++ b/platform/ios/MGLMapView.mm @@ -710,17 +710,11 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) _mbglMap->setSourceTileCacheSize(cacheSize); - bool needsRerender = _mbglMap->renderSync(); + _mbglMap->renderSync(); [self updateUserLocationAnnotationView]; - // don't nudge transitions if in the midst of a gesture. - if (self.pan.state == UIGestureRecognizerStateChanged || - self.pinch.state == UIGestureRecognizerStateChanged || - self.rotate.state == UIGestureRecognizerStateChanged || - self.quickZoom.state == UIGestureRecognizerStateChanged) return; - - _mbglMap->nudgeTransitions(needsRerender); + _mbglMap->nudgeTransitions(); } } 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: |