Пример #1
0
            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;
            }