Skip to content

v0.1.53

Choose a tag to compare

@kolodiichyk kolodiichyk released this 20 Sep 07:58
· 8 commits to main since this release

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 IFileSystem you 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
    and LayoutEngine were reworked; BindingEngine and PropertyPathResolver
    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 — ReportView locks 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, AddElements overloads on
    ReportContainer, PysarBuilder.AddFonts, and a default Band height.
  • Quick start and the MAUI/Uno/Avalonia READMEs now document ReportAsset
    instead of hand-declared asset items.

Breaking changes

  • MeasureAsync / ProbeAsync are now synchronous Measure / Probe
    throughout the layout and rendering pipeline. Custom element measurers and any
    code calling the measure API must drop await and the Task return type.
  • Platform handler types removed — MauiReportPlatformHandler,
    WpfReportPlatformHandler and AvaloniaReportPlatformHandler are gone; use
    DefaultReportPlatformHandler (installed for you by UsePysar /
    AddPysar / UsePysar() on the app builder).
  • IImageCache / LocalImageCache lost members superseded by ImageRenderCache.
  • PysarWpf and Pysar.Avalonia.ReportView helper 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.