コード例 #1
0
 static bool ClearDfrFrameBuffer(IntPtr deviceHandle)
 {
     return(IoCtl.DeviceIoControl(
                deviceHandle,
                DfrHostIo.IOCTL_DFR_CLEAR_FRAMEBUFFER,
                IntPtr.Zero,
                0,
                IntPtr.Zero,
                0,
                IntPtr.Zero,
                IntPtr.Zero
                ));
 }
コード例 #2
0
        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);
        }