8 changed files with 137 additions and 0 deletions
@ -0,0 +1,53 @@ |
|||
#nullable enable |
|||
|
|||
namespace Avalonia.Media |
|||
{ |
|||
/// <summary>
|
|||
/// Draws an image within a region defined by a <see cref="Rect"/>.
|
|||
/// </summary>
|
|||
public class ImageDrawing : Drawing |
|||
{ |
|||
/// <summary>
|
|||
/// Defines the <see cref="ImageSource"/> property.
|
|||
/// </summary>
|
|||
public static readonly StyledProperty<IImage?> ImageSourceProperty = |
|||
AvaloniaProperty.Register<ImageDrawing, IImage?>(nameof(ImageSource)); |
|||
|
|||
/// <summary>
|
|||
/// Defines the <see cref="Rect"/> property.
|
|||
/// </summary>
|
|||
public static readonly StyledProperty<Rect> RectProperty = |
|||
AvaloniaProperty.Register<ImageDrawing, Rect>(nameof(Rect)); |
|||
|
|||
/// <summary>
|
|||
/// Gets or sets the source of the image.
|
|||
/// </summary>
|
|||
public IImage? ImageSource |
|||
{ |
|||
get => GetValue(ImageSourceProperty); |
|||
set => SetValue(ImageSourceProperty, value); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets or sets region in which the image is drawn.
|
|||
/// </summary>
|
|||
public Rect Rect |
|||
{ |
|||
get => GetValue(RectProperty); |
|||
set => SetValue(RectProperty, value); |
|||
} |
|||
|
|||
public override void Draw(DrawingContext context) |
|||
{ |
|||
var imageSource = ImageSource; |
|||
var rect = Rect; |
|||
|
|||
if (imageSource is object && !rect.IsEmpty) |
|||
{ |
|||
context.DrawImage(imageSource, rect); |
|||
} |
|||
} |
|||
|
|||
public override Rect GetBounds() => Rect; |
|||
} |
|||
} |
|||
@ -0,0 +1,84 @@ |
|||
using System.Threading.Tasks; |
|||
using Avalonia.Controls; |
|||
using Avalonia.Media; |
|||
using Avalonia.Media.Imaging; |
|||
using Xunit; |
|||
|
|||
#if AVALONIA_SKIA
|
|||
namespace Avalonia.Skia.RenderTests |
|||
#else
|
|||
namespace Avalonia.Direct2D1.RenderTests.Media |
|||
#endif
|
|||
{ |
|||
public class ImageDrawingTests : TestBase |
|||
{ |
|||
public ImageDrawingTests() |
|||
: base(@"Media\ImageDrawing") |
|||
{ |
|||
} |
|||
|
|||
private string BitmapPath |
|||
{ |
|||
get { return System.IO.Path.Combine(OutputPath, "github_icon.png"); } |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task ImageDrawing_Fill() |
|||
{ |
|||
Decorator target = new Decorator |
|||
{ |
|||
Width = 200, |
|||
Height = 200, |
|||
Child = new Image |
|||
{ |
|||
Source = new DrawingImage |
|||
{ |
|||
Drawing = new ImageDrawing |
|||
{ |
|||
ImageSource = new Bitmap(BitmapPath), |
|||
Rect = new Rect(0, 0, 200, 200), |
|||
} |
|||
} |
|||
} |
|||
}; |
|||
|
|||
await RenderToFile(target); |
|||
CompareImages(); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task ImageDrawing_BottomRight() |
|||
{ |
|||
Decorator target = new Decorator |
|||
{ |
|||
Width = 200, |
|||
Height = 200, |
|||
Child = new Image |
|||
{ |
|||
Source = new DrawingImage |
|||
{ |
|||
Drawing = new DrawingGroup |
|||
{ |
|||
Children = |
|||
{ |
|||
new GeometryDrawing |
|||
{ |
|||
Geometry = StreamGeometry.Parse("m0,0 l200,200"), |
|||
Brush = Brushes.Black, |
|||
}, |
|||
new ImageDrawing |
|||
{ |
|||
ImageSource = new Bitmap(BitmapPath), |
|||
Rect = new Rect(100, 100, 100, 100), |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
}; |
|||
|
|||
await RenderToFile(target); |
|||
CompareImages(); |
|||
} |
|||
} |
|||
} |
|||
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 6.7 KiB |
|
After Width: | Height: | Size: 17 KiB |
Loading…
Reference in new issue