diff options
Diffstat (limited to 'platform/ios/src/MGLMapView.mm')
-rw-r--r-- | platform/ios/src/MGLMapView.mm | 131 |
1 files changed, 57 insertions, 74 deletions
diff --git a/platform/ios/src/MGLMapView.mm b/platform/ios/src/MGLMapView.mm index 6acaa3c7f3..a03a5ad357 100644 --- a/platform/ios/src/MGLMapView.mm +++ b/platform/ios/src/MGLMapView.mm @@ -6,7 +6,6 @@ #import <OpenGLES/EAGL.h> #include <mbgl/map/map.hpp> -#include <mbgl/map/view.hpp> #include <mbgl/annotation/annotation.hpp> #include <mbgl/map/camera.hpp> #include <mbgl/map/mode.hpp> @@ -15,11 +14,13 @@ #include <mbgl/util/default_thread_pool.hpp> #include <mbgl/storage/default_file_source.hpp> #include <mbgl/storage/network_status.hpp> +#include <mbgl/style/style.hpp> #include <mbgl/style/image.hpp> #include <mbgl/style/transition_options.hpp> #include <mbgl/style/layers/custom_layer.hpp> -#include <mbgl/map/backend.hpp> -#include <mbgl/map/backend_scope.hpp> +#include <mbgl/renderer/renderer.hpp> +#include <mbgl/renderer/renderer_backend.hpp> +#include <mbgl/renderer/backend_scope.hpp> #include <mbgl/math/wrap.hpp> #include <mbgl/util/exception.hpp> #include <mbgl/util/geo.hpp> @@ -39,6 +40,7 @@ #import "MGLMultiPoint_Private.h" #import "MGLOfflineStorage_Private.h" #import "MGLFoundation_Private.h" +#import "MGLRendererFrontend.h" #import "NSBundle+MGLAdditions.h" #import "NSDate+MGLAdditions.h" @@ -278,6 +280,8 @@ public: { mbgl::Map *_mbglMap; MBGLView *_mbglView; + std::unique_ptr<MGLRenderFrontend> _rendererFrontend; + std::shared_ptr<mbgl::ThreadPool> _mbglThreadPool; BOOL _opaque; @@ -378,7 +382,7 @@ public: - (nonnull NSURL *)styleURL { - NSString *styleURLString = @(_mbglMap->getStyleURL().c_str()).mgl_stringOrNilIfEmpty; + NSString *styleURLString = @(_mbglMap->getStyle().getURL().c_str()).mgl_stringOrNilIfEmpty; NSAssert(styleURLString || _isTargetingInterfaceBuilder, @"Invalid style URL string %@", styleURLString); return styleURLString ? [NSURL URLWithString:styleURLString] : nil; } @@ -394,12 +398,12 @@ public: styleURL = styleURL.mgl_URLByStandardizingScheme; self.style = nil; - _mbglMap->setStyleURL([[styleURL absoluteString] UTF8String]); + _mbglMap->getStyle().loadURL([[styleURL absoluteString] UTF8String]); } - (IBAction)reloadStyle:(__unused id)sender { NSURL *styleURL = self.styleURL; - _mbglMap->setStyleURL(""); + _mbglMap->getStyle().loadURL(""); self.styleURL = styleURL; } @@ -408,6 +412,11 @@ public: return _mbglMap; } +- (mbgl::Renderer *)renderer +{ + return _rendererFrontend->getRenderer(); +} + - (void)commonInit { _isTargetingInterfaceBuilder = NSProcessInfo.processInfo.mgl_isInterfaceBuilderDesignablesAgent; @@ -442,8 +451,10 @@ public: mbgl::DefaultFileSource *mbglFileSource = [MGLOfflineStorage sharedOfflineStorage].mbglFileSource; const float scaleFactor = [UIScreen instancesRespondToSelector:@selector(nativeScale)] ? [[UIScreen mainScreen] nativeScale] : [[UIScreen mainScreen] scale]; _mbglThreadPool = mbgl::sharedThreadPool(); - _mbglMap = new mbgl::Map(*_mbglView, self.size, scaleFactor, *mbglFileSource, *_mbglThreadPool, mbgl::MapMode::Continuous, mbgl::GLContextMode::Unique, mbgl::ConstrainMode::None, mbgl::ViewportMode::Default); - [self validateTileCacheSize]; + + auto renderer = std::make_unique<mbgl::Renderer>(*_mbglView, scaleFactor, *mbglFileSource, *_mbglThreadPool, mbgl::GLContextMode::Unique); + _rendererFrontend = std::make_unique<MGLRenderFrontend>(std::move(renderer), self, *_mbglView); + _mbglMap = new mbgl::Map(*_rendererFrontend, *_mbglView, self.size, scaleFactor, *mbglFileSource, *_mbglThreadPool, mbgl::MapMode::Continuous, mbgl::ConstrainMode::None, mbgl::ViewportMode::Default); // start paused if in IB if (_isTargetingInterfaceBuilder || background) { @@ -748,49 +759,11 @@ public: { MGLAssertIsMainThread(); - _mbglMap->onLowMemory(); + _rendererFrontend->onLowMemory(); } #pragma mark - Layout - -- (void)setFrame:(CGRect)frame -{ - [super setFrame:frame]; - - if ( ! CGRectEqualToRect(frame, self.frame)) - { - [self validateTileCacheSize]; - } -} - -- (void)setBounds:(CGRect)bounds -{ - [super setBounds:bounds]; - - if ( ! CGRectEqualToRect(bounds, self.bounds)) - { - [self validateTileCacheSize]; - } -} - -- (void)validateTileCacheSize -{ - if ( ! _mbglMap) - { - return; - } - - CGFloat zoomFactor = self.maximumZoomLevel - self.minimumZoomLevel + 1; - CGFloat cpuFactor = [NSProcessInfo processInfo].processorCount; - CGFloat memoryFactor = (CGFloat)[NSProcessInfo processInfo].physicalMemory / 1000 / 1000 / 1000; - CGFloat sizeFactor = (CGRectGetWidth(self.bounds) / mbgl::util::tileSize) * - (CGRectGetHeight(self.bounds) / mbgl::util::tileSize); - - NSUInteger cacheSize = zoomFactor * cpuFactor * memoryFactor * sizeFactor * 0.5; - - _mbglMap->setSourceTileCacheSize(cacheSize); -} - + (BOOL)requiresConstraintBasedLayout { return YES; @@ -1030,12 +1003,9 @@ public: // This is the delegate of the GLKView object's display call. - (void)glkView:(__unused GLKView *)view drawInRect:(__unused CGRect)rect { - if ( ! self.dormant) + if ( ! self.dormant || ! _rendererFrontend) { - // The OpenGL implementation automatically enables the OpenGL context for us. - mbgl::BackendScope scope { *_mbglView, mbgl::BackendScope::ScopeType::Implicit }; - - _mbglMap->render(*_mbglView); + _rendererFrontend->render(); [self updateUserLocationAnnotationView]; } @@ -2328,10 +2298,11 @@ public: - (void)resetPosition { - CGFloat pitch = _mbglMap->getDefaultPitch(); - CLLocationDirection heading = mbgl::util::wrap(_mbglMap->getDefaultBearing(), 0., 360.); - CLLocationDistance distance = MGLAltitudeForZoomLevel(_mbglMap->getDefaultZoom(), pitch, 0, self.frame.size); - self.camera = [MGLMapCamera cameraLookingAtCenterCoordinate:MGLLocationCoordinate2DFromLatLng(_mbglMap->getDefaultLatLng()) + auto camera = _mbglMap->getStyle().getDefaultCamera(); + CGFloat pitch = *camera.pitch; + CLLocationDirection heading = mbgl::util::wrap(*camera.angle, 0., 360.); + CLLocationDistance distance = MGLAltitudeForZoomLevel(*camera.zoom, pitch, 0, self.frame.size); + self.camera = [MGLMapCamera cameraLookingAtCenterCoordinate:MGLLocationCoordinate2DFromLatLng(*camera.center) fromDistance:distance pitch:pitch heading:heading]; @@ -2339,7 +2310,7 @@ public: - (void)emptyMemoryCache { - _mbglMap->onLowMemory(); + _rendererFrontend->onLowMemory(); } - (void)setZoomEnabled:(BOOL)zoomEnabled @@ -2722,8 +2693,6 @@ public: - (void)setMinimumZoomLevel:(double)minimumZoomLevel { - _mbglMap->setMinZoom(minimumZoomLevel); - [self validateTileCacheSize]; } - (double)minimumZoomLevel @@ -2734,7 +2703,6 @@ public: - (void)setMaximumZoomLevel:(double)maximumZoomLevel { _mbglMap->setMaxZoom(maximumZoomLevel); - [self validateTileCacheSize]; } - (double)maximumZoomLevel @@ -3612,7 +3580,7 @@ public: annotationImage.delegate = self; // add sprite - _mbglMap->addAnnotationImage(iconIdentifier.UTF8String, annotationImage.image.mgl_styleImage); + _mbglMap->addAnnotationImage([annotationImage.image mgl_styleImageWithIdentifier:iconIdentifier]); // Create a slop area with a “radius” equal in size to the annotation // image’s alignment rect, allowing the eventual tap to be on any point @@ -3695,6 +3663,22 @@ public: } } +- (nonnull NS_ARRAY_OF(id <MGLOverlay>) *)overlays +{ + if (self.annotations == nil) { return @[]; } + + NS_MUTABLE_ARRAY_OF(id <MGLOverlay>) *mutableOverlays = [NSMutableArray array]; + + [self.annotations enumerateObjectsUsingBlock:^(id<MGLAnnotation> _Nonnull annotation, NSUInteger idx, BOOL * _Nonnull stop) { + if ([annotation conformsToProtocol:@protocol(MGLOverlay)]) + { + [mutableOverlays addObject:(id<MGLOverlay>)annotation]; + } + }]; + + return [NSArray arrayWithArray:mutableOverlays]; +} + - (void)addOverlay:(id <MGLOverlay>)overlay { [self addOverlays:@[ overlay ]]; @@ -3898,7 +3882,7 @@ public: /// Returns the tags of the annotations coincident with the given rectangle. - (std::vector<MGLAnnotationTag>)annotationTagsInRect:(CGRect)rect { - return _mbglMap->queryPointAnnotations({ + return _rendererFrontend->getRenderer()->queryPointAnnotations({ { CGRectGetMinX(rect), CGRectGetMinY(rect) }, { CGRectGetMaxX(rect), CGRectGetMaxY(rect) }, }); @@ -4565,8 +4549,8 @@ public: if (_showsUserHeadingIndicator) { self.showsUserLocation = YES; - } + } [self validateUserHeadingUpdating]; } @@ -4941,7 +4925,7 @@ public: optionalFilter = predicate.mgl_filter; } - std::vector<mbgl::Feature> features = _mbglMap->queryRenderedFeatures(screenCoordinate, { optionalLayerIDs, optionalFilter }); + std::vector<mbgl::Feature> features = _rendererFrontend->getRenderer()->queryRenderedFeatures(screenCoordinate, { optionalLayerIDs, optionalFilter }); return MGLFeaturesFromMBGLFeatures(features); } @@ -4974,7 +4958,7 @@ public: optionalFilter = predicate.mgl_filter; } - std::vector<mbgl::Feature> features = _mbglMap->queryRenderedFeatures(screenBox, { optionalLayerIDs, optionalFilter }); + std::vector<mbgl::Feature> features = _rendererFrontend->getRenderer()->queryRenderedFeatures(screenBox, { optionalLayerIDs, optionalFilter }); return MGLFeaturesFromMBGLFeatures(features); } @@ -5200,7 +5184,7 @@ public: return; } - self.style = [[MGLStyle alloc] initWithMapView:self]; + self.style = [[MGLStyle alloc] initWithRawStyle:&_mbglMap->getStyle() mapView:self]; if ([self.delegate respondsToSelector:@selector(mapView:didFinishLoadingStyle:)]) { [self.delegate mapView:self didFinishLoadingStyle:self.style]; @@ -5642,7 +5626,7 @@ public: return _annotationViewReuseQueueByIdentifier[identifier]; } -class MBGLView : public mbgl::View, public mbgl::Backend +class MBGLView : public mbgl::RendererBackend, public mbgl::MapObserver { public: MBGLView(MGLMapView* nativeView_) : nativeView(nativeView_) { @@ -5653,7 +5637,7 @@ public: /// context state with the anticipated values. void updateAssumedState() override { assumeFramebufferBinding(ImplicitFramebufferBinding); - assumeViewportSize(nativeView.framebufferSize); + assumeViewport(0, 0, nativeView.framebufferSize); } void bind() override { @@ -5666,10 +5650,14 @@ public: updateAssumedState(); } else { // Our framebuffer is still bound, but the viewport might have changed. - setViewportSize(nativeView.framebufferSize); + setViewport(0, 0, nativeView.framebufferSize); } } + mbgl::Size getFramebufferSize() const override { + return nativeView.framebufferSize; + } + void onCameraWillChange(mbgl::MapObserver::CameraChangeMode mode) override { bool animated = mode == mbgl::MapObserver::CameraChangeMode::Animated; [nativeView cameraWillChangeAnimated:animated]; @@ -5754,11 +5742,6 @@ public: return reinterpret_cast<mbgl::gl::ProcAddress>(symbol); } - void invalidate() override - { - [nativeView setNeedsGLDisplay]; - } - void activate() override { if (activationCount++) |