protected sealed override void OnPaint(PaintEventArgs e) { if (EnableDoubleBuffering) { var screen = ParentWindow.Screen; var scale = screen.RealScale / screen.Scale; renderSize = Size.Round(e.ClipRectangle.Size * scale); if (bitmap == null || bitmap.Size.Width < renderSize.Width || bitmap.Size.Height < renderSize.Height) { if (bitmap != null) bitmap.Dispose(); bitmap = new Bitmap(renderSize, PixelFormat.Format32bppRgba); } var bitmapGraphics = new Graphics(bitmap); bitmapGraphics.Clear(Brushes.Cached(BackgroundColor)); bitmapGraphics.ScaleTransform(scale); bitmapGraphics.TranslateTransform(-e.ClipRectangle.Location); bitmapGraphics.SetClip(e.ClipRectangle * scale); // should be affected by transform var childArgs = new PaintEventArgs(bitmapGraphics, e.ClipRectangle); base.OnPaint(childArgs); OnBufferedPaint(childArgs); bitmapGraphics.Dispose(); bitmapGraphics = null; e.Graphics.DrawImage(bitmap, new RectangleF(renderSize), e.ClipRectangle); if (Platform.IsWpf) { // wpf runs out of resources fast here, so we garbage collect GC.Collect(); } } else { base.OnPaint(e); OnBufferedPaint(e); } }