EncDotNet.S100.Renderers.Skia
0.20.0
dotnet add package EncDotNet.S100.Renderers.Skia --version 0.20.0
NuGet\Install-Package EncDotNet.S100.Renderers.Skia -Version 0.20.0
<PackageReference Include="EncDotNet.S100.Renderers.Skia" Version="0.20.0" />
<PackageVersion Include="EncDotNet.S100.Renderers.Skia" Version="0.20.0" />
<PackageReference Include="EncDotNet.S100.Renderers.Skia" />
paket add EncDotNet.S100.Renderers.Skia --version 0.20.0
#r "nuget: EncDotNet.S100.Renderers.Skia, 0.20.0"
#:package EncDotNet.S100.Renderers.Skia@0.20.0
#addin nuget:?package=EncDotNet.S100.Renderers.Skia&version=0.20.0
#tool nuget:?package=EncDotNet.S100.Renderers.Skia&version=0.20.0
EncDotNet.S100.Renderers.Skia
Coverage and vector rendering to SkiaSharp bitmaps.
Overview
This library renders S-100 coverage and vector data to SkiaSharp bitmaps. It handles pure rasterization without a map control. Key types include:
SkiaCoverageRenderer—ICoverageRenderer<SKBitmap>implementation that maps coverage grid cells to pixel colors.SkiaSvgRasterizer— rasterizes SVG portrayal symbols to tiled pattern bitmaps.SkiaColorExtensions— helpers for converting betweenRgbaColorandSKColor.
Shared vector rendering core (now EncDotNet.S100.Rendering.Scene)
The backend-agnostic S-100 Part 9 vector rendering core — VectorScene,
PaintOp, VectorSceneBuilder, ColorResolver, ScaleVisibility, and
WebMercator — has been promoted to its own neutral assembly,
EncDotNet.S100.Rendering.Scene,
so every rendering backend (this library, EncDotNet.S100.Renderers.Mapsui, and
the tiled/async render subsystem) depends on the IR without diamonding through
Renderers.Skia. It lowers a display list into a resolved, projected
intermediate representation (IR) so the portrayal-correctness logic lives in
exactly one place:
VectorSceneBuilder(inRendering.Scene) — lowers aDrawingInstructionlist +IFeatureGeometryProviderinto an orderedVectorSceneofPaintOps: applies S-100 Part 9 draw ordering, colour/symbol/line-style resolution, mm→px conversion (1 px = 0.32 mm), text-anchor selection, and thelat/lon → EPSG:3857projection half.PaintOp/VectorScene(inRendering.Scene) — the IR.PaintOpcoordinates are EPSG:3857 metres; all sizes are logical display pixels (resolution-independent). See thePaintOpXML docs for the full unit contract.SkiaDisplayListRenderer(in this library,…Renderers.Skia.Scene) —VectorScene+Viewport→SKBitmap. The vector analogue ofSkiaCoverageRenderer, suitable for a tile-serving web API with no Mapsui/GUI dependency. It supplies the second projection half (EPSG:3857 → screen) via aViewport-derived affine. Parsed symbol pictures are cached process-wide (keyed by the resolved SVG), point/text ops whose anchor falls outside the viewport (plusPointCullMarginPx) are culled before any per-op work, and text drawing pools itsSKFont/SKPaintper render — all three matter for the tiled subsystem's per-frame overlay, which replays this renderer live every frame.RenderOntotakes an optional cull rectangle so a caller that rotates the canvas can expand it to the rotated viewport's bounding box, plus anOverlayDrawOptionsoverload that adds the live Label-plane behaviour: a suppressed-text set (fromLabelDeclutterer), a screen-space text anchor-rotation that keeps glyphs upright under a rotated viewport while pinning the anchor to its feature, point/text draw filters, and per-run glyph fallback inDrawText(so codepoints the primary face lacks are drawn viaSKFontManager.MatchCharacterinstead of.notdeftofu boxes).LabelDeclutterer(…Renderers.Skia.Scene) — deterministic, priority-driven S-100 Part 9 overlap avoidance for the live label plane. Given aVectorSceneit returns the set ofTextPaintOps to suppress: point symbols reserve their screen footprints first, then text is placed highest-priority-first against a uniform screen-bucket index, with labels yielding to symbols and to higher-priority labels. Pure and machine-independent.OverlayDrawOptions(…Renderers.Skia.Scene) — the options bag for theRenderOntooverlay pass (cull bounds, suppressed text, text anchor-rotation + screen centre, and point/text draw filters).WebMercator(inRendering.Scene) — EPSG:3857 forward projection (matches Mapsui'sSphericalMercator.FromLonLat; a parity test asserts agreement).ScaleVisibility(inRendering.Scene) — shared S-100 Part 9 §11.1 scale-visibility rule.ColorResolver— S-100 colour-token resolution (palette + inline hex).
Scope (spike): the IR currently covers point, line, solid-area, and text ops. Pattern fills, antimeridian crossing, and Web-Mercator pole limits are not yet represented in the IR — pattern fills remain handled by the Mapsui renderer's dedicated pattern collection / priority-clip / insert phase.
Installation
dotnet add package EncDotNet.S100.Renderers.Skia
Linux arm64 native dependency
When you publish a linux-arm64 executable that uses this renderer, reference
the self-contained SkiaSharp native in your application project:
<ItemGroup>
<PackageReference Include="SkiaSharp.NativeAssets.Linux" ExcludeAssets="all" />
<PackageReference Include="SkiaSharp.NativeAssets.Linux.NoDependencies" />
</ItemGroup>
The regular SkiaSharp.NativeAssets.Linux arm64 libSkiaSharp.so declares
undefined uuid_* / FT_Get_BDF_Property symbols that abort once
fontconfig/freetype load on a normal arm64 host, so any render path crashes
with undefined symbol: …. The …NoDependencies build is self-contained and
renders on both x64 and arm64. Native RID asset selection belongs to the final
executable, so this library does not apply the swap to your build. See
issue #23.
Text labels render without any system font infrastructure: this package embeds an
Open Sans face (Apache-2.0) used as a fallback when the host exposes no usable
system font (e.g. the NoDependencies native on a box without fontconfig).
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- EncDotNet.S100.Core (>= 0.20.0)
- EncDotNet.S100.Portrayals (>= 0.20.0)
- EncDotNet.S100.Rendering.Scene (>= 0.20.0)
- SkiaSharp (>= 3.119.4)
- SkiaSharp.NativeAssets.Linux.NoDependencies (>= 3.119.4)
- Svg.Skia (>= 3.2.1)
-
net8.0
- EncDotNet.S100.Core (>= 0.20.0)
- EncDotNet.S100.Portrayals (>= 0.20.0)
- EncDotNet.S100.Rendering.Scene (>= 0.20.0)
- SkiaSharp (>= 3.119.4)
- SkiaSharp.NativeAssets.Linux.NoDependencies (>= 3.119.4)
- Svg.Skia (>= 3.2.1)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on EncDotNet.S100.Renderers.Skia:
| Package | Downloads |
|---|---|
|
EncDotNet.S100.Renderers.Mapsui
Libraries for manipulating S-100 based nautical charts. |
|
|
EncDotNet.S100.Datasets.Pipelines
Per-spec IDatasetProcessor implementations, the DatasetPipelineFactory (file -> processor detection), the headless image-render capability, the S-98 interoperability authority, and the validation runner for IHO S-100 product datasets. Consumed by the EncDotNet.S100 convenience package, the viewer, and the s100 CLI. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.20.0 | 156 | 6/29/2026 |
| 0.19.0 | 152 | 6/27/2026 |
| 0.18.0 | 160 | 6/17/2026 |
| 0.17.1 | 158 | 6/16/2026 |
| 0.17.0 | 159 | 6/15/2026 |
| 0.16.0 | 164 | 6/8/2026 |
| 0.15.0 | 127 | 6/6/2026 |
| 0.14.0 | 121 | 6/6/2026 |
| 0.13.0 | 114 | 6/3/2026 |
| 0.12.0 | 127 | 5/29/2026 |
| 0.11.0 | 121 | 5/19/2026 |
| 0.10.0 | 116 | 5/16/2026 |
| 0.9.0 | 119 | 5/15/2026 |
| 0.8.0 | 118 | 5/13/2026 |
| 0.7.0 | 117 | 5/12/2026 |
| 0.6.0 | 132 | 5/8/2026 |
| 0.5.0 | 117 | 5/4/2026 |
| 0.4.0 | 115 | 5/1/2026 |
| 0.3.0 | 117 | 4/29/2026 |
| 0.2.0 | 117 | 4/14/2026 |