diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 3dff89f5ec..96c09a8789 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -239,7 +239,7 @@ namespace Avalonia.Controls } /// - IRenderTarget IRenderRoot.CreateRenderTarget() + IRenderTarget IRenderRoot.CreateRenderTarget(IVisualBrushRenderer visualBrushRenderer) { return _renderInterface.CreateRenderTarget(PlatformImpl.Handle); } diff --git a/src/Avalonia.Visuals/Avalonia.Visuals.csproj b/src/Avalonia.Visuals/Avalonia.Visuals.csproj index 35aaada8b8..10074c5026 100644 --- a/src/Avalonia.Visuals/Avalonia.Visuals.csproj +++ b/src/Avalonia.Visuals/Avalonia.Visuals.csproj @@ -118,6 +118,7 @@ + diff --git a/src/Avalonia.Visuals/Media/Imaging/RenderTargetBitmap.cs b/src/Avalonia.Visuals/Media/Imaging/RenderTargetBitmap.cs index cefd2ec9d8..9d3f15f69a 100644 --- a/src/Avalonia.Visuals/Media/Imaging/RenderTargetBitmap.cs +++ b/src/Avalonia.Visuals/Media/Imaging/RenderTargetBitmap.cs @@ -58,6 +58,7 @@ namespace Avalonia.Media.Imaging return factory.CreateRenderTargetBitmap(width, height, dpiX, dpiY); } - public IDrawingContextImpl CreateDrawingContext() => PlatformImpl.CreateDrawingContext(); + /// + public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer vbr) => PlatformImpl.CreateDrawingContext(vbr); } } diff --git a/src/Avalonia.Visuals/Platform/IRenderTarget.cs b/src/Avalonia.Visuals/Platform/IRenderTarget.cs index fcde194884..765d7a9d9d 100644 --- a/src/Avalonia.Visuals/Platform/IRenderTarget.cs +++ b/src/Avalonia.Visuals/Platform/IRenderTarget.cs @@ -3,6 +3,7 @@ using System; using Avalonia.Media; +using Avalonia.Rendering; namespace Avalonia.Platform { @@ -17,6 +18,10 @@ namespace Avalonia.Platform /// /// Creates an for a rendering session. /// - IDrawingContextImpl CreateDrawingContext(); + /// + /// A render to be used to render visual brushes. May be null if no visual brushes are + /// to be drawn. + /// + IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer); } } diff --git a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs index 7ec841bba9..b9e6a53a4a 100644 --- a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs @@ -10,7 +10,7 @@ using System.IO; namespace Avalonia.Rendering { - public class DeferredRenderer : RendererBase, IRenderer + public class DeferredRenderer : RendererBase, IRenderer, IVisualBrushRenderer { private readonly IDispatcher _dispatcher; private readonly IRenderLoop _renderLoop; @@ -102,6 +102,11 @@ namespace Avalonia.Rendering Render(_scene); } + void IVisualBrushRenderer.RenderVisualBrush(IDrawingContextImpl context, VisualBrush brush) + { + throw new NotImplementedException(); + } + private void Render(Scene scene) { _rendering = true; @@ -163,7 +168,7 @@ namespace Avalonia.Rendering var renderTarget = _layers[layer.LayerRoot].Bitmap; var node = (VisualNode)scene.FindNode(layer.LayerRoot); - using (var context = renderTarget.CreateDrawingContext()) + using (var context = renderTarget.CreateDrawingContext(this)) { foreach (var rect in layer.Dirty) { @@ -189,7 +194,7 @@ namespace Avalonia.Rendering { var overlay = GetOverlay(scene.Size, scene.Scaling); - using (var context = overlay.CreateDrawingContext()) + using (var context = overlay.CreateDrawingContext(this)) { context.Clear(Colors.Transparent); RenderDirtyRects(context); @@ -217,10 +222,10 @@ namespace Avalonia.Rendering { if (_renderTarget == null) { - _renderTarget = ((IRenderRoot)_root).CreateRenderTarget(); + _renderTarget = ((IRenderRoot)_root).CreateRenderTarget(this); } - using (var context = _renderTarget.CreateDrawingContext()) + using (var context = _renderTarget.CreateDrawingContext(this)) { var clientRect = new Rect(scene.Size); diff --git a/src/Avalonia.Visuals/Rendering/IRenderRoot.cs b/src/Avalonia.Visuals/Rendering/IRenderRoot.cs index 09639cdaff..1c870cd8cb 100644 --- a/src/Avalonia.Visuals/Rendering/IRenderRoot.cs +++ b/src/Avalonia.Visuals/Rendering/IRenderRoot.cs @@ -28,7 +28,7 @@ namespace Avalonia.Rendering /// Creates a render target for the window. /// /// An . - IRenderTarget CreateRenderTarget(); + IRenderTarget CreateRenderTarget(IVisualBrushRenderer visualBrushRenderer); /// /// Adds a rectangle to the window's dirty region. diff --git a/src/Avalonia.Visuals/Rendering/IVisualBrushRenderer.cs b/src/Avalonia.Visuals/Rendering/IVisualBrushRenderer.cs new file mode 100644 index 0000000000..33d0ee258c --- /dev/null +++ b/src/Avalonia.Visuals/Rendering/IVisualBrushRenderer.cs @@ -0,0 +1,19 @@ +using System; +using Avalonia.Media; + +namespace Avalonia.Rendering +{ + /// + /// Defines a renderer used to render a visual brush to a bitmap. + /// + public interface IVisualBrushRenderer + { + /// + /// Renders a visual brush to a bitmap. + /// + /// The drawing context to render to. + /// The visual brush. + /// A bitmap containing the rendered brush. + void RenderVisualBrush(IDrawingContextImpl context, VisualBrush brush); + } +} diff --git a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs index ec5c65f7cd..9edb0251e6 100644 --- a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs @@ -8,10 +8,11 @@ using System.Collections.Generic; using Avalonia.Threading; using Avalonia.Media; using System.Linq; +using Avalonia.Media.Imaging; namespace Avalonia.Rendering { - public class ImmediateRenderer : RendererBase, IRenderer + public class ImmediateRenderer : RendererBase, IRenderer, IVisualBrushRenderer { private readonly IRenderLoop _renderLoop; private readonly IVisual _root; @@ -42,7 +43,7 @@ namespace Avalonia.Rendering public static void Render(IVisual visual, IRenderTarget target) { using (var renderer = new ImmediateRenderer(visual)) - using (var context = new DrawingContext(target.CreateDrawingContext())) + using (var context = new DrawingContext(target.CreateDrawingContext(renderer))) { renderer.Render(context, visual, visual.Bounds); } @@ -78,6 +79,12 @@ namespace Avalonia.Rendering { } + void IVisualBrushRenderer.RenderVisualBrush(IDrawingContextImpl context, VisualBrush brush) + { + var visual = brush.Visual; + Render(new DrawingContext(context), visual, visual.Bounds); + } + private static void ClearTransformedBounds(IVisual visual) { foreach (var e in visual.GetSelfAndVisualDescendents()) @@ -134,12 +141,12 @@ namespace Avalonia.Rendering { if (_renderTarget == null) { - _renderTarget = ((IRenderRoot)_root).CreateRenderTarget(); + _renderTarget = ((IRenderRoot)_root).CreateRenderTarget(this); } try { - using (var context = new DrawingContext(_renderTarget.CreateDrawingContext())) + using (var context = new DrawingContext(_renderTarget.CreateDrawingContext(this))) { Render(context, _root, _root.Bounds); diff --git a/src/Avalonia.Visuals/Rendering/RenderLayer.cs b/src/Avalonia.Visuals/Rendering/RenderLayer.cs index cf02644a45..df9497af6f 100644 --- a/src/Avalonia.Visuals/Rendering/RenderLayer.cs +++ b/src/Avalonia.Visuals/Rendering/RenderLayer.cs @@ -33,7 +33,7 @@ namespace Avalonia.Rendering { var resized = _factory.CreateLayer(LayerRoot, size * scaling, 96 * scaling, 96 * scaling); - using (var context = resized.CreateDrawingContext()) + using (var context = resized.CreateDrawingContext(null)) { context.Clear(Colors.Transparent); context.DrawImage(Bitmap, 1, new Rect(Size), new Rect(Size)); diff --git a/src/Gtk/Avalonia.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs b/src/Gtk/Avalonia.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs index 0c52858dc6..b946d608be 100644 --- a/src/Gtk/Avalonia.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs +++ b/src/Gtk/Avalonia.Cairo/Media/Imaging/RenderTargetBitmapImpl.cs @@ -41,9 +41,9 @@ namespace Avalonia.Cairo.Media.Imaging Surface.WriteToPng(fileName); } - public IDrawingContextImpl CreateDrawingContext() + public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) { - return _renderTarget.CreateDrawingContext(); + return _renderTarget.CreateDrawingContext(visualBrushRenderer); } public void Save(Stream stream) diff --git a/src/Gtk/Avalonia.Cairo/RenderTarget.cs b/src/Gtk/Avalonia.Cairo/RenderTarget.cs index a4a41cb22d..92ed71e0fd 100644 --- a/src/Gtk/Avalonia.Cairo/RenderTarget.cs +++ b/src/Gtk/Avalonia.Cairo/RenderTarget.cs @@ -47,8 +47,9 @@ namespace Avalonia.Cairo /// /// Creates a cairo surface that targets a platform-specific resource. /// + /// The visual brush renderer to use. /// A surface wrapped in an . - public IDrawingContextImpl CreateDrawingContext() + public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) { if (_window != null) return new Media.DrawingContext(_window.GdkWindow); diff --git a/src/Shared/RenderHelpers/TileBrushImplHelper.cs b/src/Shared/RenderHelpers/TileBrushImplHelper.cs index f85df811e4..fc0057f01b 100644 --- a/src/Shared/RenderHelpers/TileBrushImplHelper.cs +++ b/src/Shared/RenderHelpers/TileBrushImplHelper.cs @@ -42,13 +42,6 @@ namespace Avalonia.RenderHelpers if (control != null) { EnsureInitialized(control); - - if (control.IsArrangeValid == false) - { - control.Measure(Size.Infinity); - control.Arrange(new Rect(control.DesiredSize)); - } - _imageSize = control.Bounds.Size; IsValid = true; } @@ -182,28 +175,39 @@ namespace Avalonia.RenderHelpers return transform; } - private static Size CalculateIntermediateSize( - TileMode tileMode, - Size targetSize, - Size destinationSize) => tileMode == TileMode.None ? targetSize : destinationSize; - - private static void EnsureInitialized(IControl control) + public static void EnsureInitialized(IVisual visual) { - foreach (var i in control.GetSelfAndVisualDescendents()) - { - var c = i as IControl; + var control = visual as IControl; - if (c?.IsInitialized == false) + if (control != null) + { + foreach (var i in control.GetSelfAndVisualDescendents()) { - var init = c as ISupportInitialize; + var c = i as IControl; - if (init != null) + if (c?.IsInitialized == false) { - init.BeginInit(); - init.EndInit(); + var init = c as ISupportInitialize; + + if (init != null) + { + init.BeginInit(); + init.EndInit(); + } } } + + if (!control.IsArrangeValid) + { + control.Measure(Size.Infinity); + control.Arrange(new Rect(control.DesiredSize)); + } } } + + private static Size CalculateIntermediateSize( + TileMode tileMode, + Size targetSize, + Size destinationSize) => tileMode == TileMode.None ? targetSize : destinationSize; } } \ No newline at end of file diff --git a/src/Skia/Avalonia.Skia.Android/RenderTarget.cs b/src/Skia/Avalonia.Skia.Android/RenderTarget.cs index 18045e1a5a..68e30ea34f 100644 --- a/src/Skia/Avalonia.Skia.Android/RenderTarget.cs +++ b/src/Skia/Avalonia.Skia.Android/RenderTarget.cs @@ -4,6 +4,7 @@ using Avalonia.Platform; using SkiaSharp; using Android.Graphics; using Android.Views; +using Avalonia.Rendering; namespace Avalonia.Skia { @@ -11,7 +12,7 @@ namespace Avalonia.Skia { public SKSurface Surface { get; protected set; } - public virtual IDrawingContextImpl CreateDrawingContext() + public virtual IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) { return new DrawingContextImpl(Surface.Canvas); } @@ -66,9 +67,9 @@ namespace Avalonia.Skia h = surfaceView.Height; } - public override IDrawingContextImpl CreateDrawingContext() + public override IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) { - base.CreateDrawingContext(); + base.CreateDrawingContext(visualBrushRenderer); FixSize(); var canvas = Surface.Canvas; diff --git a/src/Skia/Avalonia.Skia.Android/SkiaRenderView.cs b/src/Skia/Avalonia.Skia.Android/SkiaRenderView.cs index f176e9fb06..8b2e5042b3 100644 --- a/src/Skia/Avalonia.Skia.Android/SkiaRenderView.cs +++ b/src/Skia/Avalonia.Skia.Android/SkiaRenderView.cs @@ -29,7 +29,7 @@ namespace Avalonia.Skia.Android { if (_renderTarget == null) return; - using (var ctx = _renderTarget.CreateDrawingContext()) + using (var ctx = _renderTarget.CreateDrawingContext(null)) OnRender(new DrawingContext(ctx)); } diff --git a/src/Skia/Avalonia.Skia.Desktop/RenderTarget.cs b/src/Skia/Avalonia.Skia.Desktop/RenderTarget.cs index f8f0d633c6..7d18b2cb21 100644 --- a/src/Skia/Avalonia.Skia.Desktop/RenderTarget.cs +++ b/src/Skia/Avalonia.Skia.Desktop/RenderTarget.cs @@ -2,6 +2,7 @@ using System; using Avalonia.Media; using Avalonia.Platform; using SkiaSharp; +using Avalonia.Rendering; #if WIN32 using Avalonia.Win32.Interop; #endif @@ -12,7 +13,7 @@ namespace Avalonia.Skia { public SKSurface Surface { get; protected set; } - public virtual IDrawingContextImpl CreateDrawingContext() + public virtual IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) { return new DrawingContextImpl(Surface.Canvas); } @@ -100,7 +101,7 @@ namespace Avalonia.Skia return new Size(96, 96); } - public override IDrawingContextImpl CreateDrawingContext() + public override IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) { FixSize(); diff --git a/src/Skia/Avalonia.Skia.iOS/RenderTarget.cs b/src/Skia/Avalonia.Skia.iOS/RenderTarget.cs index a2be292bc6..ebc2bc60ca 100644 --- a/src/Skia/Avalonia.Skia.iOS/RenderTarget.cs +++ b/src/Skia/Avalonia.Skia.iOS/RenderTarget.cs @@ -4,6 +4,7 @@ using Avalonia.Platform; using SkiaSharp; using CoreGraphics; using UIKit; +using Avalonia.Rendering; namespace Avalonia.Skia { @@ -11,7 +12,7 @@ namespace Avalonia.Skia { public SKSurface Surface { get; protected set; } - public virtual IDrawingContextImpl CreateDrawingContext() + public virtual IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) { return new DrawingContextImpl(Surface.Canvas); } @@ -88,7 +89,7 @@ namespace Avalonia.Skia h = (int)bounds.Height; } - public override IDrawingContextImpl CreateDrawingContext() + public override IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) { FixSize(); diff --git a/src/Skia/Avalonia.Skia/BitmapImpl.cs b/src/Skia/Avalonia.Skia/BitmapImpl.cs index ab212e10cf..4ac8e87901 100644 --- a/src/Skia/Avalonia.Skia/BitmapImpl.cs +++ b/src/Skia/Avalonia.Skia/BitmapImpl.cs @@ -5,6 +5,7 @@ using System.Runtime.InteropServices; using System.Text; using Avalonia.Media; using Avalonia.Platform; +using Avalonia.Rendering; using SkiaSharp; namespace Avalonia.Skia @@ -74,7 +75,7 @@ namespace Avalonia.Skia } } - public IDrawingContextImpl CreateDrawingContext() + public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) { return new BitmapDrawingContext(Bitmap); diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs index 14acf5f580..a1cc68442c 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs @@ -192,7 +192,7 @@ namespace Avalonia.Skia var helper = new TileBrushImplHelper(tileBrush, targetSize); var bitmap = new BitmapImpl((int)helper.IntermediateSize.Width, (int)helper.IntermediateSize.Height); rv.AddDisposable(bitmap); - using (var ctx = bitmap.CreateDrawingContext()) + using (var ctx = bitmap.CreateDrawingContext(null)) helper.DrawIntermediate(new DrawingContext(ctx)); SKMatrix translation = SKMatrix.MakeTranslation(-(float)helper.DestinationRect.X, -(float)helper.DestinationRect.Y); SKShaderTileMode tileX = diff --git a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs index 2c841bedb5..6660dd1ccb 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs @@ -6,6 +6,8 @@ using System.Collections; using System.Collections.Generic; using Avalonia.Media; using Avalonia.Platform; +using Avalonia.RenderHelpers; +using Avalonia.Rendering; using SharpDX; using SharpDX.Direct2D1; using SharpDX.Mathematics.Interop; @@ -18,6 +20,7 @@ namespace Avalonia.Direct2D1.Media /// public class DrawingContextImpl : IDrawingContextImpl, IDisposable { + private readonly IVisualBrushRenderer _visualBrushRenderer; private readonly SharpDX.Direct2D1.RenderTarget _renderTarget; private readonly SharpDX.DXGI.SwapChain1 _swapChain; private SharpDX.DirectWrite.Factory _directWriteFactory; @@ -25,14 +28,17 @@ namespace Avalonia.Direct2D1.Media /// /// Initializes a new instance of the class. /// + /// The visual brush renderer. /// The render target to draw to. /// The DirectWrite factory. /// An optional swap chain associated with this drawing context. public DrawingContextImpl( + IVisualBrushRenderer visualBrushRenderer, SharpDX.Direct2D1.RenderTarget renderTarget, SharpDX.DirectWrite.Factory directWriteFactory, SharpDX.DXGI.SwapChain1 swapChain = null) { + _visualBrushRenderer = visualBrushRenderer; _renderTarget = renderTarget; _swapChain = swapChain; _directWriteFactory = directWriteFactory; @@ -338,6 +344,35 @@ namespace Avalonia.Direct2D1.Media (BitmapImpl)imageBrush.Source.PlatformImpl, destinationSize); } + else if (visualBrush != null) + { + if (_visualBrushRenderer != null) + { + TileBrushImplHelper.EnsureInitialized(visualBrush.Visual); + + using (var intermediate = new BitmapRenderTarget( + _renderTarget, + CompatibleRenderTargetOptions.None, + visualBrush.Visual.Bounds.Size.ToSharpDX())) + { + using (var ctx = new RenderTarget(intermediate).CreateDrawingContext(_visualBrushRenderer)) + { + intermediate.Clear(null); + _visualBrushRenderer.RenderVisualBrush(ctx, visualBrush); + } + + return new ImageBrushImpl( + visualBrush, + _renderTarget, + new D2DBitmapImpl(intermediate.Bitmap), + destinationSize); + } + } + else + { + throw new NotSupportedException("No IVisualBrushRenderer was supplied to DrawingContextImpl."); + } + } else { return new SolidColorBrushImpl((Avalonia.Media.SolidColorBrush)null, _renderTarget); diff --git a/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs index 90fe5675ce..6840d2327a 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs @@ -90,7 +90,7 @@ namespace Avalonia.Direct2D1.Media CompatibleRenderTargetOptions.None, calc.IntermediateSize.ToSharpDX()); - using (var context = new RenderTarget(result).CreateDrawingContext()) + using (var context = new RenderTarget(result).CreateDrawingContext(null)) { var rect = new Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight); diff --git a/src/Windows/Avalonia.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs index 96b51e4407..c0779126e4 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/Imaging/RenderTargetBitmapImpl.cs @@ -4,6 +4,7 @@ using System; using Avalonia.Media; using Avalonia.Platform; +using Avalonia.Rendering; using SharpDX.Direct2D1; using SharpDX.WIC; using DirectWriteFactory = SharpDX.DirectWrite.Factory; @@ -45,9 +46,9 @@ namespace Avalonia.Direct2D1.Media base.Dispose(); } - public IDrawingContextImpl CreateDrawingContext() + public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) { - return new DrawingContextImpl(_target, _dwriteFactory); + return new DrawingContextImpl(visualBrushRenderer, _target, _dwriteFactory); } } } diff --git a/src/Windows/Avalonia.Direct2D1/RenderTarget.cs b/src/Windows/Avalonia.Direct2D1/RenderTarget.cs index 5c535982f9..32f334f96c 100644 --- a/src/Windows/Avalonia.Direct2D1/RenderTarget.cs +++ b/src/Windows/Avalonia.Direct2D1/RenderTarget.cs @@ -5,6 +5,7 @@ using System; using Avalonia.Direct2D1.Media; using Avalonia.Media; using Avalonia.Platform; +using Avalonia.Rendering; using SharpDX.Direct2D1; using DwFactory = SharpDX.DirectWrite.Factory; @@ -48,9 +49,9 @@ namespace Avalonia.Direct2D1 /// Creates a drawing context for a rendering session. /// /// An . - public IDrawingContextImpl CreateDrawingContext() + public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) { - return new DrawingContextImpl(_renderTarget, DirectWriteFactory); + return new DrawingContextImpl(visualBrushRenderer, _renderTarget, DirectWriteFactory); } public void Dispose() diff --git a/src/Windows/Avalonia.Direct2D1/SwapChainRenderTarget.cs b/src/Windows/Avalonia.Direct2D1/SwapChainRenderTarget.cs index 4eea7640ed..ef2213d73b 100644 --- a/src/Windows/Avalonia.Direct2D1/SwapChainRenderTarget.cs +++ b/src/Windows/Avalonia.Direct2D1/SwapChainRenderTarget.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Avalonia.Direct2D1.Media; using Avalonia.Media; using Avalonia.Platform; +using Avalonia.Rendering; using Avalonia.Win32.Interop; using SharpDX; using SharpDX.Direct2D1; @@ -57,7 +58,7 @@ namespace Avalonia.Direct2D1 /// Creates a drawing context for a rendering session. /// /// An . - public IDrawingContextImpl CreateDrawingContext() + public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) { var size = GetWindowSize(); var dpi = GetWindowDpi(); @@ -69,7 +70,11 @@ namespace Avalonia.Direct2D1 CreateSwapChain(); } - return new DrawingContextImpl(_deviceContext, DirectWriteFactory, _swapChain); + return new DrawingContextImpl( + visualBrushRenderer, + _deviceContext, + DirectWriteFactory, + _swapChain); } public void Dispose() diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs index 58f4127cdc..0980a68dfe 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs @@ -319,7 +319,7 @@ namespace Avalonia.Controls.UnitTests.Presenters public Size ClientSize { get; } public double RenderScaling => 1; - public IRenderTarget CreateRenderTarget() + public IRenderTarget CreateRenderTarget(IVisualBrushRenderer visualBrushRenderer) { throw new NotImplementedException(); } diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs index 38b51dfd49..b780164a03 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs @@ -1013,7 +1013,7 @@ namespace Avalonia.Controls.UnitTests.Presenters public Size ClientSize { get; } public double RenderScaling => 1; - public IRenderTarget CreateRenderTarget() + public IRenderTarget CreateRenderTarget(IVisualBrushRenderer visualBrushRenderer) { throw new NotImplementedException(); } diff --git a/tests/Avalonia.UnitTests/TestRoot.cs b/tests/Avalonia.UnitTests/TestRoot.cs index 6528d64e8b..baf00bcb5c 100644 --- a/tests/Avalonia.UnitTests/TestRoot.cs +++ b/tests/Avalonia.UnitTests/TestRoot.cs @@ -17,7 +17,7 @@ namespace Avalonia.UnitTests { private readonly NameScope _nameScope = new NameScope(); private readonly IRenderTarget _renderTarget = Mock.Of( - x => x.CreateDrawingContext() == Mock.Of()); + x => x.CreateDrawingContext(It.IsAny()) == Mock.Of()); public TestRoot() { @@ -64,7 +64,7 @@ namespace Avalonia.UnitTests public bool ShowAccessKeys { get; set; } - public IRenderTarget CreateRenderTarget() => _renderTarget; + public IRenderTarget CreateRenderTarget(IVisualBrushRenderer visualBrushRenderer) => _renderTarget; public void Invalidate(Rect rect) { diff --git a/tests/Avalonia.UnitTests/TestTemplatedRoot.cs b/tests/Avalonia.UnitTests/TestTemplatedRoot.cs index 91e797fa87..660cf98cf3 100644 --- a/tests/Avalonia.UnitTests/TestTemplatedRoot.cs +++ b/tests/Avalonia.UnitTests/TestTemplatedRoot.cs @@ -47,7 +47,7 @@ namespace Avalonia.UnitTests public IRenderer Renderer => null; - public IRenderTarget CreateRenderTarget() + public IRenderTarget CreateRenderTarget(IVisualBrushRenderer visualBrushRenderer) { throw new NotImplementedException(); } diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs index adddfd845e..ee830c47ae 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs @@ -235,7 +235,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering private IRenderTargetBitmapImpl CreateLayer() { return Mock.Of(x => - x.CreateDrawingContext() == Mock.Of()); + x.CreateDrawingContext(It.IsAny()) == Mock.Of()); } private Mock MockLayerFactory(IRenderRoot root) @@ -278,7 +278,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering public Mock GetMockDrawingContext(IVisual layerRoot) { - return Mock.Get(_layers[layerRoot].CreateDrawingContext()); + return Mock.Get(_layers[layerRoot].CreateDrawingContext(null)); } } }