From 674dd4c309c637b71ede8154edf65df0c4d38e5c Mon Sep 17 00:00:00 2001 From: masashi Date: Tue, 1 Sep 2026 11:40:49 +0900 Subject: [PATCH 01/28] Make bearing a clockwise map rotation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bearing を「値を増やすと地図が時計回りに回る」向きに統一し、ネイティブ SDK との変換をコアの CameraBearing に集約する。 --- .../geocell/WebMercatorScreenProjection.swift | 7 +-- .../MapConductorCore/map/CameraBearing.swift | 52 +++++++++++++++++++ .../map/MapCameraPositionBase.swift | 5 ++ ...bMercatorScreenProjectionGoldenTests.swift | 13 +++-- 4 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 Sources/MapConductorCore/map/CameraBearing.swift diff --git a/Sources/MapConductorCore/geocell/WebMercatorScreenProjection.swift b/Sources/MapConductorCore/geocell/WebMercatorScreenProjection.swift index de07b24..a18f85d 100644 --- a/Sources/MapConductorCore/geocell/WebMercatorScreenProjection.swift +++ b/Sources/MapConductorCore/geocell/WebMercatorScreenProjection.swift @@ -45,8 +45,9 @@ public enum WebMercatorScreenProjection { var sx = dx * worldSize var sy = (target.y - center.y) * worldSize if camera.bearing != 0 { - // bearing は「画面の上が指す方位(北から時計回り)」。世界を -bearing 回す。 - let angle = -camera.bearing * .pi / 180.0 + // 画面の上が指す方位はカメラの heading(= bearing の符号反転)。世界を + // -heading 回すと、その方位が画面の上(-y)に来る。 + let angle = -CameraBearing.toNativeHeading(camera.bearing) * .pi / 180.0 let rx = sx * cos(angle) - sy * sin(angle) let ry = sx * sin(angle) + sy * cos(angle) sx = rx @@ -66,7 +67,7 @@ public enum WebMercatorScreenProjection { var sx = offset.x - size.width / 2.0 var sy = offset.y - size.height / 2.0 if camera.bearing != 0 { - let angle = camera.bearing * .pi / 180.0 + let angle = CameraBearing.toNativeHeading(camera.bearing) * .pi / 180.0 let rx = sx * cos(angle) - sy * sin(angle) let ry = sx * sin(angle) + sy * cos(angle) sx = rx diff --git a/Sources/MapConductorCore/map/CameraBearing.swift b/Sources/MapConductorCore/map/CameraBearing.swift new file mode 100644 index 0000000..6f81318 --- /dev/null +++ b/Sources/MapConductorCore/map/CameraBearing.swift @@ -0,0 +1,52 @@ +import Foundation + +/// `MapCameraPosition.bearing` とネイティブ SDK の回転値の変換。 +/// +/// MapConductor の `bearing` は **「値を増やすと地図が時計回り(右)に回る」** 向きで +/// 定義する。0 が北で、90 なら地図全体が右へ 90 度回り、画面の上には西が来る。 +/// +/// ネイティブ SDK は大きく 2 系統に分かれる。 +/// +/// - **heading 系**(Google Maps / MapLibre / Mapbox / HERE / MapKit ほか) +/// 「画面の上が指す方位を北から時計回りに測る」=カメラの向き。値を増やすと地図は +/// 反時計回りに回るので、MapConductor とは符号が反転する。``toNativeHeading(_:)``。 +/// - **rotation 系**(ArcGIS の `Viewpoint.rotation` など)「北を時計回りに回す量」= +/// 地図の回転角。MapConductor と同じ向きなので変換は恒等になる。``toNativeRotation(_:)``。 +/// +/// 符号をプロバイダ各所に散らすと必ずどこかが漏れるので、変換はここだけに置く。 +/// +/// ドライバー実装点なので `@_spi(MapConductorDriver)`(android の +/// `@InternalMapConductorApi`、React の `/** @internal */` に対応)。 +@_spi(MapConductorDriver) +public enum CameraBearing { + + /// 角度を 0 以上 360 未満へ畳む。 + public static func normalizeDegrees360(_ degrees: Double) -> Double { + guard degrees.isFinite else { return 0 } + let wrapped = degrees.truncatingRemainder(dividingBy: 360.0) + return wrapped < 0 ? wrapped + 360.0 : wrapped + } + + /// MapConductor の bearing → heading 系ネイティブ SDK の値。 + /// + /// カメラが向いている方位でもあるので、負 tilt エミュレーションで + /// 「カメラの前進方向」が要るときもこれを使う。 + public static func toNativeHeading(_ bearing: Double) -> Double { + normalizeDegrees360(-bearing) + } + + /// heading 系ネイティブ SDK の値 → MapConductor の bearing。 + public static func bearingFromNativeHeading(_ heading: Double) -> Double { + normalizeDegrees360(-heading) + } + + /// MapConductor の bearing → rotation 系ネイティブ SDK の値(向きが同じなので恒等)。 + public static func toNativeRotation(_ bearing: Double) -> Double { + normalizeDegrees360(bearing) + } + + /// rotation 系ネイティブ SDK の値 → MapConductor の bearing(同上)。 + public static func bearingFromNativeRotation(_ rotation: Double) -> Double { + normalizeDegrees360(rotation) + } +} diff --git a/Sources/MapConductorCore/map/MapCameraPositionBase.swift b/Sources/MapConductorCore/map/MapCameraPositionBase.swift index d3f3efc..f3808ce 100644 --- a/Sources/MapConductorCore/map/MapCameraPositionBase.swift +++ b/Sources/MapConductorCore/map/MapCameraPositionBase.swift @@ -41,6 +41,11 @@ public struct VisibleRegion: Equatable, Hashable { public protocol MapCameraPositionProtocol { var position: GeoPointProtocol { get } var zoom: Double { get } + /// 地図の回転角(度、0 が北)。 + /// + /// 値を増やすと地図は**時計回り(右)**に回る。90 なら地図が右へ 90 度回り、 + /// 画面の上には西が来る。多くのネイティブ SDK の「カメラの向き(heading)」とは + /// 符号が逆なので、変換は ``CameraBearing`` を通すこと。 var bearing: Double { get } var tilt: Double { get } var paddings: MapPaddingsProtocol? { get } diff --git a/Tests/MapConductorCoreTests/WebMercatorScreenProjectionGoldenTests.swift b/Tests/MapConductorCoreTests/WebMercatorScreenProjectionGoldenTests.swift index 17e419c..a44d0b7 100644 --- a/Tests/MapConductorCoreTests/WebMercatorScreenProjectionGoldenTests.swift +++ b/Tests/MapConductorCoreTests/WebMercatorScreenProjectionGoldenTests.swift @@ -79,13 +79,20 @@ final class WebMercatorScreenProjectionGoldenTests: XCTestCase { XCTAssertEqual(ratio, 2, accuracy: 1e-9) } - func testBearing90PutsEastAtTheTop() throws { + /// bearing は「地図を時計回りに回す量」。90 なら地図が右へ 90 度回り、 + /// 画面の上には**西**が来る(東は画面の下)。 + func testBearing90PutsWestAtTheTop() throws { let c = camera(bearing: 90) + let west = try XCTUnwrap( + project(GeoPoint(latitude: c.position.latitude, longitude: c.position.longitude - 0.05), c) + ) + XCTAssertLessThan(west.y, 400) + XCTAssertEqual(west.x, 200, accuracy: 1e-6) + let east = try XCTUnwrap( project(GeoPoint(latitude: c.position.latitude, longitude: c.position.longitude + 0.05), c) ) - XCTAssertLessThan(east.y, 400) - XCTAssertEqual(east.x, 200, accuracy: 1e-6) + XCTAssertGreaterThan(east.y, 400) } func testDatelineWrapsTheShortWay() throws { From 9ed1b9de780ca2a6ccf8012398b290c449acb11f Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sat, 5 Sep 2026 08:15:05 +0900 Subject: [PATCH 02/28] Draw marker tiles on whole pixels The destination came straight out of the projection, so it landed on a fraction of a pixel almost every time, and a non-integer rectangle makes the context resample every marker. Measured on the simulator with 20k markers: 2503 ms unaligned against 545 ms aligned. Rounding moves a pin by at most half a pixel, which is not visible at icon scale. The same change measured 20x on Android and 7x in Chromium. Also stop the second query+prepare pass from firing on every tile. The fixed 32pt assumption is smaller than the real icons, so the "conservative first pass" never paid off and simply doubled the work. --- .../marker/MarkerTileRenderer.swift | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift index 4f42887..eccaf6c 100644 --- a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift +++ b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift @@ -18,6 +18,13 @@ public final class MarkerTileRenderer: TileProvider { private let cache: NSCache private var cacheVersion: Int = 0 + /// Largest icon half-extent any tile has needed so far, in points. + /// + /// Seeds the padding used to widen a tile's marker query. `renderTile` can + /// run concurrently and this is only a hint: a lost update costs one extra + /// pass on one tile, which is the very thing it exists to avoid. + private var observedHalfExtentPx: Double = 32.0 + private let defaultIcon: BitmapIcon public init( @@ -123,8 +130,11 @@ public final class MarkerTileRenderer: TileProvider { northEast: GeoPoint(latitude: nw.latitude, longitude: se.longitude) ) - // First pass: conservative 32pt padding to catch nearby icons - let assumedHalfExtentPx: Double = 32.0 + // Starts at 32pt but widens to whatever a tile has actually needed. + // Left fixed, the "conservative first pass" never pays off — real icons + // are larger than the guess — and the query and prepare passes simply + // run twice for every tile. + let assumedHalfExtentPx: Double = observedHalfExtentPx var entities = queryByHalfExtentPx(assumedHalfExtentPx, bounds: bounds, tilePx: tilePx) if entities.isEmpty && !debugTileOverlay { @@ -135,6 +145,7 @@ public final class MarkerTileRenderer: TileProvider { // Second pass: re-query if actual icons are larger than assumed if prepared.maxHalfExtentPx > assumedHalfExtentPx + 1.0 { + observedHalfExtentPx = prepared.maxHalfExtentPx entities = queryByHalfExtentPx(prepared.maxHalfExtentPx, bounds: bounds, tilePx: tilePx) prepared = prepareMarkers(entities, tileX: tileXDouble, tileY: tileYDouble, zoom: z, tilePx: tilePx) } @@ -171,11 +182,17 @@ public final class MarkerTileRenderer: TileProvider { let drawH = Double(m.drawH) let anchorX = Double(m.anchor.x) let anchorY = Double(m.anchor.y) + // Whole pixels, deliberately. The destination comes out of a + // projection, so it lands on a fraction of a pixel almost every + // time, and drawing to a non-integer rectangle makes the + // context resample every marker. The same change measured 20x + // on Android and 7x in Chromium; rounding moves a pin by at + // most half a pixel, which is not visible at icon scale. let destRect = CGRect( - x: centerX - drawW * anchorX, - y: centerY - drawH * anchorY, - width: drawW, - height: drawH + x: (centerX - drawW * anchorX).rounded(), + y: (centerY - drawH * anchorY).rounded(), + width: max(1, drawW.rounded()), + height: max(1, drawH.rounded()) ) m.bitmap.draw(in: destRect) } From 55789050b4c6284ea8a72327632606f865f565e7 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sat, 5 Sep 2026 13:20:51 +0900 Subject: [PATCH 03/28] Encode marker tiles in Rust, falling back to the platform MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Measured on the simulator, 1024px tile: 7.5 ms for UIImage.pngData() against 4.4 ms here, with the output pixel-identical (worst channel delta 0, which is what says the un-premultiplication is right — CoreGraphics hands over premultiplied pixels and PNG stores straight alpha). The scratch buffer is per-thread because renderTile runs concurrently and a tile is several megabytes of RGBA. Allocating it per call cost as much as the encoding: 7.9 ms per tile against 3.9 ms of actual work. It is cleared before each draw, since a partly transparent tile would otherwise show the previous one through its gaps. Every failure returns nil and lets pngData() take over. Worth reading before deciding to keep this: 1.7x is a far weaker result than Android's 6-20x, because Apple's PNG encoder is already good where Bitmap.compress is not. Against a whole marker tile the encoder is roughly a quarter of a sparse one and a rounding error on a dense one. --- MapConductorCore.podspec | 7 +- Package.swift | 12 ++- Sources/CTilePng/include/tile_png.h | 40 ++++++++ Sources/CTilePng/shim.c | 3 + .../marker/MarkerTileRenderer.swift | 8 +- .../marker/NativePngEncoder.swift | 94 ++++++++++++++++++ TilePng.xcframework/Info.plist | 43 ++++++++ .../ios-arm64-simulator/libtile_png_ffi.a | Bin 0 -> 2208176 bytes .../ios-arm64/libtile_png_ffi.a | Bin 0 -> 2212016 bytes 9 files changed, 204 insertions(+), 3 deletions(-) create mode 100644 Sources/CTilePng/include/tile_png.h create mode 100644 Sources/CTilePng/shim.c create mode 100644 Sources/MapConductorCore/marker/NativePngEncoder.swift create mode 100644 TilePng.xcframework/Info.plist create mode 100644 TilePng.xcframework/ios-arm64-simulator/libtile_png_ffi.a create mode 100644 TilePng.xcframework/ios-arm64/libtile_png_ffi.a diff --git a/MapConductorCore.podspec b/MapConductorCore.podspec index 50203a2..a0eac42 100644 --- a/MapConductorCore.podspec +++ b/MapConductorCore.podspec @@ -8,5 +8,10 @@ Pod::Spec.new do |s| s.source = { :git => "https://github.com/MapConductor/ios-sdk-core.git", :tag => s.version.to_s } s.platform = :ios, "15.1" s.swift_version = "5.9" - s.source_files = "Sources/MapConductorCore/**/*.swift" + s.source_files = "Sources/MapConductorCore/**/*.swift", "Sources/CTilePng/**/*.{c,h}" + s.public_header_files = "Sources/CTilePng/include/*.h" + # The Rust PNG encoder. Marker tiles are rasterised in-process and the + # platform encoder is several times slower; MarkerTileRenderer falls back to + # it if this is missing, so the pod stays usable either way. + s.vendored_frameworks = "TilePng.xcframework" end diff --git a/Package.swift b/Package.swift index c65434c..ab30fd1 100644 --- a/Package.swift +++ b/Package.swift @@ -28,8 +28,18 @@ let package = Package( targets: [ // Targets are the basic building blocks of a package, defining a module or a test suite. // Targets can depend on other targets in this package and products from dependencies. + // The Rust PNG encoder. Built and packaged by the + // mapconductor-vectortile repo (scripts/build-ios-core-png.sh) and + // copied here by its scripts/sync-sdk.sh. + // The Rust PNG encoder. The archive and its header travel separately: + // Xcode merges every linked XCFramework's Headers into one include + // directory, so two of them shipping a module.modulemap collide, which + // anything depending on both this and MvtRender would hit. + .binaryTarget(name: "TilePng", path: "TilePng.xcframework"), + .target(name: "CTilePng"), .target( - name: "MapConductorCore" + name: "MapConductorCore", + dependencies: ["CTilePng", "TilePng"] ), .testTarget( name: "MapConductorCoreTests", diff --git a/Sources/CTilePng/include/tile_png.h b/Sources/CTilePng/include/tile_png.h new file mode 100644 index 0000000..efd0580 --- /dev/null +++ b/Sources/CTilePng/include/tile_png.h @@ -0,0 +1,40 @@ +// PNG encoding for the iOS SDK core. Mirrors crates/tile-png-ffi. +// +// Travels as a source header in ios-sdk-core rather than inside the +// XCFramework: Xcode merges every linked framework's Headers into one include +// directory, and two frameworks shipping a module.modulemap collide there. +#ifndef TILE_PNG_H +#define TILE_PNG_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// Swift's C importer keeps a bare 0 but drops macros whose body starts with a +// minus, so the error codes are restated on the Swift side. Keep them in step. +#define TILE_PNG_OK 0 +#define TILE_PNG_ERR_BAD_ARGUMENT (-1) +#define TILE_PNG_ERR_ENCODE_FAILED (-2) +#define TILE_PNG_ERR_PANIC (-3) + +/// Encodes an RGBA8 buffer as PNG. Release the result with +/// tile_png_buffer_free. When `premultiplied` is non-zero the input buffer is +/// un-premultiplied in place and must not be reused. +int32_t tile_png_encode(uint8_t *rgba, + uint32_t width, + uint32_t height, + int32_t premultiplied, + uint8_t **out_ptr, + size_t *out_len); + +/// Releases a buffer returned by tile_png_encode. +void tile_png_buffer_free(uint8_t *ptr, size_t len); + +#ifdef __cplusplus +} +#endif + +#endif /* TILE_PNG_H */ diff --git a/Sources/CTilePng/shim.c b/Sources/CTilePng/shim.c new file mode 100644 index 0000000..4f34c53 --- /dev/null +++ b/Sources/CTilePng/shim.c @@ -0,0 +1,3 @@ +// SwiftPM needs a target to have at least one source file. This one exists so +// CTilePng can be a target whose only real content is its public header; the +// implementation is linked from the TilePng XCFramework. diff --git a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift index eccaf6c..979d837 100644 --- a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift +++ b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift @@ -207,7 +207,13 @@ public final class MarkerTileRenderer: TileProvider { offscreenImage.draw(at: CGPoint(x: -paddingPx, y: -paddingPx)) } - guard let pngData = finalImage.pngData() else { return nil } + // Rust first: it is several times faster than pngData() on the tiles + // this renderer produces, and encoding is what dominates a tile once + // the drawing is aligned. Nil means the native path declined, and the + // platform encoder takes over. + guard let pngData = NativePngEncoder.encode(finalImage) ?? finalImage.pngData() else { + return nil + } cacheLock.lock() if versionSnapshot == cacheVersion { diff --git a/Sources/MapConductorCore/marker/NativePngEncoder.swift b/Sources/MapConductorCore/marker/NativePngEncoder.swift new file mode 100644 index 0000000..455a381 --- /dev/null +++ b/Sources/MapConductorCore/marker/NativePngEncoder.swift @@ -0,0 +1,94 @@ +import CoreGraphics +import Foundation +import CTilePng +import UIKit + +/** + PNG encoding in Rust, for tiles the SDK rasterises itself. + + `UIImage.pngData()` is a large share of a marker tile once the drawing is + aligned. This encoder trades ratio for speed — the tiles are ephemeral + payloads for a local tile server, never a network — and produces files a few + times larger in exchange. + + Every failure path returns nil so the caller falls back to `pngData()`. A + bitmap in an unexpected layout, an allocation that fails, a panic in Rust: all + of them mean a slower tile, never a broken one. + */ +enum NativePngEncoder { + + /// Status codes from the C ABI. + /// + /// Restated because Swift's importer keeps `TILE_PNG_OK`, which is a bare + /// 0, but drops the error macros — their bodies start with a minus. + /// Mirrors `tile_png.h`. + private static let ok: Int32 = 0 + + /// Scratch pixel buffer, one per rendering thread. + /// + /// `renderTile` runs concurrently across the tile server's threads, and a + /// tile is several megabytes of RGBA — allocating that per call cost about + /// as much as the encoding it is meant to speed up (7.9 ms per tile against + /// 3.9 ms of actual work). + private static let scratchKey = "com.mapconductor.tilepng.scratch" + + private static func scratch(_ byteCount: Int) -> NSMutableData { + let dictionary = Thread.current.threadDictionary + if let existing = dictionary[scratchKey] as? NSMutableData, + existing.length >= byteCount { + return existing + } + let fresh = NSMutableData(length: byteCount)! + dictionary[scratchKey] = fresh + return fresh + } + + /// Returns PNG bytes for `image`, or nil to fall back to the platform encoder. + static func encode(_ image: UIImage) -> Data? { + guard let cgImage = image.cgImage else { return nil } + let width = cgImage.width + let height = cgImage.height + guard width > 0, height > 0 else { return nil } + + let bytesPerRow = width * 4 + let byteCount = bytesPerRow * height + let pixels = scratch(byteCount) + let base = pixels.mutableBytes + + // Drawn into a context we own rather than read out of the CGImage: + // a CGImage's backing store may be any layout CoreGraphics chose, and + // guessing at one is how a fast encoder produces wrong colours. + guard let context = CGContext( + data: base, + width: width, + height: height, + bitsPerComponent: 8, + bytesPerRow: bytesPerRow, + space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue + ) else { return nil } + // The buffer is reused, so anything the previous tile left behind has + // to go — a partly transparent tile would otherwise show the last one + // through its gaps. + context.clear(CGRect(x: 0, y: 0, width: width, height: height)) + context.draw(cgImage, in: CGRect(x: 0, y: 0, width: width, height: height)) + + var outPointer: UnsafeMutablePointer? + var outLength = 0 + let status = tile_png_encode( + base.assumingMemoryBound(to: UInt8.self), + UInt32(width), + UInt32(height), + // premultipliedLast above, and PNG stores straight alpha: without + // undoing it every partly transparent pixel darkens, which on + // marker tiles is every icon edge. + 1, + &outPointer, + &outLength + ) + + guard status == ok, let outPointer else { return nil } + defer { tile_png_buffer_free(outPointer, outLength) } + return Data(bytes: outPointer, count: outLength) + } +} diff --git a/TilePng.xcframework/Info.plist b/TilePng.xcframework/Info.plist new file mode 100644 index 0000000..4bf8942 --- /dev/null +++ b/TilePng.xcframework/Info.plist @@ -0,0 +1,43 @@ + + + + + AvailableLibraries + + + BinaryPath + libtile_png_ffi.a + LibraryIdentifier + ios-arm64-simulator + LibraryPath + libtile_png_ffi.a + SupportedArchitectures + + arm64 + + SupportedPlatform + ios + SupportedPlatformVariant + simulator + + + BinaryPath + libtile_png_ffi.a + LibraryIdentifier + ios-arm64 + LibraryPath + libtile_png_ffi.a + SupportedArchitectures + + arm64 + + SupportedPlatform + ios + + + CFBundlePackageType + XFWK + XCFrameworkFormatVersion + 1.0 + + diff --git a/TilePng.xcframework/ios-arm64-simulator/libtile_png_ffi.a b/TilePng.xcframework/ios-arm64-simulator/libtile_png_ffi.a new file mode 100644 index 0000000000000000000000000000000000000000..dd306d1e983a0809280818580853a7b2be860f16 GIT binary patch literal 2208176 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%0DPK<9pYi?< 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

5^cS|A>u0o~xb(SHd6kEST_J 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�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

wps%qi>YIfcL^q$$v!K$`l* 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

HWNH^Q1w% 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

sML>yK)t3r1flF%*u3~R~T-HyiQaP^NNf7 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%0AgxCU}TPQlszm7@Xs4<}d8P2VBo4 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 zGIt|$H!^o4b2l<~BXc)0cO!E*GIt|$H!^o4b2l<~BXc)0cO!E*GIt|$H!^o4b2l<~ zBXc)0cO!E*GIt|$H!^o4b2l<~BXc)0cO!E*GIt|$H!^o4b2l<~BXc)0cO!E*GIt|$ zH!^o4b2l<~BXc)0cO!E*GIt|$H!^o4b2l<~BXc)0cO!E*GIt|$H!^o4b2l<~BXc)0 zcO!E*GIt|$H!^o4b2l<~BXc)0cO!E*GIt|$H!^o4b2l<~BXc)0cO!E*GIt|$H!^o4 zb2l<~BXc)0cO!E*GIt|$H!^o4b2l<~BXbWj_aJi*GWQ^J4>I>4a}P52Aaf5g_aJi* zGWQ^J4>I>4a}P52Aaf5g_aJi*GWQ^J4>I>4a}P52Aaf5g_aJi*GWQ^J4>I>4a}P52 zAaf5g_aJi*GWQ^J4>I>4a}P52Aaf5g_aJi*GWQ^J4>I>4a}P52Aaf5g_aJi*GWQ^J z4>I>4a}P52Aaf5g_aJi*GWQ^J4>I>4a}P52Aaf5g_aJi*GWQ^J4>I>4a}P52Aaf5g z_aJi*GWQ^J4>I>4a}P52Aaf5g_aJi*GWQ^J4>I>4a}P52Aaf5g_aJi*GWQ^J4>I>4 za}P52Aaf5g_aJi*GWQ^JFEaNcb1yRYB6BY?_abvIGWQ~LFEaNcb1yRYB6BY?_abvI zGWQ~LFEaNcb1yRYB6BY?_abvIGWQ~LFEaNcb1yRYB6BY?_abvIGWQ~LFEaNcb1yRY zB6BY?_abvIGWQ~LFEaNcb1yRYB6BY?_abvIGWQ~LFEaNcb1yRYB6BY?_abvIGWQ~L zFEaNcb1yRYB6BY?_abvIGWQ~LFEaNcb1yRYB6BY?_abvIGWQ~LFEaNcb1yRYB6BY? z_abvIGWQ~LFEaNcb1yRYB6BY?_abvIGWQ~LFEaNcb1yRYB6BY?_abvIGWQ~LFEaNc zb1yRYB6A-y_aSp1GWQ{KA2RnLb00GIA#)!x_aSp1GWQ{KA2RnLb00GIA#)!x_aSp1 zGWQ{KA2RnLb00GIA#)!x_aSp1GWQ{KA2RnLb00GIA#)!x_aSp1GWQ{KA2RnLb00GI zA#)!x_aSp1GWQ{KA2RnLb00GIA#)!x_aSp1GWQ{KA2RnLb00GIA#)!x_aSp1GWQ{K zA2RnLb00GIA#)!x_aSp1GWQ{KA2RnLb00GIA#)!x_aSp1GWQ{KA2RnLb00GIA#)!x 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

    P<*Rr!V$;b9vYSDEji z`^W@6WbBNK>x?=V+MX9}aH6|zin>+*ctpbjiPk4BVKIX-JG zYN;MTOw;v%->nch)@vuc13w;XB4bY3*uu}UUQ62A<+ceA&WnySbYCvMxQ_4giPwPM zOA=g!-uq`%)#nHmE>6ISFBh`DsIf;6Ct~6{Gs9It>6B-kdQ(J5l1^s78I7~wU1`kT zXpd#m%oLwFr+lAL`#xjZ^DCAwxZhs3t~2U*d(?5$x(m|};p)!B*`7Iu%YQ%fNA1K@ zjJK`c(Weon-SETI%CwiQfwwwE5})9+hkTE{{T65Y`%B7Opm%14thfPu_`}rAX{)WZ zZ@umL)`3aTWeZ;JAcFK(FWZWUw@n9-;@dOP9T)7;$JJdcU-S*BU;gLPd7tXN0AkMrS{#s8(eEa{$+m!$`b*$?-*%JbU zO?C*Yhyo#m0Ims(qN0t87MDuGCMY5xDq5EWP*ycAZINmlkXl4-vC@jYwhfDxTG}FN zFZKG`V6nxeie78c+WP)ENmwjcZ}00nn&g~0v-~sj&%%8FQV=twepj3tp?+UQ=6|I$ zCEMo*op_k~LHD$L<i6R+VS8&Rg=ifTM6y8z`gIrH0sF9-zSk%oe{MG`Y9S z>aEdMZ!rgfOYI--;lrUm=7hD1$!DAV>HF$t4(>^)sfHfV{%M@mwceO*Q+?!E;kjZx<%?_hQCJU5=>YpY+nx*B$YgSad&cQ(4p#rttier^bZDB)(zi zartVgcjuD9Spng9zc=Y?v>NYbHJ%tmI5gblLtagzuiwpLIV0t_#f)})XXNlDz4Q|| zXH>CqayS!dmQ^(_i(x9g-`w6#pwxS0OqjHfPj^O_*ZGhQ?3EY4fQk83?3Xnm>YzFO zCb^*f{*eBg+{AGY+mSkG(oMZTMh=B7a5ejyY}4O7IFEOYdW&!M)?hA#De;G@DUT!k z7sPlk;0_)Y3&%;_oRBS8yGb z@0V{^P}@hn4=Fdehio&IEWQsZJBz=A$P)rx{=w2My+XkWvs~y1CIu~i`EzF!TKWAb zxQ{FS1xK`SZDwfv?m@0c&urfNsJqS#Nj@^Sg+{jiE%Ue;f-BLzoZ(B~%1FCu&amWz z_f#KI^x`c7HQMDwAa9+@M&5avMy6CIF)&Q zmw-Svj2CyQEUbhCqRTb&{g-U0jzN-Edood&72@SF7F}z4Ygz|QxkhAHvvGB$_ezRZ z=)jHr_>{~lgy6HKtc$Nk%b`)MGx>rh6#cn_QeyK^^24mFG-Q922!o)Rj!Gr>veM~) zl=O(LY+5LRa>IFL0>sGiw3azq(7_KZXvV{n9nWD-s>B8fAUnd@l-4%Y+Cc{G1n{uw z+Pa^=T;82D8%Y`+m&|{YHU6*_lC?AAF1>ZtB>l&rA)dgRmYqIm8??Ef64c@A{NC-3zQZNT%v5EJ+?-q-qWB7zk^;X7ao(+;|I3y8M=|&>N ztg0X0Ygd}TMNx9*#%?^^&Wt7a_9|MedXz(-+kEJhv2wq+SnLzTZ#glEGw}JVoZ@KP59@fJ~EqG8u-7NMn&i6)K_M>1)_27j9)O}>a9$}c>&Zh^<>V-#d5 zBgp>f^+lSH9{REDt`3hniqdj!Y-~}{D+>vJqm)lvdT~+eTMJNhzW(;i0$_>>B(0}x zPzO&U`69WJcyR+A(afd5XR=;1l8Iq!=GjKYy}2us;Jf`hlZrD+UIO*t&)?+UQ?LX@ z7r5(lhd}8hGRr_))UGy@U5`r*wOs=hpj=$~`oh=N5-93nCZxJ@?ImQFAmj5{jMkY~ z!s(8d@X9VB(-Q(pW?sqT#n#PHfF-|dlfyvDHalw;E04Hp*#KijO-xX~@*UMacb6^t z)|38z`oycSc`T9=1$;Z1FJXy?W71M+sLK`%Eia$Kk_t3&?w++v8tzAbgfw~e9$aNu zQGuOII$3?(b|ay)h>)$y>w>xMkiarQLVqYZyYwDixy)L6jlB(aNs^D%=8M-d5oK#2b`<2iImdd^(sk|6qAmTG45!%%bl{e_ku;=p0WKH-`>YP{EL~nt| z(2N2?P`Q^+^@WXUZ=MjHW^#N}FB*+}u5Ri)0tG>D%g*!6(?vE2PlKnvq1nqGPExCED+pbbR5m9c zcZh+E>QT3KBpGK@`pJl;=*d_eggm=EC7QEuwJU?dsK|0b_|4O8tubGqx;$$FijFjI z+%729uY^*j@Rvxy3TAa%zM52>R?5X zUR*NDq2*9I%8d1UeS0pXx|3=3;-%4fv)dS`n{k_ur?WSuj!4amgwZ2SzsOKpn+plb z{FRnq%TPP#{d6(rPDxa_*`DdqHb{x*Xd8A|%x)OfnB`@=_BRX zROR=+NDW32-qW({ADBh_3!#aACR6PYYrP3MCuC8zav#59kS7)H; z#ySG86fGG@VzP8e@JB`eXmmtZ7Oa|f5H^J!9aenV%Y~J2yE|3jCTkx37ThjSyKA-` z;_V9AOhtJVCj}bk9wmvAx?Np0gNa1+5a0)|yS6Wqjd=m4fP&bci!*I663A5FtW(#Z z%*7u$Z~uTmvJeY>6^`~-f$D2%;_)5_)te%%vLv!ulMWMQUPrsHt^cH}+LT%H*8 zE_DKG)p)gV?y1T?YB9sJ=Nz|iP&QG<(gd=V=|8Ml&Q#jhF$}!*F9Mw@SQ@>_we)KO zsi*RH2+-6JT4o?jF|q2Zs_=qaSIp37EV<@#XWLDk846OH3N`m$=2HVsQPGFRpQvX{ z83n5L{CyIrZCM8ERsyV^umDDFWqotr8SS>vO5Q)d@1Nf|BU#-ja?Z$Q8t07CJ1|^J zrcj;`NTBiMiN)=4jdM-H$8q<|OLmO5-j~@)Ka9|Rgz7a{cWSpF&HAKlZEG9CCLTBl(C$2Jy2im$oslRyF=KYQ%fL7;Q z3x0R~`N^E$Tn$l+WSebdqmsYe$oWa8)PX8%@I;v*6<>6gWzb}8e_{^hV>ysl=mt5E z2gKODU7$nfnl2aYmyYLeG{}L(+)+Pn+>J#(RC!ps1OAtc0kII~7Ilx*;b=q?Gpo+* z^D#$32m}j$kP;vzV>~yv>nQQ@Aix1q|M;}{d5|Ez-zF^eflasT(+)57Ar^tq2e>yA zh6n>ggA}5aFo7^p92guJ5-dsxQwWk0f`WwDOX7&oRS>*QGRj}*PtLJmum0bkotlm$ zbUFmGN+J(qhYET?ohCxTe+5Rz&60%SbN%^pkP-1+Gt&985th)4zYZ_yVFb;Dis#8? z1W6B(QI=Ntf9fj3AR|nA!o?@rBS?CXt@-x~dOYQC!f?QEY&-D9t!M5(YGm{yj<^p- zmiRE{v{KK3!<_IB?#t(q_~;ik4$c^nI0I@mAc}2}_|OlAkpX8T+Cb`?V8p>7GBFf5 z>*r75h_V;BQhGQAHxEGOLqsN?Q_IC5ju5x{?^kZ=mwb3m()uMI{(jO1Nj?~vNjx%J zKGp8el6(m2mq`nb`42d0h~&e_ggk3}^h-YcwdDPh55~zUP!A^l>EL=k$p>=z7?45u z+ZT|5qV%&*KP)}+_#V=@!-_jRlaGfJclaAu$grm+9YR8l82)P6b8_CZB_00$Q3#R_ z`rZi)78rG5R{g0ArC|bow%EY4yJ{G*foCQdMr`2kZ=HUzfoGC7oY=rK6AZ44LDuU3 zqb`P?4(i|h1h0D*mkwU%o+&n9+}14|DYri?zaxna7&k`$iPQjyJwBJz0Eri1xq+Ul zwMkWL5qF5(!0pJ*iV1Jqx3;7`B{$%)ZaBFCIN=u%4wdIEPx7r!4n9VQ6aIS#y;?D} z|LDBsHGuZ>eoJMq256tyQs06F3p7&}QJg_CK4$EGg9OM$PU;$BFUw{P*G?9xEuwa4Q-A{@I3qp6jT7#2oqGxvE z9hQAKxlLN}MxVU{)(Y;2d3D2ac797sNj(dhjvn<(mpg{HN2RgVKI1*TmsUri)X?J% zJMA#|tc{*o5P9BH;pX9oVeU@nRif;0|DKq_dzwbfoRRjGS>dUlP%B=kk= zr3mioGwV4J7;5@PkK?``$H6${{7YR{HM<-pc8P^u;-UBwidp3DRgzI$5SV6xK$@Th zj@Wx%71-|?MQFbJK^pTV4bZ8s32Ai>Q{3*UVv67|<3VavM_8@ZUU5~a<&tPf0Kn4Y z9S-%wN)<>epg{qX+W56DINNaXv(FwMf0HLH@xIB`>iMp>Lmv5pEToC0M6#q}Vjvs-j}<3*qtcr5)bFP+!*^%kdI0Vep-t9t>^dFZw6i-FFH zrQ!?&ohr`zfumM~&YROybT*HZHHveaypo!Rh$>Vpb;3z|UQ6wHB_8ui*$cip#^U=G zG4~y`0}?3Et;#*G>ULJGJH%fC1<$`EoxDQh7`AJ&aM$F)ylW~JbwN*vI%^7MLN~b` ztTg{YF9T9;Ldt;1{oy5lE4&2wZsRnYwcn5Ko1|uMHXqD+Ad%2ePwTXPN$heHa=RZB zi#r_};bOH{ihEi`P3CJPWA}aO+k5r}CCJtApOUM|TbIVJh<@a4cNJ=v`i8tnpJ1=~ z*uJT=dx~OuSc7UO`93oGw0;5vk~vFT5~Jk|NlJ^t zNkItUm)!xR#FC1Bw~xKpJgMnx>fqtdFxi$1edT~KDVmqvJ(of|-e#BJKmZnRUyBEU zA(BqbH+k;(<&Ia1Ube7D4kEG=Js+`(amrr?UIvnA{=$}~+_I?It&y{z0*$ZiqTkaL z=k6-b9U?5$9!KVL&5NEK%YdF7Nw=~6-tK&%FBQ5z+P*^lTIvFe)|oR4re3INyK4S+? z+OsdU9ZtA4-yceT3EC5j5%ofQt`w6m>!k~EdoHVzE^A^aXFC?+LLYfM^eWOZmA5)9 zQ}@8AT$@(>-WXuWZ|Woe$J%*S?q0z7ez6WiSWboZWPpWWIyr)=DQ0FB-6y9&mJc z(Ezg(I{JfQMFRv-s%A@-BI5=_`NNvV@Qhoyx95!dsNE&;{1a8o{Vju64d}UZO}1AO z$8|1Iv&FW9TXVtu!i9ZJAjL7ewO|O3!CHMHt+;pkhK)}5aZL}TwmN=HXu6ivX^b9YsK>8keDKReud7QFm`ZW!ZahXWj}zdz z1muPqY%ddX8F7nl*?XprC@=mP0Qi$sQ%AJFVe3mYxvL)mu>Jua!1{Go)fm=q0)YTY zTn&cx*r%85Rm*?qpaP1^IH{ai<>imdSb zw>M?@ez&BEU4hgEeA@Dvo@$tx)p=rs0kTCxUX8nJYxQRph@W2uI6-wXm9S6m?%5_{ zZR1$6mcwK|(TxS540XIaC%3dH&le$Y*rzFXu&5i{Z?J19Xfnj%_N4MPepPQMeUSuS zBZoHm%>$R}roWDqdADmHMK*kf?}D|p{x-k!MkCJvmI^@p<|!B1$VW*%);HI}asx%e zVX$lXej;_t8xT2!jI14vszX@e8UWjS%{N1}dn98&jxC_oKo!C%zR@P8o)!Qj>rCrj zofkQ!h=Y6@2C}mr$c{3>n4RZ@!Pz|+Hao3Ze|EhC*|`s7mp9p%UG?O_*+oi+qfTRP z%r5oUd_cjQy$@0(mN9y4@(G9~@Q<0*pW8ZfdpQRI+<&Zwm*smHnnTR4`M9IX_XtFW zmch42p#@~bim<5r5l4`E8=_!z^Bv(>#9zQl0LY2*B8HrT=R$zWhAi|72eH?0btF@t zg4DFbH>|q6Kcq<9p>=SU|A4?aGE3^aNV!d>obhRR#Jfrp5S! zdD7M7r6{+Bcky+(8t)D`Iz#YQ2%c&Y`vw_|-p}((zqISs4aXr@!3S5D@v{ORQIt1* zk$kcrMLF>-fg$i)CZ8a_X*LOg|Jo5?fWTW}m!p(RZ9ljXJ@cbJ6Xa{R_->H8!B$OZ z*MP{%o1+Nbn9pSY%#-5P{-0S9rY5ZQFw=C;HNz-)N_;q=;N>I={>^Kf4JbH{i>`4J z$8Kg={vs5jhIc6F2UwCOzHL#vRDes=ELGggQ)=n;chv4ApB;y5eUao z)k&4kVhyHlFV{%jYkT^slNYIugJ40lZ=lJ)Woz;%$qN`t8<8F0ex6ciIUYn>p&u1- z+N1zGH8hm$`aUZNV-T+-jv0Py_8zFZxo@W+XP#7 z1J6j7@hmX}-eA9ZcmemD=L3{$ z1qk_16vt?g`H?PbVIWW1oYf0K{`ozE|Bw=+l+1s<;5~@$H2?FIe7yG{Y%Ipd_+m+( zS^B3?5(UqKIE>iH)^32u<(LU2QTZ{|hG@vXowi89>`I3e1|VF7f$&gRKXr;1VK_wp zTW9GgTT}hk(sl;2DLd9@AAP0tGSYp>LDesmBEHG%k`;FZ`(dlnTR#rEji2O2P7Fs) z(ajITqQgLlECb3!*3P3A9*iYxmx>tB_<~CP*T9nor8Y@&X44 zz=tK#(Ae2*XVgwg4iK(Wnds!Df1Sq_lk95gEO}Ga^3h&1^v)3^c?2v#^>ruVa9j~! zpbmkLqXIziab#Wgn;{=N0Ij(Lsbe-eBff*b4jy7a(5 z0f--WeEzgWH|T4TtWjT1D=w$cL+uKC+U(+bQZVFa;RIA8Pe1dO|adRF%2Q%6VB(M5a&A^pgi{wrX+08V3VhQ&0^WcVR3j7u+L z4B*mW;sIUc@OZo@l}qqX2-VDdLJ`%%4_$Jc8VDDqt8(`eI9B^^c{=j8o3`oHnaAzXV zjOFUHmV}fuDfSPdwTN|hWpcyde&&RY7PDdl0w2k9^4ypU3`5@FoV#cfg z3%nW94v#kn2?1}$4vIn(z{XN&C^pd;oD`HS6ekH%1j*v$Krxs`0>{tKz?%V(HsZ~O zQ(}Y0B6-sHJoxx?!OkgwrHSH)ft~-FjUEg;rwqW(p<<(6Q&Q|mCzM985?dzHn&Qe&I$@Kk|chn5drR~*6$A(pxDUAtFuR}qCt*fWxw|Ah}zE2Z8fl8W%=*74mW@qiu#QfWXyj4%05HY z_}M)>3}*Pu1cPxlgR1f0-#Y!6;WJ4a4l{gag28n$V21x6burG)BI9fny!KfgJ!E!% zma4IFO^q8Vx51bpIZj5x49PtLX~qV!8b(yYn9*QOW03p#KfnzC6}h=m{13nkGoHc> z53Y1?|D&!k#tbbSs)of3yA7D(zx9|Q<&hpUly1^vhT6$`%rMh{8EOrfVfQpWW_bUg z9y9#)Jc$`neorMaL+KVhW~iN_#|(R2^_U?tV1@+-%rMe`8G7h3LyF~7m|=aW7YNS+ zW=Jb8Co#j`EQ}fESsE}ySxY3w43*|K81y(jYnnrtbhc1BdoY%9qJ$r{$lbHVn{6^G zkUV9)l6z>ERkoW|_FxUEc27m4yEjI@Qg^+|FRq%|M41{xQ~I+_?8sEpu57H?W##T+ zy#Q-fPoLR4?fis!^3h~%>s}95Z{Hv7 zx-Z&waBUfm4iliZ4(YMCS|YI;Gpl$Ks4=H_dp@8k&FpunJFVcQ8ovad&pyaGao6gx zODpKO4rK`4>_wFH5`RZ?8RP~Et{Wf$G|l7=%b;DNS+Qj$B(dEoHmTo_mP}T&)lb1% z#Nm3{EYD3=+(QWflD!}(*C)8W%_e<#9oJakiTRfr#m6!om+z@k#Z;$0b!dP2kWFU3 zw>-*QJ_N|j%4@<&L5poc7O2|HpZ2XbFXM5+F{V&)bFfOFB%hvt7>^KyNok*Ck>Csc z_X}++4g^r^X!uxke=$iXR(HiOK?n8-90Qsn#_PXY zDXWIncqQ|>x4UEPCzx+@OT#oo%YSeN*gLLRZnK5ZWc`>BPfjV? z06*1)=|7s$S|O_g6WIJjOuyO3=jnG_i#zrdcMO3>{%1O}w<2f7GyY|t#&v?)<=UrF zm6JO9Jv);nwn>zK{-NrpWiAuDtb|=dt3KK3S6uZMMEhgTq4v}MapiDc2m|}uD%-Zi zagU~`i+>+7Ru;_vba7wP`ZD_KCc?%aDB3|-bnT4>lX!{w8}00U?d-t~zc31FYB72G z&Yk(6Lrp)jGWDYdfz1h%QR4uj6g}M7P-bY^AgW}~SKDx;S(DBDp*cX2_;LOhsQu%J z;{gU9*I`X)W&EP6YfGlOmh2}d%W2;|&f8G8b^B)p+lfKeW<`&zyK&Yxns)_xW9IF3 zoFm^^??d0`^HlQ$+Wyq#l6^cucsyY+XB?Xhw#H#bDD`?A(+T;^Q$s$I?{-Fhi93G^ z9ly*u8d*03be&V?kYn_9`ZnVj1@wjMtNchp!AMlld0PONR%#SfrPY?>rRdv(UP_Ea z9VEdeQZ;oyAW^K+ix`PIj*+O*i$HI*{tVVeJy1j-*=PJ9A#YSaDuq5FQK_{U zm69y31|%x3^k;->S1f)xNUb!tCM0WCu2{ve>^<%dctP``*%srjy2Cl$1vq^Vpm-on zBN^rncN#KG2zO07U!gz*+Nc^`2acERf%x6z+ud+S2V;RPNYD zdE|D332;*=#KCZr+^cFcz)f0sjT|mxxJfy^9B`wF4YiXk5`^A}FC>*8d(D>tY?0vO zHucPFC2COLn#bO*pWUg! z+3}deQkU7E-Roo0KRV$c0QK43Jf=YQ^2)Qbduhm1+XN@!tyYuZpnM(H9}UlY0m;J4 zN&;-$&I2gtrdDz~!l~2y0F-N`9=$QQ%X|w(%WR7kbL9H!WqR$kc2_JS@llqK!q`w1)-Z3nvR^_=nDsD|T z2i;NSaU95~)iS$6QeDdT!+z?vzSvKlU4mQy_}B}Rikim79?Y!=~EFadr6c+TDQ>@gZ3$Lt%&Gx(6$aw_98&Xi) zYiYKeMF$)WTK=2yY65Gg%Es8DrPef?V6x>6rSF_lLkYm8zp@%iziud9Y70DNMnX5y zSXY+)BZh9y!kR64M-SaFF?17WYo&*7a1Tq8HRc$)kzZyJxG8ya3rF?8dh zudr!YOb>rP(oQ3*ZyJE18ztUPVy#6C-LRnJN$4g4pc@oIiGTUu;{Zah87sZhyzjt z7MRwoTR`>pprW};uGU_UQpbR5><1erI6MZX^`v`AG!M+Ep8)%?yz7TLLtVX}4wh9@iqf1oWa_IgPX*KLd+%R(3)zMKbN8N9%7VV+$j1&soD3GrCS z7sYACnm`Ia)Q6B0?aH$(r4Gu>QQNRW_u;(HtqV@-qzp|uc>8xDs}929=S5WeZD za4^e)K%*UIoHK-%Jr(|qAs+yjhm`xH zA^h#9!XZoa5*PXb!l93T29;D4KX>|ns-QX4G&er@ex4KW;S@aoa#{@5rLSG-pPrVI zoRhXP*?)Bo*i-h;6zGrP^=d=UL)8ed8klrk2F6eU`3V7A&2YpOpF?`{B3*3^xWO1o zLvltEP(X$y=A>`%2W!;WBU*fNYJ4X6f?JgVu55DF4|*>a4SE2p)#MX6Y+3D(jgk*~ zGDOtB3K9y1{(=6XemHYKy>~f3sDDCwGCx?DoD?WZNlXeBD^e1{qf}U8Vq#KgBDnlX z76yeR3X_vlLO^#`k-btZ@&o5m>B)X+t5ydJ{Ndjp+@_7>A`X0Y{I^W=mwO(o6#wPK z7#}8^^^bh>|I0W}QK9D?eV~zb;)mg#!7)I=c_{bjAN$#7@S`!Vk%90;@Fy3xRRb5y zB*R~L4u(trJxmnZ2=C#K8+^r7>whO$PF8CMJ)A2M&{_^3M0nZZn zg?Y=2LaCY>hu&o%PpOkAC_cFKPG*e?eCwE#@sgeBiQ&4_KHS@rvGJcxB*p z<1_AF;|IrxkIw<0M~1lMb8J*x?7*|}uFb$#c;w(>qx1AWMS!uC#yI#lJ|3*kuO7%S zK7MF^#(a#Vw;3xrIFmv5@!%r^Jd-NY1I1+M)A_X<=;9mFv_pQF*NqoB(2Ni88;_SQ z(&?!_@ag<|4f%x{()2=pxCwKizJv2MyoUV1o_OM_q+~-td_49UYJ3ZBmN@!*wV_D_ zu-O|fA7ct=zm-YpX&EEsr`@cNX&lO0l`-Y;zqmhEW-1bM;@4!XOUp3Plgw=G=)#Ag?5pJ6wP7TpgCV5<=ne&fiqdA5boCM;7UPRX2cE$ zABx(c4#x{eb9kfBoI4PQXND~6+}a)9Bv95d3$?>ei=7VB3HA)%Nyw@#%X!{m`1lc4 zLN;N(LQbIA+f??LTU*UlOqJOj0tnKTtScVjVCO#XAq?hEP9cH>w1*+1qH?WSd0QGVPwr!?wq@Y z;I2qRC^nU_g<~>g?F!GI(NHW4p55VjIbk|89?F%#=|Vi)D!c2qC$Tdp@#d|7x~*WN zIWycocVH1FGsi+ZtRPr3xpXuK{tUE?acgs!1vI}2X>S3|D6;wp9eYaSktm&rId2E7hGKMH}@Oh=k0TH8JwAA>oF|AT) zmuP4+7UT^>OYKHTHo3YfI;7x1T(*#bHIi zJqd<|QE$h)gjp%jeD?`q_UL;Sirop% zTMW;M@C>|i^Am#m$TYCDLJ(L|kser7F*C5ZBK2YB1@lLl7cxGQ>}Ii%i1)E%_bL-4 z`ts+tJu?XQIrf7u_SD_obit39^&Z*hR1`afpky_1QS2S)`#bi?(!%|#3O=;y6Jo=? zE~{M?l;5QnB%a!eciq0KxI>`Y0Lz^f0m!`e34!k3fp+G3e^zmqI>uM?aLWY?{`m?4 zg;xvwQZWV6AGT0e{A9JgLO__;rV-NJWl;9#P&S9tcalTl9yvmoRB$Ph-7D$m_GJ7f zy>OJ^)@~tU?#&>|Dpn9XDliYVJ=r-Ix9uzw;G;0vdrv&5hjr%KN&A3To={mgZ$G)y z@f~6Ms0!NtFfr%7p3&&Aj;fusi+pc#^E+s#1alNy1n+Ko5QlY4?W7WTS7f2R%pwSj z^YHr})WyfL$id8M4SLs=l2Gs~^5;!Ws}8BpeJ=#M+palSLWzN%OO;mZk5?GcNT3Kqeg zd4p89uQ z%!0AG;s7fkQRYeuo zJ!pq@R@zC{(68@=$vVskv)XqE^nNPAItTOJxiN&ag9Z7y0(}Y?&ny_nh|o@gUu)w% z>`$zBK-vsQy91&3@tB2ix(knGGr|;y)x-Q<>)-w4{YQo|oes~pet&|?DS>iIdPY+Y z>rAwh?!kLD9@p?03u8JOK3qy~$4Y`*%7u?V^s5=A_ueOj*-fR}>__g<-rV2sbZjBG zH}!MltoL9p!E+<|%z`oV5rm0;gw0sj-kvN!l#IXNHUG(+Yg;Ex_Q zs>gE%tS=R?zEosB%(=jYPsSIL-KOw?_2sg~C1kOaP|odvK0ohvz5=f+{uCI41i7wU zw)h%Z+#z@~>);*qb5e~dF2Zj*X( zQwSofEcnd|%+p68{&J%4WC>wXT1rTEub|JUjVGdE{Fjnr-}Rwu)=J3BXH3j{&QSm5 zP&W;<)y&`4T^Rf1$@?>b?iFt2ngDbTT@zqEz;u%QIMeHMm`}L1hIOE#e;oi`zuhb)W*)feHleiu+$j)&Jr?=0h0fBg9pZ?cKl5uZMLWK3rbiT3-U0g9!O+KxEE4+r*ul`p z%18`;Omu*V#6v!{Hr#keOVHq1ptt_#8Ax*|R# zzBya^z z(oZ=@Z4zG16IzF|>}GO= zbBm(ulH4M;715?S3Bx_JT3HsJV5DS;F@? zCE3QcZ)SdOV?Vd7%#&#^Oc)o|s#qGOx#*=nZN`P)Y4%Sz{SZcc54 z-IXrq%Mzy>ZqA)5mkw~PN$_=2mv5y`=PFHqAiZLKO+Z3{W6)c>5(CSE6nl?O^8@V|+1m4_yG3fyqCDd=rfO@-}~ zE7;IwN?d6lAVV}wU01X+-44m9tXk* zM3dk!8uCFAwQ3!eij)wO4?#W@kP2{{AKyz*kOX4lS;d+_9Ie`SiZ`7FNy$kChbrA{ zN=2qT@{e73h70HBl;*<6=W&J$7n*W4Qi5O>FkBkMJ={~hOG*9}tPhhAc5}DR2qFlH zF%nWz1l8F#g%paiKM2v~(PzfaqSG)Hh6@w+l7k70oLcl@)~MK&5>*@mrd1^n0{bf@ zbSbyCw}?@fvAw6ArA5r3&!JtDQMSq$w5ep8$!PhGZQxNhViNe3ZObjo$z;9^!z8*e zGn2U?lM2pkGx>$~Z5C#?)Mi}*^9+Ic_q}GlGP59Fi}SZ`;L_H)N#T+rD4qabYTF~i z>Zub?=T9u4PH5}3UMpw5oXQMIg;B-~Q5FIpV(+*<%(Z=V$abBwFrHPIWmlM8Ubwzo zHSRX}t<{GpDBfqaG@Q7|vIiFK7zE*=H+=#Gp@*AA=f(zRsaA(^b z0EIrzn{bgjp{|+xX)YSCU!?mD1yi4vNIg0Y2iAcNADlF zT(#tTp4ly}*)^HjzXcwR9a5L>F5Av7=Wl_4X!{9u`IGAN9SfR6!Rv2Z^TdWmZ~_c< zoY)p!4<3ersw`;0xI+7Xoi)29H~&covRKS+~rr zPvCL&mfqEHm+dV#?9jLcW?<~r*foWJV8UtedrSo@(Kw&0bjEXg zqf?4!qQI;R_pdo*a!nB7malhl9Iq+dsD!k~_YxD!nkVjU4sDMZ5A4(iEyj&@vk6zY z0I6R#I?q*Er^GB1nBC!<-_bGdfS+WXmDx2N;|Fk?+zypJD9Hztys-M%&vj^Mo&bDU z9TD0FZAcAM=TB^-PK3tX+svJ6dKOq0II7ZVv&!Wj0sVOPI0HBk@`1hxvJ~4D!fd&r z2D@}#U*1?R4XvY2INcojm@?^f^LX&X+?INU?|c~+AUEf;(14AmxcBk6UeAZU2i)u) zu&C7f8D9minx;;jY6T#-`ff`rD=d6lnY*thJb?Mxc~OT$Ym1|fa8*iUxwPyusvYmM zMle{*JxgaqxUnKam8x*-VrQjFUPjn)XXObp`3$*Is}iuLcc`S5K4n$igdLJikKo57 zuT4&0vyOz!$Rkd_%vFH#C1*#jQ)H*`7XVn7wkjhsIbqE*{`8ELRmKpE$RzUD>Rfp*o=nqQt=9V88=HL&AbYAt?!=34wv&7B^53 zq)-F}8=IoPu4H0Jo46|5;6qoi$>7BKKc!=(A}2M#-{0^bQm+ia?Mw!*UXz)*Dmy1& zus>%YH%TZ6Oi2=j2*sjAu_7>3kRk>jjp9&Iq9|C9k{F27;*8?)jUkW0SqzY9aB2K2@VnjhlPZMC5VHCfx%$|k+DB#sM@ORez&6kDRB@VH)5h7 zIWa{LloS#g7@888AWR7sg$0R43Md$OCM-D%N&%_my=paNB}hz6 zNJ&Tzfkp*##Uf#-AUP~BNdyRcV1ihT&EXF55c-rdTj-{B*#NeuWh{%w?q#u}@apGP zQd*NREPX@BQ-mdjh{efa0+Bd4MHCvCm>iUtl9&)A5QT+`!$O4yl|fSHc-CsHPC1Nz z4_S#p&VGT?jAT$NO*i3<*zv#ugLEhiQCbeJGn5h6}jh(i_PB$()e z5|afWa}b&soCJLmO2&gxYw(SU-Q+4r2i9b#8}3P`-s!7WuU@YwJ`l_r50v`6JZk8^ zz+jOuF$^;SXljcSLxRN#AwXSdaHt|BB~cIt>(SI)_<~E2rxtmzii7gh6FpdLQJy*y zoxAvznvwZ4(^L({O^gM+9|E+-6_iF+sD2vvq76&yH#XkdszI z*YF#Ko#0tbPF0$GA*ZTMzT|3S3eYWz07Ac#(D`nSqE4iv1b3px;qax*hp&R>U>PBg zR-1~^M;iF*t}~5A&X&3Prjme-`KH=1Wut^HVMNOq5E5Dr4;n^v9fNA4bmTWWav>FB z!kYg2f zl*+DwaL~Yil_Pw^eS^vc{`cT$_@)6?Yi}P9vG^b2*FFe&Z~O;B+n^8XPMn%k@}hEU zoOQ72bg0 zU2|?B?D#hLFtg(__cw>u6BDZQC+%&ftbh%;)0Hl#D}1MJ1^(_K|9Wn(bZXUa^c0PR z`F+?N!CpyeW>TczaM8aCh3!=*Y@(ZCyEg%Lm$3J5rA`><)1-3lfZP;~k!IIm{|I|M zxp^0S!`>W@M%3m%@y+gN@o@?|4}V(Wzmu446RYzl?1xP_b&@83B5cUj&3GS#Z7?*z zp|A(*EPout#b*e6ODZKLZ*!)i)a_{RG`2PWv1HEPClU76e7S_)WPb6{BSzO za&MH|MF~OS?4=%eup=~rsi^5Y7UZC}v%mm$CG9MHOt?ON8~#S}f$h>!)p*aB)qN^g zpY`ga5mn5US~Iq*&qienF`-wrn|W@0AJ|sN-_86{Q=Ye*d8=-J({7AZ!g!qs3(|jV zy&lp9!6zaJ5@S;W17mp5WDD|l2!>nXj8sDhh~uAE&ELRR z0}A+mKW7b;rLUXNs5CsX2luD=Vu*uteI|iHMw0=;&_C^0vW12-ouM~QF>5vUtvy^5 z!%iqCa2V48`f-TUEDuh}T^ReKAU!ia5Oj+5OL_m6eguKcXOF}I1LFDt@K>5C!|)e` zu;0pw=uf?@53ql_-s-)frG-ZG<-#DcrT>rkKV3iC`uRU6NSs? z=OC4N{q8kxwVs3ikLsnL5QC;?kCVet;FTNmewNY51FJ{?rIJu)QeQI8S9{ zK4(vjWcl8ZBmA{yFqD)&@}f3mR)2({L)j{XL0Kpzx1fpwmAf9&rFbx zT1$XZC$ib$dRFS6E5)Y7cfHsNdr7!J7x$$rloxYsRiNMiCIbR8D#u+}o{~+_0yh{m> zC;g<(vCmiAF|)7Ivnk*wbt!fa2v^U-z8eyIFw~lFU#@E(SWlyF!H;7an07Mm6Z{}q-XWz zSMvO@^y6ADlAo^2<8caWEsehv}g?1=BTqm7To_~yaT25-I53~aj0qr1i zD7a5Yl7mDPJb*fE>(mU?zScn8_pz7dUT39Axl(Miy}x@tH01+vnt!1xXz2~+c6v&y zXE@cUjeO6(a?D!(vrA4-bx$x_)R$l{qte;Mp-^Dd;pgLb9Cg|SN znly|XTvITEtSrpMdd)hO**%@JZmy0_nnCWT2iPUIFYk0D=$-%I=7R1A?5|^xj-GSD zZ<${}m~IyYo?cQuZ3AlmA+yl|^OPnyqtU5kGPCRfX!Fc>K2*gFP?$Bi^itlz<_Y?H zdy|>%PXsPIHrYHO!KtIrwu3o%@GY=t_|$KI#QC3O*mUeqW;XZ8*dtL2R&|f;Z;Yvq z_^vnnyCIdFc(IjFhOi(eubR5 zWK=Hk8di($ALH{co%hX=TV0o1od$*4K{Z-wF75;V3pwBJ`UH=_%vUC9i?gC#my*^U z`qO_<$a)OD^Kud3zcA{~`)*c4X6C2m=7TeP$=m@lgTZj``%yP4(>C__SRm!u!X1{R zi{W?OITI|*#b-^#46xE+9H{O7y8uT;epXyehp-Vp{A51bNR%H%l25~xyB|}hgC?oH zp?oEz*Kfu@h zgByDKm?d-aF0+hAlMHNdq@SqKS$ROmZ=+1bc^gHhi7P159k{dhS6E*d{B-u64s3T+tYprs+r zr&UA@LW{ zd%4dGK1Dz2Gu~eW>d~6-uU3K}GN|?+Rp-T(H6OU!bO5W-8|R6fCD!$j^z$g`>pMe7xS*F!Nm$ka*gN7%?@i?Ib-;VRS zo=FGAC{rN=K_+lbS?;L3^flG-Uk#?nC7ZU!)b24XW-l$P1G}AaY6$qY?fkGrRgm7p zK>l1`1m=#Bu#{SNd4oLB@gIcNB;T`Ut-h3B8%ns`RreW4C^NkOn9%lY3+&C;d_WY$ z!)cJfPJvp@&9S=o_LYwrsN-`(#2Sirv32EbA|GO%7O?Ubak$Wqy)Arh-eo2aH))I3 z2W$&F#3{ej+@R5O%b2(|1z?i3$x(})39BZaqbfZ);jD`d)(!w?BT2Yx>Venx{hMcw zWH#U_RvR2_%UMK4a>*HYK{_uM@nPX*#Coz4nNm7}I!l&Up#|}hR9LcqoCt1D!5Z%z zu*NGorEHX5Vsmd_d5Tu%u}G z!7#7#<=Oyi+-1s=sLVdiVWeFSdO$VNylK`I98?a6XW{u%u*K)x^N?bE9TlvDH#^=T zl-$SKqYW;d+G!h+(kT{OM7Sq)MH*zYwt!HY%_jrqK!5}XsNFqj%a?FW9~}2ZN98KX zwbx63g^9VlT50o7s$*ZfIa*4iuW{ksqaumfDanG(=1C9or=Z-q*0CGptuTWV&Yyc! z(yJ%hpmKN$nKR=jW&zCa(I+JZxMeG+NWjvAwOS{C~i-Hzeg3WU`htXh@x`5<3ABwWncamo}$f$(7)QH7<+FdT7&QyU||F?YXOb84LEeqkxR&mzqPd~nwt*rFkiW66C;AZ0}+*=Ph9 ztcY;JX0prLSYYoO%s!i>x3kb;?p1=ee3qz{g_I|1V{qwUfg-A+sN@uQtc97JI^Ocd z@}hG#?|@_{11Y(kjYr3;@QW8d&x2lzIjcGf#)xiB+m3n#V{5z{@hdQk>`rUcu-RU= zwX(Y5BD z3Km>^IhAh_L?HXe8nA&8Nu7lxF-ou#Y|RBD4Rmn_4ZK9Z=|ggZO=(@$LOKF=0Tugj zcSpMnGpvDvIkG{8R7K&@hQ=JR3{pGGVs+M?WXlh@G zEYh;k7(21%+l90Cx58~tKGvMK8oipLo%le?ty!zm!G!(QP2A#GeHWTmwfB{jdomYxBNq9)N|@}Z#9WTLTPcRc;2 zGm>yISk16yTneC_h3&FrK3_?s@-`@1=}q3HulsDZ>tvqsE_6<{LA|gi9u@lu&knZF z)#ksFm2wB$8itwg78_>1TGvRJV6h@Q-s&%=Nyd?j4SeBqZg|yy&g}_dd(Tag(=?Bt zFlS8ENH{W0-xH>9ew=9;;yDrJ;mF{xw(rTCVr_JyOoF$Ic&OnH@o+mKQ(e)jl@s|QJDmja=2#xwIK z!c}t=WXF6m<&t{hs@Z2Qo?CjEGhBRbs(Tt8wcz`fnYl3ZFCUtVupaO;PR)g(aBQ9u7$^u72MNT2loX*LG%P77Ob{XjgT#qJ z!67M$Avh0wEH-P{13R*a2=d!_a&9=xF#O@IHzNDrob(JmL???PPr!%TDK?a9JVE%= z0}oKo9_bW4)JVE$#8Zg=<5HZ>AFTW8PZ39UgF0}IK3sCcIeJ*X`^=O-HDJ1`|J-WG zIXa*ohN=js{a+p=8j9;bNHnoEu0E5%AfugT;h(yB)VI^n<8*RJlIN%+9HXy#>X7aKsjd1& z7xd-*l_oMCrHcf{CKBh4*wRK;>K_4yqjW=c|Jo2X9&6*{&k>t<$g#G8GmHngdWW(9 z&8#;Fx5C{Y96!?e_Wx4%E^tv*>;M1SGsDclz%bk|av8u2puo&fonvG+m=&US$UH`6HC$3MGBoQ;9>1N@v`8(nJRR$6`unWCXAlUq z(>eWLum9*Uv)5ktwf5S3-p{k1Cp5~u=0!Zvr1`ydVi4c{gKGP0zHMF_!tXnt9N*?9 z{r&iMbbrgU9!U1@wR{lY{)1XRXdd#_D*}a-$ z_ePH0GfP=^Uut6aD>!!l8OQFMId-4Tv3n!O?u{I~XO^+-zSP9-3x=|L3G51i-TQ;F zfKhdE>>k#{!0zWcKTgS^*y+__*}aZq_uD}wUf-hT*nJO+)O`XqeIu~@TO7M@W!ZgY zV-=G)Ji9LiJpi7Y=f>YYEW4-A`S7F|xLiFvyQiGtfcTDy-D96V*!@@#8lbjUOzeIi z%kGm*>^_}k_smKYyGMGkdrDjmG`+a6+b}%42WkM(zCFWzcft$JVD|@yuzP9J4F1kx z**&d4oD_cENZI{~{mr@&*gd5vVE6R*%8N_|4nXj_HnZ%Ws~msPIqmT59+d;TZ{yfK zSJTFk*gbI?f!#mNv3tvH4`TP_Cmz7=b!K+|wUTA`__?nBaMnz0{-NytLIcb0cUQ9P z{xr+(4JLMP{V$f?zcMnr|Bj{ci$`Mj$4u;Ai68%9_dnd1-NX6r#`C3<9b;_8|6(I1 zRKOvn$E_Hn1?y?EUmQ{I<@z0dST9=FXyw@@7)GLj`MVg{K2h|X(c-y*csl!u<~P9@ z;8gKWA4t@q$^+M0=hVjk+!x2%kv22kBQXi*0i6FH-?5Rs7#82)?@kmwVYGN+U}n7~ z-7Uy$$yBZP8%efvzKj=DW6C^KSSO}Xy~t@^cXd&-^08*+K&ZaHy8Qoe-9MX3lm6Lq zGd}kqI#) z+2$c0=}tdw#1H8pXJ;H>iFopobBFIYhdbrK_rW#RDpsPgZ@yLPcIiv)l9xcW?gwr24UMG&@h_a6QNF(c`BasFX~)G*`yl;c0@C!OR`4&7_Y%e%CUp z?Jtfxn%bz*_F=JpSPTYb2$L!GrEq2Cz8BD1m}Pk-P<|Uky;u0M9cY?=H#lQQcAXH| zSpkT@H*7YaIPTT~-6x&a1ieyqT8%}yE)|4sY7TA^{z-gK_{{o}TGlOo&7J63%eu23 z!vc0DkKgu$e+VG@6Sx-DTA$?3 z!>^d)EsgapdE;tw16>wujf#KIi2>GP=Zf~`B`)H$Cer6Twebl9?bs0OQvIKKv^A5J z;xhe@Ob5PND;2deL0OfPd}8CoSUayvi~(2|7Ek9JVCxo6-TZBTAo3eJnDY&;*!)AH zEvb`P!Ca~^<~U#LWDtXU%EwcP{$vm1c;u@zk&Zlofd9WJ=V zyv3hPEiS*qc#}@OZP%8ox;Yyl&F%H6fKNuH_dl^UF;Rng+N?=-aj#h8omA$p9hkhsB`XwW!l;&uZhURTS{lzQjw`bÇM_cy_ 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%0D;H!ck?gQ50w1x0FOJfs)YZ+cOBF$mO# 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

    ?x13^+I1`uz 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 z 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 Pni9ufJG<9EFU$WAOL-IX literal 0 HcmV?d00001 From 451c696202f057715c3d5dcade00e81607a1ef0d Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sat, 5 Sep 2026 13:52:36 +0900 Subject: [PATCH 04/28] Make the tile PNG encoder public, as TilePngEncoder Renamed from NativePngEncoder and moved next to the tile server. The vector tile module's Metal path needs it, and the alternative was a second compiled copy of the same encoder in every app. The pointer overload exists for that path: Metal hands back raw RGBA with no UIImage to wrap it in, and it is straight alpha rather than premultiplied, which the caller now says explicitly instead of the encoder assuming. --- .../marker/MarkerTileRenderer.swift | 2 +- .../marker/NativePngEncoder.swift | 94 --------------- .../tileserver/TilePngEncoder.swift | 113 ++++++++++++++++++ 3 files changed, 114 insertions(+), 95 deletions(-) delete mode 100644 Sources/MapConductorCore/marker/NativePngEncoder.swift create mode 100644 Sources/MapConductorCore/tileserver/TilePngEncoder.swift diff --git a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift index 979d837..1c6f50c 100644 --- a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift +++ b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift @@ -211,7 +211,7 @@ public final class MarkerTileRenderer: TileProvider { // this renderer produces, and encoding is what dominates a tile once // the drawing is aligned. Nil means the native path declined, and the // platform encoder takes over. - guard let pngData = NativePngEncoder.encode(finalImage) ?? finalImage.pngData() else { + guard let pngData = TilePngEncoder.encode(finalImage) ?? finalImage.pngData() else { return nil } diff --git a/Sources/MapConductorCore/marker/NativePngEncoder.swift b/Sources/MapConductorCore/marker/NativePngEncoder.swift deleted file mode 100644 index 455a381..0000000 --- a/Sources/MapConductorCore/marker/NativePngEncoder.swift +++ /dev/null @@ -1,94 +0,0 @@ -import CoreGraphics -import Foundation -import CTilePng -import UIKit - -/** - PNG encoding in Rust, for tiles the SDK rasterises itself. - - `UIImage.pngData()` is a large share of a marker tile once the drawing is - aligned. This encoder trades ratio for speed — the tiles are ephemeral - payloads for a local tile server, never a network — and produces files a few - times larger in exchange. - - Every failure path returns nil so the caller falls back to `pngData()`. A - bitmap in an unexpected layout, an allocation that fails, a panic in Rust: all - of them mean a slower tile, never a broken one. - */ -enum NativePngEncoder { - - /// Status codes from the C ABI. - /// - /// Restated because Swift's importer keeps `TILE_PNG_OK`, which is a bare - /// 0, but drops the error macros — their bodies start with a minus. - /// Mirrors `tile_png.h`. - private static let ok: Int32 = 0 - - /// Scratch pixel buffer, one per rendering thread. - /// - /// `renderTile` runs concurrently across the tile server's threads, and a - /// tile is several megabytes of RGBA — allocating that per call cost about - /// as much as the encoding it is meant to speed up (7.9 ms per tile against - /// 3.9 ms of actual work). - private static let scratchKey = "com.mapconductor.tilepng.scratch" - - private static func scratch(_ byteCount: Int) -> NSMutableData { - let dictionary = Thread.current.threadDictionary - if let existing = dictionary[scratchKey] as? NSMutableData, - existing.length >= byteCount { - return existing - } - let fresh = NSMutableData(length: byteCount)! - dictionary[scratchKey] = fresh - return fresh - } - - /// Returns PNG bytes for `image`, or nil to fall back to the platform encoder. - static func encode(_ image: UIImage) -> Data? { - guard let cgImage = image.cgImage else { return nil } - let width = cgImage.width - let height = cgImage.height - guard width > 0, height > 0 else { return nil } - - let bytesPerRow = width * 4 - let byteCount = bytesPerRow * height - let pixels = scratch(byteCount) - let base = pixels.mutableBytes - - // Drawn into a context we own rather than read out of the CGImage: - // a CGImage's backing store may be any layout CoreGraphics chose, and - // guessing at one is how a fast encoder produces wrong colours. - guard let context = CGContext( - data: base, - width: width, - height: height, - bitsPerComponent: 8, - bytesPerRow: bytesPerRow, - space: CGColorSpaceCreateDeviceRGB(), - bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue - ) else { return nil } - // The buffer is reused, so anything the previous tile left behind has - // to go — a partly transparent tile would otherwise show the last one - // through its gaps. - context.clear(CGRect(x: 0, y: 0, width: width, height: height)) - context.draw(cgImage, in: CGRect(x: 0, y: 0, width: width, height: height)) - - var outPointer: UnsafeMutablePointer? - var outLength = 0 - let status = tile_png_encode( - base.assumingMemoryBound(to: UInt8.self), - UInt32(width), - UInt32(height), - // premultipliedLast above, and PNG stores straight alpha: without - // undoing it every partly transparent pixel darkens, which on - // marker tiles is every icon edge. - 1, - &outPointer, - &outLength - ) - - guard status == ok, let outPointer else { return nil } - defer { tile_png_buffer_free(outPointer, outLength) } - return Data(bytes: outPointer, count: outLength) - } -} diff --git a/Sources/MapConductorCore/tileserver/TilePngEncoder.swift b/Sources/MapConductorCore/tileserver/TilePngEncoder.swift new file mode 100644 index 0000000..f627599 --- /dev/null +++ b/Sources/MapConductorCore/tileserver/TilePngEncoder.swift @@ -0,0 +1,113 @@ +import CoreGraphics +import CTilePng +import Foundation +import UIKit + +/** + PNG encoding in Rust, for tiles the SDK rasterises itself. + + Lives in the core so an app carries one copy of the encoder rather than one per + module that draws tiles. The tiles are ephemeral payloads for a local tile + server, so it trades ratio for speed and produces files a few times larger — + which never reach a network, though they do take proportionally more room in a + tile cache. + + How much it wins depends entirely on the platform encoder it replaces. On an + iPad Pro it is 2.3-2.6x faster than `pngData()`; on a Pixel 5a the same code is + 6-20x faster than `Bitmap.compress`, because Apple's encoder is good and + Android's is not. + + Every failure path returns nil rather than throwing, so every caller is + expected to have a platform fallback: a failed optimisation should cost a slow + tile, never a broken one. + */ +public enum TilePngEncoder { + + private static let ok: Int32 = 0 + + /// Scratch pixel buffer, one per calling thread. + /// + /// Tile rendering runs concurrently, and a tile is several megabytes of + /// RGBA. Allocating that per call cost as much as the encoding itself: + /// 7.9 ms per tile against 3.9 ms of actual work. + private static let scratchKey = "com.mapconductor.tilepng.scratch" + + private static func scratch(_ byteCount: Int) -> NSMutableData { + let dictionary = Thread.current.threadDictionary + if let existing = dictionary[scratchKey] as? NSMutableData, + existing.length >= byteCount { + return existing + } + let fresh = NSMutableData(length: byteCount)! + dictionary[scratchKey] = fresh + return fresh + } + + /// Encodes an image. Returns nil if the native path declined it, in which + /// case use `UIImage.pngData()`. + public static func encode(_ image: UIImage) -> Data? { + guard let cgImage = image.cgImage else { return nil } + let width = cgImage.width + let height = cgImage.height + guard width > 0, height > 0 else { return nil } + + let bytesPerRow = width * 4 + let pixels = scratch(bytesPerRow * height) + let base = pixels.mutableBytes + + // Drawn into a context we own rather than read out of the CGImage: a + // CGImage's backing store may be any layout CoreGraphics chose, and + // guessing at one is how a fast encoder produces wrong colours. + guard let context = CGContext( + data: base, + width: width, + height: height, + bitsPerComponent: 8, + bytesPerRow: bytesPerRow, + space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue + ) else { return nil } + // The buffer is reused, so anything the previous tile left behind has + // to go — a partly transparent tile would otherwise show the last one + // through its gaps. + context.clear(CGRect(x: 0, y: 0, width: width, height: height)) + context.draw(cgImage, in: CGRect(x: 0, y: 0, width: width, height: height)) + + return encode(rgba: base, width: width, height: height, premultiplied: true) + } + + /** + Encodes RGBA8 pixels in place. + + Set `premultiplied` when the colour channels are scaled by alpha — a + CoreGraphics context's are, a Metal readback's usually are not. PNG stores + straight alpha, so encoding premultiplied pixels unchanged darkens every + partly transparent one. The buffer is un-premultiplied in place when this + is set, so its contents are not reusable afterwards. + + - Parameter rgba: `width * height * 4` writable bytes, rows top-down. + */ + public static func encode( + rgba: UnsafeMutableRawPointer, + width: Int, + height: Int, + premultiplied: Bool + ) -> Data? { + guard width > 0, height > 0 else { return nil } + + var outPointer: UnsafeMutablePointer? + var outLength = 0 + let status = tile_png_encode( + rgba.assumingMemoryBound(to: UInt8.self), + UInt32(width), + UInt32(height), + premultiplied ? 1 : 0, + &outPointer, + &outLength + ) + + guard status == ok, let outPointer else { return nil } + defer { tile_png_buffer_free(outPointer, outLength) } + return Data(bytes: outPointer, count: outLength) + } +} From 7316b25e046f415c0edac9bdba18aa5b198aef58 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sat, 5 Sep 2026 14:04:53 +0900 Subject: [PATCH 05/28] Draw marker tiles into a bitmap context we own MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UIGraphicsImageRenderer records the drawing and replays it when the image is materialised, so its cost scales with the number of draw calls rather than the size of the canvas. The renderer's own profile said so plainly once the block outside the loop was timed too: the draw loop reported 81 ms while the block containing it took 1739 ms, for a fixed 612px buffer. Measured head to head on an iPad Pro, 20k blits into that buffer: 539 ms through the image renderer against 59 ms into a plain bitmap context. Owning the buffer removes two more things. The crop pass is gone — markers draw straight into a tile-sized canvas translated by the padding, so what overhangs the edge is clipped where it used to be composited and then cut away. And the encoder no longer needs its extraction copy, since the pixels are already in a buffer laid out the way it wants. Per tile on an iPad Pro, before -> after: z12 2000 markers 14.6 ms -> 6.2 ms z6 2000 markers 186.4 ms -> 33.0 ms z12 20000 markers 88.2 ms -> 18.8 ms z6 20000 markers 1944.0 ms -> 414.3 ms Two vertical flips have to cancel here: Core Graphics puts the origin at the bottom left and draws images bottom-up, while tile coordinates run top-down. MarkerTilePlacementTests pins both halves — position alone would pass with the icons upside down, so it also counts which side of the anchor is painted. --- .../marker/MarkerTileRenderer.swift | 138 ++++++++++-------- 1 file changed, 81 insertions(+), 57 deletions(-) diff --git a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift index 1c6f50c..020f6da 100644 --- a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift +++ b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift @@ -151,67 +151,91 @@ public final class MarkerTileRenderer: TileProvider { } let paddingPx = max(Int(ceil(prepared.maxHalfExtentPx + 2.0)), 2) - let offscreenSize = tileSize + paddingPx * 2 - let format = UIGraphicsImageRendererFormat() - format.scale = 1.0 - format.opaque = false - - // Draw all markers into an offscreen canvas (tile + padding) - let offscreenRenderer = UIGraphicsImageRenderer( - size: CGSize(width: offscreenSize, height: offscreenSize), - format: format - ) - let offscreenImage = offscreenRenderer.image { ctx in - if debugTileOverlay { - let o = CGFloat(paddingPx) - let cgCtx = ctx.cgContext - cgCtx.setStrokeColor(UIColor.red.cgColor) - cgCtx.setLineWidth(1.0) - cgCtx.move(to: CGPoint(x: o, y: o)) - cgCtx.addLine(to: CGPoint(x: o + CGFloat(tileSize), y: o)) - cgCtx.strokePath() - cgCtx.move(to: CGPoint(x: o, y: o)) - cgCtx.addLine(to: CGPoint(x: o, y: o + CGFloat(tileSize))) - cgCtx.strokePath() - } - - for m in prepared.markers { - let centerX = m.centerNormX * tilePx + Double(paddingPx) - let centerY = m.centerNormY * tilePx + Double(paddingPx) - let drawW = Double(m.drawW) - let drawH = Double(m.drawH) - let anchorX = Double(m.anchor.x) - let anchorY = Double(m.anchor.y) - // Whole pixels, deliberately. The destination comes out of a - // projection, so it lands on a fraction of a pixel almost every - // time, and drawing to a non-integer rectangle makes the - // context resample every marker. The same change measured 20x - // on Android and 7x in Chromium; rounding moves a pin by at - // most half a pixel, which is not visible at icon scale. - let destRect = CGRect( - x: (centerX - drawW * anchorX).rounded(), - y: (centerY - drawH * anchorY).rounded(), - width: max(1, drawW.rounded()), - height: max(1, drawH.rounded()) - ) - m.bitmap.draw(in: destRect) - } + + // A bitmap context we own, not UIGraphicsImageRenderer. + // + // The renderer records the drawing and replays it when the image is + // materialised, so its cost scales with the number of draw calls rather + // than the size of the canvas: 20k blits into a 612px buffer measured + // 534 ms through it against 58 ms into a plain bitmap context on an + // iPad Pro. The renderer's own profile showed the same shape — the draw + // loop reported 81 ms while the block containing it took 1739 ms. + // + // Owning the buffer also removes the crop pass and the copy the encoder + // used to need: markers are drawn straight into a tile-sized canvas + // that is translated by the padding, so anything overhanging the edge is + // clipped where it used to be composited and then cut away. + let bytesPerRow = tileSize * 4 + let pixels = NSMutableData(length: bytesPerRow * tileSize)! + guard let context = CGContext( + data: pixels.mutableBytes, + width: tileSize, + height: tileSize, + bitsPerComponent: 8, + bytesPerRow: bytesPerRow, + space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue + ) else { return nil } + + // Core Graphics puts the origin at the bottom left and draws images + // bottom-up; tile coordinates run top-down. Flipping here keeps every + // destination rectangle below in tile coordinates. + context.translateBy(x: 0, y: CGFloat(tileSize)) + context.scaleBy(x: 1, y: -1) + context.translateBy(x: CGFloat(-paddingPx), y: CGFloat(-paddingPx)) + context.interpolationQuality = .none + + if debugTileOverlay { + let o = CGFloat(paddingPx) + context.setStrokeColor(UIColor.red.cgColor) + context.setLineWidth(1.0) + context.move(to: CGPoint(x: o, y: o)) + context.addLine(to: CGPoint(x: o + CGFloat(tileSize), y: o)) + context.strokePath() + context.move(to: CGPoint(x: o, y: o)) + context.addLine(to: CGPoint(x: o, y: o + CGFloat(tileSize))) + context.strokePath() } - // Crop to tile bounds - let finalRenderer = UIGraphicsImageRenderer( - size: CGSize(width: tileSize, height: tileSize), - format: format - ) - let finalImage = finalRenderer.image { _ in - offscreenImage.draw(at: CGPoint(x: -paddingPx, y: -paddingPx)) + for m in prepared.markers { + guard let bitmap = m.bitmap.cgImage else { continue } + let centerX = m.centerNormX * tilePx + Double(paddingPx) + let centerY = m.centerNormY * tilePx + Double(paddingPx) + let drawW = Double(m.drawW) + let drawH = Double(m.drawH) + let anchorX = Double(m.anchor.x) + let anchorY = Double(m.anchor.y) + // Whole pixels, deliberately. The destination comes out of a + // projection, so it lands on a fraction of a pixel almost every + // time, and drawing to a non-integer rectangle makes the context + // resample every marker. The same change measured 20x on Android + // and 7x in Chromium; rounding moves a pin by at most half a pixel, + // which is not visible at icon scale. + let left = (centerX - drawW * anchorX).rounded() + let top = (centerY - drawH * anchorY).rounded() + let width = max(1, drawW.rounded()) + let height = max(1, drawH.rounded()) + + // Drawn upside down and flipped back, because the context's own + // flip above would otherwise turn every icon over. + context.saveGState() + context.translateBy(x: left, y: top + height) + context.scaleBy(x: 1, y: -1) + context.draw(bitmap, in: CGRect(x: 0, y: 0, width: width, height: height)) + context.restoreGState() } - // Rust first: it is several times faster than pngData() on the tiles - // this renderer produces, and encoding is what dominates a tile once - // the drawing is aligned. Nil means the native path declined, and the - // platform encoder takes over. - guard let pngData = TilePngEncoder.encode(finalImage) ?? finalImage.pngData() else { + // The buffer is already what the encoder wants, so there is no image to + // wrap it in and unwrap again. + let pngData: Data + if let encoded = TilePngEncoder.encode( + rgba: pixels.mutableBytes, width: tileSize, height: tileSize, premultiplied: true + ) { + pngData = encoded + } else if let image = context.makeImage().map({ UIImage(cgImage: $0) }), + let fallback = image.pngData() { + pngData = fallback + } else { return nil } From 512aa1c62a19675722cd446d02f8a3758f98c162 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sat, 5 Sep 2026 14:14:38 +0900 Subject: [PATCH 06/28] Draw markers that sit exactly on top of one another once MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Zoom out far enough and a whole city collapses onto a few hundred pixels: at z6 a dataset of 20k markers resolves to a couple of thousand distinct positions, and the rest are drawn underneath copies of themselves. Keeping the last of each group is what would have been visible anyway, since drawing is in painters order. Only exact agreement counts — same rounded rectangle, same icon — so nothing that could peek out from behind another is dropped. Where markers share a rectangle but not an icon, none are dropped: a different icon may be transparent where the one above it is not, and then the one underneath does show through. This is deliberately not the decluttering the docs describe. That thins markers that are merely close, which changes what the map shows and is a product decision; this only removes drawing that has no effect. A test renders fifty stacked copies and one marker and asserts the two tiles are identical. Per tile at z6 with 20k markers: 414 ms -> 261 ms on an iPad Pro, 852 ms -> 617 ms on a Pixel 5a. The Android gain is smaller because its tile is 1344px against 512px, so fewer markers land on the same pixel. --- .../marker/MarkerTileRenderer.swift | 67 ++++++++++++++++--- 1 file changed, 58 insertions(+), 9 deletions(-) diff --git a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift index 020f6da..3f0acb5 100644 --- a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift +++ b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift @@ -197,31 +197,68 @@ public final class MarkerTileRenderer: TileProvider { context.strokePath() } - for m in prepared.markers { + var placements = [MarkerPlacement?](repeating: nil, count: prepared.markers.count) + var images = [CGImage?](repeating: nil, count: prepared.markers.count) + for (index, m) in prepared.markers.enumerated() { guard let bitmap = m.bitmap.cgImage else { continue } let centerX = m.centerNormX * tilePx + Double(paddingPx) let centerY = m.centerNormY * tilePx + Double(paddingPx) let drawW = Double(m.drawW) let drawH = Double(m.drawH) - let anchorX = Double(m.anchor.x) - let anchorY = Double(m.anchor.y) // Whole pixels, deliberately. The destination comes out of a // projection, so it lands on a fraction of a pixel almost every // time, and drawing to a non-integer rectangle makes the context // resample every marker. The same change measured 20x on Android // and 7x in Chromium; rounding moves a pin by at most half a pixel, // which is not visible at icon scale. - let left = (centerX - drawW * anchorX).rounded() - let top = (centerY - drawH * anchorY).rounded() - let width = max(1, drawW.rounded()) - let height = max(1, drawH.rounded()) + images[index] = bitmap + let anchorX: Double = Double(m.anchor.x) + let anchorY: Double = Double(m.anchor.y) + let left: Double = (centerX - drawW * anchorX).rounded() + let top: Double = (centerY - drawH * anchorY).rounded() + let width: Double = max(1.0, drawW.rounded()) + let height: Double = max(1.0, drawH.rounded()) + placements[index] = MarkerPlacement( + left: Int(left), + top: Int(top), + width: Int(width), + height: Int(height), + icon: ObjectIdentifier(m.bitmap) + ) + } + + // Drop markers that are completely hidden by a later one. + // + // Zoom out far enough and a whole city collapses onto a few hundred + // pixels: at z6 a dataset of 20k markers resolves to roughly 2k + // distinct positions, and the other 18k are drawn underneath copies of + // themselves. Keeping the last of each group is what would have been + // visible anyway, since drawing is in painter's order. + // + // Only exact agreement counts — same rectangle, same icon — so nothing + // that could peek out from behind another is dropped. Two identical + // icons stacked do differ from one where the icon's own edges are + // partly transparent, by a fraction of a level; that difference is + // overdraw rather than intent. + var lastAt: [MarkerPlacement: Int] = [:] + lastAt.reserveCapacity(placements.count) + for (index, placement) in placements.enumerated() { + if let placement { lastAt[placement] = index } + } + + for (index, placement) in placements.enumerated() { + guard let placement, let bitmap = images[index] else { continue } + guard lastAt[placement] == index else { continue } // Drawn upside down and flipped back, because the context's own // flip above would otherwise turn every icon over. context.saveGState() - context.translateBy(x: left, y: top + height) + context.translateBy(x: CGFloat(placement.left), + y: CGFloat(placement.top + placement.height)) context.scaleBy(x: 1, y: -1) - context.draw(bitmap, in: CGRect(x: 0, y: 0, width: width, height: height)) + context.draw(bitmap, in: CGRect(x: 0, y: 0, + width: CGFloat(placement.width), + height: CGFloat(placement.height))) context.restoreGState() } @@ -386,3 +423,15 @@ public final class MarkerTileRenderer: TileProvider { private let maxMercatorLat: Double = 85.05112878 } + +/// Where a marker is drawn, and which icon it draws. +/// +/// Markers that agree on all of it sit exactly on top of one another, so all +/// but the last are invisible. +private struct MarkerPlacement: Hashable { + let left: Int + let top: Int + let width: Int + let height: Int + let icon: ObjectIdentifier +} From 9223a0a2883854272cd3e8cceaeb7150b3a75b66 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sat, 5 Sep 2026 14:30:04 +0900 Subject: [PATCH 07/28] Start the query padding from the icon, not from a guess MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The conservative first pass assumed 32pt and every tile then discovered the real icons were larger, so query and prepare both ran twice — every time, on every tile. Measured on an iPad Pro at z6 with 20k markers, that second pass was 102 ms of a 261 ms tile. The renderer already knows its default icon, so it can start from that icon's own extent instead. Markers with larger custom icons still widen it on their first tile, which is what the field was for; it just no longer fires for the common case where nobody has one. Per tile on an iPad Pro, before -> after: z12 2000 markers 6.3 ms -> 4.2 ms z6 2000 markers 29.0 ms -> 23.1 ms z12 20000 markers 20.1 ms -> 15.7 ms z6 20000 markers 261.0 ms -> 156.8 ms --- .../marker/MarkerTileRenderer.swift | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift index 3f0acb5..0dff005 100644 --- a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift +++ b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift @@ -20,10 +20,14 @@ public final class MarkerTileRenderer: TileProvider { /// Largest icon half-extent any tile has needed so far, in points. /// - /// Seeds the padding used to widen a tile's marker query. `renderTile` can - /// run concurrently and this is only a hint: a lost update costs one extra - /// pass on one tile, which is the very thing it exists to avoid. - private var observedHalfExtentPx: Double = 32.0 + /// Seeds the padding used to widen a tile's marker query. Starts from the + /// default icon's own extent rather than a guess: the guess was 32pt, real + /// icons are larger, and every tile therefore paid a second query and a + /// second prepare — 102 ms of a 261 ms tile at z6 with 20k markers. + /// + /// `renderTile` can run concurrently and this is only a hint: a lost update + /// costs one extra pass on one tile, which is the very thing it avoids. + private var observedHalfExtentPx: Double private let defaultIcon: BitmapIcon @@ -40,7 +44,16 @@ public final class MarkerTileRenderer: TileProvider { self.extraIconScale = extraIconScale self.debugTileOverlay = debugTileOverlay self.iconScaleCallback = iconScaleCallback - self.defaultIcon = DefaultMarkerIcon().toBitmapIcon() + let icon = DefaultMarkerIcon().toBitmapIcon() + self.defaultIcon = icon + let anchorX = Double(icon.anchor.x) + let anchorY = Double(icon.anchor.y) + let width = Double(icon.size.width) * extraIconScale + let height = Double(icon.size.height) * extraIconScale + self.observedHalfExtentPx = max( + max(abs(width * anchorX), abs(width * (1.0 - anchorX))), + max(abs(height * anchorY), abs(height * (1.0 - anchorY))) + ) let cache = NSCache() cache.totalCostLimit = cacheSizeBytes From 3a0c3670e10803a75626977122dc9e7adf53f823 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sat, 5 Sep 2026 15:00:40 +0900 Subject: [PATCH 08/28] Do not sort a radius search whose distances are discarded findMarkersInBounds asks the cell registry for everything within a radius and then uses only the cells, but the search sorted its results by distance first. A cell carries a String, so sorting 20k of them moves 20k refcounted values through some 286k comparisons. Measured on an iPad Pro at 20k markers: sorted search 41.7 ms unsorted search 1.8 ms whole query 64.5 ms -> 12.4 ms The sorted variant stays for callers that do want the nearest first. Flattening also happens in one pass now, instead of building an array of id sets, then a flat array of ids, then an array of entities. KDTreeRadiusTest pins the two traversals against each other over a spread of radii, including ones that select nothing and everything. The unordered traversal was written out separately rather than derived, and a pruning bug that only shows at the boundary would survive a single radius. Per tile on an iPad Pro at z6 with 20k markers: 156.8 ms -> 107.3 ms. --- .../geocell/HexCellRegistry.swift | 8 ++++ Sources/MapConductorCore/geocell/KDTree.swift | 41 +++++++++++++++++ .../marker/MarkerManager.swift | 18 ++++++-- .../KDTreeRadiusTests.swift | 45 +++++++++++++++++++ 4 files changed, 108 insertions(+), 4 deletions(-) create mode 100644 Tests/MapConductorCoreTests/KDTreeRadiusTests.swift diff --git a/Sources/MapConductorCore/geocell/HexCellRegistry.swift b/Sources/MapConductorCore/geocell/HexCellRegistry.swift index 15bcc0e..bd67d63 100644 --- a/Sources/MapConductorCore/geocell/HexCellRegistry.swift +++ b/Sources/MapConductorCore/geocell/HexCellRegistry.swift @@ -140,6 +140,14 @@ public final class HexCellRegistry { return kdTree?.withinRadiusWithDistance(query: geocell.projection.project(point), radius: radius) ?? [] } + /// Cells within `radius`, unordered — see `KDTree.withinRadius`. + public func findWithinRadius(point: GeoPointProtocol, radius: Double) -> [HexCell] { + lock.lock() + defer { lock.unlock() } + rebuildIfNeeded() + return kdTree?.withinRadius(query: geocell.projection.project(point), radius: radius) ?? [] + } + public func all() -> [HexCell] { lock.lock() defer { lock.unlock() } diff --git a/Sources/MapConductorCore/geocell/KDTree.swift b/Sources/MapConductorCore/geocell/KDTree.swift index cf0f733..00f221a 100644 --- a/Sources/MapConductorCore/geocell/KDTree.swift +++ b/Sources/MapConductorCore/geocell/KDTree.swift @@ -143,6 +143,47 @@ public final class KDTree: Sendable { return results } + /// Cells within `radius`, unordered. + /// + /// The sorted, distance-carrying variant exists for callers that want the + /// nearest first. Bounds queries do not: they use every cell and ignore the + /// distances, and sorting them is the dominant cost of the search. A cell + /// carries a String, so sorting 20k of them moves 20k refcounted structs + /// through ~286k comparisons — 42 ms of a 64 ms query on an iPad Pro. + public func withinRadius(query: CGPoint, radius: Double) -> [HexCell] { + precondition(radius >= 0, "Radius must be non-negative") + guard let root else { return [] } + + var results: [HexCell] = [] + withinRadiusUnordered(node: root, query: query, radiusSq: radius * radius, results: &results) + return results + } + + private func withinRadiusUnordered( + node: Node, + query: CGPoint, + radiusSq: Double, + results: inout [HexCell] + ) { + if squaredDistance(query, node.cell.centerXY) <= radiusSq { + results.append(node.cell) + } + + let axis = node.axis + let queryVal = axis == 0 ? query.x : query.y + let nodeVal = axis == 0 ? node.cell.centerXY.x : node.cell.centerXY.y + let nearChild = queryVal < nodeVal ? node.left : node.right + let farChild = queryVal < nodeVal ? node.right : node.left + + if let nearChild { + withinRadiusUnordered(node: nearChild, query: query, radiusSq: radiusSq, results: &results) + } + let axisDistance = queryVal - nodeVal + if axisDistance * axisDistance <= radiusSq, let farChild { + withinRadiusUnordered(node: farChild, query: query, radiusSq: radiusSq, results: &results) + } + } + private func withinRadius(node: Node, query: CGPoint, radiusSq: Double, results: inout [HexCellWithDistance]) { let distSq = squaredDistance(query, node.cell.centerXY) if distSq <= radiusSq { diff --git a/Sources/MapConductorCore/marker/MarkerManager.swift b/Sources/MapConductorCore/marker/MarkerManager.swift index 8ebe430..577cf83 100644 --- a/Sources/MapConductorCore/marker/MarkerManager.swift +++ b/Sources/MapConductorCore/marker/MarkerManager.swift @@ -171,10 +171,20 @@ public final class MarkerManager { let northEast = bounds.northEast { let registry = ensureCellRegistryLocked() let distance = Spherical.computeDistanceBetween(from: center, to: northEast) - let hexCells = registry.findWithinRadiusWithDistance(point: center, radius: distance) - let entryIDs = hexCells.compactMap { registry.getEntryIDsByHexCell($0.cell) } - .flatMap { $0 } - return entryIDs.compactMap { entities[$0] } + // Unordered: every cell is used and the distances are thrown away, + // so sorting them is pure cost — 42 ms of a 64 ms query at 20k + // markers on an iPad Pro, because a cell carries a String and the + // sort moves 20k refcounted structs. + let hexCells = registry.findWithinRadius(point: center, radius: distance) + var found: [MarkerEntity] = [] + found.reserveCapacity(hexCells.count) + for cell in hexCells { + guard let ids = registry.getEntryIDsByHexCell(cell) else { continue } + for id in ids { + if let entity = entities[id] { found.append(entity) } + } + } + return found } return entities.values.filter { entity in diff --git a/Tests/MapConductorCoreTests/KDTreeRadiusTests.swift b/Tests/MapConductorCoreTests/KDTreeRadiusTests.swift new file mode 100644 index 0000000..bc31d9e --- /dev/null +++ b/Tests/MapConductorCoreTests/KDTreeRadiusTests.swift @@ -0,0 +1,45 @@ +import CoreGraphics +import XCTest + +@testable import MapConductorCore + +/** + The unordered radius search returns the same cells as the sorted one. + + It exists because sorting dominated bounds queries — 42 ms of a 64 ms query at + 20k markers — and bounds queries throw the distances away. Its traversal was + written out separately, so this pins the two against each other rather than + trusting that the pruning was copied correctly. + */ +final class KDTreeRadiusTests: XCTestCase { + + private func cells(_ count: Int) -> [HexCell] { + var seed: UInt64 = 42 + return (0..> 40) / 1000.0 + seed = seed &* 6364136223846793005 &+ 1442695040888963407 + let y = Double(seed >> 40) / 1000.0 + return HexCell( + coord: HexCoord(q: index, r: index), + centerLatLng: GeoPoint(latitude: 0, longitude: 0), + centerXY: CGPoint(x: x, y: y), + id: "cell-\(index)" + ) + } + } + + func testUnorderedMatchesSorted() { + let tree = KDTree(points: cells(2_000)) + + // A spread of radii: one that excludes everything, several partial, and + // one that takes the lot. A traversal bug that only shows at the + // boundary would survive a single radius. + for radius in [0.0, 1.0, 50.0, 500.0, 5_000.0, 20_000.0] { + let query = CGPoint(x: 8_000, y: 8_000) + let sorted = Set(tree.withinRadiusWithDistance(query: query, radius: radius).map { $0.cell.id }) + let unordered = Set(tree.withinRadius(query: query, radius: radius).map { $0.id }) + XCTAssertEqual(sorted, unordered, "radius \(radius): \(sorted.count) vs \(unordered.count)") + } + } +} From bde5ff7245df6abcb4a50e3daeafaae383b6b676 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sat, 5 Sep 2026 19:57:54 +0900 Subject: [PATCH 09/28] Give iOS the same marker grid index, and fix two holes in it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MarkerGridIndex.swift is the Kotlin index line for line: one Int64 a marker, its cell key above its position in a snapshot, sorted once and binary-searched per cell. Same 0.005 degree cells, same scan-instead threshold, same reasons — the hex registry it replaces was built at zoom 20, about 12 cm a cell, so it grouped nothing while charging a HexCell and a String id per marker. Writing the tests it deserved turned up two defects, both of which were in the Android version as shipped an hour ago: A box crossing the antimeridian has its east corner west of its west one. The cell walk ran lonFrom..lonTo straight, which is an empty range in Kotlin — no markers, silently — and a trap in Swift. It now walks to the unwrapped end and folds each column back onto the globe, which also covers the ring search near 180 degrees. findNearest stopped one ring after its first hit. A ring is a square, so a hit in a corner sits about 1.4 cells further out than a hit on an edge, and the marker it returned was simply not the nearest one — on 5,000 markers it was wrong for two of three probe points. The rule is now a distance: having finished ring r, everything unsearched is at least r cells away, so stop once that exceeds the best found. Neither would have thrown. Both would have quietly returned the wrong markers, which is why the tests compare against a brute-force scan on every query rather than checking that a query returns something. Also fills the gaps left when the index changed hands. findByIdPrefix builds the hex registry itself now — nothing else builds it any more, so it had been returning nothing at all — and getMemoryStats counts the grid instead of reporting no spatial index at all. --- .../marker/MarkerGridIndex.swift | 224 ++++++++++++++++++ .../marker/MarkerManager.swift | 63 ++--- .../MarkerGridIndexTests.swift | 151 ++++++++++++ 3 files changed, 401 insertions(+), 37 deletions(-) create mode 100644 Sources/MapConductorCore/marker/MarkerGridIndex.swift create mode 100644 Tests/MapConductorCoreTests/MarkerGridIndexTests.swift diff --git a/Sources/MapConductorCore/marker/MarkerGridIndex.swift b/Sources/MapConductorCore/marker/MarkerGridIndex.swift new file mode 100644 index 0000000..b5d67f2 --- /dev/null +++ b/Sources/MapConductorCore/marker/MarkerGridIndex.swift @@ -0,0 +1,224 @@ +import Foundation + +/// A uniform lat/lng grid over the markers, held as one sorted array of Int64. +/// +/// Replaces the hex-cell registry on the paths that run per tile. That index was +/// built at a fixed zoom of 20, which puts a cell at about 12 cm — street trees +/// are metres apart, so every marker landed in its own cell and the index +/// grouped nothing, while costing a HexCell and a String id per marker plus a +/// kd-tree node each. On Tokyo's 144,183 street trees, building it on Android +/// aborted the process; this builds in 41 ms and 1.15 MB there. +/// +/// Each marker is one Int64: its cell key above its position in a snapshot, so +/// building the index is arithmetic and a sort of a contiguous buffer — no +/// objects, no hashing, no strings. A bounds query walks the cells the box +/// covers and binary-searches each one's run. +/// +/// Not synchronised. `MarkerManager` holds its lock across every call, and +/// taking a second one here would only add cost to a path that is already +/// serialised. +/// +/// The Android and web SDKs index the same way, with the same cell size. +final class MarkerGridIndex { + /// About 450 m at Tokyo's latitude. + /// + /// Chosen by measurement rather than by round number: on 144k markers a + /// tile-sized query took 0.06 ms here, 0.03 ms at 0.001 degrees and 2.31 ms + /// at 0.02 degrees — the last no better than scanning, because a cell that + /// size returns five times the markers a tile needs. Finer wins on dense + /// data and loses on sparse, where a tile spans more empty cells than it + /// saves. + private static var cellDegrees: Double { 0.005 } + + /// Past this many cells, scan every marker instead. + /// + /// A query covering most of the world touches more empty cells than there + /// are markers. Measured on the same 144k: a box over all of Tokyo costs + /// 2.27 ms through the grid and 1.98 ms scanning, so the index stops paying + /// for itself well before the pathological case. + private static var maxCellsPerQuery: Int64 { 4096 } + + /// Roughly 45 km of rings before giving up and scanning. + private static var maxNearestRings: Int64 { 100 } + + /// Columns around the globe: the wrap the ring and box walks fold on. + private static var lonCells: Int64 { Int64(360.0 / cellDegrees) } + private static var minLonCell: Int64 { -lonCells / 2 } + + private static func wrapLon(_ lonCell: Int64) -> Int64 { + let span = lonCells + return minLonCell + ((lonCell - minLonCell) % span + span) % span + } + + /// 24 bits of position, enough for 16.7M markers, under the cell key. + private static var indexBits: Int64 { 24 } + private static var indexMask: Int64 { (1 << 24) - 1 } + + private let source: () -> [MarkerEntity] + private var snapshot: [MarkerEntity] = [] + /// Sorted `(cellKey << indexBits) | position-in-snapshot`. + private var packed: [Int64] = [] + private var dirty = true + + init(source: @escaping () -> [MarkerEntity]) { + self.source = source + } + + /// Whether the index currently holds a built snapshot. + var isBuilt: Bool { !dirty } + + /// Roughly what the index costs: two words a marker, key and reference. + func estimatedBytes() -> Int64 { Int64(packed.count) * 8 + Int64(snapshot.count) * 8 } + + /// Marks the index stale. The rebuild happens on the next query. + func invalidate() { + dirty = true + } + + /// Markers whose position falls inside `bounds`. + func inBounds(_ bounds: GeoRectBounds) -> [MarkerEntity] { + guard let southWest = bounds.southWest, let northEast = bounds.northEast else { return [] } + + let latFrom = Self.cell(southWest.latitude) + let latTo = Self.cell(northEast.latitude) + let lonFrom = Self.cell(southWest.longitude) + let lonTo = Self.cell(northEast.longitude) + + // A box crossing the antimeridian has its east corner west of its west + // one. Walking to the unwrapped end and folding each column back onto + // the globe covers both halves without a second loop — and without the + // `lonFrom...lonTo` that traps on a reversed range. + let lonEnd = northEast.longitude < southWest.longitude ? lonTo + Self.lonCells : lonTo + + if (latTo - latFrom + 1) * (lonEnd - lonFrom + 1) > Self.maxCellsPerQuery { + return source().filter { bounds.contains(point: $0.state.position) } + } + + rebuildIfNeeded() + var found: [MarkerEntity] = [] + for latCell in latFrom...latTo { + for lonCell in lonFrom...lonEnd { + forEach(inCell: Self.cellKey(latCell, Self.wrapLon(lonCell))) { entity in + if bounds.contains(point: entity.state.position) { found.append(entity) } + } + } + } + return found + } + + /// The marker nearest `position`, by squared degrees. + /// + /// Rings of cells are searched outward from the one holding the point. The + /// stopping rule is a distance, not a ring count: a ring is a square, so a + /// hit in one of its corners sits about 1.4 cells further out than a hit on + /// its edge, and stopping a fixed ring after the first hit returns the + /// wrong marker. Having finished ring r, everything still unsearched is at + /// least r cells away, so the search ends once that already exceeds the + /// best distance found. + func nearest(position: GeoPointProtocol) -> MarkerEntity? { + rebuildIfNeeded() + if packed.isEmpty { return nil } + + let centreLat = Self.cell(position.latitude) + let centreLon = Self.cell(position.longitude) + + var best: MarkerEntity? + var bestDistance = Double.greatestFiniteMagnitude + var ring: Int64 = 0 + + while ring <= Self.maxNearestRings { + forEach(inRing: ring, centreLat: centreLat, centreLon: centreLon) { entity in + let distance = Self.squaredDegrees(entity, position) + if distance < bestDistance { + bestDistance = distance + best = entity + } + } + let reach = Double(ring) * Self.cellDegrees + if best != nil, reach * reach >= bestDistance { break } + ring += 1 + } + + // Nothing within the rings searched: the set is sparse enough here that + // scanning is cheaper than widening further. + return best ?? source().min { Self.squaredDegrees($0, position) < Self.squaredDegrees($1, position) } + } + + private static func squaredDegrees( + _ entity: MarkerEntity, + _ position: GeoPointProtocol + ) -> Double { + let deltaLat = entity.state.position.latitude - position.latitude + let deltaLon = entity.state.position.longitude - position.longitude + return deltaLat * deltaLat + deltaLon * deltaLon + } + + private func forEach( + inRing ring: Int64, + centreLat: Int64, + centreLon: Int64, + _ body: (MarkerEntity) -> Void + ) { + if ring == 0 { + forEach(inCell: Self.cellKey(centreLat, centreLon), body) + return + } + for offset in -ring...ring { + forEach(inCell: Self.cellKey(centreLat - ring, Self.wrapLon(centreLon + offset)), body) + forEach(inCell: Self.cellKey(centreLat + ring, Self.wrapLon(centreLon + offset)), body) + } + if ring > 1 { + for offset in (-ring + 1)...(ring - 1) { + forEach(inCell: Self.cellKey(centreLat + offset, Self.wrapLon(centreLon - ring)), body) + forEach(inCell: Self.cellKey(centreLat + offset, Self.wrapLon(centreLon + ring)), body) + } + } + } + + private func forEach(inCell key: Int64, _ body: (MarkerEntity) -> Void) { + var at = lowerBound(key << Self.indexBits) + let limit = (key + 1) << Self.indexBits + while at < packed.count, packed[at] < limit { + body(snapshot[Int(packed[at] & Self.indexMask)]) + at += 1 + } + } + + private func rebuildIfNeeded() { + guard dirty else { return } + let entities = source() + var keys = [Int64]() + keys.reserveCapacity(entities.count) + for (at, entity) in entities.enumerated() { + keys.append((Self.cellKey(for: entity.state.position) << Self.indexBits) | Int64(at)) + } + keys.sort() + snapshot = entities + packed = keys + dirty = false + } + + private static func cell(_ degrees: Double) -> Int64 { + Int64((degrees / cellDegrees).rounded(.down)) + } + + private static func cellKey(for position: GeoPointProtocol) -> Int64 { + cellKey(cell(position.latitude), cell(position.longitude)) + } + + /// Offsets keep the keys positive, so their ordering matches the numeric + /// ordering the sort and the binary search depend on. + private static func cellKey(_ latCell: Int64, _ lonCell: Int64) -> Int64 { + ((latCell + 262_144) << 20) | (lonCell + 524_288) + } + + private func lowerBound(_ target: Int64) -> Int { + var low = 0 + var high = packed.count + while low < high { + let mid = (low + high) / 2 + if packed[mid] < target { low = mid + 1 } else { high = mid } + } + return low + } +} diff --git a/Sources/MapConductorCore/marker/MarkerManager.swift b/Sources/MapConductorCore/marker/MarkerManager.swift index 577cf83..ec6d830 100644 --- a/Sources/MapConductorCore/marker/MarkerManager.swift +++ b/Sources/MapConductorCore/marker/MarkerManager.swift @@ -11,7 +11,15 @@ public final class MarkerManager { public let minMarkerCount: Int private var entities: [String: MarkerEntity] = [:] + /// Only `findByIdPrefix` still needs hex cells; it is built the first time + /// that is called, so nothing else pays for it. private var cellRegistry: HexCellRegistry? + /// The index the per-tile queries use. Weak, because the manager owns the + /// markers and the index only ever borrows them. + private lazy var gridIndex = MarkerGridIndex { [weak self] in + guard let self else { return [] } + return Array(self.entities.values) + } private var destroyed = false private let lock = NSLock() @@ -65,6 +73,7 @@ public final class MarkerManager { let removed = entities.removeValue(forKey: id) if let removed { cellRegistry?.removePoint(entity: removed) + gridIndex.invalidate() } return removed } @@ -75,6 +84,7 @@ public final class MarkerManager { guard usableLocked("registerEntity") else { return } entities[entity.state.id] = entity cellRegistry?.setPoint(entity: entity) + gridIndex.invalidate() } public func updateEntity(_ entity: MarkerEntity) { @@ -83,6 +93,7 @@ public final class MarkerManager { guard usableLocked("updateEntity") else { return } entities[entity.state.id] = entity cellRegistry?.setPoint(entity: entity) + gridIndex.invalidate() } public func metersPerPixel( @@ -105,20 +116,7 @@ public final class MarkerManager { guard usableLocked("findNearest") else { return nil } if entities.count > minMarkerCount { - let registry = ensureCellRegistryLocked() - if let nearestCell = registry.findNearest(point: position), - let ids = registry.getEntryIDsByHexCell(nearestCell) { - return ids - .compactMap { entities[$0] } - .min(by: { lhs, rhs in - let dx1 = lhs.state.position.latitude - position.latitude - let dy1 = lhs.state.position.longitude - position.longitude - let dx2 = rhs.state.position.latitude - position.latitude - let dy2 = rhs.state.position.longitude - position.longitude - return dx1 * dx1 + dy1 * dy1 < dx2 * dx2 + dy2 * dy2 - }) - } - return bruteForceNearestLocked(position: position) + return gridIndex.nearest(position: position) ?? bruteForceNearestLocked(position: position) } return bruteForceNearestLocked(position: position) @@ -138,7 +136,9 @@ public final class MarkerManager { lock.lock() defer { lock.unlock() } guard usableLocked("findByIdPrefix") else { return [] } - return cellRegistry?.findByIdPrefix(prefix) ?? [] + // The registry is built here and nowhere else: this is the one caller + // that needs hex cells rather than markers. + return ensureCellRegistryLocked().findByIdPrefix(prefix) } private func ensureCellRegistryLocked() -> HexCellRegistry { @@ -166,25 +166,8 @@ public final class MarkerManager { defer { lock.unlock() } guard usableLocked("findMarkersInBounds") else { return [] } - if entities.count > minMarkerCount, - let center = bounds.center, - let northEast = bounds.northEast { - let registry = ensureCellRegistryLocked() - let distance = Spherical.computeDistanceBetween(from: center, to: northEast) - // Unordered: every cell is used and the distances are thrown away, - // so sorting them is pure cost — 42 ms of a 64 ms query at 20k - // markers on an iPad Pro, because a cell carries a String and the - // sort moves 20k refcounted structs. - let hexCells = registry.findWithinRadius(point: center, radius: distance) - var found: [MarkerEntity] = [] - found.reserveCapacity(hexCells.count) - for cell in hexCells { - guard let ids = registry.getEntryIDsByHexCell(cell) else { continue } - for id in ids { - if let entity = entities[id] { found.append(entity) } - } - } - return found + if entities.count > minMarkerCount { + return gridIndex.inBounds(bounds) } return entities.values.filter { entity in @@ -198,8 +181,8 @@ public final class MarkerManager { _ = usableLocked("getMemoryStats") return MarkerManagerStats( entityCount: entities.count, - hasSpatialIndex: cellRegistry != nil, - spatialIndexInitialized: cellRegistry != nil, + hasSpatialIndex: true, + spatialIndexInitialized: gridIndex.isBuilt, estimatedMemoryKB: Int(estimateMemoryUsageLocked() / 1024) ) } @@ -207,7 +190,11 @@ public final class MarkerManager { private func estimateMemoryUsageLocked() -> Int64 { let entityMapOverhead = Int64(entities.count) * 64 let entityObjects = Int64(entities.count) * 200 - let spatialIndexSize = cellRegistry == nil ? 0 : Int64(entities.count) * 100 + let gridSize = gridIndex.estimatedBytes() + // The hex registry is usually absent; when findByIdPrefix has built it, + // it costs a cell object and a string id per marker. + let hexSize = cellRegistry == nil ? 0 : Int64(entities.count) * 100 + let spatialIndexSize = gridSize + hexSize return entityMapOverhead + entityObjects + spatialIndexSize } @@ -217,6 +204,7 @@ public final class MarkerManager { guard usableLocked("clear") else { return } entities.removeAll() cellRegistry?.clear() + gridIndex.invalidate() } public func destroy() { @@ -227,6 +215,7 @@ public final class MarkerManager { entities.removeAll() cellRegistry?.clear() cellRegistry = nil + gridIndex.invalidate() } public var isDestroyed: Bool { diff --git a/Tests/MapConductorCoreTests/MarkerGridIndexTests.swift b/Tests/MapConductorCoreTests/MarkerGridIndexTests.swift new file mode 100644 index 0000000..99b7984 --- /dev/null +++ b/Tests/MapConductorCoreTests/MarkerGridIndexTests.swift @@ -0,0 +1,151 @@ +import XCTest + +@testable import MapConductorCore + +/// `MarkerGridIndex` must answer exactly what a scan would. +/// +/// The index packs a cell key and an array position into one Int64 and reads +/// them back with shifts and masks, so an off-by-one in the bit layout or in a +/// range bound does not throw — it quietly drops markers. Every test here is +/// the same shape: ask the index, ask brute force, demand the same set. +final class MarkerGridIndexTests: XCTestCase { + + private func entity(_ id: Int, _ latitude: Double, _ longitude: Double) -> MarkerEntity { + MarkerEntity( + marker: id, + state: MarkerState( + position: GeoPoint(latitude: latitude, longitude: longitude), + id: String(id) + ), + isRendered: true + ) + } + + /// A deterministic spread, so a failure is reproducible. + private func scatter(count: Int, latitude: Double, longitude: Double, spread: Double) + -> [MarkerEntity] { + var generator = SystemRandomNumberGenerator() + _ = generator + var seed: UInt64 = 0x2545_F491_4F6C_DD1D + func next() -> Double { + seed = seed &* 6_364_136_223_846_793_005 &+ 1_442_695_040_888_963_407 + return Double(seed >> 11) / Double(UInt64(1) << 53) + } + return (0..]) -> Set { + Set(entities.map(\.state.id)) + } + + private func bounds(_ south: Double, _ west: Double, _ north: Double, _ east: Double) + -> GeoRectBounds { + GeoRectBounds( + southWest: GeoPoint(latitude: south, longitude: west), + northEast: GeoPoint(latitude: north, longitude: east) + ) + } + + func testBoundsQueryMatchesBruteForce() { + let markers = scatter(count: 5000, latitude: 35.68, longitude: 139.76, spread: 0.6) + let index = MarkerGridIndex { markers } + + // A box inside one cell, one spanning several, one wider than the data, + // and one over empty ground — the last because an index that returns + // nothing is right here and wrong everywhere else. + for box in [ + bounds(35.6812, 139.7612, 35.6814, 139.7614), + bounds(35.68, 139.76, 35.69, 139.77), + bounds(35.0, 139.0, 36.5, 140.5), + bounds(10.0, 100.0, 11.0, 101.0), + ] { + let expected = ids(markers.filter { box.contains(point: $0.state.position) }) + XCTAssertEqual(ids(index.inBounds(box)), expected, "grid disagreed with a scan") + } + + // The middle two have to be carrying markers, or the comparison above + // is only proving that two empty sets match. + XCTAssertFalse(index.inBounds(bounds(35.68, 139.76, 35.69, 139.77)).isEmpty) + XCTAssertEqual(index.inBounds(bounds(35.0, 139.0, 36.5, 140.5)).count, markers.count) + } + + /// A box crossing 180° has its east corner west of its west one. + /// + /// The first version walked `lonFrom...lonTo` straight, which is an empty + /// range on Android and a trap on iOS. Fiji and the Chathams are real + /// places, and a map centred there is a reversed box every frame. + func testBoundsQueryCrossesTheAntimeridian() { + let markers = [ + entity(0, -18.0, 179.9), + entity(1, -18.0, -179.9), + entity(2, -18.0, 178.0), + entity(3, -18.0, 0.0), + ] + scatter(count: 3000, latitude: -18.0, longitude: 179.95, spread: 0.4) + + let index = MarkerGridIndex { markers } + let box = bounds(-18.5, 179.5, -17.5, -179.5) + let expected = ids(markers.filter { box.contains(point: $0.state.position) }) + + XCTAssertTrue(expected.contains("0"), "the box should hold the marker just west of 180") + XCTAssertTrue(expected.contains("1"), "and the one just east of it") + XCTAssertEqual(ids(index.inBounds(box)), expected) + } + + func testNearestMatchesBruteForce() { + let markers = scatter(count: 5000, latitude: 35.68, longitude: 139.76, spread: 0.6) + let index = MarkerGridIndex { markers } + + for point in [ + GeoPoint(latitude: 35.68, longitude: 139.76), + GeoPoint(latitude: 35.4, longitude: 139.5), + GeoPoint(latitude: 36.0, longitude: 140.1), + ] { + let expected = markers.min { + squared($0, point) < squared($1, point) + } + XCTAssertEqual(index.nearest(position: point)?.state.id, expected?.state.id) + } + } + + /// Beyond the rings the index searches it falls back to a scan rather than + /// returning nothing — the answer still has to be right, just slower. + func testNearestFallsBackWhenNothingIsClose() { + let markers = [entity(0, 35.0, 139.0)] + let index = MarkerGridIndex { markers } + XCTAssertEqual( + index.nearest(position: GeoPoint(latitude: -35.0, longitude: -70.0))?.state.id, + "0" + ) + } + + func testEmptyIndexHasNoNearest() { + let index = MarkerGridIndex { [] } + XCTAssertNil(index.nearest(position: GeoPoint(latitude: 35.0, longitude: 139.0))) + } + + /// The index borrows the manager's markers, so a change has to be seen. + func testInvalidateShowsLaterMarkers() { + var markers = [entity(0, 35.0, 139.0)] + let index = MarkerGridIndex { markers } + let box = bounds(34.9, 138.9, 35.1, 139.1) + XCTAssertEqual(index.inBounds(box).count, 1) + + markers.append(entity(1, 35.001, 139.001)) + XCTAssertEqual(index.inBounds(box).count, 1, "a stale index should stay stale until told") + + index.invalidate() + XCTAssertEqual(index.inBounds(box).count, 2) + } + + private func squared(_ entity: MarkerEntity, _ point: GeoPoint) -> Double { + let deltaLat = entity.state.position.latitude - point.latitude + let deltaLon = entity.state.position.longitude - point.longitude + return deltaLat * deltaLat + deltaLon * deltaLon + } +} From 87a4f55561f90f35b964938068ed61a32e7078d0 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sun, 6 Sep 2026 03:15:45 +0900 Subject: [PATCH 10/28] Have overlay states report their own changes, as android-sdk does MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit android-sdk reached this from the opposite direction. There, one snapshot observer read every state to find in-place changes, and that cost the size of the collection on every commit — 350 ms a frame while dragging 144k markers. iOS already pushed: each state published its changes and the collector subscribed. The bill arrives somewhere else. Subscribing is one `map`, one `eraseToAnyPublisher`, one `receive(on:)` and one `sink` per state, plus the `AnyCancellable` holding them, and it does not stay linear: states sync now 1,000 47ms 1ms 10,000 236ms 15ms 50,000 2,175ms 52ms 144,183 — 134ms on the main actor, on a simulator. The last row is Tokyo's street trees, which is what raised the question. Whatever the old curve was doing between 10k and 50k, it was not going to make that a number anyone would wait for. Replacing the fingerprint chain with `objectWillChange` was measured first, since the states are all ObservableObject and that publisher already exists. It came out worse — 2,898 ms at 50,000. The cost is the subscription machinery, not the chain fed into it, so the fix is to have none: `didSet` on each `@Published` property calls a closure the collector installed. `asFlow()` stays. Several provider controllers subscribe to it directly rather than through the collector, and they still pay per state — around a second to subscribe 50,000 on the same machine. That is a separate path and a separate change. `overlayChangePublisher()` had exactly one caller, the collector, so the protocol requirement goes with it and the six one-line conformances become empty. The web SDK was measured too and needs nothing: it also pushes, one closure per state, and 144,183 markers land in 58 ms. --- .../MapConductorCore/circle/CircleState.swift | 24 ++++--- .../groundimage/GroundImageState.swift | 16 +++-- .../MapConductorCore/marker/MarkerState.swift | 30 ++++---- .../overlay/OverlayCollectableState.swift | 51 ++++---------- .../overlay/OverlayCollector.swift | 35 +++++----- .../overlay/StateMutationSignal.swift | 37 ++++++++++ .../polygon/PolygonState.swift | 22 +++--- .../polyline/PolylineState.swift | 18 +++-- .../raster/RasterLayerState.swift | 18 +++-- .../OverlayCollectorDebounceTests.swift | 10 +-- .../OverlayCollectorScaleTests.swift | 69 +++++++++++++++++++ 11 files changed, 218 insertions(+), 112 deletions(-) create mode 100644 Sources/MapConductorCore/overlay/StateMutationSignal.swift create mode 100644 Tests/MapConductorCoreTests/OverlayCollectorScaleTests.swift diff --git a/Sources/MapConductorCore/circle/CircleState.swift b/Sources/MapConductorCore/circle/CircleState.swift index 85116a1..960f958 100644 --- a/Sources/MapConductorCore/circle/CircleState.swift +++ b/Sources/MapConductorCore/circle/CircleState.swift @@ -31,16 +31,20 @@ public typealias OnCircleEventHandler = (CircleEvent) -> Void public final class CircleState: ObservableObject, Identifiable, Equatable, Hashable { public let id: String - @Published public var center: GeoPointProtocol - @Published public var radiusMeters: Double - @Published public var geodesic: Bool - @Published public var clickable: Bool - @Published public var strokeColor: UIColor - @Published public var strokeWidth: Double - @Published public var fillColor: UIColor - @Published public var extra: Any? - @Published public var zIndex: Int? - @Published public var onClick: OnCircleEventHandler? + /// Writes to the fields below are announced here rather than discovered by + /// subscribing to each state. See ``StateMutationSignal``. + public let mutations = StateMutationSignal() + + @Published public var center: GeoPointProtocol { didSet { mutations.notifyMutated() } } + @Published public var radiusMeters: Double { didSet { mutations.notifyMutated() } } + @Published public var geodesic: Bool { didSet { mutations.notifyMutated() } } + @Published public var clickable: Bool { didSet { mutations.notifyMutated() } } + @Published public var strokeColor: UIColor { didSet { mutations.notifyMutated() } } + @Published public var strokeWidth: Double { didSet { mutations.notifyMutated() } } + @Published public var fillColor: UIColor { didSet { mutations.notifyMutated() } } + @Published public var extra: Any? { didSet { mutations.notifyMutated() } } + @Published public var zIndex: Int? { didSet { mutations.notifyMutated() } } + @Published public var onClick: OnCircleEventHandler? { didSet { mutations.notifyMutated() } } public init( center: GeoPointProtocol, diff --git a/Sources/MapConductorCore/groundimage/GroundImageState.swift b/Sources/MapConductorCore/groundimage/GroundImageState.swift index 886faf3..c985a82 100644 --- a/Sources/MapConductorCore/groundimage/GroundImageState.swift +++ b/Sources/MapConductorCore/groundimage/GroundImageState.swift @@ -27,12 +27,16 @@ public typealias OnGroundImageEventHandler = (GroundImageEvent) -> Void public final class GroundImageState: ObservableObject, Identifiable, Equatable, Hashable { public let id: String - @Published public var bounds: GeoRectBounds - @Published public var image: UIImage - @Published public var opacity: Double - @Published public var tileSize: Int - @Published public var extra: Any? - @Published public var onClick: OnGroundImageEventHandler? + /// Writes to the fields below are announced here rather than discovered by + /// subscribing to each state. See ``StateMutationSignal``. + public let mutations = StateMutationSignal() + + @Published public var bounds: GeoRectBounds { didSet { mutations.notifyMutated() } } + @Published public var image: UIImage { didSet { mutations.notifyMutated() } } + @Published public var opacity: Double { didSet { mutations.notifyMutated() } } + @Published public var tileSize: Int { didSet { mutations.notifyMutated() } } + @Published public var extra: Any? { didSet { mutations.notifyMutated() } } + @Published public var onClick: OnGroundImageEventHandler? { didSet { mutations.notifyMutated() } } public init( bounds: GeoRectBounds, diff --git a/Sources/MapConductorCore/marker/MarkerState.swift b/Sources/MapConductorCore/marker/MarkerState.swift index 4fe0b82..cde7025 100644 --- a/Sources/MapConductorCore/marker/MarkerState.swift +++ b/Sources/MapConductorCore/marker/MarkerState.swift @@ -23,19 +23,23 @@ public final class MarkerState: ObservableObject, Identifiable, Equatable, Hasha public let id: String public var extra: Any? - @Published public var icon: (any MarkerIconProtocol)? - @Published public var clickable: Bool - @Published public var draggable: Bool - @Published public var zIndex: Int? - @Published public var onClick: OnMarkerEventHandler? - @Published public var onDragStart: OnMarkerEventHandler? - @Published public var onDrag: OnMarkerEventHandler? - @Published public var onDragEnd: OnMarkerEventHandler? - @Published public var onAnimateStart: OnMarkerEventHandler? - @Published public var onAnimateEnd: OnMarkerEventHandler? - @Published public var position: GeoPoint - - @Published private var internalAnimation: MarkerAnimation? + /// Writes to the fields below are announced here rather than discovered by + /// subscribing to each state. See ``StateMutationSignal``. + public let mutations = StateMutationSignal() + + @Published public var icon: (any MarkerIconProtocol)? { didSet { mutations.notifyMutated() } } + @Published public var clickable: Bool { didSet { mutations.notifyMutated() } } + @Published public var draggable: Bool { didSet { mutations.notifyMutated() } } + @Published public var zIndex: Int? { didSet { mutations.notifyMutated() } } + @Published public var onClick: OnMarkerEventHandler? { didSet { mutations.notifyMutated() } } + @Published public var onDragStart: OnMarkerEventHandler? { didSet { mutations.notifyMutated() } } + @Published public var onDrag: OnMarkerEventHandler? { didSet { mutations.notifyMutated() } } + @Published public var onDragEnd: OnMarkerEventHandler? { didSet { mutations.notifyMutated() } } + @Published public var onAnimateStart: OnMarkerEventHandler? { didSet { mutations.notifyMutated() } } + @Published public var onAnimateEnd: OnMarkerEventHandler? { didSet { mutations.notifyMutated() } } + @Published public var position: GeoPoint { didSet { mutations.notifyMutated() } } + + @Published private var internalAnimation: MarkerAnimation? { didSet { mutations.notifyMutated() } } public init( position: GeoPoint, diff --git a/Sources/MapConductorCore/overlay/OverlayCollectableState.swift b/Sources/MapConductorCore/overlay/OverlayCollectableState.swift index f8ff897..7c1e367 100644 --- a/Sources/MapConductorCore/overlay/OverlayCollectableState.swift +++ b/Sources/MapConductorCore/overlay/OverlayCollectableState.swift @@ -8,49 +8,26 @@ import Combine /// type (`AnyObject`) so the collector can hold it by identity, diff instances /// with `!==`, and subscribe to it weakly. /// -/// `overlayChangePublisher()` emits whenever a rendered property changes. It is -/// backed by each state's `asFlow()` — the exact publisher the per-provider -/// controllers used before the collector existed — so routing an overlay through -/// the collector reproduces the old in-place-update behavior (e.g. dragging a -/// polygon vertex re-renders the polygon). The collector forwards each emission -/// to the bound controller's `update(state:)`, which dedupes by `fingerPrint()`. +/// ``StateMutationSignal`` is where a state reports a write to a rendered +/// property, and the collector forwards it to the bound controller's +/// `update(state:)`, which dedupes by `fingerPrint()`. The collector used to +/// learn the same thing by subscribing to each state's `asFlow()`; that cost +/// two seconds to sync 50,000 markers on the main actor, so the states report +/// instead. `asFlow()` itself stays — several provider controllers subscribe to +/// it directly, outside the collector. public protocol OverlayCollectableState: AnyObject { var id: String { get } - func overlayChangePublisher() -> AnyPublisher + var mutations: StateMutationSignal { get } } -extension MarkerState: OverlayCollectableState { - public func overlayChangePublisher() -> AnyPublisher { - asFlow().map { _ in () }.eraseToAnyPublisher() - } -} +extension MarkerState: OverlayCollectableState {} -extension CircleState: OverlayCollectableState { - public func overlayChangePublisher() -> AnyPublisher { - asFlow().map { _ in () }.eraseToAnyPublisher() - } -} +extension CircleState: OverlayCollectableState {} -extension PolylineState: OverlayCollectableState { - public func overlayChangePublisher() -> AnyPublisher { - asFlow().map { _ in () }.eraseToAnyPublisher() - } -} +extension PolylineState: OverlayCollectableState {} -extension PolygonState: OverlayCollectableState { - public func overlayChangePublisher() -> AnyPublisher { - asFlow().map { _ in () }.eraseToAnyPublisher() - } -} +extension PolygonState: OverlayCollectableState {} -extension GroundImageState: OverlayCollectableState { - public func overlayChangePublisher() -> AnyPublisher { - asFlow().map { _ in () }.eraseToAnyPublisher() - } -} +extension GroundImageState: OverlayCollectableState {} -extension RasterLayerState: OverlayCollectableState { - public func overlayChangePublisher() -> AnyPublisher { - asFlow().map { _ in () }.eraseToAnyPublisher() - } -} +extension RasterLayerState: OverlayCollectableState {} diff --git a/Sources/MapConductorCore/overlay/OverlayCollector.swift b/Sources/MapConductorCore/overlay/OverlayCollector.swift index fab83bb..a1a4cd2 100644 --- a/Sources/MapConductorCore/overlay/OverlayCollector.swift +++ b/Sources/MapConductorCore/overlay/OverlayCollector.swift @@ -30,7 +30,10 @@ import Foundation public final class OverlayCollector { private var statesById: [String: S] = [:] private var order: [String] = [] - private var subscriptions: [String: AnyCancellable] = [:] + /// Who is currently reporting mutations. A state reports to at most one + /// collector, so leaving a stale listener on a dropped state would send its + /// writes to a collector that no longer holds it. + private var listening: [String: S] = [:] private var latest: [S] = [] private var membershipHandler: (([S]) -> Void)? @@ -88,10 +91,9 @@ public final class OverlayCollector { var next: [String: S] = [:] for state in states { if let existing = statesById[state.id], existing !== state { - // Same id, new instance → drop the stale subscription and treat - // it as a membership change so the renderer re-adds it. - subscriptions[state.id]?.cancel() - subscriptions.removeValue(forKey: state.id) + // Same id, new instance → stop listening to the old one and + // treat it as a membership change so the renderer re-adds it. + existing.mutations.listen(nil) membershipChanged = true } next[state.id] = state @@ -101,21 +103,22 @@ public final class OverlayCollector { latest = states for id in oldIds.subtracting(newIds) { - subscriptions[id]?.cancel() - subscriptions.removeValue(forKey: id) + listening.removeValue(forKey: id)?.mutations.listen(nil) } if membershipChanged { scheduleMembership() } - for state in states where subscriptions[state.id] == nil { - subscriptions[state.id] = state.overlayChangePublisher() - .receive(on: DispatchQueue.main) - .sink { [weak self, weak state] _ in - guard let self, let state, self.statesById[state.id] != nil else { return } - self.scheduleUpdate(state) - } + for state in listening.values where next[state.id] !== state { + state.mutations.listen(nil) + } + listening = next + for state in states { + state.mutations.listen { [weak self, weak state] in + guard let self, let state, self.statesById[state.id] === state else { return } + self.scheduleUpdate(state) + } } } @@ -196,8 +199,8 @@ public final class OverlayCollector { } public func clear() { - subscriptions.values.forEach { $0.cancel() } - subscriptions.removeAll() + listening.values.forEach { $0.mutations.listen(nil) } + listening.removeAll() statesById.removeAll() order.removeAll() latest.removeAll() diff --git a/Sources/MapConductorCore/overlay/StateMutationSignal.swift b/Sources/MapConductorCore/overlay/StateMutationSignal.swift new file mode 100644 index 0000000..207ed3d --- /dev/null +++ b/Sources/MapConductorCore/overlay/StateMutationSignal.swift @@ -0,0 +1,37 @@ +import Foundation + +/// Where an overlay state reports that one of its own fields was written. +/// +/// The collector used to learn this by subscribing to each state's Combine +/// publisher. That is one `map`, one `eraseToAnyPublisher`, one `receive(on:)` +/// and one `sink` per state, plus the `AnyCancellable` holding them, and it +/// does not stay linear: syncing markers into a collector measured 47 ms at +/// 1,000, 236 ms at 10,000 and 2,175 ms at 50,000 on a simulator, on the main +/// actor. Tokyo's street trees are 144,183. +/// +/// A closure per state costs an allocation and nothing else. `objectWillChange` +/// instead of the fingerprint chain was measured too and came out worse (2,898 +/// ms at 50,000): the cost is the subscription machinery, not the chain fed +/// into it. +/// +/// android-sdk carries the same type for the same reason, though it arrived +/// there from the opposite direction — one observer reading every state, rather +/// than one subscription per state. +public final class StateMutationSignal { + private var listener: (() -> Void)? + + public init() {} + + /// Sets who hears about writes, or clears it with nil. + /// + /// A state belongs to at most one collector, so there is one listener + /// rather than a list. + public func listen(_ listener: (() -> Void)?) { + self.listener = listener + } + + /// Reports a write. + public func notifyMutated() { + listener?() + } +} diff --git a/Sources/MapConductorCore/polygon/PolygonState.swift b/Sources/MapConductorCore/polygon/PolygonState.swift index 5bc0422..c156d7f 100644 --- a/Sources/MapConductorCore/polygon/PolygonState.swift +++ b/Sources/MapConductorCore/polygon/PolygonState.swift @@ -30,15 +30,19 @@ public typealias OnPolygonEventHandler = (PolygonEvent) -> Void public final class PolygonState: ObservableObject, Identifiable, Equatable, Hashable { public let id: String - @Published public var strokeColor: UIColor - @Published public var strokeWidth: Double - @Published public var fillColor: UIColor - @Published public var geodesic: Bool - @Published public var zIndex: Int - @Published public var points: [GeoPointProtocol] - @Published public var holes: [[GeoPointProtocol]] - @Published public var extra: Any? - @Published public var onClick: OnPolygonEventHandler? + /// Writes to the fields below are announced here rather than discovered by + /// subscribing to each state. See ``StateMutationSignal``. + public let mutations = StateMutationSignal() + + @Published public var strokeColor: UIColor { didSet { mutations.notifyMutated() } } + @Published public var strokeWidth: Double { didSet { mutations.notifyMutated() } } + @Published public var fillColor: UIColor { didSet { mutations.notifyMutated() } } + @Published public var geodesic: Bool { didSet { mutations.notifyMutated() } } + @Published public var zIndex: Int { didSet { mutations.notifyMutated() } } + @Published public var points: [GeoPointProtocol] { didSet { mutations.notifyMutated() } } + @Published public var holes: [[GeoPointProtocol]] { didSet { mutations.notifyMutated() } } + @Published public var extra: Any? { didSet { mutations.notifyMutated() } } + @Published public var onClick: OnPolygonEventHandler? { didSet { mutations.notifyMutated() } } /// android-sdk の `Polygon(state)` コンポーザブルは `LaunchedEffect(state)` の中で /// `unionHolesInPlace()` を呼ぶため、穴のユニオンは「1 つの state インスタンスにつき 1 回」 diff --git a/Sources/MapConductorCore/polyline/PolylineState.swift b/Sources/MapConductorCore/polyline/PolylineState.swift index 2ca0c5b..8b94cfc 100644 --- a/Sources/MapConductorCore/polyline/PolylineState.swift +++ b/Sources/MapConductorCore/polyline/PolylineState.swift @@ -30,13 +30,17 @@ public typealias OnPolylineEventHandler = (PolylineEvent) -> Void public final class PolylineState: ObservableObject, Identifiable, Equatable, Hashable { public let id: String - @Published public var strokeColor: UIColor - @Published public var strokeWidth: Double - @Published public var geodesic: Bool - @Published public var points: [GeoPointProtocol] - @Published public var zIndex: Int - @Published public var extra: Any? - @Published public var onClick: OnPolylineEventHandler? + /// Writes to the fields below are announced here rather than discovered by + /// subscribing to each state. See ``StateMutationSignal``. + public let mutations = StateMutationSignal() + + @Published public var strokeColor: UIColor { didSet { mutations.notifyMutated() } } + @Published public var strokeWidth: Double { didSet { mutations.notifyMutated() } } + @Published public var geodesic: Bool { didSet { mutations.notifyMutated() } } + @Published public var points: [GeoPointProtocol] { didSet { mutations.notifyMutated() } } + @Published public var zIndex: Int { didSet { mutations.notifyMutated() } } + @Published public var extra: Any? { didSet { mutations.notifyMutated() } } + @Published public var onClick: OnPolylineEventHandler? { didSet { mutations.notifyMutated() } } public init( points: [GeoPointProtocol], diff --git a/Sources/MapConductorCore/raster/RasterLayerState.swift b/Sources/MapConductorCore/raster/RasterLayerState.swift index ecca139..b61a6fe 100644 --- a/Sources/MapConductorCore/raster/RasterLayerState.swift +++ b/Sources/MapConductorCore/raster/RasterLayerState.swift @@ -32,13 +32,17 @@ public final class RasterLayerState: ObservableObject, Identifiable, Equatable, public let id: String - @Published public var source: RasterLayerSource - @Published public var opacity: Double - @Published public var visible: Bool - @Published public var zIndex: Int - @Published public var debug: Bool - @Published public var userAgent: String? - @Published public var extraHeaders: [String: String]? + /// Writes to the fields below are announced here rather than discovered by + /// subscribing to each state. See ``StateMutationSignal``. + public let mutations = StateMutationSignal() + + @Published public var source: RasterLayerSource { didSet { mutations.notifyMutated() } } + @Published public var opacity: Double { didSet { mutations.notifyMutated() } } + @Published public var visible: Bool { didSet { mutations.notifyMutated() } } + @Published public var zIndex: Int { didSet { mutations.notifyMutated() } } + @Published public var debug: Bool { didSet { mutations.notifyMutated() } } + @Published public var userAgent: String? { didSet { mutations.notifyMutated() } } + @Published public var extraHeaders: [String: String]? { didSet { mutations.notifyMutated() } } public init( source: RasterLayerSource, diff --git a/Tests/MapConductorCoreTests/OverlayCollectorDebounceTests.swift b/Tests/MapConductorCoreTests/OverlayCollectorDebounceTests.swift index ce5add2..b2be165 100644 --- a/Tests/MapConductorCoreTests/OverlayCollectorDebounceTests.swift +++ b/Tests/MapConductorCoreTests/OverlayCollectorDebounceTests.swift @@ -14,19 +14,15 @@ import XCTest @MainActor final class OverlayCollectorDebounceTests: XCTestCase { - /// テスト用の最小 state。`overlayChangePublisher()` を手で叩ける。 + /// テスト用の最小 state。`mutate()` で書き込みが起きたことにできる。 private final class TestState: OverlayCollectableState { let id: String - private let subject = PassthroughSubject() + let mutations = StateMutationSignal() init(id: String) { self.id = id } - func overlayChangePublisher() -> AnyPublisher { - subject.eraseToAnyPublisher() - } - /// in-place 変更が起きたことにする。 - func mutate() { subject.send(()) } + func mutate() { mutations.notifyMutated() } } /// 窓(5ms)より十分長く待つ。 diff --git a/Tests/MapConductorCoreTests/OverlayCollectorScaleTests.swift b/Tests/MapConductorCoreTests/OverlayCollectorScaleTests.swift new file mode 100644 index 0000000..8fdc90b --- /dev/null +++ b/Tests/MapConductorCoreTests/OverlayCollectorScaleTests.swift @@ -0,0 +1,69 @@ +import Combine +import XCTest + +@testable import MapConductorCore + +/// What one subscription per state costs when there are a lot of states. +/// +/// android-sdk had the opposite problem: it watched every state through a +/// single snapshot observer, which cost the size of the collection on every +/// commit and made a drag with 144k markers stall for 350 ms a frame. iOS and +/// the web SDK already push — each state publishes its own changes — so that +/// cost does not exist here. What does exist is the setup: `asFlow()` builds a +/// CombineLatest of a CombineLatest4 per marker, and the collector wraps each +/// in `receive(on:)` and a sink. +/// +/// Tokyo's street trees are 144,183 markers. This measures the shape of the +/// curve rather than asserting a number, because a number would be about the +/// machine; the test fails only if it does not finish. +@MainActor +final class OverlayCollectorScaleTests: XCTestCase { + + private func markers(_ count: Int) -> [MarkerState] { + (0..() + var membership = 0 + collector.onMembershipChange { _ in membership += 1 } + collector.onStateChange { _ in } + + let started = Date() + collector.sync(states) + let elapsed = Date().timeIntervalSince(started) + + print(String(format: "IOSCOLLECTOR n=%d sync=%.0fms", count, elapsed * 1000)) + XCTAssertEqual(collector.values().count, count) + collector.clear() + } + } + + /// The per-state publisher on its own, with the collector out of the way. + func testPublisherSetupCost() { + for count in [1_000, 10_000, 50_000] { + let states = markers(count) + var bag: [AnyCancellable] = [] + bag.reserveCapacity(count) + + let started = Date() + for state in states { + bag.append(state.asFlow().sink { _ in }) + } + let elapsed = Date().timeIntervalSince(started) + + print(String(format: "IOSPUBLISHER n=%d subscribe=%.0fms", count, elapsed * 1000)) + XCTAssertEqual(bag.count, count) + } + } +} From ced369ee695612271848b30f86133750c17aa36f Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sun, 6 Sep 2026 03:48:51 +0900 Subject: [PATCH 11/28] Add declutterPx, which android-sdk had and the other two did not MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Keeping one marker per cell of a few pixels is what makes 144,183 street trees readable below street level: they are planted metres apart along a road, so most of them sit on top of one another, and thinning them halves the tile bytes while showing the same map. android-sdk grew the option when that sample was built; porting the sample to the other two turned up its absence. Zero, the default, keeps the behaviour these renderers already had — drop only markers that agree exactly, same rectangle and same icon, which cannot change the tile. Above zero the group is a cell and the icon stops being part of it: the caller has said markers that close together are interchangeable, so one of them stands for the rest whatever they draw. The value is tile pixels on all three, not points or dp. It is compared against destination rectangles the renderer has already rounded into the tile's own pixel grid, and passing it through unscaled is what makes 14 mean the same density on a 3x iPhone as on Android. --- .../marker/MarkerTileRenderer.swift | 35 +++++++++++++++++-- .../marker/MarkerTilingOptions.swift | 17 ++++++++- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift index 0dff005..9d3d097 100644 --- a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift +++ b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift @@ -13,6 +13,8 @@ public final class MarkerTileRenderer: TileProvider { public let extraIconScale: Double private let debugTileOverlay: Bool private let iconScaleCallback: ((MarkerState, Int) -> Double)? + /// Keep one marker per cell of this many pixels, or 0 to keep them all. + private let declutterPx: Int private let cacheLock = NSLock() private let cache: NSCache @@ -37,13 +39,15 @@ public final class MarkerTileRenderer: TileProvider { extraIconScale: Double = 1.0, cacheSizeBytes: Int = 8 * 1024 * 1024, debugTileOverlay: Bool = false, - iconScaleCallback: ((MarkerState, Int) -> Double)? = nil + iconScaleCallback: ((MarkerState, Int) -> Double)? = nil, + declutterPx: Int = 0 ) { self.markerManager = markerManager self.tileSize = tileSize self.extraIconScale = extraIconScale self.debugTileOverlay = debugTileOverlay self.iconScaleCallback = iconScaleCallback + self.declutterPx = declutterPx let icon = DefaultMarkerIcon().toBitmapIcon() self.defaultIcon = icon let anchorX = Double(icon.anchor.x) @@ -253,15 +257,19 @@ public final class MarkerTileRenderer: TileProvider { // icons stacked do differ from one where the icon's own edges are // partly transparent, by a fraction of a level; that difference is // overdraw rather than intent. + // With decluttering on the group is a cell rather than a rectangle, and + // the icon is not part of it: the caller has said markers that close + // together are interchangeable, so one of them stands for the rest + // whatever they draw. var lastAt: [MarkerPlacement: Int] = [:] lastAt.reserveCapacity(placements.count) for (index, placement) in placements.enumerated() { - if let placement { lastAt[placement] = index } + if let placement { lastAt[group(of: placement)] = index } } for (index, placement) in placements.enumerated() { guard let placement, let bitmap = images[index] else { continue } - guard lastAt[placement] == index else { continue } + guard lastAt[group(of: placement)] == index else { continue } // Drawn upside down and flipped back, because the context's own // flip above would otherwise turn every icon over. @@ -441,10 +449,31 @@ public final class MarkerTileRenderer: TileProvider { /// /// Markers that agree on all of it sit exactly on top of one another, so all /// but the last are invisible. +extension MarkerTileRenderer { + /// What counts as "the same place" for the pass that drops hidden markers. + fileprivate func group(of placement: MarkerPlacement) -> MarkerPlacement { + guard declutterPx > 0 else { return placement } + let cell = declutterPx + return MarkerPlacement( + left: Int(floor(Double(placement.left) / Double(cell))), + top: Int(floor(Double(placement.top) / Double(cell))), + width: 0, + height: 0, + icon: MarkerPlacement.anyIcon + ) + } +} + private struct MarkerPlacement: Hashable { let left: Int let top: Int let width: Int let height: Int let icon: ObjectIdentifier + + /// Stands in for "any icon" when the group is a cell rather than a + /// rectangle. A cell holds whatever it holds. + static let anyIcon = ObjectIdentifier(AnyIconMarker.self) + + private final class AnyIconMarker {} } diff --git a/Sources/MapConductorCore/marker/MarkerTilingOptions.swift b/Sources/MapConductorCore/marker/MarkerTilingOptions.swift index 1b1b01b..a996240 100644 --- a/Sources/MapConductorCore/marker/MarkerTilingOptions.swift +++ b/Sources/MapConductorCore/marker/MarkerTilingOptions.swift @@ -14,6 +14,19 @@ public struct MarkerTilingOptions { public let cacheSize: Int /// Extra scale multiplier applied per marker per zoom level during tile rendering. public let iconScaleCallback: ((MarkerState, Int) -> Double)? + /// Keep one marker per cell of this many pixels, or 0 to keep them all. + /// + /// Markers a few pixels apart overlap almost completely, so thinning them is + /// a judgement about the map rather than a free optimisation — hence opt-in. + /// Tokyo's street trees are planted metres apart along a road: below street + /// level most of them sit on top of one another, and one per icon width + /// halves the tile bytes while showing the same map. + /// + /// Zero still drops markers that agree exactly — same rectangle, same icon — + /// which cannot change the tile. + /// + /// android-sdk's and the web SDK's MarkerTilingOptions carry the same field. + public let declutterPx: Int public static let Disabled = MarkerTilingOptions(enabled: false) public static let Default = MarkerTilingOptions() @@ -23,13 +36,15 @@ public struct MarkerTilingOptions { debugTileOverlay: Bool = false, minMarkerCount: Int = 2000, cacheSize: Int = 8 * 1024 * 1024, - iconScaleCallback: ((MarkerState, Int) -> Double)? = nil + iconScaleCallback: ((MarkerState, Int) -> Double)? = nil, + declutterPx: Int = 0 ) { self.enabled = enabled self.debugTileOverlay = debugTileOverlay self.minMarkerCount = minMarkerCount self.cacheSize = cacheSize self.iconScaleCallback = iconScaleCallback + self.declutterPx = declutterPx } /// タイル方式で描くか。**この判定を各所で書き直さないこと。** From af4250a6075a192fd9adc381ba9dbe60c02a6c9e Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sun, 20 Sep 2026 01:15:13 +0900 Subject: [PATCH 12/28] Check Web Mercator against the other two platforms `zoom-golden.txt` is an archive of what each platform returned before the migration, ios-for-mapbox's missing zoom offset included. It is not a specification, so comparing those three files says nothing about whether the current implementations agree. They did not: three of thirty-four rows. android truncated to Float32, and only this platform clamped latitude and wrapped longitude -- the other two returned 238107693 for `lat=90` and `-Infinity` for `lat=-90`. android and web have been brought here rather than the other way round, so this side is unchanged; this is the test that holds it. The vectors and the expected answers are byte-identical in all three repos. Any one drifting fails its own CI. api/TOOLCHAIN records which Xcode the api baseline was generated with. Upgrading Xcode produced a 3,606-line diff with the sources untouched -- `@available` reordered, `_modify` gone, conformances newly spelled out. Without the version written down there is no way to tell that from a real API change. --- .../ProjectionConformanceTests.swift | 78 +++++++++++++++++++ .../Resources/projection-expected.txt | 34 ++++++++ .../Resources/projection-vectors.txt | 74 ++++++++++++++++++ api/TOOLCHAIN | 28 +++++++ 4 files changed, 214 insertions(+) create mode 100644 Tests/MapConductorCoreTests/ProjectionConformanceTests.swift create mode 100644 Tests/MapConductorCoreTests/Resources/projection-expected.txt create mode 100644 Tests/MapConductorCoreTests/Resources/projection-vectors.txt create mode 100644 api/TOOLCHAIN diff --git a/Tests/MapConductorCoreTests/ProjectionConformanceTests.swift b/Tests/MapConductorCoreTests/ProjectionConformanceTests.swift new file mode 100644 index 0000000..e0fe4b3 --- /dev/null +++ b/Tests/MapConductorCoreTests/ProjectionConformanceTests.swift @@ -0,0 +1,78 @@ +import XCTest + +@testable import MapConductorCore + +/// Web Mercator の適合テスト。 +/// +/// 同じ `projection-vectors.txt` を android-sdk / react-sdk も読む。3 つが同じ +/// 答えを出すことを担保するのが目的で、ここが見ているのはこのプラットフォームの +/// 分だけ。突き合わせは 3 つの出力に対して別途行う。 +/// +/// `zoom-golden.txt` とは役割が違う。あちらは移行前の値の記録(既知の不具合込み)。 +/// こちらは現在の実装どうしが一致しているかを見る。 +final class ProjectionConformanceTests: XCTestCase { + + /// 桁を固定する。 + /// + /// 言語ごとの既定の数値表記は揃わない。f64 のノイズより粗く、実装差より細かい + /// 桁で切る。 + private func fixed(_ value: Double) -> String { + if value.isNaN { return "nan" } + if value == .infinity { return "inf" } + if value == -.infinity { return "-inf" } + return String(format: "%.6f", value) + } + + private func runVectors() throws -> String { + guard let url = Bundle.module.url(forResource: "projection-vectors", withExtension: "txt") else { + XCTFail("projection-vectors.txt が見つからない") + return "" + } + let projection = WebMercatorProjection() + var out = "" + for line in try String(contentsOf: url, encoding: .utf8).split(separator: "\n", omittingEmptySubsequences: false) { + let row = line.trimmingCharacters(in: .whitespaces) + if row.isEmpty || row.hasPrefix("#") { continue } + let parts = row.split(separator: "|", omittingEmptySubsequences: false).map(String.init) + let (op, a, b) = (parts[0], parts[1], parts[2]) + switch op { + case "project": + let p = projection.project(GeoPoint(latitude: Double(a)!, longitude: Double(b)!)) + out += "project|\(a)|\(b)|\(fixed(p.x))|\(fixed(p.y))\n" + case "unproject": + let g = projection.unproject(CGPoint(x: Double(a)!, y: Double(b)!)) + out += "unproject|\(a)|\(b)|\(fixed(g.latitude))|\(fixed(g.longitude))\n" + default: + XCTFail("未知の演算: \(op)") + } + } + return out + } + + func testVectorsAllRun() throws { + let actual = try runVectors() + + // 突き合わせに使う。テストの副産物ではなく、これが成果物。 + // シミュレータのサンドボックス内なので、ログにも出して外から拾えるようにする。 + let destination = FileManager.default.temporaryDirectory + .appendingPathComponent("projection-actual.ios.txt") + try actual.write(to: destination, atomically: true, encoding: .utf8) + print("CONFORMANCE_BEGIN") + print(actual, terminator: "") + print("CONFORMANCE_END") + + let rows = actual.split(separator: "\n").map(String.init) + XCTAssertFalse(rows.isEmpty, "ベクタが 1 行も処理されていない") + for row in rows { + XCTAssertEqual(row.split(separator: "|").count, 5, "列数が合わない: \(row)") + } + } + + /// 正本が決まるまでは存在しない。3 プラットフォームの差を潰してから凍結する。 + func testMatchesCanonicalIfPresent() throws { + guard let url = Bundle.module.url(forResource: "projection-expected", withExtension: "txt") else { + throw XCTSkip("正本がまだない") + } + XCTAssertEqual(try String(contentsOf: url, encoding: .utf8), try runVectors()) + } +} diff --git a/Tests/MapConductorCoreTests/Resources/projection-expected.txt b/Tests/MapConductorCoreTests/Resources/projection-expected.txt new file mode 100644 index 0000000..b58e7ed --- /dev/null +++ b/Tests/MapConductorCoreTests/Resources/projection-expected.txt @@ -0,0 +1,34 @@ +project|0|0|0.000000|-0.000000 +project|35.681236|139.767125|15558805.184640|4256848.120220 +project|51.5074|-0.1278|-14226.630923|6711542.475588 +project|-33.8688|151.2093|16832542.279207|-4011198.647308 +project|-1.2921|36.8219|4098995.158041|-143848.107271 +project|64.1466|-21.9426|-2442639.058680|9387089.649838 +project|0|180|-20037508.342789|-0.000000 +project|0|-180|-20037508.342789|-0.000000 +project|0|90|10018754.171395|-0.000000 +project|0|-90|-10018754.171395|-0.000000 +project|85.05112878|0|0.000000|20037508.343039 +project|-85.05112878|0|0.000000|-20037508.343039 +project|85.1|0|0.000000|20037508.343039 +project|86|0|0.000000|20037508.343039 +project|89|0|0.000000|20037508.343039 +project|89.999|0|0.000000|20037508.343039 +project|90|0|0.000000|20037508.343039 +project|-90|0|0.000000|-20037508.343039 +project|0|190|-18924313.434857|-0.000000 +project|0|-190|18924313.434857|-0.000000 +project|0|360|0.000000|-0.000000 +project|0|-360|0.000000|-0.000000 +project|35.681236|189.767125|-18950236.961275|4256848.120220 +unproject|0|0|0.000000|0.000000 +unproject|15556463.769352|4257881.238407|35.688774|139.746092 +unproject|-14226.343867|6711665.221216|51.508086|-0.127797 +unproject|16832005.123478|-4011119.083890|-33.868207|151.204475 +unproject|20037508.342789|20037508.342789|85.051129|180.000000 +unproject|-20037508.342789|-20037508.342789|-85.051129|-180.000000 +unproject|20037508.342789|0|0.000000|180.000000 +unproject|0|20037508.342789|85.051129|0.000000 +unproject|0|-20037508.342789|-85.051129|0.000000 +unproject|21148622.5|0|0.000000|-170.018692 +unproject|-21148622.5|0|0.000000|170.018692 diff --git a/Tests/MapConductorCoreTests/Resources/projection-vectors.txt b/Tests/MapConductorCoreTests/Resources/projection-vectors.txt new file mode 100644 index 0000000..a1de78e --- /dev/null +++ b/Tests/MapConductorCoreTests/Resources/projection-vectors.txt @@ -0,0 +1,74 @@ +# Web Mercator 適合ベクタ。android-sdk / ios-sdk / react-sdk で同一のファイル。 +# +# ## これは何か +# +# `zoom-golden.txt` とは別物。あちらは移行前のプロバイダが返した値の記録で、 +# 既知の不具合(ios-for-mapbox のオフセット欠落)まで保存している。こちらは +# 「3 プラットフォームの**現在の実装**が同じ答えを出すか」を見るための入力。 +# +# provider に依存しない純粋な計算だけを対象にする。provider ごとのカメラモデル +# の差は正当なので、ここには入れない。 +# +# ## 形式 +# +# project|| 緯度経度 -> EPSG:3857 メートル +# unproject|| EPSG:3857 メートル -> 緯度経度 +# +# 出力は `%.6f`(マイクロメートル / ナノ度)で揃える。f64 のノイズより十分粗く、 +# 実装差より十分細かい。言語ごとの既定の数値表記(Kotlin の 1.49E7 など)を +# 避けるために桁を固定している。 +# +# ## 何を狙った入力か +# +# 端の扱いが実装で割れる。極、日付変更線の外側、Web Mercator の定義端 +# (±85.05112878)を意図的に含めてある。 + +# --- 通常域 --- +project|0|0 +project|35.681236|139.767125 +project|51.5074|-0.1278 +project|-33.8688|151.2093 +project|-1.2921|36.8219 +project|64.1466|-21.9426 + +# --- 赤道と子午線 --- +project|0|180 +project|0|-180 +project|0|90 +project|0|-90 + +# --- Web Mercator の定義端 --- +project|85.05112878|0 +project|-85.05112878|0 + +# --- 定義端の外側。クランプするかどうかで割れる --- +project|85.1|0 +project|86|0 +project|89|0 +project|89.999|0 +project|90|0 +project|-90|0 + +# --- 日付変更線の外側。wrap するかどうかで割れる --- +project|0|190 +project|0|-190 +project|0|360 +project|0|-360 +project|35.681236|189.767125 + +# --- 逆変換:通常域 --- +unproject|0|0 +unproject|15556463.769352|4257881.238407 +unproject|-14226.343867|6711665.221216 +unproject|16832005.123478|-4011119.083890 + +# --- 逆変換:端 --- +unproject|20037508.342789|20037508.342789 +unproject|-20037508.342789|-20037508.342789 +unproject|20037508.342789|0 +unproject|0|20037508.342789 +unproject|0|-20037508.342789 + +# --- 逆変換:範囲外。x が 1 周を超える --- +unproject|21148622.5|0 +unproject|-21148622.5|0 diff --git a/api/TOOLCHAIN b/api/TOOLCHAIN new file mode 100644 index 0000000..b814f90 --- /dev/null +++ b/api/TOOLCHAIN @@ -0,0 +1,28 @@ +# このディレクトリの .api.swift を焼いたツールチェイン。 +# +# ## なぜ記録するか +# +# ベースラインは Swift コンパイラが吐く interface をそのまま記録している。 +# つまり**コンパイラのバージョンに依存する。** Xcode を上げたとき、ソースを +# 1 行も触っていないのに 3,606 行の差分が出た: +# +# - `@available` のプラットフォーム列挙順が変わっただけの行が 150 +# - `_modify` アクセサが出力されなくなった行が 50 +# - Int / String / Double / Bool の適合が明示されるようになった行が 490 +# +# 差分を見ても「API が変わった」のか「コンパイラが変わった」のか判別できない。 +# ここに書いておけば、CI が違う Xcode を引いたときに 3,000 行の差分ではなく +# 「ツールチェインが違う」と言って落ちる。 +# +# ## 上げるとき +# +# 1. ローカルの Xcode を上げる +# 2. `./scripts/api-surface.sh dump ios-sdk-core` +# 3. このファイルを更新する +# 4. CI のワークフロー(api-surface.yml / test.yml)の XCODE_VERSION も合わせる +# +# 差分は「コンパイラが変わった分」として 1 コミットに分け、API の変更と混ぜないこと。 + +XCODE_VERSION=27.0 +XCODE_BUILD=27A266a +SWIFT_VERSION=6.4 From 4afd41c98aae09b58b358e93e868ee8ef708f83e Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sun, 20 Sep 2026 08:12:42 +0900 Subject: [PATCH 13/28] Thin marker queries in the index, as android-sdk does MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `declutterPx` was applied after the work rather than before it. Every marker in the tile got a placement and a rendered icon, and only then was one per cell kept — so the option that exists to save work added some. Measured on a 20,000 marker tile it cost 82.8 ms without decluttering and 178.5 ms with it. android-sdk asks its index instead: told a separation the caller considers interchangeable, the grid returns one marker per cell and reads its cells rather than its markers. At zoom 9 that is the ~5,000 cells holding Tokyo's street trees instead of all 144,183, and merely reading a position off an entity costs 0.72 microseconds. `inBoundsThinned` and the two-argument `findMarkersInBounds` are ports of that, and the renderer now calls them. The dictionary pass afterwards stays: the index declines when its 0.005 degree cells are coarser than the separation asked for — every zoom past 11, in the street tree sample — and then the real rule still has to be applied. On an iPad Pro 11, 144,183 markers at zoom 9: 281 ms to 64 ms. Decluttering now pays 22x where it paid 7x, matching android's 20x. The three thinning tests come from android's MarkerGridIndexTest. The first is the one that matters: the set of populated cells must match a brute-force scan exactly, because what this must never return is a hole — a cell with markers in the box that answers with nothing, which on a map is a patch of the city with no trees and no error anywhere. MarkerTileCostTests and IconSizeProbeTests are measurement fixtures sharing their seed, distribution and zooms with android's, so the numbers from the two can be compared directly. --- .../marker/MarkerGridIndex.swift | 73 ++++++++++ .../marker/MarkerManager.swift | 28 ++++ .../marker/MarkerTileRenderer.swift | 18 ++- .../IconSizeProbeTests.swift | 78 +++++++++++ .../MarkerGridIndexTests.swift | 62 ++++++++ .../MarkerTileCostTests.swift | 132 ++++++++++++++++++ 6 files changed, 390 insertions(+), 1 deletion(-) create mode 100644 Tests/MapConductorCoreTests/IconSizeProbeTests.swift create mode 100644 Tests/MapConductorCoreTests/MarkerTileCostTests.swift diff --git a/Sources/MapConductorCore/marker/MarkerGridIndex.swift b/Sources/MapConductorCore/marker/MarkerGridIndex.swift index b5d67f2..2a20bfc 100644 --- a/Sources/MapConductorCore/marker/MarkerGridIndex.swift +++ b/Sources/MapConductorCore/marker/MarkerGridIndex.swift @@ -51,6 +51,11 @@ final class MarkerGridIndex { } /// 24 bits of position, enough for 16.7M markers, under the cell key. + /// 間引きクエリが index を使う上限のセル数。これを超える箱は、セルを + /// 歩くより全件を走査したほうが安い。android の + /// `MAX_CELLS_PER_THINNED_QUERY` と同じ値。 + private static var maxCellsPerThinnedQuery: Int64 { 1 << 18 } + private static var indexBits: Int64 { 24 } private static var indexMask: Int64 { (1 << 24) - 1 } @@ -106,6 +111,74 @@ final class MarkerGridIndex { return found } + /// The markers in `bounds`, at most one per cell. + /// + /// The caller has said that markers closer together than + /// `minSeparationDegrees` are interchangeable, so the index is free to hand + /// back whichever of a cell's markers it likes. That is what lets it answer + /// from its cells instead of reading every marker: at zoom 9 that is the + /// roughly 5,000 cells holding Tokyo's street trees rather than all 144,183 + /// of them, and merely reading a position off an entity costs about + /// 0.72 microseconds — looking at the full set is 100 ms before anything is + /// done with it. + /// + /// A cell wholly inside the box needs no containment test, and the last + /// entry of its run can be taken without looking at the rest. + /// + /// Returns nil when the index cannot help: cells coarser than the caller's + /// separation would thin more than it asked for, and a box spanning more + /// cells than `maxCellsPerThinnedQuery` is cheaper to scan. + /// + /// Mirrors `MarkerGridIndex.inBoundsThinned` in android-sdk. + func inBoundsThinned( + _ bounds: GeoRectBounds, + minSeparationDegrees: Double + ) -> [MarkerEntity]? { + if minSeparationDegrees < Self.cellDegrees { return nil } + guard let southWest = bounds.southWest, let northEast = bounds.northEast else { return nil } + + let latFrom = Self.cell(southWest.latitude) + let latTo = Self.cell(northEast.latitude) + let lonFrom = Self.cell(southWest.longitude) + let lonTo = Self.cell(northEast.longitude) + // As in `inBounds`: a box crossing the antimeridian has its east corner + // west of its west one, so walk to the unwrapped end and fold back. + let lonEnd = northEast.longitude < southWest.longitude ? lonTo + Self.lonCells : lonTo + + if (latTo - latFrom + 1) * (lonEnd - lonFrom + 1) > Self.maxCellsPerThinnedQuery { return nil } + + rebuildIfNeeded() + var found: [MarkerEntity] = [] + for latCell in latFrom...latTo { + let latInside = latCell > latFrom && latCell < latTo + for lonCell in lonFrom...lonEnd { + let key = Self.cellKey(latCell, Self.wrapLon(lonCell)) + let at = lowerBound(key << Self.indexBits) + if at >= packed.count { continue } + let limit = (key + 1) << Self.indexBits + if packed[at] >= limit { continue } + + if latInside && lonCell > lonFrom && lonCell < lonEnd { + var last = at + while last + 1 < packed.count && packed[last + 1] < limit { last += 1 } + found.append(snapshot[Int(packed[last] & Self.indexMask)]) + continue + } + // On the border the cell straddles the box, so the last entry + // inside it is not necessarily the last entry of the run. + var winner: MarkerEntity? + var cursor = at + while cursor < packed.count && packed[cursor] < limit { + let entity = snapshot[Int(packed[cursor] & Self.indexMask)] + if bounds.contains(point: entity.state.position) { winner = entity } + cursor += 1 + } + if let winner { found.append(winner) } + } + } + return found + } + /// The marker nearest `position`, by squared degrees. /// /// Rings of cells are searched outward from the one holding the point. The diff --git a/Sources/MapConductorCore/marker/MarkerManager.swift b/Sources/MapConductorCore/marker/MarkerManager.swift index ec6d830..02ee9cb 100644 --- a/Sources/MapConductorCore/marker/MarkerManager.swift +++ b/Sources/MapConductorCore/marker/MarkerManager.swift @@ -175,6 +175,34 @@ public final class MarkerManager { } } + /// The markers in `bounds`, thinned to at most one per + /// `minSeparationDegrees`. + /// + /// The caller is saying that markers closer than that are + /// interchangeable, which lets the index answer from its cells instead of + /// reading every marker. It declines — and this falls back to the full + /// query — when its cells are too coarse to honour the separation, so the + /// caller still has to apply the real rule to what comes back. + /// + /// Mirrors `findMarkersInBounds(bounds, minSeparationDegrees)` in + /// android-sdk. + public func findMarkersInBounds( + _ bounds: GeoRectBounds, + minSeparationDegrees: Double + ) -> [MarkerEntity] { + if bounds.isEmpty { return [] } + + lock.lock() + if usableLocked("findMarkersInBounds"), entities.count > minMarkerCount, + let thinned = gridIndex.inBoundsThinned(bounds, minSeparationDegrees: minSeparationDegrees) { + lock.unlock() + return thinned + } + lock.unlock() + + return findMarkersInBounds(bounds) + } + public func getMemoryStats() -> MarkerManagerStats { lock.lock() defer { lock.unlock() } diff --git a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift index 9d3d097..fd884a1 100644 --- a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift +++ b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift @@ -385,7 +385,23 @@ public final class MarkerTileRenderer: TileProvider { // // longdo のようにタイル専用の manager を別に持つプロバイダでは全 entity が // tiling = true なので、この絞り込みは何もしない。 - return markerManager.findMarkersInBounds(expanded).filter { $0.tiling } + // declutter が効いているときは index の段階で間引く。 + // + // 呼び出し側が「これより近いマーカーは入れ替え可能」と言っているので、 + // index は自分のセルから答えてよい。zoom 9 なら東京の街路樹 144,183 本 + // ではなく、それを含む 5,000 セルほどを読むだけで済む。 + // + // ここを飛ばして後段の辞書で間引いていたときは、捨てるぶんの配置と + // 画像まで先に作っていたので、declutter を入れるほど遅くなっていた + // (20,000 マーカーで 82.8ms -> 178.5ms)。index が粗すぎて分離を + // 保証できない場合は全件クエリに落ちるので、後段の間引きは残してある。 + let separationDegrees = declutterPx > 0 + ? max(span.latitude, span.longitude) * Double(declutterPx) / tilePx + : 0.0 + let found = separationDegrees > 0.0 + ? markerManager.findMarkersInBounds(expanded, minSeparationDegrees: separationDegrees) + : markerManager.findMarkersInBounds(expanded) + return found.filter { $0.tiling } } private func tileToGeoPoint(x: Double, y: Double, z: Double) -> GeoPoint { diff --git a/Tests/MapConductorCoreTests/IconSizeProbeTests.swift b/Tests/MapConductorCoreTests/IconSizeProbeTests.swift new file mode 100644 index 0000000..baaf36c --- /dev/null +++ b/Tests/MapConductorCoreTests/IconSizeProbeTests.swift @@ -0,0 +1,78 @@ +import UIKit +import XCTest + +@testable import MapConductorCore + +/// アイコンが実際に何ピクセルで描かれるかを、出来上がったタイルから数える。 +/// +/// android-sdk の `IconSizeProbeTest` と対になっていて、同じ 14 単位の円を、 +/// 同じ zoom・同じ iconScaleCallback で描いて比べる。計算で追うと前提を一つ +/// 間違えるだけで答えが変わるので、描いた結果を測る。 +final class IconSizeProbeTests: XCTestCase { + + func testDrawnIconSize() { + let screenScale = UIScreen.main.scale + // プロバイダと同じ組み立て(GoogleMapMarkerController.setupTileRenderer): + // タイルは Retina 倍、コールバックも画面スケール倍して渡す。 + let tileSize = 256 * max(1, Int(screenScale)) + let contentScale = Double(screenScale) + let callbackScale = 1.4 // サンプルの zoom > 15 の帯 + + // サンプルと同じ作り: 14 ポイントの円。 + let sizePt: CGFloat = 10 + let image = UIGraphicsImageRenderer(size: CGSize(width: sizePt, height: sizePt)).image { ctx in + UIColor.red.setFill() + ctx.cgContext.fillEllipse(in: CGRect(x: 0.5, y: 0.5, width: sizePt - 1, height: sizePt - 1)) + } + let icon = ImageIcon(image: image, iconSize: sizePt) + + let zoom = 16 + let n = Double(1 << zoom) + let lat = 35.68, lon = 139.75 + let latRad = lat * .pi / 180 + let tx = Int((lon + 180.0) / 360.0 * n) + let ty = Int((1.0 - log(tan(latRad) + 1.0 / cos(latRad)) / .pi) / 2.0 * n) + + let manager = MarkerManager.defaultManager(minMarkerCount: 1) + manager.registerEntity( + MarkerEntity( + marker: nil, + state: MarkerState(position: GeoPoint(latitude: lat, longitude: lon), icon: icon), + visible: true, isRendered: true, tiling: true + ) + ) + let renderer = MarkerTileRenderer( + markerManager: manager, + tileSize: tileSize, + cacheSizeBytes: 1 << 20, + iconScaleCallback: { _, _ in callbackScale * contentScale } + ) + + guard let data = renderer.renderTile(request: TileRequest(x: tx, y: ty, z: zoom)), + let cg = UIImage(data: data)?.cgImage else { + return XCTFail("タイルが描けていない") + } + + let w = cg.width, h = cg.height + var pixels = [UInt8](repeating: 0, count: w * h * 4) + CGContext( + data: &pixels, width: w, height: h, bitsPerComponent: 8, bytesPerRow: w * 4, + space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue + )!.draw(cg, in: CGRect(x: 0, y: 0, width: w, height: h)) + + var minX = w, maxX = -1 + for y in 0.. 8 { + minX = min(minX, x); maxX = max(maxX, x) + } + } + let drawnPx = maxX - minX + 1 + // タイルは 256pt として表示されるので、見かけの大きさはこの比。 + let apparentPt = Double(drawnPx) / Double(w) * 256.0 + print(String( + format: "ICONPROBE ios scale=%.2f tile=%d canvas=%d iconSize=%.0f drawnPx=%d apparentPt=%.2f", + screenScale, tileSize, w, sizePt, drawnPx, apparentPt)) + XCTAssertGreaterThan(drawnPx, 0) + } +} diff --git a/Tests/MapConductorCoreTests/MarkerGridIndexTests.swift b/Tests/MapConductorCoreTests/MarkerGridIndexTests.swift index 99b7984..30ecd10 100644 --- a/Tests/MapConductorCoreTests/MarkerGridIndexTests.swift +++ b/Tests/MapConductorCoreTests/MarkerGridIndexTests.swift @@ -148,4 +148,66 @@ final class MarkerGridIndexTests: XCTestCase { let deltaLon = entity.state.position.longitude - point.longitude return deltaLat * deltaLat + deltaLon * deltaLon } + + /// 間引きクエリは、覆ったセルすべてから 1 本ずつ返す。 + /// + /// 呼び出し側は自分でも 1 セル 1 本に落とすつもりでこれを呼ぶ。返ってきては + /// 困るのは**穴**で、箱の中にマーカーを持つセルが何も返さないと、地図上では + /// 街路樹の無い一角になり、どこにもエラーは出ない。 + /// + /// android-sdk の `thinnedQueryKeepsOneMarkerFromEveryCellItCovers` と同じ。 + func testThinnedQueryKeepsOneMarkerFromEveryCellItCovers() { + let markers = scatter(count: 20_000, latitude: 35.68, longitude: 139.76, spread: 0.4) + let index = MarkerGridIndex { markers } + let box = bounds(35.60, 139.68, 35.76, 139.84) + + guard let kept = index.inBoundsThinned(box, minSeparationDegrees: 0.01) else { + return XCTFail("0.01 度はセルより粗いので、必ず答えられるはず") + } + + let inside = markers.filter { box.contains(point: $0.state.position) } + XCTAssertGreaterThan(inside.count, 1_000, "比較できるだけの中身が要る") + + // index と同じ前提: セルは一辺 0.005 度。 + func cellOf(_ entity: MarkerEntity) -> String { + let lat = (entity.state.position.latitude / 0.005).rounded(.down) + let lon = (entity.state.position.longitude / 0.005).rounded(.down) + return "\(lat),\(lon)" + } + + for entity in kept { + XCTAssertTrue(box.contains(point: entity.state.position), "箱の外のマーカーを返した") + } + XCTAssertEqual( + Set(inside.map(cellOf)), Set(kept.map(cellOf)), + "埋まっているセルにつき 1 本、多くも少なくもなく" + ) + XCTAssertEqual(Set(kept.map(cellOf)).count, kept.count, "同じセルから 2 本返っている") + // 箱は一辺 0.16 度で約 1,024 セル、その中にこのマーカーが 3,200 本ほど + // 入る -- 1 セルあたり 3 本。これが無いと、間引く必要のないほど疎な + // データでも上の assert が通ってしまい、何も証明しない。 + XCTAssertLessThan(kept.count * 2, inside.count, "間引きを働かせるには疎すぎる") + } + + /// セルが呼び出し側の分離距離より粗いと、頼まれた以上に間引いてしまう。 + func testThinnedQueryDeclinesWhenItsCellsAreTooCoarse() { + let index = MarkerGridIndex { + self.scatter(count: 2_000, latitude: 35.68, longitude: 139.76, spread: 0.4) + } + XCTAssertNil(index.inBoundsThinned(bounds(35.6, 139.7, 35.7, 139.8), minSeparationDegrees: 0.004)) + } + + /// 通常クエリが覚えた日付変更線の折り返しは、ここでも成り立つ必要がある。 + func testThinnedQueryCrossesTheAntimeridian() { + let markers = [ + entity(0, -18.0, 179.99), + entity(1, -18.0, -179.99), + entity(2, -18.0, 178.0), + ] + let index = MarkerGridIndex { markers } + guard let kept = index.inBoundsThinned(bounds(-18.5, 179.5, -17.5, -179.5), minSeparationDegrees: 0.01) else { + return XCTFail("答えられるはず") + } + XCTAssertEqual(ids(kept), ["0", "1"]) + } } diff --git a/Tests/MapConductorCoreTests/MarkerTileCostTests.swift b/Tests/MapConductorCoreTests/MarkerTileCostTests.swift new file mode 100644 index 0000000..690032c --- /dev/null +++ b/Tests/MapConductorCoreTests/MarkerTileCostTests.swift @@ -0,0 +1,132 @@ +import XCTest + +@testable import MapConductorCore + +/// マーカータイル 1 枚の実測コスト。 +/// +/// android-vectortile の `MarkerTileCostTest` と**同じ条件**で回す。同じ LCG +/// シード、同じ緯度経度の分布、同じマーカー数、同じタイルサイズ、同じズーム。 +/// 乱数まで揃えてあるので、両者の数字は直接比べられる。 +/// +/// 片方が遅いという話は、実装のどこが遅いか分かるまで意味を持たない。 +/// レンダリングをさらに query / prepare / draw に割る `tileCostBreakdown` を +/// 用意してあるのはそのため。 +final class MarkerTileCostTests: XCTestCase { + + private let tileSize = 512 + + /// android 側と同じ線形合同法。定数まで同じなので、同じ順で同じ座標が出る。 + private struct Lcg { + private var seed: UInt64 = 12345 + mutating func next() -> Double { + seed = seed &* 6_364_136_223_846_793_005 &+ 1_442_695_040_888_963_407 + return Double(seed >> 11) / Double(UInt64(1) << 53) + } + } + + private func manager(_ count: Int) -> MarkerManager { + let manager = MarkerManager.defaultManager(minMarkerCount: 1) + var lcg = Lcg() + for _ in 0.., + declutterPx: Int = 0 + ) -> MarkerTileRenderer { + MarkerTileRenderer( + markerManager: manager, + tileSize: tileSize, + cacheSizeBytes: 8 * 1024 * 1024, + declutterPx: declutterPx + ) + } + + private func median(_ values: [Double]) -> Double { + values.sorted()[values.count / 2] + } + + /// タイルの中心が東京になるズーム別の x/y。android 側と同じ式。 + private func tileXY(zoom: Int) -> (Int, Int) { + let n = Double(1 << zoom) + let lat = 35.68 * .pi / 180 + let x = Int((139.75 + 180.0) / 360.0 * n) + let y = Int((1.0 - log(tan(lat) + 1.0 / cos(lat)) / .pi) / 2.0 * n) + return (x, y) + } + + func testTileCost() throws { + for count in [2_000, 20_000] { + let live = manager(count) + for declutter in [0, 14] { + let render = renderer(live, declutterPx: declutter) + for zoom in [6, 12] { + let (x, y) = tileXY(zoom: zoom) + let request = TileRequest(x: x, y: y, z: zoom) + + // 1 枚目はキャッシュも何も温まっていない。中央値を採る。 + var samples: [Double] = [] + var bytes = 0 + for _ in 0..<5 { + render.clear() + let started = DispatchTime.now().uptimeNanoseconds + let data = render.renderTile(request: request) + samples.append(Double(DispatchTime.now().uptimeNanoseconds - started) / 1_000_000) + bytes = data?.count ?? 0 + } + print( + String( + format: "MARKERTILE n=%d declutter=%d z=%d render=%.1fms png=%dB", + count, declutter, zoom, median(samples), bytes + ) + ) + } + } + } + } + + /// 街路樹サンプルと同じ規模。android-vectortile の `StreetTreeCostTest` が + /// 東京の 144,183 本で測っているズームに合わせてある。 + /// + /// 数字そのものはハードウェアが違うので android と直接は比べられないが、 + /// **declutter を入れて速くなるか遅くなるか**は比べられる。android は + /// z=9 で 2140ms -> 109ms になる。 + func testStreetTreeScale() throws { + let live = manager(144_183) + for declutter in [0, 14] { + for zoom in [9, 11, 12, 14] { + let (x, y) = tileXY(zoom: zoom) + let request = TileRequest(x: x, y: y, z: zoom) + let render = renderer(live, declutterPx: declutter) + var samples: [Double] = [] + var bytes = 0 + for _ in 0..<3 { + render.clear() + let started = DispatchTime.now().uptimeNanoseconds + let data = render.renderTile(request: request) + samples.append(Double(DispatchTime.now().uptimeNanoseconds - started) / 1_000_000) + bytes = data?.count ?? 0 + } + print( + String( + format: "TREES declutter=%d z=%d render=%.0fms png=%dKB", + declutter, zoom, median(samples), bytes / 1024 + ) + ) + } + } + } +} From 803ece5f851b97fb87a92c8614e9a59f1a07cb74 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Mon, 21 Sep 2026 22:40:22 +0900 Subject: [PATCH 14/28] Rebuild the marker grid on square Morton cells The flat 0.005-degree grid could answer at exactly one scale. The key is now a Morton code over a hierarchy that starts from two square root cells (the hemispheres), so every prefix of a key is a cell and a query walks the level its box calls for. Square cells matter: the geomodel root made every cell twice as wide as tall, so satisfying a separation in longitude over-resolved latitude and each tile query returned twice the markers it kept (9,715 returned, 2,156 kept at z11; 52ms -> 32ms a tile on device). Thinned queries pick their winner without looking at the box, because two neighbouring tiles ask about the same border cell with different boxes, and disagreeing about the winner cuts an icon down the seam. The geocell string (hemisphere digit + 0123456789abcdef) is what the three SDKs' conformance fixtures compare; android-sdk and react-sdk generate byte-identical answers from the same vectors. --- .../MapConductorCore/marker/MarkerGrid.swift | 245 ++++++++++++++++++ .../marker/MarkerGridIndex.swift | 234 +++++++++-------- .../GeocellConformanceTests.swift | 100 +++++++ .../MarkerGridIndexTests.swift | 116 +++++++-- .../Resources/geocell-expected.txt | 82 ++++++ .../Resources/geocell-vectors.txt | 146 +++++++++++ 6 files changed, 789 insertions(+), 134 deletions(-) create mode 100644 Sources/MapConductorCore/marker/MarkerGrid.swift create mode 100644 Tests/MapConductorCoreTests/GeocellConformanceTests.swift create mode 100644 Tests/MapConductorCoreTests/Resources/geocell-expected.txt create mode 100644 Tests/MapConductorCoreTests/Resources/geocell-vectors.txt diff --git a/Sources/MapConductorCore/marker/MarkerGrid.swift b/Sources/MapConductorCore/marker/MarkerGrid.swift new file mode 100644 index 0000000..ecd6820 --- /dev/null +++ b/Sources/MapConductorCore/marker/MarkerGrid.swift @@ -0,0 +1,245 @@ +import Foundation + +/// The cell arithmetic behind `MarkerGridIndex`, with no marker in sight. +/// +/// Kept apart from the index for two reasons. The index is generic over the +/// marker type, and Swift will not let a generic type hold a stored static, so +/// every constant here would have had to be a computed property returning a +/// literal. More to the point, none of this depends on what a marker is: it is +/// a way of naming a patch of the globe, and the conformance fixtures the three +/// SDKs share test it on its own. +/// +/// ## The scheme +/// +/// The world starts as **two square cells** — the western and eastern halves, +/// 180 degrees on a side — and each is halved in latitude and in longitude, +/// repeatedly. The key records the half chosen each time, latitude bit above +/// longitude bit, under the bit that says which hemisphere it started in. That +/// makes **every prefix of a key a cell:** dropping the low `2n` bits names the +/// cell `n` levels up, and all of its children share the prefix, so they form +/// one run in a sorted array. A query picks the level that suits its box +/// instead of paying the finest one. +/// +/// ## Why two root cells and not one +/// +/// One root cell covering the whole globe is what cordova-plugin-googlemaps' +/// `geomodel.js` uses, and it is what this started as. It makes every cell +/// **twice as wide as it is tall**, because the same number of divisions covers +/// 360 degrees of longitude and 180 of latitude. +/// +/// That costs real time. A query asks for cells no wider than some separation; +/// with a 2:1 cell, satisfying the width over-resolves the height by a factor +/// of two, so the query walks twice the cells and returns twice the markers it +/// asked for. Measured on Tokyo's 144,183 street trees at zoom 11, a tile +/// returned 9,715 markers of which the caller kept 2,156, and the work that +/// scales with that count — the walk, positioning each marker, and grouping +/// them — was 44 ms of the tile's 52 ms. +/// +/// Splitting the root into two square halves removes the factor of two. The +/// string form keeps its shape: a hemisphere digit followed by geocell +/// characters over `0123456789abcdef`, one per 4x4 subdivision, and a prefix is +/// still a cell. What it is no longer is byte-identical to `geomodel.js`. +/// +/// The three SDKs hold the key as a `Long`, an `Int64` and a `number`; the +/// string is what their conformance fixtures compare, because it does not +/// depend on that choice. +enum MarkerGrid { + + /// Levels of 2x2 subdivision below the two root cells. + /// + /// 18 is the largest depth that still leaves room for the position: the key + /// is `2 * 18 + 1 = 37` bits — the extra one is the hemisphere — and the + /// position below it is 24, which is 61 of the 63 an `Int64` has. It is + /// also an even number of levels, so the string form packs into whole + /// 4-bit characters with no ragged tail. + /// + /// A cell at the bottom is 0.000687 degrees on a side, about 76 m at the + /// equator. The flat grid this replaced was 0.005 degrees. + static var gridDepth: Int64 { 18 } + + /// Roughly how many cells across a box a query aims to walk. + /// + /// The level is chosen so the box covers about this many cells per axis, + /// which bounds the walk at `cellsAcross^2` lookups no matter how large the + /// box is. That is what removed the old "past 4096 cells, scan everything + /// instead" escape: a world-sized box now asks a coarse level and reads + /// roughly the markers it would have scanned anyway, without the cliff. + static var cellsAcross: Double { 32 } + + /// The most cells a query walks along either axis. + /// + /// Only bites on a box so flat or so narrow that its area says nothing + /// about how many cells it crosses. + static var maxCellsPerAxis: Double { 64 } + + // MARK: - Cells + + /// Degrees a cell spans, on either axis. Cells are square. + static func cellSize(_ level: Int64) -> Double { 180.0 / Double(Int64(1) << level) } + + /// Rows of cells from pole to pole at `level`. + static func rows(_ level: Int64) -> Int64 { Int64(1) << level } + + /// Columns of cells around the globe at `level`. Twice the rows, because + /// the world is twice as wide as it is tall and the cells are square. + static func columns(_ level: Int64) -> Int64 { Int64(1) << (level + 1) } + + /// The coarsest level whose cells are no wider than `separation`, or nil if + /// even the bottom level is coarser than that. + /// + /// Counted up rather than solved with a logarithm, because the three SDKs + /// have to agree on the answer and they do not have the same `log2`. Java + /// has none at all — Kotlin computes `ln(x) / ln(2)`, which is off by an ulp + /// where the true answer is a whole number, and the `ceil` above it turns + /// that ulp into a different level. Halving a double and comparing it is + /// exact on all three. + static func level(forSeparation separation: Double) -> Int64? { + guard separation > 0 else { return nil } + var level: Int64 = 0 + while level <= gridDepth { + if cellSize(level) <= separation { return level } + level += 1 + } + return nil + } + + /// The level a bounds query walks, chosen so the box covers about + /// `cellsAcross` squared cells. + /// + /// Counted up for the same reason as `level(forSeparation:)`. + /// + /// The area rule alone is not enough. A box with no height — a click box + /// flattened by a degenerate projection, a bounds built from two points on + /// the same parallel — has an area of nothing, which asks for the bottom + /// level, which is a quarter of a million columns to walk. `maxCellsPerAxis` + /// steps back up until neither axis is absurd. On a box of ordinary shape + /// the area rule binds first and this does nothing. + static func queryLevel(latSpan: Double, lonSpan: Double) -> Int64 { + let area = max(lonSpan, 1e-12) * max(latSpan, 1e-12) + // cells at a level = area / cellSize^2, and cellSize = 180 / 2^level + let budget = cellsAcross * cellsAcross * 180.0 * 180.0 + var level: Int64 = 0 + while level < gridDepth, area * Double(Int64(1) << (2 * (level + 1))) <= budget { + level += 1 + } + while level > 0, + lonSpan / cellSize(level) > maxCellsPerAxis + || latSpan / cellSize(level) > maxCellsPerAxis { + level -= 1 + } + return level + } + + /// How far east the box runs, from its west edge to its east one. + /// + /// A box crossing the antimeridian has its east corner west of its west + /// one, and a padded box can run past ±180 outright. Normalising to a + /// single eastward span removes both cases: everything downstream walks + /// east from the west edge for this many degrees, and never compares two + /// longitudes. + static func eastwardSpan(from west: Double, to east: Double) -> Double { + if east - west >= 360.0 { return 360.0 } + return (((east - west).truncatingRemainder(dividingBy: 360.0)) + 360.0) + .truncatingRemainder(dividingBy: 360.0) + } + + /// The columns a box covers: where to start, and how many to walk. + /// + /// The end column is taken from `west + span`, not from the east corner. + /// Taking it from the corner cannot work once column indices fold: the + /// column holding 180 and the column holding -180 are the same one, so a + /// box from -180.2 to 179.8 starts and ends on the same column and the walk + /// covers one column out of the level's many. Nothing errors; the query + /// simply answers for a thin slice of the world. + /// + /// The old row-major key did not have this hazard, because it indexed on + /// unwrapped column numbers that kept growing eastward. Folding is what + /// makes a Morton key a fixed width, so the walk has to carry the span + /// itself. + static func columnWalk( + from west: Double, + spanning span: Double, + level: Int64 + ) -> (start: Int64, count: Int64) { + let total = columns(level) + let start = Int64(((west + 180.0) / 360.0 * Double(total)).rounded(.down)) + let end = Int64(((west + span + 180.0) / 360.0 * Double(total)).rounded(.down)) + // A full turn ends on the column it started on; walking both would + // return that column's markers twice. + return (start, min(end - start + 1, total)) + } + + static func latCell(_ latitude: Double, level: Int64) -> Int64 { + let count = rows(level) + let at = Int64(((latitude + 90.0) / 180.0 * Double(count)).rounded(.down)) + return min(max(at, 0), count - 1) + } + + static func lonCell(_ longitude: Double, level: Int64) -> Int64 { + let count = columns(level) + let at = Int64(((longitude + 180.0) / 360.0 * Double(count)).rounded(.down)) + return wrap(at, level: level) + } + + static func wrap(_ lonCell: Int64, level: Int64) -> Int64 { + let count = columns(level) + return ((lonCell % count) + count) % count + } + + static func mortonKey(for position: GeoPointProtocol) -> Int64 { + morton( + latCell(position.latitude, level: gridDepth), + lonCell(position.longitude, level: gridDepth), + level: gridDepth + ) + } + + /// Interleaves the two indices, latitude in the odd bits, under the bit + /// that says which root cell they are in. + /// + /// Longitude carries one bit more than latitude — twice as many columns as + /// rows — and that top bit is the hemisphere. It sits above the interleaved + /// pairs rather than inside them, so dropping the low two bits still names + /// the parent cell. + static func morton(_ latCell: Int64, _ lonCell: Int64, level: Int64) -> Int64 { + let hemisphere = lonCell >> level + let within = lonCell & ((Int64(1) << level) - 1) + return (hemisphere << (2 * level)) | (spread(latCell) << 1) | spread(within) + } + + /// Spreads a value's bits apart, leaving a zero between each pair. + private static func spread(_ value: Int64) -> Int64 { + var x = UInt64(bitPattern: value) & 0xFFFF_FFFF + x = (x | (x << 16)) & 0x0000_FFFF_0000_FFFF + x = (x | (x << 8)) & 0x00FF_00FF_00FF_00FF + x = (x | (x << 4)) & 0x0F0F_0F0F_0F0F_0F0F + x = (x | (x << 2)) & 0x3333_3333_3333_3333 + x = (x | (x << 1)) & 0x5555_5555_5555_5555 + return Int64(bitPattern: x) + } + + /// The cell's name as a string: a hemisphere digit, then one character per + /// 4x4 subdivision over `0123456789abcdef`. + /// + /// Each character after the first is two levels of this grid, so a string of + /// `characters` names the cell at level `2 * (characters - 1)`. Not used by + /// the index itself — the key is the same information, and faster — but it + /// is the form the three SDKs' conformance fixtures compare, because it does + /// not depend on how a platform stores an integer. + static func geocell(latitude: Double, longitude: Double, characters: Int) -> String { + let alphabet = Array("0123456789abcdef") + let level = min(Int64(max(characters - 1, 0)) * 2, gridDepth) + let key = morton( + latCell(latitude, level: level), + lonCell(longitude, level: level), + level: level + ) + var text = String(key >> (2 * level)) + var at = level * 2 - 4 + while at >= 0 { + text.append(alphabet[Int((key >> at) & 0xF)]) + at -= 4 + } + return text + } +} diff --git a/Sources/MapConductorCore/marker/MarkerGridIndex.swift b/Sources/MapConductorCore/marker/MarkerGridIndex.swift index 2a20bfc..f88dd0d 100644 --- a/Sources/MapConductorCore/marker/MarkerGridIndex.swift +++ b/Sources/MapConductorCore/marker/MarkerGridIndex.swift @@ -1,6 +1,6 @@ import Foundation -/// A uniform lat/lng grid over the markers, held as one sorted array of Int64. +/// A hierarchical lat/lng grid over the markers, held as one sorted array of Int64. /// /// Replaces the hex-cell registry on the paths that run per tile. That index was /// built at a fixed zoom of 20, which puts a cell at about 12 cm — street trees @@ -11,57 +11,42 @@ import Foundation /// /// Each marker is one Int64: its cell key above its position in a snapshot, so /// building the index is arithmetic and a sort of a contiguous buffer — no -/// objects, no hashing, no strings. A bounds query walks the cells the box -/// covers and binary-searches each one's run. +/// objects, no hashing, no strings. +/// +/// The key itself is a Morton code over a hierarchy of cells, described in +/// `MarkerGrid`. What it buys the index is that a cell at *any* level is one +/// contiguous run, so a query walks the level that suits its box rather than +/// the finest one — the first version had a single fixed cell size of 0.005 +/// degrees, and a continent-wide box paid for it. /// /// Not synchronised. `MarkerManager` holds its lock across every call, and /// taking a second one here would only add cost to a path that is already /// serialised. /// -/// The Android and web SDKs index the same way, with the same cell size. +/// The Android and web SDKs index the same way, to the same depth. final class MarkerGridIndex { - /// About 450 m at Tokyo's latitude. - /// - /// Chosen by measurement rather than by round number: on 144k markers a - /// tile-sized query took 0.06 ms here, 0.03 ms at 0.001 degrees and 2.31 ms - /// at 0.02 degrees — the last no better than scanning, because a cell that - /// size returns five times the markers a tile needs. Finer wins on dense - /// data and loses on sparse, where a tile spans more empty cells than it - /// saves. - private static var cellDegrees: Double { 0.005 } - - /// Past this many cells, scan every marker instead. - /// - /// A query covering most of the world touches more empty cells than there - /// are markers. Measured on the same 144k: a box over all of Tokyo costs - /// 2.27 ms through the grid and 1.98 ms scanning, so the index stops paying - /// for itself well before the pathological case. - private static var maxCellsPerQuery: Int64 { 4096 } - - /// Roughly 45 km of rings before giving up and scanning. - private static var maxNearestRings: Int64 { 100 } - - /// Columns around the globe: the wrap the ring and box walks fold on. - private static var lonCells: Int64 { Int64(360.0 / cellDegrees) } - private static var minLonCell: Int64 { -lonCells / 2 } - - private static func wrapLon(_ lonCell: Int64) -> Int64 { - let span = lonCells - return minLonCell + ((lonCell - minLonCell) % span + span) % span - } /// 24 bits of position, enough for 16.7M markers, under the cell key. - /// 間引きクエリが index を使う上限のセル数。これを超える箱は、セルを - /// 歩くより全件を走査したほうが安い。android の - /// `MAX_CELLS_PER_THINNED_QUERY` と同じ値。 - private static var maxCellsPerThinnedQuery: Int64 { 1 << 18 } - private static var indexBits: Int64 { 24 } private static var indexMask: Int64 { (1 << 24) - 1 } + /// Past this many cells, decline the thinned query. + /// + /// Thinning cannot choose its own level — the caller's separation fixes it — + /// so this bound stays. Same value as android's + /// `MAX_CELLS_PER_THINNED_QUERY`. + private static var maxCellsPerThinnedQuery: Int64 { 1 << 18 } + + /// The level `nearest` walks its rings at, and the reach that buys. + /// + /// Level 15 is 0.0055 degrees on a side, matching the flat cell this index + /// used to have, so 100 rings is about 45 km as before. + private static var nearestLevel: Int64 { 15 } + private static var maxNearestRings: Int64 { 100 } + private let source: () -> [MarkerEntity] private var snapshot: [MarkerEntity] = [] - /// Sorted `(cellKey << indexBits) | position-in-snapshot`. + /// Sorted `(mortonKey << indexBits) | position-in-snapshot`. private var packed: [Int64] = [] private var dirty = true @@ -84,26 +69,30 @@ final class MarkerGridIndex { func inBounds(_ bounds: GeoRectBounds) -> [MarkerEntity] { guard let southWest = bounds.southWest, let northEast = bounds.northEast else { return [] } - let latFrom = Self.cell(southWest.latitude) - let latTo = Self.cell(northEast.latitude) - let lonFrom = Self.cell(southWest.longitude) - let lonTo = Self.cell(northEast.longitude) - // A box crossing the antimeridian has its east corner west of its west // one. Walking to the unwrapped end and folding each column back onto // the globe covers both halves without a second loop — and without the // `lonFrom...lonTo` that traps on a reversed range. - let lonEnd = northEast.longitude < southWest.longitude ? lonTo + Self.lonCells : lonTo - - if (latTo - latFrom + 1) * (lonEnd - lonFrom + 1) > Self.maxCellsPerQuery { - return source().filter { bounds.contains(point: $0.state.position) } - } + let lonSpan = MarkerGrid.eastwardSpan(from: southWest.longitude, to: northEast.longitude) + let level = MarkerGrid.queryLevel( + latSpan: northEast.latitude - southWest.latitude, + lonSpan: lonSpan + ) + let latFrom = MarkerGrid.latCell(southWest.latitude, level: level) + let latTo = MarkerGrid.latCell(northEast.latitude, level: level) + if latTo < latFrom { return [] } + let columns = MarkerGrid.columnWalk(from: southWest.longitude, spanning: lonSpan, level: level) rebuildIfNeeded() var found: [MarkerEntity] = [] for latCell in latFrom...latTo { - for lonCell in lonFrom...lonEnd { - forEach(inCell: Self.cellKey(latCell, Self.wrapLon(lonCell))) { entity in + for step in 0.. { return found } - /// The markers in `bounds`, at most one per cell. + /// One marker for each cell the bounds touch. /// /// The caller has said that markers closer together than /// `minSeparationDegrees` are interchangeable, so the index is free to hand @@ -122,11 +111,34 @@ final class MarkerGridIndex { /// 0.72 microseconds — looking at the full set is 100 ms before anything is /// done with it. /// - /// A cell wholly inside the box needs no containment test, and the last - /// entry of its run can be taken without looking at the rest. + /// The level comes from the separation: the coarsest one whose cells are no + /// wider than the caller asked for. + /// + /// ## Why the winner cannot depend on the bounds + /// + /// A cell's representative is the **last entry of its run, always** — not + /// the last entry that falls inside the bounds. The difference is what a + /// map made of tiles looks like at the seams. + /// + /// Tiles are rendered one at a time, each asking for its own box grown by + /// the icon overhang. A cell straddling the boundary is asked about twice, + /// by two different boxes. Choose the winner from what is inside the box + /// and the two tiles choose **different markers:** one marker gets its left + /// half drawn on the left tile and nothing on the right, so the icon is cut + /// down the seam with no error anywhere. Measured on Tokyo's street trees, + /// 74 markers at zoom 9 and 84 at zoom 10 were drawn by one tile and not by + /// its neighbour. + /// + /// Choosing without looking at the box removes the disagreement: a marker + /// whose icon reaches the next tile is inside that tile's grown box too, so + /// that tile asks about the same cell and gets the same answer. /// - /// Returns nil when the index cannot help: cells coarser than the caller's - /// separation would thin more than it asked for, and a box spanning more + /// A returned marker may therefore lie just outside `bounds`, by less than + /// one cell. The renderer clips it; what it must not do is filter the list + /// back down to the box, because that would put the disagreement back. + /// + /// Returns nil when the index cannot help: a separation finer than the + /// bottom level would thin more than it asked for, and a box spanning more /// cells than `maxCellsPerThinnedQuery` is cheaper to scan. /// /// Mirrors `MarkerGridIndex.inBoundsThinned` in android-sdk. @@ -134,46 +146,37 @@ final class MarkerGridIndex { _ bounds: GeoRectBounds, minSeparationDegrees: Double ) -> [MarkerEntity]? { - if minSeparationDegrees < Self.cellDegrees { return nil } + guard let level = MarkerGrid.level(forSeparation: minSeparationDegrees) else { return nil } guard let southWest = bounds.southWest, let northEast = bounds.northEast else { return nil } - let latFrom = Self.cell(southWest.latitude) - let latTo = Self.cell(northEast.latitude) - let lonFrom = Self.cell(southWest.longitude) - let lonTo = Self.cell(northEast.longitude) - // As in `inBounds`: a box crossing the antimeridian has its east corner - // west of its west one, so walk to the unwrapped end and fold back. - let lonEnd = northEast.longitude < southWest.longitude ? lonTo + Self.lonCells : lonTo + let lonSpan = MarkerGrid.eastwardSpan(from: southWest.longitude, to: northEast.longitude) + let latFrom = MarkerGrid.latCell(southWest.latitude, level: level) + let latTo = MarkerGrid.latCell(northEast.latitude, level: level) + if latTo < latFrom { return [] } + let columns = MarkerGrid.columnWalk(from: southWest.longitude, spanning: lonSpan, level: level) - if (latTo - latFrom + 1) * (lonEnd - lonFrom + 1) > Self.maxCellsPerThinnedQuery { return nil } + if (latTo - latFrom + 1) * columns.count > Self.maxCellsPerThinnedQuery { return nil } rebuildIfNeeded() + let shift = Self.indexBits + 2 * (MarkerGrid.gridDepth - level) var found: [MarkerEntity] = [] for latCell in latFrom...latTo { - let latInside = latCell > latFrom && latCell < latTo - for lonCell in lonFrom...lonEnd { - let key = Self.cellKey(latCell, Self.wrapLon(lonCell)) - let at = lowerBound(key << Self.indexBits) + for step in 0..= packed.count { continue } - let limit = (key + 1) << Self.indexBits + let limit = (key + 1) << shift if packed[at] >= limit { continue } - - if latInside && lonCell > lonFrom && lonCell < lonEnd { - var last = at - while last + 1 < packed.count && packed[last + 1] < limit { last += 1 } - found.append(snapshot[Int(packed[last] & Self.indexMask)]) - continue - } - // On the border the cell straddles the box, so the last entry - // inside it is not necessarily the last entry of the run. - var winner: MarkerEntity? - var cursor = at - while cursor < packed.count && packed[cursor] < limit { - let entity = snapshot[Int(packed[cursor] & Self.indexMask)] - if bounds.contains(point: entity.state.position) { winner = entity } - cursor += 1 - } - if let winner { found.append(winner) } + // The run's last entry. No containment test anywhere: that is + // the whole point, and it is also why this is cheaper than the + // version that scanned every border cell. + var last = at + while last + 1 < packed.count && packed[last + 1] < limit { last += 1 } + found.append(snapshot[Int(packed[last] & Self.indexMask)]) } } return found @@ -192,22 +195,25 @@ final class MarkerGridIndex { rebuildIfNeeded() if packed.isEmpty { return nil } - let centreLat = Self.cell(position.latitude) - let centreLon = Self.cell(position.longitude) + let level = Self.nearestLevel + let centreLat = MarkerGrid.latCell(position.latitude, level: level) + let centreLon = MarkerGrid.lonCell(position.longitude, level: level) var best: MarkerEntity? var bestDistance = Double.greatestFiniteMagnitude var ring: Int64 = 0 while ring <= Self.maxNearestRings { - forEach(inRing: ring, centreLat: centreLat, centreLon: centreLon) { entity in + forEach(inRing: ring, centreLat: centreLat, centreLon: centreLon, level: level) { entity in let distance = Self.squaredDegrees(entity, position) if distance < bestDistance { bestDistance = distance best = entity } } - let reach = Double(ring) * Self.cellDegrees + // A ring is a square: the nearest unsearched point is `ring` cells + // away on the shorter axis, which is latitude. + let reach = Double(ring) * MarkerGrid.cellSize(level) if best != nil, reach * reach >= bestDistance { break } ring += 1 } @@ -230,27 +236,41 @@ final class MarkerGridIndex { inRing ring: Int64, centreLat: Int64, centreLon: Int64, + level: Int64, _ body: (MarkerEntity) -> Void ) { + func visit(_ latCell: Int64, _ lonCell: Int64) { + let rows = MarkerGrid.rows(level) + if latCell < 0 || latCell >= rows { return } + forEach(inCell: MarkerGrid.morton(latCell, MarkerGrid.wrap(lonCell, level: level), level: level), + level: level, body) + } if ring == 0 { - forEach(inCell: Self.cellKey(centreLat, centreLon), body) + visit(centreLat, centreLon) return } for offset in -ring...ring { - forEach(inCell: Self.cellKey(centreLat - ring, Self.wrapLon(centreLon + offset)), body) - forEach(inCell: Self.cellKey(centreLat + ring, Self.wrapLon(centreLon + offset)), body) + visit(centreLat - ring, centreLon + offset) + visit(centreLat + ring, centreLon + offset) } if ring > 1 { for offset in (-ring + 1)...(ring - 1) { - forEach(inCell: Self.cellKey(centreLat + offset, Self.wrapLon(centreLon - ring)), body) - forEach(inCell: Self.cellKey(centreLat + offset, Self.wrapLon(centreLon + ring)), body) + visit(centreLat + offset, centreLon - ring) + visit(centreLat + offset, centreLon + ring) } } } - private func forEach(inCell key: Int64, _ body: (MarkerEntity) -> Void) { - var at = lowerBound(key << Self.indexBits) - let limit = (key + 1) << Self.indexBits + /// Walks one cell at `level`. Its markers are the run whose keys share the + /// cell's prefix, which is what interleaving the bits bought. + private func forEach( + inCell key: Int64, + level: Int64, + _ body: (MarkerEntity) -> Void + ) { + let shift = Self.indexBits + 2 * (MarkerGrid.gridDepth - level) + var at = lowerBound(key << shift) + let limit = (key + 1) << shift while at < packed.count, packed[at] < limit { body(snapshot[Int(packed[at] & Self.indexMask)]) at += 1 @@ -263,7 +283,7 @@ final class MarkerGridIndex { var keys = [Int64]() keys.reserveCapacity(entities.count) for (at, entity) in entities.enumerated() { - keys.append((Self.cellKey(for: entity.state.position) << Self.indexBits) | Int64(at)) + keys.append((MarkerGrid.mortonKey(for: entity.state.position) << Self.indexBits) | Int64(at)) } keys.sort() snapshot = entities @@ -271,20 +291,6 @@ final class MarkerGridIndex { dirty = false } - private static func cell(_ degrees: Double) -> Int64 { - Int64((degrees / cellDegrees).rounded(.down)) - } - - private static func cellKey(for position: GeoPointProtocol) -> Int64 { - cellKey(cell(position.latitude), cell(position.longitude)) - } - - /// Offsets keep the keys positive, so their ordering matches the numeric - /// ordering the sort and the binary search depend on. - private static func cellKey(_ latCell: Int64, _ lonCell: Int64) -> Int64 { - ((latCell + 262_144) << 20) | (lonCell + 524_288) - } - private func lowerBound(_ target: Int64) -> Int { var low = 0 var high = packed.count diff --git a/Tests/MapConductorCoreTests/GeocellConformanceTests.swift b/Tests/MapConductorCoreTests/GeocellConformanceTests.swift new file mode 100644 index 0000000..465aeb4 --- /dev/null +++ b/Tests/MapConductorCoreTests/GeocellConformanceTests.swift @@ -0,0 +1,100 @@ +import XCTest + +@testable import MapConductorCore + +/// geocell の適合テスト。 +/// +/// 同じ `geocell-vectors.txt` を android-sdk / react-sdk も読む。3 つが同じセルを +/// 名指すことを担保するのが目的で、ここが見ているのはこのプラットフォームの分だけ。 +/// +/// `ProjectionConformanceTests` と同じ作りにしてある。違うのは中身ではなく、 +/// **なぜ文字列で比べるか**のほう。投影は 3 つとも Double を返すので桁を丸めれば +/// 済むが、セルの鍵は Long / Int64 / number と型が違う。JS の `number` は 53 ビット +/// までしか整数を持てず、ビット演算にいたっては 32 ビットに丸められる。数値を +/// そのまま突き合わせると、揃っていないのか表現が違うだけなのか区別できない。 +/// 0123456789abcdef の文字列にしてしまえば、その問いは消える。 +final class GeocellConformanceTests: XCTestCase { + + private func runVectors() throws -> String { + guard let url = Bundle.module.url(forResource: "geocell-vectors", withExtension: "txt") else { + XCTFail("geocell-vectors.txt が見つからない") + return "" + } + var out = "" + for line in try String(contentsOf: url, encoding: .utf8).split(separator: "\n", omittingEmptySubsequences: false) { + let row = line.trimmingCharacters(in: .whitespaces) + if row.isEmpty || row.hasPrefix("#") { continue } + let parts = row.split(separator: "|", omittingEmptySubsequences: false).map(String.init) + switch parts[0] { + case "geocell": + let text = MarkerGrid.geocell( + latitude: Double(parts[1])!, + longitude: Double(parts[2])!, + characters: Int(parts[3])! + ) + out += "geocell|\(parts[1])|\(parts[2])|\(parts[3])|\(text)\n" + case "level": + let level = MarkerGrid.level(forSeparation: Double(parts[1])!) + out += "level|\(parts[1])|\(level.map(String.init) ?? "none")\n" + case "cell": + let level = Int64(parts[3])! + let lat = MarkerGrid.latCell(Double(parts[1])!, level: level) + let lon = MarkerGrid.lonCell(Double(parts[2])!, level: level) + out += "cell|\(parts[1])|\(parts[2])|\(parts[3])|\(lat),\(lon)\n" + case "qlevel": + let level = MarkerGrid.queryLevel(latSpan: Double(parts[1])!, lonSpan: Double(parts[2])!) + out += "qlevel|\(parts[1])|\(parts[2])|\(level)\n" + case "colwalk": + let level = Int64(parts[3])! + let span = MarkerGrid.eastwardSpan(from: Double(parts[1])!, to: Double(parts[2])!) + let walk = MarkerGrid.columnWalk(from: Double(parts[1])!, spanning: span, level: level) + out += "colwalk|\(parts[1])|\(parts[2])|\(parts[3])|\(walk.start),\(walk.count)\n" + case "morton": + let key = MarkerGrid.morton( + Int64(parts[1])!, Int64(parts[2])!, level: Int64(parts[3])! + ) + out += "morton|\(parts[1])|\(parts[2])|\(parts[3])|\(key)\n" + default: + XCTFail("未知の演算: \(parts[0])") + } + } + return out + } + + func testVectorsAllRun() throws { + let actual = try runVectors() + + // 突き合わせに使う。テストの副産物ではなく、これが成果物。 + let destination = FileManager.default.temporaryDirectory + .appendingPathComponent("geocell-actual.ios.txt") + try actual.write(to: destination, atomically: true, encoding: .utf8) + print("GEOCELL_CONFORMANCE_BEGIN") + print(actual, terminator: "") + print("GEOCELL_CONFORMANCE_END") + + XCTAssertFalse(actual.split(separator: "\n").isEmpty, "ベクタが 1 行も処理されていない") + } + + func testMatchesCanonicalIfPresent() throws { + guard let url = Bundle.module.url(forResource: "geocell-expected", withExtension: "txt") else { + throw XCTSkip("正本がまだない") + } + XCTAssertEqual(try String(contentsOf: url, encoding: .utf8), try runVectors()) + } + + /// 深い段の答えは、浅い段の答えを接頭辞に持つ。 + /// + /// 索引が階層として働く条件そのもので、これが崩れていると「粗いセルの + /// マーカーは連続している」という前提が外れ、範囲クエリが静かに取りこぼす。 + func testDeeperCellsExtendShallowerOnes() { + for (latitude, longitude) in [(35.681236, 139.767125), (-33.86882, 151.20929), (0.0, 0.0)] { + var previous = "" + for characters in 1...10 { + let text = MarkerGrid.geocell(latitude: latitude, longitude: longitude, characters: characters) + XCTAssertEqual(text.count, characters) + XCTAssertTrue(text.hasPrefix(previous), "\(text) が \(previous) を接頭辞に持たない") + previous = text + } + } + } +} diff --git a/Tests/MapConductorCoreTests/MarkerGridIndexTests.swift b/Tests/MapConductorCoreTests/MarkerGridIndexTests.swift index 30ecd10..d346361 100644 --- a/Tests/MapConductorCoreTests/MarkerGridIndexTests.swift +++ b/Tests/MapConductorCoreTests/MarkerGridIndexTests.swift @@ -155,46 +155,70 @@ final class MarkerGridIndexTests: XCTestCase { /// 困るのは**穴**で、箱の中にマーカーを持つセルが何も返さないと、地図上では /// 街路樹の無い一角になり、どこにもエラーは出ない。 /// + /// 箱の外のマーカーが混じるのは正しい。セルの代表は箱と無関係に決まるので、 + /// 縁のセルの代表が箱の外に落ちることがある。そこを縁で切り捨てないことが、 + /// 隣のタイルと判断を揃える条件そのもの(`MarkerTileSeamTests`)。 + /// /// android-sdk の `thinnedQueryKeepsOneMarkerFromEveryCellItCovers` と同じ。 func testThinnedQueryKeepsOneMarkerFromEveryCellItCovers() { - let markers = scatter(count: 20_000, latitude: 35.68, longitude: 139.76, spread: 0.4) + let markers = scatter(count: 60_000, latitude: 35.68, longitude: 139.76, spread: 0.4) let index = MarkerGridIndex { markers } let box = bounds(35.60, 139.68, 35.76, 139.84) - guard let kept = index.inBoundsThinned(box, minSeparationDegrees: 0.01) else { - return XCTFail("0.01 度はセルより粗いので、必ず答えられるはず") + // index が選ぶ段を、こちらでも同じ式で出す。0.005 度に対しては段 16 -- + // 偶数段なので geocell でちょうど 9 文字になり、文字列で名指しできる。 + XCTAssertEqual(MarkerGrid.level(forSeparation: 0.005), 16) + func cellOf(_ entity: MarkerEntity) -> String { + MarkerGrid.geocell( + latitude: entity.state.position.latitude, + longitude: entity.state.position.longitude, + characters: 9 + ) + } + + guard let kept = index.inBoundsThinned(box, minSeparationDegrees: 0.005) else { + return XCTFail("0.005 度はセルより粗いので、必ず答えられるはず") } let inside = markers.filter { box.contains(point: $0.state.position) } XCTAssertGreaterThan(inside.count, 1_000, "比較できるだけの中身が要る") - // index と同じ前提: セルは一辺 0.005 度。 - func cellOf(_ entity: MarkerEntity) -> String { - let lat = (entity.state.position.latitude / 0.005).rounded(.down) - let lon = (entity.state.position.longitude / 0.005).rounded(.down) - return "\(lat),\(lon)" - } - - for entity in kept { - XCTAssertTrue(box.contains(point: entity.state.position), "箱の外のマーカーを返した") - } - XCTAssertEqual( - Set(inside.map(cellOf)), Set(kept.map(cellOf)), - "埋まっているセルにつき 1 本、多くも少なくもなく" + // 箱の中にいるマーカーのセルは、1 つ残らず代表を持っていること。 + XCTAssertTrue( + Set(inside.map(cellOf)).isSubset(of: Set(kept.map(cellOf))), + "埋まっているセルのどれかが、代表を返していない" ) XCTAssertEqual(Set(kept.map(cellOf)).count, kept.count, "同じセルから 2 本返っている") - // 箱は一辺 0.16 度で約 1,024 セル、その中にこのマーカーが 3,200 本ほど - // 入る -- 1 セルあたり 3 本。これが無いと、間引く必要のないほど疎な - // データでも上の assert が通ってしまい、何も証明しない。 + // はみ出しは縁のセル 1 つぶんまで。箱は 0.16 度四方で段 16 のセルを + // 縦 58 x 横 30 ほど覆うから、縁は全体の 1 割に満たない。 + let outside = kept.filter { !box.contains(point: $0.state.position) } + XCTAssertLessThan( + Double(outside.count), Double(kept.count) * 0.15, + "縁のセル 1 つぶんでは説明のつかない数が箱の外にいる" + ) + // 箱は一辺 0.16 度で段 16 の正方セル(0.00275 度)を約 3,400 個覆い、 + // その中にこのマーカーが 9,600 本ほど入る -- 1 セルあたり 2.8 本。 + // これが無いと、間引く必要のないほど疎なデータでも上の assert が + // 通ってしまい、何も証明しない。 XCTAssertLessThan(kept.count * 2, inside.count, "間引きを働かせるには疎すぎる") } /// セルが呼び出し側の分離距離より粗いと、頼まれた以上に間引いてしまう。 + /// + /// 平らなグリッドだったころ、この下限は 0.005 度だった。階層になった今は + /// 一番細かい段(根から 18 段、一辺 0.000687 度)が下限で、そこまでは + /// 段を選び直して応じる。ズームが深いところで間引きが効くようになった + /// のはこの差による。 func testThinnedQueryDeclinesWhenItsCellsAreTooCoarse() { let index = MarkerGridIndex { self.scatter(count: 2_000, latitude: 35.68, longitude: 139.76, spread: 0.4) } - XCTAssertNil(index.inBoundsThinned(bounds(35.6, 139.7, 35.7, 139.8), minSeparationDegrees: 0.004)) + let box = bounds(35.6, 139.7, 35.7, 139.8) + XCTAssertNil(index.inBoundsThinned(box, minSeparationDegrees: 0.0005)) + XCTAssertNotNil( + index.inBoundsThinned(box, minSeparationDegrees: 0.001), + "0.001 度は最下段より粗いので、段を選んで応じられるはず" + ) } /// 通常クエリが覚えた日付変更線の折り返しは、ここでも成り立つ必要がある。 @@ -210,4 +234,56 @@ final class MarkerGridIndexTests: XCTestCase { } XCTAssertEqual(ids(kept), ["0", "1"]) } + + /// 段を自分で選ぶようになった以上、どの形の箱でも走査と一致する必要がある。 + /// + /// 四角い箱しか試していないと、新しい段選びの**軸ごとの上限**が効く経路 + /// ---極端に平たい帯、極端に細い縦帯---を一度も通らない。そこを外しても + /// 地図には何も起きず、その形の問い合わせだけが静かにマーカーを落とす。 + /// + /// 全球に近い箱をここに入れてあるのは、実際にそれで落としたからで、 + /// `MarkerGrid.columnWalk` のコメントがその中身。 + /// + /// android-sdk の `boundsQueryMatchesBruteForceForEveryShapeOfBox`、 + /// react-sdk の同名テストと対になる。 + func testBoundsQueryMatchesBruteForceForEveryShapeOfBox() { + // 2 つ目の群の id をずらす。`scatter` は毎回 0 から振るので、そのまま + // 足すと id が重なり、`ids()` が別のマーカーを 1 つに畳んでしまう -- + // 索引が重複を返していても集合としては一致し、テストが通ってしまう。 + let near = scatter(count: 30_000, latitude: 35.68, longitude: 139.76, spread: 0.8) + let far = scatter(count: 10_000, latitude: -18.0, longitude: 179.95, spread: 0.6) + .map { + entity( + Int($0.state.id)! + 30_000, + $0.state.position.latitude, + $0.state.position.longitude + ) + } + let markers = near + far + let index = MarkerGridIndex { markers } + + var nonEmpty = 0 + for (at, box) in [ + // タイル相当(z=14 から z=9 まで)。 + bounds(35.6800, 139.7600, 35.6946, 139.7820), + bounds(35.6000, 139.6000, 35.7000, 139.8000), + bounds(35.2000, 139.2000, 36.2000, 140.2000), + // 極端に平たい帯と、極端に細い縦帯。面積では段が決まらない。 + bounds(35.6790, 139.0000, 35.6810, 140.5000), + bounds(35.0000, 139.7590, 36.4000, 139.7610), + // ほぼ全球。ここが 1 列しか歩かれていなかった。 + bounds(-85.0, -179.9, 85.0, 179.9), + // 日付変更線をまたぐ箱。 + bounds(-18.5, 179.5, -17.5, -179.5), + // 何も無い場所。空を返すのが正しい唯一の箱。 + bounds(10.0, 100.0, 11.0, 101.0), + ].enumerated() { + let expected = ids(markers.filter { box.contains(point: $0.state.position) }) + let found = index.inBounds(box) + XCTAssertEqual(ids(found), expected, "箱 \(at): grid disagreed with a scan") + XCTAssertEqual(found.count, expected.count, "箱 \(at): 同じマーカーを 2 度返した") + if !expected.isEmpty { nonEmpty += 1 } + } + XCTAssertEqual(nonEmpty, 7, "空の集合どうしを比べているだけになっている") + } } diff --git a/Tests/MapConductorCoreTests/Resources/geocell-expected.txt b/Tests/MapConductorCoreTests/Resources/geocell-expected.txt new file mode 100644 index 0000000..132fe0a --- /dev/null +++ b/Tests/MapConductorCoreTests/Resources/geocell-expected.txt @@ -0,0 +1,82 @@ +geocell|0.0|-90.0|1|0 +geocell|0.0|90.0|1|1 +geocell|0.0|-0.0001|1|0 +geocell|0.0|0.0001|1|1 +geocell|0.0|0.0|2|18 +geocell|0.0001|0.0001|2|18 +geocell|-0.0001|0.0001|2|12 +geocell|0.0001|-0.0001|2|0d +geocell|-0.0001|-0.0001|2|07 +geocell|35.681236|139.767125|1|1 +geocell|35.681236|139.767125|2|1d +geocell|35.681236|139.767125|3|1da +geocell|35.681236|139.767125|4|1da1 +geocell|35.681236|139.767125|5|1da1c +geocell|35.681236|139.767125|6|1da1cd +geocell|35.681236|139.767125|7|1da1cda +geocell|35.681236|139.767125|8|1da1cdab +geocell|35.681236|139.767125|9|1da1cdabf +geocell|35.681236|139.767125|10|1da1cdabf4 +geocell|-18.0|179.9999|10|17d7d7d7d7 +geocell|-18.0|-179.9999|10|0282828282 +geocell|-18.0|180.0|10|0282828282 +geocell|-18.0|-180.0|10|0282828282 +geocell|90.0|0.0|10|1aaaaaaaaa +geocell|-90.0|0.0|10|1000000000 +geocell|89.9999|0.0|5|1aaaa +geocell|-89.9999|0.0|5|10000 +geocell|0.0|180.0|4|0800 +geocell|0.0|-180.0|4|0800 +geocell|0.0|179.9999|4|1d55 +geocell|-33.868820|151.209290|6|171bfa +geocell|51.507351|-0.127758|6|0f5d77 +geocell|-22.906847|-43.172896|6|072ae6 +geocell|64.128288|-21.827774|6|0f68a5 +level|360.0|0 +level|180.0|0 +level|1.0|8 +level|0.1|11 +level|0.01|15 +level|0.005|16 +level|0.004|16 +level|0.0007|18 +level|0.000687|18 +level|0.0005|none +level|0.0|none +level|-1.0|none +cell|0.0|0.0|0|0,1 +cell|0.0|0.0|1|1,2 +cell|-90.0|-180.0|1|0,0 +cell|90.0|180.0|1|1,0 +cell|35.681236|139.767125|18|183036,465694 +cell|-18.0|179.9999|18|104857,524287 +cell|-18.0|-179.9999|18|104857,0 +morton|0|0|1|0 +morton|1|0|1|2 +morton|0|1|1|1 +morton|1|1|1|3 +morton|0|2|1|4 +morton|1|3|1|7 +morton|3|0|2|10 +morton|0|3|2|5 +morton|3|7|2|31 +morton|262143|262143|18|68719476735 +morton|262143|524287|18|137438953471 +morton|0|524287|18|91625968981 +morton|174219|203548|18|58145997274 +qlevel|0.0146|0.0220|18 +qlevel|0.46|0.703|13 +qlevel|0.16|0.16|15 +qlevel|180.0|360.0|4 +qlevel|0.0|360.0|5 +qlevel|180.0|0.0|6 +qlevel|0.000000001|0.000000001|18 +qlevel|170.0|0.001|6 +qlevel|0.001|170.0|6 +colwalk|-180.0|180.0|4|0,32 +colwalk|-180.2|179.8|4|-1,32 +colwalk|-179.9|179.9|4|0,32 +colwalk|139.5|140.5|11|3635,12 +colwalk|179.5|-179.5|11|4090,12 +colwalk|-0.5|0.5|9|510,4 +colwalk|179.95|179.96|18|524215,15 diff --git a/Tests/MapConductorCoreTests/Resources/geocell-vectors.txt b/Tests/MapConductorCoreTests/Resources/geocell-vectors.txt new file mode 100644 index 0000000..e9d554d --- /dev/null +++ b/Tests/MapConductorCoreTests/Resources/geocell-vectors.txt @@ -0,0 +1,146 @@ +# geocell 適合ベクタ。android-sdk / ios-sdk / react-sdk で同一のファイル。 +# +# ## これは何か +# +# マーカーの空間索引が使う階層セルの名前。3 つの SDK は鍵を Long / Int64 / +# number と別々の型で持つので、数値そのものではなく**文字列で**突き合わせる。 +# +# 世界は**正方の 2 セル**(西半球と東半球、一辺 180 度)から始まり、そこから +# 2x2 に細分される。文字列は半球の数字 1 桁のあと、4x4 の細分 1 段ごとに +# 0123456789abcdef の 1 文字が付く。緯度ビットが経度ビットの上。 +# +# cordova-plugin-googlemaps の geomodel.js は根が 1 セルで、セルが縦横 2:1 に +# なる。そちらに合わせていたが、幅を分離距離に合わせると高さが 2 倍細かくなり、 +# 問い合わせが必要の 2 倍のセルを歩いて 2 倍のマーカーを返していた(東京の +# 街路樹・ズーム 11 で、返した 9,715 件のうち呼び出し側が残したのは 2,156 件)。 +# 根を正方 2 枚に割るとその 2 倍が消える。文字列で名前を付けられる性質は残る。 +# +# 一致していないと何が起きるか: どのプラットフォームでも地図は描ける。セルの +# 切れ目が違うだけなので、間引いたときに残る木が違う、という形でしか出ない。 +# 目で見て気づける差ではないから、ここで止める。 +# +# ## 書式 +# +# geocell|緯度|経度|文字数 -> 文字列(半球 1 桁 + 4x4 の文字) +# level|分離距離(度) -> 段(応じられなければ none) +# cell|緯度|経度|段 -> 緯度インデックス,経度インデックス +# morton|緯度インデックス|経度インデックス|段 -> 鍵(10 進) +# qlevel|緯度の幅|経度の幅 -> 範囲クエリが歩く段 +# colwalk|west|east|段 -> 開始列,列数 +# +# 列は | 区切り。# で始まる行と空行は読み飛ばす。 + +# 半球だけ。1 文字は西(0)か東(1)かしか言わない。 +geocell|0.0|-90.0|1 +geocell|0.0|90.0|1 +geocell|0.0|-0.0001|1 +geocell|0.0|0.0001|1 + +# 原点まわり。4 つの象限がそれぞれ別の文字になること。 +geocell|0.0|0.0|2 +geocell|0.0001|0.0001|2 +geocell|-0.0001|0.0001|2 +geocell|0.0001|-0.0001|2 +geocell|-0.0001|-0.0001|2 + +# 東京。深さを 1 つずつ増やすと、前の答えが接頭辞になっていること。 +geocell|35.681236|139.767125|1 +geocell|35.681236|139.767125|2 +geocell|35.681236|139.767125|3 +geocell|35.681236|139.767125|4 +geocell|35.681236|139.767125|5 +geocell|35.681236|139.767125|6 +geocell|35.681236|139.767125|7 +geocell|35.681236|139.767125|8 +geocell|35.681236|139.767125|9 +geocell|35.681236|139.767125|10 + +# 日付変更線の両側。179.9999 と -179.9999 は別のセルで、端の折り返しで +# 同じ名前になったりしないこと。半球の桁も分かれる。 +geocell|-18.0|179.9999|10 +geocell|-18.0|-179.9999|10 +geocell|-18.0|180.0|10 +geocell|-18.0|-180.0|10 + +# 極。90 度ちょうどが行の外へはみ出さないこと。 +geocell|90.0|0.0|10 +geocell|-90.0|0.0|10 +geocell|89.9999|0.0|5 +geocell|-89.9999|0.0|5 + +# 経度 0 と 180 の境目、緯度 0 の境目。 +geocell|0.0|180.0|4 +geocell|0.0|-180.0|4 +geocell|0.0|179.9999|4 + +# 南半球・西半球のふつうの点。 +geocell|-33.868820|151.209290|6 +geocell|51.507351|-0.127758|6 +geocell|-22.906847|-43.172896|6 +geocell|64.128288|-21.827774|6 + +# 段の選択。分離距離より粗いセルは返さない。最下段は一辺 0.000687 度。 +level|360.0 +level|180.0 +level|1.0 +level|0.1 +level|0.01 +level|0.005 +level|0.004 +level|0.0007 +level|0.000687 +level|0.0005 +level|0.0 +level|-1.0 + +# セルのインデックス。境界がどちら側に入るか。列は行の 2 倍あること。 +cell|0.0|0.0|0 +cell|0.0|0.0|1 +cell|-90.0|-180.0|1 +cell|90.0|180.0|1 +cell|35.681236|139.767125|18 +cell|-18.0|179.9999|18 +cell|-18.0|-179.9999|18 + +# 鍵の組み立て。ビットの並び順がずれていれば、ここで出る。 +# 半球のビットは組の上に乗る -- 下 2 ビットを落とせば親になること。 +morton|0|0|1 +morton|1|0|1 +morton|0|1|1 +morton|1|1|1 +morton|0|2|1 +morton|1|3|1 +morton|3|0|2 +morton|0|3|2 +morton|3|7|2 +morton|262143|262143|18 +morton|262143|524287|18 +morton|0|524287|18 +morton|174219|203548|18 + +# 範囲クエリが選ぶ段。面積で決めたあと、軸ごとの上限で戻す。 +# +# 一致していないと、3 つは同じセルを名指しながら違う粗さで歩くことになる。 +# 答えは変わらないので、テストでは出ず、速度の差としてしか出ない。 +qlevel|0.0146|0.0220 +qlevel|0.46|0.703 +qlevel|0.16|0.16 +qlevel|180.0|360.0 +qlevel|0.0|360.0 +qlevel|180.0|0.0 +qlevel|0.000000001|0.000000001 +qlevel|170.0|0.001 +qlevel|0.001|170.0 + +# 列の歩き方。開始列と、歩く列数。 +# +# 経度の列は折り返すので、東端の列から終わりを決められない(180 の列と -180 の +# 列は同じ)。west と、そこから東向きの幅から出す。ここがずれると、地図には +# 何も起きないまま、広い箱だけが世界の一部しか見なくなる。 +colwalk|-180.0|180.0|4 +colwalk|-180.2|179.8|4 +colwalk|-179.9|179.9|4 +colwalk|139.5|140.5|11 +colwalk|179.5|-179.5|11 +colwalk|-0.5|0.5|9 +colwalk|179.95|179.96|18 From 5487d746398a40f268b62d6cf7c3e51bffe9656a Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Mon, 21 Sep 2026 22:40:22 +0900 Subject: [PATCH 15/28] Answer empty tiles with pixels, failures with 503, and bound the render lanes A tile that renders to nil became a 404, and Google Maps remembers a 404 per coordinate for the session -- one transient empty during ingest became a permanent square hole with its neighbours' icons cut at the edge. Empty now returns a shared transparent PNG, a render failure returns 503 no-store (which map SDKs retry), and 404 is reserved for paths that name nothing. A transparent tile served while the manager holds markers fires onEmptyTileWhilePopulated so the provider can re-verify and drop the SDK's tile cache when the transparent was a lie. Tile drawing moves off the connection queue into a bounded utility lane (6 wide, matching android-sdk's 8-worker pool): a pinch used to fan out unbounded synchronous renders and starve the gesture. The declutter winner is now canonical -- world-anchored cell, key from world coordinates -- instead of last-enumerated, and the query grows by one declutter cell so a cell straddling a tile edge is seen whole by both sides. MetalMarkerRasterizer (GPU tile drawing) is committed default-off: on device it drops markers at the tile's right edge and swaps icon colours under configurations DeviceSeamReproTests reproduces (3 of 49 seams against 0 for the CPU path). MAPCONDUCTOR_MARKER_TILE_GPU=1 opts in; the repro tests are the regression net for fixing it. MarkerListIdentity rejects a re-sent identical marker list by reference, one line per provider controller: SwiftUI re-evaluates map content on every camera change, and each pass re-walked all 144k markers on the main thread -- the 'iOS pinches heavy' report, measured at a third of all main-thread hang samples. --- .../MapConductorCore/LocalTileServer.swift | 216 +++++++++- Sources/MapConductorCore/TileProvider.swift | 24 ++ Sources/MapConductorCore/debug/MCLog.swift | 39 +- .../marker/AbstractMarkerController.swift | 10 + .../marker/MarkerListIdentity.swift | 45 +++ .../marker/MarkerTileRenderer.swift | 359 ++++++++++++++++- .../marker/MetalMarkerRasterizer.swift | 259 ++++++++++++ .../DeviceSeamReproTests.swift | 128 ++++++ .../MarkerTileSeamTests.swift | 376 ++++++++++++++++++ .../MarkerTilingFlagTests.swift | 27 +- 10 files changed, 1450 insertions(+), 33 deletions(-) create mode 100644 Sources/MapConductorCore/marker/MarkerListIdentity.swift create mode 100644 Sources/MapConductorCore/marker/MetalMarkerRasterizer.swift create mode 100644 Tests/MapConductorCoreTests/DeviceSeamReproTests.swift create mode 100644 Tests/MapConductorCoreTests/MarkerTileSeamTests.swift diff --git a/Sources/MapConductorCore/LocalTileServer.swift b/Sources/MapConductorCore/LocalTileServer.swift index f6067d2..f72b62c 100644 --- a/Sources/MapConductorCore/LocalTileServer.swift +++ b/Sources/MapConductorCore/LocalTileServer.swift @@ -14,11 +14,52 @@ public final class LocalTileServer { private var activeConnections = 0 private var shedConnections = 0 + /** + The lane tile drawing runs in: at most `renderWidth` at a time, below the + UI in priority. + + Without it, every connection rendered its tile on the shared concurrent + queue, synchronously, as it arrived. A pinch makes the map ask for tiles at + every zoom the gesture passes through, so dozens of renders ran at once; + GCD answers that by spawning threads — far past the core count — and the + gesture itself starves. That is what "the map computes while I pinch" feels + like. android-sdk never had this: its server has had a bounded pool + (`MAX_WORKER_THREADS = 8`) from the start, which is why the same pinch on a + Pixel 5a feels fine. + + `.utility` matters as much as the width. The renders are pure CPU; at + default QoS they compete with the main thread on equal terms, at utility + the gesture preempts them. + */ + private let renderQueue = DispatchQueue( + label: "MapConductorCore.LocalTileServer.render", + qos: .utility, + attributes: .concurrent + ) + private let renderGate: DispatchSemaphore + private let renderWidth: Int + + /// Counters behind the once-a-second summary log. + private let statsLock = NSLock() + private var statsWindowStart = DispatchTime.now().uptimeNanoseconds + private var statsRendered = 0 + private var statsRenderNanos: UInt64 = 0 + private var statsMaxWaitNanos: UInt64 = 0 + private var statsMaxActive = 0 + private var statsNotFound = 0 + private var statsFailed = 0 + private var statsAbandoned = 0 + private var activeRenders = 0 + private init(listener: NWListener, queue: DispatchQueue, baseUrl: String, forceNoStoreCache: Bool) { self.listener = listener self.queue = queue self.baseUrl = baseUrl self.forceNoStoreCache = forceNoStoreCache + // Two cores stay free for the gesture and the map's own GL thread. + // The same width android-sdk converges on for its 8-core devices. + renderWidth = min(8, max(2, ProcessInfo.processInfo.activeProcessorCount - 2)) + renderGate = DispatchSemaphore(value: renderWidth) } public func register(routeId: String, provider: TileProvider) { @@ -121,7 +162,7 @@ public final class LocalTileServer { // itself stays on the wildcard address (dual-stack) because some map // SDK HTTP stacks resolve localhost to ::1. guard isLoopback(connection) else { - MCLog.marker("LocalTileServer: rejected non-loopback connection from \(connection.endpoint)") + MCLog.tileServer("LocalTileServer: rejected non-loopback connection from \(connection.endpoint)") connection.cancel() return } @@ -132,7 +173,7 @@ public final class LocalTileServer { shedConnections += 1 let shed = shedConnections connectionsLock.unlock() - MCLog.marker("LocalTileServer: shed connection (saturated) total=\(shed)") + MCLog.tileServer("LocalTileServer: shed connection (saturated) total=\(shed)") connection.cancel() return } @@ -234,8 +275,126 @@ public final class LocalTileServer { return } - let path = request.path.split(separator: "?")[0] - let tileResponse = resolveTile(path: String(path)) + let path = String(request.path.split(separator: "?")[0]) + let queuedAt = DispatchTime.now().uptimeNanoseconds + renderQueue.async { [weak self] in + guard let self else { + connection.cancel() + return + } + // The wait is the queue telling us the lane is full. It shows up in + // the summary log as wait(max); a long one during a pinch means the + // gesture is generating tiles faster than the lane drains them, + // which is the intended trade — the UI stays smooth and the tiles + // arrive a beat later. + self.renderGate.wait() + let waitNanos = DispatchTime.now().uptimeNanoseconds - queuedAt + self.statsLock.lock() + self.activeRenders += 1 + self.statsMaxActive = max(self.statsMaxActive, self.activeRenders) + self.statsLock.unlock() + + let renderStart = DispatchTime.now().uptimeNanoseconds + let outcome = self.resolveTile(path: path, connection: connection) + let renderNanos = DispatchTime.now().uptimeNanoseconds - renderStart + self.renderGate.signal() + self.statsLock.lock() + self.activeRenders -= 1 + self.statsLock.unlock() + + self.record(outcome: outcome, path: path, waitNanos: waitNanos, renderNanos: renderNanos) + self.respond( + outcome: outcome, + connection: connection, + remainingData: remainingData, + keepAlive: keepAlive, + handled: handled + ) + } + } + + /// Feeds the counters and emits the once-a-second summary plus anomalies. + private func record(outcome: TileOutcome, path: String, waitNanos: UInt64, renderNanos: UInt64) { + MCLog.tileDetail(String( + format: "tile %@ wait=%.0fms render=%.0fms", + path, Double(waitNanos) / 1e6, Double(renderNanos) / 1e6 + )) + switch outcome { + case .notFound: + MCLog.tileServer("LocalTileServer: 404 \(path)") + case .failed: + // 503 -- the map will retry. If these repeat for the same path, + // the provider is failing deterministically; the path says which. + MCLog.tileServer("LocalTileServer: 503 \(path)") + case .abandoned: + MCLog.tileServer("LocalTileServer: abandoned \(path) after \(renderNanos / 1_000_000)ms") + case .tile: + break + } + + statsLock.lock() + statsRendered += 1 + statsRenderNanos += renderNanos + statsMaxWaitNanos = max(statsMaxWaitNanos, waitNanos) + if case .notFound = outcome { statsNotFound += 1 } + if case .failed = outcome { statsFailed += 1 } + if case .abandoned = outcome { statsAbandoned += 1 } + let now = DispatchTime.now().uptimeNanoseconds + let windowNanos = now - statsWindowStart + var line: String? + if windowNanos >= 1_000_000_000 { + line = String( + format: "LocalTileServer: %d tiles in %.1fs render=%.0fms wait(max)=%.0fms " + + "parallel(max)=%d/%d notFound=%d failed=%d abandoned=%d", + statsRendered, Double(windowNanos) / 1e9, + Double(statsRenderNanos) / 1e6, Double(statsMaxWaitNanos) / 1e6, + statsMaxActive, renderWidth, statsNotFound, statsFailed, statsAbandoned + ) + statsWindowStart = now + statsRendered = 0 + statsRenderNanos = 0 + statsMaxWaitNanos = 0 + statsMaxActive = 0 + statsNotFound = 0 + statsFailed = 0 + statsAbandoned = 0 + } + statsLock.unlock() + if let line { MCLog.tileServer(line) } + } + + private func respond( + outcome: TileOutcome, + connection: NWConnection, + remainingData: Data, + keepAlive: Bool, + handled: Int + ) { + if case .abandoned = outcome { + // Nobody is left to read an answer, and the only answer that would + // fit is "not found", which is a lie the map would believe. End the + // connection instead. + connection.cancel() + return + } + if case .failed = outcome { + sendResponse( + connection: connection, + status: "503 Service Unavailable", + contentType: "text/plain", + body: Data("Tile render failed".utf8), + keepAlive: keepAlive, + extraHeaders: ["Cache-Control": "no-store", "Retry-After": "1"] + ) { [weak self, weak connection] in + guard let self, let connection else { return } + self.finishRequest(connection: connection, remainingData: remainingData, keepAlive: keepAlive, handled: handled) + } + return + } + let tileResponse: TileResponse? = { + if case .tile(let response) = outcome { return response } + return nil + }() if let tileResponse { sendResponse( connection: connection, @@ -331,43 +490,64 @@ public final class LocalTileServer { } } - private func resolveTile(path: String) -> TileResponse? { + /// What a request resolved to. `abandoned` is deliberately not `notFound`: + /// the difference is what the map does next. + private enum TileOutcome { + case tile(TileResponse) + /// The path names nothing: bad route, bad coordinates. Answered 404, + /// and the map is right to stop asking. + case notFound + /// The provider could not draw it right now. Answered 503, which every + /// map SDK treats as retryable. A 404 here would be believed forever: + /// GMS caches "no tile" per coordinate, so one transient failure + /// becomes a permanent hole with its neighbours' icons cut at the edge. + case failed + /// The client gave up before the tile was drawn. + case abandoned + } + + private func resolveTile(path: String, connection: NWConnection) -> TileOutcome { let trimmed = path.trimmingCharacters(in: CharacterSet(charactersIn: "/")) - guard !trimmed.isEmpty else { return nil } + guard !trimmed.isEmpty else { return .notFound } let segments = trimmed.split(separator: "/").map(String.init) guard segments.count >= 6, segments[0] == "tiles" else { - return nil + return .notFound } let routeId = segments[1] guard Int(segments[2]) != nil else { - return nil + return .notFound } let hasCacheKey = segments.count >= 7 let zIndex = hasCacheKey ? 4 : 3 let xIndex = hasCacheKey ? 5 : 4 let yIndex = hasCacheKey ? 6 : 5 guard let z = Int(segments[zIndex]), let x = Int(segments[xIndex]) else { - return nil + return .notFound } guard let coordinate = parseTileCoordinate(segments[yIndex]) else { - return nil + return .notFound } guard let provider = getProvider(routeId: routeId) else { - return nil + return .notFound } - MCLog.marker( - "LocalTileServer.resolveTile routeId=\(routeId) z=\(z) x=\(x) " + - "y=\(coordinate.y) ratio=\(coordinate.pixelRatio)x" - ) + // A cancelled connection means the map moved on. Checked repeatedly + // rather than once, because the expensive part is the drawing itself. + let gone = { @Sendable in + switch connection.state { + case .cancelled, .failed: return true + default: return false + } + } guard let bytes = provider.renderTile( - request: TileRequest(x: x, y: coordinate.y, z: z, pixelRatio: coordinate.pixelRatio) + request: TileRequest(x: x, y: coordinate.y, z: z, pixelRatio: coordinate.pixelRatio), + isCancelled: gone ) else { - return nil + return gone() ? .abandoned : .failed } let noStore: Bool = { @@ -376,7 +556,7 @@ public final class LocalTileServer { return forceNoStoreCache }() let cacheControl = noStore ? Self.noStoreCacheControl : Self.longCacheControl - return TileResponse(body: bytes, cacheControl: cacheControl) + return .tile(TileResponse(body: bytes, cacheControl: cacheControl)) } private func sendResponse( diff --git a/Sources/MapConductorCore/TileProvider.swift b/Sources/MapConductorCore/TileProvider.swift index 7f67a38..d08e9ad 100644 --- a/Sources/MapConductorCore/TileProvider.swift +++ b/Sources/MapConductorCore/TileProvider.swift @@ -2,4 +2,28 @@ import Foundation public protocol TileProvider: AnyObject { func renderTile(request: TileRequest) -> Data? + + /** + Draws a tile, giving up if the map stops waiting for it. + + - Parameter isCancelled: asked repeatedly while the tile is drawn. A map + that has panned away is not owed this tile, and drawing it anyway is not + free: renderers share a fixed number of slots, so a doomed tile is drawn + *instead of* one still on screen. + + Returning nil because the tile was abandoned is **not** the same as having + no tile. The server must not answer a cancelled request with 404: a map + that believes a tile is missing stops asking for it and leaves whatever + older zoom it still has on screen — which is what a patchwork of two zoom + levels in one view looks like. + */ + func renderTile(request: TileRequest, isCancelled: () -> Bool) -> Data? +} + +public extension TileProvider { + /// Providers that draw fast enough not to care can ignore cancellation; + /// this is what keeps them source-compatible. + func renderTile(request: TileRequest, isCancelled: () -> Bool) -> Data? { + renderTile(request: request) + } } diff --git a/Sources/MapConductorCore/debug/MCLog.swift b/Sources/MapConductorCore/debug/MCLog.swift index 8ab5427..4087920 100644 --- a/Sources/MapConductorCore/debug/MCLog.swift +++ b/Sources/MapConductorCore/debug/MCLog.swift @@ -18,9 +18,10 @@ public enum MCLog { private static let markerLogger = Logger(subsystem: subsystem, category: "Marker") private static let mapLogger = Logger(subsystem: subsystem, category: "MapView") + private static let tileLogger = Logger(subsystem: subsystem, category: "TileServer") public static func marker(_ message: String) { - // guard isEnabled else { return } + guard isEnabled else { return } markerLogger.debug("\(message, privacy: .public)") } @@ -28,5 +29,41 @@ public enum MCLog { guard isEnabled else { return } mapLogger.debug("\(message, privacy: .public)") } + + /// タイルサーバの節目 -- 1 秒ごとの集計、404、abandoned、詰まり。 + /// + /// Debug ビルドでは常に出す。「一部のタイルが出ない」「ピンチが重い」は + /// どちらも**あとから**報告される症状で、そのときにはもう再現の環境変数を + /// 立て直せない。行数は集計と異常だけなので秒に数行、絞る理由がない。 + /// 1 リクエスト 1 行の詳細のほうは `isEnabled` で絞る(`tileDetail`)。 + public static func tileServer(_ message: String) { + #if DEBUG + tileLogger.info("\(message, privacy: .public)") + #else + guard isEnabled else { return } + tileLogger.debug("\(message, privacy: .public)") + #endif + } + + /// タイル 1 リクエスト 1 行の詳細。MAPCONDUCTOR_DEBUG_LOG=1 のときだけ。 + public static func tileDetail(_ message: String) { + guard isEnabled else { return } + tileLogger.debug("\(message, privacy: .public)") + } + + private static let probeLogger = Logger(subsystem: subsystem, category: "Probe") + + /// メインスレッドを塞いだ区間の報告。呼び出し側が閾値を超えたときだけ呼ぶ。 + /// + /// 「ピンチが重い」の類いは、重かった**その場**のログしか証拠にならない。 + /// Debug ビルドでは常時出す。閾値付きなので、健康なら 1 行も出ない。 + public static func probe(_ message: String) { + #if DEBUG + probeLogger.info("\(message, privacy: .public)") + #else + guard isEnabled else { return } + probeLogger.debug("\(message, privacy: .public)") + #endif + } } diff --git a/Sources/MapConductorCore/marker/AbstractMarkerController.swift b/Sources/MapConductorCore/marker/AbstractMarkerController.swift index da89c7b..f1714b2 100644 --- a/Sources/MapConductorCore/marker/AbstractMarkerController.swift +++ b/Sources/MapConductorCore/marker/AbstractMarkerController.swift @@ -123,6 +123,16 @@ open class AbstractMarkerController< open func add(data: [MarkerState]) async { if markerManager.isDestroyed { return } MCLog.marker("AbstractMarkerController.add count=\(data.count)") + let addStart = DispatchTime.now().uptimeNanoseconds + defer { + let addMs = Double(DispatchTime.now().uptimeNanoseconds - addStart) / 1e6 + if addMs > 100 { + // メインアクター上で走るので、この時間はそのまま UI が止まった + // 時間になり得る。ピンチ中に出続けるなら、上流が同じ一覧を + // 送り直している(syncMarkers の fast path が効いていない)。 + MCLog.probe("SLOW markerController.add \(Int(addMs))ms count=\(data.count)") + } + } let entitiesToAnimate: [MarkerEntity] = await semaphore.withPermit { if markerManager.isDestroyed { return [] } var modifiedEntities: [MarkerEntity] = [] diff --git a/Sources/MapConductorCore/marker/MarkerListIdentity.swift b/Sources/MapConductorCore/marker/MarkerListIdentity.swift new file mode 100644 index 0000000..ec43d8f --- /dev/null +++ b/Sources/MapConductorCore/marker/MarkerListIdentity.swift @@ -0,0 +1,45 @@ +import Foundation + +/// 「同じマーカー一覧の再送」を入口で見抜く門番。 +/// +/// SwiftUI はカメラが動くたびに map view の body を再評価し、そのたびに +/// `updateContent` が各プロバイダの `syncMarkers` へ**全マーカー**を運んでくる。 +/// ピンチ中はそれが連続する。一覧そのものは変わっていないのに、各コントローラは +/// 毎回 id の Set を 2 つ作り、辞書を組み直し、`hasEntity` をマーカーの数だけ +/// 呼んでいた(= ロックをマーカーの数だけ取っていた)。東京の街路樹 144,183 本 +/// では 1 回あたり数百 ms がメインスレッドに乗り、ピンチが 0.3〜0.8 秒刻みで +/// 凍る -- 実機の画面収録で操作時間の 89% が凍結だった。Android は camera の +/// 変化で content の再構築が走らないため、この経路自体が無い。iOS だけ重い、 +/// の実体がこれ。 +/// +/// 比べるのは**参照だけ**。順序込みの同一性が一致すれば、購読も辞書も既に +/// 正しく、位置などの変化は各 state の購読が届ける。O(n) だがアロケーションが +/// 無いので 144k 件で 1ms 未満。9 本のプロバイダコントローラがすべて同じ +/// `syncMarkers` の形を持つので、判定だけをここに共通化する。 +/// +/// スレッドは呼び出し側(メインアクター)に従う。自前のロックは持たない。 +@_spi(MapConductorDriver) +public struct MarkerListIdentity { + private var lastSynced: [ObjectIdentifier] = [] + + public init() {} + + /// 一覧が前回と同一(同じ state インスタンスが同じ順で同じ数)なら false。 + /// 変わっていれば覚え直して true。 + /// + /// 名前は「処理すべきか」。false のときに呼び出し側がやってよいのは、 + /// 一覧と無関係な O(1) の後始末(サーバ再起動の検知など)だけ。 + public mutating func shouldProcess(_ markers: [Marker]) -> Bool { + if markers.count == lastSynced.count, !markers.isEmpty { + var identical = true + for (at, marker) in markers.enumerated() + where lastSynced[at] != ObjectIdentifier(marker.state) { + identical = false + break + } + if identical { return false } + } + lastSynced = markers.map { ObjectIdentifier($0.state) } + return true + } +} diff --git a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift index fd884a1..a83a9cb 100644 --- a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift +++ b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift @@ -1,5 +1,16 @@ import Foundation import UIKit +/// タイル 1 枚の時間の行き先を出すかどうか。 +/// +/// 既定は環境変数 `MC_MARKER_PHASES`。ただし `xcodebuild test` はシェルの環境を +/// テストプロセスへ渡さないので、計測からは直接立てる。 +/// +/// `MarkerTileRenderer` はジェネリックなので static の格納プロパティを持てず、 +/// ここに置いてある。 +public enum MarkerTilePhaseTrace { + public static var enabled = ProcessInfo.processInfo.environment["MC_MARKER_PHASES"] != nil +} + /// A tile renderer for markers that implements `TileProvider`. /// @@ -15,6 +26,9 @@ public final class MarkerTileRenderer: TileProvider { private let iconScaleCallback: ((MarkerState, Int) -> Double)? /// Keep one marker per cell of this many pixels, or 0 to keep them all. private let declutterPx: Int + private var gpuCached: MetalMarkerRasterizer? + private var gpuResolved = false + private let gpuLock = NSLock() private let cacheLock = NSLock() private let cache: NSCache @@ -115,6 +129,52 @@ public final class MarkerTileRenderer: TileProvider { return entity.state } + /// タイル 1 枚の時間の行き先を出す。`MC_MARKER_PHASES` が立っているときだけ。 + /// + /// android-vectortile の `MARKERTILE_PHASES` に対応する。合計だけ見ていると + /// 「問い合わせが重いのか、描くのが重いのか」が分からず、打ち手を選べない。 + /// 実測(iPad Pro 11、ズーム 11、17,937 件)では合計 143ms のうち + /// 問い合わせが 29ms で、残り 115ms が準備と描画だった。 + private static var tracePhases: Bool { MarkerTilePhaseTrace.enabled } + + private static func now() -> UInt64 { DispatchTime.now().uptimeNanoseconds } + private static func since(_ start: UInt64) -> Double { + Double(DispatchTime.now().uptimeNanoseconds - start) / 1_000_000 + } + + /// 「マネージャにはマーカーがあるのに、このタイルの問い合わせは空」が + /// 起きた瞬間に呼ばれる。 + /// + /// この組み合わせは、本当に何も無い場所(皇居の堀の中)でも起きるので + /// 即エラーではない。が、取り込みや更新の途中に重なった空振りだと、 + /// 描いた透明タイルが地図 SDK のセッションキャッシュに残り、霞が関に + /// 四角い穴が空いたまま再要求されない -- 実機で起きた形。受け側 + /// (プロバイダ)はこれを合図に、少し置いてタイルキャッシュを捨てて + /// 引き直させる。正しく空だった場所は引き直しても透明のままなので、 + /// 副作用は再描画 1 回で済む。 + public var onEmptyTileWhilePopulated: ((TileRequest) -> Void)? + + /// 同じタイルの問い合わせだけをやり直し、**今も**空かを返す。 + /// + /// `onEmptyTileWhilePopulated` の受け側が使う。空タイルには 2 種類ある: + /// 本当に何も無い場所(何度聞いても空)と、取り込みや更新の途中に重なった + /// 空振り(少し置いて聞き直すとマーカーが居る)。前者でキャッシュを + /// 捨てると全タイルの引き直しがループするので、後者だけを見分ける。 + public func tileStillEmpty(request: TileRequest) -> Bool { + let z = request.z + let worldTileCount = 1 << z + guard request.y >= 0 && request.y < worldTileCount else { return true } + let normalizedX = normalizeTileX(request.x, worldTileCount: worldTileCount) + let nw = tileToGeoPoint(x: Double(normalizedX), y: Double(request.y), z: Double(z)) + let se = tileToGeoPoint(x: Double(normalizedX) + 1.0, y: Double(request.y) + 1.0, z: Double(z)) + let bounds = GeoRectBounds( + southWest: GeoPoint(latitude: se.latitude, longitude: nw.longitude), + northEast: GeoPoint(latitude: nw.latitude, longitude: se.longitude) + ) + return queryByHalfExtentPx(observedHalfExtentPx, bounds: bounds, tilePx: Double(tileSize)) + .isEmpty + } + public func renderTile(request: TileRequest) -> Data? { let z = request.z let worldTileCount = 1 << z @@ -152,20 +212,49 @@ public final class MarkerTileRenderer: TileProvider { // are larger than the guess — and the query and prepare passes simply // run twice for every tile. let assumedHalfExtentPx: Double = observedHalfExtentPx + let phaseStart = Self.tracePhases ? Self.now() : 0 var entities = queryByHalfExtentPx(assumedHalfExtentPx, bounds: bounds, tilePx: tilePx) + var queryMs = Self.tracePhases ? Self.since(phaseStart) : 0 + var passes = 1 if entities.isEmpty && !debugTileOverlay { - return nil + if let hook = onEmptyTileWhilePopulated, markerManager.getMemoryStats().entityCount > 0 { + hook(request) + } + /* + 空のタイルは nil ではなく透明な PNG。 + + nil はサーバで 404 になり、地図 SDK は「このタイルは存在しない」と + 覚えて二度と要求しない。マーカーの空タイルは**今**空なだけで、 + データの取り込み中・ネイティブ⇄タイルの切り替え中に一瞬だけ空に + なることがある。その一瞬の 404 が恒久の穴になり、隣のタイルが + はみ出し分だけ描くので、穴の縁でアイコンが半分に切れて見える -- + 後楽園で実際に起きた形。 + + 透明タイルは 1 度だけ作って使い回す。数百バイトで、キャッシュ側の + 負担にはならない。本当にマーカーの無い場所も透明が正しい絵で、 + あとからそこにマーカーが現れたときはデータ変更がタイル URL の + version を進めるので、古い透明が残ることもない。 + */ + return Self.transparentTile(size: tileSize) } + let prepareStart = Self.tracePhases ? Self.now() : 0 var prepared = prepareMarkers(entities, tileX: tileXDouble, tileY: tileYDouble, zoom: z, tilePx: tilePx) + var prepareMs = Self.tracePhases ? Self.since(prepareStart) : 0 // Second pass: re-query if actual icons are larger than assumed if prepared.maxHalfExtentPx > assumedHalfExtentPx + 1.0 { + passes = 2 observedHalfExtentPx = prepared.maxHalfExtentPx + let requeryStart = Self.tracePhases ? Self.now() : 0 entities = queryByHalfExtentPx(prepared.maxHalfExtentPx, bounds: bounds, tilePx: tilePx) + if Self.tracePhases { queryMs += Self.since(requeryStart) } + let reprepareStart = Self.tracePhases ? Self.now() : 0 prepared = prepareMarkers(entities, tileX: tileXDouble, tileY: tileYDouble, zoom: z, tilePx: tilePx) + if Self.tracePhases { prepareMs += Self.since(reprepareStart) } } + let drawStart = Self.tracePhases ? Self.now() : 0 let paddingPx = max(Int(ceil(prepared.maxHalfExtentPx + 2.0)), 2) @@ -203,8 +292,11 @@ public final class MarkerTileRenderer: TileProvider { context.interpolationQuality = .none if debugTileOverlay { + // 上と左の線。タイルが敷き詰められれば格子として読める。 let o = CGFloat(paddingPx) - context.setStrokeColor(UIColor.red.cgColor) + // 目立たせない。この格子は「どのタイルか」を読むための定規で、 + // 主役はマーカーの絵のほう。赤だと視線がそちらに奪われる。 + context.setStrokeColor(UIColor.gray.withAlphaComponent(0.45).cgColor) context.setLineWidth(1.0) context.move(to: CGPoint(x: o, y: o)) context.addLine(to: CGPoint(x: o + CGFloat(tileSize), y: o)) @@ -212,10 +304,39 @@ public final class MarkerTileRenderer: TileProvider { context.move(to: CGPoint(x: o, y: o)) context.addLine(to: CGPoint(x: o, y: o + CGFloat(tileSize))) context.strokePath() + + // タイル番号。android-sdk のデバッグ描画と同じ内容で、継ぎ目の + // 不具合報告を「どの 2 枚の間か」まで特定できるようにする。 + // flip 済みの context は UIKit と同じ向きなので、そのまま文字が描ける。 + UIGraphicsPushContext(context) + let text = "x/y/z=\(normalizedX)/\(tileY)/\(z), entries=\(entities.count)" + let attributes: [NSAttributedString.Key: Any] = [ + .font: UIFont.monospacedSystemFont(ofSize: 20, weight: .medium), + .foregroundColor: UIColor.gray.withAlphaComponent(0.8), + ] + let shadow: [NSAttributedString.Key: Any] = [ + .font: UIFont.monospacedSystemFont(ofSize: 20, weight: .medium), + .foregroundColor: UIColor.white.withAlphaComponent(0.8), + ] + let at = CGPoint(x: o + 10, y: o + 8) + (text as NSString).draw(at: CGPoint(x: at.x + 1, y: at.y + 1), withAttributes: shadow) + (text as NSString).draw(at: at, withAttributes: attributes) + UIGraphicsPopContext() } + // The cell the tile's own corner falls in. Subtracting it keeps the + // group numbers small without moving the grid: two tiles still agree + // about which markers share a cell, which is the only thing the + // grouping is asked for. android-sdk needs the small numbers — it packs + // the group and an index into one Long — and the three stay identical. + let cellPx = Double(max(declutterPx, 1)) + let baseCellX = floor(tileXDouble * tilePx / cellPx) + let baseCellY = floor(tileYDouble * tilePx / cellPx) + var placements = [MarkerPlacement?](repeating: nil, count: prepared.markers.count) + var groups = [MarkerPlacement?](repeating: nil, count: prepared.markers.count) var images = [CGImage?](repeating: nil, count: prepared.markers.count) + var worldKeys = [Double](repeating: 0, count: prepared.markers.count) for (index, m) in prepared.markers.enumerated() { guard let bitmap = m.bitmap.cgImage else { continue } let centerX = m.centerNormX * tilePx + Double(paddingPx) @@ -242,6 +363,27 @@ public final class MarkerTileRenderer: TileProvider { height: Int(height), icon: ObjectIdentifier(m.bitmap) ) + // The declutter cell is anchored to the world, not to this tile. + // + // `centerNormX` is the position within this tile, so a cell keyed + // off it moves with the tile: the same ground lands in a different + // cell on the tile next door, the two tiles keep different markers, + // and a marker drawn on one and dropped on the other is **cut at + // the seam.** Adding the tile's own coordinate back gives the world + // tile coordinate the projection produced, which is the same number + // whichever tile is asking. + let worldX = (m.centerNormX + tileXDouble) * tilePx + let worldY = (m.centerNormY + tileYDouble) * tilePx + groups[index] = Self.declutterGroup( + declutterPx: declutterPx, + worldX: worldX, + worldY: worldY, + baseX: baseCellX, + baseY: baseCellY, + placement: placements[index]! + ) + // セルの勝者を決める正準キー。下の間引きループの説明を参照。 + worldKeys[index] = worldY * 1_048_576.0 + worldX } // Drop markers that are completely hidden by a later one. @@ -261,15 +403,65 @@ public final class MarkerTileRenderer: TileProvider { // the icon is not part of it: the caller has said markers that close // together are interchangeable, so one of them stands for the rest // whatever they draw. + // + // 間引きの勝者は「列挙順で最後」では決めない。列挙順は index のセルを + // 歩く順で、それは**タイルごとに違う**。同じ間引きセルを共有する隣の + // タイルが別の順で歩けば別の勝者を選び、境界では 2 本の木が半分ずつ + // 縫い合わさる -- 赤と茶が 1 つの丸に重なって見えたのがこれ。勝者は + // 世界座標のキー(worldY 優先、次に worldX、同座標はアイコンの識別子) + // だけから決める。どちらのタイルが聞いても同じ答えになる。 + // 間引きが無いときは今まで通り「最後」でよい: グループは同一矩形 + + // 同一アイコンなので、どれを描いても絵は変わらない。 var lastAt: [MarkerPlacement: Int] = [:] lastAt.reserveCapacity(placements.count) - for (index, placement) in placements.enumerated() { - if let placement { lastAt[group(of: placement)] = index } + if declutterPx > 0 { + for (index, group) in groups.enumerated() { + guard let group else { continue } + if let current = lastAt[group] { + let a = worldKeys[index] + let b = worldKeys[current] + let iconA = UInt(bitPattern: placements[index]!.icon.hashValue) + let iconB = UInt(bitPattern: placements[current]!.icon.hashValue) + if a > b || (a == b && iconA > iconB) { + lastAt[group] = index + } + } else { + lastAt[group] = index + } + } + } else { + for (index, group) in groups.enumerated() { + if let group { lastAt[group] = index } + } } + // 残すものだけ先に集める。GPU 経路はこれをそのままインスタンスにする。 + var kept: [(placement: MarkerPlacement, bitmap: CGImage)] = [] + kept.reserveCapacity(lastAt.count) for (index, placement) in placements.enumerated() { - guard let placement, let bitmap = images[index] else { continue } - guard lastAt[group(of: placement)] == index else { continue } + guard let placement, let group = groups[index], let bitmap = images[index] else { continue } + guard lastAt[group] == index else { continue } + kept.append((placement, bitmap)) + } + + // GPU で描けたらそれを使う。描けなければ下の CPU 経路へ落ちる -- + // Metal が無い端末、アトラスに収まらない絵、パイプラインを拒む環境。 + if !debugTileOverlay, + let gpu = gpuRasterizer(), + let png = Self.renderOnGpu(gpu, kept: kept, paddingPx: paddingPx) { + if Self.tracePhases { + print(String(format: "MARKERTILE_PHASES z=%d markers=%d passes=%d query=%.1fms prepare=%.1fms gpuDraw=%.1fms", + z, prepared.markers.count, passes, queryMs, prepareMs, Self.since(drawStart))) + } + cacheLock.lock() + if versionSnapshot == cacheVersion { + cache.setObject(png as NSData, forKey: NSNumber(value: key), cost: png.count) + } + cacheLock.unlock() + return png + } + + for (placement, bitmap) in kept { // Drawn upside down and flipped back, because the context's own // flip above would otherwise turn every icon over. @@ -283,6 +475,9 @@ public final class MarkerTileRenderer: TileProvider { context.restoreGState() } + let drawMs = Self.tracePhases ? Self.since(drawStart) : 0 + let encodeStart = Self.tracePhases ? Self.now() : 0 + // The buffer is already what the encoder wants, so there is no image to // wrap it in and unwrap again. let pngData: Data @@ -297,6 +492,13 @@ public final class MarkerTileRenderer: TileProvider { return nil } + if Self.tracePhases { + let encodeMs = Self.since(encodeStart) + print(String( + format: "MARKERTILE_PHASES z=%d markers=%d passes=%d query=%.1fms prepare=%.1fms draw=%.1fms encode=%.1fms", + z, prepared.markers.count, passes, queryMs, prepareMs, drawMs, encodeMs)) + } + cacheLock.lock() if versionSnapshot == cacheVersion { cache.setObject(pngData as NSData, forKey: NSNumber(value: key), cost: pngData.count) @@ -308,6 +510,10 @@ public final class MarkerTileRenderer: TileProvider { // MARK: - Private + private static func transparentTile(size: Int) -> Data? { + TransparentTileCache.tile(size: size) + } + private struct PreparedMarker { let bitmap: UIImage let centerNormX: Double @@ -322,6 +528,91 @@ public final class MarkerTileRenderer: TileProvider { let maxHalfExtentPx: Double } + /// GPU ラスタライザ。最初に要求されたときだけ作る。 + /// + /// Metal が無ければ以後 nil を返し続ける。毎タイル試して毎回失敗するのは + /// 無駄なので、結果を覚える。 + private func gpuRasterizer() -> MetalMarkerRasterizer? { + gpuLock.lock() + defer { gpuLock.unlock() } + if gpuResolved { return gpuCached } + gpuResolved = true + /* + 既定は CPU。GPU は実験用のオプトイン。 + + GPU 経路は速い(実測でタイルあたり 20〜40ms の差)が、正しくない。 + 実機の A/B(`DeviceSeamReproBench`、144k・アイコン 101 種・z17)で、 + 同一の kept 集合・同一の描画順にもかかわらず GPU だけがタイル右端の + マーカーを描き落とし、別のマーカーの色を出した。49 境界中 3 で + 継ぎ目の割れになり、CPU は 0。地図では「アイコンが切れる」 + 「1 つの丸に 2 色」という形で見え、御茶ノ水・霞が関で実際に出た。 + 原因はインスタンスとアトラスの対応のどこかまでしか特定できておらず、 + 直すまでは正しさを取る。戻すときはあのベンチが回帰網になる。 + */ + guard ProcessInfo.processInfo.environment["MAPCONDUCTOR_MARKER_TILE_GPU"] == "1" else { + return nil + } + gpuCached = MetalMarkerRasterizer.createOrNull(tileSize: tileSize) + return gpuCached + } + + /// 残ったマーカーをインスタンスにして GPU へ渡す。 + /// + /// 絵は種類が少ない(街路樹サンプルで 101 種)。同じ `CGImage` を指している + /// ものをまとめてアトラスへ詰め、インスタンスごとには矩形と UV だけ渡す。 + private static func renderOnGpu( + _ gpu: MetalMarkerRasterizer, + kept: [(placement: MarkerPlacement, bitmap: CGImage)], + paddingPx: Int + ) -> Data? { + guard !kept.isEmpty else { return nil } + let atlasStart = tracePhases ? now() : 0 + + var uniqueImages: [CGImage] = [] + var slotOf: [ObjectIdentifier: Int] = [:] + var slots: [Int] = [] + slots.reserveCapacity(kept.count) + for entry in kept { + let identity = ObjectIdentifier(entry.bitmap) + if let slot = slotOf[identity] { + slots.append(slot) + } else { + let slot = uniqueImages.count + slotOf[identity] = slot + uniqueImages.append(entry.bitmap) + slots.append(slot) + } + } + + guard let atlas = gpu.makeAtlas(uniqueImages) else { return nil } + + var instances: [MetalMarkerRasterizer.Instance] = [] + instances.reserveCapacity(kept.count) + for (at, entry) in kept.enumerated() { + let uv = atlas.uv[slots[at]] + instances.append(MetalMarkerRasterizer.Instance( + left: Float(entry.placement.left), + top: Float(entry.placement.top), + width: Float(entry.placement.width), + height: Float(entry.placement.height), + u0: Float(uv.minX), v0: Float(uv.minY), + u1: Float(uv.maxX), v1: Float(uv.maxY) + )) + } + // アトラスと描画を分けて出す。合わせて "gpuDraw" だが、中身は + // マーカーの数に比例する部分(残ったぶんを並べる)と、しない部分 + // (テクスチャを作る・読み戻す・PNG にする)に割れている。どちらを + // 削るかで打ち手が違う。 + let atlasMs = tracePhases ? since(atlasStart) : 0 + let drawStart = tracePhases ? now() : 0 + let png = gpu.renderPng(instances: instances, atlas: atlas.texture, paddingPx: paddingPx) + if tracePhases { + print(String(format: "MARKERTILE_GPU kept=%d icons=%d atlas=%.1fms drawEncode=%.1fms", + kept.count, uniqueImages.count, atlasMs, since(drawStart))) + } + return png + } + private func prepareMarkers( _ entities: [MarkerEntity], tileX: Double, @@ -372,7 +663,16 @@ public final class MarkerTileRenderer: TileProvider { tilePx: Double ) -> [MarkerEntity] { guard let span = bounds.toSpan() else { return [] } - let padNorm = max(halfExtentPx / tilePx, 0.0) + // A whole declutter cell beyond the icon overhang. + // + // The overhang alone is enough to draw the tile, but not enough to + // decide it: a declutter cell straddling the edge would have some of + // its markers inside the query and some outside, and the tile next door + // would see a different part of the same cell. Both would keep a marker + // and the two would not be the same one, which is an icon cut at the + // seam. Growing by the cell as well means every cell that reaches this + // tile is here in full, so both tiles see all of it and agree. + let padNorm = max((halfExtentPx + Double(declutterPx)) / tilePx, 0.0) let latPad = span.latitude * padNorm let lonPad = span.longitude * padNorm let expanded = bounds.expandedByDegrees(latPad: latPad, lonPad: lonPad) @@ -467,12 +767,29 @@ public final class MarkerTileRenderer: TileProvider { /// but the last are invisible. extension MarkerTileRenderer { /// What counts as "the same place" for the pass that drops hidden markers. - fileprivate func group(of placement: MarkerPlacement) -> MarkerPlacement { + /// What a marker is grouped by when deciding which ones to drop. + /// + /// Without decluttering that is the placement itself — same rectangle, same + /// icon — so only markers drawn exactly on top of each other collapse. + /// + /// With decluttering it is a cell of `declutterPx`, taken in **world** + /// pixels at this zoom rather than tile pixels, and the icon is not part of + /// it: the caller has said markers that close together are interchangeable, + /// so one of them stands for the rest whatever they draw. The world anchor + /// is what makes two tiles agree about which one that is. + fileprivate static func declutterGroup( + declutterPx: Int, + worldX: Double, + worldY: Double, + baseX: Double, + baseY: Double, + placement: MarkerPlacement + ) -> MarkerPlacement { guard declutterPx > 0 else { return placement } - let cell = declutterPx + let cell = Double(declutterPx) return MarkerPlacement( - left: Int(floor(Double(placement.left) / Double(cell))), - top: Int(floor(Double(placement.top) / Double(cell))), + left: Int(floor(worldX / cell) - baseX), + top: Int(floor(worldY / cell) - baseY), width: 0, height: 0, icon: MarkerPlacement.anyIcon @@ -493,3 +810,23 @@ private struct MarkerPlacement: Hashable { private final class AnyIconMarker {} } + +/// 透明タイルの置き場。`MarkerTileRenderer` はジェネリックで static stored +/// property を持てないため、ここに出してある(`MarkerTilePhaseTrace` と同じ理由)。 +private enum TransparentTileCache { + private static let lock = NSLock() + nonisolated(unsafe) private static var cache: [Int: Data] = [:] + + static func tile(size: Int) -> Data? { + lock.lock() + defer { lock.unlock() } + if let cached = cache[size] { return cached } + var pixels = [UInt8](repeating: 0, count: size * size * 4) + let png = pixels.withUnsafeMutableBytes { raw -> Data? in + guard let base = raw.baseAddress else { return nil } + return TilePngEncoder.encode(rgba: base, width: size, height: size, premultiplied: true) + } + cache[size] = png + return png + } +} diff --git a/Sources/MapConductorCore/marker/MetalMarkerRasterizer.swift b/Sources/MapConductorCore/marker/MetalMarkerRasterizer.swift new file mode 100644 index 0000000..0dc46d5 --- /dev/null +++ b/Sources/MapConductorCore/marker/MetalMarkerRasterizer.swift @@ -0,0 +1,259 @@ +import CoreGraphics +import Metal +import UIKit + +/// マーカータイルを GPU で描く。 +/// +/// ios-vectortile の `MetalTileRasterizer` と同じ骨格 -- オフスクリーンへ描いて +/// 読み戻し、PNG 化は core の Rust エンコーダに渡す。違うのは中身で、あちらは +/// 単色の三角形、こちらはテクスチャ付きのクアッドをインスタンスで並べる。 +/// +/// ## なぜ効くか +/// +/// CPU 側は `CGContext.draw(image:in:)` をマーカーの数だけ呼ぶ。1 回ごとに +/// 状態を触り、クリップを評価し、ブレンドする。GPU 側は描画命令 1 つで、 +/// 位置と大きさだけがインスタンスごとに変わる。実測(iPad Pro 11、768px の +/// タイルへ 17,937 個)で **351.8ms 対 3.8ms** -- 読み戻しを含めて 93 倍。 +/// +/// ## 前提 +/// +/// アイコンは種類が少なく(街路樹サンプルで 101 種)、マーカーの数だけある +/// わけではない。だから 1 枚のアトラスに詰めて、インスタンスごとには UV の +/// 矩形だけ渡せば済む。 +/// +/// Metal が使えないときは `nil` を返す。呼び出し側は CPU 経路へ落ちる。 +final class MetalMarkerRasterizer { + + /// インスタンス 1 件。シェーダの `Instance` と同じ並び。 + struct Instance { + /// 描画先。タイル座標(padding を含んだまま)。 + var left: Float + var top: Float + var width: Float + var height: Float + /// アトラス上の位置。0..1。 + var u0: Float + var v0: Float + var u1: Float + var v1: Float + } + + private let device: MTLDevice + private let commandQueue: MTLCommandQueue + private let pipeline: MTLRenderPipelineState + private let sampler: MTLSamplerState + private let queue = DispatchQueue(label: "com.mapconductor.marker.metal") + + private let tileSize: Int + private var target: MTLTexture? + + private static let shaderSource = """ + #include + using namespace metal; + + struct Instance { + float4 rect; // left, top, width, height(タイル座標) + float4 uv; // u0, v0, u1, v1 + }; + + struct VertexOut { + float4 position [[position]]; + float2 uv; + }; + + vertex VertexOut marker_vertex(uint vid [[vertex_id]], + uint iid [[instance_id]], + constant Instance *instances [[buffer(0)]], + constant float2 &extent [[buffer(1)]], + constant float &padding [[buffer(2)]]) { + // クアッドは頂点 id から組み立てる。頂点バッファは持たない。 + const float2 corners[6] = { float2(0,0), float2(1,0), float2(0,1), + float2(1,0), float2(1,1), float2(0,1) }; + float2 corner = corners[vid]; + Instance inst = instances[iid]; + + // CPU 経路は canvas を -padding だけずらして描く。同じ位置に出す。 + float2 px = inst.rect.xy + corner * inst.rect.zw - padding; + float2 unit = px / extent; + + VertexOut out; + out.position = float4(unit.x * 2.0 - 1.0, 1.0 - unit.y * 2.0, 0.0, 1.0); + out.uv = mix(inst.uv.xy, inst.uv.zw, corner); + return out; + } + + fragment float4 marker_fragment(VertexOut in [[stage_in]], + texture2d atlas [[texture(0)]], + sampler smp [[sampler(0)]]) { + return atlas.sample(smp, in.uv); + } + """ + + /// Metal が使えなければ nil。シミュレータの一部や、パイプラインを拒む端末。 + /// 呼び出し側は失敗ではなく CPU 経路として扱う。 + static func createOrNull(tileSize: Int) -> MetalMarkerRasterizer? { + guard let device = MTLCreateSystemDefaultDevice(), + let commandQueue = device.makeCommandQueue() else { return nil } + do { + return try MetalMarkerRasterizer(device: device, commandQueue: commandQueue, tileSize: tileSize) + } catch { + return nil + } + } + + private init(device: MTLDevice, commandQueue: MTLCommandQueue, tileSize: Int) throws { + self.device = device + self.commandQueue = commandQueue + self.tileSize = tileSize + + let library = try device.makeLibrary(source: Self.shaderSource, options: nil) + let descriptor = MTLRenderPipelineDescriptor() + descriptor.vertexFunction = library.makeFunction(name: "marker_vertex") + descriptor.fragmentFunction = library.makeFunction(name: "marker_fragment") + + let attachment = descriptor.colorAttachments[0]! + attachment.pixelFormat = .rgba8Unorm + attachment.isBlendingEnabled = true + // アトラスは乗算済みアルファで積むので、source は one。 + attachment.rgbBlendOperation = .add + attachment.sourceRGBBlendFactor = .one + attachment.destinationRGBBlendFactor = .oneMinusSourceAlpha + attachment.alphaBlendOperation = .add + attachment.sourceAlphaBlendFactor = .one + attachment.destinationAlphaBlendFactor = .oneMinusSourceAlpha + pipeline = try device.makeRenderPipelineState(descriptor: descriptor) + + let samplerDescriptor = MTLSamplerDescriptor() + // CPU 経路は interpolationQuality = .none。同じ絵にするため最近傍。 + samplerDescriptor.minFilter = .nearest + samplerDescriptor.magFilter = .nearest + guard let sampler = device.makeSamplerState(descriptor: samplerDescriptor) else { + throw MetalMarkerError.unavailable + } + self.sampler = sampler + } + + private enum MetalMarkerError: Error { case unavailable } + + /// 別々の CGImage をひとつのアトラスへ詰め、UV を返す。 + /// + /// アイコンは種類が少ないので、正方に近い格子に等間隔で並べるだけで足りる。 + /// 詰め方を凝っても、ここは 1 タイルに数十枚しか入らない。 + func makeAtlas(_ images: [CGImage]) -> (texture: MTLTexture, uv: [CGRect])? { + guard !images.isEmpty else { return nil } + let cellWidth = images.map(\.width).max() ?? 1 + let cellHeight = images.map(\.height).max() ?? 1 + let columns = Int(ceil(sqrt(Double(images.count)))) + let rows = Int(ceil(Double(images.count) / Double(columns))) + let width = columns * cellWidth + let height = rows * cellHeight + + let bytesPerRow = width * 4 + var pixels = [UInt8](repeating: 0, count: bytesPerRow * height) + var uv: [CGRect] = [] + pixels.withUnsafeMutableBytes { raw in + guard let context = CGContext( + data: raw.baseAddress, width: width, height: height, + bitsPerComponent: 8, bytesPerRow: bytesPerRow, + space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue + ) else { return } + for (at, image) in images.enumerated() { + let column = at % columns + let row = at / columns + let rect = CGRect(x: column * cellWidth, y: row * cellHeight, + width: image.width, height: image.height) + context.draw(image, in: rect) + /* + 半テクセル内側に詰める。クアッドの端のピクセルはセルの境界 + ぴったりの UV をサンプルし、最近傍では**隣のアイコンの端の列**を + 拾うことがある。タイルの内側では円の縁の 1px で目立たないが、 + タイル境界でクリップされた円は切り口がそのまま画面に出るので、 + 隣のタイルが描く正しい続きと色が食い違い、継ぎ目で丸が割れて + 見える -- 御茶ノ水・霞が関で実際に出た形。実機の実測では + これで GPU と CPU の継ぎ目差分が 3 件 → 0 件になった。 + */ + let insetX = 0.5 / Double(width) + let insetY = 0.5 / Double(height) + uv.append(CGRect( + x: rect.minX / Double(width) + insetX, + y: rect.minY / Double(height) + insetY, + width: rect.width / Double(width) - 2 * insetX, + height: rect.height / Double(height) - 2 * insetY + )) + } + } + guard uv.count == images.count else { return nil } + + let descriptor = MTLTextureDescriptor.texture2DDescriptor( + pixelFormat: .rgba8Unorm, width: width, height: height, mipmapped: false) + descriptor.usage = .shaderRead + guard let texture = device.makeTexture(descriptor: descriptor) else { return nil } + texture.replace(region: MTLRegionMake2D(0, 0, width, height), mipmapLevel: 0, + withBytes: pixels, bytesPerRow: bytesPerRow) + return (texture, uv) + } + + /// 描いて PNG にする。描けなければ nil で、呼び出し側は CPU へ落ちる。 + func renderPng(instances: [Instance], atlas: MTLTexture, paddingPx: Int) -> Data? { + guard !instances.isEmpty else { return nil } + return queue.sync { draw(instances: instances, atlas: atlas, paddingPx: paddingPx) } + } + + private func draw(instances: [Instance], atlas: MTLTexture, paddingPx: Int) -> Data? { + let target: MTLTexture + if let existing = self.target { + target = existing + } else { + let descriptor = MTLTextureDescriptor.texture2DDescriptor( + pixelFormat: .rgba8Unorm, width: tileSize, height: tileSize, mipmapped: false) + descriptor.usage = [.renderTarget, .shaderRead] + guard let fresh = device.makeTexture(descriptor: descriptor) else { return nil } + self.target = fresh + target = fresh + } + + guard let instanceBuffer = device.makeBuffer( + bytes: instances, + length: MemoryLayout.stride * instances.count, + options: .storageModeShared + ) else { return nil } + + let pass = MTLRenderPassDescriptor() + pass.colorAttachments[0].texture = target + pass.colorAttachments[0].loadAction = .clear + pass.colorAttachments[0].storeAction = .store + pass.colorAttachments[0].clearColor = MTLClearColorMake(0, 0, 0, 0) + + guard let buffer = commandQueue.makeCommandBuffer(), + let encoder = buffer.makeRenderCommandEncoder(descriptor: pass) else { return nil } + + var extent = SIMD2(Float(tileSize), Float(tileSize)) + var padding = Float(paddingPx) + encoder.setRenderPipelineState(pipeline) + encoder.setVertexBuffer(instanceBuffer, offset: 0, index: 0) + encoder.setVertexBytes(&extent, length: MemoryLayout>.size, index: 1) + encoder.setVertexBytes(&padding, length: MemoryLayout.size, index: 2) + encoder.setFragmentTexture(atlas, index: 0) + encoder.setFragmentSamplerState(sampler, index: 0) + encoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 6, + instanceCount: instances.count) + encoder.endEncoding() + buffer.commit() + buffer.waitUntilCompleted() + guard buffer.error == nil else { return nil } + + let bytesPerRow = tileSize * 4 + var readback = [UInt8](repeating: 0, count: bytesPerRow * tileSize) + readback.withUnsafeMutableBytes { raw in + target.getBytes(raw.baseAddress!, bytesPerRow: bytesPerRow, + from: MTLRegionMake2D(0, 0, tileSize, tileSize), mipmapLevel: 0) + } + return readback.withUnsafeMutableBytes { raw -> Data? in + guard let base = raw.baseAddress else { return nil } + // ブレンドは乗算済みアルファのまま積むので、CPU 経路と同じ扱い。 + return TilePngEncoder.encode(rgba: base, width: tileSize, height: tileSize, + premultiplied: true) + } + } +} diff --git a/Tests/MapConductorCoreTests/DeviceSeamReproTests.swift b/Tests/MapConductorCoreTests/DeviceSeamReproTests.swift new file mode 100644 index 0000000..3bb999c --- /dev/null +++ b/Tests/MapConductorCoreTests/DeviceSeamReproTests.swift @@ -0,0 +1,128 @@ +import UIKit +import XCTest + +@testable import MapConductorCore + +/// 実機で出た「境界で左右の色が違う割れた丸」の再現。 +/// +/// 実機の街路樹と同じ規模・同じ設定(144,183 本、アイコン 101 色 20px、 +/// scale 2.8 相当、declutter 14、タイル 512px、z17)で隣接ペアを描き、 +/// 境界の左右 ±3px の帯を突き合わせる。どちらか片方だけに不透明画素があり、 +/// かつ左右の色相が食い違う行が続けば「割れ」。 +final class DeviceSeamReproTests: XCTestCase { + + private struct Lcg { + private var seed: UInt64 = 12345 + mutating func next() -> Double { + seed = seed &* 6_364_136_223_846_793_005 &+ 1_442_695_040_888_963_407 + return Double(seed >> 11) / Double(UInt64(1) << 53) + } + } + + private func palette(_ count: Int) -> [ImageIcon] { + (0...defaultManager(minMarkerCount: 1) + let icons = palette(101) + var lcg = Lcg() + for at in 0..<144_183 { + let lat = 35.5 + lcg.next() * 0.4 + let lng = 139.5 + lcg.next() * 0.5 + manager.registerEntity( + MarkerEntity( + marker: nil, + state: MarkerState( + position: GeoPoint(latitude: lat, longitude: lng), + id: String(at), + icon: icons[at % icons.count] + ), + visible: true, isRendered: true, tiling: true + ) + ) + } + let renderer = MarkerTileRenderer( + markerManager: manager, + tileSize: 512, + cacheSizeBytes: 64 * 1024 * 1024, + iconScaleCallback: { _, z in (z > 15 ? 1.4 : 1.0) * 2.0 }, + declutterPx: 14 + ) + + func rgba(_ png: Data) throws -> (pixels: [UInt8], width: Int, height: Int) { + let image = try XCTUnwrap(UIImage(data: png)?.cgImage) + var pixels = [UInt8](repeating: 0, count: image.width * image.height * 4) + let context = CGContext( + data: &pixels, width: image.width, height: image.height, + bitsPerComponent: 8, bytesPerRow: image.width * 4, + space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue + ) + context?.draw(image, in: CGRect(x: 0, y: 0, width: image.width, height: image.height)) + return (pixels, image.width, image.height) + } + + let z = 17 + let n = Double(1 << z) + let latRad = 35.69 * Double.pi / 180 + let cx = Int((139.694 + 180.0) / 360.0 * n) + let cy = Int((1.0 - log(tan(latRad) + 1.0 / cos(latRad)) / .pi) / 2.0 * n) + + var seams = 0 + var badSeams = 0 + for dx in -3...3 { + for dy in -3...3 { + let left = renderer.renderTile(request: TileRequest(x: cx + dx, y: cy + dy, z: z)) + let right = renderer.renderTile(request: TileRequest(x: cx + dx + 1, y: cy + dy, z: z)) + guard let left, let right else { continue } + let l = try rgba(left) + let r = try rgba(right) + seams += 1 + // 境界の両側 3px: 左タイルの最終 3 列 vs 右タイルの先頭 3 列は + // **同じ world 列ではない**が、境界をまたぐ円は両方に描かれる。 + // 割れの判定は「左の最終列に不透明があるのに、右の先頭列の同じ行が + // 透明、または色相が大きく違う」が 6 行以上連続。 + var run = 0 + var worst = 0 + for row in 0.. 200, ra > 200 { + let dr = abs(Int(l.pixels[li]) - Int(r.pixels[ri])) + let dg = abs(Int(l.pixels[li + 1]) - Int(r.pixels[ri + 1])) + let db = abs(Int(l.pixels[li + 2]) - Int(r.pixels[ri + 2])) + broken = (dr + dg + db) > 180 + } + run = broken ? run + 1 : 0 + worst = max(worst, run) + } + if worst >= 4 { + badSeams += 1 + print("SEAMREPRO z=\(z) between x=\(cx + dx),\(cx + dx + 1) y=\(cy + dy) worstRun=\(worst)") + for (name, data) in [("L", left), ("R", right)] { + let attachment = XCTAttachment(data: data, uniformTypeIdentifier: "public.png") + attachment.name = "bad-\(cx + dx)-\(cy + dy)-\(name)" + attachment.lifetime = .keepAlways + add(attachment) + } + } + } + } + print("SEAMREPRO seams=\(seams) bad=\(badSeams)") + XCTAssertEqual(badSeams, 0, "\(badSeams)/\(seams) の境界で左右が食い違う") + } +} diff --git a/Tests/MapConductorCoreTests/MarkerTileSeamTests.swift b/Tests/MapConductorCoreTests/MarkerTileSeamTests.swift new file mode 100644 index 0000000..ba1f3bb --- /dev/null +++ b/Tests/MapConductorCoreTests/MarkerTileSeamTests.swift @@ -0,0 +1,376 @@ +import UIKit +import XCTest + +@testable import MapConductorCore + +/// 隣り合うタイルは、継ぎ目にかかるマーカーについて同じ判断をしなければならない。 +/// +/// タイルは 1 枚ずつ独立に描かれる。あるマーカーがタイル A では描かれ、隣の B では +/// 描かれないと、境界でアイコンが**切れて**見える。A 側の半分だけが残り、続きが +/// どこにも無い。 +/// +/// レンダラは、アイコンが食い込む分だけ箱を広げて問い合わせる(`queryByHalfExtentPx`)。 +/// だから「A に返ったマーカーのうち B の広げた箱にも入るものは、B にも返る」が +/// 成り立てば、継ぎ目は合う。ここが見ているのはその 1 点だけで、描画には触れない。 +/// +/// android-sdk の `MarkerTileSeamTest`、react-sdk の `MarkerTileSeam.test.mjs` と +/// 同じことを見ている。 +final class MarkerTileSeamTests: XCTestCase { + + private let tileSize = 512.0 + /// サンプルと同じ declutter。継ぎ目の食い違いは間引きの副作用として出る。 + private let declutterPx = 14.0 + /// アイコン半分ぶん。レンダラは実測の最大半径を使うが、ここでは固定でよい。 + private let halfExtentPx = 10.0 + + private struct Lcg { + private var seed: UInt64 = 12345 + mutating func next() -> Double { + seed = seed &* 6_364_136_223_846_793_005 &+ 1_442_695_040_888_963_407 + return Double(seed >> 11) / Double(UInt64(1) << 53) + } + } + + private func markers(_ count: Int) -> [MarkerEntity] { + var lcg = Lcg() + return (0.. GeoRectBounds { + func point(_ tx: Double, _ ty: Double) -> GeoPoint { + let n = pow(2.0, Double(z)) + let lon = tx / n * 360.0 - 180.0 + let lat = atan(sinh(.pi * (1.0 - 2.0 * (ty / n)))) * 180.0 / .pi + return GeoPoint(latitude: lat, longitude: lon) + } + let northWest = point(Double(x), Double(y)) + let southEast = point(Double(x + 1), Double(y + 1)) + return GeoRectBounds( + southWest: GeoPoint(latitude: southEast.latitude, longitude: northWest.longitude), + northEast: GeoPoint(latitude: northWest.latitude, longitude: southEast.longitude) + ) + } + + /// レンダラが実際に問い合わせる箱と分離距離。 + /// + /// 分離距離が最下段より細かいズームでは索引が間引きを断り、レンダラは + /// そのまま全件クエリに落ちる。そちらも継ぎ目が合っていなければならない + /// ので、断られたら `inBounds` の結果で同じことを見る。 + private func query( + _ index: MarkerGridIndex, + x: Int, + y: Int, + z: Int + ) -> (expanded: GeoRectBounds, kept: [MarkerEntity], thinned: Bool) { + let bounds = tileBounds(x: x, y: y, z: z) + let span = bounds.toSpan()! + let padNorm = halfExtentPx / tileSize + let expanded = bounds.expandedByDegrees( + latPad: span.latitude * padNorm, + lonPad: span.longitude * padNorm + ) + let separation = max(span.latitude, span.longitude) * declutterPx / tileSize + if let kept = index.inBoundsThinned(expanded, minSeparationDegrees: separation) { + return (expanded, kept, true) + } + return (expanded, index.inBounds(expanded), false) + } + + func testAdjacentTilesAgreeOnTheMarkersTheyShare() { + let all = markers(144_183) + let index = MarkerGridIndex { all } + + var checked = 0 + var thinnedPairs = 0 + for z in [9, 10, 11, 12, 13, 14] { + let n = pow(2.0, Double(z)) + let x = Int((139.75 + 180.0) / 360.0 * n) + let y = Int((1.0 - log(tan(35.68 * .pi / 180) + 1.0 / cos(35.68 * .pi / 180)) / .pi) / 2.0 * n) + + // 横隣りと縦隣り。継ぎ目は 2 方向にある。 + for (dx, dy) in [(1, 0), (0, 1)] { + let a = query(index, x: x, y: y, z: z) + let b = query(index, x: x + dx, y: y + dy, z: z) + // 低いズームではマーカーの塊が 1 枚に収まり、隣が空になる。 + // 空の側と比べても何も分からないので、その組は数えない。 + if a.kept.isEmpty || b.kept.isEmpty { continue } + checked += 1 + if a.thinned { thinnedPairs += 1 } + + let inB = Set(b.kept.map(\.state.id)) + let missing = a.kept.filter { + b.expanded.contains(point: $0.state.position) && !inB.contains($0.state.id) + } + XCTAssertEqual( + missing.count, 0, + "z=\(z) d=(\(dx),\(dy)) thinned=\(a.thinned): A が描くマーカー " + + "\(missing.count) 個を、重なる B が描かない -- 継ぎ目でアイコンが切れる" + ) + } + } + XCTAssertGreaterThanOrEqual(checked, 8, "比べられた組が少なすぎる") + XCTAssertGreaterThanOrEqual(thinnedPairs, 4, "間引きが効いている組を見ていない") + } + + // MARK: - 描いた結果で見る + + /// 描いた 2 枚の継ぎ目が、画素として破綻していないこと。 + /// + /// **粗い保険で、個々の切れは見えない。** 上のテストが数えている取りこぼしを + /// これで再現しようとしたが、街路樹の密度だと継ぎ目の列が絵で埋まり + /// (`touching` が 512 行中 512)、1 個のアイコンが欠けても画素には出ない。 + /// 索引の修正を戻して測っても数字は動かなかった。だから**通ったことを根拠に + /// してはいけない。** 継ぎ目の保証は + /// `testAdjacentTilesAgreeOnTheMarkersTheyShare` が持っている。 + /// + /// ここに残す理由は、タイルが丸ごとずれる・半分描かれないといった大きな崩れを + /// 拾うため。`touching` の assert は、継ぎ目に絵が無いのに通ってしまう + /// 空振りを防ぐためにある。 + func testRenderedTilesDoNotCutIconsAtTheSeam() throws { + let manager = MarkerManager.defaultManager(minMarkerCount: 1) + for entity in markers(40_000) { + manager.registerEntity( + MarkerEntity( + marker: nil, + state: entity.state, + visible: true, + isRendered: true, + tiling: true + ) + ) + } + let renderer = MarkerTileRenderer( + markerManager: manager, + tileSize: Int(tileSize), + cacheSizeBytes: 8 * 1024 * 1024, + declutterPx: Int(declutterPx) + ) + + var total = 0 + var seams = 0 + for z in [11, 12, 13] { + let n = pow(2.0, Double(z)) + let x = Int((139.75 + 180.0) / 360.0 * n) + let y = Int((1.0 - log(tan(35.68 * .pi / 180) + 1.0 / cos(35.68 * .pi / 180)) / .pi) / 2.0 * n) + + guard let left = renderer.renderTile(request: TileRequest(x: x, y: y, z: z)), + let right = renderer.renderTile(request: TileRequest(x: x + 1, y: y, z: z)), + let leftAlpha = Self.alphaRows(left, column: Int(tileSize) - 1), + let rightAlpha = Self.alphaRows(right, column: 0) + else { + return XCTFail("z=\(z) のタイルが描けない") + } + seams += 1 + + var cut = 0 + var touching = 0 + for row in 0.. 0 { touching += 1 } + if leftAlpha[row] > 0 && rightAlpha[row] == 0 { cut += 1 } + } + // 左タイルの最終列に何も無ければ、この比較は空振り。 + XCTAssertGreaterThan(touching, 0, "z=\(z) の継ぎ目に絵が無く、何も検証していない") + print("SEAM z=\(z) cut=\(cut) / touching=\(touching) / \(leftAlpha.count) rows") + total += cut + } + XCTAssertEqual(seams, 3, "3 枚とも描けていないと比較にならない") + XCTAssertLessThan(total, 20, "継ぎ目で途切れている行が多すぎる -- アイコンが切れている") + } + + /// PNG の 1 列ぶんのアルファ。 + private static func alphaRows(_ png: Data, column: Int) -> [UInt8]? { + guard let image = UIImage(data: png)?.cgImage else { return nil } + let width = image.width + let height = image.height + var pixels = [UInt8](repeating: 0, count: width * height * 4) + guard let context = CGContext( + data: &pixels, width: width, height: height, + bitsPerComponent: 8, bytesPerRow: width * 4, + space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue + ) else { return nil } + context.draw(image, in: CGRect(x: 0, y: 0, width: width, height: height)) + return (0.. ImageIcon { + let size = CGSize(width: 20, height: 20) + let renderer = UIGraphicsImageRenderer(size: size) + let image = renderer.image { context in + color.setFill() + context.fill(CGRect(origin: .zero, size: size)) + } + return ImageIcon(image: image, iconSize: 20) + } + let manager = MarkerManager.defaultManager(minMarkerCount: 1) + for (at, offsetPx) in [3.0, 6.0].enumerated() { + manager.registerEntity( + MarkerEntity( + marker: nil, + state: MarkerState( + position: GeoPoint(latitude: centerLat, longitude: boundaryLon - offsetPx * lonPerPx), + id: "seam-\(at)", + icon: solid(at == 0 ? .red : .blue) + ), + visible: true, + isRendered: true, + tiling: true + ) + ) + } + let renderer = MarkerTileRenderer( + markerManager: manager, + tileSize: 512, + cacheSizeBytes: 1024 * 1024, + declutterPx: 14 + ) + + func colors(_ png: Data) throws -> (red: Int, blue: Int) { + let image = try XCTUnwrap(UIImage(data: png)?.cgImage) + var pixels = [UInt8](repeating: 0, count: image.width * image.height * 4) + let context = CGContext( + data: &pixels, width: image.width, height: image.height, + bitsPerComponent: 8, bytesPerRow: image.width * 4, + space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue + ) + context?.draw(image, in: CGRect(x: 0, y: 0, width: image.width, height: image.height)) + var red = 0, blue = 0 + for at in stride(from: 0, to: pixels.count, by: 4) where pixels[at + 3] > 200 { + if pixels[at] > 200 && pixels[at + 2] < 60 { red += 1 } + if pixels[at + 2] > 200 && pixels[at] < 60 { blue += 1 } + } + return (red, blue) + } + + let west = try XCTUnwrap(renderer.renderTile(request: TileRequest(x: boundaryX - 1, y: y, z: z))) + let east = try XCTUnwrap(renderer.renderTile(request: TileRequest(x: boundaryX, y: y, z: z))) + let w = try colors(west) + let e = try colors(east) + + // 2 本は同じセルなので、生き残りは 1 本だけ。 + XCTAssertTrue((w.red == 0) != (w.blue == 0), "西タイルに両方(または どちらも)描かれている: \(w)") + // マーカーは境界の 3px 西なので、20px のアイコンは東タイルへ 7px はみ出す。 + // 東タイルにも**同じ色**が出ていなければ、境界で切れている。 + XCTAssertTrue((e.red > 0) || (e.blue > 0), "東タイルにはみ出し分が描かれていない") + XCTAssertEqual(w.red > 0, e.red > 0, "左右のタイルが別の木を勝者に選んだ") + XCTAssertEqual(w.blue > 0, e.blue > 0, "左右のタイルが別の木を勝者に選んだ") + } + + /// 同じセルの勝者は、マーカーの**登録順にも**依存しない。 + /// + /// 間引きの勝者を「列挙順で最後」にしていたころ、同セル内の列挙順は + /// `allEntities()` の辞書順 -- 索引を作り直すたびに変わり得る値だった。 + /// 隣のタイルは別の時刻(別の再構築世代)に描かれるので、同じセルを + /// 共有する 2 枚が別の木を勝者に選び、上半分と下半分が別の色の + /// 「割れた丸」になる -- 御茶ノ水の実機で出た形。ここでは同一座標・ + /// 異色の 2 本を**登録順を逆にした 2 つのマネージャ**で描き、どちらも + /// 同じ色を勝者に選ぶことを確かめる。 + func testDeclutterWinnerDoesNotDependOnRegistrationOrder() throws { + let z = 16 + let n = pow(2.0, Double(z)) + let x = Int((139.765 + 180.0) / 360.0 * n) + let y = Int((1.0 - log(tan(35.68 * .pi / 180) + 1.0 / cos(35.68 * .pi / 180)) / .pi) / 2.0 * n) + let lat = atan(sinh(.pi * (1.0 - 2.0 * (Double(y) + 0.5) / n))) * 180.0 / .pi + let lon = (Double(x) + 0.5) / n * 360.0 - 180.0 + + func solid(_ color: UIColor) -> ImageIcon { + let size = CGSize(width: 20, height: 20) + return ImageIcon( + image: UIGraphicsImageRenderer(size: size).image { context in + color.setFill() + context.fill(CGRect(origin: .zero, size: size)) + }, + iconSize: 20 + ) + } + // 同じ ImageIcon インスタンスを両方のマネージャで使う。実機でも種ごとの + // アイコンは共有されるので、これが実際の形。 + let red = solid(.red) + let blue = solid(.blue) + + func png(order: [(String, ImageIcon)]) throws -> Data { + let manager = MarkerManager.defaultManager(minMarkerCount: 1) + for (id, icon) in order { + manager.registerEntity( + MarkerEntity( + marker: nil, + state: MarkerState( + position: GeoPoint(latitude: lat, longitude: lon), + id: id, + icon: icon + ), + visible: true, + isRendered: true, + tiling: true + ) + ) + } + let renderer = MarkerTileRenderer( + markerManager: manager, + tileSize: 512, + cacheSizeBytes: 1024 * 1024, + declutterPx: 14 + ) + return try XCTUnwrap(renderer.renderTile(request: TileRequest(x: x, y: y, z: z))) + } + func colors(_ png: Data) throws -> (red: Int, blue: Int) { + let image = try XCTUnwrap(UIImage(data: png)?.cgImage) + var pixels = [UInt8](repeating: 0, count: image.width * image.height * 4) + let context = CGContext( + data: &pixels, width: image.width, height: image.height, + bitsPerComponent: 8, bytesPerRow: image.width * 4, + space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue + ) + context?.draw(image, in: CGRect(x: 0, y: 0, width: image.width, height: image.height)) + var red = 0, blue = 0 + for at in stride(from: 0, to: pixels.count, by: 4) where pixels[at + 3] > 200 { + if pixels[at] > 200 && pixels[at + 2] < 60 { red += 1 } + if pixels[at + 2] > 200 && pixels[at] < 60 { blue += 1 } + } + return (red, blue) + } + + let forward = try colors(try png(order: [("a", red), ("b", blue)])) + let reversed = try colors(try png(order: [("b", blue), ("a", red)])) + print("ORDERSEAM forward=\(forward) reversed=\(reversed)") + XCTAssertTrue((forward.red == 0) != (forward.blue == 0), "1 本に間引かれていない: \(forward)") + XCTAssertEqual(forward.red > 0, reversed.red > 0, "登録順で勝者が変わった: \(forward) vs \(reversed)") + XCTAssertEqual(forward.blue > 0, reversed.blue > 0, "登録順で勝者が変わった: \(forward) vs \(reversed)") + } +} diff --git a/Tests/MapConductorCoreTests/MarkerTilingFlagTests.swift b/Tests/MapConductorCoreTests/MarkerTilingFlagTests.swift index ae798dd..ee87684 100644 --- a/Tests/MapConductorCoreTests/MarkerTilingFlagTests.swift +++ b/Tests/MapConductorCoreTests/MarkerTilingFlagTests.swift @@ -131,8 +131,13 @@ final class MarkerTilingFlagTests: XCTestCase { // MARK: - Tile renderer - /// `MarkerTileRenderer` はタイル担当だけを焼く。ネイティブ担当しか無ければタイルは出ない。 - func testTileRendererSkipsNativeEntities() { + /// `MarkerTileRenderer` はタイル担当だけを焼く。ネイティブ担当しか無ければ**透明**が出る。 + /// + /// 以前は nil を期待していた。nil はサーバで 404 になり、地図 SDK が + /// 「このタイルは無い」と恒久に覚えてしまう。タイル⇄ネイティブの担当替えの + /// 一瞬に来た要求が 404 になると、そこだけ二度と描かれない穴になった + /// (後楽園で実際に起きた)。空は「透明という絵」で答える。 + func testTileRendererSkipsNativeEntities() throws { let manager = MarkerManager() manager.registerEntity( MarkerEntity( @@ -145,7 +150,23 @@ final class MarkerTilingFlagTests: XCTestCase { ) let renderer = MarkerTileRenderer(markerManager: manager) - XCTAssertNil(renderer.renderTile(request: Self.tileRequest)) + let png = try XCTUnwrap(renderer.renderTile(request: Self.tileRequest), "空でも絵は返る") + // 透明であること: デコードして全ピクセルの alpha が 0。 + let image = try XCTUnwrap(UIImage(data: png)?.cgImage) + let width = image.width, height = image.height + var pixels = [UInt8](repeating: 1, count: width * height * 4) + let context = CGContext( + data: &pixels, width: width, height: height, + bitsPerComponent: 8, bytesPerRow: width * 4, + space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue + ) + context?.clear(CGRect(x: 0, y: 0, width: width, height: height)) + context?.draw(image, in: CGRect(x: 0, y: 0, width: width, height: height)) + XCTAssertTrue( + stride(from: 3, to: pixels.count, by: 4).allSatisfy { pixels[$0] == 0 }, + "ネイティブ担当のマーカーがタイルに描かれている" + ) } /// タイル担当が居ればタイルは出る(上のテストが「常に nil」で通らないことの確認)。 From 1589bbab97b0b2e0ac5b607d1ab678fb22df5615 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Mon, 21 Sep 2026 22:40:22 +0900 Subject: [PATCH 16/28] Dump the API baseline for the marker grid and tile server work --- api/MapConductorCore.api.swift | 3790 ++++++++++++++++---------------- 1 file changed, 1859 insertions(+), 1931 deletions(-) diff --git a/api/MapConductorCore.api.swift b/api/MapConductorCore.api.swift index 3d649bb..571ebc7 100644 --- a/api/MapConductorCore.api.swift +++ b/api/MapConductorCore.api.swift @@ -1,8 +1,10 @@ +import CTilePng import Combine import CoreGraphics import CoreLocation import CoreText import Foundation +import Metal import Network import QuartzCore import Swift @@ -13,1188 +15,1167 @@ import _StringProcessing import _SwiftConcurrencyShims import os public enum InternalMapConductorApi { - public static let spiGroup: Swift.String + public static let spiGroup: Swift::String } @_hasMissingDesignatedInitializers final public class LocalTileServer { - final public var baseUrl: Swift.String { + final public var baseUrl: Swift::String { get } - final public func register(routeId: Swift.String, provider: any MapConductorCore.TileProvider) - final public func unregister(routeId: Swift.String) - final public var isListening: Swift.Bool { + final public func register(routeId: Swift::String, provider: any MapConductorCore::TileProvider) + final public func unregister(routeId: Swift::String) + final public var isListening: Swift::Bool { get } - final public func setForceNoStoreCache(_ value: Swift.Bool) - final public func urlTemplate(routeId: Swift.String, tileSize: Swift.Int) -> Swift.String - final public func urlTemplate(routeId: Swift.String, tileSize: Swift.Int, cacheKey: Swift.String) -> Swift.String + final public func setForceNoStoreCache(_ value: Swift::Bool) + final public func urlTemplate(routeId: Swift::String, tileSize: Swift::Int) -> Swift::String + final public func urlTemplate(routeId: Swift::String, tileSize: Swift::Int, cacheKey: Swift::String) -> Swift::String @available(*, deprecated, message: "`version` is ignored. Use `urlTemplate(routeId:tileSize:)` instead.") - final public func urlTemplate(routeId: Swift.String, version: Swift.Int64) -> Swift.String + final public func urlTemplate(routeId: Swift::String, version: Swift::Int64) -> Swift::String final public func stop() - public static func startServer(forceNoStoreCache: Swift.Bool = false) -> MapConductorCore.LocalTileServer - @objc deinit -} -public struct Markers : MapConductorCore.MapOverlayItemProtocol { - public init(_ states: [MapConductorCore.MarkerState]) - public func append(to content: inout MapConductorCore.MapViewContent) -} -public struct Circles : MapConductorCore.MapOverlayItemProtocol { - public init(_ states: [MapConductorCore.CircleState]) - public func append(to content: inout MapConductorCore.MapViewContent) -} -public struct Polylines : MapConductorCore.MapOverlayItemProtocol { - public init(_ states: [MapConductorCore.PolylineState]) - public func append(to content: inout MapConductorCore.MapViewContent) -} -public struct Polygons : MapConductorCore.MapOverlayItemProtocol { - public init(_ states: [MapConductorCore.PolygonState]) - public func append(to content: inout MapConductorCore.MapViewContent) -} -public struct GroundImages : MapConductorCore.MapOverlayItemProtocol { - public init(_ states: [MapConductorCore.GroundImageState]) - public func append(to content: inout MapConductorCore.MapViewContent) -} -public struct ForArray : MapConductorCore.MapOverlayItemProtocol where Data : Swift.RandomAccessCollection { - public init(_ data: Data, @MapConductorCore.MapViewContentBuilder content: (Data.Element) -> MapConductorCore.MapViewContent) - public func append(to content: inout MapConductorCore.MapViewContent) -} -public struct GroundImage : MapConductorCore.MapOverlayItemProtocol, Swift.Identifiable { - public let id: Swift.String - public let state: MapConductorCore.GroundImageState - public init(state: MapConductorCore.GroundImageState) - public init(bounds: MapConductorCore.GeoRectBounds, image: UIKit.UIImage, opacity: Swift.Double = 0.5, tileSize: Swift.Int = 512, id: Swift.String? = nil, extra: Any? = nil, onClick: MapConductorCore.OnGroundImageEventHandler? = nil) - public func append(to content: inout MapConductorCore.MapViewContent) - public typealias ID = Swift.String -} -public struct RasterLayer : MapConductorCore.MapOverlayItemProtocol, Swift.Identifiable { - public let id: Swift.String - public let state: MapConductorCore.RasterLayerState - public init(state: MapConductorCore.RasterLayerState) - public init(source: MapConductorCore.RasterLayerSource, opacity: Swift.Double = 1.0, visible: Swift.Bool = true, zIndex: Swift.Int = 0, userAgent: Swift.String = RasterLayerState.defaultUserAgent, id: Swift.String? = nil, extraHeaders: [Swift.String : Swift.String]? = nil) - public func append(to content: inout MapConductorCore.MapViewContent) - public typealias ID = Swift.String -} -public struct Marker : MapConductorCore.MapOverlayItemProtocol, Swift.Identifiable { - public let id: Swift.String - public let state: MapConductorCore.MarkerState - public init(state: MapConductorCore.MarkerState) - public init(position: MapConductorCore.GeoPoint, id: Swift.String? = nil, extra: Any? = nil, icon: (any MapConductorCore.MarkerIconProtocol)? = nil, animation: MapConductorCore.MarkerAnimation? = nil, clickable: Swift.Bool = true, draggable: Swift.Bool = false, zIndex: Swift.Int? = nil, onClick: MapConductorCore.OnMarkerEventHandler? = nil, onDragStart: MapConductorCore.OnMarkerEventHandler? = nil, onDrag: MapConductorCore.OnMarkerEventHandler? = nil, onDragEnd: MapConductorCore.OnMarkerEventHandler? = nil, onAnimateStart: MapConductorCore.OnMarkerEventHandler? = nil, onAnimateEnd: MapConductorCore.OnMarkerEventHandler? = nil) - public init(position: MapConductorCore.GeoPoint, id: Swift.String? = nil, extra: Any? = nil, icon: MapConductorCore.DefaultMarkerIcon, animation: MapConductorCore.MarkerAnimation? = nil, clickable: Swift.Bool = true, draggable: Swift.Bool = false, zIndex: Swift.Int? = nil, onClick: MapConductorCore.OnMarkerEventHandler? = nil, onDragStart: MapConductorCore.OnMarkerEventHandler? = nil, onDrag: MapConductorCore.OnMarkerEventHandler? = nil, onDragEnd: MapConductorCore.OnMarkerEventHandler? = nil, onAnimateStart: MapConductorCore.OnMarkerEventHandler? = nil, onAnimateEnd: MapConductorCore.OnMarkerEventHandler? = nil) - public func append(to content: inout MapConductorCore.MapViewContent) - public typealias ID = Swift.String -} -public struct InfoBubble : MapConductorCore.MapOverlayItemProtocol, Swift.Identifiable { - public let id: Swift.String - public let marker: MapConductorCore.MarkerState - public let tailOffset: CoreFoundation.CGPoint - public let useIconMetrics: Swift.Bool - public var swiftUIContent: SwiftUICore.AnyView? { - get - } - public var uiViewContent: UIKit.UIView? { - get - } - public init(marker: MapConductorCore.MarkerState, bubbleColor: SwiftUICore.Color = .white, borderColor: SwiftUICore.Color = .black, borderWidth: CoreFoundation.CGFloat = 2.0, contentPadding: CoreFoundation.CGFloat = 8.0, cornerRadius: CoreFoundation.CGFloat = 4.0, tailSize: CoreFoundation.CGFloat = 8.0, @SwiftUICore.ViewBuilder content: () -> Content) where Content : SwiftUICore.View - public init(position: MapConductorCore.GeoPoint, id: Swift.String? = nil, bubbleColor: SwiftUICore.Color = .white, borderColor: SwiftUICore.Color = .black, borderWidth: CoreFoundation.CGFloat = 2.0, contentPadding: CoreFoundation.CGFloat = 8.0, cornerRadius: CoreFoundation.CGFloat = 4.0, tailSize: CoreFoundation.CGFloat = 8.0, @SwiftUICore.ViewBuilder content: () -> Content) where Content : SwiftUICore.View - public init(marker: MapConductorCore.MarkerState, tailOffset: CoreFoundation.CGPoint = CGPoint(x: 0.5, y: 1.0), uiViewContent: UIKit.UIView) - public init(position: MapConductorCore.GeoPoint, id: Swift.String? = nil, tailOffset: CoreFoundation.CGPoint = CGPoint(x: 0.5, y: 1.0), uiViewContent: UIKit.UIView) - public func append(to content: inout MapConductorCore.MapViewContent) - public typealias ID = Swift.String -} -public struct InfoBubbleCustom : MapConductorCore.MapOverlayItemProtocol, Swift.Identifiable { - public let id: Swift.String - public init(marker: MapConductorCore.MarkerState, tailOffset: CoreFoundation.CGPoint, @SwiftUICore.ViewBuilder content: () -> Content) where Content : SwiftUICore.View - public init(marker: MapConductorCore.MarkerState, tailOffset: CoreFoundation.CGPoint, uiViewContent: UIKit.UIView) - public func append(to content: inout MapConductorCore.MapViewContent) - public typealias ID = Swift.String -} -public struct Polyline : MapConductorCore.MapOverlayItemProtocol, Swift.Identifiable { - public let id: Swift.String - public let state: MapConductorCore.PolylineState - public init(state: MapConductorCore.PolylineState) - public init(points: [any MapConductorCore.GeoPointProtocol], id: Swift.String? = nil, strokeColor: UIKit.UIColor = .black, strokeWidth: Swift.Double = 1.0, geodesic: Swift.Bool = false, zIndex: Swift.Int = 0, extra: Any? = nil, onClick: MapConductorCore.OnPolylineEventHandler? = nil) - public init(bounds: MapConductorCore.GeoRectBounds, id: Swift.String? = nil, strokeColor: UIKit.UIColor = .black, strokeWidth: Swift.Double = 1.0, geodesic: Swift.Bool = false, zIndex: Swift.Int = 0, extra: Any? = nil, onClick: MapConductorCore.OnPolylineEventHandler? = nil) - public func append(to content: inout MapConductorCore.MapViewContent) - public typealias ID = Swift.String -} -public struct Polygon : MapConductorCore.MapOverlayItemProtocol, Swift.Identifiable { - public let id: Swift.String - public let state: MapConductorCore.PolygonState - public init(state: MapConductorCore.PolygonState) - public init(points: [any MapConductorCore.GeoPointProtocol], holes: [[any MapConductorCore.GeoPointProtocol]] = [], id: Swift.String? = nil, strokeColor: UIKit.UIColor = .black, strokeWidth: Swift.Double = 1.0, fillColor: UIKit.UIColor = .clear, geodesic: Swift.Bool = false, zIndex: Swift.Int = 0, extra: Any? = nil, onClick: MapConductorCore.OnPolygonEventHandler? = nil) - public init(bounds: MapConductorCore.GeoRectBounds, id: Swift.String? = nil, strokeColor: UIKit.UIColor = .black, strokeWidth: Swift.Double = 1.0, fillColor: UIKit.UIColor = .clear, geodesic: Swift.Bool = false, zIndex: Swift.Int = 0, extra: Any? = nil, onClick: MapConductorCore.OnPolygonEventHandler? = nil) - public func append(to content: inout MapConductorCore.MapViewContent) - public typealias ID = Swift.String -} -public struct Circle : MapConductorCore.MapOverlayItemProtocol, Swift.Identifiable { - public let id: Swift.String - public let state: MapConductorCore.CircleState - public init(state: MapConductorCore.CircleState) - public init(center: any MapConductorCore.GeoPointProtocol, radiusMeters: Swift.Double, geodesic: Swift.Bool = true, clickable: Swift.Bool = true, strokeColor: UIKit.UIColor = .red, strokeWidth: Swift.Double = 2.0, fillColor: UIKit.UIColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 0.5), id: Swift.String? = nil, zIndex: Swift.Int? = nil, extra: Any? = nil, onClick: MapConductorCore.OnCircleEventHandler? = nil) - public func append(to content: inout MapConductorCore.MapViewContent) - public typealias ID = Swift.String -} -public struct MapUISettings : Swift.Equatable { - public var scrollGesture: Swift.Bool - public var zoomGesture: Swift.Bool - public var rotateGesture: Swift.Bool - public var tiltGesture: Swift.Bool - public init(scrollGesture: Swift.Bool = true, zoomGesture: Swift.Bool = true, rotateGesture: Swift.Bool = true, tiltGesture: Swift.Bool = true) - public static let Default: MapConductorCore.MapUISettings - public static let None: MapConductorCore.MapUISettings - public static func == (a: MapConductorCore.MapUISettings, b: MapConductorCore.MapUISettings) -> Swift.Bool -} -public enum MapGesture : Swift.String, Swift.CaseIterable, Swift.Sendable { + public static func startServer(forceNoStoreCache: Swift::Bool = false) -> MapConductorCore::LocalTileServer + @objc deinit +} +public struct Markers : MapConductorCore::MapOverlayItemProtocol { + public init(_ states: [MapConductorCore::MarkerState]) + public func append(to content: inout MapConductorCore::MapViewContent) +} +public struct Circles : MapConductorCore::MapOverlayItemProtocol { + public init(_ states: [MapConductorCore::CircleState]) + public func append(to content: inout MapConductorCore::MapViewContent) +} +public struct Polylines : MapConductorCore::MapOverlayItemProtocol { + public init(_ states: [MapConductorCore::PolylineState]) + public func append(to content: inout MapConductorCore::MapViewContent) +} +public struct Polygons : MapConductorCore::MapOverlayItemProtocol { + public init(_ states: [MapConductorCore::PolygonState]) + public func append(to content: inout MapConductorCore::MapViewContent) +} +public struct GroundImages : MapConductorCore::MapOverlayItemProtocol { + public init(_ states: [MapConductorCore::GroundImageState]) + public func append(to content: inout MapConductorCore::MapViewContent) +} +public struct ForArray : MapConductorCore::MapOverlayItemProtocol where Data : Swift::RandomAccessCollection { + public init(_ data: Data, @MapConductorCore::MapViewContentBuilder content: (Data.Element) -> MapConductorCore::MapViewContent) + public func append(to content: inout MapConductorCore::MapViewContent) +} +public struct GroundImage : MapConductorCore::MapOverlayItemProtocol, Swift::Identifiable { + public let id: Swift::String + public let state: MapConductorCore::GroundImageState + public init(state: MapConductorCore::GroundImageState) + public init(bounds: MapConductorCore::GeoRectBounds, image: UIKit::UIImage, opacity: Swift::Double = 0.5, tileSize: Swift::Int = 512, id: Swift::String? = nil, extra: Any? = nil, onClick: MapConductorCore::OnGroundImageEventHandler? = nil) + public func append(to content: inout MapConductorCore::MapViewContent) + public typealias ID = Swift::String +} +public struct RasterLayer : MapConductorCore::MapOverlayItemProtocol, Swift::Identifiable { + public let id: Swift::String + public let state: MapConductorCore::RasterLayerState + public init(state: MapConductorCore::RasterLayerState) + public init(source: MapConductorCore::RasterLayerSource, opacity: Swift::Double = 1.0, visible: Swift::Bool = true, zIndex: Swift::Int = 0, userAgent: Swift::String = RasterLayerState.defaultUserAgent, id: Swift::String? = nil, extraHeaders: [Swift::String : Swift::String]? = nil) + public func append(to content: inout MapConductorCore::MapViewContent) + public typealias ID = Swift::String +} +public struct Marker : MapConductorCore::MapOverlayItemProtocol, Swift::Identifiable { + public let id: Swift::String + public let state: MapConductorCore::MarkerState + public init(state: MapConductorCore::MarkerState) + public init(position: MapConductorCore::GeoPoint, id: Swift::String? = nil, extra: Any? = nil, icon: (any MapConductorCore::MarkerIconProtocol)? = nil, animation: MapConductorCore::MarkerAnimation? = nil, clickable: Swift::Bool = true, draggable: Swift::Bool = false, zIndex: Swift::Int? = nil, onClick: MapConductorCore::OnMarkerEventHandler? = nil, onDragStart: MapConductorCore::OnMarkerEventHandler? = nil, onDrag: MapConductorCore::OnMarkerEventHandler? = nil, onDragEnd: MapConductorCore::OnMarkerEventHandler? = nil, onAnimateStart: MapConductorCore::OnMarkerEventHandler? = nil, onAnimateEnd: MapConductorCore::OnMarkerEventHandler? = nil) + public init(position: MapConductorCore::GeoPoint, id: Swift::String? = nil, extra: Any? = nil, icon: MapConductorCore::DefaultMarkerIcon, animation: MapConductorCore::MarkerAnimation? = nil, clickable: Swift::Bool = true, draggable: Swift::Bool = false, zIndex: Swift::Int? = nil, onClick: MapConductorCore::OnMarkerEventHandler? = nil, onDragStart: MapConductorCore::OnMarkerEventHandler? = nil, onDrag: MapConductorCore::OnMarkerEventHandler? = nil, onDragEnd: MapConductorCore::OnMarkerEventHandler? = nil, onAnimateStart: MapConductorCore::OnMarkerEventHandler? = nil, onAnimateEnd: MapConductorCore::OnMarkerEventHandler? = nil) + public func append(to content: inout MapConductorCore::MapViewContent) + public typealias ID = Swift::String +} +public struct InfoBubble : MapConductorCore::MapOverlayItemProtocol, Swift::Identifiable { + public let id: Swift::String + public let marker: MapConductorCore::MarkerState + public let tailOffset: CoreFoundation::CGPoint + public let useIconMetrics: Swift::Bool + public var swiftUIContent: SwiftUICore::AnyView? { + get + } + public var uiViewContent: UIKit::UIView? { + get + } + public init(marker: MapConductorCore::MarkerState, bubbleColor: SwiftUICore::Color = .white, borderColor: SwiftUICore::Color = .black, borderWidth: CoreFoundation::CGFloat = 2.0, contentPadding: CoreFoundation::CGFloat = 8.0, cornerRadius: CoreFoundation::CGFloat = 4.0, tailSize: CoreFoundation::CGFloat = 8.0, @SwiftUICore::ViewBuilder content: () -> Content) where Content : SwiftUICore::View + public init(position: MapConductorCore::GeoPoint, id: Swift::String? = nil, bubbleColor: SwiftUICore::Color = .white, borderColor: SwiftUICore::Color = .black, borderWidth: CoreFoundation::CGFloat = 2.0, contentPadding: CoreFoundation::CGFloat = 8.0, cornerRadius: CoreFoundation::CGFloat = 4.0, tailSize: CoreFoundation::CGFloat = 8.0, @SwiftUICore::ViewBuilder content: () -> Content) where Content : SwiftUICore::View + public init(marker: MapConductorCore::MarkerState, tailOffset: CoreFoundation::CGPoint = CGPoint(x: 0.5, y: 1.0), uiViewContent: UIKit::UIView) + public init(position: MapConductorCore::GeoPoint, id: Swift::String? = nil, tailOffset: CoreFoundation::CGPoint = CGPoint(x: 0.5, y: 1.0), uiViewContent: UIKit::UIView) + public func append(to content: inout MapConductorCore::MapViewContent) + public typealias ID = Swift::String +} +public struct InfoBubbleCustom : MapConductorCore::MapOverlayItemProtocol, Swift::Identifiable { + public let id: Swift::String + public init(marker: MapConductorCore::MarkerState, tailOffset: CoreFoundation::CGPoint, @SwiftUICore::ViewBuilder content: () -> Content) where Content : SwiftUICore::View + public init(marker: MapConductorCore::MarkerState, tailOffset: CoreFoundation::CGPoint, uiViewContent: UIKit::UIView) + public func append(to content: inout MapConductorCore::MapViewContent) + public typealias ID = Swift::String +} +public struct Polyline : MapConductorCore::MapOverlayItemProtocol, Swift::Identifiable { + public let id: Swift::String + public let state: MapConductorCore::PolylineState + public init(state: MapConductorCore::PolylineState) + public init(points: [any MapConductorCore::GeoPointProtocol], id: Swift::String? = nil, strokeColor: UIKit::UIColor = .black, strokeWidth: Swift::Double = 1.0, geodesic: Swift::Bool = false, zIndex: Swift::Int = 0, extra: Any? = nil, onClick: MapConductorCore::OnPolylineEventHandler? = nil) + public init(bounds: MapConductorCore::GeoRectBounds, id: Swift::String? = nil, strokeColor: UIKit::UIColor = .black, strokeWidth: Swift::Double = 1.0, geodesic: Swift::Bool = false, zIndex: Swift::Int = 0, extra: Any? = nil, onClick: MapConductorCore::OnPolylineEventHandler? = nil) + public func append(to content: inout MapConductorCore::MapViewContent) + public typealias ID = Swift::String +} +public struct Polygon : MapConductorCore::MapOverlayItemProtocol, Swift::Identifiable { + public let id: Swift::String + public let state: MapConductorCore::PolygonState + public init(state: MapConductorCore::PolygonState) + public init(points: [any MapConductorCore::GeoPointProtocol], holes: [[any MapConductorCore::GeoPointProtocol]] = [], id: Swift::String? = nil, strokeColor: UIKit::UIColor = .black, strokeWidth: Swift::Double = 1.0, fillColor: UIKit::UIColor = .clear, geodesic: Swift::Bool = false, zIndex: Swift::Int = 0, extra: Any? = nil, onClick: MapConductorCore::OnPolygonEventHandler? = nil) + public init(bounds: MapConductorCore::GeoRectBounds, id: Swift::String? = nil, strokeColor: UIKit::UIColor = .black, strokeWidth: Swift::Double = 1.0, fillColor: UIKit::UIColor = .clear, geodesic: Swift::Bool = false, zIndex: Swift::Int = 0, extra: Any? = nil, onClick: MapConductorCore::OnPolygonEventHandler? = nil) + public func append(to content: inout MapConductorCore::MapViewContent) + public typealias ID = Swift::String +} +public struct Circle : MapConductorCore::MapOverlayItemProtocol, Swift::Identifiable { + public let id: Swift::String + public let state: MapConductorCore::CircleState + public init(state: MapConductorCore::CircleState) + public init(center: any MapConductorCore::GeoPointProtocol, radiusMeters: Swift::Double, geodesic: Swift::Bool = true, clickable: Swift::Bool = true, strokeColor: UIKit::UIColor = .red, strokeWidth: Swift::Double = 2.0, fillColor: UIKit::UIColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 0.5), id: Swift::String? = nil, zIndex: Swift::Int? = nil, extra: Any? = nil, onClick: MapConductorCore::OnCircleEventHandler? = nil) + public func append(to content: inout MapConductorCore::MapViewContent) + public typealias ID = Swift::String +} +public struct MapUISettings : Swift::Equatable { + public var scrollGesture: Swift::Bool + public var zoomGesture: Swift::Bool + public var rotateGesture: Swift::Bool + public var tiltGesture: Swift::Bool + public init(scrollGesture: Swift::Bool = true, zoomGesture: Swift::Bool = true, rotateGesture: Swift::Bool = true, tiltGesture: Swift::Bool = true) + public static let Default: MapConductorCore::MapUISettings + public static let None: MapConductorCore::MapUISettings + public static func == (a: MapConductorCore::MapUISettings, b: MapConductorCore::MapUISettings) -> Swift::Bool +} +public enum MapGesture : Swift::String, Swift::CaseIterable, Swift::Sendable { case scroll case zoom case rotate case tilt - public var settingName: Swift.String { + public var settingName: Swift::String { get } - public init?(rawValue: Swift.String) - public typealias AllCases = [MapConductorCore.MapGesture] - public typealias RawValue = Swift.String - nonisolated public static var allCases: [MapConductorCore.MapGesture] { + public init?(rawValue: Swift::String) + public typealias AllCases = [MapConductorCore::MapGesture] + public typealias RawValue = Swift::String + nonisolated public static var allCases: [MapConductorCore::MapGesture] { get } - public var rawValue: Swift.String { + public var rawValue: Swift::String { get } } public enum MapUISettingsDiagnostics { - public static func warnIfRequested(_ requested: Swift.Bool, gesture: MapConductorCore.MapGesture, provider: Swift.String, reason: Swift.String) + public static func warnIfRequested(_ requested: Swift::Bool, gesture: MapConductorCore::MapGesture, provider: Swift::String, reason: Swift::String) public static func resetWarnings() } -public struct MapViewHandlers where State : MapConductorCore.MapViewStateProtocol { - public let onMapLoaded: MapConductorCore.OnMapLoadedHandler? - public let onMapClick: MapConductorCore.OnMapEventHandler? - public let onMapLongClick: MapConductorCore.OnMapEventHandler? - public let onCameraMoveStart: MapConductorCore.OnCameraMoveHandler? - public let onCameraMove: MapConductorCore.OnCameraMoveHandler? - public let onCameraMoveEnd: MapConductorCore.OnCameraMoveHandler? - public let sdkInitialize: (() -> Swift.Void)? - public init(onMapLoaded: MapConductorCore.OnMapLoadedHandler? = nil, onMapClick: MapConductorCore.OnMapEventHandler? = nil, onMapLongClick: MapConductorCore.OnMapEventHandler? = nil, onCameraMoveStart: MapConductorCore.OnCameraMoveHandler? = nil, onCameraMove: MapConductorCore.OnCameraMoveHandler? = nil, onCameraMoveEnd: MapConductorCore.OnCameraMoveHandler? = nil, sdkInitialize: (() -> Swift.Void)? = nil) +public struct MapViewHandlers where State : MapConductorCore::MapViewStateProtocol { + public let onMapLoaded: MapConductorCore::OnMapLoadedHandler? + public let onMapClick: MapConductorCore::OnMapEventHandler? + public let onMapLongClick: MapConductorCore::OnMapEventHandler? + public let onCameraMoveStart: MapConductorCore::OnCameraMoveHandler? + public let onCameraMove: MapConductorCore::OnCameraMoveHandler? + public let onCameraMoveEnd: MapConductorCore::OnCameraMoveHandler? + public let sdkInitialize: (() -> Swift::Void)? + public init(onMapLoaded: MapConductorCore::OnMapLoadedHandler? = nil, onMapClick: MapConductorCore::OnMapEventHandler? = nil, onMapLongClick: MapConductorCore::OnMapEventHandler? = nil, onCameraMoveStart: MapConductorCore::OnCameraMoveHandler? = nil, onCameraMove: MapConductorCore::OnCameraMoveHandler? = nil, onCameraMoveEnd: MapConductorCore::OnCameraMoveHandler? = nil, sdkInitialize: (() -> Swift::Void)? = nil) } -@_Concurrency.MainActor @preconcurrency public struct MapViewBase : SwiftUICore.View where MapContent : SwiftUICore.View, TopContent : SwiftUICore.View { - @_Concurrency.MainActor @preconcurrency public init(attributionRules: [MapConductorCore.AttributionRule], camera: any MapConductorCore.MapCameraPositionProtocol, content: MapConductorCore.MapViewContent, @SwiftUICore.ViewBuilder mapContent: @escaping () -> MapContent, @SwiftUICore.ViewBuilder topContent: @escaping () -> TopContent) - @_Concurrency.MainActor @preconcurrency public var body: some SwiftUICore.View { +@_Concurrency::MainActor @preconcurrency public struct MapViewBase : SwiftUICore::View where MapContent : SwiftUICore::View, TopContent : SwiftUICore::View { + @_Concurrency::MainActor @preconcurrency public init(attributionRules: [MapConductorCore::AttributionRule], camera: any MapConductorCore::MapCameraPositionProtocol, content: MapConductorCore::MapViewContent, @SwiftUICore::ViewBuilder mapContent: @escaping () -> MapContent, @SwiftUICore::ViewBuilder topContent: @escaping () -> TopContent) + @_Concurrency::MainActor @preconcurrency public var body: some SwiftUICore::View { get } public typealias Body = @_opaqueReturnTypeOf("$s16MapConductorCore0A8ViewBaseV4bodyQrvp", 0) __ } -extension MapConductorCore.MapViewBase where TopContent == SwiftUICore.EmptyView { - @_Concurrency.MainActor @preconcurrency public init(attributionRules: [MapConductorCore.AttributionRule], camera: any MapConductorCore.MapCameraPositionProtocol, content: MapConductorCore.MapViewContent, @SwiftUICore.ViewBuilder mapContent: @escaping () -> MapContent) +extension MapConductorCore::MapViewBase where TopContent == SwiftUICore::EmptyView { + @_Concurrency::MainActor @preconcurrency public init(attributionRules: [MapConductorCore::AttributionRule], camera: any MapConductorCore::MapCameraPositionProtocol, content: MapConductorCore::MapViewContent, @SwiftUICore::ViewBuilder mapContent: @escaping () -> MapContent) } -@_Concurrency.MainActor open class MapViewCoordinatorBase : ObjectiveC.NSObject where State : MapConductorCore.MapViewStateProtocol { - @_Concurrency.MainActor final public let state: State - @_Concurrency.MainActor final public let handlers: MapConductorCore.MapViewHandlers - @_Concurrency.MainActor final public let infoBubbleContainer: MapConductorCore.PassthroughContainerView - @_Concurrency.MainActor public var didCallMapLoaded: Swift.Bool { +@_Concurrency::MainActor open class MapViewCoordinatorBase : ObjectiveC::NSObject where State : MapConductorCore::MapViewStateProtocol { + @_Concurrency::MainActor final public let state: State + @_Concurrency::MainActor final public let handlers: MapConductorCore::MapViewHandlers + @_Concurrency::MainActor final public let infoBubbleContainer: MapConductorCore::PassthroughContainerView + @_Concurrency::MainActor public var didCallMapLoaded: Swift::Bool { get } - @_Concurrency.MainActor public init(state: State, handlers: MapConductorCore.MapViewHandlers) - @_Concurrency.MainActor public func screenProjectionGate(feature: Swift.String) -> () -> Swift.Bool - @_Concurrency.MainActor public var onMapLoaded: MapConductorCore.OnMapLoadedHandler? { + @_Concurrency::MainActor public init(state: State, handlers: MapConductorCore::MapViewHandlers) + @_Concurrency::MainActor public func screenProjectionGate(feature: Swift::String) -> () -> Swift::Bool + @_Concurrency::MainActor public var onMapLoaded: MapConductorCore::OnMapLoadedHandler? { get } - @_Concurrency.MainActor public var onMapClick: MapConductorCore.OnMapEventHandler? { + @_Concurrency::MainActor public var onMapClick: MapConductorCore::OnMapEventHandler? { get } - @_Concurrency.MainActor public var onMapLongClick: MapConductorCore.OnMapEventHandler? { + @_Concurrency::MainActor public var onMapLongClick: MapConductorCore::OnMapEventHandler? { get } - @_Concurrency.MainActor public var onCameraMoveStart: MapConductorCore.OnCameraMoveHandler? { + @_Concurrency::MainActor public var onCameraMoveStart: MapConductorCore::OnCameraMoveHandler? { get } - @_Concurrency.MainActor public var onCameraMove: MapConductorCore.OnCameraMoveHandler? { + @_Concurrency::MainActor public var onCameraMove: MapConductorCore::OnCameraMoveHandler? { get } - @_Concurrency.MainActor public var onCameraMoveEnd: MapConductorCore.OnCameraMoveHandler? { + @_Concurrency::MainActor public var onCameraMoveEnd: MapConductorCore::OnCameraMoveHandler? { get } - @_Concurrency.MainActor public static func runOnce(_ initializer: () -> Swift.Void) - @_Concurrency.MainActor public func performMapLoadedOnce(_ body: () -> Swift.Void) - @_Concurrency.MainActor public func applyCameraRestriction(_ restriction: MapConductorCore.CameraRestriction?, to controller: (any MapConductorCore.MapViewControllerProtocol)?) - @_Concurrency.MainActor public func reapplyCameraRestriction(to controller: (any MapConductorCore.MapViewControllerProtocol)?) - @_Concurrency.MainActor public func attachInfoBubbleContainer(to hostView: UIKit.UIView) + @_Concurrency::MainActor public static func runOnce(_ initializer: () -> Swift::Void) + @_Concurrency::MainActor public func performMapLoadedOnce(_ body: () -> Swift::Void) + @_Concurrency::MainActor public func applyCameraRestriction(_ restriction: MapConductorCore::CameraRestriction?, to controller: (any MapConductorCore::MapViewControllerProtocol)?) + @_Concurrency::MainActor public func reapplyCameraRestriction(to controller: (any MapConductorCore::MapViewControllerProtocol)?) + @_Concurrency::MainActor public func attachInfoBubbleContainer(to hostView: UIKit::UIView) @objc deinit } -public typealias OnMapLoadedHandler = (State) -> Swift.Void where State : MapConductorCore.MapViewStateProtocol -public typealias OnMapEventHandler = (MapConductorCore.GeoPoint) -> Swift.Void -public typealias OnCameraMoveHandler = (MapConductorCore.MapCameraPosition) -> Swift.Void +public typealias OnMapLoadedHandler = (State) -> Swift::Void where State : MapConductorCore::MapViewStateProtocol +public typealias OnMapEventHandler = (MapConductorCore::GeoPoint) -> Swift::Void +public typealias OnCameraMoveHandler = (MapConductorCore::MapCameraPosition) -> Swift::Void public protocol MapOverlayItemProtocol { - func append(to content: inout MapConductorCore.MapViewContent) + func append(to content: inout MapConductorCore::MapViewContent) } -public protocol ViewBasedMapOverlay : MapConductorCore.MapOverlayItemProtocol, SwiftUICore.View { +public protocol ViewBasedMapOverlay : MapConductorCore::MapOverlayItemProtocol, SwiftUICore::View { } public struct MapViewContent { - public var markers: [MapConductorCore.Marker] - public var infoBubbles: [MapConductorCore.InfoBubble] - public var polylines: [MapConductorCore.Polyline] - public var polygons: [MapConductorCore.Polygon] - public var circles: [MapConductorCore.Circle] - public var groundImages: [MapConductorCore.GroundImage] - public var rasterLayers: [MapConductorCore.RasterLayer] - public var views: [SwiftUICore.AnyView] - public var markerTilingOptions: MapConductorCore.MarkerTilingOptions - public var polygonSyncHandlers: [any MapConductorCore.PolygonSyncHandler] + public var markers: [MapConductorCore::Marker] + public var infoBubbles: [MapConductorCore::InfoBubble] + public var polylines: [MapConductorCore::Polyline] + public var polygons: [MapConductorCore::Polygon] + public var circles: [MapConductorCore::Circle] + public var groundImages: [MapConductorCore::GroundImage] + public var rasterLayers: [MapConductorCore::RasterLayer] + public var views: [SwiftUICore::AnyView] + public var markerTilingOptions: MapConductorCore::MarkerTilingOptions + public var polygonSyncHandlers: [any MapConductorCore::PolygonSyncHandler] public init() } @_functionBuilder public enum MapViewContentBuilder { - public static func buildBlock() -> MapConductorCore.MapViewContent - public static func buildBlock(_ components: MapConductorCore.MapViewContent...) -> MapConductorCore.MapViewContent - public static func buildOptional(_ component: MapConductorCore.MapViewContent?) -> MapConductorCore.MapViewContent - public static func buildEither(first component: MapConductorCore.MapViewContent) -> MapConductorCore.MapViewContent - public static func buildEither(second component: MapConductorCore.MapViewContent) -> MapConductorCore.MapViewContent - public static func buildArray(_ components: [MapConductorCore.MapViewContent]) -> MapConductorCore.MapViewContent - public static func buildExpression(_ expression: T) -> MapConductorCore.MapViewContent where T : MapConductorCore.ViewBasedMapOverlay - @_disfavoredOverload public static func buildExpression(_ expression: any MapConductorCore.MapOverlayItemProtocol) -> MapConductorCore.MapViewContent - public static func buildExpression(_ expression: MapConductorCore.MapViewContent) -> MapConductorCore.MapViewContent + public static func buildBlock() -> MapConductorCore::MapViewContent + public static func buildBlock(_ components: MapConductorCore::MapViewContent...) -> MapConductorCore::MapViewContent + public static func buildOptional(_ component: MapConductorCore::MapViewContent?) -> MapConductorCore::MapViewContent + public static func buildEither(first component: MapConductorCore::MapViewContent) -> MapConductorCore::MapViewContent + public static func buildEither(second component: MapConductorCore::MapViewContent) -> MapConductorCore::MapViewContent + public static func buildArray(_ components: [MapConductorCore::MapViewContent]) -> MapConductorCore::MapViewContent + public static func buildExpression(_ expression: T) -> MapConductorCore::MapViewContent where T : MapConductorCore::ViewBasedMapOverlay + @_disfavoredOverload public static func buildExpression(_ expression: any MapConductorCore::MapOverlayItemProtocol) -> MapConductorCore::MapViewContent + public static func buildExpression(_ expression: MapConductorCore::MapViewContent) -> MapConductorCore::MapViewContent } public protocol TileProvider : AnyObject { - func renderTile(request: MapConductorCore.TileRequest) -> Foundation.Data? + func renderTile(request: MapConductorCore::TileRequest) -> Foundation::Data? + func renderTile(request: MapConductorCore::TileRequest, isCancelled: () -> Swift::Bool) -> Foundation::Data? } -public struct TileRequest : Swift.Hashable { - public let x: Swift.Int - public let y: Swift.Int - public let z: Swift.Int - public let pixelRatio: Swift.Int - public init(x: Swift.Int, y: Swift.Int, z: Swift.Int, pixelRatio: Swift.Int = 1) - public static func == (a: MapConductorCore.TileRequest, b: MapConductorCore.TileRequest) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { +extension MapConductorCore::TileProvider { + public func renderTile(request: MapConductorCore::TileRequest, isCancelled: () -> Swift::Bool) -> Foundation::Data? +} +public struct TileRequest : Swift::Hashable { + public let x: Swift::Int + public let y: Swift::Int + public let z: Swift::Int + public let pixelRatio: Swift::Int + public init(x: Swift::Int, y: Swift::Int, z: Swift::Int, pixelRatio: Swift::Int = 1) + public static func == (a: MapConductorCore::TileRequest, b: MapConductorCore::TileRequest) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { get } } public enum TileServerRegistry { - public static func get() -> MapConductorCore.LocalTileServer - public static func get(forceNoStoreCache: Swift.Bool) -> MapConductorCore.LocalTileServer - public static func setForceNoStoreCache(_ value: Swift.Bool) + public static func get() -> MapConductorCore::LocalTileServer + public static func get(forceNoStoreCache: Swift::Bool) -> MapConductorCore::LocalTileServer + public static func setForceNoStoreCache(_ value: Swift::Bool) } -public typealias Long = Swift.Int64 +public typealias Long = Swift::Int64 final public class CoroutineScope { public init() @objc deinit } -open class CircleController : MapConductorCore.OverlayControllerProtocol, MapConductorCore.SlottedOverlayController where ActualCircle == Renderer.ActualCircle, Renderer : MapConductorCore.CircleOverlayRendererProtocol { - public typealias StateType = MapConductorCore.CircleState - public typealias EntityType = MapConductorCore.CircleEntity - public typealias EventType = MapConductorCore.CircleEvent - final public let circleManager: MapConductorCore.CircleManager +open class CircleController : MapConductorCore::OverlayControllerProtocol, MapConductorCore::SlottedOverlayController where ActualCircle == Renderer.ActualCircle, Renderer : MapConductorCore::CircleOverlayRendererProtocol { + public typealias StateType = MapConductorCore::CircleState + public typealias EntityType = MapConductorCore::CircleEntity + public typealias EventType = MapConductorCore::CircleEvent + final public let circleManager: MapConductorCore::CircleManager open var renderer: Renderer - final public let zIndex: Swift.Int - public var clickListener: ((MapConductorCore.CircleEvent) -> Swift.Void)? - public init(circleManager: MapConductorCore.CircleManager, renderer: Renderer, clickListener: ((MapConductorCore.CircleEvent) -> Swift.Void)? = nil) - public func dispatchClick(event: MapConductorCore.CircleEvent) - open func add(data: [MapConductorCore.CircleState]) async - open func update(state: MapConductorCore.CircleState) async + final public let zIndex: Swift::Int + public var clickListener: ((MapConductorCore::CircleEvent) -> Swift::Void)? + public init(circleManager: MapConductorCore::CircleManager, renderer: Renderer, clickListener: ((MapConductorCore::CircleEvent) -> Swift::Void)? = nil) + public func dispatchClick(event: MapConductorCore::CircleEvent) + open func add(data: [MapConductorCore::CircleState]) async + open func update(state: MapConductorCore::CircleState) async open func clear() async - open func find(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.CircleEntity? - open func onCameraChanged(mapCameraPosition: MapConductorCore.MapCameraPosition) async + open func find(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::CircleEntity? + open func onCameraChanged(mapCameraPosition: MapConductorCore::MapCameraPosition) async open func destroy() - public var kind: MapConductorCore.OverlayKind { + public var kind: MapConductorCore::OverlayKind { get } - public func hasId(_ id: Swift.String) -> Swift.Bool - public func resolveTap(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.OverlayHit? + public func hasId(_ id: Swift::String) -> Swift::Bool + public func resolveTap(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::OverlayHit? @objc deinit } public protocol CircleEntityProtocol { associatedtype ActualCircle var circle: Self.ActualCircle? { get set } - var state: MapConductorCore.CircleState { get } - var fingerPrint: MapConductorCore.CircleFingerPrint { get } + var state: MapConductorCore::CircleState { get } + var fingerPrint: MapConductorCore::CircleFingerPrint { get } } -final public class CircleEntity : MapConductorCore.CircleEntityProtocol { +final public class CircleEntity : MapConductorCore::CircleEntityProtocol { final public var circle: ActualCircle? - final public let state: MapConductorCore.CircleState - final public let fingerPrint: MapConductorCore.CircleFingerPrint - public init(circle: ActualCircle?, state: MapConductorCore.CircleState) + final public let state: MapConductorCore::CircleState + final public let fingerPrint: MapConductorCore::CircleFingerPrint + public init(circle: ActualCircle?, state: MapConductorCore::CircleState) @objc deinit } public protocol CircleManagerProtocol { associatedtype ActualCircle - func registerEntity(_ entity: MapConductorCore.CircleEntity) - func removeEntity(_ id: Swift.String) -> MapConductorCore.CircleEntity? - func getEntity(_ id: Swift.String) -> MapConductorCore.CircleEntity? - func hasEntity(_ id: Swift.String) -> Swift.Bool - func allEntities() -> [MapConductorCore.CircleEntity] + func registerEntity(_ entity: MapConductorCore::CircleEntity) + func removeEntity(_ id: Swift::String) -> MapConductorCore::CircleEntity? + func getEntity(_ id: Swift::String) -> MapConductorCore::CircleEntity? + func hasEntity(_ id: Swift::String) -> Swift::Bool + func allEntities() -> [MapConductorCore::CircleEntity] func clear() - func find(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.CircleEntity? + func find(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::CircleEntity? } -final public class CircleManager : MapConductorCore.CircleManagerProtocol { +final public class CircleManager : MapConductorCore::CircleManagerProtocol { public init() - final public func registerEntity(_ entity: MapConductorCore.CircleEntity) - final public func removeEntity(_ id: Swift.String) -> MapConductorCore.CircleEntity? - final public func getEntity(_ id: Swift.String) -> MapConductorCore.CircleEntity? - final public func hasEntity(_ id: Swift.String) -> Swift.Bool - final public func allEntities() -> [MapConductorCore.CircleEntity] + final public func registerEntity(_ entity: MapConductorCore::CircleEntity) + final public func removeEntity(_ id: Swift::String) -> MapConductorCore::CircleEntity? + final public func getEntity(_ id: Swift::String) -> MapConductorCore::CircleEntity? + final public func hasEntity(_ id: Swift::String) -> Swift::Bool + final public func allEntities() -> [MapConductorCore::CircleEntity] final public func clear() final public func destroy() - final public var isDestroyed: Swift.Bool { + final public var isDestroyed: Swift::Bool { get } - final public func find(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.CircleEntity? + final public func find(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::CircleEntity? @objc deinit } public protocol CircleOverlayRendererProtocol { associatedtype ActualCircle - func onAdd(data: [MapConductorCore.CircleOverlayAddParams]) async -> [Self.ActualCircle?] - func onChange(data: [MapConductorCore.CircleOverlayChangeParams]) async -> [Self.ActualCircle?] - func onRemove(data: [MapConductorCore.CircleEntity]) async + func onAdd(data: [MapConductorCore::CircleOverlayAddParams]) async -> [Self.ActualCircle?] + func onChange(data: [MapConductorCore::CircleOverlayChangeParams]) async -> [Self.ActualCircle?] + func onRemove(data: [MapConductorCore::CircleEntity]) async func onPostProcess() async } -open class AbstractCircleOverlayRenderer : MapConductorCore.CircleOverlayRendererProtocol { +open class AbstractCircleOverlayRenderer : MapConductorCore::CircleOverlayRendererProtocol { public init() open func onPostProcess() async - open func createCircle(state: MapConductorCore.CircleState) async -> ActualCircle? - open func updateCircleProperties(circle: ActualCircle, current: MapConductorCore.CircleEntity, prev: MapConductorCore.CircleEntity) async -> ActualCircle? - open func removeCircle(entity: MapConductorCore.CircleEntity) async - public func onAdd(data: [MapConductorCore.CircleOverlayAddParams]) async -> [ActualCircle?] - public func onChange(data: [MapConductorCore.CircleOverlayChangeParams]) async -> [ActualCircle?] - public func onRemove(data: [MapConductorCore.CircleEntity]) async + open func createCircle(state: MapConductorCore::CircleState) async -> ActualCircle? + open func updateCircleProperties(circle: ActualCircle, current: MapConductorCore::CircleEntity, prev: MapConductorCore::CircleEntity) async -> ActualCircle? + open func removeCircle(entity: MapConductorCore::CircleEntity) async + public func onAdd(data: [MapConductorCore::CircleOverlayAddParams]) async -> [ActualCircle?] + public func onChange(data: [MapConductorCore::CircleOverlayChangeParams]) async -> [ActualCircle?] + public func onRemove(data: [MapConductorCore::CircleEntity]) async @objc deinit } public struct CircleOverlayAddParams { - public let state: MapConductorCore.CircleState - public init(state: MapConductorCore.CircleState) + public let state: MapConductorCore::CircleState + public init(state: MapConductorCore::CircleState) } public struct CircleOverlayChangeParams { - public let current: MapConductorCore.CircleEntity - public let prev: MapConductorCore.CircleEntity - public init(current: MapConductorCore.CircleEntity, prev: MapConductorCore.CircleEntity) -} -public struct CircleFingerPrint : Swift.Equatable, Swift.Hashable { - public let id: Swift.Int - public let center: Swift.Int - public let radiusMeters: Swift.Int - public let clickable: Swift.Int - public let geodesic: Swift.Int - public let strokeColor: Swift.Int - public let strokeWidth: Swift.Int - public let fillColor: Swift.Int - public let zIndex: Swift.Int - public let extra: Swift.Int - public static func == (a: MapConductorCore.CircleFingerPrint, b: MapConductorCore.CircleFingerPrint) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { + public let current: MapConductorCore::CircleEntity + public let prev: MapConductorCore::CircleEntity + public init(current: MapConductorCore::CircleEntity, prev: MapConductorCore::CircleEntity) +} +public struct CircleFingerPrint : Swift::Equatable, Swift::Hashable { + public let id: Swift::Int + public let center: Swift::Int + public let radiusMeters: Swift::Int + public let clickable: Swift::Int + public let geodesic: Swift::Int + public let strokeColor: Swift::Int + public let strokeWidth: Swift::Int + public let fillColor: Swift::Int + public let zIndex: Swift::Int + public let extra: Swift::Int + public static func == (a: MapConductorCore::CircleFingerPrint, b: MapConductorCore::CircleFingerPrint) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { get } } public struct CircleEvent { - public let state: MapConductorCore.CircleState - public let clicked: any MapConductorCore.GeoPointProtocol - public init(state: MapConductorCore.CircleState, clicked: any MapConductorCore.GeoPointProtocol) + public let state: MapConductorCore::CircleState + public let clicked: any MapConductorCore::GeoPointProtocol + public init(state: MapConductorCore::CircleState, clicked: any MapConductorCore::GeoPointProtocol) } -public typealias OnCircleEventHandler = (MapConductorCore.CircleEvent) -> Swift.Void -final public class CircleState : Combine.ObservableObject, Swift.Identifiable, Swift.Equatable, Swift.Hashable { - final public let id: Swift.String - @Combine.Published @_projectedValueProperty($center) final public var center: any MapConductorCore.GeoPointProtocol { +public typealias OnCircleEventHandler = (MapConductorCore::CircleEvent) -> Swift::Void +final public class CircleState : Combine::ObservableObject, Swift::Identifiable, Swift::Equatable, Swift::Hashable { + final public let id: Swift::String + final public let mutations: MapConductorCore::StateMutationSignal + @Combine::Published @_projectedValueProperty($center) final public var center: any MapConductorCore::GeoPointProtocol { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $center: Combine.Published.Publisher { + final public var $center: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($radiusMeters) final public var radiusMeters: Swift.Double { + @Combine::Published @_projectedValueProperty($radiusMeters) final public var radiusMeters: Swift::Double { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $radiusMeters: Combine.Published.Publisher { + final public var $radiusMeters: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($geodesic) final public var geodesic: Swift.Bool { + @Combine::Published @_projectedValueProperty($geodesic) final public var geodesic: Swift::Bool { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $geodesic: Combine.Published.Publisher { + final public var $geodesic: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($clickable) final public var clickable: Swift.Bool { + @Combine::Published @_projectedValueProperty($clickable) final public var clickable: Swift::Bool { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $clickable: Combine.Published.Publisher { + final public var $clickable: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($strokeColor) final public var strokeColor: UIKit.UIColor { + @Combine::Published @_projectedValueProperty($strokeColor) final public var strokeColor: UIKit::UIColor { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $strokeColor: Combine.Published.Publisher { + final public var $strokeColor: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($strokeWidth) final public var strokeWidth: Swift.Double { + @Combine::Published @_projectedValueProperty($strokeWidth) final public var strokeWidth: Swift::Double { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $strokeWidth: Combine.Published.Publisher { + final public var $strokeWidth: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($fillColor) final public var fillColor: UIKit.UIColor { + @Combine::Published @_projectedValueProperty($fillColor) final public var fillColor: UIKit::UIColor { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $fillColor: Combine.Published.Publisher { + final public var $fillColor: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($extra) final public var extra: Any? { + @Combine::Published @_projectedValueProperty($extra) final public var extra: Any? { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $extra: Combine.Published.Publisher { + final public var $extra: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($zIndex) final public var zIndex: Swift.Int? { + @Combine::Published @_projectedValueProperty($zIndex) final public var zIndex: Swift::Int? { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $zIndex: Combine.Published.Publisher { + final public var $zIndex: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($onClick) final public var onClick: MapConductorCore.OnCircleEventHandler? { + @Combine::Published @_projectedValueProperty($onClick) final public var onClick: MapConductorCore::OnCircleEventHandler? { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $onClick: Combine.Published.Publisher { + final public var $onClick: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - public init(center: any MapConductorCore.GeoPointProtocol, radiusMeters: Swift.Double, geodesic: Swift.Bool = true, clickable: Swift.Bool = true, strokeColor: UIKit.UIColor = .red, strokeWidth: Swift.Double = 1.0, fillColor: UIKit.UIColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 0.5), id: Swift.String? = nil, zIndex: Swift.Int? = nil, extra: Any? = nil, onClick: MapConductorCore.OnCircleEventHandler? = nil) - final public func copy(center: (any MapConductorCore.GeoPointProtocol)? = nil, radiusMeters: Swift.Double? = nil, geodesic: Swift.Bool? = nil, clickable: Swift.Bool? = nil, strokeColor: UIKit.UIColor? = nil, strokeWidth: Swift.Double? = nil, fillColor: UIKit.UIColor? = nil, id: Swift.String? = nil, zIndex: Swift.Int? = nil, extra: Any? = nil, onClick: MapConductorCore.OnCircleEventHandler? = nil) -> MapConductorCore.CircleState - final public func fingerPrint() -> MapConductorCore.CircleFingerPrint - final public func asFlow() -> Combine.AnyPublisher - public static func == (lhs: MapConductorCore.CircleState, rhs: MapConductorCore.CircleState) -> Swift.Bool - final public func hash(into hasher: inout Swift.Hasher) - final public func hashCode() -> Swift.Int - public typealias ID = Swift.String - public typealias ObjectWillChangePublisher = Combine.ObservableObjectPublisher + public init(center: any MapConductorCore::GeoPointProtocol, radiusMeters: Swift::Double, geodesic: Swift::Bool = true, clickable: Swift::Bool = true, strokeColor: UIKit::UIColor = .red, strokeWidth: Swift::Double = 1.0, fillColor: UIKit::UIColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 0.5), id: Swift::String? = nil, zIndex: Swift::Int? = nil, extra: Any? = nil, onClick: MapConductorCore::OnCircleEventHandler? = nil) + final public func copy(center: (any MapConductorCore::GeoPointProtocol)? = nil, radiusMeters: Swift::Double? = nil, geodesic: Swift::Bool? = nil, clickable: Swift::Bool? = nil, strokeColor: UIKit::UIColor? = nil, strokeWidth: Swift::Double? = nil, fillColor: UIKit::UIColor? = nil, id: Swift::String? = nil, zIndex: Swift::Int? = nil, extra: Any? = nil, onClick: MapConductorCore::OnCircleEventHandler? = nil) -> MapConductorCore::CircleState + final public func fingerPrint() -> MapConductorCore::CircleFingerPrint + final public func asFlow() -> Combine::AnyPublisher + public static func == (lhs: MapConductorCore::CircleState, rhs: MapConductorCore::CircleState) -> Swift::Bool + final public func hash(into hasher: inout Swift::Hasher) + final public func hashCode() -> Swift::Int + public typealias ID = Swift::String + public typealias ObjectWillChangePublisher = Combine::ObservableObjectPublisher @objc deinit - final public var hashValue: Swift.Int { + final public var hashValue: Swift::Int { get } } public enum MapDriverConformance { - public struct ViolationError : Swift.Error, Swift.CustomStringConvertible { - public let description: Swift.String - public init(_ description: Swift.String) + public struct ViolationError : Swift::Error, Swift::CustomStringConvertible { + public let description: Swift::String + public init(_ description: Swift::String) } - public static func checkZoomConverter(_ converter: MapConductorCore.WebMercatorZoomAltitudeConverter, latitudes: [Swift.Double] = [0.0, 35.0, 60.0, 85.0, -85.0], zooms: [Swift.Double] = [0.0, 1.0, 5.5, 10.0, 15.25, 22.0]) throws - public static func checkOverlaySlots(_ controllers: [any MapConductorCore.AnyOverlayController], expected: Swift.Set = Set(OverlayKind.allCases)) throws - public static func checkCascadeOrder(_ order: [MapConductorCore.OverlayKind] = OverlayHitResolver.canonicalOrder) throws - public static func checkCapabilityDeclarations(_ registry: any MapConductorCore.MapServiceRegistry) throws - public static func checkProjectionRoundTrip(toScreen: (any MapConductorCore.GeoPointProtocol) -> CoreFoundation.CGPoint?, fromScreen: (CoreFoundation.CGPoint) -> (any MapConductorCore.GeoPointProtocol)?, samples: [any MapConductorCore.GeoPointProtocol]) throws + public static func checkZoomConverter(_ converter: MapConductorCore::WebMercatorZoomAltitudeConverter, latitudes: [Swift::Double] = [0.0, 35.0, 60.0, 85.0, -85.0], zooms: [Swift::Double] = [0.0, 1.0, 5.5, 10.0, 15.25, 22.0]) throws + public static func checkOverlaySlots(_ controllers: [any MapConductorCore::AnyOverlayController], expected: Swift::Set = Set(OverlayKind.allCases)) throws + public static func checkCascadeOrder(_ order: [MapConductorCore::OverlayKind] = OverlayHitResolver.canonicalOrder) throws + public static func checkCapabilityDeclarations(_ registry: any MapConductorCore::MapServiceRegistry) throws + public static func checkProjectionRoundTrip(toScreen: (any MapConductorCore::GeoPointProtocol) -> CoreFoundation::CGPoint?, fromScreen: (CoreFoundation::CGPoint) -> (any MapConductorCore::GeoPointProtocol)?, samples: [any MapConductorCore::GeoPointProtocol]) throws } -public typealias OnMapInitializedHandler = (MapConductorCore.InitState) -> Swift.Void +public typealias OnMapInitializedHandler = (MapConductorCore::InitState) -> Swift::Void public protocol MapViewControllerProtocol { - var holder: MapConductorCore.AnyMapViewHolder { get } - var coroutine: MapConductorCore.CoroutineScope { get } + var holder: MapConductorCore::AnyMapViewHolder { get } + var coroutine: MapConductorCore::CoroutineScope { get } func clearOverlays() async - func setCameraMoveStartListener(listener: MapConductorCore.OnCameraMoveHandler?) - func setCameraMoveListener(listener: MapConductorCore.OnCameraMoveHandler?) - func setCameraMoveEndListener(listener: MapConductorCore.OnCameraMoveHandler?) - func setMapClickListener(listener: MapConductorCore.OnMapEventHandler?) - func setMapLongClickListener(listener: MapConductorCore.OnMapEventHandler?) - func setMapInitializedListener(listener: MapConductorCore.OnMapInitializedHandler?) - func moveCamera(position: MapConductorCore.MapCameraPosition) - func animateCamera(position: MapConductorCore.MapCameraPosition, duration: MapConductorCore.Long) - func fitBounds(bounds: MapConductorCore.GeoRectBounds, padding: Swift.Int) - var overlayControllers: MapConductorCore.OverlayControllerRegistry { get } + func setCameraMoveStartListener(listener: MapConductorCore::OnCameraMoveHandler?) + func setCameraMoveListener(listener: MapConductorCore::OnCameraMoveHandler?) + func setCameraMoveEndListener(listener: MapConductorCore::OnCameraMoveHandler?) + func setMapClickListener(listener: MapConductorCore::OnMapEventHandler?) + func setMapLongClickListener(listener: MapConductorCore::OnMapEventHandler?) + func setMapInitializedListener(listener: MapConductorCore::OnMapInitializedHandler?) + func moveCamera(position: MapConductorCore::MapCameraPosition) + func animateCamera(position: MapConductorCore::MapCameraPosition, duration: MapConductorCore::Long) + func fitBounds(bounds: MapConductorCore::GeoRectBounds, padding: Swift::Int) + var overlayControllers: MapConductorCore::OverlayControllerRegistry { get } func destroy() - func applyUISettings(_ settings: MapConductorCore.MapUISettings) - func setCameraRestriction(_ restriction: MapConductorCore.CameraRestriction?) + func applyUISettings(_ settings: MapConductorCore::MapUISettings) + func setCameraRestriction(_ restriction: MapConductorCore::CameraRestriction?) } -extension MapConductorCore.MapViewControllerProtocol { - public func setCameraRestriction(_ restriction: MapConductorCore.CameraRestriction?) - public func registerOverlayController(_ controller: any MapConductorCore.AnyOverlayController) - public func unregisterOverlayController(_ controller: any MapConductorCore.AnyOverlayController) +extension MapConductorCore::MapViewControllerProtocol { + public func setCameraRestriction(_ restriction: MapConductorCore::CameraRestriction?) + public func registerOverlayController(_ controller: any MapConductorCore::AnyOverlayController) + public func unregisterOverlayController(_ controller: any MapConductorCore::AnyOverlayController) public func destroy() - public func applyUISettings(_ settings: MapConductorCore.MapUISettings) + public func applyUISettings(_ settings: MapConductorCore::MapUISettings) } -public protocol OverlayControllerProtocol : MapConductorCore.AnyOverlayController { +public protocol OverlayControllerProtocol : MapConductorCore::AnyOverlayController { associatedtype StateType associatedtype EntityType associatedtype EventType - var zIndex: Swift.Int { get } + var zIndex: Swift::Int { get } func add(data: [Self.StateType]) async func update(state: Self.StateType) async func clear() async - var clickListener: ((Self.EventType) -> Swift.Void)? { get set } - func find(position: any MapConductorCore.GeoPointProtocol) -> Self.EntityType? - func onCameraChanged(mapCameraPosition: MapConductorCore.MapCameraPosition) async + var clickListener: ((Self.EventType) -> Swift::Void)? { get set } + func find(position: any MapConductorCore::GeoPointProtocol) -> Self.EntityType? + func onCameraChanged(mapCameraPosition: MapConductorCore::MapCameraPosition) async func destroy() } public protocol AnyOverlayController : AnyObject { - var zIndex: Swift.Int { get } - func onCameraChanged(mapCameraPosition: MapConductorCore.MapCameraPosition) async + var zIndex: Swift::Int { get } + func onCameraChanged(mapCameraPosition: MapConductorCore::MapCameraPosition) async func destroy() } final public class OverlayControllerRegistry { public init() - final public func register(_ controller: any MapConductorCore.AnyOverlayController) - final public func unregister(_ controller: any MapConductorCore.AnyOverlayController) - final public func all() -> [any MapConductorCore.AnyOverlayController] - final public func dispatchCameraChanged(_ mapCameraPosition: MapConductorCore.MapCameraPosition) + final public func register(_ controller: any MapConductorCore::AnyOverlayController) + final public func unregister(_ controller: any MapConductorCore::AnyOverlayController) + final public func all() -> [any MapConductorCore::AnyOverlayController] + final public func dispatchCameraChanged(_ mapCameraPosition: MapConductorCore::MapCameraPosition) final public func destroyAll() @objc deinit } -public enum OverlayControllerRegistryKey : MapConductorCore.MapServiceKey { - public typealias Value = MapConductorCore.OverlayControllerRegistry +public enum OverlayControllerRegistryKey : MapConductorCore::MapServiceKey { + public typealias Value = MapConductorCore::OverlayControllerRegistry } final public class OverlayHit { - final public let kind: MapConductorCore.OverlayKind - final public let clicked: any MapConductorCore.GeoPointProtocol - public init(kind: MapConductorCore.OverlayKind, clicked: any MapConductorCore.GeoPointProtocol, deliver: @escaping () -> Swift.Void) + final public let kind: MapConductorCore::OverlayKind + final public let clicked: any MapConductorCore::GeoPointProtocol + public init(kind: MapConductorCore::OverlayKind, clicked: any MapConductorCore::GeoPointProtocol, deliver: @escaping () -> Swift::Void) final public func dispatch() @objc deinit } public enum OverlayHitResolver { - public static let canonicalOrder: [MapConductorCore.OverlayKind] - public static func firstHit(_ controllers: [any MapConductorCore.AnyOverlayController], order: [MapConductorCore.OverlayKind] = canonicalOrder, probe: (any MapConductorCore.SlottedOverlayController) -> T?) -> T? - public static func resolve(_ controllers: [any MapConductorCore.AnyOverlayController], position: any MapConductorCore.GeoPointProtocol, order: [MapConductorCore.OverlayKind] = canonicalOrder) -> MapConductorCore.OverlayHit? + public static let canonicalOrder: [MapConductorCore::OverlayKind] + public static func firstHit(_ controllers: [any MapConductorCore::AnyOverlayController], order: [MapConductorCore::OverlayKind] = canonicalOrder, probe: (any MapConductorCore::SlottedOverlayController) -> T?) -> T? + public static func resolve(_ controllers: [any MapConductorCore::AnyOverlayController], position: any MapConductorCore::GeoPointProtocol, order: [MapConductorCore::OverlayKind] = canonicalOrder) -> MapConductorCore::OverlayHit? } -extension MapConductorCore.OverlayControllerRegistry { +extension MapConductorCore::OverlayControllerRegistry { @discardableResult - final public func dispatchOverlayTap(position: any MapConductorCore.GeoPointProtocol, order: [MapConductorCore.OverlayKind] = OverlayHitResolver.canonicalOrder) -> Swift.Bool + final public func dispatchOverlayTap(position: any MapConductorCore::GeoPointProtocol, order: [MapConductorCore::OverlayKind] = OverlayHitResolver.canonicalOrder) -> Swift::Bool } -extension MapConductorCore.MapViewControllerProtocol { +extension MapConductorCore::MapViewControllerProtocol { @discardableResult - public func dispatchOverlayTap(position: any MapConductorCore.GeoPointProtocol) -> Swift.Bool + public func dispatchOverlayTap(position: any MapConductorCore::GeoPointProtocol) -> Swift::Bool } -public enum OverlayKind : Swift.String, Swift.CaseIterable, Swift.Sendable { +public enum OverlayKind : Swift::String, Swift::CaseIterable, Swift::Sendable { case marker case circle case groundImage case polyline case polygon case rasterLayer - public init?(rawValue: Swift.String) - public typealias AllCases = [MapConductorCore.OverlayKind] - public typealias RawValue = Swift.String - nonisolated public static var allCases: [MapConductorCore.OverlayKind] { + public init?(rawValue: Swift::String) + public typealias AllCases = [MapConductorCore::OverlayKind] + public typealias RawValue = Swift::String + nonisolated public static var allCases: [MapConductorCore::OverlayKind] { get } - public var rawValue: Swift.String { + public var rawValue: Swift::String { get } } -public protocol SlottedOverlayController : MapConductorCore.AnyOverlayController { - var kind: MapConductorCore.OverlayKind { get } - func hasId(_ id: Swift.String) -> Swift.Bool - func resolveTap(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.OverlayHit? +public protocol SlottedOverlayController : MapConductorCore::AnyOverlayController { + var kind: MapConductorCore::OverlayKind { get } + func hasId(_ id: Swift::String) -> Swift::Bool + func resolveTap(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::OverlayHit? } -extension MapConductorCore.OverlayControllerRegistry { - final public func slotted() -> [any MapConductorCore.SlottedOverlayController] - final public func primary(_ kind: MapConductorCore.OverlayKind) -> (any MapConductorCore.SlottedOverlayController)? - final public func controllers(of kind: MapConductorCore.OverlayKind) -> [any MapConductorCore.SlottedOverlayController] - final public func hasOverlay(_ kind: MapConductorCore.OverlayKind, id: Swift.String) -> Swift.Bool +extension MapConductorCore::OverlayControllerRegistry { + final public func slotted() -> [any MapConductorCore::SlottedOverlayController] + final public func primary(_ kind: MapConductorCore::OverlayKind) -> (any MapConductorCore::SlottedOverlayController)? + final public func controllers(of kind: MapConductorCore::OverlayKind) -> [any MapConductorCore::SlottedOverlayController] + final public func hasOverlay(_ kind: MapConductorCore::OverlayKind, id: Swift::String) -> Swift::Bool } public enum MCLog { - public static let isEnabled: Swift.Bool - public static func marker(_ message: Swift.String) - public static func map(_ message: Swift.String) + public static let isEnabled: Swift::Bool + public static func marker(_ message: Swift::String) + public static func map(_ message: Swift::String) + public static func tileServer(_ message: Swift::String) + public static func tileDetail(_ message: Swift::String) + public static func probe(_ message: Swift::String) } public protocol GeoPointProtocol { - func wrap() -> any MapConductorCore.GeoPointProtocol - var latitude: Swift.Double { get } - var longitude: Swift.Double { get } - var altitude: Swift.Double? { get } + func wrap() -> any MapConductorCore::GeoPointProtocol + var latitude: Swift::Double { get } + var longitude: Swift::Double { get } + var altitude: Swift::Double? { get } } -public struct GeoPoint : MapConductorCore.GeoPointProtocol, Swift.Equatable, Swift.Hashable { - public let latitude: Swift.Double - public let longitude: Swift.Double - public var altitude: Swift.Double? { +public struct GeoPoint : MapConductorCore::GeoPointProtocol, Swift::Equatable, Swift::Hashable { + public let latitude: Swift::Double + public let longitude: Swift::Double + public var altitude: Swift::Double? { get } - public init(latitude: Swift.Double, longitude: Swift.Double, altitude: Swift.Double = 0.0) - public func toUrlValue(precision: Swift.Int = 6) -> Swift.String - public static func == (lhs: MapConductorCore.GeoPoint, rhs: MapConductorCore.GeoPoint) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public func wrap() -> any MapConductorCore.GeoPointProtocol - public static func fromLatLong(latitude: Swift.Double, longitude: Swift.Double) -> MapConductorCore.GeoPoint - public static func fromLongLat(longitude: Swift.Double, latitude: Swift.Double) -> MapConductorCore.GeoPoint - public static func from(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.GeoPoint - public var hashValue: Swift.Int { + public init(latitude: Swift::Double, longitude: Swift::Double, altitude: Swift::Double = 0.0) + public func toUrlValue(precision: Swift::Int = 6) -> Swift::String + public static func == (lhs: MapConductorCore::GeoPoint, rhs: MapConductorCore::GeoPoint) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public func wrap() -> any MapConductorCore::GeoPointProtocol + public static func fromLatLong(latitude: Swift::Double, longitude: Swift::Double) -> MapConductorCore::GeoPoint + public static func fromLongLat(longitude: Swift::Double, latitude: Swift::Double) -> MapConductorCore::GeoPoint + public static func from(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::GeoPoint + public var hashValue: Swift::Int { get } } -extension MapConductorCore.GeoPointProtocol { - public func normalize() -> MapConductorCore.GeoPoint - public func isValid() -> Swift.Bool +extension MapConductorCore::GeoPointProtocol { + public func normalize() -> MapConductorCore::GeoPoint + public func isValid() -> Swift::Bool } -final public class GeoRectBounds : Swift.Equatable, Swift.Hashable { - public init(southWest: MapConductorCore.GeoPoint? = nil, northEast: MapConductorCore.GeoPoint? = nil) - final public var isEmpty: Swift.Bool { +final public class GeoRectBounds : Swift::Equatable, Swift::Hashable { + public init(southWest: MapConductorCore::GeoPoint? = nil, northEast: MapConductorCore::GeoPoint? = nil) + final public var isEmpty: Swift::Bool { get } - final public var southWest: MapConductorCore.GeoPoint? { + final public var southWest: MapConductorCore::GeoPoint? { get } - final public var northEast: MapConductorCore.GeoPoint? { + final public var northEast: MapConductorCore::GeoPoint? { get } - final public func extend(point: any MapConductorCore.GeoPointProtocol) - final public func contains(point: any MapConductorCore.GeoPointProtocol) -> Swift.Bool - final public var center: MapConductorCore.GeoPoint? { + final public func extend(point: any MapConductorCore::GeoPointProtocol) + final public func contains(point: any MapConductorCore::GeoPointProtocol) -> Swift::Bool + final public var center: MapConductorCore::GeoPoint? { get } - final public func union(other: MapConductorCore.GeoRectBounds) -> MapConductorCore.GeoRectBounds - final public func toSpan() -> MapConductorCore.GeoPoint? - final public func toUrlValue(precision: Swift.Int = 6) -> Swift.String - final public func expandedByDegrees(latPad: Swift.Double, lonPad: Swift.Double) -> MapConductorCore.GeoRectBounds - final public func intersects(other: MapConductorCore.GeoRectBounds) -> Swift.Bool - final public func equals(other: MapConductorCore.GeoRectBounds) -> Swift.Bool - final public func toString() -> Swift.String - public static func == (lhs: MapConductorCore.GeoRectBounds, rhs: MapConductorCore.GeoRectBounds) -> Swift.Bool - final public func hash(into hasher: inout Swift.Hasher) + final public func union(other: MapConductorCore::GeoRectBounds) -> MapConductorCore::GeoRectBounds + final public func toSpan() -> MapConductorCore::GeoPoint? + final public func toUrlValue(precision: Swift::Int = 6) -> Swift::String + final public func expandedByDegrees(latPad: Swift::Double, lonPad: Swift::Double) -> MapConductorCore::GeoRectBounds + final public func intersects(other: MapConductorCore::GeoRectBounds) -> Swift::Bool + final public func equals(other: MapConductorCore::GeoRectBounds) -> Swift::Bool + final public func toString() -> Swift::String + public static func == (lhs: MapConductorCore::GeoRectBounds, rhs: MapConductorCore::GeoRectBounds) -> Swift::Bool + final public func hash(into hasher: inout Swift::Hasher) @objc deinit - final public var hashValue: Swift.Int { + final public var hashValue: Swift::Int { get } } public enum Earth { - public static let radiusMeters: Swift.Double - public static let circumferenceMeters: Swift.Double - public static let flattening: Swift.Double - public static let semiMinorAxisMeters: Swift.Double - public static let eccentricitySquared: Swift.Double + public static let radiusMeters: Swift::Double + public static let circumferenceMeters: Swift::Double + public static let flattening: Swift::Double + public static let semiMinorAxisMeters: Swift::Double + public static let eccentricitySquared: Swift::Double } final public class HexCellRegistry { - public init(geocell: any MapConductorCore.HexGeocellProtocol, zoom: Swift.Double) - final public func getCell(entity: MapConductorCore.MarkerEntity) -> MapConductorCore.HexCell + public init(geocell: any MapConductorCore::HexGeocellProtocol, zoom: Swift::Double) + final public func getCell(entity: MapConductorCore::MarkerEntity) -> MapConductorCore::HexCell @discardableResult - final public func setPoint(entity: MapConductorCore.MarkerEntity) -> MapConductorCore.HexCell - final public func contains(hexId: Swift.String) -> Swift.Bool + final public func setPoint(entity: MapConductorCore::MarkerEntity) -> MapConductorCore::HexCell + final public func contains(hexId: Swift::String) -> Swift::Bool @discardableResult - final public func removePoint(entity: MapConductorCore.MarkerEntity) -> Swift.Bool + final public func removePoint(entity: MapConductorCore::MarkerEntity) -> Swift::Bool final public func clear() - final public func findNearest(point: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.HexCell? - final public func findNearestWithDistance(point: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.HexCellWithDistance? - final public func findNearestKWithDistance(point: any MapConductorCore.GeoPointProtocol, k: Swift.Int) -> [MapConductorCore.HexCellWithDistance] - final public func findWithinRadiusWithDistance(point: any MapConductorCore.GeoPointProtocol, radius: Swift.Double) -> [MapConductorCore.HexCellWithDistance] - final public func all() -> [MapConductorCore.HexCell] - final public func getEntryIDsByHexCell(_ hexCell: MapConductorCore.HexCell) -> Swift.Set? - final public func metersPerPixel(position: any MapConductorCore.GeoPointProtocol, zoom: Swift.Double, pixels: Swift.Double, tileSize: Swift.Int = 256) -> Swift.Double - final public func findWithinPixelRadius(position: any MapConductorCore.GeoPointProtocol, zoom: Swift.Double, pixels: Swift.Double, tileSize: Swift.Int = 256) -> [MapConductorCore.HexCellWithDistance] - final public func findByIdPrefix(_ prefix: Swift.String) -> [MapConductorCore.HexCell] - final public func getStats() -> MapConductorCore.RegistryStats + final public func findNearest(point: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::HexCell? + final public func findNearestWithDistance(point: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::HexCellWithDistance? + final public func findNearestKWithDistance(point: any MapConductorCore::GeoPointProtocol, k: Swift::Int) -> [MapConductorCore::HexCellWithDistance] + final public func findWithinRadiusWithDistance(point: any MapConductorCore::GeoPointProtocol, radius: Swift::Double) -> [MapConductorCore::HexCellWithDistance] + final public func findWithinRadius(point: any MapConductorCore::GeoPointProtocol, radius: Swift::Double) -> [MapConductorCore::HexCell] + final public func all() -> [MapConductorCore::HexCell] + final public func getEntryIDsByHexCell(_ hexCell: MapConductorCore::HexCell) -> Swift::Set? + final public func metersPerPixel(position: any MapConductorCore::GeoPointProtocol, zoom: Swift::Double, pixels: Swift::Double, tileSize: Swift::Int = 256) -> Swift::Double + final public func findWithinPixelRadius(position: any MapConductorCore::GeoPointProtocol, zoom: Swift::Double, pixels: Swift::Double, tileSize: Swift::Int = 256) -> [MapConductorCore::HexCellWithDistance] + final public func findByIdPrefix(_ prefix: Swift::String) -> [MapConductorCore::HexCell] + final public func getStats() -> MapConductorCore::RegistryStats @objc deinit } -public struct RegistryStats : Swift.Sendable, Swift.Hashable { - public let totalCells: Swift.Int - public let totalEntries: Swift.Int - public let kdTreeBuilt: Swift.Bool - public let needsRebuild: Swift.Bool - public static func == (a: MapConductorCore.RegistryStats, b: MapConductorCore.RegistryStats) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { +public struct RegistryStats : Swift::Sendable, Swift::Hashable { + public let totalCells: Swift::Int + public let totalEntries: Swift::Int + public let kdTreeBuilt: Swift::Bool + public let needsRebuild: Swift::Bool + public static func == (a: MapConductorCore::RegistryStats, b: MapConductorCore::RegistryStats) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { get } } -public struct HexCoord : Swift.Sendable, Swift.Hashable, Swift.CustomStringConvertible { - public let q: Swift.Int - public let r: Swift.Int - public let depth: Swift.Int - public init(q: Swift.Int, r: Swift.Int, depth: Swift.Int = 0) - public var description: Swift.String { +public struct HexCoord : Swift::Sendable, Swift::Hashable, Swift::CustomStringConvertible { + public let q: Swift::Int + public let r: Swift::Int + public let depth: Swift::Int + public init(q: Swift::Int, r: Swift::Int, depth: Swift::Int = 0) + public var description: Swift::String { get } - public var s: Swift.Int { + public var s: Swift::Int { get } - public func neighbors() -> [MapConductorCore.HexCoord] - public static func == (a: MapConductorCore.HexCoord, b: MapConductorCore.HexCoord) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { + public func neighbors() -> [MapConductorCore::HexCoord] + public static func == (a: MapConductorCore::HexCoord, b: MapConductorCore::HexCoord) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { get } } -public enum Direction6 : Swift.CaseIterable, Swift.Sendable { +public enum Direction6 : Swift::CaseIterable, Swift::Sendable { case right case rightUp case leftUp case left case leftDown case rightDown - public static func == (a: MapConductorCore.Direction6, b: MapConductorCore.Direction6) -> Swift.Bool - public typealias AllCases = [MapConductorCore.Direction6] - nonisolated public static var allCases: [MapConductorCore.Direction6] { - get - } - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { - get - } -} -public struct HexCell : Swift.Sendable, Swift.Hashable { - public let coord: MapConductorCore.HexCoord - public let centerLatLng: MapConductorCore.GeoPoint - public let centerXY: CoreFoundation.CGPoint - public let id: Swift.String - public init(coord: MapConductorCore.HexCoord, centerLatLng: MapConductorCore.GeoPoint, centerXY: CoreFoundation.CGPoint, id: Swift.String) - public func idPrefix(levels: Swift.Int) -> Swift.String - public static func == (lhs: MapConductorCore.HexCell, rhs: MapConductorCore.HexCell) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { - get - } -} -public struct HexCellWithDistance : Swift.Sendable, Swift.Hashable { - public let cell: MapConductorCore.HexCell - public let distanceMeters: Swift.Double - public static func == (a: MapConductorCore.HexCellWithDistance, b: MapConductorCore.HexCellWithDistance) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { - get - } -} -public struct IdentifiedHexCell : Swift.Sendable, Swift.Hashable { - public let id: Swift.String - public let cell: MapConductorCore.HexCell - public static func == (a: MapConductorCore.IdentifiedHexCell, b: MapConductorCore.IdentifiedHexCell) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { - get - } -} -public protocol HexGeocellProtocol : Swift.Sendable { - var projection: any MapConductorCore.ProjectionProtocol { get } - var baseHexSideLength: Swift.Int { get } - func latLngToHexCoord(position: any MapConductorCore.GeoPointProtocol, zoom: Swift.Double) -> MapConductorCore.HexCoord - func latLngToHexCell(position: any MapConductorCore.GeoPointProtocol, zoom: Swift.Double) -> MapConductorCore.HexCell - func hexToLatLngCenter(coord: MapConductorCore.HexCoord, latHint: Swift.Double, zoom: Swift.Double) -> MapConductorCore.GeoPoint - func hexToCellId(coord: MapConductorCore.HexCoord, zoom: Swift.Double) -> Swift.String - func hexToPolygonLatLng(coord: MapConductorCore.HexCoord, latHint: Swift.Double, zoom: Swift.Double) -> [MapConductorCore.GeoPoint] - func enclosingCell(of points: [MapConductorCore.MarkerState], zoom: Swift.Double) -> MapConductorCore.HexCell - func hexCellsForPointsWithId(points: [MapConductorCore.MarkerState], zoom: Swift.Double) -> Swift.Set - func hexDistance(a: MapConductorCore.HexCoord, b: MapConductorCore.HexCoord) -> Swift.Int - func hexRange(center: MapConductorCore.HexCoord, radius: Swift.Int) -> [MapConductorCore.HexCoord] -} -public struct HexGeocell : MapConductorCore.HexGeocellProtocol { - public let projection: any MapConductorCore.ProjectionProtocol - public let baseHexSideLength: Swift.Int - public init(projection: any MapConductorCore.ProjectionProtocol, baseHexSideLength: Swift.Int = 1_000) - public func latLngToHexCoord(position: any MapConductorCore.GeoPointProtocol, zoom: Swift.Double) -> MapConductorCore.HexCoord - public func latLngToHexCell(position: any MapConductorCore.GeoPointProtocol, zoom: Swift.Double) -> MapConductorCore.HexCell - public func hexToLatLngCenter(coord: MapConductorCore.HexCoord, latHint: Swift.Double, zoom: Swift.Double) -> MapConductorCore.GeoPoint - public func hexToCellId(coord: MapConductorCore.HexCoord, zoom: Swift.Double) -> Swift.String - public func hexToPolygonLatLng(coord: MapConductorCore.HexCoord, latHint: Swift.Double, zoom: Swift.Double) -> [MapConductorCore.GeoPoint] - public func enclosingCell(of points: [MapConductorCore.MarkerState], zoom: Swift.Double) -> MapConductorCore.HexCell - public func hexCellsForPointsWithId(points: [MapConductorCore.MarkerState], zoom: Swift.Double) -> Swift.Set - public func hexDistance(a: MapConductorCore.HexCoord, b: MapConductorCore.HexCoord) -> Swift.Int - public func hexRange(center: MapConductorCore.HexCoord, radius: Swift.Int) -> [MapConductorCore.HexCoord] - public static func defaultGeocell() -> any MapConductorCore.HexGeocellProtocol -} -final public class KDTree : Swift.Sendable { - public init(points: [MapConductorCore.HexCell]) - final public func nearest(query: CoreFoundation.CGPoint) -> MapConductorCore.HexCell? - final public func nearestWithDistance(query: CoreFoundation.CGPoint) -> MapConductorCore.HexCellWithDistance? - final public func nearestKWithDistance(query: CoreFoundation.CGPoint, k: Swift.Int) -> [MapConductorCore.HexCellWithDistance] - final public func withinRadiusWithDistance(query: CoreFoundation.CGPoint, radius: Swift.Double) -> [MapConductorCore.HexCellWithDistance] - @objc deinit -} -public protocol ProjectionProtocol : Swift.Sendable { - func project(_ point: any MapConductorCore.GeoPointProtocol) -> CoreFoundation.CGPoint - func unproject(_ point: CoreFoundation.CGPoint) -> MapConductorCore.GeoPoint -} -public struct WebMercatorProjection : MapConductorCore.ProjectionProtocol { + public static func == (a: MapConductorCore::Direction6, b: MapConductorCore::Direction6) -> Swift::Bool + public typealias AllCases = [MapConductorCore::Direction6] + nonisolated public static var allCases: [MapConductorCore::Direction6] { + get + } + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { + get + } +} +public struct HexCell : Swift::Sendable, Swift::Hashable { + public let coord: MapConductorCore::HexCoord + public let centerLatLng: MapConductorCore::GeoPoint + public let centerXY: CoreFoundation::CGPoint + public let id: Swift::String + public init(coord: MapConductorCore::HexCoord, centerLatLng: MapConductorCore::GeoPoint, centerXY: CoreFoundation::CGPoint, id: Swift::String) + public func idPrefix(levels: Swift::Int) -> Swift::String + public static func == (lhs: MapConductorCore::HexCell, rhs: MapConductorCore::HexCell) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { + get + } +} +public struct HexCellWithDistance : Swift::Sendable, Swift::Hashable { + public let cell: MapConductorCore::HexCell + public let distanceMeters: Swift::Double + public static func == (a: MapConductorCore::HexCellWithDistance, b: MapConductorCore::HexCellWithDistance) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { + get + } +} +public struct IdentifiedHexCell : Swift::Sendable, Swift::Hashable { + public let id: Swift::String + public let cell: MapConductorCore::HexCell + public static func == (a: MapConductorCore::IdentifiedHexCell, b: MapConductorCore::IdentifiedHexCell) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { + get + } +} +public protocol HexGeocellProtocol : Swift::Sendable { + var projection: any MapConductorCore::ProjectionProtocol { get } + var baseHexSideLength: Swift::Int { get } + func latLngToHexCoord(position: any MapConductorCore::GeoPointProtocol, zoom: Swift::Double) -> MapConductorCore::HexCoord + func latLngToHexCell(position: any MapConductorCore::GeoPointProtocol, zoom: Swift::Double) -> MapConductorCore::HexCell + func hexToLatLngCenter(coord: MapConductorCore::HexCoord, latHint: Swift::Double, zoom: Swift::Double) -> MapConductorCore::GeoPoint + func hexToCellId(coord: MapConductorCore::HexCoord, zoom: Swift::Double) -> Swift::String + func hexToPolygonLatLng(coord: MapConductorCore::HexCoord, latHint: Swift::Double, zoom: Swift::Double) -> [MapConductorCore::GeoPoint] + func enclosingCell(of points: [MapConductorCore::MarkerState], zoom: Swift::Double) -> MapConductorCore::HexCell + func hexCellsForPointsWithId(points: [MapConductorCore::MarkerState], zoom: Swift::Double) -> Swift::Set + func hexDistance(a: MapConductorCore::HexCoord, b: MapConductorCore::HexCoord) -> Swift::Int + func hexRange(center: MapConductorCore::HexCoord, radius: Swift::Int) -> [MapConductorCore::HexCoord] +} +public struct HexGeocell : MapConductorCore::HexGeocellProtocol { + public let projection: any MapConductorCore::ProjectionProtocol + public let baseHexSideLength: Swift::Int + public init(projection: any MapConductorCore::ProjectionProtocol, baseHexSideLength: Swift::Int = 1_000) + public func latLngToHexCoord(position: any MapConductorCore::GeoPointProtocol, zoom: Swift::Double) -> MapConductorCore::HexCoord + public func latLngToHexCell(position: any MapConductorCore::GeoPointProtocol, zoom: Swift::Double) -> MapConductorCore::HexCell + public func hexToLatLngCenter(coord: MapConductorCore::HexCoord, latHint: Swift::Double, zoom: Swift::Double) -> MapConductorCore::GeoPoint + public func hexToCellId(coord: MapConductorCore::HexCoord, zoom: Swift::Double) -> Swift::String + public func hexToPolygonLatLng(coord: MapConductorCore::HexCoord, latHint: Swift::Double, zoom: Swift::Double) -> [MapConductorCore::GeoPoint] + public func enclosingCell(of points: [MapConductorCore::MarkerState], zoom: Swift::Double) -> MapConductorCore::HexCell + public func hexCellsForPointsWithId(points: [MapConductorCore::MarkerState], zoom: Swift::Double) -> Swift::Set + public func hexDistance(a: MapConductorCore::HexCoord, b: MapConductorCore::HexCoord) -> Swift::Int + public func hexRange(center: MapConductorCore::HexCoord, radius: Swift::Int) -> [MapConductorCore::HexCoord] + public static func defaultGeocell() -> any MapConductorCore::HexGeocellProtocol +} +final public class KDTree : Swift::Sendable { + public init(points: [MapConductorCore::HexCell]) + final public func nearest(query: CoreFoundation::CGPoint) -> MapConductorCore::HexCell? + final public func nearestWithDistance(query: CoreFoundation::CGPoint) -> MapConductorCore::HexCellWithDistance? + final public func nearestKWithDistance(query: CoreFoundation::CGPoint, k: Swift::Int) -> [MapConductorCore::HexCellWithDistance] + final public func withinRadiusWithDistance(query: CoreFoundation::CGPoint, radius: Swift::Double) -> [MapConductorCore::HexCellWithDistance] + final public func withinRadius(query: CoreFoundation::CGPoint, radius: Swift::Double) -> [MapConductorCore::HexCell] + @objc deinit +} +public protocol ProjectionProtocol : Swift::Sendable { + func project(_ point: any MapConductorCore::GeoPointProtocol) -> CoreFoundation::CGPoint + func unproject(_ point: CoreFoundation::CGPoint) -> MapConductorCore::GeoPoint +} +public struct WebMercatorProjection : MapConductorCore::ProjectionProtocol { public init() - public func project(_ point: any MapConductorCore.GeoPointProtocol) -> CoreFoundation.CGPoint - public func unproject(_ point: CoreFoundation.CGPoint) -> MapConductorCore.GeoPoint + public func project(_ point: any MapConductorCore::GeoPointProtocol) -> CoreFoundation::CGPoint + public func unproject(_ point: CoreFoundation::CGPoint) -> MapConductorCore::GeoPoint } public enum WebMercatorScreenProjection { - public static func toScreenOffset(_ position: any MapConductorCore.GeoPointProtocol, camera: MapConductorCore.MapCameraPosition, size: CoreFoundation.CGSize) -> CoreFoundation.CGPoint? - public static func fromScreenOffset(_ offset: CoreFoundation.CGPoint, camera: MapConductorCore.MapCameraPosition, size: CoreFoundation.CGSize) -> MapConductorCore.GeoPoint? + public static func toScreenOffset(_ position: any MapConductorCore::GeoPointProtocol, camera: MapConductorCore::MapCameraPosition, size: CoreFoundation::CGSize) -> CoreFoundation::CGPoint? + public static func fromScreenOffset(_ offset: CoreFoundation::CGPoint, camera: MapConductorCore::MapCameraPosition, size: CoreFoundation::CGSize) -> MapConductorCore::GeoPoint? } -public let defaultCircleSegments: Swift.Int -public func circleToRing(center: any MapConductorCore.GeoPointProtocol, radiusMeters: Swift.Double, geodesic: Swift.Bool, segments: Swift.Int = defaultCircleSegments) -> [any MapConductorCore.GeoPointProtocol] -public func closeRing(_ ring: [any MapConductorCore.GeoPointProtocol]) -> [any MapConductorCore.GeoPointProtocol] +public let defaultCircleSegments: Swift::Int +public func circleToRing(center: any MapConductorCore::GeoPointProtocol, radiusMeters: Swift::Double, geodesic: Swift::Bool, segments: Swift::Int = defaultCircleSegments) -> [any MapConductorCore::GeoPointProtocol] +public func closeRing(_ ring: [any MapConductorCore::GeoPointProtocol]) -> [any MapConductorCore::GeoPointProtocol] public enum OverlayGeoJson { - public static func multiLineStringFeature(_ segments: [[any MapConductorCore.GeoPointProtocol]]) -> Swift.String? - public static func polygonFeature(_ rings: MapConductorCore.PolygonRings) -> Swift.String? - public static func ringsFeature(_ rings: [[any MapConductorCore.GeoPointProtocol]]) -> Swift.String? + public static func multiLineStringFeature(_ segments: [[any MapConductorCore::GeoPointProtocol]]) -> Swift::String? + public static func polygonFeature(_ rings: MapConductorCore::PolygonRings) -> Swift::String? + public static func ringsFeature(_ rings: [[any MapConductorCore::GeoPointProtocol]]) -> Swift::String? } public struct PolygonRings { - public let outerRings: [[any MapConductorCore.GeoPointProtocol]] - public let holeRings: [[any MapConductorCore.GeoPointProtocol]] - public init(outerRings: [[any MapConductorCore.GeoPointProtocol]], holeRings: [[any MapConductorCore.GeoPointProtocol]]) -} -public func densifyAndNormalize(_ points: [any MapConductorCore.GeoPointProtocol], geodesic: Swift.Bool, maxSegmentLength: Swift.Double = 10_000.0) -> [any MapConductorCore.GeoPointProtocol] -public func buildPolylineSegments(_ points: [any MapConductorCore.GeoPointProtocol], geodesic: Swift.Bool) -> [[any MapConductorCore.GeoPointProtocol]] -public func buildPolygonRings(points: [any MapConductorCore.GeoPointProtocol], holes: [[any MapConductorCore.GeoPointProtocol]], geodesic: Swift.Bool) -> MapConductorCore.PolygonRings -public func buildUnwrappedPolylinePath(_ points: [any MapConductorCore.GeoPointProtocol], geodesic: Swift.Bool, maxSegmentLength: Swift.Double = 10_000.0) -> [any MapConductorCore.GeoPointProtocol] -public func buildUnwrappedPolygonRings(points: [any MapConductorCore.GeoPointProtocol], holes: [[any MapConductorCore.GeoPointProtocol]], geodesic: Swift.Bool, maxSegmentLength: Swift.Double = 10_000.0) -> MapConductorCore.PolygonRings -public func splitRingByMeridian(_ ring: [any MapConductorCore.GeoPointProtocol], geodesic: Swift.Bool) -> [[any MapConductorCore.GeoPointProtocol]] -open class GroundImageController : MapConductorCore.OverlayControllerProtocol, MapConductorCore.SlottedOverlayController where ActualGroundImage == Renderer.ActualGroundImage, Renderer : MapConductorCore.GroundImageOverlayRendererProtocol { - public typealias StateType = MapConductorCore.GroundImageState - public typealias EntityType = MapConductorCore.GroundImageEntity - public typealias EventType = MapConductorCore.GroundImageEvent - final public let groundImageManager: MapConductorCore.GroundImageManager + public let outerRings: [[any MapConductorCore::GeoPointProtocol]] + public let holeRings: [[any MapConductorCore::GeoPointProtocol]] + public init(outerRings: [[any MapConductorCore::GeoPointProtocol]], holeRings: [[any MapConductorCore::GeoPointProtocol]]) +} +public func densifyAndNormalize(_ points: [any MapConductorCore::GeoPointProtocol], geodesic: Swift::Bool, maxSegmentLength: Swift::Double = 10_000.0) -> [any MapConductorCore::GeoPointProtocol] +public func buildPolylineSegments(_ points: [any MapConductorCore::GeoPointProtocol], geodesic: Swift::Bool) -> [[any MapConductorCore::GeoPointProtocol]] +public func buildPolygonRings(points: [any MapConductorCore::GeoPointProtocol], holes: [[any MapConductorCore::GeoPointProtocol]], geodesic: Swift::Bool) -> MapConductorCore::PolygonRings +public func buildUnwrappedPolylinePath(_ points: [any MapConductorCore::GeoPointProtocol], geodesic: Swift::Bool, maxSegmentLength: Swift::Double = 10_000.0) -> [any MapConductorCore::GeoPointProtocol] +public func buildUnwrappedPolygonRings(points: [any MapConductorCore::GeoPointProtocol], holes: [[any MapConductorCore::GeoPointProtocol]], geodesic: Swift::Bool, maxSegmentLength: Swift::Double = 10_000.0) -> MapConductorCore::PolygonRings +public func splitRingByMeridian(_ ring: [any MapConductorCore::GeoPointProtocol], geodesic: Swift::Bool) -> [[any MapConductorCore::GeoPointProtocol]] +open class GroundImageController : MapConductorCore::OverlayControllerProtocol, MapConductorCore::SlottedOverlayController where ActualGroundImage == Renderer.ActualGroundImage, Renderer : MapConductorCore::GroundImageOverlayRendererProtocol { + public typealias StateType = MapConductorCore::GroundImageState + public typealias EntityType = MapConductorCore::GroundImageEntity + public typealias EventType = MapConductorCore::GroundImageEvent + final public let groundImageManager: MapConductorCore::GroundImageManager open var renderer: Renderer - final public let zIndex: Swift.Int - public var clickListener: ((MapConductorCore.GroundImageEvent) -> Swift.Void)? - public init(groundImageManager: MapConductorCore.GroundImageManager, renderer: Renderer, clickListener: ((MapConductorCore.GroundImageEvent) -> Swift.Void)? = nil) - public func dispatchClick(event: MapConductorCore.GroundImageEvent) - open func add(data: [MapConductorCore.GroundImageState]) async - open func update(state: MapConductorCore.GroundImageState) async + final public let zIndex: Swift::Int + public var clickListener: ((MapConductorCore::GroundImageEvent) -> Swift::Void)? + public init(groundImageManager: MapConductorCore::GroundImageManager, renderer: Renderer, clickListener: ((MapConductorCore::GroundImageEvent) -> Swift::Void)? = nil) + public func dispatchClick(event: MapConductorCore::GroundImageEvent) + open func add(data: [MapConductorCore::GroundImageState]) async + open func update(state: MapConductorCore::GroundImageState) async open func clear() async - open func find(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.GroundImageEntity? - open func onCameraChanged(mapCameraPosition: MapConductorCore.MapCameraPosition) async + open func find(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::GroundImageEntity? + open func onCameraChanged(mapCameraPosition: MapConductorCore::MapCameraPosition) async open func destroy() - public var kind: MapConductorCore.OverlayKind { + public var kind: MapConductorCore::OverlayKind { get } - public func hasId(_ id: Swift.String) -> Swift.Bool - public func resolveTap(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.OverlayHit? + public func hasId(_ id: Swift::String) -> Swift::Bool + public func resolveTap(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::OverlayHit? @objc deinit } public protocol GroundImageEntityProtocol { associatedtype ActualGroundImage var groundImage: Self.ActualGroundImage? { get set } - var state: MapConductorCore.GroundImageState { get } - var fingerPrint: MapConductorCore.GroundImageFingerPrint { get } + var state: MapConductorCore::GroundImageState { get } + var fingerPrint: MapConductorCore::GroundImageFingerPrint { get } } -final public class GroundImageEntity : MapConductorCore.GroundImageEntityProtocol { +final public class GroundImageEntity : MapConductorCore::GroundImageEntityProtocol { final public var groundImage: ActualGroundImage? - final public let state: MapConductorCore.GroundImageState - final public let fingerPrint: MapConductorCore.GroundImageFingerPrint - public init(groundImage: ActualGroundImage?, state: MapConductorCore.GroundImageState) + final public let state: MapConductorCore::GroundImageState + final public let fingerPrint: MapConductorCore::GroundImageFingerPrint + public init(groundImage: ActualGroundImage?, state: MapConductorCore::GroundImageState) @objc deinit } public protocol GroundImageManagerProtocol { associatedtype ActualGroundImage - func registerEntity(_ entity: MapConductorCore.GroundImageEntity) - func removeEntity(_ id: Swift.String) -> MapConductorCore.GroundImageEntity? - func getEntity(_ id: Swift.String) -> MapConductorCore.GroundImageEntity? - func hasEntity(_ id: Swift.String) -> Swift.Bool - func allEntities() -> [MapConductorCore.GroundImageEntity] + func registerEntity(_ entity: MapConductorCore::GroundImageEntity) + func removeEntity(_ id: Swift::String) -> MapConductorCore::GroundImageEntity? + func getEntity(_ id: Swift::String) -> MapConductorCore::GroundImageEntity? + func hasEntity(_ id: Swift::String) -> Swift::Bool + func allEntities() -> [MapConductorCore::GroundImageEntity] func clear() - func find(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.GroundImageEntity? + func find(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::GroundImageEntity? } -final public class GroundImageManager : MapConductorCore.GroundImageManagerProtocol { +final public class GroundImageManager : MapConductorCore::GroundImageManagerProtocol { public init() - final public func registerEntity(_ entity: MapConductorCore.GroundImageEntity) - final public func removeEntity(_ id: Swift.String) -> MapConductorCore.GroundImageEntity? - final public func getEntity(_ id: Swift.String) -> MapConductorCore.GroundImageEntity? - final public func hasEntity(_ id: Swift.String) -> Swift.Bool - final public func allEntities() -> [MapConductorCore.GroundImageEntity] + final public func registerEntity(_ entity: MapConductorCore::GroundImageEntity) + final public func removeEntity(_ id: Swift::String) -> MapConductorCore::GroundImageEntity? + final public func getEntity(_ id: Swift::String) -> MapConductorCore::GroundImageEntity? + final public func hasEntity(_ id: Swift::String) -> Swift::Bool + final public func allEntities() -> [MapConductorCore::GroundImageEntity] final public func clear() final public func destroy() - final public var isDestroyed: Swift.Bool { + final public var isDestroyed: Swift::Bool { get } - final public func find(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.GroundImageEntity? + final public func find(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::GroundImageEntity? @objc deinit } public protocol GroundImageOverlayRendererProtocol { associatedtype ActualGroundImage - func onAdd(data: [MapConductorCore.GroundImageOverlayAddParams]) async -> [Self.ActualGroundImage?] - func onChange(data: [MapConductorCore.GroundImageOverlayChangeParams]) async -> [Self.ActualGroundImage?] - func onRemove(data: [MapConductorCore.GroundImageEntity]) async + func onAdd(data: [MapConductorCore::GroundImageOverlayAddParams]) async -> [Self.ActualGroundImage?] + func onChange(data: [MapConductorCore::GroundImageOverlayChangeParams]) async -> [Self.ActualGroundImage?] + func onRemove(data: [MapConductorCore::GroundImageEntity]) async func onPostProcess() async } -open class AbstractGroundImageOverlayRenderer : MapConductorCore.GroundImageOverlayRendererProtocol { +open class AbstractGroundImageOverlayRenderer : MapConductorCore::GroundImageOverlayRendererProtocol { public init() open func onPostProcess() async - open func createGroundImage(state: MapConductorCore.GroundImageState) async -> ActualGroundImage? - open func updateGroundImageProperties(groundImage: ActualGroundImage, current: MapConductorCore.GroundImageEntity, prev: MapConductorCore.GroundImageEntity) async -> ActualGroundImage? - open func removeGroundImage(entity: MapConductorCore.GroundImageEntity) async - public func onAdd(data: [MapConductorCore.GroundImageOverlayAddParams]) async -> [ActualGroundImage?] - public func onChange(data: [MapConductorCore.GroundImageOverlayChangeParams]) async -> [ActualGroundImage?] - public func onRemove(data: [MapConductorCore.GroundImageEntity]) async + open func createGroundImage(state: MapConductorCore::GroundImageState) async -> ActualGroundImage? + open func updateGroundImageProperties(groundImage: ActualGroundImage, current: MapConductorCore::GroundImageEntity, prev: MapConductorCore::GroundImageEntity) async -> ActualGroundImage? + open func removeGroundImage(entity: MapConductorCore::GroundImageEntity) async + public func onAdd(data: [MapConductorCore::GroundImageOverlayAddParams]) async -> [ActualGroundImage?] + public func onChange(data: [MapConductorCore::GroundImageOverlayChangeParams]) async -> [ActualGroundImage?] + public func onRemove(data: [MapConductorCore::GroundImageEntity]) async @objc deinit } public struct GroundImageOverlayAddParams { - public let state: MapConductorCore.GroundImageState - public init(state: MapConductorCore.GroundImageState) + public let state: MapConductorCore::GroundImageState + public init(state: MapConductorCore::GroundImageState) } public struct GroundImageOverlayChangeParams { - public let current: MapConductorCore.GroundImageEntity - public let prev: MapConductorCore.GroundImageEntity - public init(current: MapConductorCore.GroundImageEntity, prev: MapConductorCore.GroundImageEntity) + public let current: MapConductorCore::GroundImageEntity + public let prev: MapConductorCore::GroundImageEntity + public init(current: MapConductorCore::GroundImageEntity, prev: MapConductorCore::GroundImageEntity) } -public struct GroundImageFingerPrint : Swift.Equatable, Swift.Hashable { - public let id: Swift.Int - public let bounds: Swift.Int - public let image: Swift.Int - public let opacity: Swift.Int - public let tileSize: Swift.Int - public let extra: Swift.Int - public static func == (a: MapConductorCore.GroundImageFingerPrint, b: MapConductorCore.GroundImageFingerPrint) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { +public struct GroundImageFingerPrint : Swift::Equatable, Swift::Hashable { + public let id: Swift::Int + public let bounds: Swift::Int + public let image: Swift::Int + public let opacity: Swift::Int + public let tileSize: Swift::Int + public let extra: Swift::Int + public static func == (a: MapConductorCore::GroundImageFingerPrint, b: MapConductorCore::GroundImageFingerPrint) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { get } } public struct GroundImageEvent { - public let state: MapConductorCore.GroundImageState - public let clicked: (any MapConductorCore.GeoPointProtocol)? - public init(state: MapConductorCore.GroundImageState, clicked: (any MapConductorCore.GeoPointProtocol)?) + public let state: MapConductorCore::GroundImageState + public let clicked: (any MapConductorCore::GeoPointProtocol)? + public init(state: MapConductorCore::GroundImageState, clicked: (any MapConductorCore::GeoPointProtocol)?) } -public typealias OnGroundImageEventHandler = (MapConductorCore.GroundImageEvent) -> Swift.Void -final public class GroundImageState : Combine.ObservableObject, Swift.Identifiable, Swift.Equatable, Swift.Hashable { - final public let id: Swift.String - @Combine.Published @_projectedValueProperty($bounds) final public var bounds: MapConductorCore.GeoRectBounds { +public typealias OnGroundImageEventHandler = (MapConductorCore::GroundImageEvent) -> Swift::Void +final public class GroundImageState : Combine::ObservableObject, Swift::Identifiable, Swift::Equatable, Swift::Hashable { + final public let id: Swift::String + final public let mutations: MapConductorCore::StateMutationSignal + @Combine::Published @_projectedValueProperty($bounds) final public var bounds: MapConductorCore::GeoRectBounds { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $bounds: Combine.Published.Publisher { + final public var $bounds: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($image) final public var image: UIKit.UIImage { + @Combine::Published @_projectedValueProperty($image) final public var image: UIKit::UIImage { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $image: Combine.Published.Publisher { + final public var $image: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($opacity) final public var opacity: Swift.Double { + @Combine::Published @_projectedValueProperty($opacity) final public var opacity: Swift::Double { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $opacity: Combine.Published.Publisher { + final public var $opacity: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($tileSize) final public var tileSize: Swift.Int { + @Combine::Published @_projectedValueProperty($tileSize) final public var tileSize: Swift::Int { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $tileSize: Combine.Published.Publisher { + final public var $tileSize: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($extra) final public var extra: Any? { + @Combine::Published @_projectedValueProperty($extra) final public var extra: Any? { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $extra: Combine.Published.Publisher { + final public var $extra: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($onClick) final public var onClick: MapConductorCore.OnGroundImageEventHandler? { + @Combine::Published @_projectedValueProperty($onClick) final public var onClick: MapConductorCore::OnGroundImageEventHandler? { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $onClick: Combine.Published.Publisher { + final public var $onClick: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - public init(bounds: MapConductorCore.GeoRectBounds, image: UIKit.UIImage, opacity: Swift.Double = 1.0, tileSize: Swift.Int = 512, id: Swift.String? = nil, extra: Any? = nil, onClick: MapConductorCore.OnGroundImageEventHandler? = nil) - final public func copy(bounds: MapConductorCore.GeoRectBounds? = nil, image: UIKit.UIImage? = nil, opacity: Swift.Double? = nil, tileSize: Swift.Int? = nil, id: Swift.String? = nil, extra: Any? = nil, onClick: MapConductorCore.OnGroundImageEventHandler? = nil) -> MapConductorCore.GroundImageState - final public func fingerPrint() -> MapConductorCore.GroundImageFingerPrint - final public func asFlow() -> Combine.AnyPublisher - public static func == (lhs: MapConductorCore.GroundImageState, rhs: MapConductorCore.GroundImageState) -> Swift.Bool - final public func hash(into hasher: inout Swift.Hasher) - final public func hashCode() -> Swift.Int - public typealias ID = Swift.String - public typealias ObjectWillChangePublisher = Combine.ObservableObjectPublisher + public init(bounds: MapConductorCore::GeoRectBounds, image: UIKit::UIImage, opacity: Swift::Double = 1.0, tileSize: Swift::Int = 512, id: Swift::String? = nil, extra: Any? = nil, onClick: MapConductorCore::OnGroundImageEventHandler? = nil) + final public func copy(bounds: MapConductorCore::GeoRectBounds? = nil, image: UIKit::UIImage? = nil, opacity: Swift::Double? = nil, tileSize: Swift::Int? = nil, id: Swift::String? = nil, extra: Any? = nil, onClick: MapConductorCore::OnGroundImageEventHandler? = nil) -> MapConductorCore::GroundImageState + final public func fingerPrint() -> MapConductorCore::GroundImageFingerPrint + final public func asFlow() -> Combine::AnyPublisher + public static func == (lhs: MapConductorCore::GroundImageState, rhs: MapConductorCore::GroundImageState) -> Swift::Bool + final public func hash(into hasher: inout Swift::Hasher) + final public func hashCode() -> Swift::Int + public typealias ID = Swift::String + public typealias ObjectWillChangePublisher = Combine::ObservableObjectPublisher @objc deinit - final public var hashValue: Swift.Int { + final public var hashValue: Swift::Int { get } } -final public class GroundImageTileProvider : MapConductorCore.TileProvider { - public static let defaultTileSize: Swift.Int - final public let tileSize: Swift.Int - public init(tileSize: Swift.Int = GroundImageTileProvider.defaultTileSize, cacheSizeKb: Swift.Int = 8 * 1024) - final public func update(state: MapConductorCore.GroundImageState, opacity: Swift.Double? = nil) - final public func renderTile(request: MapConductorCore.TileRequest) -> Foundation.Data? +final public class GroundImageTileProvider : MapConductorCore::TileProvider { + public static let defaultTileSize: Swift::Int + final public let tileSize: Swift::Int + public init(tileSize: Swift::Int = GroundImageTileProvider.defaultTileSize, cacheSizeKb: Swift::Int = 8 * 1024) + final public func update(state: MapConductorCore::GroundImageState, opacity: Swift::Double? = nil) + final public func renderTile(request: MapConductorCore::TileRequest) -> Foundation::Data? @objc deinit } -@_Concurrency.MainActor @preconcurrency public struct DefaultInfoBubbleView : SwiftUICore.View { - @_Concurrency.MainActor @preconcurrency public init(bubbleColor: SwiftUICore.Color = .white, borderColor: SwiftUICore.Color = .black, borderWidth: CoreFoundation.CGFloat = 2.0, contentPadding: CoreFoundation.CGFloat = 8.0, cornerRadius: CoreFoundation.CGFloat = 4.0, tailSize: CoreFoundation.CGFloat = 8.0, content: SwiftUICore.AnyView) - @_Concurrency.MainActor @preconcurrency public var body: some SwiftUICore.View { +@_Concurrency::MainActor @preconcurrency public struct DefaultInfoBubbleView : SwiftUICore::View { + @_Concurrency::MainActor @preconcurrency public init(bubbleColor: SwiftUICore::Color = .white, borderColor: SwiftUICore::Color = .black, borderWidth: CoreFoundation::CGFloat = 2.0, contentPadding: CoreFoundation::CGFloat = 8.0, cornerRadius: CoreFoundation::CGFloat = 4.0, tailSize: CoreFoundation::CGFloat = 8.0, content: SwiftUICore::AnyView) + @_Concurrency::MainActor @preconcurrency public var body: some SwiftUICore::View { get } public typealias Body = @_opaqueReturnTypeOf("$s16MapConductorCore21DefaultInfoBubbleViewV4bodyQrvp", 0) __ } public struct MarkerIconMetrics { - public let size: CoreFoundation.CGSize - public let anchor: CoreFoundation.CGPoint - public let infoAnchor: CoreFoundation.CGPoint - public init(size: CoreFoundation.CGSize, anchor: CoreFoundation.CGPoint, infoAnchor: CoreFoundation.CGPoint) -} -@_Concurrency.MainActor final public class InfoBubbleOverlayCoordinator { - public typealias Projection = (any MapConductorCore.GeoPointProtocol) -> CoreFoundation.CGPoint? - public typealias MarkerStateResolver = (_ markerId: Swift.String, _ bubbleMarker: MapConductorCore.MarkerState) -> MapConductorCore.MarkerState - public typealias IconMetricsProvider = (_ markerState: MapConductorCore.MarkerState) -> MapConductorCore.MarkerIconMetrics - @_Concurrency.MainActor public init(container: UIKit.UIView, project: @escaping MapConductorCore.InfoBubbleOverlayCoordinator.Projection, projectionGate: @escaping () -> Swift.Bool = { true }, resolveMarkerStateForIcon: @escaping MapConductorCore.InfoBubbleOverlayCoordinator.MarkerStateResolver = { _, bubbleMarker in bubbleMarker }, iconMetrics: @escaping MapConductorCore.InfoBubbleOverlayCoordinator.IconMetricsProvider) - @_Concurrency.MainActor final public func syncInfoBubbles(_ bubbles: [MapConductorCore.InfoBubble]) - @_Concurrency.MainActor final public func removeInfoBubbleView(for id: Swift.String) - @_Concurrency.MainActor final public func updateAllLayouts() - @_Concurrency.MainActor final public func updateInfoBubblePosition(for id: Swift.String) - @_Concurrency.MainActor final public func updateInfoBubblePosition(for id: Swift.String, screenPoint: CoreFoundation.CGPoint) - @_Concurrency.MainActor final public func unbind() - @objc deinit -} -@objc @_inheritsConvenienceInitializers @_Concurrency.MainActor @preconcurrency final public class PassthroughContainerView : UIKit.UIView { - @_Concurrency.MainActor @preconcurrency final public var onLayout: (() -> Swift.Void)? - @_Concurrency.MainActor @preconcurrency @objc override final public func layoutSubviews() - @_Concurrency.MainActor @preconcurrency @objc override final public func hitTest(_ point: CoreFoundation.CGPoint, with event: UIKit.UIEvent?) -> UIKit.UIView? - @_Concurrency.MainActor @preconcurrency @objc override dynamic public init(frame: CoreFoundation.CGRect) - @_Concurrency.MainActor @preconcurrency @objc required dynamic public init?(coder: Foundation.NSCoder) - @objc deinit -} -public struct AttributionRule : Swift.Hashable { - public let attribution: Swift.String - public let minZoom: Swift.Int? - public let maxZoom: Swift.Int? - public let bounds: MapConductorCore.GeoRectBounds? - public init(attribution: Swift.String, minZoom: Swift.Int? = nil, maxZoom: Swift.Int? = nil, bounds: MapConductorCore.GeoRectBounds? = nil) - public static func == (a: MapConductorCore.AttributionRule, b: MapConductorCore.AttributionRule) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { - get - } -} -public func resolveAttributionRules(_ rules: [MapConductorCore.AttributionRule], camera: any MapConductorCore.MapCameraPositionProtocol) -> [Swift.String] -public func resolveMapAttributions(designRules: [MapConductorCore.AttributionRule], rasterLayers: [MapConductorCore.RasterLayer], camera: any MapConductorCore.MapCameraPositionProtocol) -> [Swift.String] -public struct CameraRestriction : Swift.Equatable { - public let bounds: MapConductorCore.GeoRectBounds? - public let minZoom: Swift.Double? - public let maxZoom: Swift.Double? - public init(bounds: MapConductorCore.GeoRectBounds? = nil, minZoom: Swift.Double? = nil, maxZoom: Swift.Double? = nil) - public var isEmpty: Swift.Bool { - get - } - public static let None: MapConductorCore.CameraRestriction - public static func == (lhs: MapConductorCore.CameraRestriction, rhs: MapConductorCore.CameraRestriction) -> Swift.Bool + public let size: CoreFoundation::CGSize + public let anchor: CoreFoundation::CGPoint + public let infoAnchor: CoreFoundation::CGPoint + public init(size: CoreFoundation::CGSize, anchor: CoreFoundation::CGPoint, infoAnchor: CoreFoundation::CGPoint) +} +@_Concurrency::MainActor final public class InfoBubbleOverlayCoordinator { + public typealias Projection = (any MapConductorCore::GeoPointProtocol) -> CoreFoundation::CGPoint? + public typealias MarkerStateResolver = (_ markerId: Swift::String, _ bubbleMarker: MapConductorCore::MarkerState) -> MapConductorCore::MarkerState + public typealias IconMetricsProvider = (_ markerState: MapConductorCore::MarkerState) -> MapConductorCore::MarkerIconMetrics + @_Concurrency::MainActor public init(container: UIKit::UIView, project: @escaping MapConductorCore::InfoBubbleOverlayCoordinator.MapConductorCore::Projection, projectionGate: @escaping () -> Swift::Bool = { true }, resolveMarkerStateForIcon: @escaping MapConductorCore::InfoBubbleOverlayCoordinator.MapConductorCore::MarkerStateResolver = { _, bubbleMarker in bubbleMarker }, iconMetrics: @escaping MapConductorCore::InfoBubbleOverlayCoordinator.MapConductorCore::IconMetricsProvider) + @_Concurrency::MainActor final public func syncInfoBubbles(_ bubbles: [MapConductorCore::InfoBubble]) + @_Concurrency::MainActor final public func removeInfoBubbleView(for id: Swift::String) + @_Concurrency::MainActor final public func updateAllLayouts() + @_Concurrency::MainActor final public func updateInfoBubblePosition(for id: Swift::String) + @_Concurrency::MainActor final public func updateInfoBubblePosition(for id: Swift::String, screenPoint: CoreFoundation::CGPoint) + @_Concurrency::MainActor final public func unbind() + @objc deinit +} +@objc @_inheritsConvenienceInitializers @_Concurrency::MainActor @preconcurrency final public class PassthroughContainerView : UIKit::UIView { + @_Concurrency::MainActor @preconcurrency final public var onLayout: (() -> Swift::Void)? + @_Concurrency::MainActor @preconcurrency @objc override final public func layoutSubviews() + @_Concurrency::MainActor @preconcurrency @objc override final public func hitTest(_ point: CoreFoundation::CGPoint, with event: UIKit::UIEvent?) -> UIKit::UIView? + @_Concurrency::MainActor @preconcurrency @objc override dynamic public init(frame: CoreFoundation::CGRect) + @_Concurrency::MainActor @preconcurrency @objc required dynamic public init?(coder: Foundation::NSCoder) + @objc deinit +} +public struct AttributionRule : Swift::Hashable { + public let attribution: Swift::String + public let minZoom: Swift::Int? + public let maxZoom: Swift::Int? + public let bounds: MapConductorCore::GeoRectBounds? + public init(attribution: Swift::String, minZoom: Swift::Int? = nil, maxZoom: Swift::Int? = nil, bounds: MapConductorCore::GeoRectBounds? = nil) + public static func == (a: MapConductorCore::AttributionRule, b: MapConductorCore::AttributionRule) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { + get + } +} +public func resolveAttributionRules(_ rules: [MapConductorCore::AttributionRule], camera: any MapConductorCore::MapCameraPositionProtocol) -> [Swift::String] +public func resolveMapAttributions(designRules: [MapConductorCore::AttributionRule], rasterLayers: [MapConductorCore::RasterLayer], camera: any MapConductorCore::MapCameraPositionProtocol) -> [Swift::String] +public struct CameraRestriction : Swift::Equatable { + public let bounds: MapConductorCore::GeoRectBounds? + public let minZoom: Swift::Double? + public let maxZoom: Swift::Double? + public init(bounds: MapConductorCore::GeoRectBounds? = nil, minZoom: Swift::Double? = nil, maxZoom: Swift::Double? = nil) + public var isEmpty: Swift::Bool { + get + } + public static let None: MapConductorCore::CameraRestriction + public static func == (lhs: MapConductorCore::CameraRestriction, rhs: MapConductorCore::CameraRestriction) -> Swift::Bool } final public class CameraRestrictionClamp { - public static let zoomEps: Swift.Double - public static let coordEps: Swift.Double + public static let zoomEps: Swift::Double + public static let coordEps: Swift::Double public init() - final public func set(_ restriction: MapConductorCore.CameraRestriction?) - final public var current: MapConductorCore.CameraRestriction? { + final public func set(_ restriction: MapConductorCore::CameraRestriction?) + final public var current: MapConductorCore::CameraRestriction? { get } - final public var hasRestriction: Swift.Bool { + final public var hasRestriction: Swift::Bool { get } - final public func correction(for current: MapConductorCore.MapCameraPosition) -> MapConductorCore.MapCameraPosition? + final public func correction(for current: MapConductorCore::MapCameraPosition) -> MapConductorCore::MapCameraPosition? @objc deinit } -@_Concurrency.MainActor @preconcurrency public struct MapAttributionOverlay : SwiftUICore.View { - @_Concurrency.MainActor @preconcurrency public init(designRules: [MapConductorCore.AttributionRule], rasterLayers: [MapConductorCore.RasterLayer], camera: any MapConductorCore.MapCameraPositionProtocol) - @_Concurrency.MainActor @preconcurrency public var body: some SwiftUICore.View { +@_Concurrency::MainActor @preconcurrency public struct MapAttributionOverlay : SwiftUICore::View { + @_Concurrency::MainActor @preconcurrency public init(designRules: [MapConductorCore::AttributionRule], rasterLayers: [MapConductorCore::RasterLayer], camera: any MapConductorCore::MapCameraPositionProtocol) + @_Concurrency::MainActor @preconcurrency public var body: some SwiftUICore::View { get } public typealias Body = @_opaqueReturnTypeOf("$s16MapConductorCore0A18AttributionOverlayV4bodyQrvp", 0) __ } -public struct VisibleRegion : Swift.Equatable, Swift.Hashable { - public let bounds: MapConductorCore.GeoRectBounds - public let nearLeft: MapConductorCore.GeoPoint? - public let nearRight: MapConductorCore.GeoPoint? - public let farLeft: MapConductorCore.GeoPoint? - public let farRight: MapConductorCore.GeoPoint? - public init(bounds: MapConductorCore.GeoRectBounds, nearLeft: MapConductorCore.GeoPoint? = nil, nearRight: MapConductorCore.GeoPoint? = nil, farLeft: MapConductorCore.GeoPoint? = nil, farRight: MapConductorCore.GeoPoint? = nil) - public static func == (lhs: MapConductorCore.VisibleRegion, rhs: MapConductorCore.VisibleRegion) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { +public struct VisibleRegion : Swift::Equatable, Swift::Hashable { + public let bounds: MapConductorCore::GeoRectBounds + public let nearLeft: MapConductorCore::GeoPoint? + public let nearRight: MapConductorCore::GeoPoint? + public let farLeft: MapConductorCore::GeoPoint? + public let farRight: MapConductorCore::GeoPoint? + public init(bounds: MapConductorCore::GeoRectBounds, nearLeft: MapConductorCore::GeoPoint? = nil, nearRight: MapConductorCore::GeoPoint? = nil, farLeft: MapConductorCore::GeoPoint? = nil, farRight: MapConductorCore::GeoPoint? = nil) + public static func == (lhs: MapConductorCore::VisibleRegion, rhs: MapConductorCore::VisibleRegion) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { get } } public protocol MapCameraPositionProtocol { - var position: any MapConductorCore.GeoPointProtocol { get } - var zoom: Swift.Double { get } - var bearing: Swift.Double { get } - var tilt: Swift.Double { get } - var paddings: (any MapConductorCore.MapPaddingsProtocol)? { get } - var visibleRegion: MapConductorCore.VisibleRegion? { get } -} -final public class MapCameraPosition : MapConductorCore.MapCameraPositionProtocol { - final public var position: any MapConductorCore.GeoPointProtocol { - get - } - final public let zoom: Swift.Double - final public let bearing: Swift.Double - final public let tilt: Swift.Double - final public let paddings: (any MapConductorCore.MapPaddingsProtocol)? - final public let visibleRegion: MapConductorCore.VisibleRegion? - public init(position: any MapConductorCore.GeoPointProtocol, zoom: Swift.Double = 0.0, bearing: Swift.Double = 0.0, tilt: Swift.Double = 0.0, paddings: (any MapConductorCore.MapPaddingsProtocol)? = MapPaddings.Zeros, visibleRegion: MapConductorCore.VisibleRegion? = nil) - final public func equals(other: any MapConductorCore.MapCameraPositionProtocol) -> Swift.Bool - final public func copy(position: (any MapConductorCore.GeoPointProtocol)? = nil, zoom: Swift.Double? = nil, bearing: Swift.Double? = nil, tilt: Swift.Double? = nil, paddings: (any MapConductorCore.MapPaddingsProtocol)? = nil, visibleRegion: MapConductorCore.VisibleRegion? = nil) -> MapConductorCore.MapCameraPosition - final public func hashCode() -> Swift.Int - public static let Default: MapConductorCore.MapCameraPosition - @objc deinit -} -public enum MapCapability : Swift.String, Swift.CaseIterable, Swift.Sendable { + var position: any MapConductorCore::GeoPointProtocol { get } + var zoom: Swift::Double { get } + var bearing: Swift::Double { get } + var tilt: Swift::Double { get } + var paddings: (any MapConductorCore::MapPaddingsProtocol)? { get } + var visibleRegion: MapConductorCore::VisibleRegion? { get } +} +final public class MapCameraPosition : MapConductorCore::MapCameraPositionProtocol { + final public var position: any MapConductorCore::GeoPointProtocol { + get + } + final public let zoom: Swift::Double + final public let bearing: Swift::Double + final public let tilt: Swift::Double + final public let paddings: (any MapConductorCore::MapPaddingsProtocol)? + final public let visibleRegion: MapConductorCore::VisibleRegion? + public init(position: any MapConductorCore::GeoPointProtocol, zoom: Swift::Double = 0.0, bearing: Swift::Double = 0.0, tilt: Swift::Double = 0.0, paddings: (any MapConductorCore::MapPaddingsProtocol)? = MapPaddings.Zeros, visibleRegion: MapConductorCore::VisibleRegion? = nil) + final public func equals(other: any MapConductorCore::MapCameraPositionProtocol) -> Swift::Bool + final public func copy(position: (any MapConductorCore::GeoPointProtocol)? = nil, zoom: Swift::Double? = nil, bearing: Swift::Double? = nil, tilt: Swift::Double? = nil, paddings: (any MapConductorCore::MapPaddingsProtocol)? = nil, visibleRegion: MapConductorCore::VisibleRegion? = nil) -> MapConductorCore::MapCameraPosition + final public func hashCode() -> Swift::Int + public static let Default: MapConductorCore::MapCameraPosition + @objc deinit +} +public enum MapCapability : Swift::String, Swift::CaseIterable, Swift::Sendable { case marker case polyline case polygon @@ -1212,122 +1193,122 @@ public enum MapCapability : Swift.String, Swift.CaseIterable, Swift.Sendable { case gestureZoom case gestureRotate case gestureTilt - public var id: Swift.String { + public var id: Swift::String { get } - public static func fromId(_ id: Swift.String) -> MapConductorCore.MapCapability? - public init?(rawValue: Swift.String) - public typealias AllCases = [MapConductorCore.MapCapability] - public typealias RawValue = Swift.String - nonisolated public static var allCases: [MapConductorCore.MapCapability] { + public static func fromId(_ id: Swift::String) -> MapConductorCore::MapCapability? + public init?(rawValue: Swift::String) + public typealias AllCases = [MapConductorCore::MapCapability] + public typealias RawValue = Swift::String + nonisolated public static var allCases: [MapConductorCore::MapCapability] { get } - public var rawValue: Swift.String { + public var rawValue: Swift::String { get } } -extension MapConductorCore.MapGesture { - public var capability: MapConductorCore.MapCapability { +extension MapConductorCore::MapGesture { + public var capability: MapConductorCore::MapCapability { get } } -public enum MapCapabilityStatus : Swift.Equatable, Swift.Sendable { +public enum MapCapabilityStatus : Swift::Equatable, Swift::Sendable { case supported - case degraded(Swift.String) - case approximated(Swift.String) - case unsupported(Swift.String) + case degraded(Swift::String) + case approximated(Swift::String) + case unsupported(Swift::String) case unknown - public var reason: Swift.String? { + public var reason: Swift::String? { get } - public var isFullySupported: Swift.Bool { + public var isFullySupported: Swift::Bool { get } - public var isUsable: Swift.Bool { + public var isUsable: Swift::Bool { get } - public var isKnownUnsupported: Swift.Bool { + public var isKnownUnsupported: Swift::Bool { get } - public static func == (a: MapConductorCore.MapCapabilityStatus, b: MapConductorCore.MapCapabilityStatus) -> Swift.Bool + public static func == (a: MapConductorCore::MapCapabilityStatus, b: MapConductorCore::MapCapabilityStatus) -> Swift::Bool } public protocol MapDesignTypeProtocol { associatedtype Identifier var id: Self.Identifier { get } - var attributionRules: [MapConductorCore.AttributionRule] { get } + var attributionRules: [MapConductorCore::AttributionRule] { get } func getValue() -> Self.Identifier } -extension MapConductorCore.MapDesignTypeProtocol { - public var attributionRules: [MapConductorCore.AttributionRule] { +extension MapConductorCore::MapDesignTypeProtocol { + public var attributionRules: [MapConductorCore::AttributionRule] { get } } public enum MapDiagnostics { - public typealias Sink = @Sendable (Swift.String) -> Swift.Void - public static var sink: MapConductorCore.MapDiagnostics.Sink { + public typealias Sink = @Sendable (Swift::String) -> Swift::Void + public static var sink: MapConductorCore::MapDiagnostics.MapConductorCore::Sink { get set } @discardableResult - public static func report(capability: MapConductorCore.MapCapability, level: MapConductorCore.MapDiagnosticLevel, provider: Swift.String, reason: Swift.String, subject: Swift.String? = nil) -> Swift.Bool + public static func report(capability: MapConductorCore::MapCapability, level: MapConductorCore::MapDiagnosticLevel, provider: Swift::String, reason: Swift::String, subject: Swift::String? = nil) -> Swift::Bool @discardableResult - public static func reportIfRequested(_ requested: Swift.Bool, capability: MapConductorCore.MapCapability, level: MapConductorCore.MapDiagnosticLevel, provider: Swift.String, reason: Swift.String, subject: Swift.String? = nil) -> Swift.Bool + public static func reportIfRequested(_ requested: Swift::Bool, capability: MapConductorCore::MapCapability, level: MapConductorCore::MapDiagnosticLevel, provider: Swift::String, reason: Swift::String, subject: Swift::String? = nil) -> Swift::Bool public static func resetWarnings() } -public enum MapDiagnosticLevel : Swift.String, Swift.Sendable { +public enum MapDiagnosticLevel : Swift::String, Swift::Sendable { case unsupported case degraded case approximated case ignored - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { + public init?(rawValue: Swift::String) + public typealias RawValue = Swift::String + public var rawValue: Swift::String { get } } public protocol MapPaddingsProtocol { - var top: Swift.Double { get } - var left: Swift.Double { get } - var bottom: Swift.Double { get } - var right: Swift.Double { get } -} -open class MapPaddings : MapConductorCore.MapPaddingsProtocol { - final public let top: Swift.Double - final public let left: Swift.Double - final public let bottom: Swift.Double - final public let right: Swift.Double - public init(top: Swift.Double = 0.0, left: Swift.Double = 0.0, bottom: Swift.Double = 0.0, right: Swift.Double = 0.0) - public static let Zeros: MapConductorCore.MapPaddings - public static func from(paddings: any MapConductorCore.MapPaddingsProtocol) -> MapConductorCore.MapPaddings - public func hashCode() -> Swift.Int - @objc deinit -} -public enum MapProjection : Swift.Hashable, Swift.Sendable { + var top: Swift::Double { get } + var left: Swift::Double { get } + var bottom: Swift::Double { get } + var right: Swift::Double { get } +} +open class MapPaddings : MapConductorCore::MapPaddingsProtocol { + final public let top: Swift::Double + final public let left: Swift::Double + final public let bottom: Swift::Double + final public let right: Swift::Double + public init(top: Swift::Double = 0.0, left: Swift::Double = 0.0, bottom: Swift::Double = 0.0, right: Swift::Double = 0.0) + public static let Zeros: MapConductorCore::MapPaddings + public static func from(paddings: any MapConductorCore::MapPaddingsProtocol) -> MapConductorCore::MapPaddings + public func hashCode() -> Swift::Int + @objc deinit +} +public enum MapProjection : Swift::Hashable, Swift::Sendable { case mercator case globe - public static func == (a: MapConductorCore.MapProjection, b: MapConductorCore.MapProjection) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { + public static func == (a: MapConductorCore::MapProjection, b: MapConductorCore::MapProjection) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { get } } public protocol MapServiceKey { associatedtype Value - static var capability: MapConductorCore.MapCapability? { get } + static var capability: MapConductorCore::MapCapability? { get } } -extension MapConductorCore.MapServiceKey { - public static var capability: MapConductorCore.MapCapability? { +extension MapConductorCore::MapServiceKey { + public static var capability: MapConductorCore::MapCapability? { get } } public protocol MapServiceRegistry : AnyObject { - func get(_ key: Key.Type) -> Key.Value? where Key : MapConductorCore.MapServiceKey - func has(_ key: Key.Type) -> Swift.Bool where Key : MapConductorCore.MapServiceKey - func capabilityStatus(_ capability: MapConductorCore.MapCapability) -> MapConductorCore.MapCapabilityStatus + func get(_ key: Key.Type) -> Key.Value? where Key : MapConductorCore::MapServiceKey + func has(_ key: Key.Type) -> Swift::Bool where Key : MapConductorCore::MapServiceKey + func capabilityStatus(_ capability: MapConductorCore::MapCapability) -> MapConductorCore::MapCapabilityStatus } -extension MapConductorCore.MapServiceRegistry { - public func has(_ key: Key.Type) -> Swift.Bool where Key : MapConductorCore.MapServiceKey - public func capabilityStatus(_: MapConductorCore.MapCapability) -> MapConductorCore.MapCapabilityStatus +extension MapConductorCore::MapServiceRegistry { + public func has(_ key: Key.Type) -> Swift::Bool where Key : MapConductorCore::MapServiceKey + public func capabilityStatus(_: MapConductorCore::MapCapability) -> MapConductorCore::MapCapabilityStatus } @_hasMissingDesignatedInitializers final public class MapServiceRegistration { final public func dispose() @@ -1336,64 +1317,64 @@ extension MapConductorCore.MapServiceRegistry { final public class MapServiceRegistrations { public init() @discardableResult - final public func add(_ registration: MapConductorCore.MapServiceRegistration) -> MapConductorCore.MapServiceRegistration + final public func add(_ registration: MapConductorCore::MapServiceRegistration) -> MapConductorCore::MapServiceRegistration final public func disposeAll() @objc deinit } -final public class MutableMapServiceRegistry : MapConductorCore.MapServiceRegistry { +final public class MutableMapServiceRegistry : MapConductorCore::MapServiceRegistry { public init() - final public func put(_ key: Key.Type, _ value: Key.Value) where Key : MapConductorCore.MapServiceKey + final public func put(_ key: Key.Type, _ value: Key.Value) where Key : MapConductorCore::MapServiceKey @discardableResult - final public func register(_ key: Key.Type, _ value: Key.Value) -> MapConductorCore.MapServiceRegistration where Key : MapConductorCore.MapServiceKey - final public func remove(_ key: Key.Type) where Key : MapConductorCore.MapServiceKey + final public func register(_ key: Key.Type, _ value: Key.Value) -> MapConductorCore::MapServiceRegistration where Key : MapConductorCore::MapServiceKey + final public func remove(_ key: Key.Type) where Key : MapConductorCore::MapServiceKey final public func clear() @discardableResult - final public func declare(_ capability: MapConductorCore.MapCapability, _ status: MapConductorCore.MapCapabilityStatus) -> MapConductorCore.MapServiceRegistration + final public func declare(_ capability: MapConductorCore::MapCapability, _ status: MapConductorCore::MapCapabilityStatus) -> MapConductorCore::MapServiceRegistration @discardableResult - final public func declareUnsupported(_ capability: MapConductorCore.MapCapability, _ reason: Swift.String) -> MapConductorCore.MapServiceRegistration - final public func declaredCapabilities() -> [MapConductorCore.MapCapability : MapConductorCore.MapCapabilityStatus] - final public func capabilityStatus(_ capability: MapConductorCore.MapCapability) -> MapConductorCore.MapCapabilityStatus - final public func get(_ key: Key.Type) -> Key.Value? where Key : MapConductorCore.MapServiceKey + final public func declareUnsupported(_ capability: MapConductorCore::MapCapability, _ reason: Swift::String) -> MapConductorCore::MapServiceRegistration + final public func declaredCapabilities() -> [MapConductorCore::MapCapability : MapConductorCore::MapCapabilityStatus] + final public func capabilityStatus(_ capability: MapConductorCore::MapCapability) -> MapConductorCore::MapCapabilityStatus + final public func get(_ key: Key.Type) -> Key.Value? where Key : MapConductorCore::MapServiceKey @objc deinit } -extension MapConductorCore.MutableMapServiceRegistry { +extension MapConductorCore::MutableMapServiceRegistry { final public func removeProviderRegistrations() } -@_hasMissingDesignatedInitializers final public class EmptyMapServiceRegistry : MapConductorCore.MapServiceRegistry { - public static let shared: MapConductorCore.EmptyMapServiceRegistry - final public func get(_: Key.Type) -> Key.Value? where Key : MapConductorCore.MapServiceKey +@_hasMissingDesignatedInitializers final public class EmptyMapServiceRegistry : MapConductorCore::MapServiceRegistry { + public static let shared: MapConductorCore::EmptyMapServiceRegistry + final public func get(_: Key.Type) -> Key.Value? where Key : MapConductorCore::MapServiceKey @objc deinit } -@_Concurrency.MainActor public enum MapServiceRegistryScope { - @_Concurrency.MainActor public static var current: any MapConductorCore.MapServiceRegistry { +@_Concurrency::MainActor public enum MapServiceRegistryScope { + @_Concurrency::MainActor public static var current: any MapConductorCore::MapServiceRegistry { get } - @_Concurrency.MainActor public static func with(_ registry: any MapConductorCore.MapServiceRegistry, _ body: () -> Result) -> Result + @_Concurrency::MainActor public static func with(_ registry: any MapConductorCore::MapServiceRegistry, _ body: () -> Result) -> Result } public protocol MapViewHolderProtocol { associatedtype ActualMapView associatedtype ActualMap var mapView: Self.ActualMapView { get } var map: Self.ActualMap { get } - func toScreenOffset(position: any MapConductorCore.GeoPointProtocol) -> CoreFoundation.CGPoint? - func fromScreenOffset(offset: CoreFoundation.CGPoint) async -> MapConductorCore.GeoPoint? - func fromScreenOffsetSync(offset: CoreFoundation.CGPoint) -> MapConductorCore.GeoPoint? - func viewportSizePx() -> CoreFoundation.CGSize? + func toScreenOffset(position: any MapConductorCore::GeoPointProtocol) -> CoreFoundation::CGPoint? + func fromScreenOffset(offset: CoreFoundation::CGPoint) async -> MapConductorCore::GeoPoint? + func fromScreenOffsetSync(offset: CoreFoundation::CGPoint) -> MapConductorCore::GeoPoint? + func viewportSizePx() -> CoreFoundation::CGSize? } -extension MapConductorCore.MapViewHolderProtocol { - public func fromScreenOffset(offset: CoreFoundation.CGPoint) async -> MapConductorCore.GeoPoint? - public func fromScreenOffsetSync(offset _: CoreFoundation.CGPoint) -> MapConductorCore.GeoPoint? +extension MapConductorCore::MapViewHolderProtocol { + public func fromScreenOffset(offset: CoreFoundation::CGPoint) async -> MapConductorCore::GeoPoint? + public func fromScreenOffsetSync(offset _: CoreFoundation::CGPoint) -> MapConductorCore::GeoPoint? } -public struct AnyMapViewHolder : MapConductorCore.MapViewHolderProtocol { +public struct AnyMapViewHolder : MapConductorCore::MapViewHolderProtocol { public typealias ActualMapView = Any public typealias ActualMap = Any public let mapView: Any public let map: Any - public init(_ holder: H) where H : MapConductorCore.MapViewHolderProtocol - public func toScreenOffset(position: any MapConductorCore.GeoPointProtocol) -> CoreFoundation.CGPoint? - public func fromScreenOffset(offset: CoreFoundation.CGPoint) async -> MapConductorCore.GeoPoint? - public func fromScreenOffsetSync(offset: CoreFoundation.CGPoint) -> MapConductorCore.GeoPoint? - public func viewportSizePx() -> CoreFoundation.CGSize? + public init(_ holder: H) where H : MapConductorCore::MapViewHolderProtocol + public func toScreenOffset(position: any MapConductorCore::GeoPointProtocol) -> CoreFoundation::CGPoint? + public func fromScreenOffset(offset: CoreFoundation::CGPoint) async -> MapConductorCore::GeoPoint? + public func fromScreenOffsetSync(offset: CoreFoundation::CGPoint) -> MapConductorCore::GeoPoint? + public func viewportSizePx() -> CoreFoundation::CGSize? } public enum InitState { case NotStarted @@ -1404,166 +1385,166 @@ public enum InitState { case MapCreated case MapLoaded case Failed - public static func == (a: MapConductorCore.InitState, b: MapConductorCore.InitState) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { + public static func == (a: MapConductorCore::InitState, b: MapConductorCore::InitState) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { get } } -public protocol MapViewStateProtocol : Combine.ObservableObject { +public protocol MapViewStateProtocol : Combine::ObservableObject { associatedtype ActualMapDesignType - var id: Swift.String { get } - var cameraPosition: MapConductorCore.MapCameraPosition { get } + var id: Swift::String { get } + var cameraPosition: MapConductorCore::MapCameraPosition { get } var mapDesignType: Self.ActualMapDesignType { get set } - var uiSettings: MapConductorCore.MapUISettings { get set } - var serviceRegistry: MapConductorCore.MutableMapServiceRegistry { get } - func moveCameraTo(cameraPosition: MapConductorCore.MapCameraPosition, durationMillis: MapConductorCore.Long?) - func moveCameraTo(position: MapConductorCore.GeoPoint, durationMillis: MapConductorCore.Long?) - func fitBounds(bounds: MapConductorCore.GeoRectBounds, padding: Swift.Int) - func getMapViewHolder() -> MapConductorCore.AnyMapViewHolder? + var uiSettings: MapConductorCore::MapUISettings { get set } + var serviceRegistry: MapConductorCore::MutableMapServiceRegistry { get } + func moveCameraTo(cameraPosition: MapConductorCore::MapCameraPosition, durationMillis: MapConductorCore::Long?) + func moveCameraTo(position: MapConductorCore::GeoPoint, durationMillis: MapConductorCore::Long?) + func fitBounds(bounds: MapConductorCore::GeoRectBounds, padding: Swift::Int) + func getMapViewHolder() -> MapConductorCore::AnyMapViewHolder? } -extension MapConductorCore.MapViewStateProtocol { - public func moveCameraTo(cameraPosition: MapConductorCore.MapCameraPosition) - public func moveCameraTo(position: MapConductorCore.GeoPoint) +extension MapConductorCore::MapViewStateProtocol { + public func moveCameraTo(cameraPosition: MapConductorCore::MapCameraPosition) + public func moveCameraTo(position: MapConductorCore::GeoPoint) } -open class MapViewState : Combine.ObservableObject, MapConductorCore.MapViewStateProtocol { - final public let serviceRegistry: MapConductorCore.MutableMapServiceRegistry - public var attachedMapController: (any MapConductorCore.MapViewControllerProtocol)? { +open class MapViewState : Combine::ObservableObject, MapConductorCore::MapViewStateProtocol { + final public let serviceRegistry: MapConductorCore::MutableMapServiceRegistry + public var attachedMapController: (any MapConductorCore::MapViewControllerProtocol)? { get } - public init(id: Swift.String = UUID().uuidString, initialCameraPosition: MapConductorCore.MapCameraPosition = .Default, uiSettings: MapConductorCore.MapUISettings = MapUISettings(), optimisticCameraUpdate: Swift.Bool = false) - open var id: Swift.String { + public init(id: Swift::String = UUID().uuidString, initialCameraPosition: MapConductorCore::MapCameraPosition = .Default, uiSettings: MapConductorCore::MapUISettings = MapUISettings(), optimisticCameraUpdate: Swift::Bool = false) + open var id: Swift::String { get } - open var cameraPosition: MapConductorCore.MapCameraPosition { + open var cameraPosition: MapConductorCore::MapCameraPosition { get } open var mapDesignType: ActualMapDesignType { get set } - open var uiSettings: MapConductorCore.MapUISettings { + open var uiSettings: MapConductorCore::MapUISettings { get set } - public func attachController(_ controller: (any MapConductorCore.MapViewControllerProtocol)?, moveToInitialCamera: Swift.Bool = true) + public func attachController(_ controller: (any MapConductorCore::MapViewControllerProtocol)?, moveToInitialCamera: Swift::Bool = true) public func detachController() - public func setCameraPositionInternal(_ cameraPosition: MapConductorCore.MapCameraPosition) - open func moveCameraTo(cameraPosition: MapConductorCore.MapCameraPosition, durationMillis: MapConductorCore.Long? = 0) - open func moveCameraTo(position: MapConductorCore.GeoPoint, durationMillis: MapConductorCore.Long? = 0) - open func fitBounds(bounds: MapConductorCore.GeoRectBounds, padding: Swift.Int) - open func getMapViewHolder() -> MapConductorCore.AnyMapViewHolder? - public typealias ObjectWillChangePublisher = Combine.ObservableObjectPublisher + public func setCameraPositionInternal(_ cameraPosition: MapConductorCore::MapCameraPosition) + open func moveCameraTo(cameraPosition: MapConductorCore::MapCameraPosition, durationMillis: MapConductorCore::Long? = 0) + open func moveCameraTo(position: MapConductorCore::GeoPoint, durationMillis: MapConductorCore::Long? = 0) + open func fitBounds(bounds: MapConductorCore::GeoRectBounds, padding: Swift::Int) + open func getMapViewHolder() -> MapConductorCore::AnyMapViewHolder? + public typealias ObjectWillChangePublisher = Combine::ObservableObjectPublisher @objc deinit } public protocol MapOverlayProtocol : AnyObject { associatedtype DataType - var flow: Combine.CurrentValueSubject<[Swift.String : Self.DataType], Swift.Never> { get } - func render(data: [Swift.String : Self.DataType], controller: any MapConductorCore.MapViewControllerProtocol) async + var flow: Combine::CurrentValueSubject<[Swift::String : Self.DataType], Swift::Never> { get } + func render(data: [Swift::String : Self.DataType], controller: any MapConductorCore::MapViewControllerProtocol) async } final public class MapOverlayRegistry { public init() - final public func register(overlay: any MapConductorCore.MapOverlayProtocol) - final public func getAll() -> [any MapConductorCore.MapOverlayProtocol] + final public func register(overlay: any MapConductorCore::MapOverlayProtocol) + final public func getAll() -> [any MapConductorCore::MapOverlayProtocol] @objc deinit } public enum ScreenProjectionRequirement { @discardableResult - public static func check(registry: any MapConductorCore.MapServiceRegistry, provider: Swift.String, feature: Swift.String) -> Swift.Bool -} -extension MapConductorCore.MapViewHolderProtocol { - public func buildVisibleRegion(inset: CoreFoundation.CGFloat = 0, requireAllCorners: Swift.Bool = true) -> MapConductorCore.VisibleRegion? - public func buildVisibleRegion(size: CoreFoundation.CGSize, inset: CoreFoundation.CGFloat = 0, requireAllCorners: Swift.Bool = true) -> MapConductorCore.VisibleRegion? - public func viewportSizePx() -> CoreFoundation.CGSize? -} -open class AbstractMarkerController : MapConductorCore.OverlayControllerProtocol, MapConductorCore.SlottedOverlayController where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore.MarkerOverlayRendererProtocol { - public typealias StateType = MapConductorCore.MarkerState - public typealias EntityType = MapConductorCore.MarkerEntity - public typealias EventType = MapConductorCore.MarkerState - final public let markerManager: MapConductorCore.MarkerManager + public static func check(registry: any MapConductorCore::MapServiceRegistry, provider: Swift::String, feature: Swift::String) -> Swift::Bool +} +extension MapConductorCore::MapViewHolderProtocol { + public func buildVisibleRegion(inset: CoreFoundation::CGFloat = 0, requireAllCorners: Swift::Bool = true) -> MapConductorCore::VisibleRegion? + public func buildVisibleRegion(size: CoreFoundation::CGSize, inset: CoreFoundation::CGFloat = 0, requireAllCorners: Swift::Bool = true) -> MapConductorCore::VisibleRegion? + public func viewportSizePx() -> CoreFoundation::CGSize? +} +open class AbstractMarkerController : MapConductorCore::OverlayControllerProtocol, MapConductorCore::SlottedOverlayController where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore::MarkerOverlayRendererProtocol { + public typealias StateType = MapConductorCore::MarkerState + public typealias EntityType = MapConductorCore::MarkerEntity + public typealias EventType = MapConductorCore::MarkerState + final public let markerManager: MapConductorCore::MarkerManager open var renderer: Renderer - final public let zIndex: Swift.Int - public var clickListener: ((MapConductorCore.MarkerState) -> Swift.Void)? - public var dragStartListener: MapConductorCore.OnMarkerEventHandler? - public var dragListener: MapConductorCore.OnMarkerEventHandler? - public var dragEndListener: MapConductorCore.OnMarkerEventHandler? - public var animateStartListener: MapConductorCore.OnMarkerEventHandler? - public var animateEndListener: MapConductorCore.OnMarkerEventHandler? - public init(markerManager: MapConductorCore.MarkerManager, renderer: Renderer, clickListener: ((MapConductorCore.MarkerState) -> Swift.Void)? = nil) - public func dispatchClick(state: MapConductorCore.MarkerState) - public func dispatchDragStart(state: MapConductorCore.MarkerState) - public func dispatchDrag(state: MapConductorCore.MarkerState) - public func dispatchDragEnd(state: MapConductorCore.MarkerState) - public func dispatchAnimateStart(state: MapConductorCore.MarkerState) - public func dispatchAnimateEnd(state: MapConductorCore.MarkerState) - open func setDraggingState(markerState: MapConductorCore.MarkerState, dragging: Swift.Bool) - public func isDragging(_ markerState: MapConductorCore.MarkerState) -> Swift.Bool - open func add(data: [MapConductorCore.MarkerState]) async - open func update(state: MapConductorCore.MarkerState) async + final public let zIndex: Swift::Int + public var clickListener: ((MapConductorCore::MarkerState) -> Swift::Void)? + public var dragStartListener: MapConductorCore::OnMarkerEventHandler? + public var dragListener: MapConductorCore::OnMarkerEventHandler? + public var dragEndListener: MapConductorCore::OnMarkerEventHandler? + public var animateStartListener: MapConductorCore::OnMarkerEventHandler? + public var animateEndListener: MapConductorCore::OnMarkerEventHandler? + public init(markerManager: MapConductorCore::MarkerManager, renderer: Renderer, clickListener: ((MapConductorCore::MarkerState) -> Swift::Void)? = nil) + public func dispatchClick(state: MapConductorCore::MarkerState) + public func dispatchDragStart(state: MapConductorCore::MarkerState) + public func dispatchDrag(state: MapConductorCore::MarkerState) + public func dispatchDragEnd(state: MapConductorCore::MarkerState) + public func dispatchAnimateStart(state: MapConductorCore::MarkerState) + public func dispatchAnimateEnd(state: MapConductorCore::MarkerState) + open func setDraggingState(markerState: MapConductorCore::MarkerState, dragging: Swift::Bool) + public func isDragging(_ markerState: MapConductorCore::MarkerState) -> Swift::Bool + open func add(data: [MapConductorCore::MarkerState]) async + open func update(state: MapConductorCore::MarkerState) async open func clear() async - open func onCameraChanged(mapCameraPosition: MapConductorCore.MapCameraPosition) async - open func find(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.MarkerEntity? + open func onCameraChanged(mapCameraPosition: MapConductorCore::MapCameraPosition) async + open func find(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::MarkerEntity? open func destroy() - public var kind: MapConductorCore.OverlayKind { + public var kind: MapConductorCore::OverlayKind { get } - public func hasId(_ id: Swift.String) -> Swift.Bool - public func resolveTap(position _: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.OverlayHit? + public func hasId(_ id: Swift::String) -> Swift::Bool + public func resolveTap(position _: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::OverlayHit? @objc deinit } -open class AbstractViewportStrategy : MapConductorCore.AbstractMarkerRenderingStrategy { - public init(semaphore: MapConductorCore.AsyncSemaphore = AsyncSemaphore(1), geocell: any MapConductorCore.HexGeocellProtocol = HexGeocell.defaultGeocell()) - override open func onAdd(data: [MapConductorCore.MarkerState], viewport: MapConductorCore.GeoRectBounds, renderer: Renderer) async -> Swift.Bool where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore.MarkerOverlayRendererProtocol - override open func onUpdate(state: MapConductorCore.MarkerState, viewport: MapConductorCore.GeoRectBounds, renderer: Renderer) async -> Swift.Bool where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore.MarkerOverlayRendererProtocol +open class AbstractViewportStrategy : MapConductorCore::AbstractMarkerRenderingStrategy { + public init(semaphore: MapConductorCore::AsyncSemaphore = AsyncSemaphore(1), geocell: any MapConductorCore::HexGeocellProtocol = HexGeocell.defaultGeocell()) + override open func onAdd(data: [MapConductorCore::MarkerState], viewport: MapConductorCore::GeoRectBounds, renderer: Renderer) async -> Swift::Bool where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore::MarkerOverlayRendererProtocol + override open func onUpdate(state: MapConductorCore::MarkerState, viewport: MapConductorCore::GeoRectBounds, renderer: Renderer) async -> Swift::Bool where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore::MarkerOverlayRendererProtocol override open func clear() @objc deinit } final public class AsyncSemaphore { - public init(_ permits: Swift.Int) + public init(_ permits: Swift::Int) final public func withPermit(_ operation: () async throws -> T) async rethrows -> T @objc deinit } -final public class ColorDefaultIcon : MapConductorCore.MarkerIconProtocol { - public static let defaultIconSize: CoreFoundation.CGFloat - public static let defaultStrokeWidth: CoreFoundation.CGFloat - public static let defaultFillColor: UIKit.UIColor - public static let defaultStrokeColor: UIKit.UIColor - public static let defaultLabelTextSize: CoreFoundation.CGFloat - public static let defaultLabelTextColor: UIKit.UIColor - public static let defaultLabelStrokeColor: UIKit.UIColor - public static let defaultLabelTypeFace: UIKit.UIFont - public static let defaultInfoAnchor: CoreFoundation.CGPoint - final public let scale: CoreFoundation.CGFloat - final public let anchor: CoreFoundation.CGPoint - final public let iconSize: CoreFoundation.CGFloat - final public let infoAnchor: CoreFoundation.CGPoint - final public let debug: Swift.Bool - public init(fillColor: UIKit.UIColor = defaultFillColor, strokeColor: UIKit.UIColor = defaultStrokeColor, strokeWidth: CoreFoundation.CGFloat = defaultStrokeWidth, scale: CoreFoundation.CGFloat = 1.0, label: Swift.String? = nil, labelTextColor: UIKit.UIColor? = defaultLabelTextColor, labelTextSize: CoreFoundation.CGFloat = defaultLabelTextSize, labelTypeFace: UIKit.UIFont = defaultLabelTypeFace, labelStrokeColor: UIKit.UIColor = defaultLabelStrokeColor, infoAnchor: CoreFoundation.CGPoint = defaultInfoAnchor, iconSize: CoreFoundation.CGFloat = defaultIconSize, debug: Swift.Bool = false) - final public func toBitmapIcon() -> MapConductorCore.BitmapIcon - final public func hashCode() -> Swift.Int - final public func copy(fillColor: UIKit.UIColor? = nil, strokeColor: UIKit.UIColor? = nil, strokeWidth: CoreFoundation.CGFloat? = nil, scale: CoreFoundation.CGFloat? = nil, label: Swift.String? = nil, labelTextColor: UIKit.UIColor? = nil, labelTextSize: CoreFoundation.CGFloat? = nil, labelTypeFace: UIKit.UIFont? = nil, labelStrokeColor: UIKit.UIColor? = nil, iconSize: CoreFoundation.CGFloat? = nil, debug: Swift.Bool? = nil) -> MapConductorCore.ColorDefaultIcon - @objc deinit -} -public typealias DefaultMarkerIcon = MapConductorCore.ColorDefaultIcon +final public class ColorDefaultIcon : MapConductorCore::MarkerIconProtocol { + public static let defaultIconSize: CoreFoundation::CGFloat + public static let defaultStrokeWidth: CoreFoundation::CGFloat + public static let defaultFillColor: UIKit::UIColor + public static let defaultStrokeColor: UIKit::UIColor + public static let defaultLabelTextSize: CoreFoundation::CGFloat + public static let defaultLabelTextColor: UIKit::UIColor + public static let defaultLabelStrokeColor: UIKit::UIColor + public static let defaultLabelTypeFace: UIKit::UIFont + public static let defaultInfoAnchor: CoreFoundation::CGPoint + final public let scale: CoreFoundation::CGFloat + final public let anchor: CoreFoundation::CGPoint + final public let iconSize: CoreFoundation::CGFloat + final public let infoAnchor: CoreFoundation::CGPoint + final public let debug: Swift::Bool + public init(fillColor: UIKit::UIColor = defaultFillColor, strokeColor: UIKit::UIColor = defaultStrokeColor, strokeWidth: CoreFoundation::CGFloat = defaultStrokeWidth, scale: CoreFoundation::CGFloat = 1.0, label: Swift::String? = nil, labelTextColor: UIKit::UIColor? = defaultLabelTextColor, labelTextSize: CoreFoundation::CGFloat = defaultLabelTextSize, labelTypeFace: UIKit::UIFont = defaultLabelTypeFace, labelStrokeColor: UIKit::UIColor = defaultLabelStrokeColor, infoAnchor: CoreFoundation::CGPoint = defaultInfoAnchor, iconSize: CoreFoundation::CGFloat = defaultIconSize, debug: Swift::Bool = false) + final public func toBitmapIcon() -> MapConductorCore::BitmapIcon + final public func hashCode() -> Swift::Int + final public func copy(fillColor: UIKit::UIColor? = nil, strokeColor: UIKit::UIColor? = nil, strokeWidth: CoreFoundation::CGFloat? = nil, scale: CoreFoundation::CGFloat? = nil, label: Swift::String? = nil, labelTextColor: UIKit::UIColor? = nil, labelTextSize: CoreFoundation::CGFloat? = nil, labelTypeFace: UIKit::UIFont? = nil, labelStrokeColor: UIKit::UIColor? = nil, iconSize: CoreFoundation::CGFloat? = nil, debug: Swift::Bool? = nil) -> MapConductorCore::ColorDefaultIcon + @objc deinit +} +public typealias DefaultMarkerIcon = MapConductorCore::ColorDefaultIcon public protocol MarkerDragSurface : AnyObject { - var isScrollEnabled: Swift.Bool { get set } - func geoPoint(atScreenPoint point: CoreFoundation.CGPoint) -> MapConductorCore.GeoPoint? + var isScrollEnabled: Swift::Bool { get set } + func geoPoint(atScreenPoint point: CoreFoundation::CGPoint) -> MapConductorCore::GeoPoint? } public protocol MarkerEventHostProtocol : AnyObject { - func markerId(atScreenPoint point: CoreFoundation.CGPoint) -> Swift.String? - func markerState(for id: Swift.String) -> MapConductorCore.MarkerState? - func handleTiledMarkerTap(atScreenPoint point: CoreFoundation.CGPoint) -> Swift.Bool - func dispatchClick(state: MapConductorCore.MarkerState) - func dispatchDragStart(state: MapConductorCore.MarkerState) - func dispatchDrag(state: MapConductorCore.MarkerState) - func dispatchDragEnd(state: MapConductorCore.MarkerState) - func onUpdateInfoBubble(_ markerId: Swift.String) -} -@_Concurrency.MainActor open class DefaultMarkerEventController { - @_Concurrency.MainActor public init(surface: (any MapConductorCore.MarkerDragSurface)?, host: any MapConductorCore.MarkerEventHostProtocol) - @_Concurrency.MainActor open func handleTap(at point: CoreFoundation.CGPoint) -> Swift.Bool - @_Concurrency.MainActor open func handleLongPress(state recognizerState: MapConductorCore.MarkerDragGestureState, at point: CoreFoundation.CGPoint) -> Swift.Bool - @_Concurrency.MainActor open func unbind() + func markerId(atScreenPoint point: CoreFoundation::CGPoint) -> Swift::String? + func markerState(for id: Swift::String) -> MapConductorCore::MarkerState? + func handleTiledMarkerTap(atScreenPoint point: CoreFoundation::CGPoint) -> Swift::Bool + func dispatchClick(state: MapConductorCore::MarkerState) + func dispatchDragStart(state: MapConductorCore::MarkerState) + func dispatchDrag(state: MapConductorCore::MarkerState) + func dispatchDragEnd(state: MapConductorCore::MarkerState) + func onUpdateInfoBubble(_ markerId: Swift::String) +} +@_Concurrency::MainActor open class DefaultMarkerEventController { + @_Concurrency::MainActor public init(surface: (any MapConductorCore::MarkerDragSurface)?, host: any MapConductorCore::MarkerEventHostProtocol) + @_Concurrency::MainActor open func handleTap(at point: CoreFoundation::CGPoint) -> Swift::Bool + @_Concurrency::MainActor open func handleLongPress(state recognizerState: MapConductorCore::MarkerDragGestureState, at point: CoreFoundation::CGPoint) -> Swift::Bool + @_Concurrency::MainActor open func unbind() @objc deinit } public enum MarkerDragGestureState { @@ -1572,1438 +1553,1385 @@ public enum MarkerDragGestureState { case ended case cancelled case other - public static func == (a: MapConductorCore.MarkerDragGestureState, b: MapConductorCore.MarkerDragGestureState) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { - get - } -} -final public class ImageDefaultIcon : MapConductorCore.MarkerIconProtocol { - public static let defaultIconSize: CoreFoundation.CGFloat - public static let defaultStrokeWidth: CoreFoundation.CGFloat - public static let defaultStrokeColor: UIKit.UIColor - public static let defaultLabelTextSize: CoreFoundation.CGFloat - public static let defaultLabelTextColor: UIKit.UIColor - public static let defaultLabelStrokeColor: UIKit.UIColor - public static let defaultLabelTypeFace: UIKit.UIFont - public static let defaultInfoAnchor: CoreFoundation.CGPoint - public static let defaultAnchor: CoreFoundation.CGPoint - final public let scale: CoreFoundation.CGFloat - final public let anchor: CoreFoundation.CGPoint - final public let iconSize: CoreFoundation.CGFloat - final public let infoAnchor: CoreFoundation.CGPoint - final public let debug: Swift.Bool - final public let strokeColor: UIKit.UIColor - final public let strokeWidth: CoreFoundation.CGFloat - final public let label: Swift.String? - final public let labelTextColor: UIKit.UIColor? - final public let labelTextSize: CoreFoundation.CGFloat - final public let labelTypeFace: UIKit.UIFont - final public let labelStrokeColor: UIKit.UIColor - public init(backgroundImage: UIKit.UIImage, strokeColor: UIKit.UIColor = defaultStrokeColor, strokeWidth: CoreFoundation.CGFloat = defaultStrokeWidth, scale: CoreFoundation.CGFloat = 1.0, label: Swift.String? = nil, labelTextColor: UIKit.UIColor? = defaultLabelTextColor, labelTextSize: CoreFoundation.CGFloat = defaultLabelTextSize, labelTypeFace: UIKit.UIFont = defaultLabelTypeFace, labelStrokeColor: UIKit.UIColor = defaultLabelStrokeColor, infoAnchor: CoreFoundation.CGPoint = defaultInfoAnchor, iconSize: CoreFoundation.CGFloat = defaultIconSize, debug: Swift.Bool = false) - final public func toBitmapIcon() -> MapConductorCore.BitmapIcon - final public func hashCode() -> Swift.Int - final public func copy(backgroundImage: UIKit.UIImage? = nil, strokeColor: UIKit.UIColor? = nil, strokeWidth: CoreFoundation.CGFloat? = nil, scale: CoreFoundation.CGFloat? = nil, label: Swift.String? = nil, labelTextColor: UIKit.UIColor? = nil, labelTextSize: CoreFoundation.CGFloat? = nil, labelTypeFace: UIKit.UIFont? = nil, labelStrokeColor: UIKit.UIColor? = nil, iconSize: CoreFoundation.CGFloat? = nil, debug: Swift.Bool? = nil) -> MapConductorCore.ImageDefaultIcon - @objc deinit -} -final public class ImageIcon : MapConductorCore.MarkerIconProtocol { - public static let defaultIconSize: CoreFoundation.CGFloat - public static let defaultAnchor: CoreFoundation.CGPoint - public static let defaultInfoAnchor: CoreFoundation.CGPoint - final public let iconSize: CoreFoundation.CGFloat - final public let scale: CoreFoundation.CGFloat - final public let anchor: CoreFoundation.CGPoint - final public let infoAnchor: CoreFoundation.CGPoint - final public let debug: Swift.Bool - public init(image: UIKit.UIImage, iconSize: CoreFoundation.CGFloat = defaultIconSize, scale: CoreFoundation.CGFloat = 1.0, anchor: CoreFoundation.CGPoint = defaultAnchor, infoAnchor: CoreFoundation.CGPoint = defaultInfoAnchor, debug: Swift.Bool = false) - final public func toBitmapIcon() -> MapConductorCore.BitmapIcon - final public func hashCode() -> Swift.Int - final public func copy(image: UIKit.UIImage? = nil, iconSize: CoreFoundation.CGFloat? = nil, scale: CoreFoundation.CGFloat? = nil, anchor: CoreFoundation.CGPoint? = nil, infoAnchor: CoreFoundation.CGPoint? = nil, debug: Swift.Bool? = nil) -> MapConductorCore.ImageIcon + public static func == (a: MapConductorCore::MarkerDragGestureState, b: MapConductorCore::MarkerDragGestureState) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { + get + } +} +final public class ImageDefaultIcon : MapConductorCore::MarkerIconProtocol { + public static let defaultIconSize: CoreFoundation::CGFloat + public static let defaultStrokeWidth: CoreFoundation::CGFloat + public static let defaultStrokeColor: UIKit::UIColor + public static let defaultLabelTextSize: CoreFoundation::CGFloat + public static let defaultLabelTextColor: UIKit::UIColor + public static let defaultLabelStrokeColor: UIKit::UIColor + public static let defaultLabelTypeFace: UIKit::UIFont + public static let defaultInfoAnchor: CoreFoundation::CGPoint + public static let defaultAnchor: CoreFoundation::CGPoint + final public let scale: CoreFoundation::CGFloat + final public let anchor: CoreFoundation::CGPoint + final public let iconSize: CoreFoundation::CGFloat + final public let infoAnchor: CoreFoundation::CGPoint + final public let debug: Swift::Bool + final public let strokeColor: UIKit::UIColor + final public let strokeWidth: CoreFoundation::CGFloat + final public let label: Swift::String? + final public let labelTextColor: UIKit::UIColor? + final public let labelTextSize: CoreFoundation::CGFloat + final public let labelTypeFace: UIKit::UIFont + final public let labelStrokeColor: UIKit::UIColor + public init(backgroundImage: UIKit::UIImage, strokeColor: UIKit::UIColor = defaultStrokeColor, strokeWidth: CoreFoundation::CGFloat = defaultStrokeWidth, scale: CoreFoundation::CGFloat = 1.0, label: Swift::String? = nil, labelTextColor: UIKit::UIColor? = defaultLabelTextColor, labelTextSize: CoreFoundation::CGFloat = defaultLabelTextSize, labelTypeFace: UIKit::UIFont = defaultLabelTypeFace, labelStrokeColor: UIKit::UIColor = defaultLabelStrokeColor, infoAnchor: CoreFoundation::CGPoint = defaultInfoAnchor, iconSize: CoreFoundation::CGFloat = defaultIconSize, debug: Swift::Bool = false) + final public func toBitmapIcon() -> MapConductorCore::BitmapIcon + final public func hashCode() -> Swift::Int + final public func copy(backgroundImage: UIKit::UIImage? = nil, strokeColor: UIKit::UIColor? = nil, strokeWidth: CoreFoundation::CGFloat? = nil, scale: CoreFoundation::CGFloat? = nil, label: Swift::String? = nil, labelTextColor: UIKit::UIColor? = nil, labelTextSize: CoreFoundation::CGFloat? = nil, labelTypeFace: UIKit::UIFont? = nil, labelStrokeColor: UIKit::UIColor? = nil, iconSize: CoreFoundation::CGFloat? = nil, debug: Swift::Bool? = nil) -> MapConductorCore::ImageDefaultIcon + @objc deinit +} +final public class ImageIcon : MapConductorCore::MarkerIconProtocol { + public static let defaultIconSize: CoreFoundation::CGFloat + public static let defaultAnchor: CoreFoundation::CGPoint + public static let defaultInfoAnchor: CoreFoundation::CGPoint + final public let iconSize: CoreFoundation::CGFloat + final public let scale: CoreFoundation::CGFloat + final public let anchor: CoreFoundation::CGPoint + final public let infoAnchor: CoreFoundation::CGPoint + final public let debug: Swift::Bool + public init(image: UIKit::UIImage, iconSize: CoreFoundation::CGFloat = defaultIconSize, scale: CoreFoundation::CGFloat = 1.0, anchor: CoreFoundation::CGPoint = defaultAnchor, infoAnchor: CoreFoundation::CGPoint = defaultInfoAnchor, debug: Swift::Bool = false) + final public func toBitmapIcon() -> MapConductorCore::BitmapIcon + final public func hashCode() -> Swift::Int + final public func copy(image: UIKit::UIImage? = nil, iconSize: CoreFoundation::CGFloat? = nil, scale: CoreFoundation::CGFloat? = nil, anchor: CoreFoundation::CGPoint? = nil, infoAnchor: CoreFoundation::CGPoint? = nil, debug: Swift::Bool? = nil) -> MapConductorCore::ImageIcon @objc deinit } public struct MarkerAnimationOverlayEntry { - public let id: Swift.String - public let state: MapConductorCore.MarkerState - public let icon: MapConductorCore.BitmapIcon - public let animation: MapConductorCore.MarkerAnimation - public let duration: CoreFoundation.CFTimeInterval - public let onFinished: () -> Swift.Void - public init(id: Swift.String, state: MapConductorCore.MarkerState, icon: MapConductorCore.BitmapIcon, animation: MapConductorCore.MarkerAnimation, duration: CoreFoundation.CFTimeInterval, onFinished: @escaping () -> Swift.Void) + public let id: Swift::String + public let state: MapConductorCore::MarkerState + public let icon: MapConductorCore::BitmapIcon + public let animation: MapConductorCore::MarkerAnimation + public let duration: CoreFoundation::CFTimeInterval + public let onFinished: () -> Swift::Void + public init(id: Swift::String, state: MapConductorCore::MarkerState, icon: MapConductorCore::BitmapIcon, animation: MapConductorCore::MarkerAnimation, duration: CoreFoundation::CFTimeInterval, onFinished: @escaping () -> Swift::Void) } -@_Concurrency.MainActor public protocol MarkerAnimationOverlayHost : AnyObject { - @_Concurrency.MainActor func start(_ entry: MapConductorCore.MarkerAnimationOverlayEntry) +@_Concurrency::MainActor public protocol MarkerAnimationOverlayHost : AnyObject { + @_Concurrency::MainActor func start(_ entry: MapConductorCore::MarkerAnimationOverlayEntry) } -@_Concurrency.MainActor final public class MarkerAnimationOverlayCoordinator : MapConductorCore.MarkerAnimationOverlayHost { - public typealias Projection = (any MapConductorCore.GeoPointProtocol) -> CoreFoundation.CGPoint? - @_Concurrency.MainActor public init(container: UIKit.UIView, project: @escaping MapConductorCore.MarkerAnimationOverlayCoordinator.Projection, projectionGate: @escaping () -> Swift.Bool = { true }) - @_Concurrency.MainActor final public func start(_ entry: MapConductorCore.MarkerAnimationOverlayEntry) - @_Concurrency.MainActor final public func unbind() +@_Concurrency::MainActor final public class MarkerAnimationOverlayCoordinator : MapConductorCore::MarkerAnimationOverlayHost { + public typealias Projection = (any MapConductorCore::GeoPointProtocol) -> CoreFoundation::CGPoint? + @_Concurrency::MainActor public init(container: UIKit::UIView, project: @escaping MapConductorCore::MarkerAnimationOverlayCoordinator.MapConductorCore::Projection, projectionGate: @escaping () -> Swift::Bool = { true }) + @_Concurrency::MainActor final public func start(_ entry: MapConductorCore::MarkerAnimationOverlayEntry) + @_Concurrency::MainActor final public func unbind() @objc deinit } final public class MarkerAnimationRunner { - public init(duration: CoreFoundation.CFTimeInterval, pointAtProgress: @escaping (CoreFoundation.CGFloat) -> MapConductorCore.GeoPoint, onUpdate: @escaping (MapConductorCore.GeoPoint) -> Swift.Void, onCompletion: @escaping () -> Swift.Void) - convenience public init(duration: CoreFoundation.CFTimeInterval, pathPoints: [MapConductorCore.GeoPoint], onUpdate: @escaping (MapConductorCore.GeoPoint) -> Swift.Void, onCompletion: @escaping () -> Swift.Void) + public init(duration: CoreFoundation::CFTimeInterval, pointAtProgress: @escaping (CoreFoundation::CGFloat) -> MapConductorCore::GeoPoint, onUpdate: @escaping (MapConductorCore::GeoPoint) -> Swift::Void, onCompletion: @escaping () -> Swift::Void) + convenience public init(duration: CoreFoundation::CFTimeInterval, pathPoints: [MapConductorCore::GeoPoint], onUpdate: @escaping (MapConductorCore::GeoPoint) -> Swift::Void, onCompletion: @escaping () -> Swift::Void) final public func start() final public func stop() - public static func makeLinearPath(start: MapConductorCore.GeoPoint, target: MapConductorCore.GeoPoint) -> [MapConductorCore.GeoPoint] - public static func makeEaseOutBounceSamples(start: MapConductorCore.GeoPoint, target: MapConductorCore.GeoPoint, samples: Swift.Int = 30) -> [MapConductorCore.GeoPoint] + public static func makeLinearPath(start: MapConductorCore::GeoPoint, target: MapConductorCore::GeoPoint) -> [MapConductorCore::GeoPoint] + public static func makeEaseOutBounceSamples(start: MapConductorCore::GeoPoint, target: MapConductorCore::GeoPoint, samples: Swift::Int = 30) -> [MapConductorCore::GeoPoint] @objc deinit } public protocol MarkerEntityProtocol { associatedtype ActualMarker var marker: Self.ActualMarker? { get set } - var state: MapConductorCore.MarkerState { get } - var fingerPrint: MapConductorCore.MarkerFingerPrint { get } - var visible: Swift.Bool { get set } - var isRendered: Swift.Bool { get set } - var tiling: Swift.Bool { get set } + var state: MapConductorCore::MarkerState { get } + var fingerPrint: MapConductorCore::MarkerFingerPrint { get } + var visible: Swift::Bool { get set } + var isRendered: Swift::Bool { get set } + var tiling: Swift::Bool { get set } } -final public class MarkerEntity : MapConductorCore.MarkerEntityProtocol { +final public class MarkerEntity : MapConductorCore::MarkerEntityProtocol { final public var marker: ActualMarker? - final public let state: MapConductorCore.MarkerState - final public let fingerPrint: MapConductorCore.MarkerFingerPrint - final public var visible: Swift.Bool - final public var isRendered: Swift.Bool - final public var tiling: Swift.Bool - public init(marker: ActualMarker?, state: MapConductorCore.MarkerState, visible: Swift.Bool = true, isRendered: Swift.Bool = false, tiling: Swift.Bool = false) + final public let state: MapConductorCore::MarkerState + final public let fingerPrint: MapConductorCore::MarkerFingerPrint + final public var visible: Swift::Bool + final public var isRendered: Swift::Bool + final public var tiling: Swift::Bool + public init(marker: ActualMarker?, state: MapConductorCore::MarkerState, visible: Swift::Bool = true, isRendered: Swift::Bool = false, tiling: Swift::Bool = false) @objc deinit } public enum MarkerHitTest { - public static func hitsIcon(touchScreen: CoreFoundation.CGPoint, markerScreen: CoreFoundation.CGPoint, state: MapConductorCore.MarkerState, defaultIcon: any MapConductorCore.MarkerIconProtocol = DefaultMarkerIcon()) -> Swift.Bool + public static func hitsIcon(touchScreen: CoreFoundation::CGPoint, markerScreen: CoreFoundation::CGPoint, state: MapConductorCore::MarkerState, defaultIcon: any MapConductorCore::MarkerIconProtocol = DefaultMarkerIcon()) -> Swift::Bool } public protocol MarkerIconProtocol { - var scale: CoreFoundation.CGFloat { get } - var anchor: CoreFoundation.CGPoint { get } - var iconSize: CoreFoundation.CGFloat { get } - var infoAnchor: CoreFoundation.CGPoint { get } - var debug: Swift.Bool { get } - func toBitmapIcon() -> MapConductorCore.BitmapIcon - func hashCode() -> Swift.Int -} -public struct BitmapIcon : MapConductorCore.MarkerIconProtocol, Swift.Equatable, Swift.Hashable { - public let bitmap: UIKit.UIImage - public let anchor: CoreFoundation.CGPoint - public let size: CoreFoundation.CGSize - public let scale: CoreFoundation.CGFloat - public let iconSize: CoreFoundation.CGFloat - public let infoAnchor: CoreFoundation.CGPoint - public let debug: Swift.Bool - public init(bitmap: UIKit.UIImage, anchor: CoreFoundation.CGPoint = CGPoint(x: 0.5, y: 1.0), size: CoreFoundation.CGSize? = nil, scale: CoreFoundation.CGFloat = 1.0, iconSize: CoreFoundation.CGFloat? = nil, infoAnchor: CoreFoundation.CGPoint = CGPoint(x: 0.5, y: 0.0), debug: Swift.Bool = false) - public func toBitmapIcon() -> MapConductorCore.BitmapIcon - public func hashCode() -> Swift.Int - public func toByteArray() -> [Swift.UInt8] - public static func == (a: MapConductorCore.BitmapIcon, b: MapConductorCore.BitmapIcon) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { + var scale: CoreFoundation::CGFloat { get } + var anchor: CoreFoundation::CGPoint { get } + var iconSize: CoreFoundation::CGFloat { get } + var infoAnchor: CoreFoundation::CGPoint { get } + var debug: Swift::Bool { get } + func toBitmapIcon() -> MapConductorCore::BitmapIcon + func hashCode() -> Swift::Int +} +public struct BitmapIcon : MapConductorCore::MarkerIconProtocol, Swift::Equatable, Swift::Hashable { + public let bitmap: UIKit::UIImage + public let anchor: CoreFoundation::CGPoint + public let size: CoreFoundation::CGSize + public let scale: CoreFoundation::CGFloat + public let iconSize: CoreFoundation::CGFloat + public let infoAnchor: CoreFoundation::CGPoint + public let debug: Swift::Bool + public init(bitmap: UIKit::UIImage, anchor: CoreFoundation::CGPoint = CGPoint(x: 0.5, y: 1.0), size: CoreFoundation::CGSize? = nil, scale: CoreFoundation::CGFloat = 1.0, iconSize: CoreFoundation::CGFloat? = nil, infoAnchor: CoreFoundation::CGPoint = CGPoint(x: 0.5, y: 0.0), debug: Swift::Bool = false) + public func toBitmapIcon() -> MapConductorCore::BitmapIcon + public func hashCode() -> Swift::Int + public func toByteArray() -> [Swift::UInt8] + public static func == (a: MapConductorCore::BitmapIcon, b: MapConductorCore::BitmapIcon) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { get } } public enum MarkerIngestionEngine { public struct Result { - public let tiledDataChanged: Swift.Bool - public let hasTiledMarkers: Swift.Bool + public let tiledDataChanged: Swift::Bool + public let hasTiledMarkers: Swift::Bool } - @_Concurrency.MainActor public static func ingest(data: [MapConductorCore.MarkerState], markerManager: MapConductorCore.MarkerManager, renderer: Renderer, defaultMarkerIcon: MapConductorCore.BitmapIcon, tilingEnabled: Swift.Bool, tiledMarkerIds: inout Swift.Set, shouldTile: (MapConductorCore.MarkerState) -> Swift.Bool) async -> MapConductorCore.MarkerIngestionEngine.Result where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore.MarkerOverlayRendererProtocol + @_Concurrency::MainActor public static func ingest(data: [MapConductorCore::MarkerState], markerManager: MapConductorCore::MarkerManager, renderer: Renderer, defaultMarkerIcon: MapConductorCore::BitmapIcon, tilingEnabled: Swift::Bool, tiledMarkerIds: inout Swift::Set, shouldTile: (MapConductorCore::MarkerState) -> Swift::Bool) async -> MapConductorCore::MarkerIngestionEngine.MapConductorCore::Result where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore::MarkerOverlayRendererProtocol } -public struct MarkerManagerStats : Swift.Sendable, Swift.Hashable { - public let entityCount: Swift.Int - public let hasSpatialIndex: Swift.Bool - public let spatialIndexInitialized: Swift.Bool - public let estimatedMemoryKB: Swift.Int - public static func == (a: MapConductorCore.MarkerManagerStats, b: MapConductorCore.MarkerManagerStats) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { +public struct MarkerManagerStats : Swift::Sendable, Swift::Hashable { + public let entityCount: Swift::Int + public let hasSpatialIndex: Swift::Bool + public let spatialIndexInitialized: Swift::Bool + public let estimatedMemoryKB: Swift::Int + public static func == (a: MapConductorCore::MarkerManagerStats, b: MapConductorCore::MarkerManagerStats) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { get } } final public class MarkerManager { - final public let minMarkerCount: Swift.Int - public init(geocell: any MapConductorCore.HexGeocellProtocol = HexGeocell.defaultGeocell(), minMarkerCount: Swift.Int = 2000) - final public func getEntity(_ id: Swift.String) -> MapConductorCore.MarkerEntity? - final public func hasEntity(_ id: Swift.String) -> Swift.Bool + final public let minMarkerCount: Swift::Int + public init(geocell: any MapConductorCore::HexGeocellProtocol = HexGeocell.defaultGeocell(), minMarkerCount: Swift::Int = 2000) + final public func getEntity(_ id: Swift::String) -> MapConductorCore::MarkerEntity? + final public func hasEntity(_ id: Swift::String) -> Swift::Bool @discardableResult - final public func removeEntity(_ id: Swift.String) -> MapConductorCore.MarkerEntity? - final public func registerEntity(_ entity: MapConductorCore.MarkerEntity) - final public func updateEntity(_ entity: MapConductorCore.MarkerEntity) - final public func metersPerPixel(position: any MapConductorCore.GeoPointProtocol, zoom: Swift.Double, pixels: Swift.Double, tileSize: Swift.Int = 256) -> Swift.Double - final public func findNearest(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.MarkerEntity? - final public func findByIdPrefix(_ prefix: Swift.String) -> [MapConductorCore.HexCell] - final public func allEntities() -> [MapConductorCore.MarkerEntity] - final public func findMarkersInBounds(_ bounds: MapConductorCore.GeoRectBounds) -> [MapConductorCore.MarkerEntity] - final public func getMemoryStats() -> MapConductorCore.MarkerManagerStats + final public func removeEntity(_ id: Swift::String) -> MapConductorCore::MarkerEntity? + final public func registerEntity(_ entity: MapConductorCore::MarkerEntity) + final public func updateEntity(_ entity: MapConductorCore::MarkerEntity) + final public func metersPerPixel(position: any MapConductorCore::GeoPointProtocol, zoom: Swift::Double, pixels: Swift::Double, tileSize: Swift::Int = 256) -> Swift::Double + final public func findNearest(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::MarkerEntity? + final public func findByIdPrefix(_ prefix: Swift::String) -> [MapConductorCore::HexCell] + final public func allEntities() -> [MapConductorCore::MarkerEntity] + final public func findMarkersInBounds(_ bounds: MapConductorCore::GeoRectBounds) -> [MapConductorCore::MarkerEntity] + final public func findMarkersInBounds(_ bounds: MapConductorCore::GeoRectBounds, minSeparationDegrees: Swift::Double) -> [MapConductorCore::MarkerEntity] + final public func getMemoryStats() -> MapConductorCore::MarkerManagerStats final public func clear() final public func destroy() - final public var isDestroyed: Swift.Bool { + final public var isDestroyed: Swift::Bool { get } - public static func defaultManager() -> MapConductorCore.MarkerManager - public static func defaultManager(geocell: any MapConductorCore.HexGeocellProtocol) -> MapConductorCore.MarkerManager - public static func defaultManager(geocell: (any MapConductorCore.HexGeocellProtocol)? = nil, minMarkerCount: Swift.Int = 2000) -> MapConductorCore.MarkerManager + public static func defaultManager() -> MapConductorCore::MarkerManager + public static func defaultManager(geocell: any MapConductorCore::HexGeocellProtocol) -> MapConductorCore::MarkerManager + public static func defaultManager(geocell: (any MapConductorCore::HexGeocellProtocol)? = nil, minMarkerCount: Swift::Int = 2000) -> MapConductorCore::MarkerManager @objc deinit } -@_Concurrency.MainActor public protocol MarkerOverlayRendererProtocol { +@_Concurrency::MainActor public protocol MarkerOverlayRendererProtocol { associatedtype ActualMarker - @_Concurrency.MainActor var animateStartListener: MapConductorCore.OnMarkerEventHandler? { get set } - @_Concurrency.MainActor var animateEndListener: MapConductorCore.OnMarkerEventHandler? { get set } - @_Concurrency.MainActor func onAdd(data: [MapConductorCore.MarkerOverlayAddParams]) async -> [Self.ActualMarker?] - @_Concurrency.MainActor func onChange(data: [MapConductorCore.MarkerOverlayChangeParams]) async -> [Self.ActualMarker?] - @_Concurrency.MainActor func onRemove(data: [MapConductorCore.MarkerEntity]) async - @_Concurrency.MainActor func onAnimate(entity: MapConductorCore.MarkerEntity) async - @_Concurrency.MainActor func onPostProcess() async - @_Concurrency.MainActor func unbind() -} -extension MapConductorCore.MarkerOverlayRendererProtocol { - @_Concurrency.MainActor public func unbind() + @_Concurrency::MainActor var animateStartListener: MapConductorCore::OnMarkerEventHandler? { get set } + @_Concurrency::MainActor var animateEndListener: MapConductorCore::OnMarkerEventHandler? { get set } + @_Concurrency::MainActor func onAdd(data: [MapConductorCore::MarkerOverlayAddParams]) async -> [Self.ActualMarker?] + @_Concurrency::MainActor func onChange(data: [MapConductorCore::MarkerOverlayChangeParams]) async -> [Self.ActualMarker?] + @_Concurrency::MainActor func onRemove(data: [MapConductorCore::MarkerEntity]) async + @_Concurrency::MainActor func onAnimate(entity: MapConductorCore::MarkerEntity) async + @_Concurrency::MainActor func onPostProcess() async + @_Concurrency::MainActor func unbind() +} +extension MapConductorCore::MarkerOverlayRendererProtocol { + @_Concurrency::MainActor public func unbind() } public struct MarkerOverlayAddParams { - public let state: MapConductorCore.MarkerState - public let bitmapIcon: MapConductorCore.BitmapIcon - public init(state: MapConductorCore.MarkerState, bitmapIcon: MapConductorCore.BitmapIcon) + public let state: MapConductorCore::MarkerState + public let bitmapIcon: MapConductorCore::BitmapIcon + public init(state: MapConductorCore::MarkerState, bitmapIcon: MapConductorCore::BitmapIcon) } public struct MarkerOverlayChangeParams { - public let current: MapConductorCore.MarkerEntity - public let bitmapIcon: MapConductorCore.BitmapIcon - public let prev: MapConductorCore.MarkerEntity - public init(current: MapConductorCore.MarkerEntity, bitmapIcon: MapConductorCore.BitmapIcon, prev: MapConductorCore.MarkerEntity) + public let current: MapConductorCore::MarkerEntity + public let bitmapIcon: MapConductorCore::BitmapIcon + public let prev: MapConductorCore::MarkerEntity + public init(current: MapConductorCore::MarkerEntity, bitmapIcon: MapConductorCore::BitmapIcon, prev: MapConductorCore::MarkerEntity) } public protocol MarkerRenderingStrategyProtocol { associatedtype ActualMarker - var markerManager: MapConductorCore.MarkerManager { get } + var markerManager: MapConductorCore::MarkerManager { get } func clear() - func onAdd(data: [MapConductorCore.MarkerState], viewport: MapConductorCore.GeoRectBounds, renderer: Renderer) async -> Swift.Bool where Renderer : MapConductorCore.MarkerOverlayRendererProtocol, Self.ActualMarker == Renderer.ActualMarker - func onUpdate(state: MapConductorCore.MarkerState, viewport: MapConductorCore.GeoRectBounds, renderer: Renderer) async -> Swift.Bool where Renderer : MapConductorCore.MarkerOverlayRendererProtocol, Self.ActualMarker == Renderer.ActualMarker - func onCameraChanged(mapCameraPosition: MapConductorCore.MapCameraPosition, renderer: Renderer) async where Renderer : MapConductorCore.MarkerOverlayRendererProtocol, Self.ActualMarker == Renderer.ActualMarker + func onAdd(data: [MapConductorCore::MarkerState], viewport: MapConductorCore::GeoRectBounds, renderer: Renderer) async -> Swift::Bool where Renderer : MapConductorCore::MarkerOverlayRendererProtocol, Self.ActualMarker == Renderer.ActualMarker + func onUpdate(state: MapConductorCore::MarkerState, viewport: MapConductorCore::GeoRectBounds, renderer: Renderer) async -> Swift::Bool where Renderer : MapConductorCore::MarkerOverlayRendererProtocol, Self.ActualMarker == Renderer.ActualMarker + func onCameraChanged(mapCameraPosition: MapConductorCore::MapCameraPosition, renderer: Renderer) async where Renderer : MapConductorCore::MarkerOverlayRendererProtocol, Self.ActualMarker == Renderer.ActualMarker } -public struct AnyMarkerRenderingStrategy : MapConductorCore.MarkerRenderingStrategyProtocol { - public let markerManager: MapConductorCore.MarkerManager - public init(_ strategy: Strategy) where ActualMarker == Strategy.ActualMarker, Strategy : MapConductorCore.MarkerRenderingStrategyProtocol +public struct AnyMarkerRenderingStrategy : MapConductorCore::MarkerRenderingStrategyProtocol { + public let markerManager: MapConductorCore::MarkerManager + public init(_ strategy: Strategy) where ActualMarker == Strategy.ActualMarker, Strategy : MapConductorCore::MarkerRenderingStrategyProtocol public func clear() - public func onAdd(data: [MapConductorCore.MarkerState], viewport: MapConductorCore.GeoRectBounds, renderer: Renderer) async -> Swift.Bool where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore.MarkerOverlayRendererProtocol - public func onUpdate(state: MapConductorCore.MarkerState, viewport: MapConductorCore.GeoRectBounds, renderer: Renderer) async -> Swift.Bool where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore.MarkerOverlayRendererProtocol - public func onCameraChanged(mapCameraPosition: MapConductorCore.MapCameraPosition, renderer: Renderer) async where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore.MarkerOverlayRendererProtocol + public func onAdd(data: [MapConductorCore::MarkerState], viewport: MapConductorCore::GeoRectBounds, renderer: Renderer) async -> Swift::Bool where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore::MarkerOverlayRendererProtocol + public func onUpdate(state: MapConductorCore::MarkerState, viewport: MapConductorCore::GeoRectBounds, renderer: Renderer) async -> Swift::Bool where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore::MarkerOverlayRendererProtocol + public func onCameraChanged(mapCameraPosition: MapConductorCore::MapCameraPosition, renderer: Renderer) async where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore::MarkerOverlayRendererProtocol } -@_Concurrency.MainActor public struct AnyMarkerOverlayRenderer : MapConductorCore.MarkerOverlayRendererProtocol { - @_Concurrency.MainActor public var animateStartListener: MapConductorCore.OnMarkerEventHandler? { +@_Concurrency::MainActor public struct AnyMarkerOverlayRenderer : MapConductorCore::MarkerOverlayRendererProtocol { + @_Concurrency::MainActor public var animateStartListener: MapConductorCore::OnMarkerEventHandler? { get set } - @_Concurrency.MainActor public var animateEndListener: MapConductorCore.OnMarkerEventHandler? { + @_Concurrency::MainActor public var animateEndListener: MapConductorCore::OnMarkerEventHandler? { get set } - @_Concurrency.MainActor public init(_ renderer: Renderer) where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore.MarkerOverlayRendererProtocol - @_Concurrency.MainActor public func onAdd(data: [MapConductorCore.MarkerOverlayAddParams]) async -> [ActualMarker?] - @_Concurrency.MainActor public func onChange(data: [MapConductorCore.MarkerOverlayChangeParams]) async -> [ActualMarker?] - @_Concurrency.MainActor public func onRemove(data: [MapConductorCore.MarkerEntity]) async - @_Concurrency.MainActor public func onAnimate(entity: MapConductorCore.MarkerEntity) async - @_Concurrency.MainActor public func onPostProcess() async + @_Concurrency::MainActor public init(_ renderer: Renderer) where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore::MarkerOverlayRendererProtocol + @_Concurrency::MainActor public func onAdd(data: [MapConductorCore::MarkerOverlayAddParams]) async -> [ActualMarker?] + @_Concurrency::MainActor public func onChange(data: [MapConductorCore::MarkerOverlayChangeParams]) async -> [ActualMarker?] + @_Concurrency::MainActor public func onRemove(data: [MapConductorCore::MarkerEntity]) async + @_Concurrency::MainActor public func onAnimate(entity: MapConductorCore::MarkerEntity) async + @_Concurrency::MainActor public func onPostProcess() async } -open class AbstractMarkerRenderingStrategy : MapConductorCore.MarkerRenderingStrategyProtocol { - final public let markerManager: MapConductorCore.MarkerManager - final public let semaphore: MapConductorCore.AsyncSemaphore - final public let defaultMarkerIcon: MapConductorCore.BitmapIcon - public init(markerManager: MapConductorCore.MarkerManager = MarkerManager(), semaphore: MapConductorCore.AsyncSemaphore = AsyncSemaphore(1)) +open class AbstractMarkerRenderingStrategy : MapConductorCore::MarkerRenderingStrategyProtocol { + final public let markerManager: MapConductorCore::MarkerManager + final public let semaphore: MapConductorCore::AsyncSemaphore + final public let defaultMarkerIcon: MapConductorCore::BitmapIcon + public init(markerManager: MapConductorCore::MarkerManager = MarkerManager(), semaphore: MapConductorCore::AsyncSemaphore = AsyncSemaphore(1)) open func clear() - open func onAdd(data: [MapConductorCore.MarkerState], viewport: MapConductorCore.GeoRectBounds, renderer: Renderer) async -> Swift.Bool where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore.MarkerOverlayRendererProtocol - open func onUpdate(state: MapConductorCore.MarkerState, viewport: MapConductorCore.GeoRectBounds, renderer: Renderer) async -> Swift.Bool where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore.MarkerOverlayRendererProtocol - open func onCameraChanged(mapCameraPosition: MapConductorCore.MapCameraPosition, renderer: Renderer) async where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore.MarkerOverlayRendererProtocol + open func onAdd(data: [MapConductorCore::MarkerState], viewport: MapConductorCore::GeoRectBounds, renderer: Renderer) async -> Swift::Bool where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore::MarkerOverlayRendererProtocol + open func onUpdate(state: MapConductorCore::MarkerState, viewport: MapConductorCore::GeoRectBounds, renderer: Renderer) async -> Swift::Bool where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore::MarkerOverlayRendererProtocol + open func onCameraChanged(mapCameraPosition: MapConductorCore::MapCameraPosition, renderer: Renderer) async where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore::MarkerOverlayRendererProtocol @objc deinit } -@_Concurrency.MainActor public protocol MarkerRenderingSupport : AnyObject { +@_Concurrency::MainActor public protocol MarkerRenderingSupport : AnyObject { @discardableResult - @_Concurrency.MainActor func connect(strategy: Any, markers: [MapConductorCore.MarkerState]) -> Swift.Bool - @_Concurrency.MainActor func syncMarkers(_ markers: [MapConductorCore.MarkerState]) - @_Concurrency.MainActor func disconnect() - @_Concurrency.MainActor func beginContentPass() - @_Concurrency.MainActor func endContentPass() + @_Concurrency::MainActor func connect(strategy: Any, markers: [MapConductorCore::MarkerState]) -> Swift::Bool + @_Concurrency::MainActor func syncMarkers(_ markers: [MapConductorCore::MarkerState]) + @_Concurrency::MainActor func disconnect() + @_Concurrency::MainActor func beginContentPass() + @_Concurrency::MainActor func endContentPass() } -public enum MarkerRenderingSupportKey : MapConductorCore.MapServiceKey { - public typealias Value = any MapConductorCore.MarkerRenderingSupport +public enum MarkerRenderingSupportKey : MapConductorCore::MapServiceKey { + public typealias Value = any MapConductorCore::MarkerRenderingSupport } public enum MarkerAnimation { case Drop case Bounce - public static func == (a: MapConductorCore.MarkerAnimation, b: MapConductorCore.MarkerAnimation) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { + public static func == (a: MapConductorCore::MarkerAnimation, b: MapConductorCore::MarkerAnimation) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { get } } -public struct MarkerFingerPrint : Swift.Equatable, Swift.Hashable { - public let id: Swift.Int - public let icon: Swift.Int? - public let clickable: Swift.Int - public let draggable: Swift.Int - public let latitude: Swift.Int - public let longitude: Swift.Int - public let zIndex: Swift.Int? - public let animation: Swift.Int? - public static func == (a: MapConductorCore.MarkerFingerPrint, b: MapConductorCore.MarkerFingerPrint) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { +public struct MarkerFingerPrint : Swift::Equatable, Swift::Hashable { + public let id: Swift::Int + public let icon: Swift::Int? + public let clickable: Swift::Int + public let draggable: Swift::Int + public let latitude: Swift::Int + public let longitude: Swift::Int + public let zIndex: Swift::Int? + public let animation: Swift::Int? + public static func == (a: MapConductorCore::MarkerFingerPrint, b: MapConductorCore::MarkerFingerPrint) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { get } } -public typealias OnMarkerEventHandler = (MapConductorCore.MarkerState) -> Swift.Void -final public class MarkerState : Combine.ObservableObject, Swift.Identifiable, Swift.Equatable, Swift.Hashable { - final public let id: Swift.String +public typealias OnMarkerEventHandler = (MapConductorCore::MarkerState) -> Swift::Void +final public class MarkerState : Combine::ObservableObject, Swift::Identifiable, Swift::Equatable, Swift::Hashable { + final public let id: Swift::String final public var extra: Any? - @Combine.Published<(any MapConductorCore.MarkerIconProtocol)?> @_projectedValueProperty($icon) final public var icon: (any MapConductorCore.MarkerIconProtocol)? { + final public let mutations: MapConductorCore::StateMutationSignal + @Combine::Published<(any MapConductorCore::MarkerIconProtocol)?> @_projectedValueProperty($icon) final public var icon: (any MapConductorCore::MarkerIconProtocol)? { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $icon: Combine.Published<(any MapConductorCore.MarkerIconProtocol)?>.Publisher { + final public var $icon: Combine::Published<(any MapConductorCore::MarkerIconProtocol)?>.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($clickable) final public var clickable: Swift.Bool { + @Combine::Published @_projectedValueProperty($clickable) final public var clickable: Swift::Bool { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $clickable: Combine.Published.Publisher { + final public var $clickable: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($draggable) final public var draggable: Swift.Bool { + @Combine::Published @_projectedValueProperty($draggable) final public var draggable: Swift::Bool { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $draggable: Combine.Published.Publisher { + final public var $draggable: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($zIndex) final public var zIndex: Swift.Int? { + @Combine::Published @_projectedValueProperty($zIndex) final public var zIndex: Swift::Int? { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $zIndex: Combine.Published.Publisher { + final public var $zIndex: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($onClick) final public var onClick: MapConductorCore.OnMarkerEventHandler? { + @Combine::Published @_projectedValueProperty($onClick) final public var onClick: MapConductorCore::OnMarkerEventHandler? { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $onClick: Combine.Published.Publisher { + final public var $onClick: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($onDragStart) final public var onDragStart: MapConductorCore.OnMarkerEventHandler? { + @Combine::Published @_projectedValueProperty($onDragStart) final public var onDragStart: MapConductorCore::OnMarkerEventHandler? { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $onDragStart: Combine.Published.Publisher { + final public var $onDragStart: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($onDrag) final public var onDrag: MapConductorCore.OnMarkerEventHandler? { + @Combine::Published @_projectedValueProperty($onDrag) final public var onDrag: MapConductorCore::OnMarkerEventHandler? { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $onDrag: Combine.Published.Publisher { + final public var $onDrag: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($onDragEnd) final public var onDragEnd: MapConductorCore.OnMarkerEventHandler? { + @Combine::Published @_projectedValueProperty($onDragEnd) final public var onDragEnd: MapConductorCore::OnMarkerEventHandler? { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $onDragEnd: Combine.Published.Publisher { + final public var $onDragEnd: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($onAnimateStart) final public var onAnimateStart: MapConductorCore.OnMarkerEventHandler? { + @Combine::Published @_projectedValueProperty($onAnimateStart) final public var onAnimateStart: MapConductorCore::OnMarkerEventHandler? { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $onAnimateStart: Combine.Published.Publisher { + final public var $onAnimateStart: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($onAnimateEnd) final public var onAnimateEnd: MapConductorCore.OnMarkerEventHandler? { + @Combine::Published @_projectedValueProperty($onAnimateEnd) final public var onAnimateEnd: MapConductorCore::OnMarkerEventHandler? { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $onAnimateEnd: Combine.Published.Publisher { + final public var $onAnimateEnd: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($position) final public var position: MapConductorCore.GeoPoint { + @Combine::Published @_projectedValueProperty($position) final public var position: MapConductorCore::GeoPoint { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $position: Combine.Published.Publisher { + final public var $position: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - public init(position: MapConductorCore.GeoPoint, id: Swift.String? = nil, extra: Any? = nil, icon: (any MapConductorCore.MarkerIconProtocol)? = nil, animation: MapConductorCore.MarkerAnimation? = nil, clickable: Swift.Bool = true, draggable: Swift.Bool = false, zIndex: Swift.Int? = nil, onClick: MapConductorCore.OnMarkerEventHandler? = nil, onDragStart: MapConductorCore.OnMarkerEventHandler? = nil, onDrag: MapConductorCore.OnMarkerEventHandler? = nil, onDragEnd: MapConductorCore.OnMarkerEventHandler? = nil, onAnimateStart: MapConductorCore.OnMarkerEventHandler? = nil, onAnimateEnd: MapConductorCore.OnMarkerEventHandler? = nil) - convenience public init(position: MapConductorCore.GeoPoint, id: Swift.String? = nil, extra: Any? = nil, icon: MapConductorCore.DefaultMarkerIcon, animation: MapConductorCore.MarkerAnimation? = nil, clickable: Swift.Bool = true, draggable: Swift.Bool = false, zIndex: Swift.Int? = nil, onClick: MapConductorCore.OnMarkerEventHandler? = nil, onDragStart: MapConductorCore.OnMarkerEventHandler? = nil, onDrag: MapConductorCore.OnMarkerEventHandler? = nil, onDragEnd: MapConductorCore.OnMarkerEventHandler? = nil, onAnimateStart: MapConductorCore.OnMarkerEventHandler? = nil, onAnimateEnd: MapConductorCore.OnMarkerEventHandler? = nil) - final public func animate(_ animation: MapConductorCore.MarkerAnimation?) - final public func getAnimation() -> MapConductorCore.MarkerAnimation? - final public func copy(id: Swift.String? = nil, position: MapConductorCore.GeoPoint? = nil, extra: Any? = nil, icon: (any MapConductorCore.MarkerIconProtocol)? = nil, animation: MapConductorCore.MarkerAnimation?? = nil, clickable: Swift.Bool? = nil, draggable: Swift.Bool? = nil, zIndex: Swift.Int?? = nil, onClick: MapConductorCore.OnMarkerEventHandler? = nil, onDragStart: MapConductorCore.OnMarkerEventHandler? = nil, onDrag: MapConductorCore.OnMarkerEventHandler? = nil, onDragEnd: MapConductorCore.OnMarkerEventHandler? = nil, onAnimateStart: MapConductorCore.OnMarkerEventHandler? = nil, onAnimateEnd: MapConductorCore.OnMarkerEventHandler? = nil) -> MapConductorCore.MarkerState - public static func == (lhs: MapConductorCore.MarkerState, rhs: MapConductorCore.MarkerState) -> Swift.Bool - final public func hash(into hasher: inout Swift.Hasher) - final public func hashCode() -> Swift.Int - final public func fingerPrint() -> MapConductorCore.MarkerFingerPrint - final public func asFlow() -> Combine.AnyPublisher - public typealias ID = Swift.String - public typealias ObjectWillChangePublisher = Combine.ObservableObjectPublisher + public init(position: MapConductorCore::GeoPoint, id: Swift::String? = nil, extra: Any? = nil, icon: (any MapConductorCore::MarkerIconProtocol)? = nil, animation: MapConductorCore::MarkerAnimation? = nil, clickable: Swift::Bool = true, draggable: Swift::Bool = false, zIndex: Swift::Int? = nil, onClick: MapConductorCore::OnMarkerEventHandler? = nil, onDragStart: MapConductorCore::OnMarkerEventHandler? = nil, onDrag: MapConductorCore::OnMarkerEventHandler? = nil, onDragEnd: MapConductorCore::OnMarkerEventHandler? = nil, onAnimateStart: MapConductorCore::OnMarkerEventHandler? = nil, onAnimateEnd: MapConductorCore::OnMarkerEventHandler? = nil) + convenience public init(position: MapConductorCore::GeoPoint, id: Swift::String? = nil, extra: Any? = nil, icon: MapConductorCore::DefaultMarkerIcon, animation: MapConductorCore::MarkerAnimation? = nil, clickable: Swift::Bool = true, draggable: Swift::Bool = false, zIndex: Swift::Int? = nil, onClick: MapConductorCore::OnMarkerEventHandler? = nil, onDragStart: MapConductorCore::OnMarkerEventHandler? = nil, onDrag: MapConductorCore::OnMarkerEventHandler? = nil, onDragEnd: MapConductorCore::OnMarkerEventHandler? = nil, onAnimateStart: MapConductorCore::OnMarkerEventHandler? = nil, onAnimateEnd: MapConductorCore::OnMarkerEventHandler? = nil) + final public func animate(_ animation: MapConductorCore::MarkerAnimation?) + final public func getAnimation() -> MapConductorCore::MarkerAnimation? + final public func copy(id: Swift::String? = nil, position: MapConductorCore::GeoPoint? = nil, extra: Any? = nil, icon: (any MapConductorCore::MarkerIconProtocol)? = nil, animation: MapConductorCore::MarkerAnimation?? = nil, clickable: Swift::Bool? = nil, draggable: Swift::Bool? = nil, zIndex: Swift::Int?? = nil, onClick: MapConductorCore::OnMarkerEventHandler? = nil, onDragStart: MapConductorCore::OnMarkerEventHandler? = nil, onDrag: MapConductorCore::OnMarkerEventHandler? = nil, onDragEnd: MapConductorCore::OnMarkerEventHandler? = nil, onAnimateStart: MapConductorCore::OnMarkerEventHandler? = nil, onAnimateEnd: MapConductorCore::OnMarkerEventHandler? = nil) -> MapConductorCore::MarkerState + public static func == (lhs: MapConductorCore::MarkerState, rhs: MapConductorCore::MarkerState) -> Swift::Bool + final public func hash(into hasher: inout Swift::Hasher) + final public func hashCode() -> Swift::Int + final public func fingerPrint() -> MapConductorCore::MarkerFingerPrint + final public func asFlow() -> Combine::AnyPublisher + public typealias ID = Swift::String + public typealias ObjectWillChangePublisher = Combine::ObservableObjectPublisher @objc deinit - final public var hashValue: Swift.Int { + final public var hashValue: Swift::Int { get } } -final public class MarkerTileRenderer : MapConductorCore.TileProvider { - final public let tileSize: Swift.Int - final public let extraIconScale: Swift.Double - public init(markerManager: MapConductorCore.MarkerManager, tileSize: Swift.Int = 256, extraIconScale: Swift.Double = 1.0, cacheSizeBytes: Swift.Int = 8 * 1024 * 1024, debugTileOverlay: Swift.Bool = false, iconScaleCallback: ((MapConductorCore.MarkerState, Swift.Int) -> Swift.Double)? = nil) +public enum MarkerTilePhaseTrace { + public static var enabled: Swift::Bool +} +final public class MarkerTileRenderer : MapConductorCore::TileProvider { + final public let tileSize: Swift::Int + final public let extraIconScale: Swift::Double + public init(markerManager: MapConductorCore::MarkerManager, tileSize: Swift::Int = 256, extraIconScale: Swift::Double = 1.0, cacheSizeBytes: Swift::Int = 8 * 1024 * 1024, debugTileOverlay: Swift::Bool = false, iconScaleCallback: ((MapConductorCore::MarkerState, Swift::Int) -> Swift::Double)? = nil, declutterPx: Swift::Int = 0) final public func invalidate() final public func clear() - final public func hitTest(screenPoint: CoreFoundation.CGPoint, markerIds: Swift.Set, zoom: Swift.Int, tolerance: CoreFoundation.CGFloat = 14, renderScaleToScreenScale: CoreFoundation.CGFloat = UIScreen.main.scale, unproject: (CoreFoundation.CGPoint) -> MapConductorCore.GeoPoint?, project: (MapConductorCore.GeoPoint) -> CoreFoundation.CGPoint?) -> MapConductorCore.MarkerState? - final public func renderTile(request: MapConductorCore.TileRequest) -> Foundation.Data? + final public func hitTest(screenPoint: CoreFoundation::CGPoint, markerIds: Swift::Set, zoom: Swift::Int, tolerance: CoreFoundation::CGFloat = 14, renderScaleToScreenScale: CoreFoundation::CGFloat = UIScreen.main.scale, unproject: (CoreFoundation::CGPoint) -> MapConductorCore::GeoPoint?, project: (MapConductorCore::GeoPoint) -> CoreFoundation::CGPoint?) -> MapConductorCore::MarkerState? + final public var onEmptyTileWhilePopulated: ((MapConductorCore::TileRequest) -> Swift::Void)? + final public func tileStillEmpty(request: MapConductorCore::TileRequest) -> Swift::Bool + final public func renderTile(request: MapConductorCore::TileRequest) -> Foundation::Data? @objc deinit } public struct MarkerTilingOptions { - public let enabled: Swift.Bool - public let debugTileOverlay: Swift.Bool - public let minMarkerCount: Swift.Int - public let cacheSize: Swift.Int - public let iconScaleCallback: ((MapConductorCore.MarkerState, Swift.Int) -> Swift.Double)? - public static let Disabled: MapConductorCore.MarkerTilingOptions - public static let Default: MapConductorCore.MarkerTilingOptions - public init(enabled: Swift.Bool = true, debugTileOverlay: Swift.Bool = false, minMarkerCount: Swift.Int = 2000, cacheSize: Swift.Int = 8 * 1024 * 1024, iconScaleCallback: ((MapConductorCore.MarkerState, Swift.Int) -> Swift.Double)? = nil) - public func shouldUseTiles(markerCount: Swift.Int) -> Swift.Bool -} -final public class StrategyMarkerController : MapConductorCore.OverlayControllerProtocol, MapConductorCore.SlottedOverlayController where ActualMarker == Strategy.ActualMarker, Strategy : MapConductorCore.MarkerRenderingStrategyProtocol, Renderer : MapConductorCore.MarkerOverlayRendererProtocol, Strategy.ActualMarker == Renderer.ActualMarker { - public typealias StateType = MapConductorCore.MarkerState - public typealias EntityType = MapConductorCore.MarkerEntity - public typealias EventType = MapConductorCore.MarkerState - final public let markerManager: MapConductorCore.MarkerManager + public let enabled: Swift::Bool + public let debugTileOverlay: Swift::Bool + public let minMarkerCount: Swift::Int + public let cacheSize: Swift::Int + public let iconScaleCallback: ((MapConductorCore::MarkerState, Swift::Int) -> Swift::Double)? + public let declutterPx: Swift::Int + public static let Disabled: MapConductorCore::MarkerTilingOptions + public static let Default: MapConductorCore::MarkerTilingOptions + public init(enabled: Swift::Bool = true, debugTileOverlay: Swift::Bool = false, minMarkerCount: Swift::Int = 2000, cacheSize: Swift::Int = 8 * 1024 * 1024, iconScaleCallback: ((MapConductorCore::MarkerState, Swift::Int) -> Swift::Double)? = nil, declutterPx: Swift::Int = 0) + public func shouldUseTiles(markerCount: Swift::Int) -> Swift::Bool +} +final public class StrategyMarkerController : MapConductorCore::OverlayControllerProtocol, MapConductorCore::SlottedOverlayController where ActualMarker == Strategy.ActualMarker, Strategy : MapConductorCore::MarkerRenderingStrategyProtocol, Renderer : MapConductorCore::MarkerOverlayRendererProtocol, Strategy.ActualMarker == Renderer.ActualMarker { + public typealias StateType = MapConductorCore::MarkerState + public typealias EntityType = MapConductorCore::MarkerEntity + public typealias EventType = MapConductorCore::MarkerState + final public let markerManager: MapConductorCore::MarkerManager final public let strategy: Strategy final public var renderer: Renderer - final public var clickListener: ((MapConductorCore.MarkerState) -> Swift.Void)? - final public var markerProjector: ((any MapConductorCore.GeoPointProtocol) -> CoreFoundation.CGPoint?)? - final public var dragStartListener: MapConductorCore.OnMarkerEventHandler? - final public var dragListener: MapConductorCore.OnMarkerEventHandler? - final public var dragEndListener: MapConductorCore.OnMarkerEventHandler? - final public var animateStartListener: MapConductorCore.OnMarkerEventHandler? - final public var animateEndListener: MapConductorCore.OnMarkerEventHandler? - final public let zIndex: Swift.Int - public init(strategy: Strategy, renderer: Renderer, clickListener: ((MapConductorCore.MarkerState) -> Swift.Void)? = nil) - final public func dispatchClick(_ state: MapConductorCore.MarkerState) - final public func dispatchDragStart(_ state: MapConductorCore.MarkerState) - final public func dispatchDrag(_ state: MapConductorCore.MarkerState) - final public func dispatchDragEnd(_ state: MapConductorCore.MarkerState) - final public func dispatchAnimateStart(_ state: MapConductorCore.MarkerState) - final public func dispatchAnimateEnd(_ state: MapConductorCore.MarkerState) - final public func add(data: [MapConductorCore.MarkerState]) async - final public func update(state: MapConductorCore.MarkerState) async + final public var clickListener: ((MapConductorCore::MarkerState) -> Swift::Void)? + final public var markerProjector: ((any MapConductorCore::GeoPointProtocol) -> CoreFoundation::CGPoint?)? + final public var dragStartListener: MapConductorCore::OnMarkerEventHandler? + final public var dragListener: MapConductorCore::OnMarkerEventHandler? + final public var dragEndListener: MapConductorCore::OnMarkerEventHandler? + final public var animateStartListener: MapConductorCore::OnMarkerEventHandler? + final public var animateEndListener: MapConductorCore::OnMarkerEventHandler? + final public let zIndex: Swift::Int + public init(strategy: Strategy, renderer: Renderer, clickListener: ((MapConductorCore::MarkerState) -> Swift::Void)? = nil) + final public func dispatchClick(_ state: MapConductorCore::MarkerState) + final public func dispatchDragStart(_ state: MapConductorCore::MarkerState) + final public func dispatchDrag(_ state: MapConductorCore::MarkerState) + final public func dispatchDragEnd(_ state: MapConductorCore::MarkerState) + final public func dispatchAnimateStart(_ state: MapConductorCore::MarkerState) + final public func dispatchAnimateEnd(_ state: MapConductorCore::MarkerState) + final public func add(data: [MapConductorCore::MarkerState]) async + final public func update(state: MapConductorCore::MarkerState) async final public func clear() async - final public func find(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.MarkerEntity? - final public func onCameraChanged(mapCameraPosition: MapConductorCore.MapCameraPosition) async + final public func find(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::MarkerEntity? + final public func onCameraChanged(mapCameraPosition: MapConductorCore::MapCameraPosition) async final public func destroy() - final public var kind: MapConductorCore.OverlayKind { + final public var kind: MapConductorCore::OverlayKind { get } - final public func hasId(_ id: Swift.String) -> Swift.Bool - final public func resolveTap(position _: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.OverlayHit? + final public func hasId(_ id: Swift::String) -> Swift::Bool + final public func resolveTap(position _: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::OverlayHit? @objc deinit } -@_Concurrency.MainActor final public class StrategyMarkerManager : MapConductorCore.MarkerRenderingSupport where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore.MarkerOverlayRendererProtocol { - public typealias RendererFactory = (MapConductorCore.AnyMarkerRenderingStrategy) -> Renderer - @_Concurrency.MainActor final public var controller: MapConductorCore.StrategyMarkerController, Renderer>? { +@_Concurrency::MainActor final public class StrategyMarkerManager : MapConductorCore::MarkerRenderingSupport where ActualMarker == Renderer.ActualMarker, Renderer : MapConductorCore::MarkerOverlayRendererProtocol { + public typealias RendererFactory = (MapConductorCore::AnyMarkerRenderingStrategy) -> Renderer + @_Concurrency::MainActor final public var controller: MapConductorCore::StrategyMarkerController, Renderer>? { get } - @_Concurrency.MainActor final public var renderer: Renderer? { + @_Concurrency::MainActor final public var renderer: Renderer? { get } - @_Concurrency.MainActor final public var latestMarkers: [MapConductorCore.MarkerState] { + @_Concurrency::MainActor final public var latestMarkers: [MapConductorCore::MarkerState] { get } - @_Concurrency.MainActor final public var onMarkersChanged: (([MapConductorCore.MarkerState]) -> Swift.Void)? - @_Concurrency.MainActor final public var onRendererCreated: ((Renderer) -> Swift.Void)? - @_Concurrency.MainActor public init(makeRenderer: @escaping MapConductorCore.StrategyMarkerManager.RendererFactory, shouldAddMarkers: @escaping () -> Swift.Bool = { true }, currentCamera: @escaping () -> MapConductorCore.MapCameraPosition? = { nil }) + @_Concurrency::MainActor final public var onMarkersChanged: (([MapConductorCore::MarkerState]) -> Swift::Void)? + @_Concurrency::MainActor final public var onRendererCreated: ((Renderer) -> Swift::Void)? + @_Concurrency::MainActor public init(makeRenderer: @escaping MapConductorCore::StrategyMarkerManager.MapConductorCore::RendererFactory, shouldAddMarkers: @escaping () -> Swift::Bool = { true }, currentCamera: @escaping () -> MapConductorCore::MapCameraPosition? = { nil }) @discardableResult - @_Concurrency.MainActor final public func connect(strategy: Any, markers: [MapConductorCore.MarkerState]) -> Swift.Bool - @_Concurrency.MainActor final public func disconnect() - @_Concurrency.MainActor final public func beginContentPass() - @_Concurrency.MainActor final public func endContentPass() - @_Concurrency.MainActor final public func onCameraChanged(_ position: MapConductorCore.MapCameraPosition) async - @_Concurrency.MainActor final public func flush() - @_Concurrency.MainActor final public func clear() - @_Concurrency.MainActor final public func syncMarkers(_ markers: [MapConductorCore.MarkerState]) + @_Concurrency::MainActor final public func connect(strategy: Any, markers: [MapConductorCore::MarkerState]) -> Swift::Bool + @_Concurrency::MainActor final public func disconnect() + @_Concurrency::MainActor final public func beginContentPass() + @_Concurrency::MainActor final public func endContentPass() + @_Concurrency::MainActor final public func onCameraChanged(_ position: MapConductorCore::MapCameraPosition) async + @_Concurrency::MainActor final public func flush() + @_Concurrency::MainActor final public func clear() + @_Concurrency::MainActor final public func syncMarkers(_ markers: [MapConductorCore::MarkerState]) @objc deinit } -@_Concurrency.MainActor final public class DeferredUntilReady { - @_Concurrency.MainActor final public var isReady: Swift.Bool { +@_Concurrency::MainActor final public class DeferredUntilReady { + @_Concurrency::MainActor final public var isReady: Swift::Bool { get } - @_Concurrency.MainActor final public var latest: Input? { + @_Concurrency::MainActor final public var latest: Input? { get } - @_Concurrency.MainActor public init(apply: @escaping (Input) -> Swift.Void) - @_Concurrency.MainActor final public func submit(_ input: Input) - @_Concurrency.MainActor final public func markReady() - @_Concurrency.MainActor final public func reset() + @_Concurrency::MainActor public init(apply: @escaping (Input) -> Swift::Void) + @_Concurrency::MainActor final public func submit(_ input: Input) + @_Concurrency::MainActor final public func markReady() + @_Concurrency::MainActor final public func reset() @objc deinit } -@_Concurrency.MainActor final public class MapOverlayScope { - @_Concurrency.MainActor final public let markerCollector: MapConductorCore.OverlayCollector - @_Concurrency.MainActor final public let circleCollector: MapConductorCore.OverlayCollector - @_Concurrency.MainActor final public let polylineCollector: MapConductorCore.OverlayCollector - @_Concurrency.MainActor final public let polygonCollector: MapConductorCore.OverlayCollector - @_Concurrency.MainActor final public let groundImageCollector: MapConductorCore.OverlayCollector - @_Concurrency.MainActor final public let rasterLayerCollector: MapConductorCore.OverlayCollector - @_Concurrency.MainActor public init() - @_Concurrency.MainActor final public func clear() +@_Concurrency::MainActor final public class MapOverlayScope { + @_Concurrency::MainActor final public let markerCollector: MapConductorCore::OverlayCollector + @_Concurrency::MainActor final public let circleCollector: MapConductorCore::OverlayCollector + @_Concurrency::MainActor final public let polylineCollector: MapConductorCore::OverlayCollector + @_Concurrency::MainActor final public let polygonCollector: MapConductorCore::OverlayCollector + @_Concurrency::MainActor final public let groundImageCollector: MapConductorCore::OverlayCollector + @_Concurrency::MainActor final public let rasterLayerCollector: MapConductorCore::OverlayCollector + @_Concurrency::MainActor public init() + @_Concurrency::MainActor final public func clear() @objc deinit } public protocol OverlayCollectableState : AnyObject { - var id: Swift.String { get } - func overlayChangePublisher() -> Combine.AnyPublisher -} -extension MapConductorCore.MarkerState : MapConductorCore.OverlayCollectableState { - final public func overlayChangePublisher() -> Combine.AnyPublisher -} -extension MapConductorCore.CircleState : MapConductorCore.OverlayCollectableState { - final public func overlayChangePublisher() -> Combine.AnyPublisher -} -extension MapConductorCore.PolylineState : MapConductorCore.OverlayCollectableState { - final public func overlayChangePublisher() -> Combine.AnyPublisher -} -extension MapConductorCore.PolygonState : MapConductorCore.OverlayCollectableState { - final public func overlayChangePublisher() -> Combine.AnyPublisher -} -extension MapConductorCore.GroundImageState : MapConductorCore.OverlayCollectableState { - final public func overlayChangePublisher() -> Combine.AnyPublisher -} -extension MapConductorCore.RasterLayerState : MapConductorCore.OverlayCollectableState { - final public func overlayChangePublisher() -> Combine.AnyPublisher -} -@_Concurrency.MainActor final public class OverlayCollector where S : MapConductorCore.OverlayCollectableState { - @_Concurrency.MainActor public init(shouldApply: @escaping () -> Swift.Bool = { true }) - @_Concurrency.MainActor final public func setShouldApply(_ gate: @escaping () -> Swift.Bool) - @_Concurrency.MainActor final public func onMembershipChange(_ handler: @escaping ([S]) -> Swift.Void) - @_Concurrency.MainActor final public func onStateChange(_ handler: @escaping (S) -> Swift.Void) - @_Concurrency.MainActor final public func sync(_ states: [S]) - @_Concurrency.MainActor final public func flush() - @_Concurrency.MainActor final public func values() -> [S] - @_Concurrency.MainActor final public func get(_ id: Swift.String) -> S? - @_Concurrency.MainActor final public func clear() - @objc deinit -} -@_Concurrency.MainActor public func bindOverlayCollector(_ collector: MapConductorCore.OverlayCollector, to controller: C) where S : MapConductorCore.OverlayCollectableState, S == C.StateType, C : MapConductorCore.OverlayControllerProtocol -public func bridgeHolesIntoSingleRing(outer: [any MapConductorCore.GeoPointProtocol], holes: [[any MapConductorCore.GeoPointProtocol]], separation: Swift.Double = 0.0) -> [any MapConductorCore.GeoPointProtocol] -public func bridgeHolesIntoSingleRingWrapAware(outer: [any MapConductorCore.GeoPointProtocol], holes: [[any MapConductorCore.GeoPointProtocol]], separation: Swift.Double = 0.0) -> [any MapConductorCore.GeoPointProtocol] -open class PolygonController : MapConductorCore.OverlayControllerProtocol, MapConductorCore.SlottedOverlayController where ActualPolygon == Renderer.ActualPolygon, Renderer : MapConductorCore.PolygonOverlayRendererProtocol { - public typealias StateType = MapConductorCore.PolygonState - public typealias EntityType = MapConductorCore.PolygonEntity - public typealias EventType = MapConductorCore.PolygonEvent - final public let polygonManager: MapConductorCore.PolygonManager + var id: Swift::String { get } + var mutations: MapConductorCore::StateMutationSignal { get } +} +extension MapConductorCore::MarkerState : MapConductorCore::OverlayCollectableState { +} +extension MapConductorCore::CircleState : MapConductorCore::OverlayCollectableState { +} +extension MapConductorCore::PolylineState : MapConductorCore::OverlayCollectableState { +} +extension MapConductorCore::PolygonState : MapConductorCore::OverlayCollectableState { +} +extension MapConductorCore::GroundImageState : MapConductorCore::OverlayCollectableState { +} +extension MapConductorCore::RasterLayerState : MapConductorCore::OverlayCollectableState { +} +@_Concurrency::MainActor final public class OverlayCollector where S : MapConductorCore::OverlayCollectableState { + @_Concurrency::MainActor public init(shouldApply: @escaping () -> Swift::Bool = { true }) + @_Concurrency::MainActor final public func setShouldApply(_ gate: @escaping () -> Swift::Bool) + @_Concurrency::MainActor final public func onMembershipChange(_ handler: @escaping ([S]) -> Swift::Void) + @_Concurrency::MainActor final public func onStateChange(_ handler: @escaping (S) -> Swift::Void) + @_Concurrency::MainActor final public func sync(_ states: [S]) + @_Concurrency::MainActor final public func flush() + @_Concurrency::MainActor final public func values() -> [S] + @_Concurrency::MainActor final public func get(_ id: Swift::String) -> S? + @_Concurrency::MainActor final public func clear() + @objc deinit +} +@_Concurrency::MainActor public func bindOverlayCollector(_ collector: MapConductorCore::OverlayCollector, to controller: C) where S : MapConductorCore::OverlayCollectableState, S == C.StateType, C : MapConductorCore::OverlayControllerProtocol +final public class StateMutationSignal { + public init() + final public func listen(_ listener: (() -> Swift::Void)?) + final public func notifyMutated() + @objc deinit +} +public func bridgeHolesIntoSingleRing(outer: [any MapConductorCore::GeoPointProtocol], holes: [[any MapConductorCore::GeoPointProtocol]], separation: Swift::Double = 0.0) -> [any MapConductorCore::GeoPointProtocol] +public func bridgeHolesIntoSingleRingWrapAware(outer: [any MapConductorCore::GeoPointProtocol], holes: [[any MapConductorCore::GeoPointProtocol]], separation: Swift::Double = 0.0) -> [any MapConductorCore::GeoPointProtocol] +open class PolygonController : MapConductorCore::OverlayControllerProtocol, MapConductorCore::SlottedOverlayController where ActualPolygon == Renderer.ActualPolygon, Renderer : MapConductorCore::PolygonOverlayRendererProtocol { + public typealias StateType = MapConductorCore::PolygonState + public typealias EntityType = MapConductorCore::PolygonEntity + public typealias EventType = MapConductorCore::PolygonEvent + final public let polygonManager: MapConductorCore::PolygonManager open var renderer: Renderer - final public let zIndex: Swift.Int - public var clickListener: ((MapConductorCore.PolygonEvent) -> Swift.Void)? - public init(polygonManager: MapConductorCore.PolygonManager, renderer: Renderer, clickListener: ((MapConductorCore.PolygonEvent) -> Swift.Void)? = nil) - public func dispatchClick(event: MapConductorCore.PolygonEvent) - open func add(data: [MapConductorCore.PolygonState]) async - open func update(state: MapConductorCore.PolygonState) async + final public let zIndex: Swift::Int + public var clickListener: ((MapConductorCore::PolygonEvent) -> Swift::Void)? + public init(polygonManager: MapConductorCore::PolygonManager, renderer: Renderer, clickListener: ((MapConductorCore::PolygonEvent) -> Swift::Void)? = nil) + public func dispatchClick(event: MapConductorCore::PolygonEvent) + open func add(data: [MapConductorCore::PolygonState]) async + open func update(state: MapConductorCore::PolygonState) async open func clear() async - open func find(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.PolygonEntity? - open func onCameraChanged(mapCameraPosition: MapConductorCore.MapCameraPosition) async + open func find(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::PolygonEntity? + open func onCameraChanged(mapCameraPosition: MapConductorCore::MapCameraPosition) async open func destroy() - public var kind: MapConductorCore.OverlayKind { + public var kind: MapConductorCore::OverlayKind { get } - public func hasId(_ id: Swift.String) -> Swift.Bool - public func resolveTap(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.OverlayHit? + public func hasId(_ id: Swift::String) -> Swift::Bool + public func resolveTap(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::OverlayHit? @objc deinit } public protocol PolygonEntityProtocol { associatedtype ActualPolygon var polygon: Self.ActualPolygon? { get set } - var state: MapConductorCore.PolygonState { get } - var fingerPrint: MapConductorCore.PolygonFingerPrint { get } + var state: MapConductorCore::PolygonState { get } + var fingerPrint: MapConductorCore::PolygonFingerPrint { get } } -final public class PolygonEntity : MapConductorCore.PolygonEntityProtocol { +final public class PolygonEntity : MapConductorCore::PolygonEntityProtocol { final public var polygon: ActualPolygon? - final public let state: MapConductorCore.PolygonState - final public let fingerPrint: MapConductorCore.PolygonFingerPrint - public init(polygon: ActualPolygon?, state: MapConductorCore.PolygonState) + final public let state: MapConductorCore::PolygonState + final public let fingerPrint: MapConductorCore::PolygonFingerPrint + public init(polygon: ActualPolygon?, state: MapConductorCore::PolygonState) @objc deinit } -public func partitionPolygonByHoles(outer: [any MapConductorCore.GeoPointProtocol], holes: [[any MapConductorCore.GeoPointProtocol]]) -> [(outer: [any MapConductorCore.GeoPointProtocol], holes: [[any MapConductorCore.GeoPointProtocol]])] -public func splitPolygonWithHolesIntoSimpleRings(outer: [any MapConductorCore.GeoPointProtocol], holes: [[any MapConductorCore.GeoPointProtocol]]) -> [[any MapConductorCore.GeoPointProtocol]] +public func partitionPolygonByHoles(outer: [any MapConductorCore::GeoPointProtocol], holes: [[any MapConductorCore::GeoPointProtocol]]) -> [(outer: [any MapConductorCore::GeoPointProtocol], holes: [[any MapConductorCore::GeoPointProtocol]])] +public func splitPolygonWithHolesIntoSimpleRings(outer: [any MapConductorCore::GeoPointProtocol], holes: [[any MapConductorCore::GeoPointProtocol]]) -> [[any MapConductorCore::GeoPointProtocol]] public protocol PolygonManagerProtocol { associatedtype ActualPolygon - func registerEntity(_ entity: MapConductorCore.PolygonEntity) - func removeEntity(_ id: Swift.String) -> MapConductorCore.PolygonEntity? - func getEntity(_ id: Swift.String) -> MapConductorCore.PolygonEntity? - func hasEntity(_ id: Swift.String) -> Swift.Bool - func allEntities() -> [MapConductorCore.PolygonEntity] + func registerEntity(_ entity: MapConductorCore::PolygonEntity) + func removeEntity(_ id: Swift::String) -> MapConductorCore::PolygonEntity? + func getEntity(_ id: Swift::String) -> MapConductorCore::PolygonEntity? + func hasEntity(_ id: Swift::String) -> Swift::Bool + func allEntities() -> [MapConductorCore::PolygonEntity] func clear() - func find(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.PolygonEntity? + func find(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::PolygonEntity? } -final public class PolygonManager : MapConductorCore.PolygonManagerProtocol { +final public class PolygonManager : MapConductorCore::PolygonManagerProtocol { public init() - final public func registerEntity(_ entity: MapConductorCore.PolygonEntity) - final public func removeEntity(_ id: Swift.String) -> MapConductorCore.PolygonEntity? - final public func getEntity(_ id: Swift.String) -> MapConductorCore.PolygonEntity? - final public func hasEntity(_ id: Swift.String) -> Swift.Bool - final public func allEntities() -> [MapConductorCore.PolygonEntity] + final public func registerEntity(_ entity: MapConductorCore::PolygonEntity) + final public func removeEntity(_ id: Swift::String) -> MapConductorCore::PolygonEntity? + final public func getEntity(_ id: Swift::String) -> MapConductorCore::PolygonEntity? + final public func hasEntity(_ id: Swift::String) -> Swift::Bool + final public func allEntities() -> [MapConductorCore::PolygonEntity] final public func clear() final public func destroy() - final public var isDestroyed: Swift.Bool { + final public var isDestroyed: Swift::Bool { get } - final public func find(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.PolygonEntity? + final public func find(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::PolygonEntity? @objc deinit } public protocol PolygonOverlayRendererProtocol { associatedtype ActualPolygon - func onAdd(data: [MapConductorCore.PolygonOverlayAddParams]) async -> [Self.ActualPolygon?] - func onChange(data: [MapConductorCore.PolygonOverlayChangeParams]) async -> [Self.ActualPolygon?] - func onRemove(data: [MapConductorCore.PolygonEntity]) async + func onAdd(data: [MapConductorCore::PolygonOverlayAddParams]) async -> [Self.ActualPolygon?] + func onChange(data: [MapConductorCore::PolygonOverlayChangeParams]) async -> [Self.ActualPolygon?] + func onRemove(data: [MapConductorCore::PolygonEntity]) async func onPostProcess() async } -open class AbstractPolygonOverlayRenderer : MapConductorCore.PolygonOverlayRendererProtocol { +open class AbstractPolygonOverlayRenderer : MapConductorCore::PolygonOverlayRendererProtocol { public init() open func onPostProcess() async - open func createPolygon(state: MapConductorCore.PolygonState) async -> ActualPolygon? - open func updatePolygonProperties(polygon: ActualPolygon, current: MapConductorCore.PolygonEntity, prev: MapConductorCore.PolygonEntity) async -> ActualPolygon? - open func removePolygon(entity: MapConductorCore.PolygonEntity) async - public func onAdd(data: [MapConductorCore.PolygonOverlayAddParams]) async -> [ActualPolygon?] - public func onChange(data: [MapConductorCore.PolygonOverlayChangeParams]) async -> [ActualPolygon?] - public func onRemove(data: [MapConductorCore.PolygonEntity]) async + open func createPolygon(state: MapConductorCore::PolygonState) async -> ActualPolygon? + open func updatePolygonProperties(polygon: ActualPolygon, current: MapConductorCore::PolygonEntity, prev: MapConductorCore::PolygonEntity) async -> ActualPolygon? + open func removePolygon(entity: MapConductorCore::PolygonEntity) async + public func onAdd(data: [MapConductorCore::PolygonOverlayAddParams]) async -> [ActualPolygon?] + public func onChange(data: [MapConductorCore::PolygonOverlayChangeParams]) async -> [ActualPolygon?] + public func onRemove(data: [MapConductorCore::PolygonEntity]) async @objc deinit } public struct PolygonOverlayAddParams { - public let state: MapConductorCore.PolygonState - public init(state: MapConductorCore.PolygonState) + public let state: MapConductorCore::PolygonState + public init(state: MapConductorCore::PolygonState) } public struct PolygonOverlayChangeParams { - public let current: MapConductorCore.PolygonEntity - public let prev: MapConductorCore.PolygonEntity - public init(current: MapConductorCore.PolygonEntity, prev: MapConductorCore.PolygonEntity) -} -public struct PolygonFingerPrint : Swift.Equatable, Swift.Hashable { - public let id: Swift.Int - public let strokeColor: Swift.Int - public let strokeWidth: Swift.Int - public let fillColor: Swift.Int - public let geodesic: Swift.Int - public let zIndex: Swift.Int - public let points: Swift.Int - public let holes: Swift.Int - public let extra: Swift.Int - public static func == (a: MapConductorCore.PolygonFingerPrint, b: MapConductorCore.PolygonFingerPrint) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { + public let current: MapConductorCore::PolygonEntity + public let prev: MapConductorCore::PolygonEntity + public init(current: MapConductorCore::PolygonEntity, prev: MapConductorCore::PolygonEntity) +} +public struct PolygonFingerPrint : Swift::Equatable, Swift::Hashable { + public let id: Swift::Int + public let strokeColor: Swift::Int + public let strokeWidth: Swift::Int + public let fillColor: Swift::Int + public let geodesic: Swift::Int + public let zIndex: Swift::Int + public let points: Swift::Int + public let holes: Swift::Int + public let extra: Swift::Int + public static func == (a: MapConductorCore::PolygonFingerPrint, b: MapConductorCore::PolygonFingerPrint) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { get } } public struct PolygonEvent { - public let state: MapConductorCore.PolygonState - public let clicked: any MapConductorCore.GeoPointProtocol - public init(state: MapConductorCore.PolygonState, clicked: any MapConductorCore.GeoPointProtocol) + public let state: MapConductorCore::PolygonState + public let clicked: any MapConductorCore::GeoPointProtocol + public init(state: MapConductorCore::PolygonState, clicked: any MapConductorCore::GeoPointProtocol) } -public typealias OnPolygonEventHandler = (MapConductorCore.PolygonEvent) -> Swift.Void -final public class PolygonState : Combine.ObservableObject, Swift.Identifiable, Swift.Equatable, Swift.Hashable { - final public let id: Swift.String - @Combine.Published @_projectedValueProperty($strokeColor) final public var strokeColor: UIKit.UIColor { +public typealias OnPolygonEventHandler = (MapConductorCore::PolygonEvent) -> Swift::Void +final public class PolygonState : Combine::ObservableObject, Swift::Identifiable, Swift::Equatable, Swift::Hashable { + final public let id: Swift::String + final public let mutations: MapConductorCore::StateMutationSignal + @Combine::Published @_projectedValueProperty($strokeColor) final public var strokeColor: UIKit::UIColor { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $strokeColor: Combine.Published.Publisher { + final public var $strokeColor: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($strokeWidth) final public var strokeWidth: Swift.Double { + @Combine::Published @_projectedValueProperty($strokeWidth) final public var strokeWidth: Swift::Double { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $strokeWidth: Combine.Published.Publisher { + final public var $strokeWidth: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($fillColor) final public var fillColor: UIKit.UIColor { + @Combine::Published @_projectedValueProperty($fillColor) final public var fillColor: UIKit::UIColor { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $fillColor: Combine.Published.Publisher { + final public var $fillColor: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($geodesic) final public var geodesic: Swift.Bool { + @Combine::Published @_projectedValueProperty($geodesic) final public var geodesic: Swift::Bool { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $geodesic: Combine.Published.Publisher { + final public var $geodesic: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($zIndex) final public var zIndex: Swift.Int { + @Combine::Published @_projectedValueProperty($zIndex) final public var zIndex: Swift::Int { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $zIndex: Combine.Published.Publisher { + final public var $zIndex: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published<[any MapConductorCore.GeoPointProtocol]> @_projectedValueProperty($points) final public var points: [any MapConductorCore.GeoPointProtocol] { + @Combine::Published<[any MapConductorCore::GeoPointProtocol]> @_projectedValueProperty($points) final public var points: [any MapConductorCore::GeoPointProtocol] { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $points: Combine.Published<[any MapConductorCore.GeoPointProtocol]>.Publisher { + final public var $points: Combine::Published<[any MapConductorCore::GeoPointProtocol]>.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published<[[any MapConductorCore.GeoPointProtocol]]> @_projectedValueProperty($holes) final public var holes: [[any MapConductorCore.GeoPointProtocol]] { + @Combine::Published<[[any MapConductorCore::GeoPointProtocol]]> @_projectedValueProperty($holes) final public var holes: [[any MapConductorCore::GeoPointProtocol]] { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $holes: Combine.Published<[[any MapConductorCore.GeoPointProtocol]]>.Publisher { + final public var $holes: Combine::Published<[[any MapConductorCore::GeoPointProtocol]]>.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($extra) final public var extra: Any? { + @Combine::Published @_projectedValueProperty($extra) final public var extra: Any? { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $extra: Combine.Published.Publisher { + final public var $extra: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($onClick) final public var onClick: MapConductorCore.OnPolygonEventHandler? { + @Combine::Published @_projectedValueProperty($onClick) final public var onClick: MapConductorCore::OnPolygonEventHandler? { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $onClick: Combine.Published.Publisher { + final public var $onClick: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - public init(points: [any MapConductorCore.GeoPointProtocol], holes: [[any MapConductorCore.GeoPointProtocol]] = [], id: Swift.String? = nil, strokeColor: UIKit.UIColor = .black, strokeWidth: Swift.Double = 2.0, fillColor: UIKit.UIColor = .clear, geodesic: Swift.Bool = false, zIndex: Swift.Int = 0, extra: Any? = nil, onClick: MapConductorCore.OnPolygonEventHandler? = nil) - final public func copy(points: [any MapConductorCore.GeoPointProtocol]? = nil, holes: [[any MapConductorCore.GeoPointProtocol]]? = nil, id: Swift.String? = nil, strokeColor: UIKit.UIColor? = nil, strokeWidth: Swift.Double? = nil, fillColor: UIKit.UIColor? = nil, geodesic: Swift.Bool? = nil, zIndex: Swift.Int? = nil, extra: Any? = nil, onClick: MapConductorCore.OnPolygonEventHandler? = nil) -> MapConductorCore.PolygonState - final public func fingerPrint() -> MapConductorCore.PolygonFingerPrint - final public func asFlow() -> Combine.AnyPublisher - public static func == (lhs: MapConductorCore.PolygonState, rhs: MapConductorCore.PolygonState) -> Swift.Bool - final public func hash(into hasher: inout Swift.Hasher) - final public func hashCode() -> Swift.Int - public typealias ID = Swift.String - public typealias ObjectWillChangePublisher = Combine.ObservableObjectPublisher + public init(points: [any MapConductorCore::GeoPointProtocol], holes: [[any MapConductorCore::GeoPointProtocol]] = [], id: Swift::String? = nil, strokeColor: UIKit::UIColor = .black, strokeWidth: Swift::Double = 2.0, fillColor: UIKit::UIColor = .clear, geodesic: Swift::Bool = false, zIndex: Swift::Int = 0, extra: Any? = nil, onClick: MapConductorCore::OnPolygonEventHandler? = nil) + final public func copy(points: [any MapConductorCore::GeoPointProtocol]? = nil, holes: [[any MapConductorCore::GeoPointProtocol]]? = nil, id: Swift::String? = nil, strokeColor: UIKit::UIColor? = nil, strokeWidth: Swift::Double? = nil, fillColor: UIKit::UIColor? = nil, geodesic: Swift::Bool? = nil, zIndex: Swift::Int? = nil, extra: Any? = nil, onClick: MapConductorCore::OnPolygonEventHandler? = nil) -> MapConductorCore::PolygonState + final public func fingerPrint() -> MapConductorCore::PolygonFingerPrint + final public func asFlow() -> Combine::AnyPublisher + public static func == (lhs: MapConductorCore::PolygonState, rhs: MapConductorCore::PolygonState) -> Swift::Bool + final public func hash(into hasher: inout Swift::Hasher) + final public func hashCode() -> Swift::Int + public typealias ID = Swift::String + public typealias ObjectWillChangePublisher = Combine::ObservableObjectPublisher @objc deinit - final public var hashValue: Swift.Int { + final public var hashValue: Swift::Int { get } } public protocol PolygonSyncHandler : AnyObject { - func bindPolygonSync(_ polygonSync: @escaping @_Concurrency.MainActor ([MapConductorCore.PolygonState]) async -> Swift.Void) + func bindPolygonSync(_ polygonSync: @escaping @_Concurrency::MainActor ([MapConductorCore::PolygonState]) async -> Swift::Void) } -extension MapConductorCore.PolygonState { - final public func unionHoles() -> MapConductorCore.PolygonState - final public func unionHolesInBackground() async -> MapConductorCore.PolygonState +extension MapConductorCore::PolygonState { + final public func unionHoles() -> MapConductorCore::PolygonState + final public func unionHolesInBackground() async -> MapConductorCore::PolygonState @discardableResult - final public func unionHolesInPlace() -> MapConductorCore.PolygonState -} -public func polygonSignedArea(_ ring: [any MapConductorCore.GeoPointProtocol]) -> Swift.Double -public func ensureCounterClockwise(_ ring: [any MapConductorCore.GeoPointProtocol]) -> [any MapConductorCore.GeoPointProtocol] -public func ensureClockwiseRing(_ ring: [any MapConductorCore.GeoPointProtocol]) -> [any MapConductorCore.GeoPointProtocol] -open class PolylineController : MapConductorCore.OverlayControllerProtocol, MapConductorCore.SlottedOverlayController where ActualPolyline == Renderer.ActualPolyline, Renderer : MapConductorCore.PolylineOverlayRendererProtocol { - public typealias StateType = MapConductorCore.PolylineState - public typealias EntityType = MapConductorCore.PolylineEntity - public typealias EventType = MapConductorCore.PolylineEvent - final public let polylineManager: MapConductorCore.PolylineManager + final public func unionHolesInPlace() -> MapConductorCore::PolygonState +} +public func polygonSignedArea(_ ring: [any MapConductorCore::GeoPointProtocol]) -> Swift::Double +public func ensureCounterClockwise(_ ring: [any MapConductorCore::GeoPointProtocol]) -> [any MapConductorCore::GeoPointProtocol] +public func ensureClockwiseRing(_ ring: [any MapConductorCore::GeoPointProtocol]) -> [any MapConductorCore::GeoPointProtocol] +open class PolylineController : MapConductorCore::OverlayControllerProtocol, MapConductorCore::SlottedOverlayController where ActualPolyline == Renderer.ActualPolyline, Renderer : MapConductorCore::PolylineOverlayRendererProtocol { + public typealias StateType = MapConductorCore::PolylineState + public typealias EntityType = MapConductorCore::PolylineEntity + public typealias EventType = MapConductorCore::PolylineEvent + final public let polylineManager: MapConductorCore::PolylineManager open var renderer: Renderer - final public let zIndex: Swift.Int - public var clickListener: ((MapConductorCore.PolylineEvent) -> Swift.Void)? - public init(polylineManager: MapConductorCore.PolylineManager, renderer: Renderer, clickListener: ((MapConductorCore.PolylineEvent) -> Swift.Void)? = nil) - public func dispatchClick(event: MapConductorCore.PolylineEvent) - open func add(data: [MapConductorCore.PolylineState]) async - open func update(state: MapConductorCore.PolylineState) async + final public let zIndex: Swift::Int + public var clickListener: ((MapConductorCore::PolylineEvent) -> Swift::Void)? + public init(polylineManager: MapConductorCore::PolylineManager, renderer: Renderer, clickListener: ((MapConductorCore::PolylineEvent) -> Swift::Void)? = nil) + public func dispatchClick(event: MapConductorCore::PolylineEvent) + open func add(data: [MapConductorCore::PolylineState]) async + open func update(state: MapConductorCore::PolylineState) async open func clear() async - open func find(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.PolylineEntity? - public func findWithClosestPoint(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.PolylineHitResult? - public func setCurrentCameraPosition(_ cameraPosition: MapConductorCore.MapCameraPosition?) - open func onCameraChanged(mapCameraPosition: MapConductorCore.MapCameraPosition) async + open func find(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::PolylineEntity? + public func findWithClosestPoint(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::PolylineHitResult? + public func setCurrentCameraPosition(_ cameraPosition: MapConductorCore::MapCameraPosition?) + open func onCameraChanged(mapCameraPosition: MapConductorCore::MapCameraPosition) async open func destroy() - public var kind: MapConductorCore.OverlayKind { + public var kind: MapConductorCore::OverlayKind { get } - public func hasId(_ id: Swift.String) -> Swift.Bool - public func resolveTap(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.OverlayHit? + public func hasId(_ id: Swift::String) -> Swift::Bool + public func resolveTap(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::OverlayHit? @objc deinit } public protocol PolylineEntityProtocol { associatedtype ActualPolyline var polyline: Self.ActualPolyline? { get set } - var state: MapConductorCore.PolylineState { get } - var fingerPrint: MapConductorCore.PolylineFingerPrint { get } + var state: MapConductorCore::PolylineState { get } + var fingerPrint: MapConductorCore::PolylineFingerPrint { get } } -final public class PolylineEntity : MapConductorCore.PolylineEntityProtocol { +final public class PolylineEntity : MapConductorCore::PolylineEntityProtocol { final public var polyline: ActualPolyline? - final public let state: MapConductorCore.PolylineState - final public let fingerPrint: MapConductorCore.PolylineFingerPrint - public init(polyline: ActualPolyline?, state: MapConductorCore.PolylineState) + final public let state: MapConductorCore::PolylineState + final public let fingerPrint: MapConductorCore::PolylineFingerPrint + public init(polyline: ActualPolyline?, state: MapConductorCore::PolylineState) @objc deinit } public struct PolylineHitResult { - public let entity: MapConductorCore.PolylineEntity - public let closestPoint: any MapConductorCore.GeoPointProtocol + public let entity: MapConductorCore::PolylineEntity + public let closestPoint: any MapConductorCore::GeoPointProtocol } public protocol PolylineManagerProtocol { associatedtype ActualPolyline - func registerEntity(_ entity: MapConductorCore.PolylineEntity) - func removeEntity(_ id: Swift.String) -> MapConductorCore.PolylineEntity? - func getEntity(_ id: Swift.String) -> MapConductorCore.PolylineEntity? - func hasEntity(_ id: Swift.String) -> Swift.Bool - func allEntities() -> [MapConductorCore.PolylineEntity] + func registerEntity(_ entity: MapConductorCore::PolylineEntity) + func removeEntity(_ id: Swift::String) -> MapConductorCore::PolylineEntity? + func getEntity(_ id: Swift::String) -> MapConductorCore::PolylineEntity? + func hasEntity(_ id: Swift::String) -> Swift::Bool + func allEntities() -> [MapConductorCore::PolylineEntity] func clear() - func find(position: any MapConductorCore.GeoPointProtocol, cameraPosition: MapConductorCore.MapCameraPosition?) -> MapConductorCore.PolylineHitResult? + func find(position: any MapConductorCore::GeoPointProtocol, cameraPosition: MapConductorCore::MapCameraPosition?) -> MapConductorCore::PolylineHitResult? } -final public class PolylineManager : MapConductorCore.PolylineManagerProtocol { +final public class PolylineManager : MapConductorCore::PolylineManagerProtocol { public init() - final public func registerEntity(_ entity: MapConductorCore.PolylineEntity) - final public func removeEntity(_ id: Swift.String) -> MapConductorCore.PolylineEntity? - final public func getEntity(_ id: Swift.String) -> MapConductorCore.PolylineEntity? - final public func hasEntity(_ id: Swift.String) -> Swift.Bool - final public func allEntities() -> [MapConductorCore.PolylineEntity] + final public func registerEntity(_ entity: MapConductorCore::PolylineEntity) + final public func removeEntity(_ id: Swift::String) -> MapConductorCore::PolylineEntity? + final public func getEntity(_ id: Swift::String) -> MapConductorCore::PolylineEntity? + final public func hasEntity(_ id: Swift::String) -> Swift::Bool + final public func allEntities() -> [MapConductorCore::PolylineEntity] final public func clear() final public func destroy() - final public var isDestroyed: Swift.Bool { + final public var isDestroyed: Swift::Bool { get } - final public func find(position: any MapConductorCore.GeoPointProtocol, cameraPosition: MapConductorCore.MapCameraPosition?) -> MapConductorCore.PolylineHitResult? + final public func find(position: any MapConductorCore::GeoPointProtocol, cameraPosition: MapConductorCore::MapCameraPosition?) -> MapConductorCore::PolylineHitResult? @objc deinit } public protocol PolylineOverlayRendererProtocol { associatedtype ActualPolyline - func onAdd(data: [MapConductorCore.PolylineOverlayAddParams]) async -> [Self.ActualPolyline?] - func onChange(data: [MapConductorCore.PolylineOverlayChangeParams]) async -> [Self.ActualPolyline?] - func onRemove(data: [MapConductorCore.PolylineEntity]) async + func onAdd(data: [MapConductorCore::PolylineOverlayAddParams]) async -> [Self.ActualPolyline?] + func onChange(data: [MapConductorCore::PolylineOverlayChangeParams]) async -> [Self.ActualPolyline?] + func onRemove(data: [MapConductorCore::PolylineEntity]) async func onPostProcess() async } -open class AbstractPolylineOverlayRenderer : MapConductorCore.PolylineOverlayRendererProtocol { +open class AbstractPolylineOverlayRenderer : MapConductorCore::PolylineOverlayRendererProtocol { public init() open func onPostProcess() async - open func createPolyline(state: MapConductorCore.PolylineState) async -> ActualPolyline? - open func updatePolylineProperties(polyline: ActualPolyline, current: MapConductorCore.PolylineEntity, prev: MapConductorCore.PolylineEntity) async -> ActualPolyline? - open func removePolyline(entity: MapConductorCore.PolylineEntity) async - public func onAdd(data: [MapConductorCore.PolylineOverlayAddParams]) async -> [ActualPolyline?] - public func onChange(data: [MapConductorCore.PolylineOverlayChangeParams]) async -> [ActualPolyline?] - public func onRemove(data: [MapConductorCore.PolylineEntity]) async + open func createPolyline(state: MapConductorCore::PolylineState) async -> ActualPolyline? + open func updatePolylineProperties(polyline: ActualPolyline, current: MapConductorCore::PolylineEntity, prev: MapConductorCore::PolylineEntity) async -> ActualPolyline? + open func removePolyline(entity: MapConductorCore::PolylineEntity) async + public func onAdd(data: [MapConductorCore::PolylineOverlayAddParams]) async -> [ActualPolyline?] + public func onChange(data: [MapConductorCore::PolylineOverlayChangeParams]) async -> [ActualPolyline?] + public func onRemove(data: [MapConductorCore::PolylineEntity]) async @objc deinit } public struct PolylineOverlayAddParams { - public let state: MapConductorCore.PolylineState - public init(state: MapConductorCore.PolylineState) + public let state: MapConductorCore::PolylineState + public init(state: MapConductorCore::PolylineState) } public struct PolylineOverlayChangeParams { - public let current: MapConductorCore.PolylineEntity - public let prev: MapConductorCore.PolylineEntity - public init(current: MapConductorCore.PolylineEntity, prev: MapConductorCore.PolylineEntity) + public let current: MapConductorCore::PolylineEntity + public let prev: MapConductorCore::PolylineEntity + public init(current: MapConductorCore::PolylineEntity, prev: MapConductorCore::PolylineEntity) } -public struct PolylineFingerPrint : Swift.Equatable, Swift.Hashable { - public let id: Swift.Int - public let strokeColor: Swift.Int - public let strokeWidth: Swift.Int - public let geodesic: Swift.Int - public let points: Swift.Int - public let zIndex: Swift.Int - public let extra: Swift.Int - public static func == (a: MapConductorCore.PolylineFingerPrint, b: MapConductorCore.PolylineFingerPrint) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { +public struct PolylineFingerPrint : Swift::Equatable, Swift::Hashable { + public let id: Swift::Int + public let strokeColor: Swift::Int + public let strokeWidth: Swift::Int + public let geodesic: Swift::Int + public let points: Swift::Int + public let zIndex: Swift::Int + public let extra: Swift::Int + public static func == (a: MapConductorCore::PolylineFingerPrint, b: MapConductorCore::PolylineFingerPrint) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { get } } public struct PolylineEvent { - public let state: MapConductorCore.PolylineState - public let clicked: any MapConductorCore.GeoPointProtocol - public init(state: MapConductorCore.PolylineState, clicked: any MapConductorCore.GeoPointProtocol) + public let state: MapConductorCore::PolylineState + public let clicked: any MapConductorCore::GeoPointProtocol + public init(state: MapConductorCore::PolylineState, clicked: any MapConductorCore::GeoPointProtocol) } -public typealias OnPolylineEventHandler = (MapConductorCore.PolylineEvent) -> Swift.Void -final public class PolylineState : Combine.ObservableObject, Swift.Identifiable, Swift.Equatable, Swift.Hashable { - final public let id: Swift.String - @Combine.Published @_projectedValueProperty($strokeColor) final public var strokeColor: UIKit.UIColor { +public typealias OnPolylineEventHandler = (MapConductorCore::PolylineEvent) -> Swift::Void +final public class PolylineState : Combine::ObservableObject, Swift::Identifiable, Swift::Equatable, Swift::Hashable { + final public let id: Swift::String + final public let mutations: MapConductorCore::StateMutationSignal + @Combine::Published @_projectedValueProperty($strokeColor) final public var strokeColor: UIKit::UIColor { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $strokeColor: Combine.Published.Publisher { + final public var $strokeColor: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($strokeWidth) final public var strokeWidth: Swift.Double { + @Combine::Published @_projectedValueProperty($strokeWidth) final public var strokeWidth: Swift::Double { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $strokeWidth: Combine.Published.Publisher { + final public var $strokeWidth: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($geodesic) final public var geodesic: Swift.Bool { + @Combine::Published @_projectedValueProperty($geodesic) final public var geodesic: Swift::Bool { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $geodesic: Combine.Published.Publisher { + final public var $geodesic: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published<[any MapConductorCore.GeoPointProtocol]> @_projectedValueProperty($points) final public var points: [any MapConductorCore.GeoPointProtocol] { + @Combine::Published<[any MapConductorCore::GeoPointProtocol]> @_projectedValueProperty($points) final public var points: [any MapConductorCore::GeoPointProtocol] { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $points: Combine.Published<[any MapConductorCore.GeoPointProtocol]>.Publisher { + final public var $points: Combine::Published<[any MapConductorCore::GeoPointProtocol]>.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($zIndex) final public var zIndex: Swift.Int { + @Combine::Published @_projectedValueProperty($zIndex) final public var zIndex: Swift::Int { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $zIndex: Combine.Published.Publisher { + final public var $zIndex: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($extra) final public var extra: Any? { + @Combine::Published @_projectedValueProperty($extra) final public var extra: Any? { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $extra: Combine.Published.Publisher { + final public var $extra: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($onClick) final public var onClick: MapConductorCore.OnPolylineEventHandler? { + @Combine::Published @_projectedValueProperty($onClick) final public var onClick: MapConductorCore::OnPolylineEventHandler? { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $onClick: Combine.Published.Publisher { + final public var $onClick: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - public init(points: [any MapConductorCore.GeoPointProtocol], id: Swift.String? = nil, strokeColor: UIKit.UIColor = .black, strokeWidth: Swift.Double = 1.0, geodesic: Swift.Bool = false, zIndex: Swift.Int = 0, extra: Any? = nil, onClick: MapConductorCore.OnPolylineEventHandler? = nil) - final public func copy(points: [any MapConductorCore.GeoPointProtocol]? = nil, id: Swift.String? = nil, strokeColor: UIKit.UIColor? = nil, strokeWidth: Swift.Double? = nil, geodesic: Swift.Bool? = nil, zIndex: Swift.Int? = nil, extra: Any? = nil, onClick: MapConductorCore.OnPolylineEventHandler? = nil) -> MapConductorCore.PolylineState - final public func fingerPrint() -> MapConductorCore.PolylineFingerPrint - final public func asFlow() -> Combine.AnyPublisher - public static func == (lhs: MapConductorCore.PolylineState, rhs: MapConductorCore.PolylineState) -> Swift.Bool - final public func hash(into hasher: inout Swift.Hasher) - final public func hashCode() -> Swift.Int - public typealias ID = Swift.String - public typealias ObjectWillChangePublisher = Combine.ObservableObjectPublisher + public init(points: [any MapConductorCore::GeoPointProtocol], id: Swift::String? = nil, strokeColor: UIKit::UIColor = .black, strokeWidth: Swift::Double = 1.0, geodesic: Swift::Bool = false, zIndex: Swift::Int = 0, extra: Any? = nil, onClick: MapConductorCore::OnPolylineEventHandler? = nil) + final public func copy(points: [any MapConductorCore::GeoPointProtocol]? = nil, id: Swift::String? = nil, strokeColor: UIKit::UIColor? = nil, strokeWidth: Swift::Double? = nil, geodesic: Swift::Bool? = nil, zIndex: Swift::Int? = nil, extra: Any? = nil, onClick: MapConductorCore::OnPolylineEventHandler? = nil) -> MapConductorCore::PolylineState + final public func fingerPrint() -> MapConductorCore::PolylineFingerPrint + final public func asFlow() -> Combine::AnyPublisher + public static func == (lhs: MapConductorCore::PolylineState, rhs: MapConductorCore::PolylineState) -> Swift::Bool + final public func hash(into hasher: inout Swift::Hasher) + final public func hashCode() -> Swift::Int + public typealias ID = Swift::String + public typealias ObjectWillChangePublisher = Combine::ObservableObjectPublisher @objc deinit - final public var hashValue: Swift.Int { + final public var hashValue: Swift::Int { get } } -public struct RasterHeaderRule : Swift.Equatable { - public let host: Swift.String - public let port: Swift.Int? - public let userAgent: Swift.String? - public let extraHeaders: [Swift.String : Swift.String] - public init(host: Swift.String, port: Swift.Int?, userAgent: Swift.String?, extraHeaders: [Swift.String : Swift.String]) - public static func == (a: MapConductorCore.RasterHeaderRule, b: MapConductorCore.RasterHeaderRule) -> Swift.Bool +public struct RasterHeaderRule : Swift::Equatable { + public let host: Swift::String + public let port: Swift::Int? + public let userAgent: Swift::String? + public let extraHeaders: [Swift::String : Swift::String] + public init(host: Swift::String, port: Swift::Int?, userAgent: Swift::String?, extraHeaders: [Swift::String : Swift::String]) + public static func == (a: MapConductorCore::RasterHeaderRule, b: MapConductorCore::RasterHeaderRule) -> Swift::Bool } -final public class RasterHeaderRuleSet : @unchecked Swift.Sendable { - public static let shared: MapConductorCore.RasterHeaderRuleSet +final public class RasterHeaderRuleSet : @unchecked Swift::Sendable { + public static let shared: MapConductorCore::RasterHeaderRuleSet public init() - final public var isEmpty: Swift.Bool { + final public var isEmpty: Swift::Bool { get } - final public func setRules(_ rules: [MapConductorCore.RasterHeaderRule], owner: Swift.AnyObject) - final public func removeRules(owner: Swift.AnyObject) - final public func headers(for url: Foundation.URL) -> (userAgent: Swift.String?, extraHeaders: [Swift.String : Swift.String])? - public static func makeRules(from states: [MapConductorCore.RasterLayerState]) -> [MapConductorCore.RasterHeaderRule] - public static func warnUnsupported(provider: Swift.String, state: MapConductorCore.RasterLayerState, supportsUserAgent: Swift.Bool = false) + final public func setRules(_ rules: [MapConductorCore::RasterHeaderRule], owner: Swift::AnyObject) + final public func removeRules(owner: Swift::AnyObject) + final public func headers(for url: Foundation::URL) -> (userAgent: Swift::String?, extraHeaders: [Swift::String : Swift::String])? + public static func makeRules(from states: [MapConductorCore::RasterLayerState]) -> [MapConductorCore::RasterHeaderRule] + public static func warnUnsupported(provider: Swift::String, state: MapConductorCore::RasterLayerState, supportsUserAgent: Swift::Bool = false) @objc deinit } -open class RasterLayerController : MapConductorCore.OverlayControllerProtocol, MapConductorCore.SlottedOverlayController where ActualLayer == Renderer.ActualLayer, Renderer : MapConductorCore.RasterLayerOverlayRendererProtocol { - public typealias StateType = MapConductorCore.RasterLayerState - public typealias EntityType = MapConductorCore.RasterLayerEntity - public typealias EventType = MapConductorCore.RasterLayerEvent - final public let rasterLayerManager: MapConductorCore.RasterLayerManager +open class RasterLayerController : MapConductorCore::OverlayControllerProtocol, MapConductorCore::SlottedOverlayController where ActualLayer == Renderer.ActualLayer, Renderer : MapConductorCore::RasterLayerOverlayRendererProtocol { + public typealias StateType = MapConductorCore::RasterLayerState + public typealias EntityType = MapConductorCore::RasterLayerEntity + public typealias EventType = MapConductorCore::RasterLayerEvent + final public let rasterLayerManager: MapConductorCore::RasterLayerManager open var renderer: Renderer - final public let zIndex: Swift.Int - public var clickListener: ((MapConductorCore.RasterLayerEvent) -> Swift.Void)? - public init(rasterLayerManager: MapConductorCore.RasterLayerManager, renderer: Renderer, clickListener: ((MapConductorCore.RasterLayerEvent) -> Swift.Void)? = nil) - public func dispatchClick(event: MapConductorCore.RasterLayerEvent) - open func add(data: [MapConductorCore.RasterLayerState]) async - open func update(state: MapConductorCore.RasterLayerState) async - open func upsert(state: MapConductorCore.RasterLayerState) async - open func removeById(_ id: Swift.String) async + final public let zIndex: Swift::Int + public var clickListener: ((MapConductorCore::RasterLayerEvent) -> Swift::Void)? + public init(rasterLayerManager: MapConductorCore::RasterLayerManager, renderer: Renderer, clickListener: ((MapConductorCore::RasterLayerEvent) -> Swift::Void)? = nil) + public func dispatchClick(event: MapConductorCore::RasterLayerEvent) + open func add(data: [MapConductorCore::RasterLayerState]) async + open func update(state: MapConductorCore::RasterLayerState) async + open func upsert(state: MapConductorCore::RasterLayerState) async + open func removeById(_ id: Swift::String) async open func clear() async - open func find(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.RasterLayerEntity? - open func onCameraChanged(mapCameraPosition: MapConductorCore.MapCameraPosition) async + open func find(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::RasterLayerEntity? + open func onCameraChanged(mapCameraPosition: MapConductorCore::MapCameraPosition) async open func destroy() - public var kind: MapConductorCore.OverlayKind { + public var kind: MapConductorCore::OverlayKind { get } - public func hasId(_ id: Swift.String) -> Swift.Bool - public func resolveTap(position _: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.OverlayHit? + public func hasId(_ id: Swift::String) -> Swift::Bool + public func resolveTap(position _: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::OverlayHit? @objc deinit } public protocol RasterLayerEntityProtocol { associatedtype ActualLayer var layer: Self.ActualLayer? { get set } - var state: MapConductorCore.RasterLayerState { get } - var fingerPrint: MapConductorCore.RasterLayerFingerPrint { get } + var state: MapConductorCore::RasterLayerState { get } + var fingerPrint: MapConductorCore::RasterLayerFingerPrint { get } } -final public class RasterLayerEntity : MapConductorCore.RasterLayerEntityProtocol { +final public class RasterLayerEntity : MapConductorCore::RasterLayerEntityProtocol { final public var layer: ActualLayer? - final public let state: MapConductorCore.RasterLayerState - final public let fingerPrint: MapConductorCore.RasterLayerFingerPrint - public init(layer: ActualLayer?, state: MapConductorCore.RasterLayerState) + final public let state: MapConductorCore::RasterLayerState + final public let fingerPrint: MapConductorCore::RasterLayerFingerPrint + public init(layer: ActualLayer?, state: MapConductorCore::RasterLayerState) @objc deinit } public protocol RasterLayerManagerProtocol { associatedtype ActualLayer - func registerEntity(_ entity: MapConductorCore.RasterLayerEntity) - func removeEntity(_ id: Swift.String) -> MapConductorCore.RasterLayerEntity? - func getEntity(_ id: Swift.String) -> MapConductorCore.RasterLayerEntity? - func hasEntity(_ id: Swift.String) -> Swift.Bool - func allEntities() -> [MapConductorCore.RasterLayerEntity] + func registerEntity(_ entity: MapConductorCore::RasterLayerEntity) + func removeEntity(_ id: Swift::String) -> MapConductorCore::RasterLayerEntity? + func getEntity(_ id: Swift::String) -> MapConductorCore::RasterLayerEntity? + func hasEntity(_ id: Swift::String) -> Swift::Bool + func allEntities() -> [MapConductorCore::RasterLayerEntity] func clear() - func find(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.RasterLayerEntity? + func find(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::RasterLayerEntity? } -final public class RasterLayerManager : MapConductorCore.RasterLayerManagerProtocol { +final public class RasterLayerManager : MapConductorCore::RasterLayerManagerProtocol { public init() - final public func registerEntity(_ entity: MapConductorCore.RasterLayerEntity) - final public func removeEntity(_ id: Swift.String) -> MapConductorCore.RasterLayerEntity? - final public func getEntity(_ id: Swift.String) -> MapConductorCore.RasterLayerEntity? - final public func hasEntity(_ id: Swift.String) -> Swift.Bool - final public func allEntities() -> [MapConductorCore.RasterLayerEntity] + final public func registerEntity(_ entity: MapConductorCore::RasterLayerEntity) + final public func removeEntity(_ id: Swift::String) -> MapConductorCore::RasterLayerEntity? + final public func getEntity(_ id: Swift::String) -> MapConductorCore::RasterLayerEntity? + final public func hasEntity(_ id: Swift::String) -> Swift::Bool + final public func allEntities() -> [MapConductorCore::RasterLayerEntity] final public func clear() final public func destroy() - final public var isDestroyed: Swift.Bool { + final public var isDestroyed: Swift::Bool { get } - final public func find(position: any MapConductorCore.GeoPointProtocol) -> MapConductorCore.RasterLayerEntity? + final public func find(position: any MapConductorCore::GeoPointProtocol) -> MapConductorCore::RasterLayerEntity? @objc deinit } public protocol RasterLayerOverlayRendererProtocol { associatedtype ActualLayer - func onAdd(data: [MapConductorCore.RasterLayerOverlayAddParams]) async -> [Self.ActualLayer?] - func onChange(data: [MapConductorCore.RasterLayerOverlayChangeParams]) async -> [Self.ActualLayer?] - func onRemove(data: [MapConductorCore.RasterLayerEntity]) async - func onCameraChanged(mapCameraPosition: MapConductorCore.MapCameraPosition) async + func onAdd(data: [MapConductorCore::RasterLayerOverlayAddParams]) async -> [Self.ActualLayer?] + func onChange(data: [MapConductorCore::RasterLayerOverlayChangeParams]) async -> [Self.ActualLayer?] + func onRemove(data: [MapConductorCore::RasterLayerEntity]) async + func onCameraChanged(mapCameraPosition: MapConductorCore::MapCameraPosition) async func onPostProcess() async } -extension MapConductorCore.RasterLayerOverlayRendererProtocol { - public func onCameraChanged(mapCameraPosition: MapConductorCore.MapCameraPosition) async +extension MapConductorCore::RasterLayerOverlayRendererProtocol { + public func onCameraChanged(mapCameraPosition: MapConductorCore::MapCameraPosition) async } -open class AbstractRasterLayerOverlayRenderer : MapConductorCore.RasterLayerOverlayRendererProtocol { +open class AbstractRasterLayerOverlayRenderer : MapConductorCore::RasterLayerOverlayRendererProtocol { public init() open func onPostProcess() async - open func createLayer(state: MapConductorCore.RasterLayerState) async -> ActualLayer? - open func updateLayerProperties(layer: ActualLayer, current: MapConductorCore.RasterLayerEntity, prev: MapConductorCore.RasterLayerEntity) async -> ActualLayer? - open func removeLayer(entity: MapConductorCore.RasterLayerEntity) async - public func onAdd(data: [MapConductorCore.RasterLayerOverlayAddParams]) async -> [ActualLayer?] - public func onChange(data: [MapConductorCore.RasterLayerOverlayChangeParams]) async -> [ActualLayer?] - public func onRemove(data: [MapConductorCore.RasterLayerEntity]) async + open func createLayer(state: MapConductorCore::RasterLayerState) async -> ActualLayer? + open func updateLayerProperties(layer: ActualLayer, current: MapConductorCore::RasterLayerEntity, prev: MapConductorCore::RasterLayerEntity) async -> ActualLayer? + open func removeLayer(entity: MapConductorCore::RasterLayerEntity) async + public func onAdd(data: [MapConductorCore::RasterLayerOverlayAddParams]) async -> [ActualLayer?] + public func onChange(data: [MapConductorCore::RasterLayerOverlayChangeParams]) async -> [ActualLayer?] + public func onRemove(data: [MapConductorCore::RasterLayerEntity]) async @objc deinit } public struct RasterLayerOverlayAddParams { - public let state: MapConductorCore.RasterLayerState - public init(state: MapConductorCore.RasterLayerState) + public let state: MapConductorCore::RasterLayerState + public init(state: MapConductorCore::RasterLayerState) } public struct RasterLayerOverlayChangeParams { - public let current: MapConductorCore.RasterLayerEntity - public let prev: MapConductorCore.RasterLayerEntity - public init(current: MapConductorCore.RasterLayerEntity, prev: MapConductorCore.RasterLayerEntity) + public let current: MapConductorCore::RasterLayerEntity + public let prev: MapConductorCore::RasterLayerEntity + public init(current: MapConductorCore::RasterLayerEntity, prev: MapConductorCore::RasterLayerEntity) } -public enum TileScheme : Swift.String, Swift.Hashable { +public enum TileScheme : Swift::String, Swift::Hashable { case XYZ case TMS - public init?(rawValue: Swift.String) - public typealias RawValue = Swift.String - public var rawValue: Swift.String { + public init?(rawValue: Swift::String) + public typealias RawValue = Swift::String + public var rawValue: Swift::String { get } } -public enum RasterLayerSource : Swift.Hashable { - case urlTemplate(template: Swift.String, tileSize: Swift.Int = RasterLayerSource.defaultTileSize, minZoom: Swift.Int? = nil, maxZoom: Swift.Int? = nil, attributionRules: [MapConductorCore.AttributionRule] = [], scheme: MapConductorCore.TileScheme = .XYZ) - case tileJson(url: Swift.String) - case arcGisService(serviceUrl: Swift.String) - public static let defaultTileSize: Swift.Int - public static func == (a: MapConductorCore.RasterLayerSource, b: MapConductorCore.RasterLayerSource) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { +public enum RasterLayerSource : Swift::Hashable { + case urlTemplate(template: Swift::String, tileSize: Swift::Int = RasterLayerSource.defaultTileSize, minZoom: Swift::Int? = nil, maxZoom: Swift::Int? = nil, attributionRules: [MapConductorCore::AttributionRule] = [], scheme: MapConductorCore::TileScheme = .XYZ) + case tileJson(url: Swift::String) + case arcGisService(serviceUrl: Swift::String) + public static let defaultTileSize: Swift::Int + public static func == (a: MapConductorCore::RasterLayerSource, b: MapConductorCore::RasterLayerSource) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { get } } -public struct RasterLayerFingerPrint : Swift.Equatable, Swift.Hashable { - public let id: Swift.Int - public let source: Swift.Int - public let opacity: Swift.Int - public let visible: Swift.Int - public let zIndex: Swift.Int - public let debug: Swift.Int - public let userAgent: Swift.Int - public let extraHeaders: Swift.Int - public static func == (a: MapConductorCore.RasterLayerFingerPrint, b: MapConductorCore.RasterLayerFingerPrint) -> Swift.Bool - public func hash(into hasher: inout Swift.Hasher) - public var hashValue: Swift.Int { +public struct RasterLayerFingerPrint : Swift::Equatable, Swift::Hashable { + public let id: Swift::Int + public let source: Swift::Int + public let opacity: Swift::Int + public let visible: Swift::Int + public let zIndex: Swift::Int + public let debug: Swift::Int + public let userAgent: Swift::Int + public let extraHeaders: Swift::Int + public static func == (a: MapConductorCore::RasterLayerFingerPrint, b: MapConductorCore::RasterLayerFingerPrint) -> Swift::Bool + public func hash(into hasher: inout Swift::Hasher) + public var hashValue: Swift::Int { get } } public struct RasterLayerEvent { - public let state: MapConductorCore.RasterLayerState - public init(state: MapConductorCore.RasterLayerState) + public let state: MapConductorCore::RasterLayerState + public init(state: MapConductorCore::RasterLayerState) } -public typealias OnRasterLayerEventHandler = (MapConductorCore.RasterLayerEvent) -> Swift.Void -final public class RasterLayerState : Combine.ObservableObject, Swift.Identifiable, Swift.Equatable, Swift.Hashable { - public static let defaultUserAgent: Swift.String - final public let id: Swift.String - @Combine.Published @_projectedValueProperty($source) final public var source: MapConductorCore.RasterLayerSource { +public typealias OnRasterLayerEventHandler = (MapConductorCore::RasterLayerEvent) -> Swift::Void +final public class RasterLayerState : Combine::ObservableObject, Swift::Identifiable, Swift::Equatable, Swift::Hashable { + public static let defaultUserAgent: Swift::String + final public let id: Swift::String + final public let mutations: MapConductorCore::StateMutationSignal + @Combine::Published @_projectedValueProperty($source) final public var source: MapConductorCore::RasterLayerSource { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $source: Combine.Published.Publisher { + final public var $source: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($opacity) final public var opacity: Swift.Double { + @Combine::Published @_projectedValueProperty($opacity) final public var opacity: Swift::Double { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $opacity: Combine.Published.Publisher { + final public var $opacity: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($visible) final public var visible: Swift.Bool { + @Combine::Published @_projectedValueProperty($visible) final public var visible: Swift::Bool { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $visible: Combine.Published.Publisher { + final public var $visible: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($zIndex) final public var zIndex: Swift.Int { + @Combine::Published @_projectedValueProperty($zIndex) final public var zIndex: Swift::Int { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $zIndex: Combine.Published.Publisher { + final public var $zIndex: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($debug) final public var debug: Swift.Bool { + @Combine::Published @_projectedValueProperty($debug) final public var debug: Swift::Bool { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $debug: Combine.Published.Publisher { + final public var $debug: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published @_projectedValueProperty($userAgent) final public var userAgent: Swift.String? { + @Combine::Published @_projectedValueProperty($userAgent) final public var userAgent: Swift::String? { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $userAgent: Combine.Published.Publisher { + final public var $userAgent: Combine::Published.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - @Combine.Published<[Swift.String : Swift.String]?> @_projectedValueProperty($extraHeaders) final public var extraHeaders: [Swift.String : Swift.String]? { + @Combine::Published<[Swift::String : Swift::String]?> @_projectedValueProperty($extraHeaders) final public var extraHeaders: [Swift::String : Swift::String]? { get - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) + @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) set - @available(iOS 13.0, tvOS 13.0, watchOS 6.0, macOS 10.15, *) - _modify } - final public var $extraHeaders: Combine.Published<[Swift.String : Swift.String]?>.Publisher { + final public var $extraHeaders: Combine::Published<[Swift::String : Swift::String]?>.Combine::Publisher { get - @available(iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 11.0, *) + @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *) set } - public init(source: MapConductorCore.RasterLayerSource, opacity: Swift.Double = 1.0, visible: Swift.Bool = true, zIndex: Swift.Int = 0, debug: Swift.Bool = false, userAgent: Swift.String = RasterLayerState.defaultUserAgent, extraHeaders: [Swift.String : Swift.String]? = nil, id: Swift.String? = nil) - final public func copy(source: MapConductorCore.RasterLayerSource? = nil, opacity: Swift.Double? = nil, visible: Swift.Bool? = nil, zIndex: Swift.Int? = nil, debug: Swift.Bool? = nil, userAgent: Swift.String? = nil, extraHeaders: [Swift.String : Swift.String]? = nil, id: Swift.String? = nil) -> MapConductorCore.RasterLayerState - final public func fingerPrint() -> MapConductorCore.RasterLayerFingerPrint - final public func asFlow() -> Combine.AnyPublisher - public static func == (lhs: MapConductorCore.RasterLayerState, rhs: MapConductorCore.RasterLayerState) -> Swift.Bool - final public func hash(into hasher: inout Swift.Hasher) - final public func hashCode() -> Swift.Int - public typealias ID = Swift.String - public typealias ObjectWillChangePublisher = Combine.ObservableObjectPublisher + public init(source: MapConductorCore::RasterLayerSource, opacity: Swift::Double = 1.0, visible: Swift::Bool = true, zIndex: Swift::Int = 0, debug: Swift::Bool = false, userAgent: Swift::String = RasterLayerState.defaultUserAgent, extraHeaders: [Swift::String : Swift::String]? = nil, id: Swift::String? = nil) + final public func copy(source: MapConductorCore::RasterLayerSource? = nil, opacity: Swift::Double? = nil, visible: Swift::Bool? = nil, zIndex: Swift::Int? = nil, debug: Swift::Bool? = nil, userAgent: Swift::String? = nil, extraHeaders: [Swift::String : Swift::String]? = nil, id: Swift::String? = nil) -> MapConductorCore::RasterLayerState + final public func fingerPrint() -> MapConductorCore::RasterLayerFingerPrint + final public func asFlow() -> Combine::AnyPublisher + public static func == (lhs: MapConductorCore::RasterLayerState, rhs: MapConductorCore::RasterLayerState) -> Swift::Bool + final public func hash(into hasher: inout Swift::Hasher) + final public func hashCode() -> Swift::Int + public typealias ID = Swift::String + public typealias ObjectWillChangePublisher = Combine::ObservableObjectPublisher @objc deinit - final public var hashValue: Swift.Int { + final public var hashValue: Swift::Int { get } } public enum MarkerIconSize { - public static let Small: CoreFoundation.CGFloat - public static let Regular: CoreFoundation.CGFloat - public static let Large: CoreFoundation.CGFloat + public static let Small: CoreFoundation::CGFloat + public static let Regular: CoreFoundation::CGFloat + public static let Large: CoreFoundation::CGFloat } public struct Settings { - public let tapTolerance: CoreFoundation.CGFloat - public let markerDropAnimateDuration: Swift.Int - public let markerBounceAnimateDuration: Swift.Int - public let iconSize: CoreFoundation.CGFloat - public let iconStroke: CoreFoundation.CGFloat - public let composeEventDebounce: Swift.Int - public init(tapTolerance: CoreFoundation.CGFloat, markerDropAnimateDuration: Swift.Int, markerBounceAnimateDuration: Swift.Int, iconSize: CoreFoundation.CGFloat, iconStroke: CoreFoundation.CGFloat, composeEventDebounce: Swift.Int) - public static let Default: MapConductorCore.Settings + public let tapTolerance: CoreFoundation::CGFloat + public let markerDropAnimateDuration: Swift::Int + public let markerBounceAnimateDuration: Swift::Int + public let iconSize: CoreFoundation::CGFloat + public let iconStroke: CoreFoundation::CGFloat + public let composeEventDebounce: Swift::Int + public init(tapTolerance: CoreFoundation::CGFloat, markerDropAnimateDuration: Swift::Int, markerBounceAnimateDuration: Swift::Int, iconSize: CoreFoundation::CGFloat, iconStroke: CoreFoundation::CGFloat, composeEventDebounce: Swift::Int) + public static let Default: MapConductorCore::Settings } -extension MapConductorCore.Settings { - public var markerDropAnimateInterval: Foundation.TimeInterval { +extension MapConductorCore::Settings { + public var markerDropAnimateInterval: Foundation::TimeInterval { get } - public var markerBounceAnimateInterval: Foundation.TimeInterval { + public var markerBounceAnimateInterval: Foundation::TimeInterval { get } } -public func calculateMetersPerPixel(latitude: Swift.Double, zoom: Swift.Double, tileSize: Swift.Double = 256.0) -> Swift.Double -public func closestPointOnSegment(startPoint: CoreFoundation.CGPoint, endPoint: CoreFoundation.CGPoint, testPoint: CoreFoundation.CGPoint) -> CoreFoundation.CGPoint -public func expandBounds(bounds: MapConductorCore.GeoRectBounds, margin: Swift.Double) -> MapConductorCore.GeoRectBounds +public func calculateMetersPerPixel(latitude: Swift::Double, zoom: Swift::Double, tileSize: Swift::Double = 256.0) -> Swift::Double +public func closestPointOnSegment(startPoint: CoreFoundation::CGPoint, endPoint: CoreFoundation::CGPoint, testPoint: CoreFoundation::CGPoint) -> CoreFoundation::CGPoint +public func expandBounds(bounds: MapConductorCore::GeoRectBounds, margin: Swift::Double) -> MapConductorCore::GeoRectBounds public enum Planar { - public static func interpolate(from: any MapConductorCore.GeoPointProtocol, to: any MapConductorCore.GeoPointProtocol, fraction: Swift.Double) -> MapConductorCore.GeoPoint - public static func createInterpolatePoints(_ points: [any MapConductorCore.GeoPointProtocol], maxSegmentLength: Swift.Double = 10_000.0) -> [any MapConductorCore.GeoPointProtocol] - public static func pointOnLineOrNull(from: any MapConductorCore.GeoPointProtocol, to: any MapConductorCore.GeoPointProtocol, position: any MapConductorCore.GeoPointProtocol, thresholdMeters: Swift.Double) -> (any MapConductorCore.GeoPointProtocol, Swift.Double)? + public static func interpolate(from: any MapConductorCore::GeoPointProtocol, to: any MapConductorCore::GeoPointProtocol, fraction: Swift::Double) -> MapConductorCore::GeoPoint + public static func createInterpolatePoints(_ points: [any MapConductorCore::GeoPointProtocol], maxSegmentLength: Swift::Double = 10_000.0) -> [any MapConductorCore::GeoPointProtocol] + public static func pointOnLineOrNull(from: any MapConductorCore::GeoPointProtocol, to: any MapConductorCore::GeoPointProtocol, position: any MapConductorCore::GeoPointProtocol, thresholdMeters: Swift::Double) -> (any MapConductorCore::GeoPointProtocol, Swift::Double)? } public enum Spherical { - public static func computeDistanceBetween(from: any MapConductorCore.GeoPointProtocol, to: any MapConductorCore.GeoPointProtocol) -> Swift.Double - public static func computeHeading(from: any MapConductorCore.GeoPointProtocol, to: any MapConductorCore.GeoPointProtocol) -> Swift.Double - public static func computeOffset(origin: any MapConductorCore.GeoPointProtocol, distance: Swift.Double, heading: Swift.Double) -> MapConductorCore.GeoPoint - public static func computeOffsetOrigin(to: any MapConductorCore.GeoPointProtocol, distance: Swift.Double, heading: Swift.Double) -> MapConductorCore.GeoPoint? - public static func computeLength(_ path: [any MapConductorCore.GeoPointProtocol]) -> Swift.Double - public static func computeArea(_ path: [any MapConductorCore.GeoPointProtocol]) -> Swift.Double - public static func computeSignedArea(_ path: [any MapConductorCore.GeoPointProtocol]) -> Swift.Double - public static func interpolate(from: any MapConductorCore.GeoPointProtocol, to: any MapConductorCore.GeoPointProtocol, fraction: Swift.Double) -> MapConductorCore.GeoPoint -} -public func splitByMeridian(_ points: [any MapConductorCore.GeoPointProtocol], geodesic: Swift.Bool) -> [[any MapConductorCore.GeoPointProtocol]] + public static func computeDistanceBetween(from: any MapConductorCore::GeoPointProtocol, to: any MapConductorCore::GeoPointProtocol) -> Swift::Double + public static func computeHeading(from: any MapConductorCore::GeoPointProtocol, to: any MapConductorCore::GeoPointProtocol) -> Swift::Double + public static func computeOffset(origin: any MapConductorCore::GeoPointProtocol, distance: Swift::Double, heading: Swift::Double) -> MapConductorCore::GeoPoint + public static func computeOffsetOrigin(to: any MapConductorCore::GeoPointProtocol, distance: Swift::Double, heading: Swift::Double) -> MapConductorCore::GeoPoint? + public static func computeLength(_ path: [any MapConductorCore::GeoPointProtocol]) -> Swift::Double + public static func computeArea(_ path: [any MapConductorCore::GeoPointProtocol]) -> Swift::Double + public static func computeSignedArea(_ path: [any MapConductorCore::GeoPointProtocol]) -> Swift::Double + public static func interpolate(from: any MapConductorCore::GeoPointProtocol, to: any MapConductorCore::GeoPointProtocol, fraction: Swift::Double) -> MapConductorCore::GeoPoint +} +public func splitByMeridian(_ points: [any MapConductorCore::GeoPointProtocol], geodesic: Swift::Bool) -> [[any MapConductorCore::GeoPointProtocol]] public enum WGS84Geodesic { - public static func computeDistanceBetween(from: any MapConductorCore.GeoPointProtocol, to: any MapConductorCore.GeoPointProtocol) -> Swift.Double - public static func computeHeading(from: any MapConductorCore.GeoPointProtocol, to: any MapConductorCore.GeoPointProtocol) -> Swift.Double - public static func computeOffset(origin: any MapConductorCore.GeoPointProtocol, distance: Swift.Double, heading: Swift.Double) -> MapConductorCore.GeoPoint - public static func computeOffsetOrigin(to: any MapConductorCore.GeoPointProtocol, distance: Swift.Double, heading: Swift.Double) -> MapConductorCore.GeoPoint? - public static func computeLength(_ path: [any MapConductorCore.GeoPointProtocol]) -> Swift.Double - public static func createInterpolatePoints(_ points: [any MapConductorCore.GeoPointProtocol], maxSegmentLength: Swift.Double = 10_000.0) -> [any MapConductorCore.GeoPointProtocol] - public static func pointOnLineOrNull(from: any MapConductorCore.GeoPointProtocol, to: any MapConductorCore.GeoPointProtocol, position: any MapConductorCore.GeoPointProtocol, thresholdMeters: Swift.Double) -> (any MapConductorCore.GeoPointProtocol, Swift.Double)? - public static func computeSignedArea(_ path: [any MapConductorCore.GeoPointProtocol]) -> Swift.Double - public static func computeArea(_ path: [any MapConductorCore.GeoPointProtocol]) -> Swift.Double - public static func interpolate(from: any MapConductorCore.GeoPointProtocol, to: any MapConductorCore.GeoPointProtocol, fraction: Swift.Double) -> MapConductorCore.GeoPoint + public static func computeDistanceBetween(from: any MapConductorCore::GeoPointProtocol, to: any MapConductorCore::GeoPointProtocol) -> Swift::Double + public static func computeHeading(from: any MapConductorCore::GeoPointProtocol, to: any MapConductorCore::GeoPointProtocol) -> Swift::Double + public static func computeOffset(origin: any MapConductorCore::GeoPointProtocol, distance: Swift::Double, heading: Swift::Double) -> MapConductorCore::GeoPoint + public static func computeOffsetOrigin(to: any MapConductorCore::GeoPointProtocol, distance: Swift::Double, heading: Swift::Double) -> MapConductorCore::GeoPoint? + public static func computeLength(_ path: [any MapConductorCore::GeoPointProtocol]) -> Swift::Double + public static func createInterpolatePoints(_ points: [any MapConductorCore::GeoPointProtocol], maxSegmentLength: Swift::Double = 10_000.0) -> [any MapConductorCore::GeoPointProtocol] + public static func pointOnLineOrNull(from: any MapConductorCore::GeoPointProtocol, to: any MapConductorCore::GeoPointProtocol, position: any MapConductorCore::GeoPointProtocol, thresholdMeters: Swift::Double) -> (any MapConductorCore::GeoPointProtocol, Swift::Double)? + public static func computeSignedArea(_ path: [any MapConductorCore::GeoPointProtocol]) -> Swift::Double + public static func computeArea(_ path: [any MapConductorCore::GeoPointProtocol]) -> Swift::Double + public static func interpolate(from: any MapConductorCore::GeoPointProtocol, to: any MapConductorCore::GeoPointProtocol, fraction: Swift::Double) -> MapConductorCore::GeoPoint +} +public enum TilePngEncoder { + public static func encode(_ image: UIKit::UIImage) -> Foundation::Data? + public static func encode(rgba: Swift::UnsafeMutableRawPointer, width: Swift::Int, height: Swift::Int, premultiplied: Swift::Bool) -> Foundation::Data? } public enum AbstractZoomAltitudeConverter { - public static let defaultZoom0Altitude: Swift.Double - public static let zoomFactor: Swift.Double - public static let minZoomLevel: Swift.Double - public static let maxZoomLevel: Swift.Double - public static let minAltitude: Swift.Double - public static let maxAltitude: Swift.Double - public static let minCosLat: Swift.Double - public static let minCosTilt: Swift.Double - public static let webMercatorInitialMpp256: Swift.Double -} -open class WebMercatorZoomAltitudeConverter : MapConductorCore.ZoomAltitudeConverterProtocol { - final public let zoom0Altitude: Swift.Double - public init(zoom0Altitude: Swift.Double = AbstractZoomAltitudeConverter.defaultZoom0Altitude, zoomOffset: Swift.Double = 0.0) - open func zoomOffset(at _: Swift.Double) -> Swift.Double - public func toUnifiedZoom(_ nativeZoom: Swift.Double, latitude: Swift.Double = 0.0) -> Swift.Double - public func toNativeZoom(_ unifiedZoom: Swift.Double, latitude: Swift.Double = 0.0) -> Swift.Double - public func cosLatitudeFactor(_ latitudeDeg: Swift.Double) -> Swift.Double - public func cosTiltFactor(_ tiltDeg: Swift.Double) -> Swift.Double - public func zoomLevelToAltitude(zoomLevel: Swift.Double, latitude: Swift.Double, tilt: Swift.Double) -> Swift.Double - public func altitudeToZoomLevel(altitude: Swift.Double, latitude: Swift.Double, tilt: Swift.Double) -> Swift.Double - @objc deinit -} -open class GroundScaleZoomAltitudeConverter : MapConductorCore.WebMercatorZoomAltitudeConverter { - public init(zoom0Altitude: Swift.Double = AbstractZoomAltitudeConverter.defaultZoom0Altitude, baseZoomOffset: Swift.Double) - override public func zoomOffset(at latitude: Swift.Double) -> Swift.Double + public static let defaultZoom0Altitude: Swift::Double + public static let zoomFactor: Swift::Double + public static let minZoomLevel: Swift::Double + public static let maxZoomLevel: Swift::Double + public static let minAltitude: Swift::Double + public static let maxAltitude: Swift::Double + public static let minCosLat: Swift::Double + public static let minCosTilt: Swift::Double + public static let webMercatorInitialMpp256: Swift::Double +} +open class WebMercatorZoomAltitudeConverter : MapConductorCore::ZoomAltitudeConverterProtocol { + final public let zoom0Altitude: Swift::Double + public init(zoom0Altitude: Swift::Double = AbstractZoomAltitudeConverter.defaultZoom0Altitude, zoomOffset: Swift::Double = 0.0) + open func zoomOffset(at _: Swift::Double) -> Swift::Double + public func toUnifiedZoom(_ nativeZoom: Swift::Double, latitude: Swift::Double = 0.0) -> Swift::Double + public func toNativeZoom(_ unifiedZoom: Swift::Double, latitude: Swift::Double = 0.0) -> Swift::Double + public func cosLatitudeFactor(_ latitudeDeg: Swift::Double) -> Swift::Double + public func cosTiltFactor(_ tiltDeg: Swift::Double) -> Swift::Double + public func zoomLevelToAltitude(zoomLevel: Swift::Double, latitude: Swift::Double, tilt: Swift::Double) -> Swift::Double + public func altitudeToZoomLevel(altitude: Swift::Double, latitude: Swift::Double, tilt: Swift::Double) -> Swift::Double + @objc deinit +} +open class GroundScaleZoomAltitudeConverter : MapConductorCore::WebMercatorZoomAltitudeConverter { + public init(zoom0Altitude: Swift::Double = AbstractZoomAltitudeConverter.defaultZoom0Altitude, baseZoomOffset: Swift::Double) + override public func zoomOffset(at latitude: Swift::Double) -> Swift::Double @objc deinit } public protocol ZoomAltitudeConverterProtocol { - var zoom0Altitude: Swift.Double { get } - func zoomLevelToAltitude(zoomLevel: Swift.Double, latitude: Swift.Double, tilt: Swift.Double) -> Swift.Double - func altitudeToZoomLevel(altitude: Swift.Double, latitude: Swift.Double, tilt: Swift.Double) -> Swift.Double + var zoom0Altitude: Swift::Double { get } + func zoomLevelToAltitude(zoomLevel: Swift::Double, latitude: Swift::Double, tilt: Swift::Double) -> Swift::Double + func altitudeToZoomLevel(altitude: Swift::Double, latitude: Swift::Double, tilt: Swift::Double) -> Swift::Double } -extension MapConductorCore.ZoomAltitudeConverterProtocol { - public static var defaultZoom0Altitude: Swift.Double { +extension MapConductorCore::ZoomAltitudeConverterProtocol { + public static var defaultZoom0Altitude: Swift::Double { get } - public static var zoomFactor: Swift.Double { + public static var zoomFactor: Swift::Double { get } - public static var minZoomLevel: Swift.Double { + public static var minZoomLevel: Swift::Double { get } - public static var maxZoomLevel: Swift.Double { + public static var maxZoomLevel: Swift::Double { get } - public static var minAltitude: Swift.Double { + public static var minAltitude: Swift::Double { get } - public static var maxAltitude: Swift.Double { + public static var maxAltitude: Swift::Double { get } - public static var minCosLat: Swift.Double { + public static var minCosLat: Swift::Double { get } - public static var minCosTilt: Swift.Double { + public static var minCosTilt: Swift::Double { get } - public static var webMercatorInitialMpp256: Swift.Double { + public static var webMercatorInitialMpp256: Swift::Double { get } } -extension MapConductorCore.MapGesture : Swift.Equatable {} -extension MapConductorCore.MapGesture : Swift.Hashable {} -extension MapConductorCore.MapGesture : Swift.RawRepresentable {} -extension MapConductorCore.MapViewBase : Swift.Sendable {} -extension MapConductorCore.MapViewCoordinatorBase : Swift.Sendable {} -extension MapConductorCore.OverlayKind : Swift.Equatable {} -extension MapConductorCore.OverlayKind : Swift.Hashable {} -extension MapConductorCore.OverlayKind : Swift.RawRepresentable {} -extension MapConductorCore.Direction6 : Swift.Equatable {} -extension MapConductorCore.Direction6 : Swift.Hashable {} -extension MapConductorCore.DefaultInfoBubbleView : Swift.Sendable {} -extension MapConductorCore.InfoBubbleOverlayCoordinator : Swift.Sendable {} -extension MapConductorCore.MapAttributionOverlay : Swift.Sendable {} -extension MapConductorCore.MapCapability : Swift.Equatable {} -extension MapConductorCore.MapCapability : Swift.Hashable {} -extension MapConductorCore.MapCapability : Swift.RawRepresentable {} -extension MapConductorCore.MapDiagnosticLevel : Swift.Equatable {} -extension MapConductorCore.MapDiagnosticLevel : Swift.Hashable {} -extension MapConductorCore.MapDiagnosticLevel : Swift.RawRepresentable {} -extension MapConductorCore.MapServiceRegistryScope : Swift.Sendable {} -extension MapConductorCore.InitState : Swift.Equatable {} -extension MapConductorCore.InitState : Swift.Hashable {} -extension MapConductorCore.DefaultMarkerEventController : Swift.Sendable {} -extension MapConductorCore.MarkerDragGestureState : Swift.Equatable {} -extension MapConductorCore.MarkerDragGestureState : Swift.Hashable {} -extension MapConductorCore.MarkerAnimationOverlayCoordinator : Swift.Sendable {} -extension MapConductorCore.AnyMarkerOverlayRenderer : Swift.Sendable {} -extension MapConductorCore.MarkerAnimation : Swift.Equatable {} -extension MapConductorCore.MarkerAnimation : Swift.Hashable {} -extension MapConductorCore.StrategyMarkerManager : Swift.Sendable {} -extension MapConductorCore.DeferredUntilReady : Swift.Sendable {} -extension MapConductorCore.MapOverlayScope : Swift.Sendable {} -extension MapConductorCore.OverlayCollector : Swift.Sendable {} -extension MapConductorCore.TileScheme : Swift.RawRepresentable {} +extension MapConductorCore::MapGesture : Swift::Equatable {} +extension MapConductorCore::MapGesture : Swift::Hashable {} +extension MapConductorCore::MapGesture : Swift::RawRepresentable {} +extension MapConductorCore::MapViewBase : Swift::Sendable {} +extension MapConductorCore::MapViewCoordinatorBase : Swift::Sendable {} +extension MapConductorCore::OverlayKind : Swift::Equatable {} +extension MapConductorCore::OverlayKind : Swift::Hashable {} +extension MapConductorCore::OverlayKind : Swift::RawRepresentable {} +extension MapConductorCore::Direction6 : Swift::Equatable {} +extension MapConductorCore::Direction6 : Swift::Hashable {} +extension MapConductorCore::DefaultInfoBubbleView : Swift::Sendable {} +extension MapConductorCore::InfoBubbleOverlayCoordinator : Swift::Sendable {} +extension MapConductorCore::MapAttributionOverlay : Swift::Sendable {} +extension MapConductorCore::MapCapability : Swift::Equatable {} +extension MapConductorCore::MapCapability : Swift::Hashable {} +extension MapConductorCore::MapCapability : Swift::RawRepresentable {} +extension MapConductorCore::MapDiagnosticLevel : Swift::Equatable {} +extension MapConductorCore::MapDiagnosticLevel : Swift::Hashable {} +extension MapConductorCore::MapDiagnosticLevel : Swift::RawRepresentable {} +extension MapConductorCore::MapServiceRegistryScope : Swift::Sendable {} +extension MapConductorCore::InitState : Swift::Equatable {} +extension MapConductorCore::InitState : Swift::Hashable {} +extension MapConductorCore::DefaultMarkerEventController : Swift::Sendable {} +extension MapConductorCore::MarkerDragGestureState : Swift::Equatable {} +extension MapConductorCore::MarkerDragGestureState : Swift::Hashable {} +extension MapConductorCore::MarkerAnimationOverlayCoordinator : Swift::Sendable {} +extension MapConductorCore::AnyMarkerOverlayRenderer : Swift::Sendable {} +extension MapConductorCore::MarkerAnimation : Swift::Equatable {} +extension MapConductorCore::MarkerAnimation : Swift::Hashable {} +extension MapConductorCore::StrategyMarkerManager : Swift::Sendable {} +extension MapConductorCore::DeferredUntilReady : Swift::Sendable {} +extension MapConductorCore::MapOverlayScope : Swift::Sendable {} +extension MapConductorCore::OverlayCollector : Swift::Sendable {} +extension MapConductorCore::TileScheme : Swift::RawRepresentable {} From 9b123e530645edfac9258ae7d2e088ce21c99a04 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Mon, 21 Sep 2026 22:40:22 +0900 Subject: [PATCH 17/28] Rebuild TilePng.xcframework from the vectortile sync --- .../ios-arm64-simulator/libtile_png_ffi.a | Bin 2208176 -> 2208176 bytes .../ios-arm64/libtile_png_ffi.a | Bin 2212016 -> 2212016 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/TilePng.xcframework/ios-arm64-simulator/libtile_png_ffi.a b/TilePng.xcframework/ios-arm64-simulator/libtile_png_ffi.a index dd306d1e983a0809280818580853a7b2be860f16..93eeea71c06f1e1c17fb6aaa774d89941b87273e 100644 GIT binary patch delta 118 zcmWN=#}R@6006-OK@kjKz(7#11$oe(kK^fB3O=mJMs#O({0_nR|7xRq*Yyu1kWeNP tNi0*DNg{JeC6k3LWhHCLrI3wmWhZ+nq|fd`7Z70827pO58fECnA{WFtDs4BtK&{$F*}bnX3t1QNz$sbn&fxh!NUxfHUJwQOW7rR-!c2RTY5Cpk+k7rB18J>Nfu(;t2S diff --git a/TilePng.xcframework/ios-arm64/libtile_png_ffi.a b/TilePng.xcframework/ios-arm64/libtile_png_ffi.a index 8dac09cd688e28d32ed7d7e112a2b89af50745e5..a479fc841ab786699b96fcc33653a99b951c3a69 100644 GIT binary patch delta 118 zcmWN=TM~f)06@_xA>~mXNhRDJm{?#Rcl?=_(vN>jF uBvYBmTw+;BBB?B8C2QG8Cb?{7Cwn Date: Mon, 21 Sep 2026 22:51:16 +0900 Subject: [PATCH 18/28] Fix the atlas row flip in the GPU marker rasterizer, and make GPU the default again CGContext(data:) has its origin at the bottom left, so an icon packed into atlas row r actually lands in memory row rows-1-r. The UVs were computed top-down, so every instance sampled the icon one row-flip away -- unit test: a 3x3 atlas swapped rows 0 and 2 wholesale -- and an icon whose flipped position fell on the last row's empty cells vanished entirely. On the map that read as icons cut at tile seams and one circle in two colours, because the same marker resolved to different atlas rows in neighbouring tiles' atlases. The icons themselves stayed upright: CG flips image drawing the same way, and the two flips cancel within a cell but not across rows. The v coordinates are now measured from the bottom, with a half-texel inset against nearest-sampling bleed. MetalMarkerRasterizerTests pins the atlas down in isolation (colour identity across rows, orientation, edge overhang, determinism); on device, DeviceSeamReproBench went from 3 broken seams in 49 to 0, and GpuCpuTileDiff matches the CPU path pixel for pixel across 400 tiles, sequential and 6-way concurrent. Why the earlier 300-tile parity run missed it: its detector compared only the red and blue channels with loose thresholds, and the palette assigned similar hues to neighbouring indices, so row-swapped colours slipped under the tolerance. The new tests compare exact colour identity. --- .../marker/MarkerTileRenderer.swift | 21 +-- .../marker/MetalMarkerRasterizer.swift | 24 ++- .../MetalMarkerRasterizerTests.swift | 173 ++++++++++++++++++ 3 files changed, 199 insertions(+), 19 deletions(-) create mode 100644 Tests/MapConductorCoreTests/MetalMarkerRasterizerTests.swift diff --git a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift index a83a9cb..a545423 100644 --- a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift +++ b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift @@ -538,18 +538,17 @@ public final class MarkerTileRenderer: TileProvider { if gpuResolved { return gpuCached } gpuResolved = true /* - 既定は CPU。GPU は実験用のオプトイン。 - - GPU 経路は速い(実測でタイルあたり 20〜40ms の差)が、正しくない。 - 実機の A/B(`DeviceSeamReproBench`、144k・アイコン 101 種・z17)で、 - 同一の kept 集合・同一の描画順にもかかわらず GPU だけがタイル右端の - マーカーを描き落とし、別のマーカーの色を出した。49 境界中 3 で - 継ぎ目の割れになり、CPU は 0。地図では「アイコンが切れる」 - 「1 つの丸に 2 色」という形で見え、御茶ノ水・霞が関で実際に出た。 - 原因はインスタンスとアトラスの対応のどこかまでしか特定できておらず、 - 直すまでは正しさを取る。戻すときはあのベンチが回帰網になる。 + 既定は GPU。`MAPCONDUCTOR_MARKER_TILE_CPU=1` で切り分け用に CPU へ + 落とせる。 + + 一時期 GPU を既定から外していた。アトラスの UV が CGContext の + 下原点を考慮しておらず 1 行反転ぶん別のアイコンを指し、実機で + 「タイル右端のマーカーが消える」「1 つの丸に 2 色」という継ぎ目の + 割れになっていたため(詳細は MetalMarkerRasterizer.makeAtlas)。 + 根治後、`MetalMarkerRasterizerTests`(単体)と + `DeviceSeamReproBench`(実機の GPU/CPU 突き合わせ)が回帰網。 */ - guard ProcessInfo.processInfo.environment["MAPCONDUCTOR_MARKER_TILE_GPU"] == "1" else { + if ProcessInfo.processInfo.environment["MAPCONDUCTOR_MARKER_TILE_CPU"] == "1" { return nil } gpuCached = MetalMarkerRasterizer.createOrNull(tileSize: tileSize) diff --git a/Sources/MapConductorCore/marker/MetalMarkerRasterizer.swift b/Sources/MapConductorCore/marker/MetalMarkerRasterizer.swift index 0dc46d5..1262383 100644 --- a/Sources/MapConductorCore/marker/MetalMarkerRasterizer.swift +++ b/Sources/MapConductorCore/marker/MetalMarkerRasterizer.swift @@ -165,19 +165,27 @@ final class MetalMarkerRasterizer { width: image.width, height: image.height) context.draw(image, in: rect) /* - 半テクセル内側に詰める。クアッドの端のピクセルはセルの境界 - ぴったりの UV をサンプルし、最近傍では**隣のアイコンの端の列**を - 拾うことがある。タイルの内側では円の縁の 1px で目立たないが、 - タイル境界でクリップされた円は切り口がそのまま画面に出るので、 - 隣のタイルが描く正しい続きと色が食い違い、継ぎ目で丸が割れて - 見える -- 御茶ノ水・霞が関で実際に出た形。実機の実測では - これで GPU と CPU の継ぎ目差分が 3 件 → 0 件になった。 + v は**下から**測る。 + + `CGContext(data:)` の原点は左下で、「行 r」に置いたつもりの + アイコンはメモリ上では行 rows-1-r に居る。テクスチャはメモリを + そのまま積むので、上基準の v を渡すと**1 行反転ぶん別のアイコン**を + サンプルする -- 単体テストでは 3x3 の行 0 と行 2 がそっくり + 入れ替わり、反転先が最終行の空セルに落ちたアイコンは絵ごと + 消えた。実機では「タイル右端のマーカーが消える」「1 つの丸に + 2 色」という継ぎ目の割れとして見えていた。アイコン自体は + CG がイメージも同じ向きで描くため二重反転で正立しており、 + ずれるのは行の割り当てだけ。 + + 半テクセルの内側詰めは最近傍サンプリングが隣のセルの端を + 拾わないための保険。 */ let insetX = 0.5 / Double(width) let insetY = 0.5 / Double(height) + let flippedY = Double(height) - rect.maxY uv.append(CGRect( x: rect.minX / Double(width) + insetX, - y: rect.minY / Double(height) + insetY, + y: flippedY / Double(height) + insetY, width: rect.width / Double(width) - 2 * insetX, height: rect.height / Double(height) - 2 * insetY )) diff --git a/Tests/MapConductorCoreTests/MetalMarkerRasterizerTests.swift b/Tests/MapConductorCoreTests/MetalMarkerRasterizerTests.swift new file mode 100644 index 0000000..5754277 --- /dev/null +++ b/Tests/MapConductorCoreTests/MetalMarkerRasterizerTests.swift @@ -0,0 +1,173 @@ +import UIKit +import XCTest + +@testable import MapConductorCore + +/// `MetalMarkerRasterizer` を renderer から切り離して単体で責める。 +/// +/// 実機で「タイル右端のマーカーが消える」「別のアイコンの色が出る」が +/// 出た(`DeviceSeamReproBench`)。renderer 側の kept・順序・矩形は左右の +/// タイルで一致していたので、容疑はこの中 -- アトラスの詰め方、UV、 +/// クアッドの位置、読み戻しのどれか。ここでは入力を手で組むので、 +/// どの段が嘘をつくかが直接分かる。 +final class MetalMarkerRasterizerTests: XCTestCase { + + private func solid(_ color: UIColor, size: Int = 16) -> CGImage { + let renderer = UIGraphicsImageRenderer(size: CGSize(width: size, height: size)) + return renderer.image { context in + color.setFill() + context.fill(CGRect(x: 0, y: 0, width: size, height: size)) + }.cgImage! + } + + /// 上半分と下半分で色の違う 1 枚。アトラスの上下反転はこれで出る。 + private func split(top: UIColor, bottom: UIColor, size: Int = 16) -> CGImage { + let renderer = UIGraphicsImageRenderer(size: CGSize(width: size, height: size)) + return renderer.image { context in + top.setFill() + context.fill(CGRect(x: 0, y: 0, width: size, height: size / 2)) + bottom.setFill() + context.fill(CGRect(x: 0, y: size / 2, width: size, height: size / 2)) + }.cgImage! + } + + private func pixels(_ png: Data) throws -> (p: [UInt8], w: Int, h: Int) { + let image = try XCTUnwrap(UIImage(data: png)?.cgImage) + var buffer = [UInt8](repeating: 0, count: image.width * image.height * 4) + let context = CGContext( + data: &buffer, width: image.width, height: image.height, + bitsPerComponent: 8, bytesPerRow: image.width * 4, + space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue + ) + context?.draw(image, in: CGRect(x: 0, y: 0, width: image.width, height: image.height)) + return (buffer, image.width, image.height) + } + + private func color(_ data: (p: [UInt8], w: Int, h: Int), _ x: Int, _ y: Int) -> (Int, Int, Int, Int) { + let at = (y * data.w + x) * 4 + return (Int(data.p[at]), Int(data.p[at + 1]), Int(data.p[at + 2]), Int(data.p[at + 3])) + } + + /// 2x2 アトラスの 4 色が、それぞれのインスタンスにそのまま出ること。 + /// アトラスの行が入れ替わっていれば(上下反転)、ここで色が入れ替わる。 + func testFourIconsKeepTheirColours() throws { + let gpu = try XCTUnwrap(MetalMarkerRasterizer.createOrNull(tileSize: 128)) + let icons = [solid(.red), solid(.green), solid(.blue), solid(.yellow)] + let atlas = try XCTUnwrap(gpu.makeAtlas(icons)) + var instances: [MetalMarkerRasterizer.Instance] = [] + for at in 0..<4 { + let uv = atlas.uv[at] + instances.append(MetalMarkerRasterizer.Instance( + left: Float(8 + at * 30), top: 40, width: 16, height: 16, + u0: Float(uv.minX), v0: Float(uv.minY), + u1: Float(uv.maxX), v1: Float(uv.maxY) + )) + } + let png = try XCTUnwrap(gpu.renderPng(instances: instances, atlas: atlas.texture, paddingPx: 0)) + let out = try pixels(png) + let expected = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0)] + for at in 0..<4 { + let (r, g, b, a) = color(out, 8 + at * 30 + 8, 48) + XCTAssertGreaterThan(a, 200, "インスタンス \(at) が描かれていない") + let want = expected[at] + XCTAssertTrue( + abs(r - want.0) < 40 && abs(g - want.1) < 40 && abs(b - want.2) < 40, + "インスタンス \(at): 期待 \(want) 実際 (\(r),\(g),\(b)) -- アトラスの取り違え" + ) + } + } + + /// アイコンの上下がそのまま出ること(上下反転の検出)。 + func testIconIsNotUpsideDown() throws { + let gpu = try XCTUnwrap(MetalMarkerRasterizer.createOrNull(tileSize: 64)) + let icons = [split(top: .red, bottom: .blue)] + let atlas = try XCTUnwrap(gpu.makeAtlas(icons)) + let uv = atlas.uv[0] + let instance = MetalMarkerRasterizer.Instance( + left: 8, top: 8, width: 16, height: 16, + u0: Float(uv.minX), v0: Float(uv.minY), u1: Float(uv.maxX), v1: Float(uv.maxY) + ) + let png = try XCTUnwrap(gpu.renderPng(instances: [instance], atlas: atlas.texture, paddingPx: 0)) + let out = try pixels(png) + let top = color(out, 16, 11) + let bottom = color(out, 16, 21) + XCTAssertGreaterThan(top.0, 180, "上半分が赤でない: \(top)") + XCTAssertGreaterThan(bottom.2, 180, "下半分が青でない: \(bottom)") + } + + /// 多行アトラス(9 枚 → 3x3)でも取り違えないこと。 + func testNineIconsKeepTheirColoursAcrossRows() throws { + let gpu = try XCTUnwrap(MetalMarkerRasterizer.createOrNull(tileSize: 256)) + let hues: [CGFloat] = [0.0, 0.1, 0.2, 0.35, 0.5, 0.6, 0.7, 0.8, 0.9] + let icons = hues.map { solid(UIColor(hue: $0, saturation: 1, brightness: 1, alpha: 1)) } + let atlas = try XCTUnwrap(gpu.makeAtlas(icons)) + var instances: [MetalMarkerRasterizer.Instance] = [] + for at in 0..<9 { + let uv = atlas.uv[at] + instances.append(MetalMarkerRasterizer.Instance( + left: Float(4 + (at % 5) * 40), top: Float(20 + (at / 5) * 60), + width: 16, height: 16, + u0: Float(uv.minX), v0: Float(uv.minY), + u1: Float(uv.maxX), v1: Float(uv.maxY) + )) + } + let png = try XCTUnwrap(gpu.renderPng(instances: instances, atlas: atlas.texture, paddingPx: 0)) + let out = try pixels(png) + for at in 0..<9 { + var want = (r: CGFloat(0), g: CGFloat(0), b: CGFloat(0), a: CGFloat(0)) + UIColor(hue: hues[at], saturation: 1, brightness: 1, alpha: 1) + .getRed(&want.r, green: &want.g, blue: &want.b, alpha: &want.a) + let (r, g, b, a) = color(out, 4 + (at % 5) * 40 + 8, 20 + (at / 5) * 60 + 8) + XCTAssertGreaterThan(a, 200, "インスタンス \(at) が描かれていない") + XCTAssertTrue( + abs(r - Int(want.r * 255)) < 50 && abs(g - Int(want.g * 255)) < 50 && abs(b - Int(want.b * 255)) < 50, + "インスタンス \(at): 期待 (\(Int(want.r * 255)),\(Int(want.g * 255)),\(Int(want.b * 255))) 実際 (\(r),\(g),\(b))" + ) + } + } + + /// 右端で一部だけはみ出すインスタンスは、はみ出さない部分が描かれること。 + /// 実機では右端のマーカーが丸ごと消えた。 + func testInstanceOverhangingTheRightEdgeStillDraws() throws { + let size = 128 + let gpu = try XCTUnwrap(MetalMarkerRasterizer.createOrNull(tileSize: size)) + let icons = [solid(.red)] + let atlas = try XCTUnwrap(gpu.makeAtlas(icons)) + let uv = atlas.uv[0] + // 中心がタイル右端ちょうど: 左半分だけ見えるはず。 + let instance = MetalMarkerRasterizer.Instance( + left: Float(size - 8), top: 40, width: 16, height: 16, + u0: Float(uv.minX), v0: Float(uv.minY), u1: Float(uv.maxX), v1: Float(uv.maxY) + ) + let png = try XCTUnwrap(gpu.renderPng(instances: [instance], atlas: atlas.texture, paddingPx: 0)) + let out = try pixels(png) + let inside = color(out, size - 4, 48) + XCTAssertGreaterThan(inside.3, 200, "右端にかかるインスタンスが消えた: \(inside)") + XCTAssertGreaterThan(inside.0, 180, "色が違う: \(inside)") + } + + /// 同じ入力から 2 回描いて同じ画素が出ること。実機の再現は走行ごとに + /// 割れる境界が揺れた -- 非決定性はそれ自体が欠陥。 + func testSameInputsSamePixels() throws { + let gpu = try XCTUnwrap(MetalMarkerRasterizer.createOrNull(tileSize: 256)) + let icons = (0..<7).map { solid(UIColor(hue: CGFloat($0) / 7.0, saturation: 1, brightness: 1, alpha: 1)) } + let atlas = try XCTUnwrap(gpu.makeAtlas(icons)) + var instances: [MetalMarkerRasterizer.Instance] = [] + var seed = UInt64(9) + func next() -> Float { + seed = seed &* 6_364_136_223_846_793_005 &+ 1 + return Float(seed >> 40) / Float(1 << 24) + } + for at in 0..<200 { + let uv = atlas.uv[at % icons.count] + instances.append(MetalMarkerRasterizer.Instance( + left: next() * 260 - 10, top: next() * 260 - 10, width: 16, height: 16, + u0: Float(uv.minX), v0: Float(uv.minY), u1: Float(uv.maxX), v1: Float(uv.maxY) + )) + } + let first = try XCTUnwrap(gpu.renderPng(instances: instances, atlas: atlas.texture, paddingPx: 0)) + let second = try XCTUnwrap(gpu.renderPng(instances: instances, atlas: atlas.texture, paddingPx: 0)) + XCTAssertEqual(first, second, "同じ入力で違う絵が出た") + } +} From 563df169c4939e6a6320751d5d3a84da7cf395d9 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Tue, 22 Sep 2026 03:03:53 +0900 Subject: [PATCH 19/28] Turn an empty tile into pixels in the server, the way android does Only the marker renderer produced the transparent tile for an empty spot, so only marker tiles got the right answer. Every other provider that says 'nothing here' the same way -- geojson, kml, ground image, vector tile -- returned nil, and the server read nil as a failed render and answered 503. A map SDK retries a 503, so those layers had every genuinely empty tile asked for again and again, forever. The meaning now lives in one place, as it does in android-sdk-core: a provider returns nil for 'empty' and throws for 'could not draw it now'. The server answers empty with a transparent PNG at the density the path asked for, a throw with 503 and Retry-After, and keeps 404 for requests that name nothing. The protocol's cancellable overload gained "throws". Nothing that conforms to it had to change -- Swift lets a non-throwing method satisfy a throwing requirement, and the four extension modules and nine providers build untouched -- but it is a change to the published surface, so the dump moves with it. LocalTileServerSemanticsTests pins the four answers over real HTTP, the same four android checks on device. It also found its own bug first: run through URLSession.shared, the second test was served the first one's answer out of the HTTP cache, which is the very behaviour this change exists to get right. --- .../MapConductorCore/LocalTileServer.swift | 51 ++++-- Sources/MapConductorCore/TileProvider.swift | 28 ++- .../MapConductorCore/TransparentTile.swift | 36 ++++ .../marker/MarkerTileRenderer.swift | 46 ++--- .../LocalTileServerSemanticsTests.swift | 167 ++++++++++++++++++ .../MarkerTilingFlagTests.swift | 29 +-- api/MapConductorCore.api.swift | 4 +- 7 files changed, 286 insertions(+), 75 deletions(-) create mode 100644 Sources/MapConductorCore/TransparentTile.swift create mode 100644 Tests/MapConductorCoreTests/LocalTileServerSemanticsTests.swift diff --git a/Sources/MapConductorCore/LocalTileServer.swift b/Sources/MapConductorCore/LocalTileServer.swift index f72b62c..c664c0f 100644 --- a/Sources/MapConductorCore/LocalTileServer.swift +++ b/Sources/MapConductorCore/LocalTileServer.swift @@ -328,7 +328,7 @@ public final class LocalTileServer { MCLog.tileServer("LocalTileServer: 503 \(path)") case .abandoned: MCLog.tileServer("LocalTileServer: abandoned \(path) after \(renderNanos / 1_000_000)ms") - case .tile: + case .empty, .tile: break } @@ -392,8 +392,19 @@ public final class LocalTileServer { return } let tileResponse: TileResponse? = { - if case .tile(let response) = outcome { return response } - return nil + switch outcome { + case .tile(let response): + return response + case .empty(let pixelSize, let cacheControl): + // A transparent picture is what "nothing here" looks like. If + // the encoder cannot produce one the answer falls through to + // 404 below, which is the old behaviour and still wrong — but + // it only happens when PNG encoding itself is broken. + guard let png = TransparentTile.png(size: pixelSize) else { return nil } + return TileResponse(body: png, cacheControl: cacheControl) + default: + return nil + } }() if let tileResponse { sendResponse( @@ -494,6 +505,11 @@ public final class LocalTileServer { /// the difference is what the map does next. private enum TileOutcome { case tile(TileResponse) + /// The provider had nothing to draw here. Answered with a transparent + /// tile: an empty spot is a real answer, and a cacheable one — the URL + /// carries the data version, so it is re-asked when the data changes. + /// Saying 404 or 503 instead is what leaves a hole in the map. + case empty(pixelSize: Int, cacheControl: String) /// The path names nothing: bad route, bad coordinates. Answered 404, /// and the map is right to stop asking. case notFound @@ -516,7 +532,7 @@ public final class LocalTileServer { } let routeId = segments[1] - guard Int(segments[2]) != nil else { + guard let tileSize = Int(segments[2]) else { return .notFound } let hasCacheKey = segments.count >= 7 @@ -543,19 +559,32 @@ public final class LocalTileServer { default: return false } } - guard let bytes = provider.renderTile( - request: TileRequest(x: x, y: coordinate.y, z: z, pixelRatio: coordinate.pixelRatio), - isCancelled: gone - ) else { - return gone() ? .abandoned : .failed - } - let noStore: Bool = { cacheOptionsLock.lock() defer { cacheOptionsLock.unlock() } return forceNoStoreCache }() let cacheControl = noStore ? Self.noStoreCacheControl : Self.longCacheControl + + let bytes: Data? + do { + bytes = try provider.renderTile( + request: TileRequest(x: x, y: coordinate.y, z: z, pixelRatio: coordinate.pixelRatio), + isCancelled: gone + ) + } catch { + MCLog.tileServer("LocalTileServer: render threw for \(trimmed): \(error)") + return gone() ? .abandoned : .failed + } + guard let bytes else { + // Nothing to draw. Answered with pixels, not with "no tile" — + // unless nobody is waiting any more, in which case the only thing + // worth doing is not answering. + return gone() ? .abandoned : .empty( + pixelSize: tileSize * coordinate.pixelRatio, + cacheControl: cacheControl + ) + } return .tile(TileResponse(body: bytes, cacheControl: cacheControl)) } diff --git a/Sources/MapConductorCore/TileProvider.swift b/Sources/MapConductorCore/TileProvider.swift index d08e9ad..1bfae11 100644 --- a/Sources/MapConductorCore/TileProvider.swift +++ b/Sources/MapConductorCore/TileProvider.swift @@ -1,6 +1,18 @@ import Foundation public protocol TileProvider: AnyObject { + /** + Draws a tile, or returns nil when there is nothing to draw there. + + Nil is **"this spot is empty"**, and the server answers it with a + transparent tile — not a 404 and not a 503. A marker tile is empty only + *now*: data is still loading, a layer is mid-switch. Answering that with + "no tile" makes a map SDK remember a hole it never asks about again, and + the neighbouring tiles' overhang is cut off at its edge. + + A render that cannot be completed right now should **throw** instead; the + server turns that into a 503 the map knows to retry. + */ func renderTile(request: TileRequest) -> Data? /** @@ -12,18 +24,22 @@ public protocol TileProvider: AnyObject { *instead of* one still on screen. Returning nil because the tile was abandoned is **not** the same as having - no tile. The server must not answer a cancelled request with 404: a map - that believes a tile is missing stops asking for it and leaves whatever - older zoom it still has on screen — which is what a patchwork of two zoom - levels in one view looks like. + no tile. The server must not answer a cancelled request at all: a map that + believes a tile is missing stops asking for it and leaves whatever older + zoom it still has on screen — which is what a patchwork of two zoom levels + in one view looks like. + + Throwing means "not right now". A provider that never fails can stay + non-throwing: Swift lets a non-throwing method satisfy a throwing + requirement, so nothing already written needs to change. */ - func renderTile(request: TileRequest, isCancelled: () -> Bool) -> Data? + func renderTile(request: TileRequest, isCancelled: () -> Bool) throws -> Data? } public extension TileProvider { /// Providers that draw fast enough not to care can ignore cancellation; /// this is what keeps them source-compatible. - func renderTile(request: TileRequest, isCancelled: () -> Bool) -> Data? { + func renderTile(request: TileRequest, isCancelled: () -> Bool) throws -> Data? { renderTile(request: request) } } diff --git a/Sources/MapConductorCore/TransparentTile.swift b/Sources/MapConductorCore/TransparentTile.swift new file mode 100644 index 0000000..9c97ca5 --- /dev/null +++ b/Sources/MapConductorCore/TransparentTile.swift @@ -0,0 +1,36 @@ +import Foundation + +/// 透明なタイル 1 枚。辺の長さごとに 1 度だけ作って使い回す。 +/// +/// 「ここには何も無い」は本物の答えで、透明な絵で返すのが正しい。`nil` を +/// 「タイルが無い」として 404 や 503 にすると、地図 SDK はそれを覚える/ +/// 引き直し続ける。前者は永久の穴になり、隣のタイルのはみ出し分だけが残るので +/// 穴の縁でアイコンが半分に切れて見える。 +/// +/// 置き場所が `LocalTileServer` の隣なのは、**空を絵にするのはサーバの仕事**だから。 +/// 以前は `MarkerTileRenderer` が自分で透明タイルを返していて、同じことをする +/// geojson / kml / groundimage / vectortile は nil のまま 503 になっていた。 +/// android-sdk-core の `TransparentTilePng` と対になっている。 +enum TransparentTile { + private static let lock = NSLock() + nonisolated(unsafe) private static var cache: [Int: Data] = [:] + + /// 一辺 `size` ピクセルの透明 PNG。作れなければ nil。 + static func png(size: Int) -> Data? { + let clamped = min(max(size, 1), maxSize) + lock.lock() + defer { lock.unlock() } + if let cached = cache[clamped] { return cached } + var pixels = [UInt8](repeating: 0, count: clamped * clamped * 4) + let png = pixels.withUnsafeMutableBytes { raw -> Data? in + guard let base = raw.baseAddress else { return nil } + return TilePngEncoder.encode(rgba: base, width: clamped, height: clamped, premultiplied: true) + } + if let png { cache[clamped] = png } + return png + } + + /// 4096px タイルまで。これを超える要求は壊れた URL なので、確保量が + /// 二乗で効くこの経路では受けない。 + private static let maxSize = 4096 +} diff --git a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift index a545423..3bb9bdd 100644 --- a/Sources/MapConductorCore/marker/MarkerTileRenderer.swift +++ b/Sources/MapConductorCore/marker/MarkerTileRenderer.swift @@ -222,21 +222,17 @@ public final class MarkerTileRenderer: TileProvider { hook(request) } /* - 空のタイルは nil ではなく透明な PNG。 - - nil はサーバで 404 になり、地図 SDK は「このタイルは存在しない」と - 覚えて二度と要求しない。マーカーの空タイルは**今**空なだけで、 - データの取り込み中・ネイティブ⇄タイルの切り替え中に一瞬だけ空に - なることがある。その一瞬の 404 が恒久の穴になり、隣のタイルが - はみ出し分だけ描くので、穴の縁でアイコンが半分に切れて見える -- - 後楽園で実際に起きた形。 - - 透明タイルは 1 度だけ作って使い回す。数百バイトで、キャッシュ側の - 負担にはならない。本当にマーカーの無い場所も透明が正しい絵で、 - あとからそこにマーカーが現れたときはデータ変更がタイル URL の - version を進めるので、古い透明が残ることもない。 + 空のタイルは nil。透明な PNG に変えるのは `LocalTileServer` の仕事。 + + nil を「タイルが無い」と解釈されると困る、という話は変わっていない + (地図 SDK は 404 を恒久記憶し、隣のタイルのはみ出し分だけが残って + 穴の縁でアイコンが半分に切れる — 後楽園で実際に起きた形)。 + 変えたのは**誰が絵にするか**で、いまはサーバが空を透明タイルとして + 200 で返す。ここで自前の透明タイルを返していたときは、同じく空で + nil を返す geojson / kml / groundimage / vectortile だけが 503 に + なっていた。android-sdk と同じく、意味の変換は一箇所に置く。 */ - return Self.transparentTile(size: tileSize) + return nil } let prepareStart = Self.tracePhases ? Self.now() : 0 @@ -510,9 +506,6 @@ public final class MarkerTileRenderer: TileProvider { // MARK: - Private - private static func transparentTile(size: Int) -> Data? { - TransparentTileCache.tile(size: size) - } private struct PreparedMarker { let bitmap: UIImage @@ -810,22 +803,3 @@ private struct MarkerPlacement: Hashable { private final class AnyIconMarker {} } -/// 透明タイルの置き場。`MarkerTileRenderer` はジェネリックで static stored -/// property を持てないため、ここに出してある(`MarkerTilePhaseTrace` と同じ理由)。 -private enum TransparentTileCache { - private static let lock = NSLock() - nonisolated(unsafe) private static var cache: [Int: Data] = [:] - - static func tile(size: Int) -> Data? { - lock.lock() - defer { lock.unlock() } - if let cached = cache[size] { return cached } - var pixels = [UInt8](repeating: 0, count: size * size * 4) - let png = pixels.withUnsafeMutableBytes { raw -> Data? in - guard let base = raw.baseAddress else { return nil } - return TilePngEncoder.encode(rgba: base, width: size, height: size, premultiplied: true) - } - cache[size] = png - return png - } -} diff --git a/Tests/MapConductorCoreTests/LocalTileServerSemanticsTests.swift b/Tests/MapConductorCoreTests/LocalTileServerSemanticsTests.swift new file mode 100644 index 0000000..403ec9e --- /dev/null +++ b/Tests/MapConductorCoreTests/LocalTileServerSemanticsTests.swift @@ -0,0 +1,167 @@ +import XCTest +@testable import MapConductorCore + +/// サーバが「タイルが無い」理由をどう答えるか。 +/// +/// 3 通りあり、取り違えると画面に出る。地図 SDK は 404 を**恒久の答え**として +/// 覚えるので、一瞬だけ空だったタイル(データ取り込み中、レイヤ切り替えの最中)を +/// 404 で答えると二度と要求されず、隣のタイルのはみ出し分だけが残って穴の縁で +/// アイコンが半分に切れる。空は透明な絵、失敗は引き直せる 503、404 は +/// 「その名前のものは無い」ときだけ。 +/// +/// android-sdk-core の `LocalTileServerSemanticsTest` と同じ 4 点を見ている。 +final class LocalTileServerSemanticsTests: XCTestCase { + + private let routeId = "semantics-test" + private var server: LocalTileServer! + + /// キャッシュを持たないセッション。 + /// + /// 共有セッションで撮ると、空タイルに付く `max-age=31536000` のせいで + /// 2 本目以降が**前のテストの答え**を受け取る(実際に一度そうなった)。 + /// 見たいのはサーバが今なんと答えるかなので、毎回本当に聞きに行く。 + private lazy var session: URLSession = { + let configuration = URLSessionConfiguration.ephemeral + configuration.urlCache = nil + configuration.requestCachePolicy = .reloadIgnoringLocalAndRemoteCacheData + return URLSession(configuration: configuration) + }() + + override func setUp() { + super.setUp() + server = TileServerRegistry.get() + } + + override func tearDown() { + server.unregister(routeId: routeId) + super.tearDown() + } + + /// 空で nil を返すプロバイダ。geojson / kml / groundimage と同じ形。 + private final class EmptyProvider: TileProvider { + func renderTile(request: TileRequest) -> Data? { nil } + } + + /// 今は描けないプロバイダ。 + private final class FailingProvider: TileProvider { + struct Failure: Error {} + + func renderTile(request: TileRequest) -> Data? { nil } + + func renderTile(request: TileRequest, isCancelled: () -> Bool) throws -> Data? { + throw Failure() + } + } + + private final class FixedProvider: TileProvider { + let png: Data + + init(png: Data) { self.png = png } + + func renderTile(request: TileRequest) -> Data? { png } + } + + private struct Answer { + let status: Int + let headers: [AnyHashable: Any] + let body: Data + } + + /// タイルを 1 枚取りに行く。`urlTemplate` が返す URL をそのまま使う。 + private func fetch(z: Int, x: Int, y: Int, tileSize: Int = 512, retina: Bool = false) throws -> Answer { + let template = server.urlTemplate(routeId: routeId, tileSize: tileSize) + var text = template + .replacingOccurrences(of: "{z}", with: "\(z)") + .replacingOccurrences(of: "{x}", with: "\(x)") + .replacingOccurrences(of: "{y}", with: "\(y)") + if retina { + text = text.replacingOccurrences(of: ".png", with: "@2x.png") + } + let url = try XCTUnwrap(URL(string: text)) + + var answer: Answer? + let done = expectation(description: "tile \(text)") + let task = session.dataTask(with: url) { data, response, _ in + if let http = response as? HTTPURLResponse { + answer = Answer(status: http.statusCode, headers: http.allHeaderFields, body: data ?? Data()) + } + done.fulfill() + } + task.resume() + wait(for: [done], timeout: 20) + return try XCTUnwrap(answer, "サーバが答えなかった") + } + + private func header(_ answer: Answer, _ name: String) -> String? { + for (key, value) in answer.headers where (key as? String)?.lowercased() == name.lowercased() { + return value as? String + } + return nil + } + + /// 登録されていないルートは「その名前のものは無い」。404 はここだけ。 + func testUnknownRouteIsNotFound() throws { + let answer = try fetch(z: 10, x: 0, y: 0) + XCTAssertEqual(answer.status, 404) + } + + /// 空は本物の答え。透明な絵で 200。 + /// + /// マーカーのレンダラだけでなく、空で nil を返すすべてのプロバイダに効く + /// ことを確かめたいので、いちばん素朴なプロバイダで見る。 + func testEmptyTileIsATransparentPicture() throws { + server.register(routeId: routeId, provider: EmptyProvider()) + let answer = try fetch(z: 10, x: 11, y: 12) + XCTAssertEqual(answer.status, 200) + XCTAssertEqual(header(answer, "Content-Type"), "image/png") + + let image = try XCTUnwrap(UIImage(data: answer.body), "PNG として読めない") + XCTAssertEqual(image.size.width, 512) + XCTAssertEqual(image.size.height, 512) + XCTAssertEqual(alpha(of: image, atX: 0, y: 0), 0, "隅が不透明") + XCTAssertEqual(alpha(of: image, atX: 256, y: 256), 0, "中央が不透明") + } + + /// @2x の URL には、その密度の透明タイルを返す。 + func testEmptyRetinaTileMatchesItsDensity() throws { + server.register(routeId: routeId, provider: EmptyProvider()) + let answer = try fetch(z: 10, x: 21, y: 22, retina: true) + XCTAssertEqual(answer.status, 200) + let image = try XCTUnwrap(UIImage(data: answer.body)) + XCTAssertEqual(image.size.width, 1024) + } + + /// 描けなかったタイルは 503。404 にすると穴が残り、200 にすると嘘が残る。 + func testRenderFailureIsRetryable() throws { + server.register(routeId: routeId, provider: FailingProvider()) + let answer = try fetch(z: 10, x: 31, y: 32) + XCTAssertEqual(answer.status, 503) + XCTAssertEqual(header(answer, "Retry-After"), "1") + XCTAssertEqual(header(answer, "Cache-Control"), "no-store") + } + + /// 描けたタイルはそのまま返る(上の 3 つが偶然通っていないことの確認)。 + func testRenderedTileIsServedAsIs() throws { + let png = try XCTUnwrap(TransparentTile.png(size: 8)) + server.register(routeId: routeId, provider: FixedProvider(png: png)) + let answer = try fetch(z: 10, x: 41, y: 42) + XCTAssertEqual(answer.status, 200) + XCTAssertEqual(answer.body, png) + } + + private func alpha(of image: UIImage, atX x: Int, y: Int) -> Int { + guard let cgImage = image.cgImage else { return -1 } + var pixel: [UInt8] = [0, 0, 0, 0] + guard let context = CGContext( + data: &pixel, + width: 1, + height: 1, + bitsPerComponent: 8, + bytesPerRow: 4, + space: CGColorSpaceCreateDeviceRGB(), + bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue + ) else { return -1 } + context.draw(cgImage, in: CGRect(x: -x, y: -(cgImage.height - 1 - y), width: cgImage.width, height: cgImage.height)) + return Int(pixel[3]) + } +} diff --git a/Tests/MapConductorCoreTests/MarkerTilingFlagTests.swift b/Tests/MapConductorCoreTests/MarkerTilingFlagTests.swift index ee87684..b6aec51 100644 --- a/Tests/MapConductorCoreTests/MarkerTilingFlagTests.swift +++ b/Tests/MapConductorCoreTests/MarkerTilingFlagTests.swift @@ -131,12 +131,14 @@ final class MarkerTilingFlagTests: XCTestCase { // MARK: - Tile renderer - /// `MarkerTileRenderer` はタイル担当だけを焼く。ネイティブ担当しか無ければ**透明**が出る。 + /// `MarkerTileRenderer` はタイル担当だけを焼く。ネイティブ担当しか無ければ + /// 描くものが無いので nil を返す。 /// - /// 以前は nil を期待していた。nil はサーバで 404 になり、地図 SDK が - /// 「このタイルは無い」と恒久に覚えてしまう。タイル⇄ネイティブの担当替えの - /// 一瞬に来た要求が 404 になると、そこだけ二度と描かれない穴になった - /// (後楽園で実際に起きた)。空は「透明という絵」で答える。 + /// nil は「タイルが無い」ではなく「ここは空」。透明な絵に変えるのは + /// `LocalTileServer` の仕事で、そこが 404 や 503 を返さないことは + /// `LocalTileServerSemanticsTests` が見ている。一時期ここで透明タイルを + /// 作っていたが、同じく空で nil を返す geojson / kml / groundimage / + /// vectortile だけが 503 になるので、android-sdk と同じくサーバ一点へ寄せた。 func testTileRendererSkipsNativeEntities() throws { let manager = MarkerManager() manager.registerEntity( @@ -150,21 +152,8 @@ final class MarkerTilingFlagTests: XCTestCase { ) let renderer = MarkerTileRenderer(markerManager: manager) - let png = try XCTUnwrap(renderer.renderTile(request: Self.tileRequest), "空でも絵は返る") - // 透明であること: デコードして全ピクセルの alpha が 0。 - let image = try XCTUnwrap(UIImage(data: png)?.cgImage) - let width = image.width, height = image.height - var pixels = [UInt8](repeating: 1, count: width * height * 4) - let context = CGContext( - data: &pixels, width: width, height: height, - bitsPerComponent: 8, bytesPerRow: width * 4, - space: CGColorSpaceCreateDeviceRGB(), - bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue - ) - context?.clear(CGRect(x: 0, y: 0, width: width, height: height)) - context?.draw(image, in: CGRect(x: 0, y: 0, width: width, height: height)) - XCTAssertTrue( - stride(from: 3, to: pixels.count, by: 4).allSatisfy { pixels[$0] == 0 }, + XCTAssertNil( + renderer.renderTile(request: Self.tileRequest), "ネイティブ担当のマーカーがタイルに描かれている" ) } diff --git a/api/MapConductorCore.api.swift b/api/MapConductorCore.api.swift index 571ebc7..ee36a4f 100644 --- a/api/MapConductorCore.api.swift +++ b/api/MapConductorCore.api.swift @@ -255,10 +255,10 @@ public struct MapViewContent { } public protocol TileProvider : AnyObject { func renderTile(request: MapConductorCore::TileRequest) -> Foundation::Data? - func renderTile(request: MapConductorCore::TileRequest, isCancelled: () -> Swift::Bool) -> Foundation::Data? + func renderTile(request: MapConductorCore::TileRequest, isCancelled: () -> Swift::Bool) throws -> Foundation::Data? } extension MapConductorCore::TileProvider { - public func renderTile(request: MapConductorCore::TileRequest, isCancelled: () -> Swift::Bool) -> Foundation::Data? + public func renderTile(request: MapConductorCore::TileRequest, isCancelled: () -> Swift::Bool) throws -> Foundation::Data? } public struct TileRequest : Swift::Hashable { public let x: Swift::Int From 14b3dc4627ca9def2bdfd7364eed4cb9b700080f Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sat, 26 Sep 2026 23:24:27 -0700 Subject: [PATCH 20/28] Let a provider say how big a tile it wants Tile size is the app's choice and 512 is the cheaper default -- the per-tile costs (an HTTP round trip through the local server, a render, a PNG encode, a decode) scale with the count, so fewer, bigger tiles win for the same screen. But some SDKs have an opinion the layer supplying the tiles cannot see. ArcGIS's 3D SceneView is one: it picks the level as though every tile were 256 pixels, so 512-pixel tiles make it fetch one level deeper and cover the screen four times over. The picture is right, which is what makes it easy to miss, and the cost lands on the slowest devices. A provider can now register RasterTilePreference and be answered; saying nothing means it has no opinion and the supplier's default stands. An explicit tile size from the app always wins over both. --- .../raster/RasterTilePreference.swift | 36 +++++++++++++++++++ api/MapConductorCore.api.swift | 10 ++++++ 2 files changed, 46 insertions(+) create mode 100644 Sources/MapConductorCore/raster/RasterTilePreference.swift diff --git a/Sources/MapConductorCore/raster/RasterTilePreference.swift b/Sources/MapConductorCore/raster/RasterTilePreference.swift new file mode 100644 index 0000000..6ab44e4 --- /dev/null +++ b/Sources/MapConductorCore/raster/RasterTilePreference.swift @@ -0,0 +1,36 @@ +import Foundation + +/// どの大きさのタイルなら、この地図 SDK がうまく扱えるか。 +/// +/// タイルの一辺は本来アプリの好みで決めてよく、既定は 512。1 枚あたりの固定費 +/// (ローカルタイルサーバへの往復、PNG の符号化・復号、レンダラの立ち上げ)が +/// 枚数に比例するので、同じ画面を覆うなら枚数は少ないほうが安い。 +/// +/// ところが SDK 側に都合があることがあり、その都合はタイルを供給する側からは +/// 見えない。実例が ArcGIS の 3D SceneView で、**タイルは 256px** という前提で +/// レベルを選ぶ。512px のタイルを渡すと 1 段深いレベルを 4 倍の枚数で取りに行く +/// (Android 実機・統一ズーム 12 で、2D は z=11、3D は z=12)。絵は正しいので +/// 気づきにくく、遅い端末ほど効く。 +/// +/// android-sdk の `RasterTilePreference.kt`、react-sdk の +/// `RasterTilePreference.ts` と同じもの。 +public protocol RasterTilePreference { + /// この SDK に渡してほしいタイルの一辺(ポイント)。 + var preferredTileSize: Int { get } +} + +/// ``RasterTilePreference`` の登録キー。 +/// +/// 宣言しないプロバイダは「好みは無い」。その場合は供給側の既定が使われる。 +public enum RasterTilePreferenceKey: MapServiceKey { + public typealias Value = RasterTilePreference +} + +/// 値だけを持つ既定の実装。プロバイダが 1 行で登録できるように。 +public struct FixedRasterTilePreference: RasterTilePreference { + public let preferredTileSize: Int + + public init(preferredTileSize: Int) { + self.preferredTileSize = preferredTileSize + } +} diff --git a/api/MapConductorCore.api.swift b/api/MapConductorCore.api.swift index ee36a4f..3abbb80 100644 --- a/api/MapConductorCore.api.swift +++ b/api/MapConductorCore.api.swift @@ -2781,6 +2781,16 @@ final public class RasterLayerState : Combine::ObservableObject, Swift::Identifi get } } +public protocol RasterTilePreference { + var preferredTileSize: Swift::Int { get } +} +public enum RasterTilePreferenceKey : MapConductorCore::MapServiceKey { + public typealias Value = MapConductorCore::RasterTilePreference +} +public struct FixedRasterTilePreference : MapConductorCore::RasterTilePreference { + public let preferredTileSize: Swift::Int + public init(preferredTileSize: Swift::Int) +} public enum MarkerIconSize { public static let Small: CoreFoundation::CGFloat public static let Regular: CoreFoundation::CGFloat From 0a451f644f50828b8245729f559572096d38ec96 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Tue, 29 Sep 2026 10:13:28 -0700 Subject: [PATCH 21/28] Render local tiles in-process for callers that can cancel LocalTileServer.renderLocalTile(url:isCancelled:) draws a tile without going through HTTP, for backends whose tile callback can be cancelled (ArcGIS). The HTTP path cannot notice a client that gave up: an HTTP client half-closes after sending, so isComplete fires at once; recorded as an expected failure. removeProviderRegistrations also drops RasterTilePreferenceKey. --- .../MapConductorCore/LocalTileServer.swift | 79 ++++++-- .../map/MapServiceRegistry.swift | 4 + .../LocalTileServerAbandonTests.swift | 190 ++++++++++++++++++ 3 files changed, 259 insertions(+), 14 deletions(-) create mode 100644 Tests/MapConductorCoreTests/LocalTileServerAbandonTests.swift diff --git a/Sources/MapConductorCore/LocalTileServer.swift b/Sources/MapConductorCore/LocalTileServer.swift index c664c0f..f836303 100644 --- a/Sources/MapConductorCore/LocalTileServer.swift +++ b/Sources/MapConductorCore/LocalTileServer.swift @@ -1,7 +1,7 @@ import Foundation import Network -public final class LocalTileServer { +public final class LocalTileServer: @unchecked Sendable { public private(set) var baseUrl: String private let listener: NWListener @@ -98,6 +98,55 @@ public final class LocalTileServer { "\(baseUrl)/tiles/\(routeId)/\(tileSize)/\(cacheKey)/{z}/{x}/{y}.png" } + /** + Renders one of this server's URLs without going through TCP. + + Native map SDKs that expose an in-process tile callback should use this + path. Besides avoiding a loopback HTTP round trip, their task cancellation + is authoritative: unlike a TCP FIN it really does mean that the map no + longer wants the tile. + + The same render gate is shared with HTTP clients, so using the direct path + cannot create an unbounded number of CPU-heavy renders. + */ + public func renderLocalTile( + url: URL, + isCancelled: @escaping @Sendable () -> Bool = { false } + ) -> Data? { + guard url.absoluteString.hasPrefix(baseUrl + "/") else { return nil } + + let queuedAt = DispatchTime.now().uptimeNanoseconds + while renderGate.wait(timeout: .now() + .milliseconds(10)) != .success { + if isCancelled() { return nil } + } + let waitNanos = DispatchTime.now().uptimeNanoseconds - queuedAt + + statsLock.lock() + activeRenders += 1 + statsMaxActive = max(statsMaxActive, activeRenders) + statsLock.unlock() + + let renderStart = DispatchTime.now().uptimeNanoseconds + let outcome = resolveTile(path: url.path, isCancelled: isCancelled) + let renderNanos = DispatchTime.now().uptimeNanoseconds - renderStart + + statsLock.lock() + activeRenders -= 1 + statsLock.unlock() + renderGate.signal() + + record(outcome: outcome, path: url.path, waitNanos: waitNanos, renderNanos: renderNanos) + + switch outcome { + case .tile(let response): + return response.body + case .empty(let pixelSize, _): + return TransparentTile.png(size: pixelSize) + case .notFound, .failed, .abandoned: + return nil + } + } + @available(*, deprecated, message: "`version` is ignored. Use `urlTemplate(routeId:tileSize:)` instead.") public func urlTemplate(routeId: String, version: Int64) -> String { urlTemplate(routeId: routeId, tileSize: RasterLayerSource.defaultTileSize) @@ -295,7 +344,13 @@ public final class LocalTileServer { self.statsLock.unlock() let renderStart = DispatchTime.now().uptimeNanoseconds - let outcome = self.resolveTile(path: path, connection: connection) + let gone = { @Sendable in + switch connection.state { + case .cancelled, .failed: return true + default: return false + } + } + let outcome = self.resolveTile(path: path, isCancelled: gone) let renderNanos = DispatchTime.now().uptimeNanoseconds - renderStart self.renderGate.signal() self.statsLock.lock() @@ -522,7 +577,10 @@ public final class LocalTileServer { case abandoned } - private func resolveTile(path: String, connection: NWConnection) -> TileOutcome { + private func resolveTile( + path: String, + isCancelled: @escaping @Sendable () -> Bool + ) -> TileOutcome { let trimmed = path.trimmingCharacters(in: CharacterSet(charactersIn: "/")) guard !trimmed.isEmpty else { return .notFound } @@ -551,14 +609,6 @@ public final class LocalTileServer { return .notFound } - // A cancelled connection means the map moved on. Checked repeatedly - // rather than once, because the expensive part is the drawing itself. - let gone = { @Sendable in - switch connection.state { - case .cancelled, .failed: return true - default: return false - } - } let noStore: Bool = { cacheOptionsLock.lock() defer { cacheOptionsLock.unlock() } @@ -570,21 +620,22 @@ public final class LocalTileServer { do { bytes = try provider.renderTile( request: TileRequest(x: x, y: coordinate.y, z: z, pixelRatio: coordinate.pixelRatio), - isCancelled: gone + isCancelled: isCancelled ) } catch { MCLog.tileServer("LocalTileServer: render threw for \(trimmed): \(error)") - return gone() ? .abandoned : .failed + return isCancelled() ? .abandoned : .failed } guard let bytes else { // Nothing to draw. Answered with pixels, not with "no tile" — // unless nobody is waiting any more, in which case the only thing // worth doing is not answering. - return gone() ? .abandoned : .empty( + return isCancelled() ? .abandoned : .empty( pixelSize: tileSize * coordinate.pixelRatio, cacheControl: cacheControl ) } + guard !isCancelled() else { return .abandoned } return .tile(TileResponse(body: bytes, cacheControl: cacheControl)) } diff --git a/Sources/MapConductorCore/map/MapServiceRegistry.swift b/Sources/MapConductorCore/map/MapServiceRegistry.swift index 371e6cc..153441f 100644 --- a/Sources/MapConductorCore/map/MapServiceRegistry.swift +++ b/Sources/MapConductorCore/map/MapServiceRegistry.swift @@ -246,6 +246,10 @@ public extension MutableMapServiceRegistry { func removeProviderRegistrations() { remove(MarkerRenderingSupportKey.self) remove(OverlayControllerRegistryKey.self) + // ArcGIS の 3D と 2D は同じ state を共有できる(サンプルがそうしている)。 + // 3D だけが「タイルは 256pt」を宣言するので、外し忘れると 2D に切り替えた + // あとも 256 が残り、2D は同じ画面を 4 倍の枚数で覆うことになる。 + remove(RasterTilePreferenceKey.self) } } diff --git a/Tests/MapConductorCoreTests/LocalTileServerAbandonTests.swift b/Tests/MapConductorCoreTests/LocalTileServerAbandonTests.swift new file mode 100644 index 0000000..b4f9e37 --- /dev/null +++ b/Tests/MapConductorCoreTests/LocalTileServerAbandonTests.swift @@ -0,0 +1,190 @@ +import XCTest +@testable import MapConductorCore + +/// 描いている途中で見捨てられたタイルに、こちらが気づけるか。 +/// +/// 気づけないと、地図が興味を失ったタイルを最後まで描き切る。1 枚なら些細だが、 +/// ArcGIS の 3D は iPad の 1 画面に 119 枚を要求し、描画は 6 並列。**見られない +/// タイルが、見られるタイルの前に並ぶ**ぶんだけ画面が埋まるのが遅れる。 +/// +/// android-sdk はソケットを覗いて EOF を見る。iOS は `NWConnection` の +/// `state` を見ている——ここが本当に動くのかを固定するのがこのテスト。 +final class LocalTileServerAbandonTests: XCTestCase { + + private let routeId = "abandon-test" + private var server: LocalTileServer! + + override func setUp() { + super.setUp() + server = TileServerRegistry.get() + } + + override func tearDown() { + server.unregister(routeId: routeId) + super.tearDown() + } + + /// 描くのに時間がかかり、その間ずっと「まだ要る?」を聞き続けるプロバイダ。 + private final class SlowProvider: TileProvider, @unchecked Sendable { + let started = DispatchSemaphore(value: 0) + private let lock = NSLock() + private var _noticed = false + private var _asked = 0 + + /// 中断に気づいたか。 + var noticed: Bool { + lock.lock(); defer { lock.unlock() } + return _noticed + } + + /// 何回聞いたか(0 なら、そもそも聞く前に終わっている)。 + var asked: Int { + lock.lock(); defer { lock.unlock() } + return _asked + } + + func renderTile(request: TileRequest) -> Data? { nil } + + func renderTile(request: TileRequest, isCancelled: () -> Bool) throws -> Data? { + started.signal() + // 5 秒ぶん、20ms ごとに聞く。クライアントが切れた時点で気づけるなら + // この間に true になるはず。 + for _ in 0..<250 { + lock.lock() + _asked += 1 + lock.unlock() + if isCancelled() { + lock.lock(); _noticed = true; lock.unlock() + return nil + } + Thread.sleep(forTimeInterval: 0.02) + } + return TransparentTile.png(size: 8) + } + } + + private final class CancellationFlag: @unchecked Sendable { + private let lock = NSLock() + private var value = false + + func cancel() { + lock.lock(); value = true; lock.unlock() + } + + var isCancelled: Bool { + lock.lock(); defer { lock.unlock() } + return value + } + } + + private final class FixedProvider: TileProvider { + let png: Data + + init(png: Data) { self.png = png } + + func renderTile(request: TileRequest) -> Data? { png } + } + + private func tileURL() throws -> URL { + let text = server.urlTemplate(routeId: routeId, tileSize: 256) + .replacingOccurrences(of: "{z}", with: "10") + .replacingOccurrences(of: "{x}", with: "1") + .replacingOccurrences(of: "{y}", with: "2") + return try XCTUnwrap(URL(string: text)) + } + + /// ArcGIS's CustomTiledLayer exposes real task cancellation, so the + /// in-process route must pass it through to the provider immediately. + func testDirectTileNoticesAuthoritativeCancellation() throws { + let provider = SlowProvider() + let flag = CancellationFlag() + server.register(routeId: routeId, provider: provider) + let url = try tileURL() + let finished = expectation(description: "direct render stopped") + + DispatchQueue.global().async { + let data = self.server.renderLocalTile(url: url) { flag.isCancelled } + XCTAssertNil(data) + finished.fulfill() + } + + XCTAssertEqual(provider.started.wait(timeout: .now() + 10), .success) + flag.cancel() + wait(for: [finished], timeout: 1) + XCTAssertTrue(provider.noticed) + XCTAssertLessThan(provider.asked, 50, "キャンセル後も長く描画を続けた") + } + + func testDirectTileReturnsProviderBytes() throws { + let png = try XCTUnwrap(TransparentTile.png(size: 8)) + server.register(routeId: routeId, provider: FixedProvider(png: png)) + + XCTAssertEqual(server.renderLocalTile(url: try tileURL()), png) + } + + func testDirectTileRejectsAnotherServerURL() throws { + server.register( + routeId: routeId, + provider: FixedProvider(png: try XCTUnwrap(TransparentTile.png(size: 8))) + ) + + let foreign = try XCTUnwrap(URL(string: "http://example.com/tiles/\(routeId)/256/10/1/2.png")) + XCTAssertNil(server.renderLocalTile(url: foreign)) + } + + /** + クライアントが途中で帰ったら、描くのをやめられること。 + + **HTTP 経路は現状これを満たしていない。** `NWConnection` の `state` は + **相手が閉じても変わらない**(自分が cancel したときと、エラーのときだけ)ので、 + リクエストを解析してから応答を書くまでの間、受信は 1 つも張られていない。 + 結果、地図が見捨てたタイルも最後まで描き切る。 + + ArcGIS だけはこの穴を迂回済み。`renderLocalTile` を `CustomTiledLayer` の + クロージャから直接呼び、ArcGIS 自身のタスクキャンセルを権威として使う + (`testDirectTileNoticesAuthoritativeCancellation` が固定している)。 + HTTP で読む他のプロバイダ(MapKit, Google Maps ほか)はまだこの穴の中にいる。 + + 描画中に受信を張って EOF を見る、という素直な直し方を試したところ**壊れた**: + HTTP クライアントはリクエストを送り終えた時点で書き込み側を閉じることがあり、 + それが `isComplete` として即座に届く。「もう要らない」ではなく「送り終えた」 + なので、そこで接続を切ると応答を書く前に切ることになる(実機で 3 枚しか + 描けず地図が白くなった)。android がソケットを覗いているのは、この 2 つを + 区別するためだと思われる。 + + 直すまで期待値として記録しておく。消すとこの穴は誰にも見えなくなる。 + */ + func testNoticesAClientThatGaveUpMidRender() throws { + XCTExpectFailure("見捨てられたタイルに気づけない。上の説明を参照") + let provider = SlowProvider() + server.register(routeId: routeId, provider: provider) + + let url = try tileURL() + + let configuration = URLSessionConfiguration.ephemeral + configuration.urlCache = nil + let session = URLSession(configuration: configuration) + let task = session.dataTask(with: url) { _, _, _ in } + task.resume() + + // 描き始めてから帰る。始まる前に切ると、中断ではなく「来なかった」に + // なってしまい、確かめたいものが確かめられない。 + XCTAssertEqual( + provider.started.wait(timeout: .now() + 10), .success, + "プロバイダが呼ばれない" + ) + task.cancel() + + // 気づくなら即座のはず。長めに待ってから判定する。 + let deadline = Date().addingTimeInterval(3) + while Date() < deadline && !provider.noticed { + Thread.sleep(forTimeInterval: 0.05) + } + + XCTAssertGreaterThan(provider.asked, 0, "isCancelled が一度も呼ばれていない") + XCTAssertTrue( + provider.noticed, + "クライアントが帰ったのに描き続けている(\(provider.asked) 回聞いて一度も true にならない)" + ) + } +} From 8c590864aa7908aec2e50a92a8940f5c46f9aecf Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Tue, 29 Sep 2026 10:13:28 -0700 Subject: [PATCH 22/28] Give every backend one blank map style to say "no basemap" with BlankMapStyle: the JSON, its one colour, and a file URL written once into Caches for the SDKs that only take a URL. android-sdk-core and js-sdk-core carry the same style. --- .../MapConductorCore/map/BlankMapStyle.swift | 33 +++++++++++++++++++ api/MapConductorCore.api.swift | 5 +++ 2 files changed, 38 insertions(+) create mode 100644 Sources/MapConductorCore/map/BlankMapStyle.swift diff --git a/Sources/MapConductorCore/map/BlankMapStyle.swift b/Sources/MapConductorCore/map/BlankMapStyle.swift new file mode 100644 index 0000000..20ef04c --- /dev/null +++ b/Sources/MapConductorCore/map/BlankMapStyle.swift @@ -0,0 +1,33 @@ +import Foundation + +/// A MapLibre-style map with nothing in it but a background. +/// +/// What a provider shows for "no basemap" when it is built on MapLibre or takes +/// a MapLibre style URL (Mapbox, MapTiler, TomTom). A map that draws its whole +/// viewport itself -- vector tiles rendered on the device, say -- fetches and +/// paints the basemap under it for nobody; this is the style that fetches +/// nothing. android-sdk-core and js-sdk-core carry the same style. +public enum BlankMapStyle { + /// The one colour the style has. + public static let backgroundColor = "#f2efe9" + + public static let json = """ + {"version":8,"name":"blank","sources":{},"layers":[{"id":"background","type":"background","paint":{"background-color":"#f2efe9"}}]} + """ + + /// The style as a file, for SDKs that only take a URL. + /// + /// Written once into Caches; the vendor SDKs read `file:` URLs but none + /// of them read `data:` ones, and a Swift package cannot rely on a bundled + /// resource reaching every distribution (CocoaPods source pods, prebuilt + /// frameworks). + public static let fileURL: URL = { + let dir = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first + ?? FileManager.default.temporaryDirectory + let url = dir.appendingPathComponent("mapconductor-blank-style.json") + if (try? Data(contentsOf: url)) != json.data(using: .utf8) { + try? json.data(using: .utf8)?.write(to: url, options: .atomic) + } + return url + }() +} diff --git a/api/MapConductorCore.api.swift b/api/MapConductorCore.api.swift index 3abbb80..1816dad 100644 --- a/api/MapConductorCore.api.swift +++ b/api/MapConductorCore.api.swift @@ -2945,3 +2945,8 @@ extension MapConductorCore::DeferredUntilReady : Swift::Sendable {} extension MapConductorCore::MapOverlayScope : Swift::Sendable {} extension MapConductorCore::OverlayCollector : Swift::Sendable {} extension MapConductorCore::TileScheme : Swift::RawRepresentable {} +public enum BlankMapStyle { + public static let backgroundColor: Swift.String + public static let json: Swift.String + public static let fileURL: Foundation.URL +} From 48f9b4426686592cc6479602a742b1168eef73b7 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Tue, 29 Sep 2026 11:12:21 -0700 Subject: [PATCH 23/28] Make the transparent tile public: a backend can hand it out in place of a render --- Sources/MapConductorCore/TransparentTile.swift | 10 ++++++++-- api/MapConductorCore.api.swift | 3 +++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Sources/MapConductorCore/TransparentTile.swift b/Sources/MapConductorCore/TransparentTile.swift index 9c97ca5..4a23241 100644 --- a/Sources/MapConductorCore/TransparentTile.swift +++ b/Sources/MapConductorCore/TransparentTile.swift @@ -11,12 +11,18 @@ import Foundation /// 以前は `MarkerTileRenderer` が自分で透明タイルを返していて、同じことをする /// geojson / kml / groundimage / vectortile は nil のまま 503 になっていた。 /// android-sdk-core の `TransparentTilePng` と対になっている。 -enum TransparentTile { +/// A transparent PNG per pixel size, encoded once and kept. +/// +/// What "nothing here" looks like to a map: the tile server answers an empty +/// spot with it, and a backend that asks for tiles nobody will see (ArcGIS's +/// 3D view loads every ancestor of the level on screen) is handed one instead +/// of a render. +public enum TransparentTile { private static let lock = NSLock() nonisolated(unsafe) private static var cache: [Int: Data] = [:] /// 一辺 `size` ピクセルの透明 PNG。作れなければ nil。 - static func png(size: Int) -> Data? { + public static func png(size: Int) -> Data? { let clamped = min(max(size, 1), maxSize) lock.lock() defer { lock.unlock() } diff --git a/api/MapConductorCore.api.swift b/api/MapConductorCore.api.swift index 1816dad..5acc751 100644 --- a/api/MapConductorCore.api.swift +++ b/api/MapConductorCore.api.swift @@ -2950,3 +2950,6 @@ public enum BlankMapStyle { public static let json: Swift.String public static let fileURL: Foundation.URL } +public enum TransparentTile { + public static func png(size: Swift.Int) -> Foundation.Data? +} From 315a21ff5528851995ae62d8c759ff9b67551031 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Tue, 29 Sep 2026 14:35:46 -0700 Subject: [PATCH 24/28] Move to the camera an app hands over as it is The all-zero camera used to mean "position only, keep the zoom"; that is now the moveCameraTo(position:) overload's job. --- Sources/MapConductorCore/map/MapViewState.swift | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/Sources/MapConductorCore/map/MapViewState.swift b/Sources/MapConductorCore/map/MapViewState.swift index 302fe4e..ac62264 100644 --- a/Sources/MapConductorCore/map/MapViewState.swift +++ b/Sources/MapConductorCore/map/MapViewState.swift @@ -159,7 +159,9 @@ open class MapViewState: ObservableObject, MapViewStateProt } open func moveCameraTo(cameraPosition: MapCameraPosition, durationMillis: Long? = 0) { - let resolved = resolveCameraPosition(cameraPosition) + // カメラを渡されたらそのまま使う。「位置だけ動かして縮尺は保つ」は + // `moveCameraTo(position:)` のオーバーロードが担う。 + let resolved = cameraPosition guard let controller = attachedMapController else { // まだ地図が無い。接続時に attachController がこの位置へ移動する。 storedCameraPosition = resolved @@ -191,17 +193,6 @@ open class MapViewState: ObservableObject, MapViewStateProt attachedMapController?.holder } - /// ズーム・ベアリング・チルトがすべて 0 の「未指定」カメラは、位置だけを差し替える。 - /// - /// アプリが `MapCameraPosition(position:)` だけを渡してきたときに、 - /// いまの縮尺を保ったまま移動するための救済。全プロバイダが同じ判定をしていた。 - private func resolveCameraPosition(_ target: MapCameraPosition) -> MapCameraPosition { - let isUnspecified = target.zoom == 0.0 && target.bearing == 0.0 && target.tilt == 0.0 - if isUnspecified { - return storedCameraPosition.copy(position: target.position) - } - return target - } } public protocol MapOverlayProtocol: AnyObject { From f0463e206c2962692a6e1c5fcfdf0a094b645488 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Wed, 30 Sep 2026 15:29:52 -0700 Subject: [PATCH 25/28] Add VectorStyleSupport and file/document routes to the local tile server Counterpart of android-sdk-core: a map that draws vector styles itself registers VectorStyleSupport; VectorStyleAsDesign makes the style the design and restores the previous one a frame later. The tile server serves documents and directories (an offline package) with an optional upstream fallback. --- .../MapConductorCore/LocalTileServer.swift | 182 ++++++++++++++++++ .../map/MapServiceRegistry.swift | 1 + .../map/VectorStyleSupport.swift | 125 ++++++++++++ api/MapConductorCore.api.swift | 38 +++- 4 files changed, 337 insertions(+), 9 deletions(-) create mode 100644 Sources/MapConductorCore/map/VectorStyleSupport.swift diff --git a/Sources/MapConductorCore/LocalTileServer.swift b/Sources/MapConductorCore/LocalTileServer.swift index f836303..8763b31 100644 --- a/Sources/MapConductorCore/LocalTileServer.swift +++ b/Sources/MapConductorCore/LocalTileServer.swift @@ -8,6 +8,11 @@ public final class LocalTileServer: @unchecked Sendable { private let queue: DispatchQueue private let providersLock = NSLock() private var providers: [String: TileProvider] = [:] + /// Guarded by `providersLock`. + private var documents: [String: Document] = [:] + /// Guarded by `providersLock`. Directories served by route: an offline + /// package a map reads its tiles, glyphs and sprite from. + private var fileRoutes: [String: FileRoute] = [:] private let cacheOptionsLock = NSLock() private var forceNoStoreCache: Bool private let connectionsLock = NSLock() @@ -74,6 +79,64 @@ public final class LocalTileServer: @unchecked Sendable { providersLock.unlock() } + /** + Serves `body` at ``documentUrl(id:)`` until ``unregisterDocument(id:)``. + + Whole documents beside the tiles: a style JSON that a vector-capable map + is to read directly, for one. Served `no-store` -- the id changes when the + content does, so there is nothing to revalidate, and a map holding on to a + stale document is harder to notice than one refetching a small one. + + `id` must be URL-safe as given; it is matched against the request path + verbatim. + */ + public func registerDocument(id: String, contentType: String, body: Data) { + providersLock.lock() + documents[id] = Document(contentType: contentType, body: body) + providersLock.unlock() + } + + public func unregisterDocument(id: String) { + providersLock.lock() + documents.removeValue(forKey: id) + providersLock.unlock() + } + + public func documentUrl(id: String) -> String { + "\(baseUrl)/\(Self.documentsPrefix)/\(id)" + } + + /** + Serves the files under `directory` at ``filesUrl(routeId:)```/`. + + The content type follows the extension (`.mvt`, `.pbf`, `.json`, `.png`); + a file is served as immutable, since a package does not change under a + map. A path with no file is answered by `fallback` -- served `no-store`, + so what came from upstream is not mistaken for the package -- or, when + that is nil or answers nil, with 404, which the map takes as "no such + tile" and does not retry. The fallback runs on the render queue, off the + connection's thread. + */ + public func registerFiles( + routeId: String, + directory: URL, + fallback: (@Sendable (_ relativePath: String) -> Data?)? = nil + ) { + providersLock.lock() + fileRoutes[routeId] = FileRoute(directory: directory, fallback: fallback) + providersLock.unlock() + } + + public func unregisterFiles(routeId: String) { + providersLock.lock() + fileRoutes.removeValue(forKey: routeId) + providersLock.unlock() + } + + public func filesUrl(routeId: String) -> String { + "\(baseUrl)/\(Self.filesPrefix)/\(routeId)" + } + public var isListening: Bool { listener.state == .ready } @@ -325,6 +388,39 @@ public final class LocalTileServer: @unchecked Sendable { } let path = String(request.path.split(separator: "?")[0]) + + let filesPrefix = "/\(Self.filesPrefix)/" + if path.hasPrefix(filesPrefix) { + serveFile( + routePath: String(path.dropFirst(filesPrefix.count)), + connection: connection, + remainingData: remainingData, + keepAlive: keepAlive, + handled: handled + ) + return + } + + let documentPrefix = "/\(Self.documentsPrefix)/" + if path.hasPrefix(documentPrefix) { + let id = String(path.dropFirst(documentPrefix.count)) + providersLock.lock() + let document = documents[id] + providersLock.unlock() + sendResponse( + connection: connection, + status: document == nil ? "404 Not Found" : "200 OK", + contentType: document?.contentType ?? "text/plain", + body: document?.body ?? Data("Not found".utf8), + keepAlive: keepAlive, + extraHeaders: ["Cache-Control": Self.noStoreCacheControl] + ) { [weak self, weak connection] in + guard let self, let connection else { return } + self.finishRequest(connection: connection, remainingData: remainingData, keepAlive: keepAlive, handled: handled) + } + return + } + let queuedAt = DispatchTime.now().uptimeNanoseconds renderQueue.async { [weak self] in guard let self else { @@ -368,6 +464,79 @@ public final class LocalTileServer: @unchecked Sendable { } } + /// `/` under the files prefix. + private func serveFile( + routePath: String, + connection: NWConnection, + remainingData: Data, + keepAlive: Bool, + handled: Int + ) { + let routeId = String(routePath.prefix { $0 != "/" }) + let encoded = routePath.count > routeId.count ? String(routePath.dropFirst(routeId.count + 1)) : "" + let relative = encoded.removingPercentEncoding ?? "" + providersLock.lock() + let route = fileRoutes[routeId] + providersLock.unlock() + // No escaping the directory, whatever the request says. + let safe = !relative.isEmpty && !relative.split(separator: "/", omittingEmptySubsequences: false) + .contains { $0 == ".." || $0.isEmpty } + let finish: () -> Void = { [weak self, weak connection] in + guard let self, let connection else { return } + self.finishRequest(connection: connection, remainingData: remainingData, keepAlive: keepAlive, handled: handled) + } + if let route, safe, let data = try? Data(contentsOf: route.directory.appendingPathComponent(relative)) { + sendResponse( + connection: connection, + status: "200 OK", + contentType: Self.contentType(for: relative), + body: data, + keepAlive: keepAlive, + extraHeaders: ["Cache-Control": Self.longCacheControl], + completion: finish + ) + return + } + guard let route, safe, let fallback = route.fallback else { + sendResponse( + connection: connection, + status: "404 Not Found", + contentType: "text/plain", + body: Data("Not found".utf8), + keepAlive: keepAlive, + extraHeaders: ["Cache-Control": Self.noStoreCacheControl], + completion: finish + ) + return + } + renderQueue.async { [weak self] in + guard let self else { + connection.cancel() + return + } + let fetched = fallback(relative) + self.sendResponse( + connection: connection, + status: fetched == nil ? "404 Not Found" : "200 OK", + contentType: fetched == nil ? "text/plain" : Self.contentType(for: relative), + body: fetched ?? Data("Not found".utf8), + keepAlive: keepAlive, + extraHeaders: ["Cache-Control": Self.noStoreCacheControl], + completion: finish + ) + } + } + + private static func contentType(for path: String) -> String { + switch (path as NSString).pathExtension.lowercased() { + case "mvt": return "application/vnd.mapbox-vector-tile" + case "pbf": return "application/x-protobuf" + case "json": return "application/json" + case "png": return "image/png" + default: return "application/octet-stream" + } + } + /// Feeds the counters and emits the once-a-second summary plus anomalies. private func record(outcome: TileOutcome, path: String, waitNanos: UInt64, renderNanos: UInt64) { MCLog.tileDetail(String( @@ -682,6 +851,19 @@ public final class LocalTileServer: @unchecked Sendable { let cacheControl: String } + private struct Document { + let contentType: String + let body: Data + } + + private struct FileRoute { + let directory: URL + let fallback: (@Sendable (String) -> Data?)? + } + + private static let documentsPrefix = "docs" + private static let filesPrefix = "files" + private static let maxKeepAliveRequests = 10 private static let maxConcurrentConnections = 128 private static let maxRequestHeadBytes = 16 * 1024 diff --git a/Sources/MapConductorCore/map/MapServiceRegistry.swift b/Sources/MapConductorCore/map/MapServiceRegistry.swift index 153441f..c6a5f43 100644 --- a/Sources/MapConductorCore/map/MapServiceRegistry.swift +++ b/Sources/MapConductorCore/map/MapServiceRegistry.swift @@ -250,6 +250,7 @@ public extension MutableMapServiceRegistry { // 3D だけが「タイルは 256pt」を宣言するので、外し忘れると 2D に切り替えた // あとも 256 が残り、2D は同じ画面を 4 倍の枚数で覆うことになる。 remove(RasterTilePreferenceKey.self) + remove(VectorStyleSupportKey.self) } } diff --git a/Sources/MapConductorCore/map/VectorStyleSupport.swift b/Sources/MapConductorCore/map/VectorStyleSupport.swift new file mode 100644 index 0000000..9e33848 --- /dev/null +++ b/Sources/MapConductorCore/map/VectorStyleSupport.swift @@ -0,0 +1,125 @@ +import Foundation + +/** + A map that can draw a MapLibre style itself. + + MapLibre, Mapbox and MapTiler are vector renderers already: handing them a + style document is cheaper than rasterising it on the device and feeding the + result back as PNG tiles, which is what a backend that only takes raster + (Google Maps, MapKit, ArcGIS, HERE...) has to be given. A provider that can + take the style directly registers this under ``VectorStyleSupportKey``; a + layer that has a style to show looks the key up and, if it is there, skips + the rasteriser altogether. + + The style *becomes the basemap*: on every provider that can do this, the + style is the map, so showing one replaces the design the state names and + clearing it puts that design back. A style drawn this way is not an overlay + -- it has no opacity, and nothing of the previous basemap shows through it. + Anything that needs the style on top of another basemap goes through the + raster path. + + android-sdk-core and js-sdk-core carry the same capability. + */ +public protocol VectorStyleSupport: AnyObject { + /** + Draws the style at `url` as the map's basemap. + + `attributionRules` are the credits the style's sources ask for, carried + by the design so the map's attribution overlay shows them for as long as + the style is up. + */ + func showStyle(url: String, attributionRules: [AttributionRule]) + + /** + Restores the design that was showing before ``showStyle(url:attributionRules:)``, + unless the app has since chosen another one, in which case that choice + is left alone. + */ + func clearStyle() +} + +/// ``VectorStyleSupport`` の登録キー。 +/// +/// 宣言しないプロバイダは「スタイルは受け取れない」。ベクタータイル層はその場合 +/// ラスタータイルに描いて渡す。 +public enum VectorStyleSupportKey: MapServiceKey { + public typealias Value = VectorStyleSupport +} + +/** + ``VectorStyleSupport`` for a provider whose design type can name a style URL. + + The three MapLibre-based providers differ only in how a URL is wrapped into + their design type, which is what `designFor` supplies; the remember-and- + restore dance is the same for all of them and lives here once. The "still + ours" check on ``clearStyle()`` is what keeps this from fighting an app that + switched designs while the style was up: a layer unmounting must not undo a + choice the app made after it. + + ``clearStyle()`` takes effect a moment later rather than at once, and a + ``showStyle(url:attributionRules:)`` of the same URL in between cancels it. + A host that rebuilds its overlay content on a design change remounts the + layer that asked for the style *by the change it caused*; clearing on that + unmount would restore the old design, which would rebuild again, and so on + without end. Waiting one frame lets the remount cancel the clear. + */ +public final class VectorStyleAsDesign: VectorStyleSupport { + private weak var state: State? + private let designId: (State.ActualMapDesignType) -> String + private let designFor: (String, [AttributionRule]) -> State.ActualMapDesignType + + private var installed: State.ActualMapDesignType? + private var installedUrl: String? + private var previous: State.ActualMapDesignType? + private var pendingClear: DispatchWorkItem? + + public init( + state: State, + designId: @escaping (State.ActualMapDesignType) -> String, + designFor: @escaping (_ url: String, _ attributionRules: [AttributionRule]) -> State.ActualMapDesignType + ) { + self.state = state + self.designId = designId + self.designFor = designFor + } + + public func showStyle(url: String, attributionRules: [AttributionRule]) { + pendingClear?.cancel() + pendingClear = nil + guard let state else { return } + // Same style, still up: nothing to do, and writing the design again + // would reload it for nothing. + if let current = installed, installedUrl == url, designId(state.mapDesignType) == designId(current) { + return + } + let design = designFor(url, attributionRules) + // Showing a second style over the first keeps the *original* design + // as the one to go back to; the intermediate style was never the + // app's basemap. + if installed == nil { previous = state.mapDesignType } + installed = design + installedUrl = url + state.mapDesignType = design + } + + public func clearStyle() { + guard installed != nil else { return } + pendingClear?.cancel() + let clear = DispatchWorkItem { [weak self] in + guard let self else { return } + self.pendingClear = nil + guard let current = self.installed else { return } + let restore = self.previous + self.installed = nil + self.installedUrl = nil + self.previous = nil + guard let state = self.state, let restore else { return } + if self.designId(state.mapDesignType) == self.designId(current) { + state.mapDesignType = restore + } + } + pendingClear = clear + // Longer than a frame, shorter than anyone notices. + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: clear) + } +} diff --git a/api/MapConductorCore.api.swift b/api/MapConductorCore.api.swift index 5acc751..acf3897 100644 --- a/api/MapConductorCore.api.swift +++ b/api/MapConductorCore.api.swift @@ -17,18 +17,25 @@ import os public enum InternalMapConductorApi { public static let spiGroup: Swift::String } -@_hasMissingDesignatedInitializers final public class LocalTileServer { +@_hasMissingDesignatedInitializers final public class LocalTileServer : @unchecked Swift::Sendable { final public var baseUrl: Swift::String { get } final public func register(routeId: Swift::String, provider: any MapConductorCore::TileProvider) final public func unregister(routeId: Swift::String) + final public func registerDocument(id: Swift::String, contentType: Swift::String, body: Foundation::Data) + final public func unregisterDocument(id: Swift::String) + final public func documentUrl(id: Swift::String) -> Swift::String + final public func registerFiles(routeId: Swift::String, directory: Foundation::URL, fallback: (@Sendable (_ relativePath: Swift::String) -> Foundation::Data?)? = nil) + final public func unregisterFiles(routeId: Swift::String) + final public func filesUrl(routeId: Swift::String) -> Swift::String final public var isListening: Swift::Bool { get } final public func setForceNoStoreCache(_ value: Swift::Bool) final public func urlTemplate(routeId: Swift::String, tileSize: Swift::Int) -> Swift::String final public func urlTemplate(routeId: Swift::String, tileSize: Swift::Int, cacheKey: Swift::String) -> Swift::String + final public func renderLocalTile(url: Foundation::URL, isCancelled: @escaping @Sendable () -> Swift::Bool = { false }) -> Foundation::Data? @available(*, deprecated, message: "`version` is ignored. Use `urlTemplate(routeId:tileSize:)` instead.") final public func urlTemplate(routeId: Swift::String, version: Swift::Int64) -> Swift::String final public func stop() @@ -277,6 +284,9 @@ public enum TileServerRegistry { public static func get(forceNoStoreCache: Swift::Bool) -> MapConductorCore::LocalTileServer public static func setForceNoStoreCache(_ value: Swift::Bool) } +public enum TransparentTile { + public static func png(size: Swift::Int) -> Foundation::Data? +} public typealias Long = Swift::Int64 final public class CoroutineScope { public init() @@ -1106,6 +1116,11 @@ public struct AttributionRule : Swift::Hashable { } public func resolveAttributionRules(_ rules: [MapConductorCore::AttributionRule], camera: any MapConductorCore::MapCameraPositionProtocol) -> [Swift::String] public func resolveMapAttributions(designRules: [MapConductorCore::AttributionRule], rasterLayers: [MapConductorCore::RasterLayer], camera: any MapConductorCore::MapCameraPositionProtocol) -> [Swift::String] +public enum BlankMapStyle { + public static let backgroundColor: Swift::String + public static let json: Swift::String + public static let fileURL: Foundation::URL +} public struct CameraRestriction : Swift::Equatable { public let bounds: MapConductorCore::GeoRectBounds? public let minZoom: Swift::Double? @@ -1452,6 +1467,19 @@ public enum ScreenProjectionRequirement { @discardableResult public static func check(registry: any MapConductorCore::MapServiceRegistry, provider: Swift::String, feature: Swift::String) -> Swift::Bool } +public protocol VectorStyleSupport : AnyObject { + func showStyle(url: Swift::String, attributionRules: [MapConductorCore::AttributionRule]) + func clearStyle() +} +public enum VectorStyleSupportKey : MapConductorCore::MapServiceKey { + public typealias Value = MapConductorCore::VectorStyleSupport +} +final public class VectorStyleAsDesign : MapConductorCore::VectorStyleSupport where State : MapConductorCore::MapViewStateProtocol { + public init(state: State, designId: @escaping (State.ActualMapDesignType) -> Swift::String, designFor: @escaping (_ url: Swift::String, _ attributionRules: [MapConductorCore::AttributionRule]) -> State.ActualMapDesignType) + final public func showStyle(url: Swift::String, attributionRules: [MapConductorCore::AttributionRule]) + final public func clearStyle() + @objc deinit +} extension MapConductorCore::MapViewHolderProtocol { public func buildVisibleRegion(inset: CoreFoundation::CGFloat = 0, requireAllCorners: Swift::Bool = true) -> MapConductorCore::VisibleRegion? public func buildVisibleRegion(size: CoreFoundation::CGSize, inset: CoreFoundation::CGFloat = 0, requireAllCorners: Swift::Bool = true) -> MapConductorCore::VisibleRegion? @@ -2945,11 +2973,3 @@ extension MapConductorCore::DeferredUntilReady : Swift::Sendable {} extension MapConductorCore::MapOverlayScope : Swift::Sendable {} extension MapConductorCore::OverlayCollector : Swift::Sendable {} extension MapConductorCore::TileScheme : Swift::RawRepresentable {} -public enum BlankMapStyle { - public static let backgroundColor: Swift.String - public static let json: Swift.String - public static let fileURL: Foundation.URL -} -public enum TransparentTile { - public static func png(size: Swift.Int) -> Foundation.Data? -} From aaed4899a19aebb89326489eb4056e714a2b93f2 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sat, 10 Oct 2026 14:19:56 -0700 Subject: [PATCH 26/28] feat: integrate vector style support and pending map fixes --- CTilePng.podspec | 20 ++ MapConductorCore.podspec | 6 +- Sources/MapConductorCore/MapViewBase.swift | 6 + .../map/ApplyStyleMutations.swift | 135 ++++++++ .../MapConductorCore/map/MapViewStyle.swift | 155 +++++++++ .../map/MapViewStyleHost.swift | 312 ++++++++++++++++++ .../MapConductorCore/map/StyleMutation.swift | 222 +++++++++++++ .../map/VectorStyleMutationSupport.swift | 117 +++++++ .../map/VectorStyleSupport.swift | 44 +++ .../raster/RasterLayerController.swift | 3 +- .../ApplyStyleMutationsTests.swift | 221 +++++++++++++ .../MapViewStyleHostTests.swift | 199 +++++++++++ .../StyleMutationStoreTests.swift | 190 +++++++++++ api/MapConductorCore.api.swift | 131 +++++++- 14 files changed, 1756 insertions(+), 5 deletions(-) create mode 100644 CTilePng.podspec create mode 100644 Sources/MapConductorCore/map/ApplyStyleMutations.swift create mode 100644 Sources/MapConductorCore/map/MapViewStyle.swift create mode 100644 Sources/MapConductorCore/map/MapViewStyleHost.swift create mode 100644 Sources/MapConductorCore/map/StyleMutation.swift create mode 100644 Sources/MapConductorCore/map/VectorStyleMutationSupport.swift create mode 100644 Tests/MapConductorCoreTests/ApplyStyleMutationsTests.swift create mode 100644 Tests/MapConductorCoreTests/MapViewStyleHostTests.swift create mode 100644 Tests/MapConductorCoreTests/StyleMutationStoreTests.swift diff --git a/CTilePng.podspec b/CTilePng.podspec new file mode 100644 index 0000000..f9ffcd9 --- /dev/null +++ b/CTilePng.podspec @@ -0,0 +1,20 @@ +Pod::Spec.new do |s| + s.name = "CTilePng" + s.version = "1.3.1" + s.summary = "The C shim MapConductorCore's Rust PNG encoder is reached through." + s.license = { :type => "Apache-2.0", :file => "LICENSE" } + s.author = "MapConductor" + s.homepage = "https://github.com/MapConductor/ios-sdk-core" + s.source = { :git => "https://github.com/MapConductor/ios-sdk-core.git", :tag => s.version.to_s } + s.platform = :ios, "15.1" + # Its own pod, not source files inside MapConductorCore. + # + # `TilePngEncoder.swift` says `import CTilePng`, which needs CTilePng to be + # a module. Compiled *into* MapConductorCore the C has no module of its own + # and that import does not resolve -- Swift Package Manager gives it one + # because it is a separate target there, and CocoaPods only does the same if + # it is a separate pod. Without this the pod builds everywhere except where + # it matters: React Native, which consumes the source pod. + s.source_files = "Sources/CTilePng/**/*.{c,h}" + s.public_header_files = "Sources/CTilePng/include/*.h" +end diff --git a/MapConductorCore.podspec b/MapConductorCore.podspec index a0eac42..6633088 100644 --- a/MapConductorCore.podspec +++ b/MapConductorCore.podspec @@ -8,8 +8,10 @@ Pod::Spec.new do |s| s.source = { :git => "https://github.com/MapConductor/ios-sdk-core.git", :tag => s.version.to_s } s.platform = :ios, "15.1" s.swift_version = "5.9" - s.source_files = "Sources/MapConductorCore/**/*.swift", "Sources/CTilePng/**/*.{c,h}" - s.public_header_files = "Sources/CTilePng/include/*.h" + s.source_files = "Sources/MapConductorCore/**/*.swift" + # The C shim is its own pod so that `import CTilePng` resolves. See + # CTilePng.podspec for why it cannot be source files in here. + s.dependency "CTilePng" # The Rust PNG encoder. Marker tiles are rasterised in-process and the # platform encoder is several times slower; MarkerTileRenderer falls back to # it if this is missing, so the pod stays usable either way. diff --git a/Sources/MapConductorCore/MapViewBase.swift b/Sources/MapConductorCore/MapViewBase.swift index ac64f90..6482fab 100644 --- a/Sources/MapConductorCore/MapViewBase.swift +++ b/Sources/MapConductorCore/MapViewBase.swift @@ -120,6 +120,12 @@ open class MapViewCoordinatorBase: NSObject { super.init() } + /// What the map offers the ``MapViewStyle`` installed on it. + /// + /// Every coordinator that derives from this gets one; a provider whose + /// coordinator does not (ArcGIS, the template) holds its own. + public private(set) lazy var styleHost = MapViewStyleHost(serviceRegistry: state.serviceRegistry) + /// スクリーン空間の機能(InfoBubble・マーカーアニメーション)の入口に渡す関門。 /// /// 同期投影を持たないプロバイダで「黙って無反応」にならないようにする。 diff --git a/Sources/MapConductorCore/map/ApplyStyleMutations.swift b/Sources/MapConductorCore/map/ApplyStyleMutations.swift new file mode 100644 index 0000000..db469dc --- /dev/null +++ b/Sources/MapConductorCore/map/ApplyStyleMutations.swift @@ -0,0 +1,135 @@ +import Foundation + +/** + The seven things a renderer has to be able to do for a style to be adjusted + in place. + + A provider implements these against its own SDK and gets + ``applyStyleMutations(_:_:)`` for everything above them — what each mutation + means, which ones can be skipped, and keeping one bad property from costing + the rest. MapLibre and Mapbox name their style APIs differently, so the + adapter has to be per-provider; the decisions do not. + + Values arrive as JSON text, which is what crossed the FFI boundary: the + provider turns it into whatever its SDK wants — an `NSExpression` for + MapLibre here, a `Value` for Mapbox. + + android-sdk-core carries the same protocol, and js-sdk-core does the same + work structurally — there, MapLibre GL JS, Mapbox GL JS and the MapTiler SDK + happen to share their method names, so one applier serves all three. + */ +public protocol StyleMutationTarget { + /** + Whether the renderer has a style up to be changed. + + **False is not failure, and must not be reported as one.** A renderer + with no style loaded yet cannot be asked about layers, so without this + every mutation came back as one the map "cannot" make — which is how an + app got told "N adjustments were not applied" about a map that was + merely still loading, and, under ``VectorStyleMutationSupport``'s + reloading policy, had the adjusted document handed to it for no reason. + Nothing is lost by waiting: the store puts the whole set back when the + style loads. + + Implement it. The default is for a target that is always ready; a + provider whose style arrives asynchronously — which is both of them — + answers whether it has one. + */ + var isReady: Bool { get } + + /** + False for a layer the loaded style does not have. + + Asked only when ``isReady``, so it is about the style's contents and + never about whether there is a style: answering false for "not loaded + yet" is what ``isReady`` exists to stop. + + Only the four property changes ask. ``addLayer(_:_:_:)`` and + ``removeLayer(_:)`` guard themselves, because "is it already there" is a + question only the renderer can answer about a layer it owns. + */ + func hasLayer(_ layerId: String) -> Bool + + func setPaint(_ layerId: String, _ key: String, _ valueJson: String) throws + + func setLayout(_ layerId: String, _ key: String, _ valueJson: String) throws + + /// `"null"` removes the filter. + func setFilter(_ layerId: String, _ filterJson: String) throws + + func setZoomRange(_ layerId: String, _ minZoom: Double, _ maxZoom: Double) throws + + /** + Adds a layer, or does nothing if the renderer already has one with this + id — which is the usual case, because a style reload puts the whole set + back. + */ + func addLayer(_ layerId: String, _ layerJson: String, _ beforeId: String?) throws + + /// A layer the renderer does not have is not an error. + func removeLayer(_ layerId: String) throws +} + +extension StyleMutationTarget { + /// For a target with nothing to wait for. Every real provider overrides it. + public var isReady: Bool { true } +} + +/** + Applies style mutations to a live renderer through `target`. + + The body of a provider's ``VectorStyleMutationSupport``: a provider wires + this into a ``StyleMutationStore`` and registers that, and every provider + then behaves identically by construction. + + - Returns: the mutations it could not apply. A layer the loaded style does + not have, or a property the renderer rejected: the caller is told rather + than left to assume the map looks the way the rules asked. Nothing is + thrown — one bad property must not cost the other three hundred. Empty + while the renderer has no style up, because then there is nothing it + could not do — only something it has not done yet. + */ +public func applyStyleMutations( + _ target: StyleMutationTarget, + _ mutations: [StyleMutation] +) -> [StyleMutation] { + // Not ready is not a refusal. See ``StyleMutationTarget/isReady``. + guard target.isReady else { return [] } + return mutations.filter { mutation in + do { + return try !applyOne(target, mutation) + } catch { + return true + } + } +} + +private func applyOne(_ target: StyleMutationTarget, _ mutation: StyleMutation) throws -> Bool { + switch mutation { + case let .setPaint(layerId, key, value, _): + guard target.hasLayer(layerId) else { return false } + try target.setPaint(layerId, key, value) + case let .setLayout(layerId, key, value, _): + guard target.hasLayer(layerId) else { return false } + try target.setLayout(layerId, key, value) + case let .setFilter(layerId, value, _): + guard target.hasLayer(layerId) else { return false } + try target.setFilter(layerId, value) + case let .setZoomRange(layerId, minZoom, maxZoom, _, _): + guard target.hasLayer(layerId) else { return false } + // The spec's own defaults, for a layer that named neither. Every + // renderer takes both ends at once, so a mutation that changes one + // has to restate the other. + try target.setZoomRange(layerId, minZoom ?? 0, maxZoom ?? 24) + case let .addLayer(layerId, layer, beforeId): + try target.addLayer(layerId, layer, beforeId) + case let .removeLayer(layerId): + try target.removeLayer(layerId) + } + return true +} + +/// For a message naming what would not apply. +public func describeStyleMutations(_ mutations: [StyleMutation]) -> String { + mutations.map(\.target).joined(separator: ", ") +} diff --git a/Sources/MapConductorCore/map/MapViewStyle.swift b/Sources/MapConductorCore/map/MapViewStyle.swift new file mode 100644 index 0000000..59dafdb --- /dev/null +++ b/Sources/MapConductorCore/map/MapViewStyle.swift @@ -0,0 +1,155 @@ +import Foundation + +/** + How a map looks, as a property of the map rather than a layer inside it. + + A vector style *is* the basemap, so passing one to + `XxxMapView(state:style:)` says what it is rather than mounting something + over it. What happens underneath depends on the backend and the app does not + have to know: MapLibre, Mapbox and MapTiler are told the style and draw it + themselves; Google Maps, MapKit, HERE, ArcGIS and the rest are handed raster + tiles rendered from the same style on the device. Either way the same + adjustments produce the same map. + + A protocol rather than a type, for two reasons. Core must not depend on the + style compiler or the rasteriser -- both are optional modules, and one of + them is a megabyte of native code -- so what core holds is the seam and the + modules bring the implementation. And a provider's own styling, which is + nothing like a MapLibre style, can be added later as another conformance + without this changing. + + The concrete types live in the vector style module + (`MapConductorVectorStyle`); an app does not conform to this. + + android-sdk-core and js-sdk-core carry the same seam. + */ +public protocol MapViewStyle { + /** + What identifies this style's content. + + The map re-installs a style whose key changed and leaves alone one whose + key did not. Two values describing the same thing must have the same + key: a style built inline in a `body` is a new value on every + evaluation -- which is exactly what a colour picker produces -- and + keying off identity would reinstall the whole style on every unrelated + state change. + */ + var key: String { get } + + /** + Puts the style on the map. Called once the map has a style loaded, and + again if it loads another one. + + - Returns: the ticket that takes it off again. Disposing must leave the + map as it was found: a style that cannot be fully undone has no + business being installed, because the app will switch away from it. + */ + func install(host: MapStyleHost) -> MapStyleInstallation +} + +/** + A ticket to undo, and a chance to take a change without tearing down. + + Returned by anything that sets something up on a map. A value holding + closures rather than a protocol: everything that hands one out would + otherwise need a type whose only job is to remember how to undo one thing. + */ +public struct MapStyleInstallation { + private let onDispose: () -> Void + private let onUpdate: (MapViewStyle) -> Bool + + /** + - Parameter update: takes `next` in place, when it is near enough to + what is installed, and answers whether it did. + + Without this the whole point is lost. A style whose key changed is + installed again, and installing a style means handing the map a + document -- which is the reload this design exists to avoid. Moving a + colour slider changes the adjustments and nothing else, so the + installed style answers true, applies the difference, and the map + never reloads anything. False is always correct, only slower: the + caller then disposes and installs from scratch. + */ + public init( + dispose: @escaping () -> Void, + update: @escaping (MapViewStyle) -> Bool = { _ in false } + ) { + onDispose = dispose + onUpdate = update + } + + public func dispose() { + onDispose() + } + + public func update(_ next: MapViewStyle) -> Bool { + onUpdate(next) + } + + /// For a style that set nothing up. + public static let none = MapStyleInstallation(dispose: {}) +} + +/** + What a map offers to the style installed on it. + + The provider implements this; a ``MapViewStyle`` uses it and never touches a + provider type. That is what keeps one style implementation working on every + backend. + */ +public protocol MapStyleHost: AnyObject { + /** + Where to look for what this map can do: + ``VectorStyleSupportKey`` to hand over a style document, + ``VectorStyleMutationSupportKey`` to change a loaded one in place, + ``RasterTilePreferenceKey`` for the tile size it would rather have. + */ + var serviceRegistry: MapServiceRegistry { get } + + /// For serving a style document, or tiles rendered from one, to the map. + var tileServer: LocalTileServer { get } + + /** + The vector style the map is drawing now, when it is drawing one. + + Nil on every backend that has no such thing, which is most of them. It + is how a rule set that adjusts "whatever is showing" finds something to + adjust: the style has to be read before a rule can be matched against + its layers, and only the map knows where it came from. + */ + var vectorStyleUrl: String? { get } + + /** + Runs `block` whenever the map finishes loading a style, including the + one it has now if it already has one. + + Everything a style installs on a live renderer is lost when that + renderer loads a document again, for any reason. This is how it gets put + back. + */ + func onStyleLoaded(_ block: @escaping () -> Void) -> MapStyleInstallation + + /** + Adds or updates a raster layer the app did not declare. + + The raster path needs somewhere to put its tiles, and that cannot be the + view's content: the style is a property of the view, so it is installed + from outside. Marker tiling already mounts its layer the same way. + */ + func upsertRaster(_ state: RasterLayerState) + + func removeRaster(id: String) + + /** + Says what the app should know: a rule that matched nothing, an + adjustment this backend cannot make, a style that could not be read. + + Routed to whatever the host gave the style, so a module can report + without knowing how the app logs. + */ + func report(_ diagnostics: [String]) +} + +public extension MapStyleHost { + var vectorStyleUrl: String? { nil } +} diff --git a/Sources/MapConductorCore/map/MapViewStyleHost.swift b/Sources/MapConductorCore/map/MapViewStyleHost.swift new file mode 100644 index 0000000..4ac3825 --- /dev/null +++ b/Sources/MapConductorCore/map/MapViewStyleHost.swift @@ -0,0 +1,312 @@ +import Foundation + +/** + A controller that can mount a raster layer the view's content did not + declare. + + ``RasterLayerController`` already does both of these; this is the name that + lets a caller reach them without knowing which provider's controller it has. + `compositionRasterLayers` replaces the whole set with what the content + declared, so anything mounted from outside would be swept away on the next + pass — `upsert` keeps its ids out of that sweep. + + Two callers need it: marker tiling, and a ``MapViewStyle`` on a backend that + cannot draw a vector style and has to be handed tiles rendered from one. + */ +public protocol RasterLayerMounting: AnyObject { + func upsert(state: RasterLayerState) async + func removeById(_ id: String) async +} + +/** + What a map offers the style installed on it, and the bookkeeping that keeps + it installed. + + One class for every provider. Everything it needs that differs per backend + is reached through the service registry, which every provider already fills + in — ``VectorStyleSupportKey`` for handing over a document, + ``VectorStyleMutationSupportKey`` for changing a loaded one, + ``OverlayControllerRegistryKey`` for mounting tiles. Adding a provider needs + nothing here. + + Most coordinators get one from ``MapViewCoordinatorBase``; a provider whose + coordinator is not one (ArcGIS, the template) holds its own. + + android-sdk's `MapViewStyleEffect` and js-sdk-react's `useMapViewStyle` do + the same work; the shape differs because each framework owns its lifecycle + differently. + */ +public final class MapViewStyleHost: MapStyleHost { + public let serviceRegistry: MapServiceRegistry + + private var installation: MapStyleInstallation? + private var installedKey: String? + private var diagnosticsHandler: (([String]) -> Void)? + + /// How many updates in a row the installed style has refused. See ``apply(_:onDiagnostics:)``. + private var refusedUpdates = 0 + private static let churnThreshold = 5 + + /// Sticky, because a provider can finish loading before anything has + /// asked to be told about it. + private var didLoadStyle = false + private var styleLoadedListeners: [UUID: () -> Void] = [:] + + public init(serviceRegistry: MapServiceRegistry) { + self.serviceRegistry = serviceRegistry + } + + deinit { + installation?.dispose() + } + + // MARK: - Keeping a style installed + + /** + Keeps `style` installed on this map. + + Called from the representable's `makeUIView` and `updateUIView`, which + is every evaluation of the app's `body` — so most calls do nothing. + Three things have to line up and none of them is the view update: + + - **A style whose key did not change must be left alone.** A style built + inline in a `body` is a new value on every evaluation — which is + exactly what a colour picker produces — so comparing values would + reinstall on every unrelated state change. + - **A changed style is usually an adjustment, not a new style.** + Disposing and installing again hands the map a document and reloads + it, which is the cost this whole design exists to avoid. What is + installed is offered the new one first and only replaced if it + refuses. + - **Nil means take it off.** An app that stops passing a style gets the + map it had before, not the one the style left behind. + */ + public func apply(_ style: MapViewStyle?, onDiagnostics: (([String]) -> Void)? = nil) { + diagnosticsHandler = onDiagnostics + guard let style else { + dispose() + return + } + guard let installed = installation else { + installation = style.install(host: self) + installedKey = style.key + return + } + // Nothing changed at all. The key covers the document *and* the + // rules, so an equal key means there is no work -- and doing it + // anyway is not merely wasteful: recompiling re-reports the + // diagnostics, an app that renders them sets state, that evaluates + // the body again, and the two spin against each other. + if installedKey == style.key { return } + + // The adjustments moved. Offer them to what is installed: taking + // them in place is what keeps a slider from reloading the map. + if installed.update(style) { + installedKey = style.key + refusedUpdates = 0 + return + } + + // Refused -- correct, only slower. Refusing every time means the + // style cannot recognise its own successor and the map is rebuilt + // on each change; the usual cause is a value the style compares by + // identity being rebuilt too, a rasteriser held in a `let` on a + // `View` rather than `@State`. + refusedUpdates += 1 + if refusedUpdates == Self.churnThreshold { + MCLog.map( + "style: the installed style has refused \(Self.churnThreshold) updates in a row, " + + "so the map is being torn down and rebuilt on every change. Hold the " + + "rasteriser (and anything else the style compares by identity) in @State " + + "rather than rebuilding it." + ) + } + installed.dispose() + installation = style.install(host: self) + installedKey = style.key + } + + /// Takes the style off. The representable calls this when the view goes. + public func dispose() { + installation?.dispose() + installation = nil + installedKey = nil + } + + /** + Called by the provider once the map has a style up **and** the overlays + are back on it. + + Not when the load starts, and not before the provider has put its own + layers back: a listener that patches a style mid-rebuild patches + something that is about to be replaced. + */ + public func notifyStyleLoaded() { + didLoadStyle = true + styleLoadedListeners.values.forEach { $0() } + } + + // MARK: - MapStyleHost + + public var tileServer: LocalTileServer { TileServerRegistry.get() } + + public var vectorStyleUrl: String? { + serviceRegistry.get(VectorStyleSupportKey.self)?.currentStyleUrl + } + + /** + Runs `block` every time this map finishes loading a style, and once now + if it already has one. + + Everything a style put on a live renderer — paint properties, a layer it + added — is gone when that renderer loads a document again, for any + reason: the app switching basemap, a design change, the provider + rebuilding its view. This is how it goes back on, and it is a registry + rather than one listener because both the mutation store and the style + installation need to hear it. + + A provider with no such thing (Google Maps, MapKit, HERE...) never calls + ``notifyStyleLoaded()``, and a style installed on it is one that was + rasterised into tiles — which survives a basemap change by itself. + */ + public func onStyleLoaded(_ block: @escaping () -> Void) -> MapStyleInstallation { + let token = UUID() + styleLoadedListeners[token] = block + if didLoadStyle { block() } + return MapStyleInstallation(dispose: { [weak self] in + self?.styleLoadedListeners.removeValue(forKey: token) + }) + } + + public func upsertRaster(_ state: RasterLayerState) { + let controllers = rasterMounts() + guard !controllers.isEmpty else { + noRasterMount(state.id) + return + } + Task { @MainActor in + for controller in controllers { await controller.upsert(state: state) } + } + } + + public func removeRaster(id: String) { + let controllers = rasterMounts() + guard !controllers.isEmpty else { return } + Task { @MainActor in + for controller in controllers { await controller.removeById(id) } + } + } + + public func report(_ diagnostics: [String]) { + guard !diagnostics.isEmpty else { return } + if let diagnosticsHandler { + diagnosticsHandler(diagnostics) + } else { + // Never dropped. A rule that matched nothing, or an adjustment + // this backend could not make, is the kind of thing that + // otherwise shows up as "the style nearly worked" with no way to + // find out why. + diagnostics.forEach { MCLog.map("style: \($0)") } + } + } + + /** + The raster controllers this map registered. + + Reached through the overlay registry rather than a per-provider + property, so adding a provider needs nothing here. + */ + /** + Says so when a provider has nowhere to mount one. + + Every provider registers its raster controller in the overlay registry + and so gets ``upsertRaster(_:)`` for free. One that does not would + otherwise show an empty map and say nothing, which is the failure this + whole design is built against. android-sdk reports the same thing from + `BaseMapViewController`. + */ + /** + Said out loud, not logged. + + With no raster controller there is nowhere to put the tiles, so the + style compiles, reports its rules, and draws nothing -- the map simply + keeps the backend's own basemap. Behind a log line that only appears + with `MAPCONDUCTOR_DEBUG_LOG=1`, that reads as "the style silently does + not work", which is exactly how it read for ArcGIS. + */ + private func noRasterMount(_ id: String) { + report([ + "raster layer \(id) was not mounted: this provider registered no raster controller " + + "in its overlay registry, so there is nowhere to put the tiles this style " + + "was rendered into" + ]) + } + + private func rasterMounts() -> [any RasterLayerMounting] { + guard let registry = serviceRegistry.get(OverlayControllerRegistryKey.self) else { return [] } + return registry.all().compactMap { $0 as? any RasterLayerMounting } + } +} + +public extension MapViewCoordinatorBase { + /// See ``MapViewStyleHost/apply(_:onDiagnostics:)``. + func applyStyle(_ style: MapViewStyle?, onDiagnostics: (([String]) -> Void)? = nil) { + styleHost.apply(style, onDiagnostics: onDiagnostics) + } + + /// See ``MapViewStyleHost/dispose()``. + func disposeStyle() { + styleHost.dispose() + } + + /// See ``MapViewStyleHost/notifyStyleLoaded()``. + func notifyStyleLoaded() { + styleHost.notifyStyleLoaded() + } +} + +#if canImport(UIKit) + import SwiftUI + import UIKit + + /** + Keeps a ``MapViewStyle`` applied from inside a pure-SwiftUI map. + + Most providers wrap a `UIView`, so their representable's `updateUIView` + is already the hook that runs on every evaluation of the app's `body`. + ArcGIS and the template draw with SwiftUI views instead and have no such + hook — and `body` itself is the wrong place, because reading a style + there and installing it would be a side effect in a view's description + of itself. + + So they mount this: an empty view whose only job is to have an + `updateUIView`. Zero-sized and hidden, it draws nothing and lays nothing + out. + */ + public struct MapViewStyleApplier: UIViewRepresentable { + private let host: MapViewStyleHost + private let style: MapViewStyle? + private let onDiagnostics: (([String]) -> Void)? + + public init( + host: MapViewStyleHost, + style: MapViewStyle?, + onDiagnostics: (([String]) -> Void)? = nil + ) { + self.host = host + self.style = style + self.onDiagnostics = onDiagnostics + } + + public func makeUIView(context _: Context) -> UIView { + let view = UIView(frame: .zero) + view.isHidden = true + view.isUserInteractionEnabled = false + return view + } + + public func updateUIView(_: UIView, context _: Context) { + host.apply(style, onDiagnostics: onDiagnostics) + } + } +#endif diff --git a/Sources/MapConductorCore/map/StyleMutation.swift b/Sources/MapConductorCore/map/StyleMutation.swift new file mode 100644 index 0000000..b0c1c02 --- /dev/null +++ b/Sources/MapConductorCore/map/StyleMutation.swift @@ -0,0 +1,222 @@ +import Foundation + +/** + One change to one layer of a vector style the map has already loaded. + + This is what lets a style be adjusted without being reloaded. Handing a map + a new style document is the obvious way to change how it looks, and on every + provider it is the expensive way: the renderer drops its tiles, re-reads the + document, re-tessellates, and the overlays the app added have to be put + back. A paint property set in place costs none of that. + + Mutations are produced by the vector style compiler from the same evaluation + that produces the adjusted document, so the two can never disagree about + what the style should look like. A provider that can take them declares + ``VectorStyleMutationSupport``. + + ## Why the values are JSON text + + A style property's value is anything the style spec allows: a string, a + number, or an expression tree. Each provider needs it in its own form -- + MapLibre here wants an `NSExpression`, MapLibre on Android a Gson tree, + MapLibre in a browser the plain parsed value -- so there is no shared typed + representation that saves anyone a conversion. Text is the one form all + three can start from, it is what crossed the FFI boundary anyway, and it is + `Sendable`, which `Any` is not. + + `"null"` means the property had no value, which is also how a renderer is + told to go back to the spec default. + + android-sdk-core and js-sdk-core carry the same type. + */ +public enum StyleMutation: Equatable, Sendable { + case setPaint(layerId: String, key: String, value: String, previous: String) + case setLayout(layerId: String, key: String, value: String, previous: String) + case setFilter(layerId: String, value: String, previous: String) + case setZoomRange( + layerId: String, + minZoom: Double?, + maxZoom: Double?, + previousMinZoom: Double?, + previousMaxZoom: Double? + ) + /** + Adds a layer the style did not have. + + Used for one thing: a background under a style that has none, so that + "everything else muted" looks the same whether the style is drawn by the + map or rasterised into tiles over another basemap. Without it the raster + path leaves the gaps transparent and the two disagree. + */ + case addLayer(layerId: String, layer: String, beforeId: String?) + case removeLayer(layerId: String) + + /// The layer this acts on. Every mutation names one. + public var layerId: String { + switch self { + case let .setPaint(layerId, _, _, _), + let .setLayout(layerId, _, _, _), + let .setFilter(layerId, _, _), + let .setZoomRange(layerId, _, _, _, _), + let .removeLayer(layerId), + let .addLayer(layerId, _, _): + return layerId + } + } + + /** + What this mutation occupies, for working out which of two sets of + mutations replace each other. Two mutations with the same target are the + same change with different values. + */ + public var target: String { + switch self { + case let .setPaint(layerId, key, _, _): return "paint|\(layerId)|\(key)" + case let .setLayout(layerId, key, _, _): return "layout|\(layerId)|\(key)" + case let .setFilter(layerId, _, _): return "filter|\(layerId)" + case let .setZoomRange(layerId, _, _, _, _): return "zoom|\(layerId)" + case let .addLayer(layerId, _, _): return "add|\(layerId)" + case let .removeLayer(layerId): return "add|\(layerId)" + } + } + + /** + What this mutation changes, named the way the style spec names it. + + For telling an app *what* a renderer would not do. The layer is the + wrong thing to name on its own: when a backend has no property for a + spec key, the same key fails on every layer that uses it, so a list of + layers is hundreds of names for one cause while the key is the cause. + */ + public var propertyName: String { + switch self { + case let .setPaint(_, key, _, _), let .setLayout(_, key, _, _): return key + case .setFilter: return "filter" + case .setZoomRange: return "zoom range" + case .addLayer, .removeLayer: return "layer" + } + } + + /// The mutation that puts back what was there, or nil when there is nothing to put back. + public func reversed() -> StyleMutation? { + switch self { + case let .setPaint(layerId, key, value, previous): + return .setPaint(layerId: layerId, key: key, value: previous, previous: value) + case let .setLayout(layerId, key, value, previous): + return .setLayout(layerId: layerId, key: key, value: previous, previous: value) + case let .setFilter(layerId, value, previous): + return .setFilter(layerId: layerId, value: previous, previous: value) + case let .setZoomRange(layerId, minZoom, maxZoom, previousMin, previousMax): + return .setZoomRange( + layerId: layerId, + minZoom: previousMin, + maxZoom: previousMax, + previousMinZoom: minZoom, + previousMaxZoom: maxZoom + ) + case let .addLayer(layerId, _, _): + return .removeLayer(layerId: layerId) + case .removeLayer: + return nil + } + } + + /** + Reads the compiler's `mutations` array. + + An entry this version does not know is skipped rather than fatal: the + array is produced by the native library this host shipped with, so an + unknown op means the two went out of step, and dropping one change is + better than losing every change. + */ + public static func parseList(_ json: String) -> [StyleMutation] { + guard + let data = json.data(using: .utf8), + let array = try? JSONSerialization.jsonObject(with: data) as? [[String: Any]] + else { return [] } + return array.compactMap(parse) + } + + private static func parse(_ obj: [String: Any]) -> StyleMutation? { + let layerId = obj["layerId"] as? String + switch obj["op"] as? String { + case "setPaint": + guard let layerId, let key = obj["key"] as? String else { return nil } + return .setPaint( + layerId: layerId, key: key, + value: jsonText(of: obj["value"]), previous: jsonText(of: obj["previous"]) + ) + case "setLayout": + guard let layerId, let key = obj["key"] as? String else { return nil } + return .setLayout( + layerId: layerId, key: key, + value: jsonText(of: obj["value"]), previous: jsonText(of: obj["previous"]) + ) + case "setFilter": + guard let layerId else { return nil } + return .setFilter( + layerId: layerId, + value: jsonText(of: obj["value"]), previous: jsonText(of: obj["previous"]) + ) + case "setZoomRange": + guard let layerId else { return nil } + return .setZoomRange( + layerId: layerId, + minZoom: obj["minZoom"] as? Double, + maxZoom: obj["maxZoom"] as? Double, + previousMinZoom: obj["previousMinZoom"] as? Double, + previousMaxZoom: obj["previousMaxZoom"] as? Double + ) + case "addLayer": + guard let layerId, obj["layer"] is [String: Any] else { return nil } + return .addLayer( + layerId: layerId, layer: jsonText(of: obj["layer"]), + beforeId: obj["beforeId"] as? String + ) + case "removeLayer": + return layerId.map { .removeLayer(layerId: $0) } + default: + return nil + } + } + + + /** + A JSON node as the text that would produce it. + + `JSONSerialization` refuses a bare string or number as a top-level + value on older systems, so the simple cases are written directly rather + than asking it. + */ + public static func jsonText(of value: Any?) -> String { + switch value { + case nil, is NSNull: + return "null" + case let text as String: + let escaped = text + .replacingOccurrences(of: "\\", with: "\\\\") + .replacingOccurrences(of: "\"", with: "\\\"") + .replacingOccurrences(of: "\n", with: "\\n") + .replacingOccurrences(of: "\r", with: "\\r") + .replacingOccurrences(of: "\t", with: "\\t") + return "\"\(escaped)\"" + case let flag as Bool where type(of: value!) == type(of: NSNumber(value: true)): + return flag ? "true" : "false" + case let number as NSNumber: + // `true` and `false` arrive as NSNumber too; the case above + // catches them by their boxed type. + if CFGetTypeID(number) == CFBooleanGetTypeID() { + return number.boolValue ? "true" : "false" + } + return number.stringValue + default: + guard + let value, + JSONSerialization.isValidJSONObject(value), + let data = try? JSONSerialization.data(withJSONObject: value, options: [.sortedKeys]), + let text = String(data: data, encoding: .utf8) + else { return "null" } + return text + } + } +} diff --git a/Sources/MapConductorCore/map/VectorStyleMutationSupport.swift b/Sources/MapConductorCore/map/VectorStyleMutationSupport.swift new file mode 100644 index 0000000..78c4135 --- /dev/null +++ b/Sources/MapConductorCore/map/VectorStyleMutationSupport.swift @@ -0,0 +1,117 @@ +import Foundation + +/** + A map that can be told to change a loaded style in place. + + Separate from ``VectorStyleSupport``, which is about making a style *be* the + basemap. This one is about changing the one that is already up, without the + reload that would otherwise cost every tile on screen and every overlay the + app added. A provider declares it under ``VectorStyleMutationSupportKey``. + + Not every provider can take every change: MapLibre here exposes its paint + properties as typed `NSExpression`s rather than by name, so a raw style-spec + key it has no mapping for cannot be set. That is why ``apply(_:)`` answers + with what it could not do instead of returning nothing -- a caller that + silently assumed success would show a map that is half adjusted and say + nothing about it. + + android-sdk-core and js-sdk-core carry the same capability. + */ +public protocol VectorStyleMutationSupport: AnyObject { + /** + Applies `mutations` to the live style, replacing any set applied before: + anything the previous set changed and this one does not is put back the + way it was. + + - Returns: the mutations that could not be applied, empty when all were. + */ + func apply(_ mutations: [StyleMutation]) -> [StyleMutation] + + /// Puts back everything ``apply(_:)`` changed. + func clear() +} + +/// ``VectorStyleMutationSupport`` の登録キー。 +/// +/// 宣言しないプロバイダは「生きているスタイルは触れない」。スタイル調整は +/// その場合、文書を差し替えるか(地図が読み直す)、ラスター経路で描き直す。 +public enum VectorStyleMutationSupportKey: MapServiceKey { + public typealias Value = VectorStyleMutationSupport +} + +/** + The bookkeeping every provider's ``VectorStyleMutationSupport`` needs, so no + provider has to get it right twice. + + Two things are easy to miss and both show up as "the adjustment worked, and + then stopped": + + - **Replacing a set has to undo what it drops.** Moving a slider sends a + whole new set each time. A property the new set no longer mentions must go + back to the value the style gave it -- and only the mutation knows that + value, because by now the renderer's own idea of it is the one this put + there. + - **A style load wipes everything.** The app switching basemap, the provider + reloading, a design change: whatever the reason, the renderer comes back + with the document's own values and nothing this applied. The provider + calls ``onStyleLoaded()`` and the whole set goes on again. + + - Parameter applyNow: puts mutations on the live style and returns the ones + it could not. Called on whatever thread ``apply(_:)`` was called on; a + provider whose renderer is main-thread-only hops there itself. + */ +public final class StyleMutationStore: VectorStyleMutationSupport, @unchecked Sendable { + private let lock = NSLock() + private let applyNow: ([StyleMutation]) -> [StyleMutation] + private var current: [StyleMutation] = [] + + public init(applyNow: @escaping ([StyleMutation]) -> [StyleMutation]) { + self.applyNow = applyNow + } + + public func apply(_ mutations: [StyleMutation]) -> [StyleMutation] { + lock.lock() + let targets = Set(mutations.map(\.target)) + let restores = current.filter { !targets.contains($0.target) }.compactMap { $0.reversed() } + current = mutations + lock.unlock() + + // Restores first: a property moving from one rule's value to no rule + // at all must pass through the style's own value, not stay on the old + // one because the new set happened to be applied first. + // + // Nothing is logged from here. What could not be applied is the + // caller's to report -- it has the app's diagnostics callback. + return applyNow(restores + mutations) + } + + public func clear() { + lock.lock() + let restores = current.compactMap { $0.reversed() } + current = [] + lock.unlock() + if !restores.isEmpty { _ = applyNow(restores) } + } + + /** + Re-applies everything after the map has loaded a style. + + The provider calls this from whatever it has that fires on a style being + ready. Without it an adjustment survives only until the next design + change, which is the kind of bug that is found weeks later by someone + switching basemap with a slider open. + */ + public func onStyleLoaded() { + lock.lock() + let again = current + lock.unlock() + if !again.isEmpty { _ = applyNow(again) } + } + + /// What is applied right now. For tests and diagnostics. + public var applied: [StyleMutation] { + lock.lock() + defer { lock.unlock() } + return current + } +} diff --git a/Sources/MapConductorCore/map/VectorStyleSupport.swift b/Sources/MapConductorCore/map/VectorStyleSupport.swift index 9e33848..afb7022 100644 --- a/Sources/MapConductorCore/map/VectorStyleSupport.swift +++ b/Sources/MapConductorCore/map/VectorStyleSupport.swift @@ -36,6 +36,25 @@ public protocol VectorStyleSupport: AnyObject { is left alone. */ func clearStyle() + + /** + Where the style the map is drawing came from, when that is knowable. + + This is what lets a rule set adjust *whatever is showing* rather than a + style the app had to name: the document has to be read before a rule can + be matched against its layers, and only the provider knows where it came + from. + + Nil when it is not a URL anything can fetch -- a provider's own named + design (`mapbox://styles/mapbox/standard`), a style that needs a key + this does not have. A caller that wanted it says so and leaves the map + alone rather than showing something unstyled. + */ + var currentStyleUrl: String? { get } +} + +public extension VectorStyleSupport { + var currentStyleUrl: String? { nil } } /// ``VectorStyleSupport`` の登録キー。 @@ -67,6 +86,7 @@ public final class VectorStyleAsDesign: VectorStyle private weak var state: State? private let designId: (State.ActualMapDesignType) -> String private let designFor: (String, [AttributionRule]) -> State.ActualMapDesignType + private let urlOf: ((State.ActualMapDesignType) -> String?)? private var installed: State.ActualMapDesignType? private var installedUrl: String? @@ -76,13 +96,37 @@ public final class VectorStyleAsDesign: VectorStyle public init( state: State, designId: @escaping (State.ActualMapDesignType) -> String, + urlOf: ((State.ActualMapDesignType) -> String?)? = nil, designFor: @escaping (_ url: String, _ attributionRules: [AttributionRule]) -> State.ActualMapDesignType ) { self.state = state self.designId = designId + self.urlOf = urlOf self.designFor = designFor } + /** + Where the design **the app chose** points, when it points anywhere + fetchable. + + Deliberately not the URL this capability installed. That one is the + document the style module served a moment ago, and it is unregistered + from the tile server the instant the style comes off -- so answering + with it turns "adjust whatever is showing" into a 404 against our own + corpse. When one of ours is up, the honest answer is the design it + replaced. + + Nil unless the provider supplied `urlOf`, and nil from that for a design + that is not a plain style document -- a provider's own named basemap, or + one that needs a key this does not have. + */ + public var currentStyleUrl: String? { + guard let urlOf else { return nil } + if installed != nil { return previous.flatMap(urlOf) } + guard let state else { return nil } + return urlOf(state.mapDesignType) + } + public func showStyle(url: String, attributionRules: [AttributionRule]) { pendingClear?.cancel() pendingClear = nil diff --git a/Sources/MapConductorCore/raster/RasterLayerController.swift b/Sources/MapConductorCore/raster/RasterLayerController.swift index f894432..c5adda8 100644 --- a/Sources/MapConductorCore/raster/RasterLayerController.swift +++ b/Sources/MapConductorCore/raster/RasterLayerController.swift @@ -1,4 +1,5 @@ -open class RasterLayerController: OverlayControllerProtocol, SlottedOverlayController +open class RasterLayerController: OverlayControllerProtocol, SlottedOverlayController, + RasterLayerMounting where Renderer.ActualLayer == ActualLayer { public typealias StateType = RasterLayerState public typealias EntityType = RasterLayerEntity diff --git a/Tests/MapConductorCoreTests/ApplyStyleMutationsTests.swift b/Tests/MapConductorCoreTests/ApplyStyleMutationsTests.swift new file mode 100644 index 0000000..78ce76a --- /dev/null +++ b/Tests/MapConductorCoreTests/ApplyStyleMutationsTests.swift @@ -0,0 +1,221 @@ +import XCTest + +@testable import MapConductorCore + +/** + The body of every provider's mutation support, against a renderer that only + records. + + Kept in step with `ApplyStyleMutationsTest` on Android and + `applyStyleMutations.test.mjs` on the web. + */ +final class ApplyStyleMutationsTests: XCTestCase { + private final class Recorder: StyleMutationTarget { + var calls: [String] = [] + var layers: Set = ["roads", "labels"] + var refuse: String? + var ready = true + + var isReady: Bool { ready } + + func hasLayer(_ layerId: String) -> Bool { layers.contains(layerId) } + + func setPaint(_ layerId: String, _ key: String, _ valueJson: String) throws { + if key == refuse { throw Failure.refused } + calls.append("paint \(layerId) \(key)=\(valueJson)") + } + + func setLayout(_ layerId: String, _ key: String, _ valueJson: String) throws { + calls.append("layout \(layerId) \(key)=\(valueJson)") + } + + func setFilter(_ layerId: String, _ filterJson: String) throws { + calls.append("filter \(layerId)=\(filterJson)") + } + + func setZoomRange(_ layerId: String, _ minZoom: Double, _ maxZoom: Double) throws { + calls.append("zoom \(layerId)=\(minZoom)..\(maxZoom)") + } + + func addLayer(_ layerId: String, _ layerJson: String, _ beforeId: String?) throws { + calls.append("add \(layerId) \(layerJson) before=\(beforeId ?? "nil")") + } + + func removeLayer(_ layerId: String) throws { + layers.remove(layerId) + calls.append("remove \(layerId)") + } + + enum Failure: Error { case refused } + } + + func testSetsPaintAndLayoutProperties() { + let target = Recorder() + let unapplied = applyStyleMutations( + target, + [ + .setPaint(layerId: "roads", key: "line-color", value: "\"#fff\"", previous: "\"#888\""), + .setLayout(layerId: "labels", key: "visibility", value: "\"none\"", previous: "null"), + ] + ) + + XCTAssertTrue(unapplied.isEmpty) + XCTAssertEqual( + target.calls, + ["paint roads line-color=\"#fff\"", "layout labels visibility=\"none\""] + ) + } + + /// Every renderer takes both ends of a zoom range at once, so a mutation + /// that changes one has to restate the other — and a layer that named + /// neither gets the spec's own defaults. + func testAZoomRangeRestatesBothEnds() { + let target = Recorder() + _ = applyStyleMutations( + target, + [ + .setZoomRange( + layerId: "roads", minZoom: 5, maxZoom: nil, + previousMinZoom: nil, previousMaxZoom: nil + ), + ] + ) + XCTAssertEqual(target.calls, ["zoom roads=5.0..24.0"]) + } + + /// A layer the style does not have is not a crash and not a silent pass: + /// it comes back, and the caller says so. + func testWhatTheStyleHasNoLayerForComesBack() { + let target = Recorder() + let unapplied = applyStyleMutations( + target, + [ + .setPaint(layerId: "roads", key: "line-color", value: "\"#fff\"", previous: "null"), + .setPaint(layerId: "nope", key: "line-color", value: "\"#fff\"", previous: "null"), + ] + ) + XCTAssertEqual(unapplied.count, 1) + XCTAssertEqual(unapplied.first?.layerId, "nope") + XCTAssertEqual(target.calls.count, 1, "the good one still went through") + } + + /// One property the renderer rejects must not cost the other three hundred. + func testAThrowingPropertyIsReportedNotPropagated() { + let target = Recorder() + target.refuse = "line-gradient" + let unapplied = applyStyleMutations( + target, + [ + .setPaint(layerId: "roads", key: "line-gradient", value: "[]", previous: "null"), + .setPaint(layerId: "roads", key: "line-color", value: "\"#fff\"", previous: "null"), + ] + ) + XCTAssertEqual(unapplied.count, 1) + XCTAssertEqual(target.calls, ["paint roads line-color=\"#fff\""]) + } + + func testAddsAndRemovesALayer() { + let target = Recorder() + _ = applyStyleMutations( + target, + [.addLayer(layerId: "bg", layer: #"{"id":"bg","type":"background"}"#, beforeId: "roads")] + ) + XCTAssertEqual(target.calls, [#"add bg {"id":"bg","type":"background"} before=roads"#]) + + target.calls = [] + _ = applyStyleMutations(target, [.removeLayer(layerId: "roads")]) + XCTAssertEqual(target.calls, ["remove roads"]) + } + + /** + Adding and removing go through whatever the layer is, every time. + + The renderer decides what to do about a layer that is already there, or + already gone — only it can say. Putting the whole set back after a style + reload depends on this: a layer missing from the reloaded style must + still be added, and `hasLayer` cannot be trusted to notice. + */ + func testAddAndRemoveAreNotGuardedHere() { + let target = Recorder() + let unapplied = applyStyleMutations( + target, + [ + .addLayer(layerId: "roads", layer: #"{"id":"roads","type":"background"}"#, beforeId: nil), + .removeLayer(layerId: "gone"), + ] + ) + XCTAssertTrue(unapplied.isEmpty) + XCTAssertEqual( + target.calls, + [#"add roads {"id":"roads","type":"background"} before=nil"#, "remove gone"] + ) + } + + /** + No style yet is "not done" rather than "cannot be done". + + Conflating the two is what told an app "N adjustments were not applied: + this map cannot set those properties" about a map that was merely still + loading — and under the reloading policy it then handed the map the + adjusted document, which is the reload this design exists to avoid. + Nothing is lost by waiting: the store puts the whole set back when the + style loads. + */ + func testNothingIsReportedWhileThereIsNoStyle() { + let target = Recorder() + target.ready = false + + let unapplied = applyStyleMutations( + target, + [ + .setPaint(layerId: "roads", key: "line-color", value: "\"#fff\"", previous: "null"), + .setPaint(layerId: "nope", key: "line-color", value: "\"#fff\"", previous: "null"), + ] + ) + + XCTAssertTrue(unapplied.isEmpty) + XCTAssertTrue(target.calls.isEmpty, "not even attempted") + } + + /// Once it is ready, the judgement comes back exactly as before. + func testTheJudgementComesBackOnceReady() { + let target = Recorder() + let paint = StyleMutation.setPaint( + layerId: "nope", key: "line-color", value: "\"#fff\"", previous: "null") + + target.ready = false + XCTAssertTrue(applyStyleMutations(target, [paint]).isEmpty) + + target.ready = true + XCTAssertEqual(applyStyleMutations(target, [paint]).count, 1) + } + + /** + The default is "always ready", so a driver outside this repo that has + not implemented it behaves as it did before — a compatibility default, + not a recommendation. + */ + func testIsReadyDefaultsToTrue() { + struct Plain: StyleMutationTarget { + func hasLayer(_ layerId: String) -> Bool { false } + func setPaint(_ layerId: String, _ key: String, _ valueJson: String) throws {} + func setLayout(_ layerId: String, _ key: String, _ valueJson: String) throws {} + func setFilter(_ layerId: String, _ filterJson: String) throws {} + func setZoomRange(_ layerId: String, _ minZoom: Double, _ maxZoom: Double) throws {} + func addLayer(_ layerId: String, _ layerJson: String, _ beforeId: String?) throws {} + func removeLayer(_ layerId: String) throws {} + } + + XCTAssertTrue(Plain().isReady) + XCTAssertEqual( + applyStyleMutations( + Plain(), + [ + .setPaint( + layerId: "roads", key: "line-color", value: "\"#fff\"", previous: "null") + ] + ).count, + 1 + ) + } +} diff --git a/Tests/MapConductorCoreTests/MapViewStyleHostTests.swift b/Tests/MapConductorCoreTests/MapViewStyleHostTests.swift new file mode 100644 index 0000000..08b2029 --- /dev/null +++ b/Tests/MapConductorCoreTests/MapViewStyleHostTests.swift @@ -0,0 +1,199 @@ +import XCTest + +@testable import MapConductorCore + +/** + The decision table of ``MapViewStyleHost/apply(_:onDiagnostics:)``. + + The only part of this class that carries a decision is when to install + again and when to leave things alone; the rest is handing things through to + a provider. And that condition was once inverted, unnoticed: **the same key + called `update`** (recompile → diagnostics → state → another `body` → + round again, which the user saw as the bottom-left panel flickering), and + **a changed key never called `update`** (dispose and install every time, + which is the reload the whole delta-compiling design exists to avoid). + Both are the kind of break that compiles and still draws a map, so the + table is written down here. + + Kept in step with android-sdk's `MapViewStyleHostTest` and js-sdk-core's + `MapViewStyleHost.test.mjs`. + */ +final class MapViewStyleHostTests: XCTestCase { + /// Records what it was asked to do, and nothing else. + private struct RecordingStyle: MapViewStyle { + let key: String + let calls: Calls + /// Whether `update` takes it. False means the caller disposes and + /// installs from scratch. A closure so the answer can change after + /// the style is installed (see `testAnAcceptedUpdateResetsTheRun`). + let takesUpdates: () -> Bool + + func install(host: MapStyleHost) -> MapStyleInstallation { + calls.record("install(\(key))") + let key = key + let calls = calls + let takesUpdates = takesUpdates + return MapStyleInstallation( + dispose: { calls.record("dispose(\(key))") }, + update: { next in + calls.record("update(\(key) -> \(next.key))") + return takesUpdates() + } + ) + } + } + + /// A reference box, because `MapViewStyle` is a value and the closures + /// it hands out are captured. + private final class Calls { + private(set) var recorded: [String] = [] + func record(_ call: String) { recorded.append(call) } + func clear() { recorded = [] } + } + + private var calls = Calls() + + override func setUp() { + super.setUp() + calls = Calls() + } + + private func host() -> MapViewStyleHost { + MapViewStyleHost(serviceRegistry: MutableMapServiceRegistry()) + } + + private func style(_ key: String, takesUpdates: Bool = true) -> RecordingStyle { + RecordingStyle(key: key, calls: calls, takesUpdates: { takesUpdates }) + } + + private func style(_ key: String, takesUpdates: @escaping () -> Bool) -> RecordingStyle { + RecordingStyle(key: key, calls: calls, takesUpdates: takesUpdates) + } + + func testTheFirstApplyInstalls() { + // Held in a `let`: the host disposes what it installed when it goes, + // so a temporary would install and immediately take it back off. + let host = host() + host.apply(style("a")) + XCTAssertEqual(calls.recorded, ["install(a)"]) + } + + /** + An unchanged key does nothing. Inverted, this was the flicker: the + recompile is not merely wasted work, it re-reports the diagnostics, and + an app that renders them sets state and asks for another `body`. + */ + func testAnUnchangedKeyDoesNothing() { + let host = host() + host.apply(style("a")) + calls.clear() + + // Different values, same content -- which is what a style built + // inline in a `body` produces on every evaluation. + host.apply(style("a")) + host.apply(style("a")) + + XCTAssertEqual(calls.recorded, []) + } + + /** + A changed key is offered to what is installed before anything is torn + down. A slider that does not reload the map is this one line. + */ + func testAChangedKeyIsOfferedBeforeBeingReinstalled() { + let host = host() + host.apply(style("a")) + calls.clear() + + host.apply(style("b")) + + XCTAssertEqual(calls.recorded, ["update(a -> b)"]) + } + + /// Once an update is taken, the new key is what "unchanged" means. + func testAnAcceptedKeyBecomesTheInstalledOne() { + let host = host() + host.apply(style("a")) + host.apply(style("b")) + calls.clear() + + host.apply(style("b")) + + XCTAssertEqual(calls.recorded, []) + } + + func testARefusedUpdateDisposesAndInstalls() { + let host = host() + host.apply(style("a", takesUpdates: false)) + calls.clear() + + host.apply(style("b", takesUpdates: false)) + + XCTAssertEqual(calls.recorded, ["update(a -> b)", "dispose(a)", "install(b)"]) + } + + /** + A style with no `update` of its own takes the protocol's default, + which is "refused". If that ever read as "took it", a new key would be + recorded against an installation that never saw it. + */ + func testAStyleThatCannotUpdateIsReinstalled() { + struct Plain: MapViewStyle { + let key: String + let calls: Calls + + func install(host: MapStyleHost) -> MapStyleInstallation { + calls.record("install(\(key))") + let key = key + let calls = calls + return MapStyleInstallation(dispose: { calls.record("dispose(\(key))") }) + } + } + let host = host() + host.apply(Plain(key: "a", calls: calls)) + calls.clear() + + host.apply(Plain(key: "b", calls: calls)) + + XCTAssertEqual(calls.recorded, ["dispose(a)", "install(b)"]) + } + + /// Nil takes it off: the app gets the map it had, not the one the style + /// left behind. + func testNilTakesItOff() { + let host = host() + host.apply(style("a")) + calls.clear() + + host.apply(nil) + XCTAssertEqual(calls.recorded, ["dispose(a)"]) + + // And the same key afterwards installs rather than being left alone. + calls.clear() + host.apply(style("a")) + XCTAssertEqual(calls.recorded, ["install(a)"]) + } + + /** + Only a *run* of refusals is a problem, so one that is taken starts the + count over. + + The diagnostic itself is not asserted here: ``MCLog`` writes to + `os_log` with no seam to read it back, unlike android-sdk's + `MapDiagnostics.sink`. What is checked is that the run is counted the + way the threshold assumes -- consecutively. + */ + func testAnAcceptedUpdateResetsTheRun() { + let host = host() + var takes = false + host.apply(style("k0", takesUpdates: { takes })) + for index in 0..<4 { host.apply(style("r\(index)", takesUpdates: { takes })) } + calls.clear() + + takes = true + host.apply(style("ok", takesUpdates: { takes })) + + // Taken in place: nothing torn down, nothing installed again. + XCTAssertEqual(calls.recorded, ["update(r3 -> ok)"]) + } +} diff --git a/Tests/MapConductorCoreTests/StyleMutationStoreTests.swift b/Tests/MapConductorCoreTests/StyleMutationStoreTests.swift new file mode 100644 index 0000000..9804774 --- /dev/null +++ b/Tests/MapConductorCoreTests/StyleMutationStoreTests.swift @@ -0,0 +1,190 @@ +import XCTest + +@testable import MapConductorCore + +/** + The two things a provider would otherwise have to remember on its own, and + both of which look fine until they do not: a replaced set has to undo what + it dropped, and a style load wipes everything that was applied. + + Kept in step with `StyleMutationStoreTest` on Android. + */ +final class StyleMutationStoreTests: XCTestCase { + private var applied: [StyleMutation] = [] + + override func setUp() { + super.setUp() + applied = [] + } + + private func store(unsupported: @escaping (StyleMutation) -> Bool = { _ in false }) + -> StyleMutationStore + { + StyleMutationStore { [weak self] mutations in + self?.applied.append(contentsOf: mutations) + return mutations.filter(unsupported) + } + } + + private func paint(_ layer: String, _ key: String, _ value: String, _ previous: String) + -> StyleMutation + { + .setPaint(layerId: layer, key: key, value: value, previous: previous) + } + + func testReplacingASetPutsBackWhatTheNewOneNoLongerMentions() { + let store = store() + _ = store.apply([ + paint("roads", "line-color", "\"#fff\"", "\"#888\""), + paint("water", "fill-color", "\"#000\"", "\"#a0c8f0\""), + ]) + applied = [] + + // The second set drops the water rule entirely. + _ = store.apply([paint("roads", "line-color", "\"#f00\"", "\"#888\"")]) + + XCTAssertEqual( + applied, + [ + paint("water", "fill-color", "\"#a0c8f0\"", "\"#000\""), + paint("roads", "line-color", "\"#f00\"", "\"#888\""), + ], + "water goes back to the style's own colour, then roads take the new one" + ) + } + + /// The restore has to be sent before the new value, or a property that + /// both sets touch would be put back to the style's value after being + /// given its new one. + func testRestoresGoOutBeforeTheNewValues() { + let store = store() + _ = store.apply([paint("a", "line-color", "\"#1\"", "\"#0\"")]) + applied = [] + _ = store.apply([paint("b", "line-color", "\"#2\"", "\"#0\"")]) + + XCTAssertEqual(applied.first?.layerId, "a") + XCTAssertEqual(applied.last?.layerId, "b") + } + + func testClearPutsEverythingBack() { + let store = store() + _ = store.apply([paint("roads", "line-color", "\"#fff\"", "\"#888\"")]) + applied = [] + + store.clear() + + XCTAssertEqual(applied, [paint("roads", "line-color", "\"#888\"", "\"#fff\"")]) + XCTAssertTrue(store.applied.isEmpty) + } + + /// A design change, a provider reloading, anything: the renderer comes + /// back with the document's values and nothing that was applied over + /// them. Without this the adjustment survives until the first basemap + /// switch and then quietly stops. + func testAStyleLoadPutsTheWholeSetOnAgain() { + let store = store() + let mutations = [paint("roads", "line-color", "\"#fff\"", "\"#888\"")] + _ = store.apply(mutations) + applied = [] + + store.onStyleLoaded() + + XCTAssertEqual(applied, mutations) + } + + func testNothingAppliedMeansNothingToDoOnAStyleLoad() { + store().onStyleLoaded() + XCTAssertTrue(applied.isEmpty) + } + + /// MapLibre here cannot set every spec key by name. The caller has to be + /// told which ones, rather than being left to assume the map looks the + /// way the rules asked. + func testWhatTheMapCouldNotDoComesBack() { + let store = store(unsupported: { mutation in + if case let .setPaint(_, key, _, _) = mutation { return key == "line-gradient" } + return false + }) + let failed = store.apply([ + paint("roads", "line-color", "\"#fff\"", "\"#888\""), + paint("roads", "line-gradient", "[\"interpolate\"]", "null"), + ]) + XCTAssertEqual(failed.count, 1) + XCTAssertEqual(failed.first?.target, "paint|roads|line-gradient") + } + + func testReadsWhatTheCompilerWrites() { + let parsed = StyleMutation.parseList( + """ + [ + {"op":"setPaint","layerId":"roads","key":"line-color","value":"#fff","previous":null}, + {"op":"setLayout","layerId":"labels","key":"visibility","value":"none","previous":"visible"}, + {"op":"setFilter","layerId":"roads","value":["==","class","motorway"],"previous":null}, + {"op":"setZoomRange","layerId":"roads","minZoom":5,"maxZoom":null, + "previousMinZoom":null,"previousMaxZoom":null}, + {"op":"addLayer","layerId":"bg","layer":{"id":"bg","type":"background"},"beforeId":"water"}, + {"op":"somethingFromTheFuture","layerId":"roads"} + ] + """ + ) + + XCTAssertEqual(parsed.count, 5, "the unknown op is dropped, the rest survive") + // A string value keeps its quotes, or no renderer could read it back. + XCTAssertEqual(parsed[0], paint("roads", "line-color", "\"#fff\"", "null")) + XCTAssertEqual( + parsed[2], + .setFilter(layerId: "roads", value: "[\"==\",\"class\",\"motorway\"]", previous: "null") + ) + XCTAssertEqual( + parsed[3], + .setZoomRange( + layerId: "roads", minZoom: 5, maxZoom: nil, + previousMinZoom: nil, previousMaxZoom: nil + ) + ) + XCTAssertEqual(parsed[4].layerId, "bg") + } + + /// Rubbish in must not take the map down; it means no adjustment. + func testAnswersWithNothingRatherThanThrowing() { + XCTAssertTrue(StyleMutation.parseList("not json").isEmpty) + XCTAssertTrue(StyleMutation.parseList("{}").isEmpty) + XCTAssertTrue(StyleMutation.parseList("[{\"op\":\"setPaint\"}]").isEmpty) + } + + /// Applying a set and then its reverse has to leave the map where it + /// started, whatever the values were. + func testEveryMutationUndoesItself() { + let mutations: [StyleMutation] = [ + paint("a", "line-color", "\"#fff\"", "\"#888\""), + .setLayout(layerId: "b", key: "visibility", value: "\"none\"", previous: "null"), + .setFilter(layerId: "c", value: "[\"all\"]", previous: "null"), + .setZoomRange( + layerId: "d", minZoom: 5, maxZoom: 12, previousMinZoom: nil, previousMaxZoom: 22 + ), + ] + for mutation in mutations { + XCTAssertEqual( + mutation.reversed()?.reversed(), mutation, + "\(mutation.target) did not survive a round trip" + ) + } + } + + func testAddingALayerIsUndoneByRemovingIt() { + let add = StyleMutation.addLayer( + layerId: "bg", layer: #"{"id":"bg","type":"background"}"#, beforeId: nil) + XCTAssertEqual(add.reversed(), .removeLayer(layerId: "bg")) + } + + /// Booleans arrive from `JSONSerialization` as `NSNumber` and must not + /// come out as `1`: a renderer reading back `1` where the style said + /// `true` is a renderer given a different style. + func testWritesBooleansAsBooleans() { + XCTAssertEqual(StyleMutation.jsonText(of: true), "true") + XCTAssertEqual(StyleMutation.jsonText(of: false), "false") + XCTAssertEqual(StyleMutation.jsonText(of: 2), "2") + XCTAssertEqual(StyleMutation.jsonText(of: "it \"quotes\""), "\"it \\\"quotes\\\"\"") + XCTAssertEqual(StyleMutation.jsonText(of: nil), "null") + } +} diff --git a/api/MapConductorCore.api.swift b/api/MapConductorCore.api.swift index acf3897..d5caa42 100644 --- a/api/MapConductorCore.api.swift +++ b/api/MapConductorCore.api.swift @@ -202,6 +202,9 @@ extension MapConductorCore::MapViewBase where TopContent == SwiftUICore::EmptyVi get } @_Concurrency::MainActor public init(state: State, handlers: MapConductorCore::MapViewHandlers) + @_Concurrency::MainActor public var styleHost: MapConductorCore::MapViewStyleHost { + get + } @_Concurrency::MainActor public func screenProjectionGate(feature: Swift::String) -> () -> Swift::Bool @_Concurrency::MainActor public var onMapLoaded: MapConductorCore::OnMapLoadedHandler? { get @@ -1102,6 +1105,23 @@ public struct MarkerIconMetrics { @_Concurrency::MainActor @preconcurrency @objc required dynamic public init?(coder: Foundation::NSCoder) @objc deinit } +public protocol StyleMutationTarget { + var isReady: Swift::Bool { get } + func hasLayer(_ layerId: Swift::String) -> Swift::Bool + func setPaint(_ layerId: Swift::String, _ key: Swift::String, _ valueJson: Swift::String) throws + func setLayout(_ layerId: Swift::String, _ key: Swift::String, _ valueJson: Swift::String) throws + func setFilter(_ layerId: Swift::String, _ filterJson: Swift::String) throws + func setZoomRange(_ layerId: Swift::String, _ minZoom: Swift::Double, _ maxZoom: Swift::Double) throws + func addLayer(_ layerId: Swift::String, _ layerJson: Swift::String, _ beforeId: Swift::String?) throws + func removeLayer(_ layerId: Swift::String) throws +} +extension MapConductorCore::StyleMutationTarget { + public var isReady: Swift::Bool { + get + } +} +public func applyStyleMutations(_ target: any MapConductorCore::StyleMutationTarget, _ mutations: [MapConductorCore::StyleMutation]) -> [MapConductorCore::StyleMutation] +public func describeStyleMutations(_ mutations: [MapConductorCore::StyleMutation]) -> Swift::String public struct AttributionRule : Swift::Hashable { public let attribution: Swift::String public let minZoom: Swift::Int? @@ -1463,19 +1483,125 @@ final public class MapOverlayRegistry { final public func getAll() -> [any MapConductorCore::MapOverlayProtocol] @objc deinit } +public protocol MapViewStyle { + var key: Swift::String { get } + func install(host: any MapConductorCore::MapStyleHost) -> MapConductorCore::MapStyleInstallation +} +public struct MapStyleInstallation { + public init(dispose: @escaping () -> Swift::Void, update: @escaping (any MapConductorCore::MapViewStyle) -> Swift::Bool = { _ in false }) + public func dispose() + public func update(_ next: any MapConductorCore::MapViewStyle) -> Swift::Bool + public static let none: MapConductorCore::MapStyleInstallation +} +public protocol MapStyleHost : AnyObject { + var serviceRegistry: any MapConductorCore::MapServiceRegistry { get } + var tileServer: MapConductorCore::LocalTileServer { get } + var vectorStyleUrl: Swift::String? { get } + func onStyleLoaded(_ block: @escaping () -> Swift::Void) -> MapConductorCore::MapStyleInstallation + func upsertRaster(_ state: MapConductorCore::RasterLayerState) + func removeRaster(id: Swift::String) + func report(_ diagnostics: [Swift::String]) +} +extension MapConductorCore::MapStyleHost { + public var vectorStyleUrl: Swift::String? { + get + } +} +public protocol RasterLayerMounting : AnyObject { + func upsert(state: MapConductorCore::RasterLayerState) async + func removeById(_ id: Swift::String) async +} +final public class MapViewStyleHost : MapConductorCore::MapStyleHost { + final public let serviceRegistry: any MapConductorCore::MapServiceRegistry + public init(serviceRegistry: any MapConductorCore::MapServiceRegistry) + @objc deinit + final public func apply(_ style: (any MapConductorCore::MapViewStyle)?, onDiagnostics: (([Swift::String]) -> Swift::Void)? = nil) + final public func dispose() + final public func notifyStyleLoaded() + final public var tileServer: MapConductorCore::LocalTileServer { + get + } + final public var vectorStyleUrl: Swift::String? { + get + } + final public func onStyleLoaded(_ block: @escaping () -> Swift::Void) -> MapConductorCore::MapStyleInstallation + final public func upsertRaster(_ state: MapConductorCore::RasterLayerState) + final public func removeRaster(id: Swift::String) + final public func report(_ diagnostics: [Swift::String]) +} +extension MapConductorCore::MapViewCoordinatorBase { + @_Concurrency::MainActor public func applyStyle(_ style: (any MapConductorCore::MapViewStyle)?, onDiagnostics: (([Swift::String]) -> Swift::Void)? = nil) + @_Concurrency::MainActor public func disposeStyle() + @_Concurrency::MainActor public func notifyStyleLoaded() +} +@_Concurrency::MainActor @preconcurrency public struct MapViewStyleApplier : SwiftUI::UIViewRepresentable { + @_Concurrency::MainActor @preconcurrency public init(host: MapConductorCore::MapViewStyleHost, style: (any MapConductorCore::MapViewStyle)?, onDiagnostics: (([Swift::String]) -> Swift::Void)? = nil) + @_Concurrency::MainActor @preconcurrency public func makeUIView(context _: MapConductorCore::MapViewStyleApplier.SwiftUI::Context) -> UIKit::UIView + @_Concurrency::MainActor @preconcurrency public func updateUIView(_: UIKit::UIView, context _: MapConductorCore::MapViewStyleApplier.SwiftUI::Context) + public typealias Body = Swift::Never + public typealias Coordinator = Swift::Void + public typealias UIViewType = UIKit::UIView +} public enum ScreenProjectionRequirement { @discardableResult public static func check(registry: any MapConductorCore::MapServiceRegistry, provider: Swift::String, feature: Swift::String) -> Swift::Bool } +public enum StyleMutation : Swift::Equatable, Swift::Sendable { + case setPaint(layerId: Swift::String, key: Swift::String, value: Swift::String, previous: Swift::String) + case setLayout(layerId: Swift::String, key: Swift::String, value: Swift::String, previous: Swift::String) + case setFilter(layerId: Swift::String, value: Swift::String, previous: Swift::String) + case setZoomRange(layerId: Swift::String, minZoom: Swift::Double?, maxZoom: Swift::Double?, previousMinZoom: Swift::Double?, previousMaxZoom: Swift::Double?) + case addLayer(layerId: Swift::String, layer: Swift::String, beforeId: Swift::String?) + case removeLayer(layerId: Swift::String) + public var layerId: Swift::String { + get + } + public var target: Swift::String { + get + } + public var propertyName: Swift::String { + get + } + public func reversed() -> MapConductorCore::StyleMutation? + public static func parseList(_ json: Swift::String) -> [MapConductorCore::StyleMutation] + public static func jsonText(of value: Any?) -> Swift::String + public static func == (a: MapConductorCore::StyleMutation, b: MapConductorCore::StyleMutation) -> Swift::Bool +} +public protocol VectorStyleMutationSupport : AnyObject { + func apply(_ mutations: [MapConductorCore::StyleMutation]) -> [MapConductorCore::StyleMutation] + func clear() +} +public enum VectorStyleMutationSupportKey : MapConductorCore::MapServiceKey { + public typealias Value = MapConductorCore::VectorStyleMutationSupport +} +final public class StyleMutationStore : MapConductorCore::VectorStyleMutationSupport, @unchecked Swift::Sendable { + public init(applyNow: @escaping ([MapConductorCore::StyleMutation]) -> [MapConductorCore::StyleMutation]) + final public func apply(_ mutations: [MapConductorCore::StyleMutation]) -> [MapConductorCore::StyleMutation] + final public func clear() + final public func onStyleLoaded() + final public var applied: [MapConductorCore::StyleMutation] { + get + } + @objc deinit +} public protocol VectorStyleSupport : AnyObject { func showStyle(url: Swift::String, attributionRules: [MapConductorCore::AttributionRule]) func clearStyle() + var currentStyleUrl: Swift::String? { get } +} +extension MapConductorCore::VectorStyleSupport { + public var currentStyleUrl: Swift::String? { + get + } } public enum VectorStyleSupportKey : MapConductorCore::MapServiceKey { public typealias Value = MapConductorCore::VectorStyleSupport } final public class VectorStyleAsDesign : MapConductorCore::VectorStyleSupport where State : MapConductorCore::MapViewStateProtocol { - public init(state: State, designId: @escaping (State.ActualMapDesignType) -> Swift::String, designFor: @escaping (_ url: Swift::String, _ attributionRules: [MapConductorCore::AttributionRule]) -> State.ActualMapDesignType) + public init(state: State, designId: @escaping (State.ActualMapDesignType) -> Swift::String, urlOf: ((State.ActualMapDesignType) -> Swift::String?)? = nil, designFor: @escaping (_ url: Swift::String, _ attributionRules: [MapConductorCore::AttributionRule]) -> State.ActualMapDesignType) + final public var currentStyleUrl: Swift::String? { + get + } final public func showStyle(url: Swift::String, attributionRules: [MapConductorCore::AttributionRule]) final public func clearStyle() @objc deinit @@ -2587,7 +2713,7 @@ final public class RasterHeaderRuleSet : @unchecked Swift::Sendable { public static func warnUnsupported(provider: Swift::String, state: MapConductorCore::RasterLayerState, supportsUserAgent: Swift::Bool = false) @objc deinit } -open class RasterLayerController : MapConductorCore::OverlayControllerProtocol, MapConductorCore::SlottedOverlayController where ActualLayer == Renderer.ActualLayer, Renderer : MapConductorCore::RasterLayerOverlayRendererProtocol { +open class RasterLayerController : MapConductorCore::OverlayControllerProtocol, MapConductorCore::SlottedOverlayController, MapConductorCore::RasterLayerMounting where ActualLayer == Renderer.ActualLayer, Renderer : MapConductorCore::RasterLayerOverlayRendererProtocol { public typealias StateType = MapConductorCore::RasterLayerState public typealias EntityType = MapConductorCore::RasterLayerEntity public typealias EventType = MapConductorCore::RasterLayerEvent @@ -2961,6 +3087,7 @@ extension MapConductorCore::MapDiagnosticLevel : Swift::RawRepresentable {} extension MapConductorCore::MapServiceRegistryScope : Swift::Sendable {} extension MapConductorCore::InitState : Swift::Equatable {} extension MapConductorCore::InitState : Swift::Hashable {} +extension MapConductorCore::MapViewStyleApplier : Swift::Sendable {} extension MapConductorCore::DefaultMarkerEventController : Swift::Sendable {} extension MapConductorCore::MarkerDragGestureState : Swift::Equatable {} extension MapConductorCore::MarkerDragGestureState : Swift::Hashable {} From 2772a10fd866152f84e177a8208d9baaace66696 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sun, 11 Oct 2026 12:52:42 -0700 Subject: [PATCH 27/28] Pass vector tile source zoom overrides --- .../MapConductorCore/LocalTileServer.swift | 18 ++++++++++-- Sources/MapConductorCore/TileRequest.swift | 5 +++- .../LocalTileServerSemanticsTests.swift | 28 ++++++++++++++++++- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/Sources/MapConductorCore/LocalTileServer.swift b/Sources/MapConductorCore/LocalTileServer.swift index 8763b31..e553174 100644 --- a/Sources/MapConductorCore/LocalTileServer.swift +++ b/Sources/MapConductorCore/LocalTileServer.swift @@ -190,7 +190,11 @@ public final class LocalTileServer: @unchecked Sendable { statsLock.unlock() let renderStart = DispatchTime.now().uptimeNanoseconds - let outcome = resolveTile(path: url.path, isCancelled: isCancelled) + let outcome = resolveTile( + path: url.path, sourceZoomOffset: Self.sourceZoomOffset(in: url.absoluteString), + isCancelled: isCancelled + ) + let renderNanos = DispatchTime.now().uptimeNanoseconds - renderStart statsLock.lock() @@ -388,6 +392,7 @@ public final class LocalTileServer: @unchecked Sendable { } let path = String(request.path.split(separator: "?")[0]) + let sourceZoomOffset = Self.sourceZoomOffset(in: request.path) let filesPrefix = "/\(Self.filesPrefix)/" if path.hasPrefix(filesPrefix) { @@ -446,7 +451,7 @@ public final class LocalTileServer: @unchecked Sendable { default: return false } } - let outcome = self.resolveTile(path: path, isCancelled: gone) + let outcome = self.resolveTile(path: path, sourceZoomOffset: sourceZoomOffset, isCancelled: gone) let renderNanos = DispatchTime.now().uptimeNanoseconds - renderStart self.renderGate.signal() self.statsLock.lock() @@ -746,8 +751,15 @@ public final class LocalTileServer: @unchecked Sendable { case abandoned } + private static func sourceZoomOffset(in url: String) -> Int { + let value = URLComponents(string: url)?.queryItems? + .first(where: { $0.name == "sourceZoomOffset" })?.value + return max(0, min(8, Int(value ?? "0") ?? 0)) + } + private func resolveTile( path: String, + sourceZoomOffset: Int = 0, isCancelled: @escaping @Sendable () -> Bool ) -> TileOutcome { let trimmed = path.trimmingCharacters(in: CharacterSet(charactersIn: "/")) @@ -788,7 +800,7 @@ public final class LocalTileServer: @unchecked Sendable { let bytes: Data? do { bytes = try provider.renderTile( - request: TileRequest(x: x, y: coordinate.y, z: z, pixelRatio: coordinate.pixelRatio), + request: TileRequest(x: x, y: coordinate.y, z: z, pixelRatio: coordinate.pixelRatio, sourceZoomOffset: sourceZoomOffset), isCancelled: isCancelled ) } catch { diff --git a/Sources/MapConductorCore/TileRequest.swift b/Sources/MapConductorCore/TileRequest.swift index ef6992b..4e7c733 100644 --- a/Sources/MapConductorCore/TileRequest.swift +++ b/Sources/MapConductorCore/TileRequest.swift @@ -3,11 +3,14 @@ public struct TileRequest: Hashable { public let y: Int public let z: Int public let pixelRatio: Int + /// Render a coarser vector level within the same target grid. + public let sourceZoomOffset: Int - public init(x: Int, y: Int, z: Int, pixelRatio: Int = 1) { + public init(x: Int, y: Int, z: Int, pixelRatio: Int = 1, sourceZoomOffset: Int = 0) { self.x = x self.y = y self.z = z self.pixelRatio = pixelRatio + self.sourceZoomOffset = max(0, min(8, sourceZoomOffset)) } } diff --git a/Tests/MapConductorCoreTests/LocalTileServerSemanticsTests.swift b/Tests/MapConductorCoreTests/LocalTileServerSemanticsTests.swift index 403ec9e..956d6e9 100644 --- a/Tests/MapConductorCoreTests/LocalTileServerSemanticsTests.swift +++ b/Tests/MapConductorCoreTests/LocalTileServerSemanticsTests.swift @@ -61,6 +61,31 @@ final class LocalTileServerSemanticsTests: XCTestCase { func renderTile(request: TileRequest) -> Data? { png } } + private final class RequestProvider: TileProvider { + var request: TileRequest? + func renderTile(request: TileRequest) -> Data? { + self.request = request + return nil + } + } + + func testSourceDetailOverrideReachesDirectAndHTTPProviders() throws { + let provider = RequestProvider() + server.register(routeId: routeId, provider: provider) + let template = server.urlTemplate(routeId: routeId, tileSize: 256) + let path = template.replacingOccurrences(of: "{z}", with: "8") + .replacingOccurrences(of: "{x}", with: "226") + .replacingOccurrences(of: "{y}", with: "100") + let url = try XCTUnwrap(URL(string: path + "?sourceZoomOffset=1")) + XCTAssertNotNil(server.renderLocalTile(url: url)) + XCTAssertEqual(provider.request?.sourceZoomOffset, 1) + XCTAssertEqual(provider.request?.z, 8) + _ = try fetch(z: 8, x: 226, y: 100, sourceZoomOffset: 2) + XCTAssertEqual(provider.request?.sourceZoomOffset, 2) + _ = try fetch(z: 8, x: 226, y: 100) + XCTAssertEqual(provider.request?.sourceZoomOffset, 0) + } + private struct Answer { let status: Int let headers: [AnyHashable: Any] @@ -68,7 +93,7 @@ final class LocalTileServerSemanticsTests: XCTestCase { } /// タイルを 1 枚取りに行く。`urlTemplate` が返す URL をそのまま使う。 - private func fetch(z: Int, x: Int, y: Int, tileSize: Int = 512, retina: Bool = false) throws -> Answer { + private func fetch(z: Int, x: Int, y: Int, tileSize: Int = 512, retina: Bool = false, sourceZoomOffset: Int? = nil) throws -> Answer { let template = server.urlTemplate(routeId: routeId, tileSize: tileSize) var text = template .replacingOccurrences(of: "{z}", with: "\(z)") @@ -77,6 +102,7 @@ final class LocalTileServerSemanticsTests: XCTestCase { if retina { text = text.replacingOccurrences(of: ".png", with: "@2x.png") } + if let sourceZoomOffset { text += "?sourceZoomOffset=\(sourceZoomOffset)" } let url = try XCTUnwrap(URL(string: text)) var answer: Answer? From 9c3cf443d9128a0d5a643b42d8539972377348a6 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sun, 11 Oct 2026 14:17:55 -0700 Subject: [PATCH 28/28] Extend raster tile preferences --- .../raster/RasterTilePreference.swift | 21 ++++++++++++++++++- api/MapConductorCore.api.swift | 12 +++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/Sources/MapConductorCore/raster/RasterTilePreference.swift b/Sources/MapConductorCore/raster/RasterTilePreference.swift index 6ab44e4..9b21f74 100644 --- a/Sources/MapConductorCore/raster/RasterTilePreference.swift +++ b/Sources/MapConductorCore/raster/RasterTilePreference.swift @@ -17,6 +17,23 @@ import Foundation public protocol RasterTilePreference { /// この SDK に渡してほしいタイルの一辺(ポイント)。 var preferredTileSize: Int { get } + + /// この SDK がラスタータイルを **物理ピクセル** でレイアウトするなら true。 + /// + /// 地図 SDK には 2 つの流儀がある。宣言された一辺をポイントとして敷くものと、 + /// 物理ピクセルとして敷くもの。後者に 2x の画面で「512」と宣言すると + /// 256 pt しか覆わず、1 段深いズームを要求してスタイルをそこで読む — + /// ラベルは半分、道路は倍の密度になる(web の HERE で実測)。供給側は + /// この流儀を知りようがないので、プロバイダが言う。 + /// + /// true のとき、供給側は ``preferredTileSize`` × scale を宣言し、描画は + /// 同じピクセル数で行い、スタイルには ``preferredTileSize`` pt として + /// 読ませる。既定は false。android-sdk / react-sdk の同名フィールドに対応。 + var layoutInDevicePixels: Bool { get } +} + +extension RasterTilePreference { + public var layoutInDevicePixels: Bool { false } } /// ``RasterTilePreference`` の登録キー。 @@ -29,8 +46,10 @@ public enum RasterTilePreferenceKey: MapServiceKey { /// 値だけを持つ既定の実装。プロバイダが 1 行で登録できるように。 public struct FixedRasterTilePreference: RasterTilePreference { public let preferredTileSize: Int + public let layoutInDevicePixels: Bool - public init(preferredTileSize: Int) { + public init(preferredTileSize: Int, layoutInDevicePixels: Bool = false) { self.preferredTileSize = preferredTileSize + self.layoutInDevicePixels = layoutInDevicePixels } } diff --git a/api/MapConductorCore.api.swift b/api/MapConductorCore.api.swift index d5caa42..d2ee432 100644 --- a/api/MapConductorCore.api.swift +++ b/api/MapConductorCore.api.swift @@ -275,7 +275,8 @@ public struct TileRequest : Swift::Hashable { public let y: Swift::Int public let z: Swift::Int public let pixelRatio: Swift::Int - public init(x: Swift::Int, y: Swift::Int, z: Swift::Int, pixelRatio: Swift::Int = 1) + public let sourceZoomOffset: Swift::Int + public init(x: Swift::Int, y: Swift::Int, z: Swift::Int, pixelRatio: Swift::Int = 1, sourceZoomOffset: Swift::Int = 0) public static func == (a: MapConductorCore::TileRequest, b: MapConductorCore::TileRequest) -> Swift::Bool public func hash(into hasher: inout Swift::Hasher) public var hashValue: Swift::Int { @@ -2937,13 +2938,20 @@ final public class RasterLayerState : Combine::ObservableObject, Swift::Identifi } public protocol RasterTilePreference { var preferredTileSize: Swift::Int { get } + var layoutInDevicePixels: Swift::Bool { get } +} +extension MapConductorCore::RasterTilePreference { + public var layoutInDevicePixels: Swift::Bool { + get + } } public enum RasterTilePreferenceKey : MapConductorCore::MapServiceKey { public typealias Value = MapConductorCore::RasterTilePreference } public struct FixedRasterTilePreference : MapConductorCore::RasterTilePreference { public let preferredTileSize: Swift::Int - public init(preferredTileSize: Swift::Int) + public let layoutInDevicePixels: Swift::Bool + public init(preferredTileSize: Swift::Int, layoutInDevicePixels: Swift::Bool = false) } public enum MarkerIconSize { public static let Small: CoreFoundation::CGFloat

    sF&GhN*c4`FbFe7R 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
    ;9#xw5*N$6^5B?NM>-yEgrwvEl!inPs2iqo^pD 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
    jP^Xn~`waPxu! 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⋙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