summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2015-06-26 15:10:15 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2015-06-30 10:13:24 -0700
commit6532438fe47bca1af690779ffa7292d6f1080d0c (patch)
treeb62816c6541f1c1e42c85901c2600080b64f98a5
parent8c4a03acb4298bd0f3344c6e9667ef1ee2726b6d (diff)
downloadqtlocation-mapboxgl-6532438fe47bca1af690779ffa7292d6f1080d0c.tar.gz
Rationalize *RenderingMap notifications
-rw-r--r--include/mbgl/ios/MGLMapView.h6
-rw-r--r--include/mbgl/map/map.hpp9
-rw-r--r--include/mbgl/map/view.hpp9
-rw-r--r--ios/benchmark/MBXBenchViewController.mm2
-rw-r--r--platform/ios/MGLMapView.mm22
-rw-r--r--src/mbgl/map/map.cpp22
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) {