Exemple #1
0
        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.PixelSize;
            var scaling = session.Scaling;

            GRBackendRenderTargetDesc desc = new GRBackendRenderTargetDesc
            {
                Width              = size.Width,
                Height             = size.Height,
                SampleCount        = disp.SampleCount,
                StencilBits        = disp.StencilSize,
                Config             = GRPixelConfig.Rgba8888,
                Origin             = GRSurfaceOrigin.BottomLeft,
                RenderTargetHandle = new IntPtr(fb)
            };

            gl.Viewport(0, 0, desc.Width, desc.Height);
            gl.ClearStencil(0);
            gl.ClearColor(0, 0, 0, 0);
            gl.Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

            var surface = SKSurface.Create(_grContext, desc);

            var nfo = new DrawingContextImpl.CreateInfo
            {
                GrContext               = _grContext,
                Canvas                  = surface.Canvas,
                Dpi                     = SkiaPlatform.DefaultDpi * scaling,
                VisualBrushRenderer     = visualBrushRenderer,
                DisableTextLcdRendering = true
            };

            return(new DrawingContextImpl(nfo, Disposable.Create(() =>
            {
                surface.Canvas.Flush();
                surface.Dispose();
                session.Dispose();
            })));
        }
Exemple #2
0
        public ISkiaGpuRenderSession BeginRenderingSession()
        {
            var  glSession = _surface.BeginDraw();
            bool success   = false;

            try
            {
                var disp = glSession.Context;
                var gl   = disp.GlInterface;
                gl.GetIntegerv(GL_FRAMEBUFFER_BINDING, out var fb);

                var size    = glSession.Size;
                var scaling = glSession.Scaling;
                if (size.Width <= 0 || size.Height <= 0 || scaling < 0)
                {
                    glSession.Dispose();
                    throw new InvalidOperationException(
                              $"Can't create drawing context for surface with {size} size and {scaling} scaling");
                }

                lock (_grContext)
                {
                    _grContext.ResetContext();

                    var renderTarget =
                        new GRBackendRenderTarget(size.Width, size.Height, disp.SampleCount, disp.StencilSize,
                                                  new GRGlFramebufferInfo((uint)fb, SKColorType.Rgba8888.ToGlSizedFormat()));
                    var surface = SKSurface.Create(_grContext, renderTarget,
                                                   glSession.IsYFlipped ? GRSurfaceOrigin.TopLeft : GRSurfaceOrigin.BottomLeft,
                                                   SKColorType.Rgba8888);

                    success = true;

                    return(new GlGpuSession(_grContext, renderTarget, surface, glSession));
                }
            }
            finally
            {
                if (!success)
                {
                    glSession.Dispose();
                }
            }
        }
Exemple #3
0
        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;

            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);
            _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
            };

            return(new DrawingContextImpl(nfo, Disposable.Create(() =>
            {
                surface.Canvas.Flush();
                surface.Dispose();
                renderTarget.Dispose();
                session.Dispose();
            })));
        }
        public IDrawingContextImpl CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer)
        {
            var  session = _surface.BeginDraw();
            bool success = false;

            try
            {
                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)
                {
                    session.Dispose();
                    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)
                {
                    _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
                    };


                    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();
                }
            }
        }