diff VBoxFrontend/Framebuffer.cs @ 0:e1ec7bf71313

Initial commit
author Ivo Smits
date Wed, 04 May 2011 00:59:43 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/VBoxFrontend/Framebuffer.cs	Wed May 04 00:59:43 2011 +0200
@@ -0,0 +1,101 @@
+using System;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.Runtime.InteropServices;
+using System.Runtime.CompilerServices;
+using System.Threading;
+using VirtualBox;
+
+namespace ConsoleApplication1 {
+	public class FramebufferUpdateEventArgs : EventArgs {
+		public Rectangle Rectangle { get; private set; }
+		public FramebufferUpdateEventArgs(Rectangle rect) {
+			Rectangle = rect;
+		}
+	}
+	[ClassInterface((Int16)0)]
+	[TypeLibType(2)]
+	[ComVisible(true)]
+	public class Framebuffer : IFramebuffer {
+		Mutex mutex = new Mutex();
+
+		public Framebuffer() {
+			byte b = 0;
+			RequestResize(0, (int)FramebufferPixelFormat.FramebufferPixelFormat_FOURCC_RGB, ref b, 32, 0, 640, 480);
+		}
+
+		public void Lock() {
+			//Console.WriteLine("Lock");
+			mutex.WaitOne();
+		}
+		public void Unlock() {
+			//Console.WriteLine("Unlock");
+			mutex.ReleaseMutex();
+		}
+
+		public Bitmap Bitmap { get; private set; }
+		public event EventHandler BufferChanged;
+		public event EventHandler<FramebufferUpdateEventArgs> Update;
+
+		public IntPtr Address { get; private set; }
+		public uint BitsPerPixel { get; private set; }
+		public uint BytesPerLine { get; private set; }
+		public uint Height { get; private set; }
+		public uint HeightReduction { get { return 0; } }
+		public IFramebufferOverlay Overlay { get { return null; } }
+		public uint PixelFormat { get; private set; }
+		public int UsesGuestVRAM { get { return 0; } }
+		public uint Width { get; private set; }
+		public long WinId { get; internal set; }
+
+		public unsafe void NotifyUpdate(uint aX, uint aY, uint aWidth, uint aHeight) {
+			//Console.WriteLine("NotifyUpdate X={0} Y={1} Width={2} Height={3}", aX, aY, aWidth, aHeight);
+			if (Update != null) Update(this, new FramebufferUpdateEventArgs(new Rectangle((int)aX, (int)aY, (int)aWidth, (int)aHeight)));
+		}
+		public void ProcessVHWACommand(ref byte aCommand) {
+			Console.WriteLine("ProcessVHWACommand");
+		}
+		public unsafe int RequestResize(uint aScreenId, uint aPixelFormat, ref byte aVRAM, uint aBitsPerPixel, uint aBytesPerLine, uint aWidth, uint aHeight) {
+			//Note that aVRAM is a pointer, which may be NULL!
+			//fixed (Byte* vrp = &aVRAM) Console.WriteLine("RequestResize Current={0} ScreenId={1} PixelFormat={2} VRAM={3} BitsPerPixel={4} BytesPerLine={5} Width={6} Height={7}", Address, aScreenId, aPixelFormat, (IntPtr)vrp, aBitsPerPixel, aBytesPerLine, aWidth, aHeight);
+			Console.WriteLine("RequestResize Current={0} ScreenId={1} PixelFormat={2} VRAM={3} BitsPerPixel={4} BytesPerLine={5} Width={6} Height={7}", Address, aScreenId, aPixelFormat, 0, aBitsPerPixel, aBytesPerLine, aWidth, aHeight);
+			Lock();
+			try {
+				IntPtr oldAddress = Address;
+
+				Width = aWidth;
+				Height = aHeight;
+
+				BitsPerPixel = 32;
+				PixelFormat = (int)FramebufferPixelFormat.FramebufferPixelFormat_FOURCC_RGB;
+				BytesPerLine = BitsPerPixel * Width / 8; //aBytesPerLine;
+				Address = Marshal.AllocHGlobal((int)(BytesPerLine * Height));
+				if (Bitmap != null) Bitmap.Dispose();
+				Bitmap = new Bitmap((int)Width, (int)Height, (int)BytesPerLine, System.Drawing.Imaging.PixelFormat.Format32bppRgb, Address);
+				if (BufferChanged != null) BufferChanged(this, new EventArgs());
+				if (oldAddress != IntPtr.Zero) Marshal.FreeHGlobal(oldAddress);
+				//Console.WriteLine("RequestResizeDone Current={0} ScreenId={1} PixelFormat={2} VRAM={3} BitsPerPixel={4} BytesPerLine={5} Width={6} Height={7}", Address, aScreenId, PixelFormat, 0, BitsPerPixel, BytesPerLine, Width, Height);
+			} finally {
+				Unlock();
+			}
+			return 1; //Finished
+		}
+
+		~Framebuffer() {
+			if (Bitmap != null) Bitmap.Dispose();
+			if (Address != IntPtr.Zero) Marshal.FreeHGlobal(Address);
+		}
+
+		public void SetVisibleRegion(ref byte aRectangles, uint aCount) {
+			Console.WriteLine("SetVisibleRegion");
+		}
+		public uint GetVisibleRegion(ref byte aRectangles, uint aCount) {
+			Console.WriteLine("GetVisibleRegion");
+			return 0;
+		}
+		public int VideoModeSupported(uint aWidth, uint aHeight, uint aBpp) {
+			Console.WriteLine("VideoModeSupported Width={0} Height={1} Bpp={2}", aWidth, aHeight, aBpp);
+			return 1; //Supported
+		}
+	}
+}