diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2015-06-26 15:10:15 -0700 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2015-06-30 10:13:24 -0700 |
commit | 6532438fe47bca1af690779ffa7292d6f1080d0c (patch) | |
tree | b62816c6541f1c1e42c85901c2600080b64f98a5 | |
parent | 8c4a03acb4298bd0f3344c6e9667ef1ee2726b6d (diff) | |
download | qtlocation-mapboxgl-6532438fe47bca1af690779ffa7292d6f1080d0c.tar.gz |
Rationalize *RenderingMap notifications
-rw-r--r-- | include/mbgl/ios/MGLMapView.h | 6 | ||||
-rw-r--r-- | include/mbgl/map/map.hpp | 9 | ||||
-rw-r--r-- | include/mbgl/map/view.hpp | 9 | ||||
-rw-r--r-- | ios/benchmark/MBXBenchViewController.mm | 2 | ||||
-rw-r--r-- | platform/ios/MGLMapView.mm | 22 | ||||
-rw-r--r-- | src/mbgl/map/map.cpp | 22 |
6 files changed, 56 insertions, 14 deletions
diff --git a/include/mbgl/ios/MGLMapView.h b/include/mbgl/ios/MGLMapView.h index 346bb62257..918f521a83 100644 --- a/include/mbgl/ios/MGLMapView.h +++ b/include/mbgl/ios/MGLMapView.h @@ -418,6 +418,12 @@ IB_DESIGNABLE // TODO - (void)mapViewDidFinishRenderingMap:(MGLMapView *)mapView fullyRendered:(BOOL)fullyRendered; +// TODO +- (void)mapViewWillStartRenderingFrame:(MGLMapView *)mapView; + +// TODO +- (void)mapViewDidFinishRenderingFrame:(MGLMapView *)mapView fullyRendered:(BOOL)fullyRendered; + #pragma mark - Tracking the User Location /** @name Tracking the User Location */ diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index 59f23fe2b2..e1dd4671b2 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -156,9 +156,18 @@ public: bool isFullyLoaded() const; private: + View& view; const std::unique_ptr<Transform> transform; const std::unique_ptr<MapData> data; const std::unique_ptr<util::Thread<MapContext>> context; + + enum class RenderState { + never, + partial, + fully + }; + + RenderState renderState = RenderState::never; bool paused = false; }; diff --git a/include/mbgl/map/view.hpp b/include/mbgl/map/view.hpp index e3b0810c45..575d0df015 100644 --- a/include/mbgl/map/view.hpp +++ b/include/mbgl/map/view.hpp @@ -20,9 +20,12 @@ enum MapChange : uint8_t { MapChangeWillStartLoadingMap = 5, MapChangeDidFinishLoadingMap = 6, MapChangeDidFailLoadingMap = 7, - MapChangeWillStartRenderingMap = 8, - MapChangeDidFinishRenderingMap = 9, - MapChangeDidFinishRenderingMapFullyRendered = 10 + MapChangeWillStartRenderingFrame = 8, + MapChangeDidFinishRenderingFrame = 9, + MapChangeDidFinishRenderingFrameFullyRendered = 10, + MapChangeWillStartRenderingMap = 11, + MapChangeDidFinishRenderingMap = 12, + MapChangeDidFinishRenderingMapFullyRendered = 13, }; class View { diff --git a/ios/benchmark/MBXBenchViewController.mm b/ios/benchmark/MBXBenchViewController.mm index 8883ebff0f..86b4ec9cbe 100644 --- a/ios/benchmark/MBXBenchViewController.mm +++ b/ios/benchmark/MBXBenchViewController.mm @@ -88,7 +88,7 @@ static const int benchmarkDuration = 200; // frames } } -- (void)mapViewDidFinishRenderingMap:(MGLMapView *)mapView fullyRendered:(__unused BOOL)fullyRendered +- (void)mapViewDidFinishRenderingFrame:(MGLMapView *)mapView fullyRendered:(__unused BOOL)fullyRendered { if (state == State::Benchmarking) { diff --git a/platform/ios/MGLMapView.mm b/platform/ios/MGLMapView.mm index 378388a21b..4957a03299 100644 --- a/platform/ios/MGLMapView.mm +++ b/platform/ios/MGLMapView.mm @@ -669,8 +669,6 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) { if ( ! self.isDormant) { - [self notifyMapChange:@(mbgl::MapChangeWillStartRenderingMap)]; - _mbglMap->resize(rect.size.width, rect.size.height, view.contentScaleFactor); CGFloat zoomFactor = _mbglMap->getMaxZoom() - _mbglMap->getMinZoom() + 1; @@ -684,8 +682,6 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) _mbglMap->setSourceTileCacheSize(cacheSize); _mbglMap->renderSync(); - - [self notifyMapChange:@(mbgl::MapChangeDidFinishRenderingMap)]; } } @@ -2561,18 +2557,28 @@ CLLocationCoordinate2D MGLLocationCoordinate2DFromLatLng(mbgl::LatLng latLng) break; } case mbgl::MapChangeDidFinishRenderingMap: + case mbgl::MapChangeDidFinishRenderingMapFullyRendered: { if ([self.delegate respondsToSelector:@selector(mapViewDidFinishRenderingMap:fullyRendered:)]) { - [self.delegate mapViewDidFinishRenderingMap:self fullyRendered:NO]; + [self.delegate mapViewDidFinishRenderingMap:self fullyRendered:(change == mbgl::MapChangeDidFinishRenderingMapFullyRendered)]; } break; } - case mbgl::MapChangeDidFinishRenderingMapFullyRendered: + case mbgl::MapChangeWillStartRenderingFrame: { - if ([self.delegate respondsToSelector:@selector(mapViewDidFinishRenderingMap:fullyRendered:)]) + if ([self.delegate respondsToSelector:@selector(mapViewWillStartRenderingFrame:)]) + { + [self.delegate mapViewWillStartRenderingFrame:self]; + } + break; + } + case mbgl::MapChangeDidFinishRenderingFrame: + case mbgl::MapChangeDidFinishRenderingFrameFullyRendered: + { + if ([self.delegate respondsToSelector:@selector(mapViewDidFinishRenderingFrame:fullyRendered:)]) { - [self.delegate mapViewDidFinishRenderingMap:self fullyRendered:YES]; + [self.delegate mapViewDidFinishRenderingFrame:self fullyRendered:(change == mbgl::MapChangeDidFinishRenderingFrameFullyRendered)]; } break; } diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index c0f7e953a8..91017d89c8 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -12,8 +12,9 @@ namespace mbgl { -Map::Map(View& view, FileSource& fileSource, MapMode mode) - : transform(std::make_unique<Transform>(view)), +Map::Map(View& view_, FileSource& fileSource, MapMode mode) + : view(view_), + transform(std::make_unique<Transform>(view)), data(std::make_unique<MapData>(mode)), context(std::make_unique<util::Thread<MapContext>>(util::ThreadContext{"Map", util::ThreadType::Map, util::ThreadPriority::Regular}, view, fileSource, *data)) { @@ -46,9 +47,26 @@ void Map::renderStill(StillImageCallback callback) { } void Map::renderSync() { + if (renderState == RenderState::never) { + view.notifyMapChange(MapChangeWillStartRenderingMap); + } + + view.notifyMapChange(MapChangeWillStartRenderingFrame); + MapContext::RenderResult result = context->invokeSync<MapContext::RenderResult>(&MapContext::renderSync, transform->getState()); + view.notifyMapChange(result.fullyLoaded ? + MapChangeDidFinishRenderingFrameFullyRendered : + MapChangeDidFinishRenderingFrame); + + if (!result.fullyLoaded) { + renderState = RenderState::partial; + } else if (renderState != RenderState::fully) { + renderState = RenderState::fully; + view.notifyMapChange(MapChangeDidFinishRenderingMapFullyRendered); + } + if (transform->needsTransition()) { update(Update(transform->updateTransitions(Clock::now()))); } else if (result.needsRerender) { |