diff --git a/src/Avalonia.Visuals/Media/DrawingContext.cs b/src/Avalonia.Visuals/Media/DrawingContext.cs
index df69ab6fd5..32fdf3b69a 100644
--- a/src/Avalonia.Visuals/Media/DrawingContext.cs
+++ b/src/Avalonia.Visuals/Media/DrawingContext.cs
@@ -74,18 +74,18 @@ namespace Avalonia.Media
public Matrix CurrentContainerTransform => _currentContainerTransform;
///
- /// Draws a bitmap image.
+ /// Draws an image.
///
- /// The bitmap image.
+ /// The image.
/// The opacity to draw with.
/// The rect in the image to draw.
/// The rect in the output to draw to.
/// The bitmap interpolation mode.
- public void DrawImage(IBitmap source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode = default)
+ public void DrawImage(IImage source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode = default)
{
Contract.Requires(source != null);
- PlatformImpl.DrawImage(source.PlatformImpl, opacity, sourceRect, destRect, bitmapInterpolationMode);
+ source.Draw(this, opacity, sourceRect, destRect, bitmapInterpolationMode);
}
///
diff --git a/src/Avalonia.Visuals/Media/IImage.cs b/src/Avalonia.Visuals/Media/IImage.cs
new file mode 100644
index 0000000000..35ddf07f44
--- /dev/null
+++ b/src/Avalonia.Visuals/Media/IImage.cs
@@ -0,0 +1,31 @@
+using Avalonia.Platform;
+using Avalonia.Visuals.Media.Imaging;
+
+namespace Avalonia.Media
+{
+ ///
+ /// Represents a raster or vector image.
+ ///
+ public interface IImage
+ {
+ ///
+ /// Gets the size of the image, in device independent pixels.
+ ///
+ Size Size { get; }
+
+ ///
+ /// Draws the image to a .
+ ///
+ /// The drawing context.
+ /// The opacity to draw with.
+ /// The rect in the image to draw.
+ /// The rect in the output to draw to.
+ /// The bitmap interpolation mode.
+ void Draw(
+ DrawingContext context,
+ double opacity,
+ Rect sourceRect,
+ Rect destRect,
+ BitmapInterpolationMode bitmapInterpolationMode);
+ }
+}
diff --git a/src/Avalonia.Visuals/Media/Imaging/Bitmap.cs b/src/Avalonia.Visuals/Media/Imaging/Bitmap.cs
index 8dd75d2374..8f154ad8e4 100644
--- a/src/Avalonia.Visuals/Media/Imaging/Bitmap.cs
+++ b/src/Avalonia.Visuals/Media/Imaging/Bitmap.cs
@@ -5,6 +5,7 @@ using System;
using System.IO;
using Avalonia.Platform;
using Avalonia.Utilities;
+using Avalonia.Visuals.Media.Imaging;
namespace Avalonia.Media.Imaging
{
@@ -94,9 +95,29 @@ namespace Avalonia.Media.Imaging
PlatformImpl.Item.Save(fileName);
}
+ ///
+ /// Saves the bitmap to a stream.
+ ///
+ /// The stream.
public void Save(Stream stream)
{
PlatformImpl.Item.Save(stream);
}
+
+ ///
+ void IImage.Draw(
+ DrawingContext context,
+ double opacity,
+ Rect sourceRect,
+ Rect destRect,
+ BitmapInterpolationMode bitmapInterpolationMode)
+ {
+ context.PlatformImpl.DrawBitmap(
+ PlatformImpl,
+ opacity,
+ sourceRect,
+ destRect,
+ bitmapInterpolationMode);
+ }
}
}
diff --git a/src/Avalonia.Visuals/Media/Imaging/IBitmap.cs b/src/Avalonia.Visuals/Media/Imaging/IBitmap.cs
index 90b13088e1..4c3203a95b 100644
--- a/src/Avalonia.Visuals/Media/Imaging/IBitmap.cs
+++ b/src/Avalonia.Visuals/Media/Imaging/IBitmap.cs
@@ -11,7 +11,7 @@ namespace Avalonia.Media.Imaging
///
/// Represents a bitmap image.
///
- public interface IBitmap : IDisposable
+ public interface IBitmap : IImage, IDisposable
{
///
/// Gets the dots per inch (DPI) of the image.
@@ -32,15 +32,6 @@ namespace Avalonia.Media.Imaging
///
IRef PlatformImpl { get; }
- ///
- /// Gets the size of the image, in device independent pixels.
- ///
- ///
- /// Note that Skia does not currently support reading the DPI of an image so this value
- /// will equal on Skia.
- ///
- Size Size { get; }
-
///
/// Saves the bitmap to a file.
///
diff --git a/src/Avalonia.Visuals/Platform/IDrawingContextImpl.cs b/src/Avalonia.Visuals/Platform/IDrawingContextImpl.cs
index f2309c271d..7d142b0759 100644
--- a/src/Avalonia.Visuals/Platform/IDrawingContextImpl.cs
+++ b/src/Avalonia.Visuals/Platform/IDrawingContextImpl.cs
@@ -33,7 +33,7 @@ namespace Avalonia.Platform
/// The rect in the image to draw.
/// The rect in the output to draw to.
/// The bitmap interpolation mode.
- void DrawImage(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode = BitmapInterpolationMode.Default);
+ void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode = BitmapInterpolationMode.Default);
///
/// Draws a bitmap image.
@@ -42,7 +42,7 @@ namespace Avalonia.Platform
/// The opacity mask to draw with.
/// The destination rect for the opacity mask.
/// The rect in the output to draw to.
- void DrawImage(IRef source, IBrush opacityMask, Rect opacityMaskRect, Rect destRect);
+ void DrawBitmap(IRef source, IBrush opacityMask, Rect opacityMaskRect, Rect destRect);
///
/// Draws a line.
diff --git a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs
index 2fa249f101..585b132bd3 100644
--- a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs
+++ b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs
@@ -469,11 +469,11 @@ namespace Avalonia.Rendering
if (layer.OpacityMask == null)
{
- context.DrawImage(bitmap, layer.Opacity, sourceRect, clientRect);
+ context.DrawBitmap(bitmap, layer.Opacity, sourceRect, clientRect);
}
else
{
- context.DrawImage(bitmap, layer.OpacityMask, layer.OpacityMaskRect, sourceRect);
+ context.DrawBitmap(bitmap, layer.OpacityMask, layer.OpacityMaskRect, sourceRect);
}
if (layer.GeometryClip != null)
@@ -485,7 +485,7 @@ namespace Avalonia.Rendering
if (_overlay != null)
{
var sourceRect = new Rect(0, 0, _overlay.Item.PixelSize.Width, _overlay.Item.PixelSize.Height);
- context.DrawImage(_overlay, 0.5, sourceRect, clientRect);
+ context.DrawBitmap(_overlay, 0.5, sourceRect, clientRect);
}
if (DrawFps)
diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/DeferredDrawingContextImpl.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/DeferredDrawingContextImpl.cs
index a169a629be..b362321745 100644
--- a/src/Avalonia.Visuals/Rendering/SceneGraph/DeferredDrawingContextImpl.cs
+++ b/src/Avalonia.Visuals/Rendering/SceneGraph/DeferredDrawingContextImpl.cs
@@ -115,7 +115,7 @@ namespace Avalonia.Rendering.SceneGraph
}
///
- public void DrawImage(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode)
+ public void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode)
{
var next = NextDrawAs();
@@ -130,7 +130,7 @@ namespace Avalonia.Rendering.SceneGraph
}
///
- public void DrawImage(IRef source, IBrush opacityMask, Rect opacityMaskRect, Rect sourceRect)
+ public void DrawBitmap(IRef source, IBrush opacityMask, Rect opacityMaskRect, Rect sourceRect)
{
// This method is currently only used to composite layers so shouldn't be called here.
throw new NotSupportedException();
diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/ImageNode.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/ImageNode.cs
index e1bdcaab3b..054f33c95d 100644
--- a/src/Avalonia.Visuals/Rendering/SceneGraph/ImageNode.cs
+++ b/src/Avalonia.Visuals/Rendering/SceneGraph/ImageNode.cs
@@ -100,7 +100,7 @@ namespace Avalonia.Rendering.SceneGraph
public override void Render(IDrawingContextImpl context)
{
context.Transform = Transform;
- context.DrawImage(Source, Opacity, SourceRect, DestRect, BitmapInterpolationMode);
+ context.DrawBitmap(Source, Opacity, SourceRect, DestRect, BitmapInterpolationMode);
}
///
diff --git a/src/Avalonia.X11/X11IconLoader.cs b/src/Avalonia.X11/X11IconLoader.cs
index f0e75536d0..093f2b12c1 100644
--- a/src/Avalonia.X11/X11IconLoader.cs
+++ b/src/Avalonia.X11/X11IconLoader.cs
@@ -59,7 +59,7 @@ namespace Avalonia.X11
}
using(var rt = AvaloniaLocator.Current.GetService().CreateRenderTarget(new[]{this}))
using (var ctx = rt.CreateDrawingContext(null))
- ctx.DrawImage(bitmap.PlatformImpl, 1, new Rect(bitmap.Size),
+ ctx.DrawBitmap(bitmap.PlatformImpl, 1, new Rect(bitmap.Size),
new Rect(0, 0, _width, _height));
Data = new UIntPtr[_width * _height + 2];
Data[0] = new UIntPtr((uint)_width);
diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs
index d06cfa69a7..1c05f8ac9f 100644
--- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs
+++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs
@@ -110,7 +110,7 @@ namespace Avalonia.Skia
}
///
- public void DrawImage(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode)
+ public void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode)
{
var drawableImage = (IDrawableBitmapImpl)source.Item;
var s = sourceRect.ToSKRect();
@@ -146,10 +146,10 @@ namespace Avalonia.Skia
}
///
- public void DrawImage(IRef source, IBrush opacityMask, Rect opacityMaskRect, Rect destRect)
+ public void DrawBitmap(IRef source, IBrush opacityMask, Rect opacityMaskRect, Rect destRect)
{
PushOpacityMask(opacityMask, opacityMaskRect);
- DrawImage(source, 1, new Rect(0, 0, source.Item.PixelSize.Width, source.Item.PixelSize.Height), destRect, BitmapInterpolationMode.Default);
+ DrawBitmap(source, 1, new Rect(0, 0, source.Item.PixelSize.Width, source.Item.PixelSize.Height), destRect, BitmapInterpolationMode.Default);
PopOpacityMask();
}
@@ -437,7 +437,7 @@ namespace Avalonia.Skia
context.Clear(Colors.Transparent);
context.PushClip(calc.IntermediateClip);
context.Transform = calc.IntermediateTransform;
- context.DrawImage(
+ context.DrawBitmap(
RefCountable.CreateUnownedNotClonable(tileBrushImage),
1,
sourceRect,
diff --git a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs
index aa13003643..81d869f3b8 100644
--- a/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs
+++ b/src/Windows/Avalonia.Direct2D1/Media/DrawingContextImpl.cs
@@ -109,7 +109,7 @@ namespace Avalonia.Direct2D1.Media
/// The rect in the image to draw.
/// The rect in the output to draw to.
/// The bitmap interpolation mode.
- public void DrawImage(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode)
+ public void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode)
{
using (var d2d = ((BitmapImpl)source.Item).GetDirect2DBitmap(_deviceContext))
{
@@ -149,7 +149,7 @@ namespace Avalonia.Direct2D1.Media
/// The opacity mask to draw with.
/// The destination rect for the opacity mask.
/// The rect in the output to draw to.
- public void DrawImage(IRef source, IBrush opacityMask, Rect opacityMaskRect, Rect destRect)
+ public void DrawBitmap(IRef source, IBrush opacityMask, Rect opacityMaskRect, Rect destRect)
{
using (var d2dSource = ((BitmapImpl)source.Item).GetDirect2DBitmap(_deviceContext))
using (var sourceBrush = new BitmapBrush(_deviceContext, d2dSource.Value))
diff --git a/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs
index fbc6d21cb7..6632e2b3e7 100644
--- a/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs
+++ b/src/Windows/Avalonia.Direct2D1/Media/ImageBrushImpl.cs
@@ -107,7 +107,7 @@ namespace Avalonia.Direct2D1.Media
context.PushClip(calc.IntermediateClip);
context.Transform = calc.IntermediateTransform;
- context.DrawImage(RefCountable.CreateUnownedNotClonable(bitmap), 1, rect, rect, _bitmapInterpolationMode);
+ context.DrawBitmap(RefCountable.CreateUnownedNotClonable(bitmap), 1, rect, rect, _bitmapInterpolationMode);
context.PopClip();
}
diff --git a/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DRenderTargetBitmapImpl.cs b/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DRenderTargetBitmapImpl.cs
index 8ec368c999..b96441e357 100644
--- a/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DRenderTargetBitmapImpl.cs
+++ b/src/Windows/Avalonia.Direct2D1/Media/Imaging/D2DRenderTargetBitmapImpl.cs
@@ -58,7 +58,7 @@ namespace Avalonia.Direct2D1.Media.Imaging
{
using (var dc = wic.CreateDrawingContext(null))
{
- dc.DrawImage(
+ dc.DrawBitmap(
RefCountable.CreateUnownedNotClonable(this),
1,
new Rect(PixelSize.ToSizeWithDpi(Dpi.X)),
diff --git a/tests/Avalonia.RenderTests/Media/BitmapTests.cs b/tests/Avalonia.RenderTests/Media/BitmapTests.cs
index 97e234a55b..7564d43070 100644
--- a/tests/Avalonia.RenderTests/Media/BitmapTests.cs
+++ b/tests/Avalonia.RenderTests/Media/BitmapTests.cs
@@ -94,7 +94,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media
ctx.DrawRectangle(Brushes.Pink, null, new Rect(0, 20, 100, 10));
var rc = new Rect(0, 0, 60, 60);
- ctx.DrawImage(bmp.PlatformImpl, 1, rc, rc);
+ ctx.DrawBitmap(bmp.PlatformImpl, 1, rc, rc);
}
rtb.Save(System.IO.Path.Combine(OutputPath, testName + ".out.png"));
}
diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs
index 2061caa320..ea192a1310 100644
--- a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs
+++ b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs
@@ -670,7 +670,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(), BitmapInterpolationMode.Default));
+ context.Verify(x => x.DrawBitmap(borderLayer, 0.5, It.IsAny(), It.IsAny(), BitmapInterpolationMode.Default));
}
[Fact]