Table of Contents

Namespace EncDotNet.S100.Rendering.Scene

Classes

AreaPaintOp

A resolved solid-colour area fill (with optional outline).

ColorResolver

S-100 colour-token resolution shared by the vector rendering backends. Resolves a token through a ColorPalette, falling back to an inline hex literal (e.g. the S-421 RouteActionPoint <foreground> emits a bare AA44A8) and finally to opaque black.

CoverageSymbolField

The oriented symbols (e.g. S-111 current arrows) of one styled coverage grid, flattened to row-major arrays in EPSG:3857: one entry per grid cell, with the resolved symbol band, the band's symbol scale, the rotation and the thinning priority. Shared by the Mapsui and headless Skia arrow renderers so both place, size and thin the same arrows.

LinePaintOp

A resolved polyline stroke.

PaintOp

A backend-agnostic, fully-resolved S-100 Part 9 paint operation — the intermediate representation (IR) produced by VectorSceneBuilder and consumed by both the headless SkiaDisplayListRenderer and the Mapsui display-list renderer.

PatternAreaPaintOp

A resolved tiled-symbol pattern area fill (S-100 Part 9 §11.3 area fills with a referenced AreaFill). The op carries the pre-rasterised pattern tile as PNG bytes and the pattern reference so backends can cache the decoded image across ops sharing the same pattern.

PatternPriorityClipper

Backend-neutral priority-clipping of S-100 Part 9 §11.3 tiled pattern area fills. Given the pattern areas grouped by (pattern reference, drawing priority) and the opaque non-patterned colour fills, this computes the visible portion of each pattern group by subtracting every higher-priority pattern area and every opaque colour fill (e.g. land) from it, so that a lower-priority pattern does not show through a higher-priority pattern zone and no pattern bleeds over an opaque area.

PlacementArea

The area a point symbol or text is kept in when it is placed in the visible parts of its surface (S-100 Part 9 AreaPlacement:VisibleParts).

PointPaintOp

A resolved point-symbol placement.

RotatedViewport

Geometry of a rotated Viewport (issue #578). A rotated display is drawn by rendering a north-up cover — an axis-aligned viewport at the same scale and centre, large enough that the rotated output rectangle fits inside it — and rotating that onto the output about its centre.

ScaleVisibility

Shared S-100 Part 9 §11.1 scale-visibility semantics. Centralised so the headless Skia backend (which evaluates a single fixed scale per render) and the Mapsui backend (which evaluates per-frame via Min/MaxVisible) agree on the inclusion rule, including at the boundaries.

SeamAwareBoundsAccumulator

Accumulates the EPSG:3857 extent of a headless render while remaining aware of the ±180° antimeridian seam, so the auto-fit viewport frames a dataset on its true extent even when its geometry wraps the dateline.

TextPaintOp

A resolved text label. The anchor is already selected (Part 9 §11.4/§11.5).

VectorScene

An ordered, backend-agnostic list of resolved PaintOps — the output of VectorSceneBuilder. Ops are already in S-100 Part 9 draw order (areas → lines → points → text within ascending drawing priority, under-radar before over-radar).

VectorSceneBuilder

Lowers a backend-agnostic S-100 Part 9 display list (a list of DrawingInstructions plus an IFeatureGeometryProvider) into a resolved VectorScene: instructions are sorted into Part 9 draw order, colours/symbols/line-styles are resolved, sizes are converted from millimetres to display pixels (1 px = 0.32 mm), and geometry is projected to EPSG:3857. The result is consumed by both the headless SkiaDisplayListRenderer and the Mapsui renderer so the S-100 portrayal-correctness logic lives in exactly one place.

WebMercator

Spherical Web-Mercator (EPSG:3857) forward projection used by the shared vector rendering core. Reimplemented here so the core has no dependency on Mapsui (whose SphericalMercator.FromLonLat this matches).

XyzTileGrid

The standard XYZ ("slippy map") Web-Mercator tile pyramid used by web maps such as MapLibre, Leaflet and OpenLayers: zoom z splits the EPSG:3857 world square into 2^z × 2^z tiles of 256 logical pixels, with column x increasing east from −180° and row y increasing south from the northern projection limit.

Structs

LineSymbolPlacement

A symbol a line style places along a LinePaintOp.

PatternPriorityClipper.ClippedPattern

The clipped, still-visible geometry for one PatternPriorityClipper.PatternGroup.

PatternPriorityClipper.PatternGroup

A group of same-pattern, same-priority area fills to be clipped as one unit. Grouping mirrors the Mapsui feature path so both render arms produce identical clip topology.

ResolvedSymbol

Resolved intrinsic metrics for a point symbol, carried in the IR so the Skia backend does not re-derive symbol geometry independently of the Mapsui backend (S-100 Part 9 §11.5 pivot placement).

SymbolAsset

A resolved point-symbol asset: the processed (class-resolved) SVG content plus the S-100 Part 9 §11.5 pivot offset expressed as a fraction of symbol size in screen-space orientation (+Y = down).

ViewExtent

The part of the world a view shows, in EPSG:3857 metres, for keeping area-placed symbols and text in view (see PlacementArea).

WorldToScreen

A linear EPSG:3857-world → screen-pixel affine derived from a Viewport — the second half of the S-100 Part 9 projection (EPSG:3857 → screen pixels) that a PaintOp deliberately leaves to each rendering backend (see the unit contract on PaintOp).

Interfaces

IVectorSceneRenderer<TSurface>

The named contract a rendering backend implements to draw the backend-agnostic S-100 Part 9 vector intermediate representation (VectorScene) onto a backend-specific drawing surface.

Delegates

PatternClipMemoizer

Memoizes the (palette-independent) result of the pattern priority-clip (Clip(IReadOnlyList<PatternGroup>, IReadOnlyList<Polygon>)) so a VectorSceneBuilder re-build that does not change the clip inputs — most importantly a Day/Dusk/Night palette switch — reuses the previously computed clip geometry instead of repeating the expensive NetTopologySuite overlay.