static bool ClearDfrFrameBuffer(IntPtr deviceHandle) { return(IoCtl.DeviceIoControl( deviceHandle, DfrHostIo.IOCTL_DFR_CLEAR_FRAMEBUFFER, IntPtr.Zero, 0, IntPtr.Zero, 0, IntPtr.Zero, IntPtr.Zero )); }
static unsafe bool DrawBitmap(IntPtr deviceHandle, string file, ushort x, ushort y) { ushort width = 0, height = 0; var bResult = false; try { using (var bitmap = new Bitmap(file)) { if (bitmap.Width > ushort.MaxValue || bitmap.Height > ushort.MaxValue) { System.Console.Write("Image too large"); return(false); } width = (ushort)bitmap.Width; height = (ushort)bitmap.Height; int requestSize = bitmap.Width * bitmap.Height * 3 + Marshal.SizeOf(typeof(DFR_HOSTIO_UPDATE_FRAMEBUFFER_HEADER)); // Memory stream for FrameBuffer update request IntPtr requestPtr = Marshal.AllocHGlobal(requestSize); if (requestPtr == IntPtr.Zero) { System.Console.Write("Failed to allocate memory for FrameBuffer"); return(false); } byte *requestBytePtr = (byte *)requestPtr.ToPointer(); UnmanagedMemoryStream requestStream = new UnmanagedMemoryStream(requestBytePtr, requestSize, requestSize, FileAccess.Write); using (var binaryWriter = new BinaryWriter(requestStream)) { binaryWriter.Write(x); binaryWriter.Write(y); binaryWriter.Write(width); binaryWriter.Write(height); binaryWriter.Write(DfrHostIo.DFR_FRAMEBUFFER_FORMAT); binaryWriter.Write((uint)0); for (int w = 0; w < bitmap.Width; w++) { for (int h = bitmap.Height - 1; h >= 0; h--) { var pixel = bitmap.GetPixel(w, h); binaryWriter.Write(pixel.R); binaryWriter.Write(pixel.G); binaryWriter.Write(pixel.B); } } binaryWriter.Flush(); bResult = IoCtl.DeviceIoControl( deviceHandle, DfrHostIo.IOCTL_DFR_UPDATE_FRAMEBUFFER, requestPtr, requestSize, IntPtr.Zero, 0, IntPtr.Zero, IntPtr.Zero ); } Marshal.FreeHGlobal(requestPtr); } } catch (Exception exc) { System.Console.Write($"Exception caught: {exc}"); } return(bResult); }