Skip to content

refactor!: make Resource.GetOriginal() nullable and add RequireOriginal() - #2205

Open
yuto-trd wants to merge 2 commits into
mainfrom
yuto-trd/detached-resource-original
Open

refactor!: make Resource.GetOriginal() nullable and add RequireOriginal()#2205
yuto-trd wants to merge 2 commits into
mainfrom
yuto-trd/detached-resource-original

Conversation

@yuto-trd

@yuto-trd yuto-trd commented Aug 10, 2026

Copy link
Copy Markdown
Member

Description

EngineObject.Resource.GetOriginal() declared a non-nullable return type but could hand out null. Only Update attaches a backing engine object, so a resource built through its public constructor rather than through ToResource() is detached — and in-tree production code already mints and consumes exactly those:

  • Color.ToBrushResource(), reached from TextElementsBuilder
  • the SolidColorBrush.Resource and Pen.Resource that FormattedTextParser builds for a stroke tag
  • the GradientStop.Resource the Avalonia editor adapters build

At each of those call sites the declared type was a lie, and the nullable analysis had nothing to warn about.

This change splits the accessor into the two things call sites actually want:

  • GetOriginal() returns a nullable reference, for call sites that compare identity or already tolerate null.
  • RequireOriginal() throws InvalidOperationException when the resource is detached, for call sites that dispatch to the backing object and cannot proceed without it.
  • IsAttached exposes the same distinction without forcing a null check.

Every existing call site was classified individually rather than mechanically rewritten. The ~47 remaining GetOriginal() uses are identity comparisons (ResourceReconciler, the shape/mesh cache-invalidation checks, GraphSnapshot.FindSlotIndex) or null-tolerant lookups (PlayerView gizmo hit-testing, Scene3DRenderNode); the dispatch sites moved to RequireOriginal().

The source generator mirrors both members onto the generated per-type Resource, so a generated GetOriginal() is nullable and a generated RequireOriginal() is not. Generated BindNodePortValues uses RequireOriginal(), since port binding cannot run against a detached resource.

Affected areas

  • Beutl.Engine (rendering / scene / track)
  • Beutl.ProjectSystem (project / document persistence)
  • UI (Beutl.Editor, Beutl.Editor.Components, Beutl.Controls)
  • Beutl.Extensibility (plugin abstractions)
  • Beutl.NodeGraph (node editor)
  • Beutl.FFmpegIpc / Beutl.FFmpegWorker (media IPC boundary)
  • Beutl.Api (server API client)
  • Build / CI / docs only

Also touches Beutl.Engine.SourceGenerators (the generated Resource class shape).

Breaking changes

EngineObject.Resource.GetOriginal() now returns a nullable reference, and the generated per-type override does the same.

Migration:

  • A call site that dispatches to the backing engine object should call RequireOriginal(), which throws when the resource is detached.
  • A call site that compares identity or already tolerates null can keep GetOriginal() and handle the null.
  • IsAttached is available when the caller wants to branch without a null check.

This is a source-breaking change for out-of-tree plugins that call GetOriginal() in a non-nullable context. It surfaces a null those callers could already receive at runtime, so the fix is a compile-time signal rather than a behavior change.

Test plan

  • Added tests/Beutl.UnitTests/Engine/DetachedResourceTests.cs covering the new contract: ToBrushResource() produces a detached resource (IsAttached == false, GetOriginal() == null), RequireOriginal() throws on a detached resource, ToResource() produces an attached one, and the generated GetOriginal() stays typed to the declaring engine object.
  • dotnet build Beutl.slnx — 0 warnings, 0 errors. The nullable analysis produced 32 warnings after the signature change; each was classified as dispatch or comparison and resolved individually rather than suppressed.
  • dotnet test tests/Beutl.UnitTests — 4978 passed, 0 failed, 3 skipped.
  • dotnet test tests/SourceGeneratorTest — 11 passed, 0 failed.

Fixed issues / References

Split out of the feature 004 (GPU pass fusion) stack so it can be reviewed on its own merits; it has no dependency on that feature's rendering work.

Summary by CodeRabbit

  • New Features

    • Added support for identifying resources attached to an original object.
    • Added explicit handling for detached resources and clear errors when original resources are unavailable.
  • Bug Fixes

    • Improved reliability across rendering, audio, geometry, text, effects, and node-graph processing by preventing invalid original-resource access.
  • Tests

    • Added and updated coverage for detached resources, resource access, disposal, rendering, and node-graph behavior.

…al()

A resource built through its public constructor rather than through
EngineObject.ToResource() has no backing engine object, but GetOriginal()
declared a non-nullable return and handed out a null. In-tree production code
already mints such detached resources -- Color.ToBrushResource() reached from
TextElementsBuilder, the SolidColorBrush.Resource and Pen.Resource that
FormattedTextParser builds for a stroke tag, and the GradientStop.Resource the
Avalonia editor adapters build -- so the declared type was a lie at every one
of those call sites.

GetOriginal() now returns a nullable reference and RequireOriginal() throws
InvalidOperationException when the resource is detached. Call sites that
dispatch to the backing object use RequireOriginal(), because a detached
resource cannot serve the call; call sites that compare identity or tolerate
null keep GetOriginal(). IsAttached exposes the same distinction without
forcing a null check.

The generated per-type Resource class mirrors both members, so a generated
GetOriginal() is nullable and a generated RequireOriginal() is not.

BREAKING CHANGE: EngineObject.Resource.GetOriginal() now returns a nullable
reference, and the generated per-type override does the same. Call sites that
dispatch to the backing engine object should call RequireOriginal() instead,
which throws when the resource is detached. Call sites that compare identity
or already tolerate null can keep GetOriginal() and handle the null. Affects
Beutl.Engine, Beutl.NodeGraph, Beutl.Editor.Components, and Beutl.
Copilot AI lite review requested due to automatic review settings August 10, 2026 08:47
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 7eb7fa5d-c8db-4e08-a809-3238c92e4604

📥 Commits

Reviewing files that changed from the base of the PR and between a268dff and ca711e4.

📒 Files selected for processing (2)
  • src/Beutl.NodeGraph/Nodes/Group/GroupInput.cs
  • tests/Beutl.UnitTests/Engine/DetachedResourceTests.cs
💤 Files with no reviewable changes (1)
  • src/Beutl.NodeGraph/Nodes/Group/GroupInput.cs
🚧 Files skipped from review as they are similar to previous changes (1)
  • tests/Beutl.UnitTests/Engine/DetachedResourceTests.cs

📝 Walkthrough

Walkthrough

Resource now supports detached instances through nullable GetOriginal() and throwing RequireOriginal(). Generated resources and engine consumers use RequireOriginal() when an original object is required. Tests cover attachment state and detached-resource behavior.

Changes

Original-resource access

Layer / File(s) Summary
Resource contract and generated accessors
src/Beutl.Engine/Engine/EngineObject.cs, src/Beutl.Engine.SourceGenerators/Emit/ResourceClassEmitter.cs, tests/SourceGeneratorTest/EngineObject.cs, tests/Beutl.UnitTests/Engine/DetachedResourceTests.cs
Resource now exposes IsAttached, nullable GetOriginal(), and throwing RequireOriginal(). Generated resources emit the updated accessors. Tests cover attached and detached resources.
Rendering, media, audio, and editor consumers
src/Beutl.Engine/Audio/..., src/Beutl.Engine/Graphics/..., src/Beutl.Engine/Graphics3D/..., src/Beutl.Engine/Media/..., src/Beutl.Editor.Components/PathEditorTab/..., src/Beutl/Helpers/AvaloniaTypeConverter.cs
Rendering, geometry, text, mesh, texture, audio, conversion, and path-editor code now use RequireOriginal() before processing original resources.
Node graph resource consumers
src/Beutl.NodeGraph/Composition/GraphSnapshot.cs, src/Beutl.NodeGraph/Nodes/..., tests/Beutl.UnitTests/NodeGraph/GraphSnapshotTests.cs
Node graph updates, snapshots, animation handling, and output propagation now require original nodes.
Regression coverage
tests/Beutl.UnitTests/Engine/FormattedTextDisposalTests.cs, tests/Beutl.UnitTests/Engine/Graphics/Rendering/...
Rendering and formatted-text tests now use RequireOriginal() for attached resource access.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 7.69% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main API changes to Resource.GetOriginal() and RequireOriginal().
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch yuto-trd/detached-resource-original

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@drift-check

drift-check Bot commented Aug 10, 2026

Copy link
Copy Markdown

Code Review Bot

No comment/code divergences or documentation drift detected. Reviewed 46 file(s); skipped 1.

@greptile-apps

greptile-apps Bot commented Aug 10, 2026

Copy link
Copy Markdown

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains.

Important Files Changed

Filename Overview
src/Beutl.Engine/Engine/EngineObject.cs Defines the nullable attachment contract and a clear failure mode for operations requiring an original object.
src/Beutl.Engine.SourceGenerators/Emit/ResourceClassEmitter.cs Mirrors nullable and required accessors onto generated resource types and uses attached originals during node-port binding.
src/Beutl.Engine/Media/TextFormatting/FormattedText.cs Uses required access for cached glyph geometry resources, which are consistently created through the attached ToResource() path.
src/Beutl.NodeGraph/Composition/GraphSnapshot.cs Requires backing graph nodes only after resources have been created and attached through ToResource().
tests/Beutl.UnitTests/Engine/DetachedResourceTests.cs Covers detached detection, nullable access, throwing required access, attached resources, and generated return typing.

Reviews (2): Last reviewed commit: "fix(nodegraph): drop the unused original..." | Re-trigger Greptile

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/Beutl.NodeGraph/Nodes/Group/GroupInput.cs`:
- Line 74: Remove the unused RequireOriginal() call and its node variable from
GroupInput.Resource.Update, allowing detached resources with OuterInputValues to
continue assigning those values to ItemValues without requiring an attached
original.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 00d56cdc-15ad-4164-a320-5d27f653a96c

📥 Commits

Reviewing files that changed from the base of the PR and between 1f82db9 and a268dff.

📒 Files selected for processing (47)
  • src/Beutl.Editor.Components/PathEditorTab/ViewModels/PathEditorViewModel.cs
  • src/Beutl.Editor.Components/PathEditorTab/Views/PathEditorTabView.axaml.cs
  • src/Beutl.Engine.SourceGenerators/Emit/ResourceClassEmitter.cs
  • src/Beutl.Engine/Audio/Composing/Composer.cs
  • src/Beutl.Engine/Audio/SoundGroup.cs
  • src/Beutl.Engine/Engine/EngineObject.cs
  • src/Beutl.Engine/Graphics/AudioVisualizers/AudioVisualizerDrawable.cs
  • src/Beutl.Engine/Graphics/BrushConstructor.cs
  • src/Beutl.Engine/Graphics/DrawablePresenter.cs
  • src/Beutl.Engine/Graphics/DrawableTimeController.cs
  • src/Beutl.Engine/Graphics/FilterEffects/DelayAnimationEffect.cs
  • src/Beutl.Engine/Graphics/FilterEffects/DisplacementMapEffect.cs
  • src/Beutl.Engine/Graphics/FilterEffects/FilterEffectGroup.cs
  • src/Beutl.Engine/Graphics/FilterEffects/FilterEffectPresenter.cs
  • src/Beutl.Engine/Graphics/ImmediateCanvas.cs
  • src/Beutl.Engine/Graphics/Particles/ParticleRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/FilterEffectRenderNode.cs
  • src/Beutl.Engine/Graphics/Rendering/GraphicsContext2D.cs
  • src/Beutl.Engine/Graphics/Rendering/Renderer.cs
  • src/Beutl.Engine/Graphics3D/Meshes/Mesh.cs
  • src/Beutl.Engine/Graphics3D/Textures/DrawableTextureSource.cs
  • src/Beutl.Engine/Media/Geometry/Geometry.cs
  • src/Beutl.Engine/Media/Geometry/PathFigure.cs
  • src/Beutl.Engine/Media/Geometry/PathGeometry.cs
  • src/Beutl.Engine/Media/TextFormatting/FormattedText.cs
  • src/Beutl.NodeGraph/Composition/GraphSnapshot.cs
  • src/Beutl.NodeGraph/Nodes/ConfigureNode.cs
  • src/Beutl.NodeGraph/Nodes/FactoryNode.cs
  • src/Beutl.NodeGraph/Nodes/FilterEffectNode.cs
  • src/Beutl.NodeGraph/Nodes/GeometryNode.cs
  • src/Beutl.NodeGraph/Nodes/Group/GroupInput.cs
  • src/Beutl.NodeGraph/Nodes/Group/GroupNode.cs
  • src/Beutl.NodeGraph/Nodes/LayerInputNode.cs
  • src/Beutl.NodeGraph/Nodes/TextNode.cs
  • src/Beutl.NodeGraph/Nodes/TransformNode.cs
  • src/Beutl.NodeGraph/Nodes/Utilities/ExpressionNode.cs
  • src/Beutl.NodeGraph/Nodes/Utilities/MatrixNode.cs
  • src/Beutl.NodeGraph/Nodes/Utilities/PreviewNode.cs
  • src/Beutl.NodeGraph/Nodes/Utilities/TimeNode.cs
  • src/Beutl/Helpers/AvaloniaTypeConverter.cs
  • tests/Beutl.UnitTests/Engine/DetachedResourceTests.cs
  • tests/Beutl.UnitTests/Engine/FormattedTextDisposalTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/GoldenImageHarness.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/SourceEffectiveScaleFlowTests.cs
  • tests/Beutl.UnitTests/Engine/Graphics/Rendering/StrokeEffectOffsetBoundsTests.cs
  • tests/Beutl.UnitTests/NodeGraph/GraphSnapshotTests.cs
  • tests/SourceGeneratorTest/EngineObject.cs

Comment thread src/Beutl.NodeGraph/Nodes/Group/GroupInput.cs Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors EngineObject.Resource so the backing engine object relationship is correctly represented in the type system: GetOriginal() becomes nullable for detached resources, and new APIs (IsAttached, RequireOriginal()) make “must be attached” call sites explicit. This propagates through generated resource types and updates in-tree call sites and tests accordingly.

Changes:

  • Updated EngineObject.Resource to expose IsAttached, make GetOriginal() nullable, and add RequireOriginal() that throws on detached resources.
  • Updated source generator output to mirror the new nullable/required accessors and to use RequireOriginal() where dispatch is required.
  • Updated call sites across Engine/Editor/NodeGraph plus added unit tests covering detached vs attached behavior.

Reviewed changes

Copilot reviewed 47 out of 47 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
tests/SourceGeneratorTest/EngineObject.cs Updates generator test fixture to match nullable GetOriginal() and new RequireOriginal() contract.
tests/Beutl.UnitTests/NodeGraph/GraphSnapshotTests.cs Uses RequireOriginal() for resource-backed node dispatch in tests.
tests/Beutl.UnitTests/Engine/Graphics/Rendering/StrokeEffectOffsetBoundsTests.cs Uses RequireOriginal() to safely dispatch to effect implementation.
tests/Beutl.UnitTests/Engine/Graphics/Rendering/SourceEffectiveScaleFlowTests.cs Uses RequireOriginal() for filter effect dispatch during scale-flow test.
tests/Beutl.UnitTests/Engine/Graphics/Rendering/Golden/GoldenImageHarness.cs Uses RequireOriginal() when rendering via drawable original.
tests/Beutl.UnitTests/Engine/FormattedTextDisposalTests.cs Uses RequireOriginal() when accessing original glyph path owners.
tests/Beutl.UnitTests/Engine/DetachedResourceTests.cs Adds tests for detached resource behavior and typing of generated GetOriginal().
src/Beutl/Helpers/AvaloniaTypeConverter.cs Switches adapter dispatch paths to RequireOriginal().
src/Beutl.NodeGraph/Nodes/Utilities/TimeNode.cs Uses RequireOriginal() for node update dispatch.
src/Beutl.NodeGraph/Nodes/Utilities/PreviewNode.cs Uses RequireOriginal() for node update dispatch.
src/Beutl.NodeGraph/Nodes/Utilities/MatrixNode.cs Uses RequireOriginal() for node update dispatch.
src/Beutl.NodeGraph/Nodes/Utilities/ExpressionNode.cs Uses RequireOriginal() for node update dispatch.
src/Beutl.NodeGraph/Nodes/TransformNode.cs Uses RequireOriginal() for node update dispatch.
src/Beutl.NodeGraph/Nodes/TextNode.cs Uses RequireOriginal() for node update dispatch.
src/Beutl.NodeGraph/Nodes/LayerInputNode.cs Uses RequireOriginal() for node update dispatch.
src/Beutl.NodeGraph/Nodes/Group/GroupNode.cs Uses RequireOriginal() for initialize/uninitialize/update dispatch.
src/Beutl.NodeGraph/Nodes/Group/GroupInput.cs Uses RequireOriginal() for update dispatch.
src/Beutl.NodeGraph/Nodes/GeometryNode.cs Uses RequireOriginal() for update dispatch.
src/Beutl.NodeGraph/Nodes/FilterEffectNode.cs Uses RequireOriginal() for update dispatch.
src/Beutl.NodeGraph/Nodes/FactoryNode.cs Uses RequireOriginal() for update dispatch.
src/Beutl.NodeGraph/Nodes/ConfigureNode.cs Uses RequireOriginal() for update dispatch.
src/Beutl.NodeGraph/Composition/GraphSnapshot.cs Uses RequireOriginal() where snapshot logic must access node members.
src/Beutl.Engine/Media/TextFormatting/FormattedText.cs Uses RequireOriginal() for path disposal and glyph path updates.
src/Beutl.Engine/Media/Geometry/PathGeometry.cs Uses RequireOriginal() when applying child figures into geometry contexts.
src/Beutl.Engine/Media/Geometry/PathFigure.cs Uses RequireOriginal() when applying segments into geometry contexts.
src/Beutl.Engine/Media/Geometry/Geometry.cs Uses RequireOriginal() when rebuilding cached paths from original geometry.
src/Beutl.Engine/Graphics3D/Textures/DrawableTextureSource.cs Uses RequireOriginal() when rendering drawable into texture.
src/Beutl.Engine/Graphics3D/Meshes/Mesh.cs Uses RequireOriginal() when applying mesh data to cached buffers.
src/Beutl.Engine/Graphics/Rendering/Renderer.cs Uses RequireOriginal() for drawable dispatch and z-index boundary filtering.
src/Beutl.Engine/Graphics/Rendering/GraphicsContext2D.cs Uses RequireOriginal() when drawing a drawable resource.
src/Beutl.Engine/Graphics/Rendering/FilterEffectRenderNode.cs Uses RequireOriginal() when applying filter effects during render processing.
src/Beutl.Engine/Graphics/Particles/ParticleRenderNode.cs Uses RequireOriginal() when rendering drawables into intermediate targets.
src/Beutl.Engine/Graphics/ImmediateCanvas.cs Uses RequireOriginal() for immediate-mode drawable rendering.
src/Beutl.Engine/Graphics/FilterEffects/FilterEffectPresenter.cs Uses RequireOriginal() when dispatching to nested effect target.
src/Beutl.Engine/Graphics/FilterEffects/FilterEffectGroup.cs Uses RequireOriginal() when dispatching child filter effects.
src/Beutl.Engine/Graphics/FilterEffects/DisplacementMapEffect.cs Uses RequireOriginal() when applying transform-backed displacement mapping.
src/Beutl.Engine/Graphics/FilterEffects/DelayAnimationEffect.cs Uses RequireOriginal() when dispatching delayed child effect.
src/Beutl.Engine/Graphics/DrawableTimeController.cs Uses RequireOriginal() when dispatching render/measure to target drawable.
src/Beutl.Engine/Graphics/DrawablePresenter.cs Uses RequireOriginal() when dispatching render/measure to target drawable.
src/Beutl.Engine/Graphics/BrushConstructor.cs Uses RequireOriginal() when rendering a drawable brush into paint/targets.
src/Beutl.Engine/Graphics/AudioVisualizers/AudioVisualizerDrawable.cs Uses RequireOriginal() when composing samples from the sound source.
src/Beutl.Engine/Engine/EngineObject.cs Implements nullable original storage + IsAttached/GetOriginal()/RequireOriginal() contract.
src/Beutl.Engine/Audio/SoundGroup.cs Uses RequireOriginal() when composing child sounds.
src/Beutl.Engine/Audio/Composing/Composer.cs Uses RequireOriginal() when composing from sound resource.
src/Beutl.Engine.SourceGenerators/Emit/ResourceClassEmitter.cs Emits nullable GetOriginal() plus non-null RequireOriginal() and updates node-port binding generation.
src/Beutl.Editor.Components/PathEditorTab/Views/PathEditorTabView.axaml.cs Uses RequireOriginal() when converting geometry to SVG path for background display.
src/Beutl.Editor.Components/PathEditorTab/ViewModels/PathEditorViewModel.cs Uses RequireOriginal() for transform matrix and figure-context lookup.
Suppressed comments (1)

tests/Beutl.UnitTests/Engine/DetachedResourceTests.cs:25

  • This test creates a SolidColorBrush.Resource (IDisposable) without disposing it. Use a using declaration to keep the tests leak-free.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread src/Beutl.Engine/Graphics/Rendering/Renderer.cs
Comment thread tests/Beutl.UnitTests/Engine/DetachedResourceTests.cs Outdated
Comment thread src/Beutl.Engine/Graphics/Rendering/Renderer.cs
GroupInput.Resource.Update read the backing node and never used it. After
GetOriginal() gained RequireOriginal(), that dead lookup became a throw: a
detached resource carrying OuterInputValues could no longer propagate them to
ItemValues even though the copy loop needs nothing from the backing node.

Also dispose the detached resources the new tests construct.
@github-actions

Copy link
Copy Markdown
Contributor

No TODO comments were found.

@github-actions

Copy link
Copy Markdown
Contributor

Code Coverage

Package Line Rate Branch Rate Complexity Health
Beutl 25% 16% 11162
Beutl.AgentToolkit 90% 74% 7523
Beutl.Api 31% 18% 1422
Beutl.Configuration 63% 40% 425
Beutl.Controls 35% 14% 5555
Beutl.Core 69% 60% 3108
Beutl.Editor 82% 79% 2857
Beutl.Editor.Components 23% 15% 9788
Beutl.Embedding.MediaFoundation 6% 8% 1374
Beutl.Engine 69% 59% 19442
Beutl.Engine.SourceGenerators 59% 44% 540
Beutl.ExceptionHandler 0% 0% 45
Beutl.Extensibility 71% 74% 167
Beutl.Extensions.AVFoundation 5% 2% 202
Beutl.Extensions.FFmpeg 28% 26% 738
Beutl.Extensions.FFmpeg.Core 50% 30% 323
Beutl.FFmpegIpc 27% 35% 858
Beutl.FFmpegWorker 4% 4% 898
Beutl.Language 52% 50% 1515
Beutl.NodeGraph 26% 17% 2519
Beutl.PackageTools.UI 0% 0% 676
Beutl.ProjectSystem 78% 63% 1269
Beutl.Testing.Headless 88% 92% 15
Beutl.Threading 100% 90% 137
Beutl.Utilities 94% 87% 358
Beutl.WaitingDialog 0% 0% 36
Iciclecreek.Avalonia.Terminal 35% 22% 1164
XTerm.NET 20% 12% 2009
Summary 47% (95214 / 200504) 38% (22446 / 58877) 76125

Minimum allowed line rate is 0%

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants