diff --git a/src/Avalonia.Controls/Image.cs b/src/Avalonia.Controls/Image.cs
index beddc75917..ffccfdf081 100644
--- a/src/Avalonia.Controls/Image.cs
+++ b/src/Avalonia.Controls/Image.cs
@@ -1,14 +1,12 @@
// 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 System;
using Avalonia.Media;
using Avalonia.Media.Imaging;
+using Avalonia.Visuals.Media;
namespace Avalonia.Controls
-{
- using Avalonia.Visuals.Media.Imaging;
-
+{
///
/// Displays a image.
///
diff --git a/src/Avalonia.Controls/RenderOptions.cs b/src/Avalonia.Controls/RenderOptions.cs
deleted file mode 100644
index 26f7ed260b..0000000000
--- a/src/Avalonia.Controls/RenderOptions.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-// 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
- {
- ///
- /// Defines the property.
- ///
- public static readonly StyledProperty BitmapScalingModeProperty =
- AvaloniaProperty.RegisterAttached(
- "BitmapScalingMode",
- inherits: true);
-
- ///
- /// Gets the value of the BitmapScalingMode attached property for a control.
- ///
- /// The control.
- /// The control's left coordinate.
- public static BitmapScalingMode GetBitmapScalingMode(AvaloniaObject element)
- {
- return element.GetValue(BitmapScalingModeProperty);
- }
-
- ///
- /// Sets the value of the BitmapScalingMode attached property for a control.
- ///
- /// The control.
- /// The left value.
- public static void SetBitmapScalingMode(AvaloniaObject element, double value)
- {
- element.SetValue(BitmapScalingModeProperty, value);
- }
- }
-}
diff --git a/src/Avalonia.Visuals/Media/DrawingContext.cs b/src/Avalonia.Visuals/Media/DrawingContext.cs
index 0d7d41e46e..173801720d 100644
--- a/src/Avalonia.Visuals/Media/DrawingContext.cs
+++ b/src/Avalonia.Visuals/Media/DrawingContext.cs
@@ -69,12 +69,12 @@ namespace Avalonia.Media
/// The opacity to draw with.
/// The rect in the image to draw.
/// The rect in the output to draw to.
- ///
- public void DrawImage(IBitmap source, double opacity, Rect sourceRect, Rect destRect, BitmapScalingMode bitmapScalingMode = default)
+ ///
+ public void DrawImage(IBitmap source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode = default)
{
Contract.Requires(source != null);
- PlatformImpl.DrawImage(source.PlatformImpl, opacity, sourceRect, destRect, bitmapScalingMode);
+ PlatformImpl.DrawImage(source.PlatformImpl, opacity, sourceRect, destRect, bitmapInterpolationMode);
}
///
diff --git a/src/Avalonia.Visuals/Media/ITileBrush.cs b/src/Avalonia.Visuals/Media/ITileBrush.cs
index 8e2349f506..6c29b159de 100644
--- a/src/Avalonia.Visuals/Media/ITileBrush.cs
+++ b/src/Avalonia.Visuals/Media/ITileBrush.cs
@@ -1,5 +1,7 @@
namespace Avalonia.Media
{
+ using Avalonia.Visuals.Media.Imaging;
+
///
/// A brush which displays a repeating image.
///
@@ -35,5 +37,13 @@
/// Gets the brush's tile mode.
///
TileMode TileMode { get; }
+
+ ///
+ /// Gets the bitmap interpolation mode.
+ ///
+ ///
+ /// The bitmap interpolation mode.
+ ///
+ BitmapInterpolationMode BitmapInterpolationMode { get; }
}
-}
\ No newline at end of file
+}
diff --git a/src/Avalonia.Visuals/Media/Imaging/BitmapScalingMode.cs b/src/Avalonia.Visuals/Media/Imaging/BitmapInterpolationMode.cs
similarity index 71%
rename from src/Avalonia.Visuals/Media/Imaging/BitmapScalingMode.cs
rename to src/Avalonia.Visuals/Media/Imaging/BitmapInterpolationMode.cs
index 5c91dd993d..7e6d330618 100644
--- a/src/Avalonia.Visuals/Media/Imaging/BitmapScalingMode.cs
+++ b/src/Avalonia.Visuals/Media/Imaging/BitmapInterpolationMode.cs
@@ -6,21 +6,26 @@ namespace Avalonia.Visuals.Media.Imaging
///
/// Controls the performance and quality of bitmap scaling.
///
- public enum BitmapScalingMode
+ public enum BitmapInterpolationMode
{
///
- /// Highest quality but worst performance.
+ /// Uses the default behavior of the underling render backend.
+ ///
+ Default,
+
+ ///
+ /// The best performance but worst image quality.
///
- HighQuality,
-
+ LowQuality,
+
///
/// Good performance and decent image quality.
///
- MediumQuality,
+ MediumQuality,
///
- /// The best performance but worst image quality.
+ /// Highest quality but worst performance.
///
- LowQuality
+ HighQuality
}
}
diff --git a/src/Avalonia.Visuals/Media/Immutable/ImmutableImageBrush.cs b/src/Avalonia.Visuals/Media/Immutable/ImmutableImageBrush.cs
index 678f99c20d..15da8f8b43 100644
--- a/src/Avalonia.Visuals/Media/Immutable/ImmutableImageBrush.cs
+++ b/src/Avalonia.Visuals/Media/Immutable/ImmutableImageBrush.cs
@@ -1,5 +1,5 @@
-using System;
-using Avalonia.Media.Imaging;
+using Avalonia.Media.Imaging;
+using Avalonia.Visuals.Media.Imaging;
namespace Avalonia.Media.Immutable
{
@@ -21,6 +21,7 @@ namespace Avalonia.Media.Immutable
/// How the source rectangle will be stretched to fill the destination rect.
///
/// The tile mode.
+ /// The bitmap interpolation mode.
public ImmutableImageBrush(
IBitmap source,
AlignmentX alignmentX = AlignmentX.Center,
@@ -29,7 +30,8 @@ namespace Avalonia.Media.Immutable
double opacity = 1,
RelativeRect? sourceRect = null,
Stretch stretch = Stretch.Uniform,
- TileMode tileMode = TileMode.None)
+ TileMode tileMode = TileMode.None,
+ BitmapInterpolationMode bitmapInterpolationMode = BitmapInterpolationMode.Default)
: base(
alignmentX,
alignmentY,
@@ -37,7 +39,8 @@ namespace Avalonia.Media.Immutable
opacity,
sourceRect ?? RelativeRect.Fill,
stretch,
- tileMode)
+ tileMode,
+ bitmapInterpolationMode)
{
Source = source;
}
diff --git a/src/Avalonia.Visuals/Media/Immutable/ImmutableTileBrush.cs b/src/Avalonia.Visuals/Media/Immutable/ImmutableTileBrush.cs
index 37c391040f..c7a6a168d7 100644
--- a/src/Avalonia.Visuals/Media/Immutable/ImmutableTileBrush.cs
+++ b/src/Avalonia.Visuals/Media/Immutable/ImmutableTileBrush.cs
@@ -1,4 +1,7 @@
-using System;
+// 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.Media.Immutable
{
@@ -19,6 +22,7 @@ namespace Avalonia.Media.Immutable
/// How the source rectangle will be stretched to fill the destination rect.
///
/// The tile mode.
+ /// Controls the quality of interpolation.
protected ImmutableTileBrush(
AlignmentX alignmentX,
AlignmentY alignmentY,
@@ -26,7 +30,8 @@ namespace Avalonia.Media.Immutable
double opacity,
RelativeRect sourceRect,
Stretch stretch,
- TileMode tileMode)
+ TileMode tileMode,
+ BitmapInterpolationMode bitmapInterpolationMode)
{
AlignmentX = alignmentX;
AlignmentY = alignmentY;
@@ -35,6 +40,7 @@ namespace Avalonia.Media.Immutable
SourceRect = sourceRect;
Stretch = stretch;
TileMode = tileMode;
+ BitmapInterpolationMode = bitmapInterpolationMode;
}
///
@@ -49,7 +55,8 @@ namespace Avalonia.Media.Immutable
source.Opacity,
source.SourceRect,
source.Stretch,
- source.TileMode)
+ source.TileMode,
+ source.BitmapInterpolationMode)
{
}
@@ -73,5 +80,8 @@ namespace Avalonia.Media.Immutable
///
public TileMode TileMode { get; }
+
+ ///
+ public BitmapInterpolationMode BitmapInterpolationMode { get; }
}
}
diff --git a/src/Avalonia.Visuals/Media/Immutable/ImmutableVisualBrush.cs b/src/Avalonia.Visuals/Media/Immutable/ImmutableVisualBrush.cs
index b07d98867c..f1f61a6e65 100644
--- a/src/Avalonia.Visuals/Media/Immutable/ImmutableVisualBrush.cs
+++ b/src/Avalonia.Visuals/Media/Immutable/ImmutableVisualBrush.cs
@@ -1,4 +1,7 @@
-using System;
+// 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;
using Avalonia.VisualTree;
namespace Avalonia.Media.Immutable
@@ -21,6 +24,7 @@ namespace Avalonia.Media.Immutable
/// How the source rectangle will be stretched to fill the destination rect.
///
/// The tile mode.
+ /// Controls the quality of interpolation.
public ImmutableVisualBrush(
IVisual visual,
AlignmentX alignmentX = AlignmentX.Center,
@@ -29,7 +33,8 @@ namespace Avalonia.Media.Immutable
double opacity = 1,
RelativeRect? sourceRect = null,
Stretch stretch = Stretch.Uniform,
- TileMode tileMode = TileMode.None)
+ TileMode tileMode = TileMode.None,
+ BitmapInterpolationMode bitmapInterpolationMode = BitmapInterpolationMode.Default)
: base(
alignmentX,
alignmentY,
@@ -37,7 +42,8 @@ namespace Avalonia.Media.Immutable
opacity,
sourceRect ?? RelativeRect.Fill,
stretch,
- tileMode)
+ tileMode,
+ bitmapInterpolationMode)
{
Visual = visual;
}
diff --git a/src/Avalonia.Visuals/Media/RenderOptions.cs b/src/Avalonia.Visuals/Media/RenderOptions.cs
new file mode 100644
index 0000000000..7efe1c7349
--- /dev/null
+++ b/src/Avalonia.Visuals/Media/RenderOptions.cs
@@ -0,0 +1,38 @@
+// 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.Visuals.Media
+{
+ public class RenderOptions
+ {
+ ///
+ /// Defines the property.
+ ///
+ public static readonly StyledProperty BitmapInterpolationMode =
+ AvaloniaProperty.RegisterAttached(
+ "BitmapInterpolationMode",
+ inherits: true);
+
+ ///
+ /// Gets the value of the BitmapInterpolationMode attached property for a control.
+ ///
+ /// The control.
+ /// The control's left coordinate.
+ public static BitmapInterpolationMode GetBitmapScalingMode(AvaloniaObject element)
+ {
+ return element.GetValue(BitmapInterpolationMode);
+ }
+
+ ///
+ /// Sets the value of the BitmapInterpolationMode attached property for a control.
+ ///
+ /// The control.
+ /// The left value.
+ public static void SetBitmapScalingMode(AvaloniaObject element, BitmapInterpolationMode value)
+ {
+ element.SetValue(BitmapInterpolationMode, value);
+ }
+ }
+}
diff --git a/src/Avalonia.Visuals/Media/TileBrush.cs b/src/Avalonia.Visuals/Media/TileBrush.cs
index 3a7f9d9920..5a6da8f2e1 100644
--- a/src/Avalonia.Visuals/Media/TileBrush.cs
+++ b/src/Avalonia.Visuals/Media/TileBrush.cs
@@ -3,6 +3,9 @@
namespace Avalonia.Media
{
+ using Avalonia.Visuals.Media;
+ using Avalonia.Visuals.Media.Imaging;
+
///
/// Describes how a is tiled.
///
@@ -129,5 +132,17 @@ namespace Avalonia.Media
get { return (TileMode)GetValue(TileModeProperty); }
set { SetValue(TileModeProperty, value); }
}
+
+ ///
+ /// Gets or sets the bitmap interpolation mode.
+ ///
+ ///
+ /// The bitmap interpolation mode.
+ ///
+ public BitmapInterpolationMode BitmapInterpolationMode
+ {
+ get { return RenderOptions.GetBitmapScalingMode(this); }
+ set { RenderOptions.SetBitmapScalingMode(this, value); }
+ }
}
}
diff --git a/src/Avalonia.Visuals/Platform/IDrawingContextImpl.cs b/src/Avalonia.Visuals/Platform/IDrawingContextImpl.cs
index 7f0b2a9904..4ddbbf4dd5 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 bitmapScalingMode = default);
+ /// Controls
+ void DrawImage(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode = default);
///
/// Draws a bitmap image.
diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/DeferredDrawingContextImpl.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/DeferredDrawingContextImpl.cs
index fbd258fdbe..42ecde6a6d 100644
--- a/src/Avalonia.Visuals/Rendering/SceneGraph/DeferredDrawingContextImpl.cs
+++ b/src/Avalonia.Visuals/Rendering/SceneGraph/DeferredDrawingContextImpl.cs
@@ -115,13 +115,13 @@ namespace Avalonia.Rendering.SceneGraph
}
///
- public void DrawImage(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapScalingMode bitmapScalingMode)
+ public void DrawImage(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode)
{
var next = NextDrawAs();
- if (next == null || !next.Item.Equals(Transform, source, opacity, sourceRect, destRect, bitmapScalingMode))
+ if (next == null || !next.Item.Equals(Transform, source, opacity, sourceRect, destRect, bitmapInterpolationMode))
{
- Add(new ImageNode(Transform, source, opacity, sourceRect, destRect, bitmapScalingMode));
+ Add(new ImageNode(Transform, source, opacity, sourceRect, destRect, bitmapInterpolationMode));
}
else
{
diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/ImageNode.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/ImageNode.cs
index db5c672b97..35fad25276 100644
--- a/src/Avalonia.Visuals/Rendering/SceneGraph/ImageNode.cs
+++ b/src/Avalonia.Visuals/Rendering/SceneGraph/ImageNode.cs
@@ -21,8 +21,8 @@ namespace Avalonia.Rendering.SceneGraph
/// The draw opacity.
/// The source rect.
/// The destination rect.
- /// The bitmap scaling mode.
- public ImageNode(Matrix transform, IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapScalingMode bitmapScalingMode)
+ /// The bitmap scaling mode.
+ public ImageNode(Matrix transform, IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode)
: base(destRect, transform, null)
{
Transform = transform;
@@ -30,7 +30,7 @@ namespace Avalonia.Rendering.SceneGraph
Opacity = opacity;
SourceRect = sourceRect;
DestRect = destRect;
- BitmapScalingMode = bitmapScalingMode;
+ BitmapInterpolationMode = bitmapInterpolationMode;
}
///
@@ -64,7 +64,7 @@ namespace Avalonia.Rendering.SceneGraph
///
/// The scaling mode.
///
- public BitmapScalingMode BitmapScalingMode { get; }
+ public BitmapInterpolationMode BitmapInterpolationMode { get; }
///
/// Determines if this draw operation equals another.
@@ -74,20 +74,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.
- /// The bitmap scaling mode.
+ /// The bitmap scaling mode.
/// 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 bitmapScalingMode)
+ public bool Equals(Matrix transform, IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode)
{
return transform == Transform &&
Equals(source.Item, Source.Item) &&
opacity == Opacity &&
sourceRect == SourceRect &&
destRect == DestRect &&
- bitmapScalingMode == BitmapScalingMode;
+ bitmapInterpolationMode == BitmapInterpolationMode;
}
///
@@ -96,7 +96,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, BitmapScalingMode);
+ context.DrawImage(Source, Opacity, SourceRect, DestRect, BitmapInterpolationMode);
}
///
diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs
index f0e56a80cf..7903e6cf6e 100644
--- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs
+++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs
@@ -14,7 +14,9 @@ using Avalonia.Visuals.Media.Imaging;
using SkiaSharp;
namespace Avalonia.Skia
-{
+{
+ using Avalonia.Controls;
+
///
/// Skia based drawing context.
///
@@ -96,7 +98,7 @@ namespace Avalonia.Skia
}
///
- public void DrawImage(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapScalingMode bitmapScalingMode)
+ public void DrawImage(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode)
{
var drawableImage = (IDrawableBitmapImpl)source.Item;
var s = sourceRect.ToSKRect();
@@ -108,24 +110,26 @@ namespace Avalonia.Skia
Color = new SKColor(255, 255, 255, (byte)(255 * opacity * _currentOpacity))
})
{
- paint.FilterQuality = GetInterpolationMode(bitmapScalingMode);
+ paint.FilterQuality = GetInterpolationMode(bitmapInterpolationMode);
drawableImage.Draw(this, s, d, paint);
}
}
- private static SKFilterQuality GetInterpolationMode(BitmapScalingMode scalingMode)
+ private static SKFilterQuality GetInterpolationMode(BitmapInterpolationMode interpolationMode)
{
- switch (scalingMode)
+ switch (interpolationMode)
{
- case BitmapScalingMode.LowQuality:
+ case BitmapInterpolationMode.LowQuality:
return SKFilterQuality.Low;
- case BitmapScalingMode.MediumQuality:
+ case BitmapInterpolationMode.MediumQuality:
return SKFilterQuality.Medium;
- case BitmapScalingMode.HighQuality:
+ case BitmapInterpolationMode.HighQuality:
return SKFilterQuality.High;
+ case BitmapInterpolationMode.Default:
+ return SKFilterQuality.None;
default:
- throw new ArgumentOutOfRangeException(nameof(scalingMode), scalingMode, null);
+ throw new ArgumentOutOfRangeException(nameof(interpolationMode), interpolationMode, null);
}
}
@@ -133,7 +137,7 @@ namespace Avalonia.Skia
public void DrawImage(IRef source, IBrush opacityMask, Rect opacityMaskRect, Rect destRect)
{
PushOpacityMask(opacityMask, opacityMaskRect);
- DrawImage(source, 1, new Rect(0, 0, source.Item.PixelWidth, source.Item.PixelHeight), destRect, default(BitmapScalingMode));
+ DrawImage(source, 1, new Rect(0, 0, source.Item.PixelWidth, source.Item.PixelHeight), destRect, BitmapInterpolationMode.Default);
PopOpacityMask();
}
@@ -378,7 +382,8 @@ namespace Avalonia.Skia
/// Target size.
/// Tile brush to use.
/// Tile brush image.
- private void ConfigureTileBrush(ref PaintWrapper paintWrapper, Size targetSize, ITileBrush tileBrush, IDrawableBitmapImpl tileBrushImage)
+ /// The bitmap interpolation mode.
+ private void ConfigureTileBrush(ref PaintWrapper paintWrapper, Size targetSize, ITileBrush tileBrush, IDrawableBitmapImpl tileBrushImage, BitmapInterpolationMode interpolationMode)
{
var calc = new TileBrushCalculator(tileBrush,
new Size(tileBrushImage.PixelWidth, tileBrushImage.PixelHeight), targetSize);
@@ -396,7 +401,7 @@ namespace Avalonia.Skia
context.Clear(Colors.Transparent);
context.PushClip(calc.IntermediateClip);
context.Transform = calc.IntermediateTransform;
- context.DrawImage(RefCountable.CreateUnownedNotClonable(tileBrushImage), 1, rect, rect);
+ context.DrawImage(RefCountable.CreateUnownedNotClonable(tileBrushImage), 1, rect, rect, interpolationMode);
context.PopClip();
}
@@ -505,12 +510,12 @@ namespace Avalonia.Skia
}
else
{
- tileBrushImage = (IDrawableBitmapImpl) (tileBrush as IImageBrush)?.Source?.PlatformImpl.Item;
+ tileBrushImage = (IDrawableBitmapImpl)(tileBrush as IImageBrush)?.Source?.PlatformImpl.Item;
}
if (tileBrush != null && tileBrushImage != null)
{
- ConfigureTileBrush(ref paintWrapper, targetSize, tileBrush, tileBrushImage);
+ ConfigureTileBrush(ref paintWrapper, targetSize, tileBrush, tileBrushImage, tileBrush.BitmapInterpolationMode);
}
else
{
diff --git a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs
index 0bad70991d..bf379bac5c 100644
--- a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs
+++ b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs
@@ -14,6 +14,8 @@ using SharpDX.Mathematics.Interop;
namespace Avalonia.Direct2D1.Media
{
+ using BitmapInterpolationMode = Avalonia.Visuals.Media.Imaging.BitmapInterpolationMode;
+
///
/// Draws using Direct2D1.
///
@@ -101,43 +103,34 @@ 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 bitmapScalingMode)
+ ///
+ public void DrawImage(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode)
{
using (var d2d = ((BitmapImpl)source.Item).GetDirect2DBitmap(_renderTarget))
{
- if (_renderTarget is DeviceContext deviceContext)
- {
- deviceContext.DrawBitmap(d2d.Value, destRect.ToDirect2D(), (float)opacity, GetInterpolationMode(bitmapScalingMode), sourceRect.ToDirect2D(), null);
- }
- else
- {
- var interpolationMode = bitmapScalingMode == BitmapScalingMode.LowQuality
- ? BitmapInterpolationMode.NearestNeighbor
- : BitmapInterpolationMode.Linear;
-
- _renderTarget.DrawBitmap(
- d2d.Value,
- destRect.ToSharpDX(),
- (float)opacity,
- interpolationMode,
- sourceRect.ToSharpDX());
- }
+ var interpolationMode = GetInterpolationMode(bitmapInterpolationMode);
+
+ _renderTarget.DrawBitmap(
+ d2d.Value,
+ destRect.ToSharpDX(),
+ (float)opacity,
+ interpolationMode,
+ sourceRect.ToSharpDX());
}
}
- private static InterpolationMode GetInterpolationMode(BitmapScalingMode scalingMode)
+ private static SharpDX.Direct2D1.BitmapInterpolationMode GetInterpolationMode(BitmapInterpolationMode interpolationMode)
{
- switch (scalingMode)
+ switch (interpolationMode)
{
- case BitmapScalingMode.LowQuality:
- return InterpolationMode.NearestNeighbor;
- case BitmapScalingMode.MediumQuality:
- return InterpolationMode.Linear;
- case BitmapScalingMode.HighQuality:
- return InterpolationMode.HighQualityCubic;
+ case BitmapInterpolationMode.LowQuality:
+ return SharpDX.Direct2D1.BitmapInterpolationMode.NearestNeighbor;
+ case BitmapInterpolationMode.MediumQuality:
+ case BitmapInterpolationMode.HighQuality:
+ case BitmapInterpolationMode.Default:
+ return SharpDX.Direct2D1.BitmapInterpolationMode.Linear;
default:
- throw new ArgumentOutOfRangeException(nameof(scalingMode), scalingMode, null);
+ throw new ArgumentOutOfRangeException(nameof(interpolationMode), interpolationMode, null);
}
}
diff --git a/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs
index 75b397edd6..3fc8760a9e 100644
--- a/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs
+++ b/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs
@@ -1,7 +1,6 @@
// 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 System;
using Avalonia.Media;
using Avalonia.Rendering.Utilities;
using Avalonia.Utilities;
@@ -11,7 +10,9 @@ namespace Avalonia.Direct2D1.Media
{
public sealed class ImageBrushImpl : BrushImpl
{
- OptionalDispose _bitmap;
+ private readonly OptionalDispose _bitmap;
+
+ private readonly Visuals.Media.Imaging.BitmapInterpolationMode _bitmapInterpolationMode;
public ImageBrushImpl(
ITileBrush brush,
@@ -41,6 +42,8 @@ namespace Avalonia.Direct2D1.Media
GetBrushProperties(brush, calc.DestinationRect));
}
}
+
+ _bitmapInterpolationMode = brush.BitmapInterpolationMode;
}
public override void Dispose()
@@ -102,7 +105,7 @@ namespace Avalonia.Direct2D1.Media
context.PushClip(calc.IntermediateClip);
context.Transform = calc.IntermediateTransform;
- context.DrawImage(RefCountable.CreateUnownedNotClonable(bitmap), 1, rect, rect);
+ context.DrawImage(RefCountable.CreateUnownedNotClonable(bitmap), 1, rect, rect, _bitmapInterpolationMode);
context.PopClip();
}
diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs
index 12ca2777ec..2350a31d5c 100644
--- a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs
+++ b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs
@@ -340,7 +340,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(), default(BitmapScalingMode)));
+ context.Verify(x => x.DrawImage(borderLayer, 0.5, It.IsAny(), It.IsAny(), BitmapInterpolationMode.Default));
}
private DeferredRenderer CreateTargetAndRunFrame(
diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs
index 664d240966..2060cc7170 100644
--- a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs
+++ b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs
@@ -1,5 +1,4 @@
-using System;
-using Avalonia.Media;
+using Avalonia.Media;
using Avalonia.Platform;
using Avalonia.Rendering.SceneGraph;
using Avalonia.Utilities;
@@ -53,7 +52,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
1,
new Rect(1, 1, 1, 1),
new Rect(1, 1, 1, 1),
- BitmapScalingMode.LowQuality);
+ BitmapInterpolationMode.Default);
Assert.Equal(2, bitmap.RefCount);