Browse Source

Implemented VisualBrush.DestinationRect.

Steven Kirk 10 years ago
parent
commit
8b2b0273b5

+ 0 - 1
src/Windows/Perspex.Direct2D1/Media/DrawingContext.cs

@@ -8,7 +8,6 @@ namespace Perspex.Direct2D1.Media
 {
     using System;
     using System.Reactive.Disposables;
-    using Layout;
     using Perspex.Media;
     using SharpDX;
     using SharpDX.Direct2D1;

+ 21 - 10
src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs

@@ -16,8 +16,7 @@ namespace Perspex.Direct2D1.Media
         public VisualBrushImpl(
             Perspex.Media.VisualBrush brush,
             SharpDX.Direct2D1.RenderTarget target,
-            Size destinationSize)
-            : base(brush, target, destinationSize)
+            Size targetSize)
         {
             var visual = brush.Visual;
             var layoutable = visual as ILayoutable;
@@ -29,21 +28,33 @@ namespace Perspex.Direct2D1.Media
             }
 
             var sourceRect = brush.SourceRect.ToPixels(layoutable.Bounds.Size);
-            var destinationRect = brush.DestinationRect.ToPixels(destinationSize);
+            var destinationRect = brush.DestinationRect.ToPixels(targetSize);
+            var bitmapSize = CalculateBitmapSize(brush.TileMode, destinationRect.Size, targetSize);
             var scale = brush.Stretch.CalculateScaling(destinationRect.Size, sourceRect.Size);
             var translate = CalculateTranslate(brush, sourceRect, destinationRect, scale);
+            var options = CompatibleRenderTargetOptions.None;
 
-            using (var brt = new BitmapRenderTarget(
-                target,
-                CompatibleRenderTargetOptions.None,
-                destinationRect.Size.ToSharpDX()))
+            using (var brt = new BitmapRenderTarget(target, options, bitmapSize.ToSharpDX()))
             {
                 var renderer = new Renderer(brt);
                 var transform = Matrix.CreateTranslation(-sourceRect.Position) *
                                 Matrix.CreateScale(scale) *
                                 Matrix.CreateTranslation(translate);
                 renderer.Render(visual, null, transform);
-                this.PlatformBrush = new BitmapBrush(brt, brt.Bitmap);
+
+                var result = new BitmapBrush(brt, brt.Bitmap);
+                this.PlatformBrush = result;
+            }
+        }
+
+        private static Size CalculateBitmapSize(TileMode tileMode, Size size, Size targetSize)
+        {
+            switch (tileMode)
+            {
+                case TileMode.None:
+                    return targetSize;
+                default:
+                    throw new NotImplementedException();
             }
         }
 
@@ -53,8 +64,8 @@ namespace Perspex.Direct2D1.Media
             Rect destinationRect,
             Vector scale)
         {
-            var x = 0.0;
-            var y = 0.0;
+            var x = destinationRect.X;
+            var y = destinationRect.Y;
             var size = sourceRect.Size * scale;
 
             switch (brush.AlignmentX)

+ 37 - 0
tests/Perspex.RenderTests/Media/VisualBrushTests.cs

@@ -283,5 +283,42 @@ namespace Perspex.Direct2D1.RenderTests.Media
             this.RenderToFile(target);
             this.CompareImages();
         }
+
+        [Fact]
+        public void VisualBrush_DestinationRect_Absolute()
+        {
+            Decorator target = new Decorator
+            {
+                Padding = new Thickness(8),
+                Width = 200,
+                Height = 200,
+                Child = new Rectangle
+                {
+                    Fill = new VisualBrush
+                    {
+                        DestinationRect = new RelativeRect(92, 92, 92, 92, OriginUnit.Pixels),
+                        Visual = new Border
+                        {
+                            Width = 180,
+                            Height = 180,
+                            Background = Brushes.Red,
+                            BorderBrush = Brushes.Black,
+                            BorderThickness = 2,
+                            Child = new Ellipse
+                            {
+                                Width = 100,
+                                Height = 100,
+                                Fill = Brushes.Yellow,
+                                VerticalAlignment = VerticalAlignment.Center,
+                                HorizontalAlignment = HorizontalAlignment.Center,
+                            }
+                        }
+                    }
+                }
+            };
+
+            this.RenderToFile(target);
+            this.CompareImages();
+        }
     }
 }

BIN
tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_DestinationRect_Absolute.expected.png