28 private ElementReference _canvasRef;
29 private IJSObjectReference? _module;
30 private DotNetObjectReference<BlazorBitmapRenderSurfaceComponent>? _dotNetRef;
31 private bool _moduleLoaded;
37 public RenderSurfaceHost<BitmapBackbuffer>
Host {
get;
private set; } =
null!;
39 internal override ValueTask<CanvasOffset> GetCanvasOffsetAsync()
40 => _module is
null ? ValueTask.FromResult(
default(CanvasOffset))
41 : _module.InvokeAsync<CanvasOffset>(
"getCanvasOffset", _canvasRef);
49 Host =
new RenderSurfaceHost<BitmapBackbuffer>(
Adapter);
55 if (!firstRender)
return;
57 _module = await JS.InvokeAsync<IJSObjectReference>(
58 "import",
"./_content/Gondwana.Blazor/gondwana-blazor.js");
60 _dotNetRef = DotNetObjectReference.Create(
this);
62 await _module.InvokeVoidAsync(
"observeCanvasSize", _canvasRef, _dotNetRef);
65 await UpdateCanvasSizeAsync();
70 await _canvasRef.FocusAsync();
82 internal async Task UpdateCanvasSizeAsync()
84 if (!_moduleLoaded || _module is
null)
return;
88 var size = await _module.InvokeAsync<CanvasSize>(
"getCanvasSize", _canvasRef);
89 if (size.Width > 0 && size.Height > 0)
91 Adapter.UpdateSize(size.Width, size.Height);
108 if (width > 0 && height > 0)
110 Adapter.UpdateSize(width, height);
111 PresentRetainedFrame();
125 internal void EnqueueFrame(
byte[] rgbaPixels,
int width,
int height,
int x,
int y,
int canvasWidth,
int canvasHeight)
127 if (!_moduleLoaded || _module is
null)
return;
129 if (_module is IJSInProcessObjectReference inProcessModule)
133 inProcessModule.InvokeVoid(
"putImageData", _canvasRef, canvasWidth, canvasHeight, width, height, x, y, rgbaPixels,
Adapter.
Width,
Adapter.
Height,
145 _ = InvokeAsync(async () =>
147 if (!_moduleLoaded || _module is
null)
return;
148 await _module.InvokeVoidAsync(
"putImageData", _canvasRef, canvasWidth, canvasHeight, width, height, x, y, rgbaPixels,
Adapter.
Width,
Adapter.
Height,
155 private void PresentRetainedFrame()
157 if (_module is
null)
return;
158 var rect =
Adapter.Presentation.DestinationRect;
159 _ = _module.InvokeVoidAsync(
"presentBitmap", _canvasRef,
Adapter.Width,
Adapter.Height,
160 rect.Left, rect.Top, rect.Width, rect.Height,
167 if (_moduleLoaded && _module is not
null)
171 if (_module is IJSInProcessObjectReference inProcessModule)
173 inProcessModule.InvokeVoid(
"unobserveCanvasSize", _canvasRef);
177 _ = _module.InvokeVoidAsync(
"unobserveCanvasSize", _canvasRef);
186 _dotNetRef?.Dispose();
188 _ = _module?.DisposeAsync();
190 _moduleLoaded =
false;
196 private sealed class CanvasSize
201 public int Width {
get;
set; }
206 public int Height {
get;
set; }