{"record":{"id":"511fa594cf37e373","repo":"AvaloniaUI/Avalonia","slug":"o-gettype-is-not-compatible-with-composition","errorCode":null,"errorMessage":"{o.GetType()} is not compatible with composition","messagePattern":"(.+?) is not compatible with composition","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Avalonia.Base/Rendering/Composition/Drawing/ServerResourceHelperExtensions.cs","lineNumber":51,"sourceCode":"    }\n\n    public static IPen? GetServer(this IPen? pen, Compositor? compositor)\n    {\n        if (compositor == null)\n            return pen;\n        if (pen == null)\n            return null;\n        if (pen is ImmutablePen immutable)\n            return immutable;\n        if (pen is ICompositionRenderResource<IPen> resource)\n            return resource.GetForCompositor(compositor);\n        ThrowNotCompatible(pen);\n        return null;\n    }\n\n    [MethodImpl(MethodImplOptions.NoInlining), DoesNotReturn]\n    static void ThrowNotCompatible(object o) =>\n        throw new InvalidOperationException(o.GetType() + \" is not compatible with composition\");\n\n    [MethodImpl(MethodImplOptions.NoInlining), DoesNotReturn]\n    static void ThrowForeignCompositor(CompositionObject o) =>\n        throw new InvalidOperationException(o.GetType() + \" belongs to a different compositor\");\n    \n    public static ITransform? GetServer(this ITransform? transform, Compositor? compositor)\n    {\n        if (compositor == null)\n            return transform;\n        if (transform == null)\n            return null;\n        if (transform is ImmutableTransform immutable)\n            return immutable;\n        if (transform is ICompositionRenderResource<ITransform> resource)\n            resource.GetForCompositor(compositor);\n        return new ImmutableTransform(transform.Value);\n    }\n","sourceCodeStart":33,"sourceCodeEnd":69,"githubUrl":"https://github.com/AvaloniaUI/Avalonia/blob/11c542726898ae954a1ef668c65ec79ec92ab17d/src/Avalonia.Base/Rendering/Composition/Drawing/ServerResourceHelperExtensions.cs#L33-L69","documentation":"ServerResourceHelperExtensions.GetServer maps a brush/pen/geometry/transform to its server form; it accepts immutable variants and ICompositionRenderResource, and otherwise calls ThrowNotCompatible with the type name. The helper runs whenever composition drawing resolves a non-immutable resource to a server object on a given compositor.","triggerScenarios":"Passing a brush, pen, geometry, or transform to composition drawing that is neither immutable (IImmutableBrush/ImmutablePen/ImmutableTransform) nor an ICompositionRenderResource, while a compositor is in use.","commonSituations":"Using a custom mutable IBrush/IPen/Geometry that does not implement ICompositionRenderResource with a composition render path; third-party media types that are not composition-aware.","solutions":["Use immutable variants or composition-backed resources (implement ICompositionRenderResource) for composition rendering.","Wrap custom brushes/pens in their immutable equivalents before handing them to composition drawing.","Implement ICompositionRenderResource on custom resource types so GetServer can resolve them."],"exampleFix":"// before\nctx.DrawLine(myCustomPen, p1, p2); // custom pen not composition/immutable -> throws\n\n// after\nvar pen = new ImmutablePen(new ImmutableSolidColorBrush(color, 1), thickness);\nctx.DrawLine(pen, p1, p2);","handlingStrategy":"type-guard","validationCode":"static bool IsCompositionCompatible(object? r) =>\n    r is null or IImmutableBrush or ImmutablePen or ImmutableTransform or ICompositionRenderResource;","typeGuard":"static bool IsCompositionOrImmutable(object? r) =>\n    r is ICompositionRenderResource or IImmutableBrush or ImmutablePen or ImmutableTransform;","tryCatchPattern":null,"preventionTips":["Use immutable variants or ICompositionRenderResource implementations for composition rendering.","Wrap custom brushes/pens/geometries in immutable equivalents before composition drawing.","Implement ICompositionRenderResource on custom resource types."],"tags":["composition","drawing","resource","type-mismatch"],"backgroundTag":null,"analyzedSha":"11c542726898ae954a1ef668c65ec79ec92ab17d","analyzedAt":"2026-08-13T11:57:40.261Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}