Explorar el Código

Merge pull request #6014 from AvaloniaUI/feature/imagedrawing

Implemented ImageDrawing.
Dan Walmsley hace 4 años
padre
commit
467c661c70

+ 53 - 0
src/Avalonia.Visuals/Media/ImageDrawing.cs

@@ -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;
+    }
+}

+ 84 - 0
tests/Avalonia.RenderTests/Media/ImageDrawingTests.cs

@@ -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();
+        }
+    }
+}

BIN
tests/TestFiles/Direct2D1/Media/ImageDrawing/ImageDrawing_BottomRight.expected.png


BIN
tests/TestFiles/Direct2D1/Media/ImageDrawing/ImageDrawing_Fill.expected.png


BIN
tests/TestFiles/Direct2D1/Media/ImageDrawing/github_icon.png


BIN
tests/TestFiles/Skia/Media/ImageDrawing/ImageDrawing_BottomRight.expected.png


BIN
tests/TestFiles/Skia/Media/ImageDrawing/ImageDrawing_Fill.expected.png


BIN
tests/TestFiles/Skia/Media/ImageDrawing/github_icon.png