|
|
|
@ -26,51 +26,64 @@ namespace Avalonia.Skia |
|
|
|
public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) |
|
|
|
{ |
|
|
|
var session = _surface.BeginDraw(); |
|
|
|
var disp = session.Display; |
|
|
|
var gl = disp.GlInterface; |
|
|
|
gl.GetIntegerv(GL_FRAMEBUFFER_BINDING, out var fb); |
|
|
|
|
|
|
|
var size = session.Size; |
|
|
|
var scaling = session.Scaling; |
|
|
|
if (size.Width <= 0 || size.Height <= 0 || scaling < 0) |
|
|
|
{ |
|
|
|
throw new InvalidOperationException( |
|
|
|
$"Can't create drawing context for surface with {size} size and {scaling} scaling"); |
|
|
|
} |
|
|
|
|
|
|
|
gl.Viewport(0, 0, size.Width, size.Height); |
|
|
|
gl.ClearStencil(0); |
|
|
|
gl.ClearColor(0, 0, 0, 0); |
|
|
|
gl.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
|
|
|
lock (_grContext) |
|
|
|
bool success = false; |
|
|
|
try |
|
|
|
{ |
|
|
|
_grContext.ResetContext(); |
|
|
|
|
|
|
|
GRBackendRenderTarget renderTarget = |
|
|
|
new GRBackendRenderTarget(size.Width, size.Height, disp.SampleCount, disp.StencilSize, |
|
|
|
new GRGlFramebufferInfo((uint)fb, GRPixelConfig.Rgba8888.ToGlSizedFormat())); |
|
|
|
var surface = SKSurface.Create(_grContext, renderTarget, |
|
|
|
GRSurfaceOrigin.BottomLeft, |
|
|
|
GRPixelConfig.Rgba8888.ToColorType()); |
|
|
|
var disp = session.Display; |
|
|
|
var gl = disp.GlInterface; |
|
|
|
gl.GetIntegerv(GL_FRAMEBUFFER_BINDING, out var fb); |
|
|
|
|
|
|
|
var nfo = new DrawingContextImpl.CreateInfo |
|
|
|
var size = session.Size; |
|
|
|
var scaling = session.Scaling; |
|
|
|
if (size.Width <= 0 || size.Height <= 0 || scaling < 0) |
|
|
|
{ |
|
|
|
GrContext = _grContext, |
|
|
|
Canvas = surface.Canvas, |
|
|
|
Dpi = SkiaPlatform.DefaultDpi * scaling, |
|
|
|
VisualBrushRenderer = visualBrushRenderer, |
|
|
|
DisableTextLcdRendering = true |
|
|
|
}; |
|
|
|
session.Dispose(); |
|
|
|
throw new InvalidOperationException( |
|
|
|
$"Can't create drawing context for surface with {size} size and {scaling} scaling"); |
|
|
|
} |
|
|
|
|
|
|
|
return new DrawingContextImpl(nfo, Disposable.Create(() => |
|
|
|
gl.Viewport(0, 0, size.Width, size.Height); |
|
|
|
gl.ClearStencil(0); |
|
|
|
gl.ClearColor(0, 0, 0, 0); |
|
|
|
gl.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
|
|
|
lock (_grContext) |
|
|
|
{ |
|
|
|
_grContext.ResetContext(); |
|
|
|
|
|
|
|
GRBackendRenderTarget renderTarget = |
|
|
|
new GRBackendRenderTarget(size.Width, size.Height, disp.SampleCount, disp.StencilSize, |
|
|
|
new GRGlFramebufferInfo((uint)fb, GRPixelConfig.Rgba8888.ToGlSizedFormat())); |
|
|
|
var surface = SKSurface.Create(_grContext, renderTarget, |
|
|
|
GRSurfaceOrigin.BottomLeft, |
|
|
|
GRPixelConfig.Rgba8888.ToColorType()); |
|
|
|
|
|
|
|
var nfo = new DrawingContextImpl.CreateInfo |
|
|
|
{ |
|
|
|
GrContext = _grContext, |
|
|
|
Canvas = surface.Canvas, |
|
|
|
Dpi = SkiaPlatform.DefaultDpi * scaling, |
|
|
|
VisualBrushRenderer = visualBrushRenderer, |
|
|
|
DisableTextLcdRendering = true |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
surface.Canvas.Flush(); |
|
|
|
surface.Dispose(); |
|
|
|
renderTarget.Dispose(); |
|
|
|
_grContext.Flush(); |
|
|
|
var ctx = new DrawingContextImpl(nfo, Disposable.Create(() => |
|
|
|
{ |
|
|
|
|
|
|
|
surface.Canvas.Flush(); |
|
|
|
surface.Dispose(); |
|
|
|
renderTarget.Dispose(); |
|
|
|
_grContext.Flush(); |
|
|
|
session.Dispose(); |
|
|
|
})); |
|
|
|
success = true; |
|
|
|
return ctx; |
|
|
|
} |
|
|
|
} |
|
|
|
finally |
|
|
|
{ |
|
|
|
if(!success) |
|
|
|
session.Dispose(); |
|
|
|
})); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|