Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
674dd4c
Make bearing a clockwise map rotation
Sep 1, 2026
9ed1b9d
Draw marker tiles on whole pixels
wf9a5m75 Sep 4, 2026
5578905
Encode marker tiles in Rust, falling back to the platform
wf9a5m75 Sep 5, 2026
451c696
Make the tile PNG encoder public, as TilePngEncoder
wf9a5m75 Sep 5, 2026
7316b25
Draw marker tiles into a bitmap context we own
wf9a5m75 Sep 5, 2026
512aa1c
Draw markers that sit exactly on top of one another once
wf9a5m75 Sep 5, 2026
9223a0a
Start the query padding from the icon, not from a guess
wf9a5m75 Sep 5, 2026
3a0c367
Do not sort a radius search whose distances are discarded
wf9a5m75 Sep 5, 2026
bde5ff7
Give iOS the same marker grid index, and fix two holes in it
wf9a5m75 Sep 5, 2026
87a4f55
Have overlay states report their own changes, as android-sdk does
wf9a5m75 Sep 5, 2026
ced369e
Add declutterPx, which android-sdk had and the other two did not
wf9a5m75 Sep 5, 2026
af4250a
Check Web Mercator against the other two platforms
wf9a5m75 Sep 19, 2026
4afd41c
Thin marker queries in the index, as android-sdk does
wf9a5m75 Sep 19, 2026
803ece5
Rebuild the marker grid on square Morton cells
wf9a5m75 Sep 21, 2026
5487d74
Answer empty tiles with pixels, failures with 503, and bound the rend…
wf9a5m75 Sep 21, 2026
1589bba
Dump the API baseline for the marker grid and tile server work
wf9a5m75 Sep 21, 2026
9b123e5
Rebuild TilePng.xcframework from the vectortile sync
wf9a5m75 Sep 21, 2026
04b9b38
Fix the atlas row flip in the GPU marker rasterizer, and make GPU the…
wf9a5m75 Sep 21, 2026
563df16
Turn an empty tile into pixels in the server, the way android does
wf9a5m75 Sep 21, 2026
14b3dc4
Let a provider say how big a tile it wants
wf9a5m75 Sep 27, 2026
0a451f6
Render local tiles in-process for callers that can cancel
wf9a5m75 Sep 29, 2026
8c59086
Give every backend one blank map style to say "no basemap" with
wf9a5m75 Sep 29, 2026
48f9b44
Make the transparent tile public: a backend can hand it out in place …
wf9a5m75 Sep 29, 2026
315a21f
Move to the camera an app hands over as it is
wf9a5m75 Sep 29, 2026
f0463e2
Add VectorStyleSupport and file/document routes to the local tile server
wf9a5m75 Sep 30, 2026
aaed489
feat: integrate vector style support and pending map fixes
wf9a5m75 Oct 10, 2026
2772a10
Pass vector tile source zoom overrides
wf9a5m75 Oct 11, 2026
9c3cf44
Extend raster tile preferences
wf9a5m75 Oct 11, 2026
39fa4bf
Merge remote-tracking branch 'origin/develop' into feature/bearing-cl…
wf9a5m75 Oct 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions CTilePng.podspec
Original file line number Diff line number Diff line change
@@ -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
7 changes: 7 additions & 0 deletions MapConductorCore.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,11 @@ Pod::Spec.new do |s|
s.platform = :ios, "15.1"
s.swift_version = "5.9"
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.
s.vendored_frameworks = "TilePng.xcframework"
end
12 changes: 11 additions & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
40 changes: 40 additions & 0 deletions Sources/CTilePng/include/tile_png.h
Original file line number Diff line number Diff line change
@@ -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 <stddef.h>
#include <stdint.h>

#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 */
3 changes: 3 additions & 0 deletions Sources/CTilePng/shim.c
Original file line number Diff line number Diff line change
@@ -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.
Loading
Loading