Add iOS/macOS observer hooks (#3245)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bart Louwers <bart@emeel.net>
This commit is contained in:
Adrian Cojocaru
2025-02-27 13:42:13 +02:00
committed by GitHub
parent f5f6e7faa2
commit ce4dcb7a9b
20 changed files with 1016 additions and 0 deletions

View File

@@ -124,6 +124,7 @@
"MLNOfflineRegion.h": "platform/darwin/src/MLNOfflineRegion.h",
"MLNTilePyramidOfflineRegion.h": "platform/darwin/src/MLNTilePyramidOfflineRegion.h",
"NSValue+MLNAdditions.h": "platform/darwin/src/NSValue+MLNAdditions.h",
"MLNTileOperation.h": "platform/darwin/src/MLNTileOperation.h",
"MLNMapViewDelegate.h": "platform/macos/src/MLNMapViewDelegate.h",
"MLNCluster.h": "platform/darwin/src/MLNCluster.h",
"MLNFeature.h": "platform/darwin/src/MLNFeature.h",

View File

@@ -38,6 +38,21 @@ class MLNMapViewImpl : public mbgl::MapObserver {
void onSourceChanged(mbgl::style::Source& source) override;
void onDidBecomeIdle() override;
bool onCanRemoveUnusedStyleImage(const std::string& imageIdentifier) override;
void onRegisterShaders(mbgl::gfx::ShaderRegistry&) override;
void onPreCompileShader(mbgl::shaders::BuiltIn, mbgl::gfx::Backend::Type,
const std::string&) override;
void onPostCompileShader(mbgl::shaders::BuiltIn, mbgl::gfx::Backend::Type,
const std::string&) override;
void onShaderCompileFailed(mbgl::shaders::BuiltIn, mbgl::gfx::Backend::Type,
const std::string&) override;
void onGlyphsLoaded(const mbgl::FontStack&, const mbgl::GlyphRange&) override;
void onGlyphsError(const mbgl::FontStack&, const mbgl::GlyphRange&, std::exception_ptr) override;
void onGlyphsRequested(const mbgl::FontStack&, const mbgl::GlyphRange&) override;
void onTileAction(mbgl::TileOperation, const mbgl::OverscaledTileID&,
const std::string&) override;
void onSpriteLoaded(const std::optional<mbgl::style::Sprite>&) override;
void onSpriteError(const std::optional<mbgl::style::Sprite>&, std::exception_ptr) override;
void onSpriteRequested(const std::optional<mbgl::style::Sprite>&) override;
protected:
/// Cocoa map view that this adapter bridges to.

View File

@@ -112,3 +112,89 @@ bool MLNMapViewImpl::onCanRemoveUnusedStyleImage(const std::string &imageIdentif
NSString *imageName = [NSString stringWithUTF8String:imageIdentifier.c_str()];
return [mapView shouldRemoveStyleImage:imageName];
}
void MLNMapViewImpl::onRegisterShaders(mbgl::gfx::ShaderRegistry& shaders) {
}
void MLNMapViewImpl::onPreCompileShader(mbgl::shaders::BuiltIn shaderID, mbgl::gfx::Backend::Type backend, const std::string& defines) {
NSString *definesCopy = [NSString stringWithUTF8String:defines.c_str()];
[mapView shaderWillCompile:static_cast<int>(shaderID) backend:static_cast<int>(backend) defines:definesCopy];
}
void MLNMapViewImpl::onPostCompileShader(mbgl::shaders::BuiltIn shaderID, mbgl::gfx::Backend::Type backend, const std::string& defines) {
NSString *definesCopy = [NSString stringWithUTF8String:defines.c_str()];
[mapView shaderDidCompile:static_cast<int>(shaderID) backend:static_cast<int>(backend) defines:definesCopy];
}
void MLNMapViewImpl::onShaderCompileFailed(mbgl::shaders::BuiltIn shaderID, mbgl::gfx::Backend::Type backend, const std::string& defines) {
NSString *definesCopy = [NSString stringWithUTF8String:defines.c_str()];
[mapView shaderDidFailCompile:static_cast<int>(shaderID) backend:static_cast<int>(backend) defines:definesCopy];
}
void MLNMapViewImpl::onGlyphsLoaded(const mbgl::FontStack& fontStack, const mbgl::GlyphRange& range) {
NSMutableArray* fontStackCopy = [[NSMutableArray alloc] init];
std::for_each(fontStack.begin(), fontStack.end(), ^(const std::string& str) {
[fontStackCopy addObject:[NSString stringWithUTF8String:str.c_str()]];
});
[mapView glyphsDidLoad:fontStackCopy range:NSMakeRange(range.first, range.second - range.first)];
}
void MLNMapViewImpl::onGlyphsError(const mbgl::FontStack& fontStack, const mbgl::GlyphRange& range, std::exception_ptr error) {
NSMutableArray* fontStackCopy = [[NSMutableArray alloc] init];
std::for_each(fontStack.begin(), fontStack.end(), ^(const std::string& str) {
[fontStackCopy addObject:[NSString stringWithUTF8String:str.c_str()]];
});
[mapView glyphsDidError:fontStackCopy range:NSMakeRange(range.first, range.second - range.first)];
}
void MLNMapViewImpl::onGlyphsRequested(const mbgl::FontStack& fontStack, const mbgl::GlyphRange& range) {
NSMutableArray* fontStackCopy = [[NSMutableArray alloc] init];
std::for_each(fontStack.begin(), fontStack.end(), ^(const std::string& str) {
[fontStackCopy addObject:[NSString stringWithUTF8String:str.c_str()]];
});
[mapView glyphsWillLoad:fontStackCopy range:NSMakeRange(range.first, range.second - range.first)];
}
void MLNMapViewImpl::onTileAction(mbgl::TileOperation operation, const mbgl::OverscaledTileID& tile, const std::string& sourceID) {
[mapView tileDidTriggerAction:MLNTileOperation(static_cast<int>(operation))
x:tile.canonical.x
y:tile.canonical.x
z:tile.canonical.z
wrap:tile.wrap
overscaledZ:tile.overscaledZ
sourceID:[NSString stringWithUTF8String:sourceID.c_str()]];
}
void MLNMapViewImpl::onSpriteLoaded(const std::optional<mbgl::style::Sprite>& spriteID) {
if (!spriteID.has_value()) {
[mapView spriteDidLoad:nil url:nil];
return;
}
[mapView spriteDidLoad:[NSString stringWithUTF8String:spriteID.value().id.c_str()]
url:[NSString stringWithUTF8String:spriteID.value().spriteURL.c_str()]];
}
void MLNMapViewImpl::onSpriteError(const std::optional<mbgl::style::Sprite>& spriteID, std::exception_ptr error) {
if (!spriteID.has_value()) {
[mapView spriteDidError:nil url:nil];
return;
}
[mapView spriteDidError:[NSString stringWithUTF8String:spriteID.value().id.c_str()]
url:[NSString stringWithUTF8String:spriteID.value().spriteURL.c_str()]];
}
void MLNMapViewImpl::onSpriteRequested(const std::optional<mbgl::style::Sprite>& spriteID) {
if (!spriteID.has_value()) {
[mapView spriteWillLoad:nil url:nil];
return;
}
[mapView spriteWillLoad:[NSString stringWithUTF8String:spriteID.value().id.c_str()]
url:[NSString stringWithUTF8String:spriteID.value().spriteURL.c_str()]];
}

View File

@@ -1000,6 +1000,113 @@ public:
return YES;
}
- (void)shaderWillCompile:(NSInteger)id backend:(NSInteger)backend defines:(nonnull NSString *)defines {
if (!_mbglMap) {
return;
}
if ([self.delegate respondsToSelector:@selector(mapView:shaderWillCompile:backend:defines:)]) {
[self.delegate mapView:self shaderWillCompile:id backend:backend defines:defines];
}
}
- (void)shaderDidCompile:(NSInteger)id backend:(NSInteger)backend defines:(nonnull NSString *)defines {
if (!_mbglMap) {
return;
}
if ([self.delegate respondsToSelector:@selector(mapView:shaderDidCompile:backend:defines:)]) {
[self.delegate mapView:self shaderDidCompile:id backend:backend defines:defines];
}
}
- (void)shaderDidFailCompile:(NSInteger)id backend:(NSInteger)backend defines:(nonnull NSString *)defines {
if (!_mbglMap) {
return;
}
if ([self.delegate respondsToSelector:@selector(mapView:shaderDidFailCompile:backend:defines:)]) {
[self.delegate mapView:self shaderDidFailCompile:id backend:backend defines:defines];
}
}
- (void)glyphsWillLoad:(nonnull NSArray<NSString*>*)fontStack range:(NSRange)range {
if (!_mbglMap) {
return;
}
if ([self.delegate respondsToSelector:@selector(mapView:glyphsWillLoad:range:)]) {
[self.delegate mapView:self glyphsWillLoad:fontStack range:range];
}
}
- (void)glyphsDidLoad:(nonnull NSArray<NSString*>*)fontStack range:(NSRange)range {
if (!_mbglMap) {
return;
}
if ([self.delegate respondsToSelector:@selector(mapView:glyphsDidLoad:range:)]) {
[self.delegate mapView:self glyphsDidLoad:fontStack range:range];
}
}
- (void)glyphsDidError:(nonnull NSArray<NSString*>*)fontStack range:(NSRange)range {
if (!_mbglMap) {
return;
}
if ([self.delegate respondsToSelector:@selector(mapView:glyphsDidError:range:)]) {
[self.delegate mapView:self glyphsDidError:fontStack range:range];
}
}
- (void)tileDidTriggerAction:(MLNTileOperation)operation
x:(NSInteger)x
y:(NSInteger)y
z:(NSInteger)z
wrap:(NSInteger)wrap
overscaledZ:(NSInteger)overscaledZ
sourceID:(nonnull NSString *)sourceID {
if (!_mbglMap) {
return;
}
if ([self.delegate respondsToSelector:@selector(mapView:tileDidTriggerAction:x:y:z:wrap:overscaledZ:sourceID:)]) {
[self.delegate mapView:self tileDidTriggerAction:operation x:x y:y z:z wrap:wrap overscaledZ:overscaledZ sourceID:sourceID];
}
}
- (void)spriteWillLoad:(nullable NSString *)id url:(nullable NSString *)url {
if (!_mbglMap) {
return;
}
if ([self.delegate respondsToSelector:@selector(mapView:spriteWillLoad:url:)]) {
[self.delegate mapView:self spriteWillLoad:id url:url];
}
}
- (void)spriteDidLoad:(nullable NSString *)id url:(nullable NSString *)url {
if (!_mbglMap) {
return;
}
if ([self.delegate respondsToSelector:@selector(mapView:spriteDidLoad:url:)]) {
[self.delegate mapView:self spriteDidLoad:id url:url];
}
}
- (void)spriteDidError:(nullable NSString *)id url:(nullable NSString *)url {
if (!_mbglMap) {
return;
}
if ([self.delegate respondsToSelector:@selector(mapView:spriteDidError:url:)]) {
[self.delegate mapView:self spriteDidError:id url:url];
}
}
// MARK: Printing
- (void)print:(__unused id)sender {

View File

@@ -1,5 +1,6 @@
#import <AppKit/AppKit.h>
#import <Foundation/Foundation.h>
#import <MLNTileOperation.h>
NS_ASSUME_NONNULL_BEGIN
@@ -227,6 +228,50 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (BOOL)mapView:(MLNMapView *)mapView shouldRemoveStyleImage:(NSString *)imageName;
// MARK: Shader Compilation
- (void)mapView:(MLNMapView *)mapView
shaderWillCompile:(NSInteger)id
backend:(NSInteger)backend
defines:(NSString *)defines;
- (void)mapView:(MLNMapView *)mapView
shaderDidCompile:(NSInteger)id
backend:(NSInteger)backend
defines:(NSString *)defines;
- (void)mapView:(MLNMapView *)mapView
shaderDidFailCompile:(NSInteger)id
backend:(NSInteger)backend
defines:(NSString *)defines;
// MARK: Glyph Requests
- (void)mapView:(MLNMapView *)mapView
glyphsWillLoad:(NSArray<NSString *> *)fontStack
range:(NSRange)range;
- (void)mapView:(MLNMapView *)mapView
glyphsDidLoad:(NSArray<NSString *> *)fontStack
range:(NSRange)range;
- (void)mapView:(MLNMapView *)mapView
glyphsDidError:(NSArray<NSString *> *)fontStack
range:(NSRange)range;
// MARK: Tile Requests
- (void)mapView:(MLNMapView *)mapView
tileDidTriggerAction:(MLNTileOperation)operation
x:(NSInteger)x
y:(NSInteger)y
z:(NSInteger)z
wrap:(NSInteger)wrap
overscaledZ:(NSInteger)overscaledZ
sourceID:(NSString *)sourceID;
// MARK: Sprite Requests
- (void)mapView:(MLNMapView *)mapView spriteWillLoad:(NSString *)id url:(NSString *)url;
- (void)mapView:(MLNMapView *)mapView spriteDidLoad:(NSString *)id url:(NSString *)url;
- (void)mapView:(MLNMapView *)mapView spriteDidError:(NSString *)id url:(NSString *)url;
// MARK: Managing the Appearance of Annotations
/**

View File

@@ -1,4 +1,5 @@
#import "MLNMapView.h"
#import "MLNTileOperation.h"
#include <mbgl/util/size.hpp>
@@ -47,6 +48,29 @@ class Renderer;
- (void)sourceDidChange:(nonnull MLNSource *)source;
- (BOOL)shouldRemoveStyleImage:(nonnull NSString *)imageName;
- (void)shaderWillCompile:(NSInteger)id
backend:(NSInteger)backend
defines:(nonnull NSString *)defines;
- (void)shaderDidCompile:(NSInteger)id
backend:(NSInteger)backend
defines:(nonnull NSString *)defines;
- (void)shaderDidFailCompile:(NSInteger)id
backend:(NSInteger)backend
defines:(nonnull NSString *)defines;
- (void)glyphsWillLoad:(nonnull NSArray<NSString *> *)fontStack range:(NSRange)range;
- (void)glyphsDidLoad:(nonnull NSArray<NSString *> *)fontStack range:(NSRange)range;
- (void)glyphsDidError:(nonnull NSArray<NSString *> *)fontStack range:(NSRange)range;
- (void)tileDidTriggerAction:(MLNTileOperation)operation
x:(NSInteger)x
y:(NSInteger)y
z:(NSInteger)z
wrap:(NSInteger)wrap
overscaledZ:(NSInteger)overscaledZ
sourceID:(nonnull NSString *)sourceID;
- (void)spriteWillLoad:(nullable NSString *)id url:(nullable NSString *)url;
- (void)spriteDidLoad:(nullable NSString *)id url:(nullable NSString *)url;
- (void)spriteDidError:(nullable NSString *)id url:(nullable NSString *)url;
/// Asynchronously render a frame of the map.
- (void)setNeedsRerender;