Example #1
0
        public unsafe NativeBitmapInfoHandle(ref BitmapInfo bitmapInfo) : base(new IntPtr(0))
        {
            var quads       = bitmapInfo.Colors;
            var quadsLength = quads.Length;

            if (quadsLength == 0)
            {
                quadsLength = 1;
            }
            var success = false;
            var ptr     = IntPtr.Zero;

            try
            {
                ptr = Marshal.AllocHGlobal(Marshal.SizeOf <BitmapInfoHeader>() + Marshal.SizeOf <RgbQuad>() * quadsLength);
                var headerPtr = (BitmapInfoHeader *)ptr.ToPointer();
                *   headerPtr = bitmapInfo.Header;
                var quadPtr   = (RgbQuad *)(headerPtr + 1);
                var i         = 0;
                for (; i < quads.Length; i++)
                {
                    *(quadPtr + i) = quads[i];
                }
                if (i == 0)
                {
                    *quadPtr = new RgbQuad();
                }
                this.SetHandle(ptr);
                success = true;
            }
            finally
            {
                if (!success)
                {
                    SetHandleAsInvalid();
                    Marshal.FreeHGlobal(ptr);
                }
            }
        }
Example #2
0
 public static NativeBitmapInfoHandle NativeAlloc(ref BitmapInfo bitmapInfo)
 {
     return(new NativeBitmapInfoHandle(ref bitmapInfo));
 }