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); } } }
public static NativeBitmapInfoHandle NativeAlloc(ref BitmapInfo bitmapInfo) { return(new NativeBitmapInfoHandle(ref bitmapInfo)); }