diff --git a/src/Avalonia.Controls/LayoutTransformControl.cs b/src/Avalonia.Controls/LayoutTransformControl.cs index ded75d708a..ed7a50d9b0 100644 --- a/src/Avalonia.Controls/LayoutTransformControl.cs +++ b/src/Avalonia.Controls/LayoutTransformControl.cs @@ -139,7 +139,7 @@ namespace Avalonia.Controls if (null != TransformRoot) { TransformRoot.RenderTransform = _matrixTransform; - TransformRoot.TransformOrigin = new RelativePoint(0, 0, RelativeUnit.Absolute); + TransformRoot.RenderTransformOrigin = new RelativePoint(0, 0, RelativeUnit.Absolute); } ApplyLayoutTransform(); diff --git a/src/Avalonia.Controls/Primitives/AdornerLayer.cs b/src/Avalonia.Controls/Primitives/AdornerLayer.cs index b732387cf5..1dfa2d7af2 100644 --- a/src/Avalonia.Controls/Primitives/AdornerLayer.cs +++ b/src/Avalonia.Controls/Primitives/AdornerLayer.cs @@ -60,7 +60,7 @@ namespace Avalonia.Controls.Primitives if (info != null) { child.RenderTransform = new MatrixTransform(info.Bounds.Transform); - child.TransformOrigin = new RelativePoint(new Point(0,0), RelativeUnit.Absolute); + child.RenderTransformOrigin = new RelativePoint(new Point(0,0), RelativeUnit.Absolute); child.Arrange(info.Bounds.Bounds); } else diff --git a/src/Avalonia.Input/InputExtensions.cs b/src/Avalonia.Input/InputExtensions.cs index a2321f3493..5d80653322 100644 --- a/src/Avalonia.Input/InputExtensions.cs +++ b/src/Avalonia.Input/InputExtensions.cs @@ -25,7 +25,6 @@ namespace Avalonia.Input { Contract.Requires(element != null); var transformedBounds = BoundsTracker.GetTransformedBounds((Visual)element); - var geometry = transformedBounds.GetTransformedBoundsGeometry(); if (element.IsVisible && element.IsHitTestVisible && @@ -42,7 +41,7 @@ namespace Avalonia.Input } } - if (geometry.FillContains(p)) + if (transformedBounds.Contains(p)) { yield return element; } @@ -71,7 +70,6 @@ namespace Avalonia.Input }) .OrderBy(x => x, null) .Select(x => x.Element); - } private class ZOrderElement : IComparable @@ -95,4 +93,4 @@ namespace Avalonia.Input } } } -} +} \ No newline at end of file diff --git a/src/Avalonia.SceneGraph/Rect.cs b/src/Avalonia.SceneGraph/Rect.cs index de4d13890b..806ad39b53 100644 --- a/src/Avalonia.SceneGraph/Rect.cs +++ b/src/Avalonia.SceneGraph/Rect.cs @@ -230,8 +230,8 @@ namespace Avalonia /// true if the point is in the bounds of the rectangle; otherwise false. public bool Contains(Point p) { - return p.X >= _x && p.X < _x + _width && - p.Y >= _y && p.Y < _y + _height; + return p.X >= _x && p.X <= _x + _width && + p.Y >= _y && p.Y <= _y + _height; } /// diff --git a/src/Avalonia.SceneGraph/Rendering/RendererMixin.cs b/src/Avalonia.SceneGraph/Rendering/RendererMixin.cs index b26d825064..fbd5550c95 100644 --- a/src/Avalonia.SceneGraph/Rendering/RendererMixin.cs +++ b/src/Avalonia.SceneGraph/Rendering/RendererMixin.cs @@ -104,7 +104,7 @@ namespace Avalonia.Rendering if (visual.RenderTransform != null) { - var origin = visual.TransformOrigin.ToPixels(new Size(visual.Bounds.Width, visual.Bounds.Height)); + var origin = visual.RenderTransformOrigin.ToPixels(new Size(visual.Bounds.Width, visual.Bounds.Height)); var offset = Matrix.CreateTranslation(origin); renderTransform = (-offset) * visual.RenderTransform.Value * (offset); } @@ -171,7 +171,7 @@ namespace Avalonia.Rendering } else { - var origin = visual.TransformOrigin.ToPixels(new Size(visual.Bounds.Width, visual.Bounds.Height)); + var origin = visual.RenderTransformOrigin.ToPixels(new Size(visual.Bounds.Width, visual.Bounds.Height)); var offset = Matrix.CreateTranslation(visual.Bounds.Position + origin); var m = (-offset) * visual.RenderTransform.Value * (offset); return visual.Bounds.TransformToAABB(m); diff --git a/src/Avalonia.SceneGraph/Visual.cs b/src/Avalonia.SceneGraph/Visual.cs index 8bdbfecb4a..95cae794af 100644 --- a/src/Avalonia.SceneGraph/Visual.cs +++ b/src/Avalonia.SceneGraph/Visual.cs @@ -64,10 +64,10 @@ namespace Avalonia AvaloniaProperty.Register(nameof(RenderTransform)); /// - /// Defines the property. + /// Defines the property. /// - public static readonly StyledProperty TransformOriginProperty = - AvaloniaProperty.Register(nameof(TransformOrigin), defaultValue: RelativePoint.Center); + public static readonly StyledProperty RenderTransformOriginProperty = + AvaloniaProperty.Register(nameof(RenderTransformOrigin), defaultValue: RelativePoint.Center); /// /// Defines the property. @@ -180,10 +180,10 @@ namespace Avalonia /// /// Gets the transform origin of the scene graph node. /// - public RelativePoint TransformOrigin + public RelativePoint RenderTransformOrigin { - get { return GetValue(TransformOriginProperty); } - set { SetValue(TransformOriginProperty, value); } + get { return GetValue(RenderTransformOriginProperty); } + set { SetValue(RenderTransformOriginProperty, value); } } /// diff --git a/src/Avalonia.SceneGraph/VisualTree/IVisual.cs b/src/Avalonia.SceneGraph/VisualTree/IVisual.cs index fb4416f78e..3a01ac0afc 100644 --- a/src/Avalonia.SceneGraph/VisualTree/IVisual.cs +++ b/src/Avalonia.SceneGraph/VisualTree/IVisual.cs @@ -72,9 +72,9 @@ namespace Avalonia.VisualTree Transform RenderTransform { get; set; } /// - /// Gets or sets the transform origin of the scene graph node. + /// Gets or sets the render transform origin of the scene graph node. /// - RelativePoint TransformOrigin { get; set; } + RelativePoint RenderTransformOrigin { get; set; } /// /// Gets the scene graph node's child nodes. diff --git a/src/Avalonia.SceneGraph/VisualTree/TransformedBounds.cs b/src/Avalonia.SceneGraph/VisualTree/TransformedBounds.cs index da8ed01ccc..4c548669bd 100644 --- a/src/Avalonia.SceneGraph/VisualTree/TransformedBounds.cs +++ b/src/Avalonia.SceneGraph/VisualTree/TransformedBounds.cs @@ -38,20 +38,18 @@ namespace Avalonia.VisualTree /// public Matrix Transform { get; } - public Geometry GetTransformedBoundsGeometry() + public bool Contains(Point point) { - StreamGeometry geometry = new StreamGeometry(); - using (var context = geometry.Open()) + if (Transform.HasInverse) { - context.SetFillRule(FillRule.EvenOdd); - context.BeginFigure(Bounds.TopLeft * Transform, true); - context.LineTo(Bounds.TopRight * Transform); - context.LineTo(Bounds.BottomRight * Transform); - context.LineTo(Bounds.BottomLeft * Transform); - context.LineTo(Bounds.TopLeft * Transform); - context.EndFigure(true); + Point trPoint = point * Transform.Invert(); + + return Bounds.Contains(trPoint); + } + else + { + return Bounds.Contains(point); } - return geometry; } } -} +} \ No newline at end of file