Skip to content

Commit 8e4bd7a

Browse files
Arlodotexemichael-hawker
authored andcommitted
Fixed compositor nullreference in WinUI 3
1 parent bef863c commit 8e4bd7a

File tree

7 files changed

+58
-12
lines changed

7 files changed

+58
-12
lines changed

components/Media/src/Brushes/BackdropGammaTransferBrush.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,14 @@ protected override void OnConnected()
345345
return;
346346
}
347347

348-
var backdrop = Window.Current.Compositor.CreateBackdropBrush();
348+
349+
#if WINUI2
350+
var compositor = Window.Current.Compositor;
351+
#elif WINUI3
352+
var compositor = CompositionTarget.GetCompositorForCurrentThread();
353+
#endif
354+
355+
var backdrop = compositor.CreateBackdropBrush();
349356

350357
// Use a Win2D blur affect applied to a CompositionBackdropBrush.
351358
var graphicsEffect = new GammaTransferEffect
@@ -370,7 +377,7 @@ protected override void OnConnected()
370377
Source = new CompositionEffectSourceParameter("backdrop")
371378
};
372379

373-
var effectFactory = Window.Current.Compositor.CreateEffectFactory(graphicsEffect, new[]
380+
var effectFactory = compositor.CreateEffectFactory(graphicsEffect, new[]
374381
{
375382
"GammaTransfer.AlphaAmplitude",
376383
"GammaTransfer.AlphaExponent",

components/Media/src/Brushes/CanvasBrushBase.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,13 @@ protected override void OnConnected()
6666
_graphics.RenderingDeviceReplaced -= CanvasDevice_RenderingDeviceReplaced;
6767
}
6868

69-
_graphics = CanvasComposition.CreateCompositionGraphicsDevice(Window.Current.Compositor, _device);
69+
#if WINUI2
70+
var compositor = Window.Current.Compositor;
71+
#elif WINUI3
72+
var compositor = CompositionTarget.GetCompositorForCurrentThread();
73+
#endif
74+
75+
_graphics = CanvasComposition.CreateCompositionGraphicsDevice(compositor, _device);
7076
_graphics.RenderingDeviceReplaced += CanvasDevice_RenderingDeviceReplaced;
7177

7278
// Delay creating composition resources until they're required.
@@ -95,7 +101,7 @@ protected override void OnConnected()
95101
}
96102
}
97103

98-
_surfaceBrush = Window.Current.Compositor.CreateSurfaceBrush(surface);
104+
_surfaceBrush = compositor.CreateSurfaceBrush(surface);
99105
_surfaceBrush.Stretch = CompositionStretch.Fill;
100106

101107
CompositionBrush = _surfaceBrush;

components/Media/src/Brushes/ImageBlendBrush.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,15 +126,22 @@ private static void OnModeChanged(DependencyObject d, DependencyPropertyChangedE
126126
/// <inheritdoc/>
127127
protected override void OnConnected()
128128
{
129+
#if WINUI2
130+
var compositor = Window.Current.Compositor;
131+
#elif WINUI3
132+
var compositor = CompositionTarget.GetCompositorForCurrentThread();
133+
#endif
134+
129135
// Delay creating composition resources until they're required.
130136
if (CompositionBrush == null && Source != null && Source is BitmapImage bitmap)
131137
{
132138
// Use LoadedImageSurface API to get ICompositionSurface from image uri provided
133139
// If UriSource is invalid, StartLoadFromUri will return a blank texture.
134140
_surface = LoadedImageSurface.StartLoadFromUri(bitmap.UriSource);
135141

142+
136143
// Load Surface onto SurfaceBrush
137-
_surfaceBrush = Window.Current.Compositor.CreateSurfaceBrush(_surface);
144+
_surfaceBrush = compositor.CreateSurfaceBrush(_surface);
138145
_surfaceBrush.Stretch = CompositionStretchFromStretch(Stretch);
139146

140147
#if WINUI2
@@ -150,7 +157,7 @@ protected override void OnConnected()
150157
return;
151158
}
152159

153-
var backdrop = Window.Current.Compositor.CreateBackdropBrush();
160+
var backdrop = compositor.CreateBackdropBrush();
154161

155162
// Use a Win2D invert affect applied to a CompositionBackdropBrush.
156163
var graphicsEffect = new CanvasBlendEffect
@@ -161,7 +168,7 @@ protected override void OnConnected()
161168
Foreground = new CompositionEffectSourceParameter("image")
162169
};
163170

164-
var effectFactory = Window.Current.Compositor.CreateEffectFactory(graphicsEffect);
171+
var effectFactory = compositor.CreateEffectFactory(graphicsEffect);
165172
var effectBrush = effectFactory.CreateBrush();
166173

167174
effectBrush.SetSourceParameter("backdrop", backdrop);

components/Media/src/Helpers/SurfaceLoader.Instance.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,12 @@ public sealed partial class SurfaceLoader : IDisposable
4343
/// <returns>A <see cref="SurfaceLoader"/> instance to use in the current window</returns>
4444
public static SurfaceLoader GetInstance()
4545
{
46-
return GetInstance(Window.Current.Compositor);
46+
#if WINUI2
47+
var compositor = Window.Current.Compositor;
48+
#elif WINUI3
49+
var compositor = CompositionTarget.GetCompositorForCurrentThread();
50+
#endif
51+
return GetInstance(compositor);
4752
}
4853

4954
/// <summary>

components/Media/src/Helpers/SurfaceLoader.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ public sealed partial class SurfaceLoader
4444
/// <returns>A <see cref="Task{T}"/> that returns the loaded <see cref="CompositionBrush"/> instance</returns>
4545
public static async Task<CompositionBrush?> LoadImageAsync(Uri uri, DpiMode dpiMode, CacheMode cacheMode = CacheMode.Default)
4646
{
47+
#if WINUI2
4748
var compositor = Window.Current.Compositor;
49+
#elif WINUI3
50+
var compositor = CompositionTarget.GetCompositorForCurrentThread();
51+
#endif
4852

4953
// Lock and check the cache first
5054
using (await Win2DMutex.LockAsync())

components/Media/src/Pipelines/PipelineBuilder.Initialization.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,12 @@ public static PipelineBuilder FromBackdrop()
4646
{
4747
ValueTask<CompositionBrush> Factory()
4848
{
49-
var brush = BackdropBrushCache.GetValue(Window.Current.Compositor, c => c.CreateBackdropBrush());
49+
#if WINUI2
50+
var compositor = Window.Current.Compositor;
51+
#elif WINUI3
52+
var compositor = CompositionTarget.GetCompositorForCurrentThread();
53+
#endif
54+
var brush = BackdropBrushCache.GetValue(compositor, c => c.CreateBackdropBrush());
5055

5156
return new ValueTask<CompositionBrush>(brush);
5257
}

components/Media/src/Pipelines/PipelineBuilder.cs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,12 @@ private PipelineBuilder(
160160
[Pure]
161161
public async Task<CompositionBrush> BuildAsync()
162162
{
163+
#if WINUI2
164+
var compositor = Window.Current.Compositor;
165+
#elif WINUI3
166+
var compositor = CompositionTarget.GetCompositorForCurrentThread();
167+
#endif
168+
163169
var effect = await this.sourceProducer() as IGraphicsEffect;
164170

165171
// Validate the pipeline
@@ -170,8 +176,8 @@ public async Task<CompositionBrush> BuildAsync()
170176

171177
// Build the effects factory
172178
var factory = this.animationProperties.Count > 0
173-
? Window.Current.Compositor.CreateEffectFactory(effect, this.animationProperties)
174-
: Window.Current.Compositor.CreateEffectFactory(effect);
179+
? compositor.CreateEffectFactory(effect, this.animationProperties)
180+
: compositor.CreateEffectFactory(effect);
175181

176182
// Create the effect factory and apply the final effect
177183
var effectBrush = factory.CreateBrush();
@@ -191,7 +197,13 @@ public async Task<CompositionBrush> BuildAsync()
191197
/// <returns>A <see cref="Task{T}"/> that returns the final <see cref="SpriteVisual"/> instance to use</returns>
192198
public async Task<SpriteVisual> AttachAsync(UIElement target, UIElement? reference = null)
193199
{
194-
SpriteVisual visual = Window.Current.Compositor.CreateSpriteVisual();
200+
#if WINUI2
201+
var compositor = Window.Current.Compositor;
202+
#elif WINUI3
203+
var compositor = CompositionTarget.GetCompositorForCurrentThread();
204+
#endif
205+
206+
SpriteVisual visual = compositor.CreateSpriteVisual();
195207

196208
visual.Brush = await BuildAsync();
197209

0 commit comments

Comments
 (0)