Class 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.
public abstract class PaintOp
- Inheritance
-
PaintOp
- Derived
- Inherited Members
Remarks
Unit contract. All coordinate values
(World… members) are in EPSG:3857 Web-Mercator metres — the
first half of the S-100 Part 9 projection (lat/lon → EPSG:3857).
The second half (EPSG:3857 → screen pixels) is intentionally left to
each backend: Mapsui performs it per-frame via its Navigator; the
Skia backend applies a Viewport-derived affine.
All size values (stroke widths, dash lengths, offsets, font
size, symbol scale) are already expressed in logical display pixels
under the S-100 Part 9 §3.10.4 convention 1 px = 0.32 mm. They are
resolution-independent device pixels — not world metres and
not physical output pixels. A backend that draws geometry through a
world→screen canvas transform must realise strokes, symbols, and text in
device pixels (i.e. reset/compensate the transform for size realisation),
otherwise sizes would scale with zoom.
All colours are already resolved to RgbaColor (palette token lookup + transparency applied). Resources (symbols, pattern tiles) are resolved to processed content rather than catalogue names.
Properties
FeatureReference
Identifier of the originating dataset feature (the S-100 feature reference), carried through so backends can tag rendered output for pick / hit-testing.
public required string FeatureReference { get; init; }
Property Value
ScaleMaximum
Maximum display scale denominator at which this op is visible (the most zoomed-in limit; S-100 Part 9 §11.1). Null means no upper bound.
public double? ScaleMaximum { get; init; }
Property Value
ScaleMinimum
Minimum display scale denominator at which this op is visible (the most zoomed-out limit; S-100 Part 9 §11.1). Null means no lower bound. Carried as a denominator (not a backend resolution) so each backend applies the same inclusion semantics via IsVisibleAtScale(PaintOp, double).
public double? ScaleMinimum { get; init; }