diff --git a/src/Avalonia.Controls/Remote/RemoteWidget.cs b/src/Avalonia.Controls/Remote/RemoteWidget.cs index ea8c3ebe52..594208b51c 100644 --- a/src/Avalonia.Controls/Remote/RemoteWidget.cs +++ b/src/Avalonia.Controls/Remote/RemoteWidget.cs @@ -10,6 +10,8 @@ using PixelFormat = Avalonia.Platform.PixelFormat; namespace Avalonia.Controls.Remote { + using Avalonia.Visuals.Media.Imaging; + public class RemoteWidget : Control { private readonly IAvaloniaRemoteTransportConnection _connection; @@ -76,4 +78,4 @@ namespace Avalonia.Controls.Remote base.Render(context); } } -} \ No newline at end of file +} diff --git a/src/Avalonia.Controls/RenderOptions.cs b/src/Avalonia.Controls/RenderOptions.cs index dff1d940d0..26f7ed260b 100644 --- a/src/Avalonia.Controls/RenderOptions.cs +++ b/src/Avalonia.Controls/RenderOptions.cs @@ -1,7 +1,10 @@ -namespace Avalonia.Controls -{ - using Avalonia.Visuals.Media.Imaging; +// Copyright (c) The Avalonia Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. +using Avalonia.Visuals.Media.Imaging; + +namespace Avalonia.Controls +{ public class RenderOptions { /// @@ -10,7 +13,6 @@ public static readonly StyledProperty BitmapScalingModeProperty = AvaloniaProperty.RegisterAttached( "BitmapScalingMode", - BitmapScalingMode.LowQuality, inherits: true); /// diff --git a/src/Avalonia.Visuals/Media/DrawingContext.cs b/src/Avalonia.Visuals/Media/DrawingContext.cs index 9cb8712f5b..85e165be36 100644 --- a/src/Avalonia.Visuals/Media/DrawingContext.cs +++ b/src/Avalonia.Visuals/Media/DrawingContext.cs @@ -2,11 +2,10 @@ using System; using System.Collections.Generic; using Avalonia.Media.Imaging; using Avalonia.Platform; +using Avalonia.Visuals.Media.Imaging; namespace Avalonia.Media -{ - using Avalonia.Visuals.Media.Imaging; - +{ public sealed class DrawingContext : IDisposable { private int _currentLevel; diff --git a/src/Avalonia.Visuals/Media/Imaging/BitmapScalingMode.cs b/src/Avalonia.Visuals/Media/Imaging/BitmapScalingMode.cs index 36d239c9d9..32b98c92a3 100644 --- a/src/Avalonia.Visuals/Media/Imaging/BitmapScalingMode.cs +++ b/src/Avalonia.Visuals/Media/Imaging/BitmapScalingMode.cs @@ -3,10 +3,24 @@ namespace Avalonia.Visuals.Media.Imaging { + /// + /// Controls the performance and quality of bitmap scaling. + /// public enum BitmapScalingMode { - LowQuality, + /// + /// Highest quality but worst performance. + /// + HighQuality, + + /// + /// Good performance an decent image quality. + /// MediumQuality, - HighQuality + + /// + /// The best performance but worst image quality. + /// + LowQuality } } diff --git a/src/Avalonia.Visuals/Platform/IDrawingContextImpl.cs b/src/Avalonia.Visuals/Platform/IDrawingContextImpl.cs index fbd742f6c3..7f0b2a9904 100644 --- a/src/Avalonia.Visuals/Platform/IDrawingContextImpl.cs +++ b/src/Avalonia.Visuals/Platform/IDrawingContextImpl.cs @@ -32,8 +32,8 @@ namespace Avalonia.Platform /// The opacity to draw with. /// The rect in the image to draw. /// The rect in the output to draw to. - /// Controls - void DrawImage(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapScalingMode scalingMode = default); + /// Controls + void DrawImage(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapScalingMode bitmapScalingMode = default); /// /// Draws a bitmap image. diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/DeferredDrawingContextImpl.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/DeferredDrawingContextImpl.cs index 7172696e81..ac69687e60 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/DeferredDrawingContextImpl.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/DeferredDrawingContextImpl.cs @@ -116,13 +116,13 @@ namespace Avalonia.Rendering.SceneGraph } /// - public void DrawImage(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapScalingMode scalingMode = BitmapScalingMode.LowQuality) + public void DrawImage(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapScalingMode bitmapScalingMode) { var next = NextDrawAs(); - if (next == null || !next.Item.Equals(Transform, source, opacity, sourceRect, destRect, scalingMode)) + if (next == null || !next.Item.Equals(Transform, source, opacity, sourceRect, destRect, bitmapScalingMode)) { - Add(new ImageNode(Transform, source, opacity, sourceRect, destRect, scalingMode)); + Add(new ImageNode(Transform, source, opacity, sourceRect, destRect, bitmapScalingMode)); } else { diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/ImageNode.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/ImageNode.cs index 96a8731715..e896d9a015 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/ImageNode.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/ImageNode.cs @@ -22,8 +22,8 @@ namespace Avalonia.Rendering.SceneGraph /// The draw opacity. /// The source rect. /// The destination rect. - /// - public ImageNode(Matrix transform, IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapScalingMode scalingMode) + /// The bitmap scaling mode. + public ImageNode(Matrix transform, IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapScalingMode bitmapScalingMode) : base(destRect, transform, null) { Transform = transform; @@ -31,10 +31,8 @@ namespace Avalonia.Rendering.SceneGraph Opacity = opacity; SourceRect = sourceRect; DestRect = destRect; - ScalingMode = scalingMode; - } - - + BitmapScalingMode = bitmapScalingMode; + } /// /// Gets the transform with which the node will be drawn. @@ -62,12 +60,12 @@ namespace Avalonia.Rendering.SceneGraph public Rect DestRect { get; } /// - /// Gets or sets the scaling mode. + /// Gets the bitmap scaling mode. /// /// /// The scaling mode. /// - public BitmapScalingMode ScalingMode { get; } + public BitmapScalingMode BitmapScalingMode { get; } /// /// Determines if this draw operation equals another. @@ -77,20 +75,20 @@ namespace Avalonia.Rendering.SceneGraph /// The opacity of the other draw operation. /// The source rect of the other draw operation. /// The dest rect of the other draw operation. - /// + /// /// True if the draw operations are the same, otherwise false. /// /// The properties of the other draw operation are passed in as arguments to prevent /// allocation of a not-yet-constructed draw operation object. /// - public bool Equals(Matrix transform, IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapScalingMode scalingMode) + public bool Equals(Matrix transform, IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapScalingMode bitmapScalingMode) { return transform == Transform && Equals(source.Item, Source.Item) && opacity == Opacity && sourceRect == SourceRect && destRect == DestRect && - scalingMode == ScalingMode; + bitmapScalingMode == BitmapScalingMode; } /// @@ -99,7 +97,7 @@ namespace Avalonia.Rendering.SceneGraph // TODO: Probably need to introduce some kind of locking mechanism in the case of // WriteableBitmap. context.Transform = Transform; - context.DrawImage(Source, Opacity, SourceRect, DestRect, ScalingMode); + context.DrawImage(Source, Opacity, SourceRect, DestRect, BitmapScalingMode); } /// diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs index 5878038a81..d119998f10 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs @@ -97,7 +97,7 @@ namespace Avalonia.Skia } /// - public void DrawImage(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapScalingMode scalingMode) + public void DrawImage(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapScalingMode bitmapScalingMode) { var drawableImage = (IDrawableBitmapImpl)source.Item; var s = sourceRect.ToSKRect(); @@ -109,7 +109,7 @@ namespace Avalonia.Skia Color = new SKColor(255, 255, 255, (byte)(255 * opacity * _currentOpacity)) }) { - paint.FilterQuality = GetInterpolationMode(scalingMode); + paint.FilterQuality = GetInterpolationMode(bitmapScalingMode); drawableImage.Draw(this, s, d, paint); } diff --git a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs index 27115e164a..d49ef2cd89 100644 --- a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs +++ b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs @@ -102,18 +102,18 @@ namespace Avalonia.Direct2D1.Media /// The opacity to draw with. /// The rect in the image to draw. /// The rect in the output to draw to. - /// - public void DrawImage(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapScalingMode scalingMode) + /// + public void DrawImage(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapScalingMode bitmapScalingMode) { using (var d2d = ((BitmapImpl)source.Item).GetDirect2DBitmap(_renderTarget)) { if (_renderTarget is DeviceContext deviceContext) { - deviceContext.DrawBitmap(d2d.Value, destRect.ToDirect2D(), (float)opacity, GetInterpolationMode(scalingMode), sourceRect.ToDirect2D(), null); + deviceContext.DrawBitmap(d2d.Value, destRect.ToDirect2D(), (float)opacity, GetInterpolationMode(bitmapScalingMode), sourceRect.ToDirect2D(), null); } else { - var interpolationMode = scalingMode == BitmapScalingMode.LowQuality + var interpolationMode = bitmapScalingMode == BitmapScalingMode.LowQuality ? BitmapInterpolationMode.NearestNeighbor : BitmapInterpolationMode.Linear; diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs index 7821f60a51..655888cf31 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs @@ -16,6 +16,8 @@ using Xunit; namespace Avalonia.Visuals.UnitTests.Rendering { + using Avalonia.Visuals.Media.Imaging; + public class DeferredRendererTests { [Fact] @@ -336,7 +338,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering var context = Mock.Get(target.RenderTarget.CreateDrawingContext(null)); var borderLayer = target.Layers[border].Bitmap; - context.Verify(x => x.DrawImage(borderLayer, 0.5, It.IsAny(), It.IsAny())); + context.Verify(x => x.DrawImage(borderLayer, 0.5, It.IsAny(), It.IsAny(), default(BitmapScalingMode))); } private DeferredRenderer CreateTargetAndRunFrame( diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs index 8c905dab2f..996cb289c8 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs @@ -8,6 +8,8 @@ using Xunit; namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph { + using Avalonia.Visuals.Media.Imaging; + public class DrawOperationTests { [Fact] @@ -46,7 +48,13 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph public void Image_Node_Releases_Reference_To_Bitmap_On_Dispose() { var bitmap = RefCountable.Create(Mock.Of()); - var imageNode = new ImageNode(Matrix.Identity, bitmap, 1, new Rect(1,1,1,1), new Rect(1,1,1,1)); + var imageNode = new ImageNode( + Matrix.Identity, + bitmap, + 1, + new Rect(1, 1, 1, 1), + new Rect(1, 1, 1, 1), + BitmapScalingMode.LowQuality); Assert.Equal(2, bitmap.RefCount);