Mil Std2525Renderer
Target-agnostic facade over the per-target mil-sym-ts (C5Ren) + canvg bindings, expressed in plain Kotlin / DOM types only, so the WorldWind-facing point-symbol code (MilStd2525, MilStd2525Placemark) can live in webMain while the generated @JsModule externs (C5Ren / C5RenTypes / Canvg) stay per-target behind this seam.
The signatures deliberately leak NO generated types: Map<String, String> (not the per-target JsMap), Double (not the int/number aliases that resolve to Number on js vs Double on wasm), and HTMLCanvasElement (a kotlinx-browser type present on both targets). Each per-target adapter (createMilStd2525Renderer) absorbs the Number↔Double coercion, the JS-Map construction, and the @JsModule/@JsNonModule difference internally.
Multipoint tactical graphics (MilStd2525TacticalGraphic) are NOT routed through here — they consume the MilStdSymbol / multipoint renderer API directly and remain per-target.
Functions
Apply the renderer's current label-font settings (family / size / weight) to textAttributes.
Whether symbolId denotes a tactical graphic (vs a point symbol).
Render a point symbol: the rasterized canvas plus the symbol-center and symbol-bounds geometry the placemark needs for its image/label offsets. Null if the renderer produced nothing. Both maps are optional — null is treated as empty.
Render a multipoint tactical graphic to a list of target-agnostic MilStd2525Shapes. The adapter builds & configures the MilStdSymbol from controlPoints, runs the multipoint renderer at the given scale/densityFactor anchored at the upper-left (pointULLon, pointULLat), and converts every resulting shape (pixels→geo, colours, images) into plain Kotlin.