Raster coverage and fades
Shared raster coverage updates pass local three-host acceptance in the current development SDK. Detect support with (await map.sqs.getCapabilities()).commonRasterCoverageFade.
A missing target first reuses the nearest cached parent from the same source and epoch. Cached children can also cover their own regions in reverse. Coverage regions are disjoint; uncovered regions remain transparent. Fallback never requests extra parents or children. An arriving exact tile hands off only its corresponding region. World copies reuse canonical cache entries. tileState.fallbackTiles counts displayed targets with fallback: four child patches within one target count as one target. readyTiles and source loaded recognize exact resources.
The shared raster layer property raster-fade-duration is in milliseconds, defaults to 300 and completes immediately at 0. Values must be finite and nonnegative. Existing valid uniform global, lexical and continuous zoom expressions are supported; per-feature and feature-state durations are unavailable. Initial tiles fade from transparency; exact tiles transition from saved previous coverage textures. Layers sharing a source keep independent durations, materials and order. Layer opacity is applied once.
map.addSource('imagery', {
type: 'raster',
tiles: ['https://your-provider.example/{z}/{x}/{y}.png'],
tileSize: 512,
attribution: 'Actual imagery provider attribution'
});
map.addLayer({
id: 'imagery-layer', type: 'raster', source: 'imagery',
paint: { 'raster-opacity': 0.5, 'raster-fade-duration': 300 }
});
Replace the example domain with your actual provider. Hosts implement their own layer list and controls; the core supplies APIs and events.
Resource readiness and render transition completion are separate. map.isSourceLoaded(id) may be true during a fade; map-wide map.loaded() also waits for render work. Actual draws advance fades, release previous references on completion and stop extra repaint requests. Cache, retained references, derived coverage and GPU data remain subject to existing budgets. Failed candidates, cancellation and late responses preserve transaction rules.
The shared 64 MiB cache, 64 displayed targets and 32 pending requests remain bounded. Coverage is limited to 512 pieces; image textures, generated meshes and terrain projection data each obey a 64 MiB budget.
The implementation uses existing legal planar, pitched, globe and ground-draped raster paths. It does not expand other style combinations. image/video/canvas frames update immediately and do not use tile arrival fades. Handoff reuses two textures; it is not an arbitrary nested fade snapshot of previous-frame RGBA. Combinations requiring a third original image remain an explicit boundary; repeated opacity or CPU mixing does not substitute for that capability.
The same complete portable script controls synthetic PNG resources through a private protocol. localhost3303 image requests are local screenshot barriers. An external driver samples actual monotonic time for intermediate and completed frames of 2000 ms transitions, without a nonexistent sleep import or a new production timing API. The same script and twelve actual frame phases pass Linux, browser main thread and Worker acceptance. Devices, mobile GIS/iOS, external machines and formal release remain pending.
Visible background layers combined with shared raster/globe remain unavailable under existing rules. The portable fixture hides background, independently captures the actual foundation under the same resource owner/projection, and verifies composition without assuming white.
Mixing retains the existing contract: premultiplied alpha interpolation in encoded sRGB texture space, followed by decoding to linear material/SRC_OVER. Values in different encoding domains are not interchangeable. Acceptance independently captures the actual empty foundation and opaque globe imagery reference, including globe lighting when verifying layer opacity once. Raster responses are limited to 4 MiB and decoded sides to 1024; the legacy planar painter retains its 512 image-side limit.