This repository now documents four related layers for interactive or animated SVG:
Svg.Custom,Svg.Skia,SKSvg,Svg.CustomSvg.Custom now includes the SVG 1.1 animation element family in the Svg namespace:
SvgAnimationElementSvgAnimationAttributeElementSvgAnimationValueElementSvgAnimateSvgSetSvgAnimateMotionSvgAnimateColorSvgAnimateTransformSvgMPathTyped enums and converters cover the stable attribute surface, including:
attributeTyperestartfillcalcModeadditiveaccumulatetype on animateTransformThe DOM layer also now exposes typed pointer-events values through SvgPointerEvents.
That makes Svg.Custom suitable for tooling that needs to parse, inspect, clone, or rewrite animation elements even when rendering or playback happens elsewhere.
SKSvg still exposes the broad hit-test APIs:
HitTestElements(...)HitTestSceneNodes(...)TryGetPicturePoint(...)TryGetPictureRect(...)For interaction routing, the runtime now also exposes HitTestTopmostElement(...), which resolves the topmost routed target instead of returning every matching element.
The hit-test path is now aware of:
pointer-events values,Use the broad HitTestElements(...) helpers when you need inspection. Use HitTestTopmostElement(...) when you need a routed input target.
Svg.Skia now includes SvgInteractionDispatcher, a framework-neutral pointer-routing layer. It accepts SvgPointerInput and raises routed SvgPointerEventArgs through these phases:
TunnelTargetBubbleThe dispatcher handles:
SvgElement mouse events.The Avalonia and Uno controls expose one shared dispatcher instance through their Interaction property.
SKSvgSKSvg now owns the shared animation runtime. The document model stays shared across hosts, while the UI package only provides timing and invalidation.
Core runtime members include:
HasAnimationsAnimationTimeSetAnimationTime(...)AdvanceAnimation(...)ResetAnimation()AnimationInvalidatedAnimationMinimumRenderIntervalHasPendingAnimationFrameFlushPendingAnimationFrame()LastAnimationDirtyTargetCountThe current runtime supports the repository's shared playback surface for:
setanimateanimateColoranimateTransformanimateMotionbegin and end timing supported by the shared dispatcherSvgAnimationHostBackend is the shared host selection enum:
DefaultManualDispatcherTimerRenderLoopNativeCompositionSvg.Controls.Skia.Avalonia exposes:
AnimationBackendAnimationFrameIntervalAnimationPlaybackRateActualAnimationBackendAnimationBackendFallbackReasonAnimationBackendResolutionAnimationBackendCapabilitiesOn supported hosts, Default prefers NativeComposition, then falls back to RenderLoop, DispatcherTimer, or Manual.
The retained NativeComposition path uses one composition child visual per top-level SVG child and updates animated layers from SKSvg.TryCreateNativeCompositionScene(...) and SKSvg.TryCreateNativeCompositionFrame(...).
Svg.Controls.Skia.Uno exposes the same playback-property surface and the same resolved-backend diagnostics.
Uno currently falls back away from NativeComposition because the active package surface does not provide a working retained child-visual attachment path for this implementation.
Svg.Controls.Skia.Maui exposes the same playback-property surface and the same resolved-backend diagnostics.
MAUI currently resolves automatic playback to DispatcherTimer. RenderLoop and NativeComposition requests fall back to DispatcherTimer or Manual depending on host availability.
The repository also adds two practical validation paths for this work:
tests/Svg.Skia.Benchmarks measures the shared animation renderer and layered redraw behavior.samples/TestApp exposes backend selection, playback rate, clock display, play, pause, and restart controls so you can exercise the runtime manually.For related lower-level guidance, see Hit Testing and Scene Inspection, Svg.Skia, Svg.Controls.Skia.Avalonia, Svg.Controls.Skia.Uno, and Svg.Controls.Skia.Maui.