Documentation now describes the .NET Framework 4.8 stack (was .NET 8): - README build prerequisites + framework-dependent/no-runtime-install note, test count 136 -> 241. - PLAN.md architecture diagram, stack decision (with PolySharp/shims note), suite total 136 -> 241. - deploy/README-DEPLOY.txt: app is net48 framework-dependent (4.8 is in-box on Win10/11), and build prerequisites. Also migrate the three tools (RioJoySmokeTest, RioSerialMonitor, XcfRegionExtract) to net48 so they keep building against the now-net48 RioJoy.Core (a net8 project cannot reference a net48 one). Added PolySharp + System.Memory/System.Text.Json shims and replaced net-core-only APIs (string.Contains/IndexOf with comparison, Array.Fill, generic Enum.IsDefined, int.TryParse(span)). All three build clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
XcfRegionExtract
Extracts the cockpit label cells from the GIMP source art
(docs/reference/customBackground/riojoy.xcf)
into a regions.json in OverlayTemplate shape — the geometry the Phase 7
overlay generator (RioJoy.Core.Overlay) lays text into.
Each named text layer becomes a region: Name = layer name (e.g. b-00,
Throttle), geometry = the layer's box (PROP_OFFSETS + width/height), and
FontFamily/FontSizePx from the layer's gimp-text-layer parasite. Only layer
metadata is read (no tile/pixel data), so XCF tile compression is irrelevant.
Run
dotnet run --project tools/XcfRegionExtract
Defaults read docs/reference/customBackground/riojoy.xcf and overwrite
docs/reference/customBackground/regions.json (run from the repo root). Override:
dotnet run --project tools/XcfRegionExtract -- path\to\in.xcf path\to\out.json
Re-run whenever the cockpit artwork changes. The committed regions.json is the
canonical extract; OverlayTemplate.BaseImagePath is left null and must point at
the exported base cockpit image used as the wallpaper background.
Supports XCF version 0 (
gimp xcf file) through current; pointers are 64-bit at version ≥ 11, 32-bit otherwise.