|
|
|
@ -13,6 +13,7 @@ namespace Avalonia.Skia |
|
|
|
/// </summary>
|
|
|
|
internal abstract class GeometryImpl : IGeometryImpl |
|
|
|
{ |
|
|
|
private readonly object _lock = new(); |
|
|
|
private PathCache _pathCache; |
|
|
|
private SKPathMeasure? _cachedPathMeasure; |
|
|
|
|
|
|
|
@ -45,9 +46,12 @@ namespace Avalonia.Skia |
|
|
|
/// <inheritdoc />
|
|
|
|
public bool StrokeContains(IPen? pen, Point point) |
|
|
|
{ |
|
|
|
_pathCache.UpdateIfNeeded(StrokePath, pen); |
|
|
|
lock (_lock) |
|
|
|
{ |
|
|
|
_pathCache.UpdateIfNeeded(StrokePath, pen); |
|
|
|
|
|
|
|
return PathContainsCore(_pathCache.ExpandedPath, point); |
|
|
|
return PathContainsCore(_pathCache.ExpandedPath, point); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -73,8 +77,11 @@ namespace Avalonia.Skia |
|
|
|
/// <inheritdoc />
|
|
|
|
public Rect GetRenderBounds(IPen? pen) |
|
|
|
{ |
|
|
|
_pathCache.UpdateIfNeeded(StrokePath, pen); |
|
|
|
return _pathCache.RenderBounds; |
|
|
|
lock (_lock) |
|
|
|
{ |
|
|
|
_pathCache.UpdateIfNeeded(StrokePath, pen); |
|
|
|
return _pathCache.RenderBounds; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public IGeometryImpl GetWidenedGeometry(IPen pen) |
|
|
|
@ -154,8 +161,11 @@ namespace Avalonia.Skia |
|
|
|
/// </summary>
|
|
|
|
protected void InvalidateCaches() |
|
|
|
{ |
|
|
|
_pathCache.Dispose(); |
|
|
|
_pathCache = default; |
|
|
|
lock (_lock) |
|
|
|
{ |
|
|
|
_pathCache.Dispose(); |
|
|
|
_pathCache = default; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private struct PathCache : IDisposable |
|
|
|
|