From 5b401672d314704bc20b60eec9c2c93f6f403bb1 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 17 Sep 2015 20:59:23 +0200 Subject: [PATCH] Use common methods for Visual/ImageBrushImpl. --- .../Perspex.Direct2D1/Media/ImageBrushImpl.cs | 20 +++-- .../Perspex.Direct2D1/Media/TileBrushImpl.cs | 8 +- .../Media/VisualBrushImpl.cs | 89 +++++++++++++------ 3 files changed, 75 insertions(+), 42 deletions(-) diff --git a/src/Windows/Perspex.Direct2D1/Media/ImageBrushImpl.cs b/src/Windows/Perspex.Direct2D1/Media/ImageBrushImpl.cs index c1d4c0e0b2..590f7d1f33 100644 --- a/src/Windows/Perspex.Direct2D1/Media/ImageBrushImpl.cs +++ b/src/Windows/Perspex.Direct2D1/Media/ImageBrushImpl.cs @@ -33,17 +33,19 @@ namespace Perspex.Direct2D1.Media // them and directly use 'image' in those cases. using (var intermediate = new BitmapRenderTarget(target, brtOpts, intermediateSize)) { - SharpDX.RectangleF drawRect; + Rect drawRect; + var transform = CalculateIntermediateTransform( + tileMode, + sourceRect, + destinationRect, + scale, + translate, + out drawRect); intermediate.BeginDraw(); - intermediate.Transform = CalculateIntermediateTransform( - tileMode, - sourceRect, - destinationRect, - scale, - translate, - out drawRect); - intermediate.PushAxisAlignedClip(drawRect, AntialiasMode.Aliased); + intermediate.Transform = transform.ToDirect2D(); + drawRect *= -transform; + intermediate.PushAxisAlignedClip(drawRect.ToDirect2D(), AntialiasMode.Aliased); intermediate.DrawBitmap(image, 1, BitmapInterpolationMode.Linear); intermediate.PopAxisAlignedClip(); intermediate.EndDraw(); diff --git a/src/Windows/Perspex.Direct2D1/Media/TileBrushImpl.cs b/src/Windows/Perspex.Direct2D1/Media/TileBrushImpl.cs index edd31ae0b6..fd9b938b2d 100644 --- a/src/Windows/Perspex.Direct2D1/Media/TileBrushImpl.cs +++ b/src/Windows/Perspex.Direct2D1/Media/TileBrushImpl.cs @@ -62,13 +62,13 @@ namespace Perspex.Direct2D1.Media return result.ToSharpDX(); } - protected static Matrix3x2 CalculateIntermediateTransform( + protected static Matrix CalculateIntermediateTransform( TileMode tileMode, Rect sourceRect, Rect destinationRect, Vector scale, Vector translate, - out SharpDX.RectangleF drawRect) + out Rect drawRect) { var transform = Matrix.CreateTranslation(-sourceRect.Position) * Matrix.CreateScale(scale) * @@ -85,9 +85,9 @@ namespace Perspex.Direct2D1.Media dr = new Rect(destinationRect.Size); } - drawRect = (dr * -transform).ToSharpDX(); + drawRect = dr; - return transform.ToDirect2D(); + return transform; } protected static BrushProperties GetBrushProperties(TileBrush brush, Rect destinationRect) diff --git a/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs b/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs index 2e4622b5c0..bc049e7ca3 100644 --- a/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs +++ b/src/Windows/Perspex.Direct2D1/Media/VisualBrushImpl.cs @@ -30,47 +30,78 @@ namespace Perspex.Direct2D1.Media layoutable.Arrange(new Rect(layoutable.DesiredSize)); } + var tileMode = brush.TileMode; var sourceRect = brush.SourceRect.ToPixels(layoutable.Bounds.Size); var destinationRect = brush.DestinationRect.ToPixels(targetSize); - var bitmapSize = brush.TileMode == TileMode.None ? targetSize : destinationRect.Size; var scale = brush.Stretch.CalculateScaling(destinationRect.Size, sourceRect.Size); var translate = CalculateTranslate(brush, sourceRect, destinationRect, scale); - var options = CompatibleRenderTargetOptions.None; + var intermediateSize = CalculateIntermediateSize(tileMode, targetSize, destinationRect.Size); + var brtOpts = CompatibleRenderTargetOptions.None; - using (var brt = new BitmapRenderTarget(target, options, bitmapSize.ToSharpDX())) + // TODO: There are times where we don't need to draw an intermediate bitmap. Identify + // them and directly use 'image' in those cases. + using (var intermediate = new BitmapRenderTarget(target, brtOpts, intermediateSize)) { - var renderer = new Renderer(brt); - var transform = Matrix.CreateTranslation(-sourceRect.Position) * - Matrix.CreateScale(scale) * - Matrix.CreateTranslation(translate); - Rect drawRect; - - if (brush.TileMode == TileMode.None) - { - drawRect = destinationRect; - transform *= Matrix.CreateTranslation(destinationRect.Position); - } - else - { - drawRect = new Rect(0, 0, destinationRect.Width, destinationRect.Height); - } + var transform = CalculateIntermediateTransform( + tileMode, + sourceRect, + destinationRect, + scale, + translate, + out drawRect); + var renderer = new Renderer(intermediate); renderer.Render(visual, null, transform, drawRect); - var result = new BitmapBrush(brt, brt.Bitmap); - result.ExtendModeX = GetExtendModeX(brush.TileMode); - result.ExtendModeY = GetExtendModeY(brush.TileMode); + this.PlatformBrush = new BitmapBrush( + target, + intermediate.Bitmap, + GetBitmapBrushProperties(brush), + GetBrushProperties(brush, destinationRect)); + } - if (brush.TileMode != TileMode.None) - { - result.Transform = SharpDX.Matrix3x2.Translation( - (float)destinationRect.X, - (float)destinationRect.Y); - } + //var sourceRect = brush.SourceRect.ToPixels(layoutable.Bounds.Size); + //var destinationRect = brush.DestinationRect.ToPixels(targetSize); + //var bitmapSize = brush.TileMode == TileMode.None ? targetSize : destinationRect.Size; + //var scale = brush.Stretch.CalculateScaling(destinationRect.Size, sourceRect.Size); + //var translate = CalculateTranslate(brush, sourceRect, destinationRect, scale); + //var options = CompatibleRenderTargetOptions.None; - PlatformBrush = result; - } + //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); + + // Rect drawRect; + + // if (brush.TileMode == TileMode.None) + // { + // drawRect = destinationRect; + // transform *= Matrix.CreateTranslation(destinationRect.Position); + // } + // else + // { + // drawRect = new Rect(0, 0, destinationRect.Width, destinationRect.Height); + // } + + // renderer.Render(visual, null, transform, drawRect); + + // var result = new BitmapBrush(brt, brt.Bitmap); + // result.ExtendModeX = GetExtendModeX(brush.TileMode); + // result.ExtendModeY = GetExtendModeY(brush.TileMode); + + // if (brush.TileMode != TileMode.None) + // { + // result.Transform = SharpDX.Matrix3x2.Translation( + // (float)destinationRect.X, + // (float)destinationRect.Y); + // } + + // PlatformBrush = result; + //} } } }