annotate VBoxFrontend/Framebuffer.cs @ 7:a7650e26195f default tip

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