Repository navigation
v0.1.53
Highlights
ReportAsset — a single way to ship report assets
Fonts, images and other report resources can now be declared once as a
ReportAsset MSBuild item. The build translates it into each host framework's
own item type (MauiAsset, AvaloniaResource, EmbeddedResource, …), and a new
EmbeddedAssetFileSystem reads assets straight from the manifest resources of
assemblies marked with [PysarAssetSource]. This means a shared report library
can carry its own fonts and images, and every host can see them.
A new FallbackFileSystem chains the platform's own asset source ahead of the
embedded one. All five UI platforms (MAUI, WPF, Avalonia, Uno, Blazor) and both
disk-backed DefaultReportPlatformHandler constructors install this chain, so
console apps, workers, server-side rendering and the design-time preview resolve
embedded assets too.
An
IFileSystemyou pass explicitly is not widened — it stays the caller's
whole answer.
Trimming support
Pysar.dll now embeds an ILLink.Descriptors.xml, and Pysar.Xaml ships a
build/Pysar.Xaml.targets that auto-generates an embedded trimmer descriptor for
any project containing .rxaml reports (opt out with PysarDisableTrimmerRoots).
See docs/trimming.md for WebAssembly trimming behaviour.
Avalonia: shared renderer and export
New PysarAvalonia entry point with a shared renderer/export service and proper
reset logic behind AppBuilderExtensions, plus headless Avalonia tests.
Platform layer refactor
Platform-specific handlers are replaced by DefaultReportPlatformHandler backed
by per-platform IFileSystem implementations. Desktop/macOS printing and the
macOS pinch monitor moved into Pysar.Viewer.Platform, and desktop print logic is
centralised in DesktopPdfPrint. Obsolete platform shims were removed.
Performance
ImageRenderCache— a session-scoped cache for image bytes, bitmaps and
SVGs, wired into both the prefetch and draw paths, with failure tracking and
deterministic disposal.- Faster layout —
GridLayoutMeasurer,StackLayoutMeasurer,TextMeasurer
andLayoutEnginewere reworked;BindingEngineandPropertyPathResolver
were optimised. - Removed the
#if DEBUG[Pysar.Perf]zoom instrumentation that logged to the
console in every consumer's Debug build.
Fixes
- Stale pinch-zoom tiles — rapid pinch commits could leave superseded zoom
generations in the tile cache, keeping cells from older scales on screen. Only
the active generation and one bridge generation are kept now. - Touch axis lock —
ReportViewlocks a swipe to its dominant axis, so
scrolling no longer drifts sideways. - WPF printing — the printer now imports the viewer platform namespace it
needs for the print flow.
Authoring and tooling
- XAML source generation: richer binding validation with namespace/name
collection and real diagnostics. - New API surface:
StyleExtensions.WithStyle,AddElementsoverloads on
ReportContainer,PysarBuilder.AddFonts, and a defaultBandheight. - Quick start and the MAUI/Uno/Avalonia READMEs now document
ReportAsset
instead of hand-declared asset items.
Breaking changes
MeasureAsync/ProbeAsyncare now synchronousMeasure/Probe
throughout the layout and rendering pipeline. Custom element measurers and any
code calling the measure API must dropawaitand theTaskreturn type.- Platform handler types removed —
MauiReportPlatformHandler,
WpfReportPlatformHandlerandAvaloniaReportPlatformHandlerare gone; use
DefaultReportPlatformHandler(installed for you byUsePysar/
AddPysar/UsePysar()on the app builder). IImageCache/LocalImageCachelost members superseded byImageRenderCache.PysarWpfandPysar.Avalonia.ReportViewhelper shims were removed.
Tests
~2,000 lines of new test coverage: embedded-asset and fallback file systems,
per-platform asset chains, pinch-commit placement, image-render caching, PDF
print on desktop, trimmer roots and package layout, and binding validation.