Browse Source

Merge pull request #5109 from MarchingCube/fix-non-invertible-matrix

Fix TransformToVisual not dealing with non-invertible transforms.
pull/5112/head
Dariusz Komosiński 6 years ago
committed by GitHub
parent
commit
f73fca96c5
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 29
      src/Avalonia.Visuals/Matrix.cs
  2. 8
      src/Avalonia.Visuals/VisualExtensions.cs
  3. 19
      tests/Avalonia.Visuals.UnitTests/VisualTests.cs

29
src/Avalonia.Visuals/Matrix.cs

@ -282,25 +282,44 @@ namespace Avalonia
}
/// <summary>
/// Inverts the Matrix.
/// Attempts to invert the Matrix.
/// </summary>
/// <returns>The inverted matrix.</returns>
public Matrix Invert()
/// <returns>The inverted matrix or <see langword="null"/> when matrix is not invertible.</returns>
public bool TryInvert(out Matrix inverted)
{
double d = GetDeterminant();
if (MathUtilities.IsZero(d))
{
throw new InvalidOperationException("Transform is not invertible.");
inverted = default;
return false;
}
return new Matrix(
inverted = new Matrix(
_m22 / d,
-_m12 / d,
-_m21 / d,
_m11 / d,
((_m21 * _m32) - (_m22 * _m31)) / d,
((_m12 * _m31) - (_m11 * _m32)) / d);
return true;
}
/// <summary>
/// Inverts the Matrix.
/// </summary>
/// <exception cref="InvalidOperationException">Matrix is not invertible.</exception>
/// <returns>The inverted matrix.</returns>
public Matrix Invert()
{
if (!TryInvert(out Matrix inverted))
{
throw new InvalidOperationException("Transform is not invertible.");
}
return inverted;
}
/// <summary>

8
src/Avalonia.Visuals/VisualExtensions.cs

@ -50,7 +50,13 @@ namespace Avalonia
{
var thisOffset = GetOffsetFrom(common, from);
var thatOffset = GetOffsetFrom(common, to);
return -thatOffset * thisOffset;
if (!thatOffset.TryInvert(out var thatOffsetInverted))
{
return null;
}
return thatOffsetInverted * thisOffset;
}
return null;

19
tests/Avalonia.Visuals.UnitTests/VisualTests.cs

@ -235,6 +235,25 @@ namespace Avalonia.Visuals.UnitTests
Assert.Equal(new Point(100, 100), point);
}
[Fact]
public void TransformToVisual_With_NonInvertible_RenderTransform_Should_Work()
{
var child = new Decorator
{
Width = 100,
Height = 100,
RenderTransform = new ScaleTransform() { ScaleX = 0, ScaleY = 0 }
};
var root = new TestRoot() { Child = child, Width = 400, Height = 400 };
root.Measure(Size.Infinity);
root.Arrange(new Rect(new Point(), root.DesiredSize));
var tr = root.TransformToVisual(child);
Assert.Null(tr);
}
[Fact]
public void Should_Not_Log_Binding_Error_When_Not_Attached_To_Logical_Tree()
{

Loading…
Cancel
Save