committed by
GitHub
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