* roottypes.cs: Rename from tree.cs.
[mono.git] / mcs / class / System.Drawing / System.Drawing / Graphics.cs
index 67655260b0ad22d767ba2a7d3f052a9589681cf5..a5a7c0984f1445f1c33bcd56794c56956dfd96bb 100644 (file)
@@ -52,6 +52,9 @@ namespace System.Drawing
                private bool disposed = false;
                private static float defDpiX = 0;
                private static float defDpiY = 0;
+#if NET_2_0
+               private IntPtr deviceContextHdc;
+#endif
 
 #if !NET_2_0
                [ComVisible(false)]
@@ -117,33 +120,33 @@ namespace System.Drawing
                        throw new NotImplementedException ();
                }
 
-               
                public GraphicsContainer BeginContainer ()
                {
-                       int state;
+                       uint state;
                        Status status;
                        status = GDIPlus.GdipBeginContainer2 (nativeObject, out state);
                        GDIPlus.CheckStatus (status);
 
                         return new GraphicsContainer(state);
                }
-               
+
+               [MonoTODO ("rectangles and unit aren't supported in libgdiplus")]               
                public GraphicsContainer BeginContainer (Rectangle dstrect, Rectangle srcrect, GraphicsUnit unit)
                {
-                       int state;
+                       uint state;
                        Status status;
-                       status = GDIPlus.GdipBeginContainerI (nativeObject, dstrect, srcrect, unit, out state);
+                       status = GDIPlus.GdipBeginContainerI (nativeObject, ref dstrect, ref srcrect, unit, out state);
                        GDIPlus.CheckStatus (status);
 
                        return new GraphicsContainer (state);
                }
 
-               
+               [MonoTODO ("rectangles and unit aren't supported in libgdiplus")]               
                public GraphicsContainer BeginContainer (RectangleF dstrect, RectangleF srcrect, GraphicsUnit unit)
                {
-                       int state;
+                       uint state;
                        Status status;
-                       status = GDIPlus.GdipBeginContainer (nativeObject, dstrect, srcrect, unit, out state);
+                       status = GDIPlus.GdipBeginContainer (nativeObject, ref dstrect, ref srcrect, unit, out state);
                        GDIPlus.CheckStatus (status);
 
                        return new GraphicsContainer (state);
@@ -563,20 +566,23 @@ namespace System.Drawing
 
                public void DrawIcon (Icon icon, Rectangle targetRect)
                {
-                       Image img = icon.ToBitmap ();
-                       DrawImage (img, targetRect);
+                       using (Image img = icon.ToBitmap ()) {
+                               DrawImage (img, targetRect);
+                       }
                }
 
                public void DrawIcon (Icon icon, int x, int y)
                {
-                       Image img = icon.ToBitmap ();
-                       DrawImage (img, x, y);
+                       using (Image img = icon.ToBitmap ()) {
+                               DrawImage (img, x, y);
+                       }
                }
 
                public void DrawIconUnstretched (Icon icon, Rectangle targetRect)
                {
-                       Image img = icon.ToBitmap ();
-                       DrawImageUnscaled (img, targetRect);
+                       using (Image img = icon.ToBitmap ()) {
+                               DrawImageUnscaled (img, targetRect);
+                       }
                }
                
                public void DrawImage (Image image, RectangleF rect)
@@ -1171,8 +1177,10 @@ namespace System.Drawing
 
                public void EndContainer (GraphicsContainer container)
                {
+#if NET_2_0
                        if (container == null)
                                throw new ArgumentNullException ("container");
+#endif
                        Status status = GDIPlus.GdipEndContainer(nativeObject, container.NativeObject);
                        GDIPlus.CheckStatus (status);
                }
@@ -1608,7 +1616,9 @@ namespace System.Drawing
                {
                        if (brush == null)
                                throw new ArgumentNullException ("brush");
-                       
+                       if (rects == null)
+                               throw new ArgumentNullException ("rects");
+
                        Status status = GDIPlus.GdipFillRectanglesI (nativeObject, brush.nativeObject, rects, rects.Length);
                        GDIPlus.CheckStatus (status);
                }
@@ -1617,7 +1627,9 @@ namespace System.Drawing
                {
                        if (brush == null)
                                throw new ArgumentNullException ("brush");
-                       
+                       if (rects == null)
+                               throw new ArgumentNullException ("rects");
+
                        Status status = GDIPlus.GdipFillRectangles (nativeObject, brush.nativeObject, rects, rects.Length);
                        GDIPlus.CheckStatus (status);
                }
@@ -1762,6 +1774,9 @@ namespace System.Drawing
                {
                        IntPtr hdc;
                        GDIPlus.CheckStatus (GDIPlus.GdipGetDC (this.nativeObject, out hdc));
+#if NET_2_0
+                       deviceContextHdc = hdc;
+#endif
                        return hdc;
                }
 
@@ -2025,13 +2040,22 @@ namespace System.Drawing
                {
                        Status status = GDIPlus.GdipReleaseDC (nativeObject, hdc);
                        GDIPlus.CheckStatus (status);
+#if NET_2_0
+                       if (hdc == deviceContextHdc)
+                               deviceContextHdc = IntPtr.Zero;
+#endif
                }
+
 #if NET_2_0
-               public void ReleaseHdc()\r
+               public void ReleaseHdc ()\r
                {\r
-                     \r
+                       if (deviceContextHdc == IntPtr.Zero)
+                               throw new ArgumentException ("Invalid Handle");
+
+                       ReleaseHdc (deviceContextHdc);
                }
 #endif
+
                [MonoTODO]
 #if NET_2_0
                [EditorBrowsable (EditorBrowsableState.Never)]
@@ -2348,6 +2372,7 @@ namespace System.Drawing
                        }
                }
 
+               [MonoTODO ("not supported by libgdiplus")]
                public PixelOffsetMode PixelOffsetMode {
                        get {
                                PixelOffsetMode pixelOffset = PixelOffsetMode.Invalid;
@@ -2391,6 +2416,7 @@ namespace System.Drawing
                        }
                }
 
+               [MonoTODO ("not supported by libgdiplus")]
                public int TextContrast {
                        get {   
                                 int contrast;
@@ -2449,6 +2475,7 @@ namespace System.Drawing
 
 #if NET_2_0
                [MonoTODO]
+               [EditorBrowsable (EditorBrowsableState.Never)]
                public object GetContextInfo ()
                {
                        throw new NotImplementedException ();