예제 #1
0
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            if (sample == null)
            {
                return;
            }

            var width  = Width;
            var height = Height;

            using (var bitmap = new Bitmap(width, height, PixelFormat.Format32bppPArgb))
            {
                var data = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, bitmap.PixelFormat);
                using (var surface = SKSurface.Create(width, height, SKImageInfo.PlatformColorType, SKAlphaType.Premul, data.Scan0, width * 4))
                {
                    var skcanvas = surface.Canvas;
                    sample.Method(skcanvas, width, height);
                }
                bitmap.UnlockBits(data);

                e.Graphics.DrawImage(bitmap, new Rectangle(0, 0, Width, Height));
            }
        }
예제 #2
0
        protected override void OnRender(DrawingContext drawingContext)
        {
            base.OnRender(drawingContext);

            if (sample == null)
            {
                return;
            }

            var m    = PresentationSource.FromVisual(this).CompositionTarget.TransformToDevice;
            var dpiX = m.M11;
            var dpiY = m.M22;

            int width  = (int)(ActualWidth * dpiX);
            int height = (int)(ActualHeight * dpiY);

            var bitmap = new WriteableBitmap(width, height, 96, 96, PixelFormats.Pbgra32, null);

            bitmap.Lock();
            using (var surface = SKSurface.Create(width, height, SKImageInfo.PlatformColorType, SKAlphaType.Premul, bitmap.BackBuffer, bitmap.BackBufferStride))
            {
                var skcanvas = surface.Canvas;
                skcanvas.Scale((float)dpiX, (float)dpiY);
                using (new SKAutoCanvasRestore(skcanvas, true))
                {
                    sample.Method(skcanvas, (int)ActualWidth, (int)ActualHeight);
                }
            }
            bitmap.AddDirtyRect(new Int32Rect(0, 0, width, height));
            bitmap.Unlock();

            drawingContext.DrawImage(bitmap, new Rect(0, 0, ActualWidth, ActualHeight));
        }
예제 #3
0
        public override void DrawRect(CoreGraphics.CGRect dirtyRect)
        {
            base.DrawRect(dirtyRect);

            if (grContext != null)
            {
                var sampleCount = grContext.GetRecommendedSampleCount(GRPixelConfig.Rgba8888, 96.0f);

                var desc = new GRBackendRenderTargetDesc
                {
                    Width              = (int)Bounds.Width,
                    Height             = (int)Bounds.Height,
                    Config             = GRPixelConfig.Rgba8888,
                    Origin             = GRSurfaceOrigin.TopLeft,
                    SampleCount        = sampleCount,
                    StencilBits        = 0,
                    RenderTargetHandle = IntPtr.Zero,
                };

                using (var surface = SKSurface.Create(grContext, desc))
                {
                    var skcanvas = surface.Canvas;

                    sample.Method(skcanvas, (int)Bounds.Width, (int)Bounds.Height);

                    skcanvas.Flush();
                }

                GL.Flush();
            }
        }
예제 #4
0
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            if (grContext != null)
            {
                var desc = new GRBackendRenderTargetDesc
                {
                    Width              = Width,
                    Height             = Height,
                    Config             = GRPixelConfig.Bgra8888,
                    Origin             = GRSurfaceOrigin.TopLeft,
                    SampleCount        = 1,
                    StencilBits        = 0,
                    RenderTargetHandle = IntPtr.Zero,
                };

                using (var surface = SKSurface.Create(grContext, desc))
                {
                    var skcanvas = surface.Canvas;

                    sample.Method(skcanvas, Width, Height);

                    skcanvas.Flush();
                }

                SwapBuffers();
            }
        }
예제 #5
0
        private void UpdateBitmap()
        {
            var resolutionScale = DisplayInformation.GetForCurrentView().ResolutionScale;
            var screenScale     = (float)resolutionScale / 100.0f;
            var width           = (int)(ActualWidth * screenScale);
            var height          = (int)(ActualHeight * screenScale);

            if (width == 0 || height == 0)
            {
                return;
            }

            IntPtr buff = Marshal.AllocCoTaskMem(width * height * 4);

            try
            {
                using (var surface = SKSurface.Create(width, height, SKImageInfo.PlatformColorType, SKAlphaType.Premul, buff, width * 4))
                {
                    var skcanvas = surface.Canvas;

                    skcanvas.Scale(screenScale, screenScale);

                    sample?.Method(skcanvas, (int)ActualWidth, (int)ActualHeight);
                }

                var pixels = new byte[width * height * 4];
                Marshal.Copy(buff, pixels, 0, pixels.Length);

                var bitmap = new WriteableBitmap(width, height);

                var stream = bitmap.PixelBuffer.AsStream();
                stream.Seek(0, SeekOrigin.Begin);
                stream.Write(pixels, 0, pixels.Length);

                bitmap.Invalidate();

                var b = bitmap;
                Background = new ImageBrush
                {
                    ImageSource = b,
                    AlignmentX  = AlignmentX.Center,
                    AlignmentY  = AlignmentY.Center,
                    Stretch     = Stretch.Fill
                };
            }
            finally
            {
                if (buff != IntPtr.Zero)
                {
                    Marshal.FreeCoTaskMem(buff);
                }
            }
        }