Overlay generator (pure, tested) — RioJoy.Core/Overlay:
- FontFitter ports the legacy calc-fontsize auto-fit search (validated against a
brute-force oracle); OverlayLayoutEngine ports create-data-layer's fit + h/v
justification and adds per-region 90 deg CCW rotation; OverlayTemplate/Region +
OverlayTemplateStore hold cell geometry/colour/rotation (regions.json).
- GoobieDataImporter parses the legacy .data label sheet into label rows.
- src/RioJoy.Overlay: SkiaSharp rasterizer (SkiaTextMeasurer shared with the engine
so measured layout == drawn output; SkiaOverlayRenderer -> PNG;
ProfileWallpaperGenerator). Verified end-to-end on the real cockpit art
(regions.json + riojoy.png + TEST.data) by OverlayRenderIntegrationTests.
- RioJoy.Tray/WallpaperApplier applies via SystemParametersInfo; RioCoordinator
generates+applies on profile activation (opt-in via AppConfig.OverlayTemplatePath).
Region geometry — tools/XcfRegionExtract parses riojoy.xcf (a GIMP-format binary
reader, no GIMP needed) into the 119-cell regions.json: per-layer offsets/size/
font/colour, with 90 deg CCW rotation on a-00 + b-10..b-1F. Base image riojoy.png.
NOTE: the wallpaper positions are a VGA chroma-split display artifact (6 displays),
not the cockpit's logical layout.
Mapping editor (first cut) — RioJoy.Tray/Editor/ProfileEditorForm renders the
config sheet's logical grid (SheetLayout parses the sheet CSV export). The iRIO
word is edited via ButtonBinding <-> RioMapEntry.Create (no hex bit-twiddling), with
a context-sensitive picker: keyboard keys by name (KeyCatalog VK names), joystick
Button N, hat direction, mouse/RIO-command enum names; modifiers only for keyboard.
Opened from the tray ("Edit profile..."). The sheet-grid layout is a starting point
that needs rework from a better-formatted source.
~220 xUnit tests green. Docs (PLAN.md, README) updated.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
32 lines
1.3 KiB
Markdown
32 lines
1.3 KiB
Markdown
# XcfRegionExtract
|
|
|
|
Extracts the cockpit label cells from the GIMP source art
|
|
([`docs/reference/customBackground/riojoy.xcf`](../../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
|
|
|
|
```cmd
|
|
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:
|
|
|
|
```cmd
|
|
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.
|