Browse Source

[SKIA] Don't skip setting SKCanvas.TotalMatrix when we aren't sure what the current transform is due to Save/Restore calls (#15027)

pull/15029/head
Nikita Tsukanov 2 years ago
committed by GitHub
parent
commit
071d1e2ab0
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 26
      src/Skia/Avalonia.Skia/DrawingContextImpl.cs
  2. 5
      src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs

26
src/Skia/Avalonia.Skia/DrawingContextImpl.cs

@ -30,7 +30,7 @@ namespace Avalonia.Skia
private readonly Matrix? _postTransform;
private double _currentOpacity = 1.0f;
private readonly bool _disableSubpixelTextRendering;
private Matrix _currentTransform;
private Matrix? _currentTransform;
private bool _disposed;
private GRContext? _grContext;
public GRContext? GrContext => _grContext;
@ -466,7 +466,7 @@ namespace Avalonia.Skia
Transform = oldTransform;
}
Canvas.Restore();
RestoreCanvas();
}
}
}
@ -509,7 +509,7 @@ namespace Avalonia.Skia
using (var outerRRect = new SKRoundRect(outerRect))
Canvas.DrawRoundRectDifference(outerRRect, shadowRect, shadow.Paint);
Transform = oldTransform;
Canvas.Restore();
RestoreCanvas();
SKRoundRectCache.Shared.Return(shadowRect);
}
}
@ -672,11 +672,17 @@ namespace Avalonia.Skia
Canvas.ClipRegion(r);
}
private void RestoreCanvas()
{
_currentTransform = null;
Canvas.Restore();
}
/// <inheritdoc />
public void PopClip()
{
CheckLease();
Canvas.Restore();
RestoreCanvas();
}
public void PushLayer(Rect bounds)
@ -688,7 +694,7 @@ namespace Avalonia.Skia
public void PopLayer()
{
CheckLease();
Canvas.Restore();
RestoreCanvas();
}
/// <inheritdoc />
@ -731,7 +737,7 @@ namespace Avalonia.Skia
if (useOpacitySaveLayer)
{
Canvas.Restore();
RestoreCanvas();
}
_currentOpacity = _opacityStack.Pop();
@ -796,7 +802,7 @@ namespace Avalonia.Skia
public void PopGeometryClip()
{
CheckLease();
Canvas.Restore();
RestoreCanvas();
}
/// <inheritdoc />
@ -829,15 +835,15 @@ namespace Avalonia.Skia
// Return the paint wrapper's paint less the reset since the paint is already reset in the Dispose method above.
SKPaintCache.Shared.Return(paintWrapper.Paint);
Canvas.Restore();
RestoreCanvas();
Canvas.Restore();
RestoreCanvas();
}
/// <inheritdoc />
public Matrix Transform
{
get { return _currentTransform; }
get { return _currentTransform ??= Canvas.TotalMatrix.ToAvaloniaMatrix(); }
set
{
CheckLease();

5
src/Skia/Avalonia.Skia/SkiaSharpExtensions.cs

@ -124,6 +124,11 @@ namespace Avalonia.Skia
return sm;
}
internal static Matrix ToAvaloniaMatrix(this SKMatrix m) => new(
m.ScaleX, m.SkewY, m.Persp0,
m.SkewX, m.ScaleY, m.Persp1,
m.TransX, m.TransY, m.Persp2);
public static SKColor ToSKColor(this Color c)
{
return new SKColor(c.R, c.G, c.B, c.A);

Loading…
Cancel
Save