public Region(ScratchBuffer sb, Graphics graphics, Rectangle region) { var minWidth = (int)Math.Ceiling(region.Width / 16.0f) * 16; var minHeight = (int)Math.Ceiling(region.Height / 16.0f) * 16; var needNewBitmap = (sb._ScratchBuffer == null) || (sb._ScratchBuffer.Width < minWidth) || (sb._ScratchBuffer.Height < minHeight); if (needNewBitmap && sb._ScratchBuffer != null) { DeleteObject(sb._ScratchHDC); DeleteObject(sb._ScratchHBitmap); sb._ScratchBuffer.Dispose(); } if (needNewBitmap && sb._ScratchGraphics != null) { sb._ScratchGraphics.Dispose(); } if (needNewBitmap) { Bitmap = sb._ScratchBuffer = new Bitmap( minWidth, minHeight, System.Drawing.Imaging.PixelFormat.Format32bppRgb ); HBitmap = sb._ScratchHBitmap = Bitmap.GetHbitmap(); var tempDC = graphics.GetHdc(); HDC = sb._ScratchHDC = CreateCompatibleDC(tempDC); graphics.ReleaseHdc(tempDC); SelectObject(HDC, HBitmap); Graphics = sb._ScratchGraphics = Graphics.FromHdc(HDC); } else { HDC = sb._ScratchHDC; HBitmap = sb._ScratchHBitmap; Bitmap = sb._ScratchBuffer; Graphics = sb._ScratchGraphics; } Graphics.ResetTransform(); Graphics.TranslateTransform(-region.X, -region.Y, System.Drawing.Drawing2D.MatrixOrder.Prepend); Graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver; Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None; DestinationGraphics = graphics; DestinationRegion = region; Cancelled = false; }