15 private readonly
object _gate =
new();
16 private SKBitmap? _buffer;
17 private SKSurface? _surface;
18 private bool _disposed;
20 private sealed record Resolution(
int Width,
int Height);
21 private Resolution? _requestedResolution;
30 CreateSurface(width, height);
52 protected internal override void RequestResize(
int width,
int height)
54 Interlocked.Exchange(ref _requestedResolution,
new(width, height));
68 get { lock (_gate)
return _surface!.Canvas; }
71 private readonly SKPaint _bitmapPaint =
new SKPaint
74 BlendMode = SKBlendMode.SrcOver
86 get => _bitmapPaint.FilterQuality;
87 set => _bitmapPaint.FilterQuality = value;
103 protected internal override void BeginFrame()
106 if (Interlocked.Exchange(ref _requestedResolution,
null) is { } request)
108 var w = request.Width;
109 var h = request.Height;
115 if (_disposed)
return;
116 DisposeSurface_NoLock();
126 if (_disposed)
return;
127 var c = _surface!.Canvas;
141 protected internal override void EndFrame()
145 if (_disposed || _surface is
null)
return;
159 protected internal override void DrawTileFrame(Tile tile, RectangleF destRectScreen)
166 Canvas.DrawBitmap(bmp, destRectScreen.ToSKRect(), _bitmapPaint);
183 protected internal override SKImage Snapshot()
187 if (_disposed || _surface is
null)
190 return _surface.Snapshot();
194 private void CreateSurface(
int width,
int height)
196 var info =
new SKImageInfo(width, height, SKColorType.Bgra8888, SKAlphaType.Premul);
197 _buffer =
new SKBitmap(info);
198 _surface = SKSurface.Create(info, _buffer.GetPixels(), _buffer.Info.RowBytes);
201 private void DisposeSurface_NoLock()
203 _surface?.Dispose(); _surface =
null;
204 _buffer?.Dispose(); _buffer =
null;
218 if (_disposed)
return;
222 DisposeSurface_NoLock();