コード例 #1
0
        public BitmapRenderer(IntPtr dibHandle)
        {
            _dibHandle     = dibHandle;
            _bitmapPointer = Kernel32Native.GlobalLock(dibHandle);

            _bitmapInfo = new BitmapInfoHeader();
            Marshal.PtrToStructure(_bitmapPointer, _bitmapInfo);

            _rectangle        = new Rectangle();
            _rectangle.X      = _rectangle.Y = 0;
            _rectangle.Width  = _bitmapInfo.Width;
            _rectangle.Height = _bitmapInfo.Height;

            if (_bitmapInfo.SizeImage == 0)
            {
                _bitmapInfo.SizeImage = ((_bitmapInfo.Width * _bitmapInfo.BitCount + 31 & ~31) >> 3) * _bitmapInfo.Height;
            }

            // The following code only works on x86
            Debug.Assert(Marshal.SizeOf(typeof(IntPtr)) == 4);

            int pixelInfoPointer = _bitmapInfo.ClrUsed;

            if (pixelInfoPointer == 0 && _bitmapInfo.BitCount <= 8)
            {
                pixelInfoPointer = 1 << (_bitmapInfo.BitCount);             // & 31);
            }
            pixelInfoPointer = pixelInfoPointer * 4 + _bitmapInfo.Size + _bitmapPointer.ToInt32();

            _pixelInfoPointer = new IntPtr(pixelInfoPointer);
        }
コード例 #2
0
 protected virtual void Dispose(bool disposing)
 {
     Kernel32Native.GlobalUnlock(_dibHandle);
     Kernel32Native.GlobalFree(_dibHandle);
 }