Browse Source

pass surfaceorigin to FboSkiaSurface.

pull/4346/head
Dan Walmsley 6 years ago
parent
commit
32b8cc811c
  1. 7
      src/Skia/Avalonia.Skia/DrawingContextImpl.cs
  2. 2
      src/Skia/Avalonia.Skia/Gpu/ISkiaGpu.cs
  3. 2
      src/Skia/Avalonia.Skia/Gpu/ISkiaGpuRenderSession.cs
  4. 4
      src/Skia/Avalonia.Skia/Gpu/OpenGl/FboSkiaSurface.cs
  5. 4
      src/Skia/Avalonia.Skia/Gpu/OpenGl/GlRenderTarget.cs
  6. 4
      src/Skia/Avalonia.Skia/Gpu/OpenGl/GlSkiaGpu.cs
  7. 3
      src/Skia/Avalonia.Skia/Gpu/SkiaGpuRenderTarget.cs
  8. 2
      src/Skia/Avalonia.Skia/PlatformRenderInterface.cs
  9. 6
      src/Skia/Avalonia.Skia/SurfaceRenderTarget.cs

7
src/Skia/Avalonia.Skia/DrawingContextImpl.cs

@ -36,6 +36,7 @@ namespace Avalonia.Skia
private readonly SKPaint _fillPaint = new SKPaint(); private readonly SKPaint _fillPaint = new SKPaint();
private readonly SKPaint _boxShadowPaint = new SKPaint(); private readonly SKPaint _boxShadowPaint = new SKPaint();
private static SKShader s_acrylicNoiseShader; private static SKShader s_acrylicNoiseShader;
private readonly GRSurfaceOrigin _surfaceOrigin;
/// <summary> /// <summary>
/// Context create info. /// Context create info.
@ -76,6 +77,8 @@ namespace Avalonia.Skia
/// Skia GPU provider context (optional) /// Skia GPU provider context (optional)
/// </summary> /// </summary>
public ISkiaGpu Gpu; public ISkiaGpu Gpu;
public ISkiaGpuRenderSession CurrentSession;
} }
/// <summary> /// <summary>
@ -96,6 +99,8 @@ namespace Avalonia.Skia
Surface = createInfo.Surface; Surface = createInfo.Surface;
Canvas = createInfo.Canvas ?? createInfo.Surface?.Canvas; Canvas = createInfo.Canvas ?? createInfo.Surface?.Canvas;
_surfaceOrigin = createInfo.CurrentSession?.SurfaceOrigin ?? GRSurfaceOrigin.TopLeft;
if (Canvas == null) if (Canvas == null)
{ {
throw new ArgumentException("Invalid create info - no Canvas provided", nameof(createInfo)); throw new ArgumentException("Invalid create info - no Canvas provided", nameof(createInfo));
@ -972,7 +977,7 @@ namespace Avalonia.Skia
Gpu = _gpu Gpu = _gpu
}; };
return new SurfaceRenderTarget(createInfo); return new SurfaceRenderTarget(createInfo, _surfaceOrigin);
} }
/// <summary> /// <summary>

2
src/Skia/Avalonia.Skia/Gpu/ISkiaGpu.cs

@ -21,7 +21,7 @@ namespace Avalonia.Skia
/// Creates an offscreen render target surface /// Creates an offscreen render target surface
/// </summary> /// </summary>
/// <param name="size">size in pixels</param> /// <param name="size">size in pixels</param>
ISkiaSurface TryCreateSurface(PixelSize size); ISkiaSurface TryCreateSurface(PixelSize size, GRSurfaceOrigin surfaceOrigin);
} }
public interface ISkiaSurface : IDisposable public interface ISkiaSurface : IDisposable

2
src/Skia/Avalonia.Skia/Gpu/ISkiaGpuRenderSession.cs

@ -22,5 +22,7 @@ namespace Avalonia.Skia
/// Scaling factor. /// Scaling factor.
/// </summary> /// </summary>
double ScaleFactor { get; } double ScaleFactor { get; }
GRSurfaceOrigin SurfaceOrigin { get; }
} }
} }

4
src/Skia/Avalonia.Skia/Gpu/OpenGl/FboSkiaSurface.cs

@ -14,7 +14,7 @@ namespace Avalonia.Skia
private int _texture; private int _texture;
private static readonly bool[] TrueFalse = new[] { true, false }; private static readonly bool[] TrueFalse = new[] { true, false };
public FboSkiaSurface(GRContext grContext, IGlContext glContext, PixelSize pixelSize) public FboSkiaSurface(GRContext grContext, IGlContext glContext, PixelSize pixelSize, GRSurfaceOrigin surfaceOrigin)
{ {
_grContext = grContext; _grContext = grContext;
_glContext = glContext; _glContext = glContext;
@ -93,7 +93,7 @@ namespace Avalonia.Skia
var target = new GRBackendRenderTarget(pixelSize.Width, pixelSize.Height, 0, 8, var target = new GRBackendRenderTarget(pixelSize.Width, pixelSize.Height, 0, 8,
new GRGlFramebufferInfo((uint)_fbo, SKColorType.Rgba8888.ToGlSizedFormat())); new GRGlFramebufferInfo((uint)_fbo, SKColorType.Rgba8888.ToGlSizedFormat()));
Surface = SKSurface.Create(_grContext, target, Surface = SKSurface.Create(_grContext, target,
GRSurfaceOrigin.TopLeft, SKColorType.Rgba8888); surfaceOrigin, SKColorType.Rgba8888);
CanBlit = gl.BlitFramebuffer != null; CanBlit = gl.BlitFramebuffer != null;
} }

4
src/Skia/Avalonia.Skia/Gpu/OpenGl/GlRenderTarget.cs

@ -39,6 +39,8 @@ namespace Avalonia.Skia
_backendRenderTarget = backendRenderTarget; _backendRenderTarget = backendRenderTarget;
_surface = surface; _surface = surface;
_glSession = glSession; _glSession = glSession;
SurfaceOrigin = glSession.IsYFlipped ? GRSurfaceOrigin.TopLeft : GRSurfaceOrigin.BottomLeft;
} }
public void Dispose() public void Dispose()
{ {
@ -48,6 +50,8 @@ namespace Avalonia.Skia
GrContext.Flush(); GrContext.Flush();
_glSession.Dispose(); _glSession.Dispose();
} }
public GRSurfaceOrigin SurfaceOrigin { get; }
public GRContext GrContext { get; } public GRContext GrContext { get; }
public SKSurface SkSurface => _surface; public SKSurface SkSurface => _surface;

4
src/Skia/Avalonia.Skia/Gpu/OpenGl/GlSkiaGpu.cs

@ -47,7 +47,7 @@ namespace Avalonia.Skia
return null; return null;
} }
public ISkiaSurface TryCreateSurface(PixelSize size) public ISkiaSurface TryCreateSurface(PixelSize size, GRSurfaceOrigin surfaceOrigin)
{ {
// Only windows platform needs our FBO trickery // Only windows platform needs our FBO trickery
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
@ -62,7 +62,7 @@ namespace Avalonia.Skia
return null; return null;
try try
{ {
var surface = new FboSkiaSurface(_grContext, _glContext, size); var surface = new FboSkiaSurface(_grContext, _glContext, size, surfaceOrigin);
_canCreateSurfaces = true; _canCreateSurfaces = true;
return surface; return surface;
} }

3
src/Skia/Avalonia.Skia/Gpu/SkiaGpuRenderTarget.cs

@ -33,7 +33,8 @@ namespace Avalonia.Skia
Dpi = SkiaPlatform.DefaultDpi * session.ScaleFactor, Dpi = SkiaPlatform.DefaultDpi * session.ScaleFactor,
VisualBrushRenderer = visualBrushRenderer, VisualBrushRenderer = visualBrushRenderer,
DisableTextLcdRendering = true, DisableTextLcdRendering = true,
Gpu = _skiaGpu Gpu = _skiaGpu,
CurrentSession = session
}; };
return new DrawingContextImpl(nfo, session); return new DrawingContextImpl(nfo, session);

2
src/Skia/Avalonia.Skia/PlatformRenderInterface.cs

@ -127,7 +127,7 @@ namespace Avalonia.Skia
DisableTextLcdRendering = false DisableTextLcdRendering = false
}; };
return new SurfaceRenderTarget(createInfo); return new SurfaceRenderTarget(createInfo, GRSurfaceOrigin.TopLeft);
} }
/// <inheritdoc /> /// <inheritdoc />

6
src/Skia/Avalonia.Skia/SurfaceRenderTarget.cs

@ -42,7 +42,7 @@ namespace Avalonia.Skia
/// Create new surface render target. /// Create new surface render target.
/// </summary> /// </summary>
/// <param name="createInfo">Create info.</param> /// <param name="createInfo">Create info.</param>
public SurfaceRenderTarget(CreateInfo createInfo) public SurfaceRenderTarget(CreateInfo createInfo, GRSurfaceOrigin surfaceOrigin)
{ {
PixelSize = new PixelSize(createInfo.Width, createInfo.Height); PixelSize = new PixelSize(createInfo.Width, createInfo.Height);
Dpi = createInfo.Dpi; Dpi = createInfo.Dpi;
@ -51,7 +51,7 @@ namespace Avalonia.Skia
_grContext = createInfo.GrContext; _grContext = createInfo.GrContext;
_gpu = createInfo.Gpu; _gpu = createInfo.Gpu;
_surface = _gpu?.TryCreateSurface(PixelSize); _surface = _gpu?.TryCreateSurface(PixelSize, surfaceOrigin);
if (_surface == null) if (_surface == null)
_surface = new SkiaSurfaceWrapper(CreateSurface(createInfo.GrContext, PixelSize.Width, PixelSize.Height, _surface = new SkiaSurfaceWrapper(CreateSurface(createInfo.GrContext, PixelSize.Width, PixelSize.Height,
createInfo.Format)); createInfo.Format));
@ -100,7 +100,7 @@ namespace Avalonia.Skia
VisualBrushRenderer = visualBrushRenderer, VisualBrushRenderer = visualBrushRenderer,
DisableTextLcdRendering = _disableLcdRendering, DisableTextLcdRendering = _disableLcdRendering,
GrContext = _grContext, GrContext = _grContext,
Gpu = _gpu Gpu = _gpu,
}; };
return new DrawingContextImpl(createInfo, Disposable.Create(() => Version++)); return new DrawingContextImpl(createInfo, Disposable.Create(() => Version++));

Loading…
Cancel
Save