0
|
1 ???using System; |
|
2 using System.Drawing; |
|
3 using System.Drawing.Imaging; |
|
4 using System.Runtime.InteropServices; |
|
5 using System.Runtime.CompilerServices; |
|
6 using System.Threading; |
|
7 using VirtualBox; |
|
8 |
|
9 namespace ConsoleApplication1 { |
|
10 public class FramebufferUpdateEventArgs : EventArgs { |
|
11 public Rectangle Rectangle { get; private set; } |
|
12 public FramebufferUpdateEventArgs(Rectangle rect) { |
|
13 Rectangle = rect; |
|
14 } |
|
15 } |
|
16 [ClassInterface((Int16)0)] |
|
17 [TypeLibType(2)] |
|
18 [ComVisible(true)] |
|
19 public class Framebuffer : IFramebuffer { |
|
20 Mutex mutex = new Mutex(); |
|
21 |
|
22 public Framebuffer() { |
|
23 byte b = 0; |
|
24 RequestResize(0, (int)FramebufferPixelFormat.FramebufferPixelFormat_FOURCC_RGB, ref b, 32, 0, 640, 480); |
|
25 } |
|
26 |
|
27 public void Lock() { |
|
28 //Console.WriteLine("Lock"); |
|
29 mutex.WaitOne(); |
|
30 } |
|
31 public void Unlock() { |
|
32 //Console.WriteLine("Unlock"); |
|
33 mutex.ReleaseMutex(); |
|
34 } |
|
35 |
|
36 public Bitmap Bitmap { get; private set; } |
|
37 public event EventHandler BufferChanged; |
|
38 public event EventHandler<FramebufferUpdateEventArgs> Update; |
|
39 |
|
40 public IntPtr Address { get; private set; } |
|
41 public uint BitsPerPixel { get; private set; } |
|
42 public uint BytesPerLine { get; private set; } |
|
43 public uint Height { get; private set; } |
|
44 public uint HeightReduction { get { return 0; } } |
|
45 public IFramebufferOverlay Overlay { get { return null; } } |
|
46 public uint PixelFormat { get; private set; } |
|
47 public int UsesGuestVRAM { get { return 0; } } |
|
48 public uint Width { get; private set; } |
|
49 public long WinId { get; internal set; } |
|
50 |
|
51 public unsafe void NotifyUpdate(uint aX, uint aY, uint aWidth, uint aHeight) { |
|
52 //Console.WriteLine("NotifyUpdate X={0} Y={1} Width={2} Height={3}", aX, aY, aWidth, aHeight); |
|
53 if (Update != null) Update(this, new FramebufferUpdateEventArgs(new Rectangle((int)aX, (int)aY, (int)aWidth, (int)aHeight))); |
|
54 } |
|
55 public void ProcessVHWACommand(ref byte aCommand) { |
|
56 Console.WriteLine("ProcessVHWACommand"); |
|
57 } |
|
58 public unsafe int RequestResize(uint aScreenId, uint aPixelFormat, ref byte aVRAM, uint aBitsPerPixel, uint aBytesPerLine, uint aWidth, uint aHeight) { |
|
59 //Note that aVRAM is a pointer, which may be NULL! |
|
60 //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); |
|
61 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); |
|
62 Lock(); |
|
63 try { |
|
64 IntPtr oldAddress = Address; |
|
65 |
|
66 Width = aWidth; |
|
67 Height = aHeight; |
|
68 |
|
69 BitsPerPixel = 32; |
|
70 PixelFormat = (int)FramebufferPixelFormat.FramebufferPixelFormat_FOURCC_RGB; |
|
71 BytesPerLine = BitsPerPixel * Width / 8; //aBytesPerLine; |
|
72 Address = Marshal.AllocHGlobal((int)(BytesPerLine * Height)); |
|
73 if (Bitmap != null) Bitmap.Dispose(); |
|
74 Bitmap = new Bitmap((int)Width, (int)Height, (int)BytesPerLine, System.Drawing.Imaging.PixelFormat.Format32bppRgb, Address); |
|
75 if (BufferChanged != null) BufferChanged(this, new EventArgs()); |
|
76 if (oldAddress != IntPtr.Zero) Marshal.FreeHGlobal(oldAddress); |
|
77 //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); |
|
78 } finally { |
|
79 Unlock(); |
|
80 } |
|
81 return 1; //Finished |
|
82 } |
|
83 |
|
84 ~Framebuffer() { |
|
85 if (Bitmap != null) Bitmap.Dispose(); |
|
86 if (Address != IntPtr.Zero) Marshal.FreeHGlobal(Address); |
|
87 } |
|
88 |
|
89 public void SetVisibleRegion(ref byte aRectangles, uint aCount) { |
|
90 Console.WriteLine("SetVisibleRegion"); |
|
91 } |
|
92 public uint GetVisibleRegion(ref byte aRectangles, uint aCount) { |
|
93 Console.WriteLine("GetVisibleRegion"); |
|
94 return 0; |
|
95 } |
|
96 public int VideoModeSupported(uint aWidth, uint aHeight, uint aBpp) { |
|
97 Console.WriteLine("VideoModeSupported Width={0} Height={1} Bpp={2}", aWidth, aHeight, aBpp); |
|
98 return 1; //Supported |
|
99 } |
|
100 } |
|
101 } |