in source/SkiaSharp.Views/SkiaSharp.Views.Blazor/SKGLView.razor.cs [92:153]
private void OnRenderFrame()
{
if (canvasSize.Width <= 0 || canvasSize.Height <= 0 || dpi <= 0 || jsGLInfo == null)
return;
// create the SkiaSharp context
if (context == null)
{
glInterface = GRGlInterface.Create();
context = GRContext.CreateGl(glInterface);
// bump the default resource cache limit
context.SetResourceCacheLimit(ResourceCacheBytes);
}
// get the new surface size
var newSize = CreateSize(out var unscaledSize);
var info = new SKImageInfo(newSize.Width, newSize.Height, colorType);
var userVisibleSize = IgnorePixelScaling ? unscaledSize : info.Size;
// manage the drawing surface
if (renderTarget == null || renderTargetSize != newSize || !renderTarget.IsValid)
{
// create or update the dimensions
renderTargetSize = newSize;
var glInfo = new GRGlFramebufferInfo(jsGLInfo.FboId, colorType.ToGlSizedFormat());
// destroy the old surface
surface?.Dispose();
surface = null;
canvas = null;
// re-create the render target
renderTarget?.Dispose();
renderTarget = new GRBackendRenderTarget(newSize.Width, newSize.Height, jsGLInfo.Samples, jsGLInfo.Stencils, glInfo);
}
// create the surface
if (surface == null)
{
surface = SKSurface.Create(context, renderTarget, surfaceOrigin, colorType);
canvas = surface.Canvas;
}
using (new SKAutoCanvasRestore(canvas, true))
{
if (IgnorePixelScaling)
{
var canvas = surface.Canvas;
canvas.Scale((float)dpi);
canvas.Save();
}
// start drawing
OnPaintSurface?.Invoke(new SKPaintGLSurfaceEventArgs(surface, renderTarget, surfaceOrigin, info.WithSize(userVisibleSize), info));
}
// update the control
canvas?.Flush();
context.Flush();
}