Author: miguel
Date: 2005-04-26 15:54:31 -0400 (Tue, 26 Apr 2005)
New Revision: 43619

Modified:
   trunk/gtk-sharp/ChangeLog
   trunk/gtk-sharp/gtkdotnet/Graphics.cs
Log:
2005-04-26  Miguel de Icaza  <[EMAIL PROTECTED]>

        * gtkdotnet/Graphics.cs: Contribution from Sebastian Faltoni
        <[EMAIL PROTECTED]> that implements support for using
        System.Drawing on Windows.



Modified: trunk/gtk-sharp/ChangeLog
===================================================================
--- trunk/gtk-sharp/ChangeLog   2005-04-26 18:59:48 UTC (rev 43618)
+++ trunk/gtk-sharp/ChangeLog   2005-04-26 19:54:31 UTC (rev 43619)
@@ -1,3 +1,9 @@
+2005-04-26  Miguel de Icaza  <[EMAIL PROTECTED]>
+
+       * gtkdotnet/Graphics.cs: Contribution from Sebastian Faltoni
+       <[EMAIL PROTECTED]> that implements support for using
+       System.Drawing on Windows.
+
 2005-04-26  Mike Kestner  <[EMAIL PROTECTED]>
 
        * gtk/NodeStore.cs : implement IEnumerable.

Modified: trunk/gtk-sharp/gtkdotnet/Graphics.cs
===================================================================
--- trunk/gtk-sharp/gtkdotnet/Graphics.cs       2005-04-26 18:59:48 UTC (rev 
43618)
+++ trunk/gtk-sharp/gtkdotnet/Graphics.cs       2005-04-26 19:54:31 UTC (rev 
43619)
@@ -33,7 +33,16 @@
                
                private Graphics () {}
 
+               [DllImport("libgdk-win32-2.0-0.dll")]
+               internal static extern IntPtr 
gdk_win32_drawable_get_handle(IntPtr raw);
+
                [DllImport("libgdk-win32-2.0-0.dll")]
+               internal static extern IntPtr gdk_win32_hdc_get(IntPtr 
drawable, IntPtr gc, int usage);
+               
+               [DllImport("libgdk-win32-2.0-0.dll")]
+               internal static extern void gdk_win32_hdc_release(IntPtr 
drawable,IntPtr gc,int usage);
+
+               [DllImport("libgdk-win32-2.0-0.dll")]
                internal static extern IntPtr gdk_x11_drawable_get_xdisplay 
(IntPtr raw);
                
                [DllImport("libgdk-win32-2.0-0.dll")]
@@ -41,28 +50,54 @@
                
                public static System.Drawing.Graphics FromDrawable 
(Gdk.Drawable drawable)
                {
+                       return FromDrawable (drawable, true);
+               }
+
+               public static System.Drawing.Graphics FromDrawable(Gdk.Drawable 
drawable, bool double_buffered)
+               {
                        IntPtr x_drawable;
                        int x_off = 0, y_off = 0;
-                               
                        
-                       if (drawable is Gdk.Window)
-                               ((Gdk.Window) 
drawable).GetInternalPaintInfo(out drawable, out x_off, out y_off);
+                       PlatformID osversion = Environment.OSVersion.Platform;
 
-                       x_drawable = drawable.Handle;
-                       
-                       IntPtr display = gdk_x11_drawable_get_xdisplay 
(x_drawable);
-                       
-                       Type graphics = typeof (System.Drawing.Graphics);
-                       MethodInfo mi = graphics.GetMethod ("FromXDrawable", 
BindingFlags.Static | BindingFlags.NonPublic);
-                       if (mi == null)
-                               throw new NotImplementedException ("In this 
implementation I can not get a graphics from a drawable");
-                       object [] args = new object [2] { (IntPtr) 
gdk_x11_drawable_get_xid (drawable.Handle), (IntPtr) display };
-                       object r = mi.Invoke (null, args);
-                       System.Drawing.Graphics g = (System.Drawing.Graphics) r;
+                       if (osversion == PlatformID.Win32Windows || osversion 
== PlatformID.Win32NT ||
+                           osversion == PlatformID.Win32S || osversion == 
PlatformID.WinCE){
+                               if (drawable is Gdk.Window && double_buffered)
+                                   
((Gdk.Window)drawable).GetInternalPaintInfo(out drawable, out x_off, out y_off);
 
-                       g.TranslateTransform (-x_off, -y_off);
-
-                       return g;
+                               Gdk.GC gcc = new Gdk.GC(drawable);
+                               
+                               IntPtr windc = 
gdk_win32_hdc_get(drawable.Handle, gcc.Handle, 0);
+                               
+                               System.Drawing.Graphics g = 
System.Drawing.Graphics.FromHdc(windc);
+                               
+                               if (double_buffered) {
+                                       gdk_win32_hdc_release(drawable.Handle, 
gcc.Handle, 0);
+                               }
+                               
+                               g.TranslateTransform(-x_off, -y_off);
+                               
+                               return g;
+                       } else {
+                               if (drawable is Gdk.Window && double_buffered)
+                                       ((Gdk.Window) 
drawable).GetInternalPaintInfo(out drawable, out x_off, out y_off);
+                               
+                               x_drawable = drawable.Handle;
+                               
+                               IntPtr display = gdk_x11_drawable_get_xdisplay 
(x_drawable);
+                               
+                               Type graphics = typeof 
(System.Drawing.Graphics);
+                               MethodInfo mi = graphics.GetMethod 
("FromXDrawable", BindingFlags.Static | BindingFlags.NonPublic);
+                               if (mi == null)
+                                       throw new NotImplementedException ("In 
this implementation I can not get a graphics from a drawable");
+                               object [] args = new object [2] { (IntPtr) 
gdk_x11_drawable_get_xid (drawable.Handle), (IntPtr) display };
+                               object r = mi.Invoke (null, args);
+                               System.Drawing.Graphics g = 
(System.Drawing.Graphics) r;
+                               
+                               g.TranslateTransform (-x_off, -y_off);
+                               
+                               return g;
+                       }
                }
        }
 

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to