Mztj67_#M}W?l>kYSliK<%xAp;0j{!}J0!o7b
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
literal 0
HcmV?d00001
diff --git a/maplibre_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/maplibre_ios/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..0467bf12aa4d28f374bb26596605a46dcbb3e7c8
GIT binary patch
literal 1418
zcmV;51$Fv~P)q
zKfU)WzW*n(@|xWGCA9ScMt*e9`2kdxPQ&&>|-UCa7_51w+
zLUsW@ZzZSW0y$)Hp~e9%PvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq
z^={4hPQv)y=I|4n+?>7Fim=dxt1
z2H+Dm+1+fh+IF>G0SjJMkQQre1x4|G*Z==(Ot&kCnUrL4I(rf(ucITwmuHf^hXiJT
zkdTm&kdTm&kdTm&kdP`esgWG0BcWCVkVZ&2dUwN`cgM8QJb`Z7Z~e<&Yj2(}>Tmf`
zm1{eLgw!b{bXkjWbF%dTkTZEJWyWOb##Lfw4EK2}<0d6%>AGS{po>WCOy&f$Tay_>
z?NBlkpo@s-O;0V%Y_Xa-G#_O08q5LR*~F%&)}{}r&L%Sbs8AS4t7Y0NEx*{soY=0MZExqA5XHQkqi#4gW3
zqODM^iyZl;dvf)-bOXtOru(s)Uc7~BFx{w-FK;2{`VA?(g&@3z&bfLFyctOH!cVsF
z7IL=fo-qBndRUm;kAdXR4e6>k-z|21AaN%ubeVrHl*<|s&Ax@W-t?LR(P-24A5=>a
z*R9#QvjzF8n%@1Nw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE
z>Gkj4Sq&2e+-G%|+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62(
zdqY93Zy}v&c4n($Vv!UybR8ocs7#zbfX1IY-*w~)p}XyZ-SFC~4w>BvMVr`dFbelV{lLL0bx7@*ZZdebr3`sP;?
zVImji)kG)(6Juv0lz@q`F!k1FE;CQ(D0iG$wchPbKZQELlsZ#~rt8#90Y_Xh&3U-<
z{s<&cCV_1`^TD^ia9!*mQDq&
zn2{r`j};V|uV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvw
zvtqy3iz0WSpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqv
zo}Piadq!j76}004RBio<`)70k^`K1NK)q>w?p^C6J2ZC!+UppiK6&y3Kmbv&O!oYF
z34$0Z;QO!JOY#!`qyGH<3Pd}Pt@q*A0V=3SVtWKRR8d8Z&@)3qLPA19LPA19LPEUC
YUoZo%k(ykuW&i*H07*qoM6N<$f+CH{y8r+H
literal 0
HcmV?d00001
diff --git a/maplibre_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/maplibre_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100644
index 00000000..0bedcf2f
--- /dev/null
+++ b/maplibre_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/maplibre_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/maplibre_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838
GIT binary patch
literal 68
zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J
Q1PU{Fy85}Sb4q9e0B4a5jsO4v
literal 0
HcmV?d00001
diff --git a/maplibre_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/maplibre_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838
GIT binary patch
literal 68
zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J
Q1PU{Fy85}Sb4q9e0B4a5jsO4v
literal 0
HcmV?d00001
diff --git a/maplibre_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/maplibre_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838
GIT binary patch
literal 68
zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J
Q1PU{Fy85}Sb4q9e0B4a5jsO4v
literal 0
HcmV?d00001
diff --git a/maplibre_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/maplibre_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
new file mode 100644
index 00000000..89c2725b
--- /dev/null
+++ b/maplibre_ios/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
@@ -0,0 +1,5 @@
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
+You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/maplibre_ios/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/maplibre_ios/example/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 00000000..f2e259c7
--- /dev/null
+++ b/maplibre_ios/example/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/maplibre_ios/example/ios/Runner/Base.lproj/Main.storyboard b/maplibre_ios/example/ios/Runner/Base.lproj/Main.storyboard
new file mode 100644
index 00000000..f3c28516
--- /dev/null
+++ b/maplibre_ios/example/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/maplibre_ios/example/ios/Runner/Info.plist b/maplibre_ios/example/ios/Runner/Info.plist
new file mode 100644
index 00000000..0561c6c3
--- /dev/null
+++ b/maplibre_ios/example/ios/Runner/Info.plist
@@ -0,0 +1,49 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Maplibre Ios
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ maplibre_ios_example
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ CADisableMinimumFrameDurationOnPhone
+
+ UIApplicationSupportsIndirectInputEvents
+
+
+
diff --git a/maplibre_ios/example/ios/Runner/Runner-Bridging-Header.h b/maplibre_ios/example/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 00000000..308a2a56
--- /dev/null
+++ b/maplibre_ios/example/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
diff --git a/maplibre_ios/example/ios/RunnerTests/RunnerTests.swift b/maplibre_ios/example/ios/RunnerTests/RunnerTests.swift
new file mode 100644
index 00000000..f08d386f
--- /dev/null
+++ b/maplibre_ios/example/ios/RunnerTests/RunnerTests.swift
@@ -0,0 +1,29 @@
+import Flutter
+import UIKit
+import XCTest
+
+// If your plugin has been explicitly set to "type: .dynamic" in the Package.swift,
+// you will need to add your plugin as a dependency of RunnerTests within Xcode.
+
+@testable import maplibre_ios
+
+// This demonstrates a simple unit test of the Swift portion of this plugin's implementation.
+//
+// See https://developer.apple.com/documentation/xctest for more information about using XCTest.
+
+class RunnerTests: XCTestCase {
+
+ func testGetPlatformVersion() {
+ let plugin = MaplibreIosPlugin()
+
+ let call = FlutterMethodCall(methodName: "getPlatformVersion", arguments: [])
+
+ let resultExpectation = expectation(description: "result block must be called.")
+ plugin.handle(call) { result in
+ XCTAssertEqual(result as! String, "iOS " + UIDevice.current.systemVersion)
+ resultExpectation.fulfill()
+ }
+ waitForExpectations(timeout: 1)
+ }
+
+}
diff --git a/maplibre_ios/example/lib/main.dart b/maplibre_ios/example/lib/main.dart
new file mode 100644
index 00000000..67737bd7
--- /dev/null
+++ b/maplibre_ios/example/lib/main.dart
@@ -0,0 +1,63 @@
+import 'package:flutter/material.dart';
+import 'dart:async';
+
+import 'package:flutter/services.dart';
+import 'package:maplibre_ios/maplibre_ios.dart';
+
+void main() {
+ runApp(const MyApp());
+}
+
+class MyApp extends StatefulWidget {
+ const MyApp({super.key});
+
+ @override
+ State createState() => _MyAppState();
+}
+
+class _MyAppState extends State {
+ String _platformVersion = 'Unknown';
+ final _maplibreIosPlugin = MaplibreIos();
+
+ @override
+ void initState() {
+ super.initState();
+ initPlatformState();
+ }
+
+ // Platform messages are asynchronous, so we initialize in an async method.
+ Future initPlatformState() async {
+ String platformVersion;
+ // Platform messages may fail, so we use a try/catch PlatformException.
+ // We also handle the message potentially returning null.
+ try {
+ platformVersion =
+ await _maplibreIosPlugin.getPlatformVersion() ?? 'Unknown platform version';
+ } on PlatformException {
+ platformVersion = 'Failed to get platform version.';
+ }
+
+ // If the widget was removed from the tree while the asynchronous platform
+ // message was in flight, we want to discard the reply rather than calling
+ // setState to update our non-existent appearance.
+ if (!mounted) return;
+
+ setState(() {
+ _platformVersion = platformVersion;
+ });
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ home: Scaffold(
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: Center(
+ child: Text('Running on: $_platformVersion\n'),
+ ),
+ ),
+ );
+ }
+}
diff --git a/maplibre_ios/example/pubspec.yaml b/maplibre_ios/example/pubspec.yaml
new file mode 100644
index 00000000..082d7947
--- /dev/null
+++ b/maplibre_ios/example/pubspec.yaml
@@ -0,0 +1,20 @@
+name: maplibre_ios_example
+description: "Demonstrates how to use the maplibre_ios plugin."
+publish_to: 'none'
+version: 1.0.0+1
+
+environment:
+ sdk: ^3.4.0
+
+dependencies:
+ flutter:
+ sdk: flutter
+
+ maplibre_ios:
+ path: ../
+
+dev_dependencies:
+ flutter_lints: ^5.0.0
+
+flutter:
+ uses-material-design: true
diff --git a/maplibre_ios/ios/.gitignore b/maplibre_ios/ios/.gitignore
new file mode 100644
index 00000000..034771fc
--- /dev/null
+++ b/maplibre_ios/ios/.gitignore
@@ -0,0 +1,38 @@
+.idea/
+.vagrant/
+.sconsign.dblite
+.svn/
+
+.DS_Store
+*.swp
+profile
+
+DerivedData/
+build/
+GeneratedPluginRegistrant.h
+GeneratedPluginRegistrant.m
+
+.generated/
+
+*.pbxuser
+*.mode1v3
+*.mode2v3
+*.perspectivev3
+
+!default.pbxuser
+!default.mode1v3
+!default.mode2v3
+!default.perspectivev3
+
+xcuserdata
+
+*.moved-aside
+
+*.pyc
+*sync/
+Icon?
+.tags*
+
+/Flutter/Generated.xcconfig
+/Flutter/ephemeral/
+/Flutter/flutter_export_environment.sh
diff --git a/maplibre_ios/ios/maplibre_ios.podspec b/maplibre_ios/ios/maplibre_ios.podspec
new file mode 100644
index 00000000..d3562bd0
--- /dev/null
+++ b/maplibre_ios/ios/maplibre_ios.podspec
@@ -0,0 +1,30 @@
+#
+# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
+# Run `pod lib lint maplibre_ios.podspec` to validate before publishing.
+#
+Pod::Spec.new do |s|
+ s.name = 'maplibre_ios'
+ s.version = '0.0.1'
+ s.summary = 'Helper package for maplibre that provides iOS FFI bindings'
+ s.description = <<-DESC
+Helper package for maplibre that provides iOS FFI bindings
+ DESC
+ s.homepage = 'https://github.com/josxha/flutter-maplibre'
+ s.license = { :file => '../LICENSE' }
+ s.author = { 'Joscha Eckert' => 'info@joscha-eckert.de' }
+ s.source = { :path => '.' }
+ s.source_files = 'maplibre_ios/Sources/maplibre_ios/**/*'
+ s.dependency 'Flutter'
+ s.dependency 'MapLibre', '6.8.1'
+ s.platform = :ios, '12.0'
+
+ # Flutter.framework does not contain a i386 slice.
+ s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }
+ s.swift_version = '5.0'
+
+ # If your plugin requires a privacy manifest, for example if it uses any
+ # required reason APIs, update the PrivacyInfo.xcprivacy file to describe your
+ # plugin's privacy impact, and then uncomment this line. For more information,
+ # see https://developer.apple.com/documentation/bundleresources/privacy_manifest_files
+ # s.resource_bundles = {'maplibre_ios_privacy' => ['maplibre_ios/Sources/maplibre_ios/PrivacyInfo.xcprivacy']}
+end
diff --git a/maplibre_ios/ios/maplibre_ios/Package.swift b/maplibre_ios/ios/maplibre_ios/Package.swift
new file mode 100644
index 00000000..86e93d62
--- /dev/null
+++ b/maplibre_ios/ios/maplibre_ios/Package.swift
@@ -0,0 +1,32 @@
+// swift-tools-version: 5.9
+// The swift-tools-version declares the minimum version of Swift required to build this package.
+
+import PackageDescription
+
+let package = Package(
+ name: "maplibre_ios",
+ platforms: [
+ .iOS("12.0")
+ ],
+ products: [
+ .library(name: "maplibre-ios", targets: ["maplibre_ios"])
+ ],
+ dependencies: [],
+ targets: [
+ .target(
+ name: "maplibre_ios",
+ dependencies: [],
+ resources: [
+ // If your plugin requires a privacy manifest, for example if it uses any required
+ // reason APIs, update the PrivacyInfo.xcprivacy file to describe your plugin's
+ // privacy impact, and then uncomment these lines. For more information, see
+ // https://developer.apple.com/documentation/bundleresources/privacy_manifest_files
+ // .process("PrivacyInfo.xcprivacy"),
+
+ // If you have other resources that need to be bundled with your plugin, refer to
+ // the following instructions to add them:
+ // https://developer.apple.com/documentation/xcode/bundling-resources-with-a-swift-package
+ ]
+ )
+ ]
+)
diff --git a/maplibre_ios/ios/maplibre_ios/Sources/maplibre_ios/MaplibreIosPlugin.swift b/maplibre_ios/ios/maplibre_ios/Sources/maplibre_ios/MaplibreIosPlugin.swift
new file mode 100644
index 00000000..e14453b1
--- /dev/null
+++ b/maplibre_ios/ios/maplibre_ios/Sources/maplibre_ios/MaplibreIosPlugin.swift
@@ -0,0 +1,19 @@
+import Flutter
+import UIKit
+
+public class MaplibreIosPlugin: NSObject, FlutterPlugin {
+ public static func register(with registrar: FlutterPluginRegistrar) {
+ let channel = FlutterMethodChannel(name: "maplibre_ios", binaryMessenger: registrar.messenger())
+ let instance = MaplibreIosPlugin()
+ registrar.addMethodCallDelegate(instance, channel: channel)
+ }
+
+ public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
+ switch call.method {
+ case "getPlatformVersion":
+ result("iOS " + UIDevice.current.systemVersion)
+ default:
+ result(FlutterMethodNotImplemented)
+ }
+ }
+}
diff --git a/maplibre_ios/ios/maplibre_ios/Sources/maplibre_ios/PrivacyInfo.xcprivacy b/maplibre_ios/ios/maplibre_ios/Sources/maplibre_ios/PrivacyInfo.xcprivacy
new file mode 100644
index 00000000..a34b7e2e
--- /dev/null
+++ b/maplibre_ios/ios/maplibre_ios/Sources/maplibre_ios/PrivacyInfo.xcprivacy
@@ -0,0 +1,14 @@
+
+
+
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
+
+
diff --git a/maplibre_ios/lib/maplibre_ffi.dart b/maplibre_ios/lib/maplibre_ffi.dart
new file mode 100644
index 00000000..373f7af1
--- /dev/null
+++ b/maplibre_ios/lib/maplibre_ffi.dart
@@ -0,0 +1,4850 @@
+// ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field, return_of_invalid_type, void_checks, annotate_overrides, no_leading_underscores_for_local_identifiers, library_private_types_in_public_api
+// AUTO GENERATED FILE, DO NOT EDIT.
+//
+// Generated by `package:ffigen`.
+// ignore_for_file: type=lint
+import 'dart:ffi' as ffi;
+import 'package:objective_c/objective_c.dart' as objc;
+import 'package:ffi/ffi.dart' as pkg_ffi;
+
+@ffi.Native<
+ ffi.Pointer Function(
+ ffi.Pointer)>(isLeaf: true)
+external ffi.Pointer _MapLibreFFi_wrapListenerBlock_1pl9qdv(
+ ffi.Pointer block,
+);
+
+final class CGPoint extends ffi.Struct {
+ @ffi.Double()
+ external double x;
+
+ @ffi.Double()
+ external double y;
+}
+
+final class CGSize extends ffi.Struct {
+ @ffi.Double()
+ external double width;
+
+ @ffi.Double()
+ external double height;
+}
+
+final class CGRect extends ffi.Struct {
+ external CGPoint origin;
+
+ external CGSize size;
+}
+
+final class _NSZone extends ffi.Opaque {}
+
+/// WARNING: NSPredicate is a stub. To generate bindings for this class, include
+/// NSPredicate in your config's objc-interfaces list.
+///
+/// NSPredicate
+class NSPredicate extends objc.NSObject {
+ NSPredicate._(ffi.Pointer pointer,
+ {bool retain = false, bool release = false})
+ : super.castFromPointer(pointer, retain: retain, release: release);
+
+ /// Constructs a [NSPredicate] that points to the same underlying object as [other].
+ NSPredicate.castFrom(objc.ObjCObjectBase other)
+ : this._(other.ref.pointer, retain: true, release: true);
+
+ /// Constructs a [NSPredicate] that wraps the given raw object pointer.
+ NSPredicate.castFromPointer(ffi.Pointer other,
+ {bool retain = false, bool release = false})
+ : this._(other, retain: retain, release: release);
+}
+
+/// Options for enabling debugging features in an ``MLNMapView`` instance.
+enum MLNMapDebugMaskOptions {
+ /// Edges of tile boundaries are shown as thick, red lines to help diagnose
+ /// tile clipping issues.
+ MLNMapDebugTileBoundariesMask(2),
+
+ /// Each tile shows its tile coordinate (x/y/z) in the upper-left corner.
+ MLNMapDebugTileInfoMask(4),
+
+ /// Each tile shows a timestamp indicating when it was loaded.
+ MLNMapDebugTimestampsMask(8),
+
+ /// Edges of glyphs and symbols are shown as faint, green lines to help
+ /// diagnose collision and label placement issues.
+ MLNMapDebugCollisionBoxesMask(16),
+
+ /// Each drawing operation is replaced by a translucent fill. Overlapping
+ /// drawing operations appear more prominent to help diagnose overdrawing.
+ /// > Note: This option does nothing in Release builds of the SDK.
+ MLNMapDebugOverdrawVisualizationMask(32),
+
+ /// The stencil buffer is shown instead of the color buffer.
+ /// > Note: This option does nothing in Release builds of the SDK.
+ MLNMapDebugStencilBufferMask(64),
+
+ /// The depth buffer is shown instead of the color buffer.
+ /// > Note: This option does nothing in Release builds of the SDK.
+ MLNMapDebugDepthBufferMask(128);
+
+ final int value;
+ const MLNMapDebugMaskOptions(this.value);
+
+ static MLNMapDebugMaskOptions fromValue(int value) => switch (value) {
+ 2 => MLNMapDebugTileBoundariesMask,
+ 4 => MLNMapDebugTileInfoMask,
+ 8 => MLNMapDebugTimestampsMask,
+ 16 => MLNMapDebugCollisionBoxesMask,
+ 32 => MLNMapDebugOverdrawVisualizationMask,
+ 64 => MLNMapDebugStencilBufferMask,
+ 128 => MLNMapDebugDepthBufferMask,
+ _ => throw ArgumentError(
+ "Unknown value for MLNMapDebugMaskOptions: $value"),
+ };
+}
+
+/// A structure containing information about a transition.
+final class MLNTransition extends ffi.Struct {
+ /// The amount of time the animation should take, not including the delay.
+ @ffi.Double()
+ external double duration;
+
+ /// The amount of time in seconds to wait before beginning the animation.
+ @ffi.Double()
+ external double delay;
+}
+
+/// Constants indicating the visibility of different map ornaments.
+enum MLNOrnamentVisibility {
+ /// A constant indicating that the ornament adapts to the current map state.
+ MLNOrnamentVisibilityAdaptive(0),
+
+ /// A constant indicating that the ornament is always hidden.
+ MLNOrnamentVisibilityHidden(1),
+
+ /// A constant indicating that the ornament is always visible.
+ MLNOrnamentVisibilityVisible(2);
+
+ final int value;
+ const MLNOrnamentVisibility(this.value);
+
+ static MLNOrnamentVisibility fromValue(int value) => switch (value) {
+ 0 => MLNOrnamentVisibilityAdaptive,
+ 1 => MLNOrnamentVisibilityHidden,
+ 2 => MLNOrnamentVisibilityVisible,
+ _ => throw ArgumentError(
+ "Unknown value for MLNOrnamentVisibility: $value"),
+ };
+}
+
+/// WARNING: MLNCompassButton is a stub. To generate bindings for this class, include
+/// MLNCompassButton in your config's objc-interfaces list.
+///
+/// A specialized view that displays the current compass heading for its associated map.
+class MLNCompassButton extends objc.ObjCObjectBase {
+ MLNCompassButton._(ffi.Pointer pointer,
+ {bool retain = false, bool release = false})
+ : super(pointer, retain: retain, release: release);
+
+ /// Constructs a [MLNCompassButton] that points to the same underlying object as [other].
+ MLNCompassButton.castFrom(objc.ObjCObjectBase other)
+ : this._(other.ref.pointer, retain: true, release: true);
+
+ /// Constructs a [MLNCompassButton] that wraps the given raw object pointer.
+ MLNCompassButton.castFromPointer(ffi.Pointer other,
+ {bool retain = false, bool release = false})
+ : this._(other, retain: retain, release: release);
+}
+
+final class CLLocationCoordinate2D extends ffi.Struct {
+ @ffi.Double()
+ external double latitude;
+
+ @ffi.Double()
+ external double longitude;
+}
+
+/// A rectangular area as measured on a two-dimensional map projection.
+final class MLNCoordinateBounds extends ffi.Struct {
+ /// Coordinate at the southwest corner.
+ external CLLocationCoordinate2D sw;
+
+ /// Coordinate at the northeast corner.
+ external CLLocationCoordinate2D ne;
+}
+
+/// WARNING: MLNMapCamera is a stub. To generate bindings for this class, include
+/// MLNMapCamera in your config's objc-interfaces list.
+///
+/// An ``MLNMapCamera`` object represents a viewpoint from which the user observes
+/// some point on an ``MLNMapView``.
+///
+/// #### Related examples
+/// - : learn how to use the
+/// ``MLNMapViewDelegate/mapView:shouldChangeFromCamera:toCamera:`` method of ``MLNMapViewDelegate`` to
+/// restrict panning.
+/// - *TODO:* Camera animation, learn how to create a camera that rotates
+/// around a central point.
+class MLNMapCamera extends objc.NSObject {
+ MLNMapCamera._(ffi.Pointer pointer,
+ {bool retain = false, bool release = false})
+ : super.castFromPointer(pointer, retain: retain, release: release);
+
+ /// Constructs a [MLNMapCamera] that points to the same underlying object as [other].
+ MLNMapCamera.castFrom(objc.ObjCObjectBase other)
+ : this._(other.ref.pointer, retain: true, release: true);
+
+ /// Constructs a [MLNMapCamera] that wraps the given raw object pointer.
+ MLNMapCamera.castFromPointer(ffi.Pointer other,
+ {bool retain = false, bool release = false})
+ : this._(other, retain: retain, release: release);
+}
+
+/// WARNING: MLNStyle is a stub. To generate bindings for this class, include
+/// MLNStyle in your config's objc-interfaces list.
+///
+/// The proxy object for the current map style.
+///
+/// MLNStyle provides a set of convenience methods for changing default styles included
+/// with MapLibre.
+///
+/// It is also possible to directly manipulate the current map style
+/// via ``MLNMapView/style`` by updating the style's data sources or layers.
+///
+/// > Note: Wait until the map style has finished loading before modifying a map's
+/// style via any of the ``MLNStyle`` instance methods below. You can use the
+/// ``MLNMapViewDelegate/mapView:didFinishLoadingStyle:`` or
+/// ``MLNMapViewDelegate/mapViewDidFinishLoadingMap:`` methods as indicators
+/// that it's safe to modify the map's style.
+class MLNStyle extends objc.NSObject {
+ MLNStyle._(ffi.Pointer pointer,
+ {bool retain = false, bool release = false})
+ : super.castFromPointer(pointer, retain: retain, release: release);
+
+ /// Constructs a [MLNStyle] that points to the same underlying object as [other].
+ MLNStyle.castFrom(objc.ObjCObjectBase other)
+ : this._(other.ref.pointer, retain: true, release: true);
+
+ /// Constructs a [MLNStyle] that wraps the given raw object pointer.
+ MLNStyle.castFromPointer(ffi.Pointer other,
+ {bool retain = false, bool release = false})
+ : this._(other, retain: retain, release: release);
+}
+
+/// The vertical alignment of an annotation within a map view. Used with
+/// ``MLNMapView/userLocationVerticalAlignment``.
+enum MLNAnnotationVerticalAlignment {
+ /// Aligns the annotation vertically in the center of the map view.
+ MLNAnnotationVerticalAlignmentCenter(0),
+
+ /// Aligns the annotation vertically at the top of the map view.
+ MLNAnnotationVerticalAlignmentTop(1),
+
+ /// Aligns the annotation vertically at the bottom of the map view.
+ MLNAnnotationVerticalAlignmentBottom(2);
+
+ final int value;
+ const MLNAnnotationVerticalAlignment(this.value);
+
+ static MLNAnnotationVerticalAlignment fromValue(int value) => switch (value) {
+ 0 => MLNAnnotationVerticalAlignmentCenter,
+ 1 => MLNAnnotationVerticalAlignmentTop,
+ 2 => MLNAnnotationVerticalAlignmentBottom,
+ _ => throw ArgumentError(
+ "Unknown value for MLNAnnotationVerticalAlignment: $value"),
+ };
+}
+
+/// The position of scale bar, compass, logo and attribution in a map view. Used with
+/// ``MLNMapView/scaleBarPosition``,
+/// ``MLNMapView/compassViewPosition``,
+/// ``MLNMapView/logoViewPosition``,
+/// ``MLNMapView/attributionButtonPosition``.
+enum MLNOrnamentPosition {
+ /// Place the ornament in the top left of the map view.
+ MLNOrnamentPositionTopLeft(0),
+
+ /// Place the ornament in the top right of the map view.
+ MLNOrnamentPositionTopRight(1),
+
+ /// Place the ornament in the bottom left of the map view.
+ MLNOrnamentPositionBottomLeft(2),
+
+ /// Place the ornament in the bottom right of the map view.
+ MLNOrnamentPositionBottomRight(3);
+
+ final int value;
+ const MLNOrnamentPosition(this.value);
+
+ static MLNOrnamentPosition fromValue(int value) => switch (value) {
+ 0 => MLNOrnamentPositionTopLeft,
+ 1 => MLNOrnamentPositionTopRight,
+ 2 => MLNOrnamentPositionBottomLeft,
+ 3 => MLNOrnamentPositionBottomRight,
+ _ =>
+ throw ArgumentError("Unknown value for MLNOrnamentPosition: $value"),
+ };
+}
+
+/// The mode used to track the user location on the map. Used with
+/// ``MLNMapView/userTrackingMode``.
+///
+/// #### Related examples
+/// - TODO: Switch between user tracking modes example to learn how to toggle modes and
+/// how each mode behaves.
+enum MLNUserTrackingMode {
+ /// The map does not follow the user location.
+ MLNUserTrackingModeNone(0),
+
+ /// The map follows the user location. This tracking mode falls back
+ /// to ``MLNUserTrackingMode/MLNUserTrackingModeNone`` if the user pans the map view.
+ MLNUserTrackingModeFollow(1),
+
+ /// The map follows the user location and rotates when the heading changes.
+ /// The default user location annotation displays a fan-shaped indicator with
+ /// the current heading. The heading indicator represents the direction the
+ /// device is facing, which is sized according to the reported accuracy.
+ ///
+ /// This tracking mode is disabled if the user pans the map view, but
+ /// remains enabled if the user zooms in. If the user rotates the map
+ /// view, this tracking mode will fall back to ``MLNUserTrackingModeFollow``.
+ MLNUserTrackingModeFollowWithHeading(2),
+
+ /// The map follows the user location and rotates when the course changes.
+ /// Course represents the direction in which the device is traveling.
+ /// The default user location annotation shows a puck-shaped indicator
+ /// that rotates as the course changes.
+ ///
+ /// This tracking mode is disabled if the user pans the map view, but
+ /// remains enabled if the user zooms in. If the user rotates the map view,
+ /// this tracking mode will fall back to ``MLNUserTrackingModeFollow``.
+ MLNUserTrackingModeFollowWithCourse(3);
+
+ final int value;
+ const MLNUserTrackingMode(this.value);
+
+ static MLNUserTrackingMode fromValue(int value) => switch (value) {
+ 0 => MLNUserTrackingModeNone,
+ 1 => MLNUserTrackingModeFollow,
+ 2 => MLNUserTrackingModeFollowWithHeading,
+ 3 => MLNUserTrackingModeFollowWithCourse,
+ _ =>
+ throw ArgumentError("Unknown value for MLNUserTrackingMode: $value"),
+ };
+}
+
+enum MLNPanScrollingMode {
+ /// The map allows the user to only scroll horizontally.
+ MLNPanScrollingModeHorizontal(0),
+
+ /// The map allows the user to only scroll vertically.
+ MLNPanScrollingModeVertical(1),
+
+ /// The map allows the user to scroll both horizontally and vertically.
+ MLNPanScrollingModeDefault(2);
+
+ final int value;
+ const MLNPanScrollingMode(this.value);
+
+ static MLNPanScrollingMode fromValue(int value) => switch (value) {
+ 0 => MLNPanScrollingModeHorizontal,
+ 1 => MLNPanScrollingModeVertical,
+ 2 => MLNPanScrollingModeDefault,
+ _ =>
+ throw ArgumentError("Unknown value for MLNPanScrollingMode: $value"),
+ };
+}
+
+late final _class_MLNMapView = objc.getClass("MapLibre.MLNMapView");
+late final _sel_isKindOfClass_ = objc.registerName("isKindOfClass:");
+final _objc_msgSend_69e0x1 = objc.msgSendPointer
+ .cast<
+ ffi.NativeFunction<
+ ffi.Bool Function(
+ ffi.Pointer,
+ ffi.Pointer,
+ ffi.Pointer)>>()
+ .asFunction<
+ bool Function(ffi.Pointer,
+ ffi.Pointer, ffi.Pointer)>();
+typedef instancetype = ffi.Pointer;
+typedef Dartinstancetype = objc.ObjCObjectBase;
+late final _sel_initWithFrame_ = objc.registerName("initWithFrame:");
+final _objc_msgSend_19adbty = objc.msgSendPointer
+ .cast<
+ ffi.NativeFunction<
+ ffi.Pointer Function(ffi.Pointer,
+ ffi.Pointer, CGRect)>>()
+ .asFunction<
+ ffi.Pointer Function(ffi.Pointer,
+ ffi.Pointer, CGRect)>();
+late final _sel_initWithFrame_styleURL_ =
+ objc.registerName("initWithFrame:styleURL:");
+final _objc_msgSend_qsq5p6 = objc.msgSendPointer
+ .cast<
+ ffi.NativeFunction<
+ ffi.Pointer Function(
+ ffi.Pointer,
+ ffi.Pointer,
+ CGRect,
+ ffi.Pointer)>>()
+ .asFunction<
+ ffi.Pointer Function(
+ ffi.Pointer,
+ ffi.Pointer,
+ CGRect,
+ ffi.Pointer)>();
+late final _sel_delegate = objc.registerName("delegate");
+final _objc_msgSend_1x359cv = objc.msgSendPointer
+ .cast<
+ ffi.NativeFunction<
+ ffi.Pointer Function(ffi.Pointer,
+ ffi.Pointer)>>()
+ .asFunction<
+ ffi.Pointer Function(
+ ffi.Pointer, ffi.Pointer)>();
+late final _sel_setDelegate_ = objc.registerName("setDelegate:");
+final _objc_msgSend_1jdvcbf = objc.msgSendPointer
+ .cast<
+ ffi.NativeFunction<
+ ffi.Void Function(
+ ffi.Pointer,
+ ffi.Pointer,
+ ffi.Pointer)>>()
+ .asFunction<
+ void Function(ffi.Pointer,
+ ffi.Pointer, ffi.Pointer)>();
+late final _sel_style = objc.registerName("style");
+ffi.Pointer _ObjCBlock_MLNStyle_ffiVoid_fnPtrTrampoline(
+ ffi.Pointer block, ffi.Pointer arg0) =>
+ block.ref.target
+ .cast<
+ ffi.NativeFunction<
+ ffi.Pointer Function(
+ ffi.Pointer arg0)>>()
+ .asFunction<
+ ffi.Pointer Function(
+ ffi.Pointer)>()(arg0);
+ffi.Pointer _ObjCBlock_MLNStyle_ffiVoid_fnPtrCallable =
+ ffi.Pointer.fromFunction<
+ ffi.Pointer Function(
+ ffi.Pointer, ffi.Pointer)>(
+ _ObjCBlock_MLNStyle_ffiVoid_fnPtrTrampoline)
+ .cast();
+ffi.Pointer _ObjCBlock_MLNStyle_ffiVoid_closureTrampoline(
+ ffi.Pointer block, ffi.Pointer arg0) =>
+ (objc.getBlockClosure(block) as ffi.Pointer Function(
+ ffi.Pointer))(arg0);
+ffi.Pointer _ObjCBlock_MLNStyle_ffiVoid_closureCallable =
+ ffi.Pointer.fromFunction<
+ ffi.Pointer Function(
+ ffi.Pointer, ffi.Pointer)>(
+ _ObjCBlock_MLNStyle_ffiVoid_closureTrampoline)
+ .cast();
+
+/// Construction methods for `objc.ObjCBlock)>`.
+abstract final class ObjCBlock_MLNStyle_ffiVoid {
+ /// Returns a block that wraps the given raw block pointer.
+ static objc.ObjCBlock)>
+ castFromPointer(ffi.Pointer pointer,
+ {bool retain = false, bool release = false}) =>
+ objc.ObjCBlock)>(pointer,
+ retain: retain, release: release);
+
+ /// Creates a block from a C function pointer.
+ ///
+ /// This block must be invoked by native code running on the same thread as
+ /// the isolate that registered it. Invoking the block on the wrong thread
+ /// will result in a crash.
+ static objc.ObjCBlock)> fromFunctionPointer(
+ ffi.Pointer<
+ ffi.NativeFunction<
+ ffi.Pointer Function(
+ ffi.Pointer arg0)>>
+ ptr) =>
+ objc.ObjCBlock)>(
+ objc.newPointerBlock(
+ _ObjCBlock_MLNStyle_ffiVoid_fnPtrCallable, ptr.cast()),
+ retain: false,
+ release: true);
+
+ /// Creates a block from a Dart function.
+ ///
+ /// This block must be invoked by native code running on the same thread as
+ /// the isolate that registered it. Invoking the block on the wrong thread
+ /// will result in a crash.
+ static objc.ObjCBlock)> fromFunction(
+ MLNStyle? Function(ffi.Pointer) fn) =>
+ objc.ObjCBlock)>(
+ objc.newClosureBlock(
+ _ObjCBlock_MLNStyle_ffiVoid_closureCallable,
+ (ffi.Pointer arg0) =>
+ fn(arg0)?.ref.retainAndAutorelease() ?? ffi.nullptr),
+ retain: false,
+ release: true);
+}
+
+/// Call operator for `objc.ObjCBlock)>`.
+extension ObjCBlock_MLNStyle_ffiVoid_CallExtension
+ on objc.ObjCBlock)> {
+ MLNStyle? call(ffi.Pointer arg0) => ref.pointer.ref.invoke
+ .cast<
+ ffi.NativeFunction<
+ ffi.Pointer Function(
+ ffi.Pointer block,
+ ffi.Pointer arg0)>>()
+ .asFunction<
+ ffi.Pointer Function(
+ ffi.Pointer, ffi.Pointer)>()
+ (ref.pointer, arg0)
+ .address ==
+ 0
+ ? null
+ : MLNStyle.castFromPointer(
+ ref.pointer.ref.invoke
+ .cast Function(ffi.Pointer block, ffi.Pointer arg0)>>()
+ .asFunction Function(ffi.Pointer, ffi.Pointer)>()(ref.pointer, arg0),
+ retain: true,
+ release: true);
+}
+
+late final _sel_styleURL = objc.registerName("styleURL");
+late final _sel_setStyleURL_ = objc.registerName("setStyleURL:");
+late final _sel_reloadStyle_ = objc.registerName("reloadStyle:");
+late final _sel_automaticallyAdjustsContentInset =
+ objc.registerName("automaticallyAdjustsContentInset");
+final _objc_msgSend_91o635 = objc.msgSendPointer
+ .cast<
+ ffi.NativeFunction<
+ ffi.Bool Function(ffi.Pointer,
+ ffi.Pointer)>>()
+ .asFunction<
+ bool Function(
+ ffi.Pointer, ffi.Pointer)>();
+late final _sel_setAutomaticallyAdjustsContentInset_ =
+ objc.registerName("setAutomaticallyAdjustsContentInset:");
+final _objc_msgSend_1s56lr9 = objc.msgSendPointer
+ .cast<
+ ffi.NativeFunction<
+ ffi.Void Function(ffi.Pointer,
+ ffi.Pointer, ffi.Bool)>>()
+ .asFunction<
+ void Function(ffi.Pointer,
+ ffi.Pointer, bool)>();
+late final _sel_showsScale = objc.registerName("showsScale");
+late final _sel_setShowsScale_ = objc.registerName("setShowsScale:");
+
+/// WARNING: MLNScaleBar is a stub. To generate bindings for this class, include
+/// MLNScaleBar in your config's objc-interfaces list.
+///
+/// MLNScaleBar
+class MLNScaleBar extends objc.ObjCObjectBase {
+ MLNScaleBar._(ffi.Pointer pointer,
+ {bool retain = false, bool release = false})
+ : super(pointer, retain: retain, release: release);
+
+ /// Constructs a [MLNScaleBar] that points to the same underlying object as [other].
+ MLNScaleBar.castFrom(objc.ObjCObjectBase other)
+ : this._(other.ref.pointer, retain: true, release: true);
+
+ /// Constructs a [MLNScaleBar] that wraps the given raw object pointer.
+ MLNScaleBar.castFromPointer(ffi.Pointer other,
+ {bool retain = false, bool release = false})
+ : this._(other, retain: retain, release: release);
+}
+
+late final _sel_scaleBar = objc.registerName("scaleBar");
+late final _sel_scaleBarShouldShowDarkStyles =
+ objc.registerName("scaleBarShouldShowDarkStyles");
+late final _sel_setScaleBarShouldShowDarkStyles_ =
+ objc.registerName("setScaleBarShouldShowDarkStyles:");
+late final _sel_scaleBarUsesMetricSystem =
+ objc.registerName("scaleBarUsesMetricSystem");
+late final _sel_setScaleBarUsesMetricSystem_ =
+ objc.registerName("setScaleBarUsesMetricSystem:");
+late final _sel_scaleBarPosition = objc.registerName("scaleBarPosition");
+final _objc_msgSend_1c31cvt = objc.msgSendPointer
+ .cast<
+ ffi.NativeFunction<
+ ffi.UnsignedLong Function(ffi.Pointer,
+ ffi.Pointer)>>()
+ .asFunction<
+ int Function(
+ ffi.Pointer, ffi.Pointer)>();
+late final _sel_setScaleBarPosition_ =
+ objc.registerName("setScaleBarPosition:");
+final _objc_msgSend_8fd115 = objc.msgSendPointer
+ .cast<
+ ffi.NativeFunction<
+ ffi.Void Function(ffi.Pointer,
+ ffi.Pointer, ffi.UnsignedLong)>>()
+ .asFunction<
+ void Function(ffi.Pointer,
+ ffi.Pointer, int)>();
+late final _sel_scaleBarMargins = objc.registerName("scaleBarMargins");
+final _objc_msgSend_1uwdhlk = objc.msgSendPointer
+ .cast<
+ ffi.NativeFunction<
+ CGPoint Function(ffi.Pointer,
+ ffi.Pointer)>>()
+ .asFunction<
+ CGPoint Function(
+ ffi.Pointer, ffi.Pointer)>();
+final _objc_msgSend_1uwdhlkStret = objc.msgSendStretPointer
+ .cast<
+ ffi.NativeFunction<
+ ffi.Void Function(
+ ffi.Pointer,
+ ffi.Pointer,
+ ffi.Pointer)>>()
+ .asFunction<
+ void Function(ffi.Pointer, ffi.Pointer,
+ ffi.Pointer)>();
+late final _sel_setScaleBarMargins_ = objc.registerName("setScaleBarMargins:");
+final _objc_msgSend_iy8iz6 = objc.msgSendPointer
+ .cast<
+ ffi.NativeFunction<
+ ffi.Void Function(ffi.Pointer,
+ ffi.Pointer, CGPoint)>>()
+ .asFunction<
+ void Function(ffi.Pointer,
+ ffi.Pointer, CGPoint)>();
+late final _sel_compassView = objc.registerName("compassView");
+late final _sel_compassViewPosition = objc.registerName("compassViewPosition");
+late final _sel_setCompassViewPosition_ =
+ objc.registerName("setCompassViewPosition:");
+late final _sel_compassViewMargins = objc.registerName("compassViewMargins");
+late final _sel_setCompassViewMargins_ =
+ objc.registerName("setCompassViewMargins:");
+late final _sel_logoView = objc.registerName("logoView");
+final _objc_msgSend_1p5sbp0 = objc.msgSendPointer
+ .cast<
+ ffi.NativeFunction<
+ ffi.Pointer Function(ffi.Pointer,
+ ffi.Pointer)>>()
+ .asFunction<
+ ffi.Pointer Function(
+ ffi.Pointer, ffi.Pointer