From 47b07358e9ba6cf2a353ac303034ec95b9e520d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Su=C3=A1rez=20Ruiz?= Date: Fri, 11 Mar 2022 14:12:12 +0100 Subject: [PATCH 1/2] Fix Shapes Aspect property --- src/Controls/src/Core/Shapes/Shape.cs | 73 +++++++++++++------------- src/Core/src/Graphics/ShapeDrawable.cs | 3 +- 2 files changed, 39 insertions(+), 37 deletions(-) diff --git a/src/Controls/src/Core/Shapes/Shape.cs b/src/Controls/src/Core/Shapes/Shape.cs index 09e61799014d..4d134ec2b4e3 100644 --- a/src/Controls/src/Core/Shapes/Shape.cs +++ b/src/Controls/src/Core/Shapes/Shape.cs @@ -208,54 +208,55 @@ PathF IShape.PathForBounds(Graphics.Rect viewBounds) var transform = Matrix3x2.Identity; - if (Aspect != Stretch.None) - { - viewBounds.X += StrokeThickness / 2; - viewBounds.Y += StrokeThickness / 2; - viewBounds.Width -= StrokeThickness; - viewBounds.Height -= StrokeThickness; + viewBounds.X += StrokeThickness / 2; + viewBounds.Y += StrokeThickness / 2; + viewBounds.Width -= StrokeThickness; + viewBounds.Height -= StrokeThickness; - float factorX = (float)viewBounds.Width / pathBounds.Width; - float factorY = (float)viewBounds.Height / pathBounds.Height; + float calculatedWidth = (float)(viewBounds.Width / pathBounds.Width); + float calculatedHeight = (float)(viewBounds.Height / pathBounds.Height); - if (Aspect == Stretch.Uniform) - { - var factor = Math.Min(factorX, factorY); + float widthScale = float.IsNaN(calculatedWidth) ? 0 : calculatedWidth; + float heightScale = float.IsNaN(calculatedHeight) ? 0 : calculatedHeight; - var width = pathBounds.Width * factor; - var height = pathBounds.Height * factor; + switch (Aspect) + { + case Stretch.None: + break; - var translateX = (float)((viewBounds.Width - width) / 2 + viewBounds.X); - var translateY = (float)((viewBounds.Height - height) / 2 + viewBounds.Y); + case Stretch.Fill: + transform *= Matrix3x2.CreateScale(widthScale, heightScale); - transform = Matrix3x2.CreateTranslation(-pathBounds.X, -pathBounds.Y); - transform *= Matrix3x2.CreateTranslation(translateX, translateY); - transform *= Matrix3x2.CreateScale(factor, factor); - } - else if (Aspect == Stretch.UniformToFill) - { - var factor = (float)Math.Max(factorX, factorY); + transform *= Matrix3x2.CreateTranslation( + (float)(viewBounds.Left - widthScale * pathBounds.Left), + (float)(viewBounds.Top - heightScale * pathBounds.Top)); + break; - transform = Matrix3x2.CreateScale(factor, factor); + case Stretch.Uniform: + float minScale = Math.Min(widthScale, heightScale); - var translateX = (float)(viewBounds.Left - factor * pathBounds.Left); - var translateY = (float)(viewBounds.Top - factor * pathBounds.Top); + transform *= Matrix3x2.CreateScale(minScale, minScale); - transform *= Matrix3x2.CreateTranslation(translateX, translateY); - } - else if (Aspect == Stretch.Fill) - { - transform = Matrix3x2.CreateScale(factorX, factorY); + transform *= Matrix3x2.CreateTranslation( + (float)(viewBounds.Left - minScale * pathBounds.Left + + (viewBounds.Width - minScale * pathBounds.Width) / 2), + (float)(viewBounds.Top - minScale * pathBounds.Top + + (viewBounds.Height - minScale * pathBounds.Height) / 2)); + break; - var translateX = (float)(viewBounds.Left - factorX * pathBounds.Left); - var translateY = (float)(viewBounds.Top - factorY * pathBounds.Top); + case Stretch.UniformToFill: + float maxScale = Math.Max(widthScale, heightScale); - transform *= Matrix3x2.CreateTranslation(translateX, translateY); - } + transform *= Matrix3x2.CreateScale(maxScale, maxScale); - if (!transform.IsIdentity) - path.Transform(transform); + transform *= Matrix3x2.CreateTranslation( + (float)(viewBounds.Left - maxScale * pathBounds.Left), + (float)(viewBounds.Top - maxScale * pathBounds.Top)); + break; } + + if (!transform.IsIdentity) + path.Transform(transform); #endif return path; diff --git a/src/Core/src/Graphics/ShapeDrawable.cs b/src/Core/src/Graphics/ShapeDrawable.cs index 03e75ee2e789..0a156af84ae3 100644 --- a/src/Core/src/Graphics/ShapeDrawable.cs +++ b/src/Core/src/Graphics/ShapeDrawable.cs @@ -33,7 +33,6 @@ public void Draw(ICanvas canvas, RectF dirtyRect) return; DrawStrokePath(canvas, rect, path); - ClipPath(canvas, path); DrawFillPath(canvas, rect, path); } @@ -109,6 +108,8 @@ void DrawFillPath(ICanvas canvas, RectF dirtyRect, PathF path) canvas.SaveState(); + ClipPath(canvas, path); + // Set Fill var fillPaint = ShapeView.Fill; canvas.SetFillPaint(fillPaint, dirtyRect); From 98daa44972a237eb6b9ddbd08692726192d7bf9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Su=C3=A1rez=20Ruiz?= Date: Thu, 24 Mar 2022 16:31:43 +0100 Subject: [PATCH 2/2] Clip ShapeView on Android --- src/Core/src/Platform/Android/MauiShapeView.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/src/Platform/Android/MauiShapeView.cs b/src/Core/src/Platform/Android/MauiShapeView.cs index 64a48f3a1c45..bcecd2e60d2e 100644 --- a/src/Core/src/Platform/Android/MauiShapeView.cs +++ b/src/Core/src/Platform/Android/MauiShapeView.cs @@ -7,7 +7,7 @@ public class MauiShapeView : PlatformGraphicsView { public MauiShapeView(Context? context) : base(context) { - + ClipToOutline = true; } } } \ No newline at end of file