Exemplo n.º 1
0
        private void Render(object state)
        {
            if (!RenderControl.IsDisposed && _stopwatch.ElapsedTicks >= FrameTicks)
            {
                _stopwatch.Restart();

                Bitmap finalBitmpap;

                Bitmap screenBitmap;
                Bitmap borderBitmap;

                _screenBitmapTripleBufferingSystem.TryGetNextConsumerBuffer(out screenBitmap);

                if (BorderVisible)
                {
                    _borderBitmapTripleBufferingSystem.TryGetNextConsumerBuffer(out borderBitmap);

                    using (var g = Graphics.FromImage(_compositeBitmap))
                    {
                        g.DrawImage(screenBitmap, _borderedScreenRectangle, _screenRectangle, GraphicsUnit.Pixel);
                        g.DrawImage(borderBitmap, _borderRectangle, _borderRectangle, GraphicsUnit.Pixel);
                    }

                    finalBitmpap = _compositeBitmap;
                }
                else
                {
                    finalBitmpap = screenBitmap;
                }

                // Calls to GDI+ should be thread-safe for the most part, so we only have to take a little bit of care for ensuring correctness.
                // CreateGraphics is one of the few thread-safe members of Control. :)
                using (var g = RenderControl.CreateGraphics())
                {
                    g.CompositingMode    = CompositingMode.SourceCopy;
                    g.CompositingQuality = CompositingQuality.HighSpeed;
                    g.PixelOffsetMode    = PixelOffsetMode.Half;
                    g.SmoothingMode      = SmoothingMode.None;
                    g.InterpolationMode  = InterpolationMode.NearestNeighbor;
                    g.DrawImage(finalBitmpap, RenderControl.ClientRectangle);
                }
            }

            var tcs = state as TaskCompletionSource <bool>;

            if (tcs != null)
            {
                if (RenderControl.IsDisposed)
                {
                    tcs.TrySetCanceled();
                }
                else
                {
                    tcs.TrySetResult(true);
                }
            }
        }