diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs index 596aec2e8f..2974e298fd 100644 --- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs +++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs @@ -57,18 +57,23 @@ namespace Avalonia.Skia } } - private struct PaintDisposable : IDisposable + private struct PaintState : IDisposable { - private Action _action; + private readonly SKColor _color; + private readonly SKShader _shader; + private readonly SKPaint _paint; - public PaintDisposable(Action action) + public PaintState(SKPaint paint, SKColor color, SKShader shader) { - _action = action; + _paint = paint; + _color = color; + _shader = shader; } public void Dispose() { - _action?.Invoke(); + _paint.Color = _color; + _paint.Shader = _shader; } } @@ -80,23 +85,14 @@ namespace Avalonia.Skia private IDisposable _disposable1; - private Func _applyToAction; - - public void SetApplyToAction(Func get, - Action apply, - Action revert) - { - _applyToAction = (from, to) => - { - T state = get(to); - apply(from, to); - return new PaintDisposable(() => revert(to, state)); - }; - } - public IDisposable ApplyTo(SKPaint paint) { - return _applyToAction != null ? _applyToAction(Paint, paint) : default(PaintDisposable); + var state = new PaintState(paint, paint.Color, paint.Shader); + + paint.Color = Paint.Color; + paint.Shader = Paint.Shader; + + return state; } public void AddDisposable(IDisposable disposable) @@ -111,7 +107,6 @@ namespace Avalonia.Skia { Paint = paint; _disposable1 = null; - _applyToAction = null; } public void Dispose() @@ -142,9 +137,6 @@ namespace Avalonia.Skia if (solid != null) { - rv.SetApplyToAction(p => p.Color, - (from, to) => to.Color = from.Color, - (p, v) => p.Color = v); return rv; } @@ -184,9 +176,6 @@ namespace Avalonia.Skia } } - rv.SetApplyToAction(p => new Tuple(p.Color, p.Shader), - (from, to) => { to.Color = from.Color; to.Shader = from.Shader; }, - (p, v) => { p.Color = v.Item1; p.Shader = v.Item2; }); return rv; } @@ -214,10 +203,6 @@ namespace Avalonia.Skia : SKShaderTileMode.Repeat; paint.Shader = SKShader.CreateBitmap(bitmap.Bitmap, tileX, tileY, translation); paint.Shader.Dispose(); - - rv.SetApplyToAction(p => new Tuple(p.Color, p.Shader), - (from, to) => { to.Color = from.Color; to.Shader = from.Shader; }, - (p, v) => { p.Color = v.Item1; p.Shader = v.Item2; }); } return rv;