Table of Contents

Class PatternAreaPaintOp

Namespace
EncDotNet.S100.Rendering.Scene
Assembly
EncDotNet.S100.Rendering.Scene.dll

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.

public sealed class PatternAreaPaintOp : PaintOp
Inheritance
PatternAreaPaintOp
Inherited Members

Remarks

The tile bytes are encoded as PNG — a renderer-neutral raster format chosen to mirror the Mapsui pattern phase's existing SkiaSvgRasterizer.RasterizePatternTile output. A future non-Skia backend can decode the same bytes.

The headless Skia backend draws the tile via a repeat-tiled SKShader anchored at world (0,0) projected to screen space, matching the Mapsui AnchoredPatternFillStyle contract so the pattern is seamless across overlapping polygons that share a global tile grid.

Priority clipping. When VectorSceneBuilder lowers pattern fills it priority-clips them via the shared PatternPriorityClipper (S-100 Part 9 §11.3): a lower-priority pattern op is clipped where a higher-priority pattern op — or an opaque non-patterned solid colour fill (e.g. land) — covers it, so the geometry carried here is already the visible portion. This is the identical clip the Mapsui feature path applies, so the headless Skia backend and the Mapsui TiledScene subsystem no longer bleed patterns across opaque overlay areas (resolves the issue #192 "as closely as practical" caveat). A clipped group can be a multi-polygon, so it is emitted as several ops (one shell + holes each).

Properties

PatternReference

The portrayal-catalogue area-fill name (e.g. DIAMOND1).

public required string PatternReference { get; init; }

Property Value

string

TilePng

The pre-rasterised pattern tile as PNG bytes.

public required byte[] TilePng { get; init; }

Property Value

byte[]

WorldHoles

Interior (hole) rings in EPSG:3857 metres.

public IReadOnlyList<IReadOnlyList<(double X, double Y)>> WorldHoles { get; init; }

Property Value

IReadOnlyList<IReadOnlyList<(double X, double Y)>>

WorldShell

Exterior ring in EPSG:3857 metres (closed or auto-closed by the backend).

public required IReadOnlyList<(double X, double Y)> WorldShell { get; init; }

Property Value

IReadOnlyList<(double X, double Y)>