Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'mcs/class/System.Drawing/System.Drawing/Region.cs')
-rw-r--r--mcs/class/System.Drawing/System.Drawing/Region.cs640
1 files changed, 640 insertions, 0 deletions
diff --git a/mcs/class/System.Drawing/System.Drawing/Region.cs b/mcs/class/System.Drawing/System.Drawing/Region.cs
new file mode 100644
index 00000000000..b53aaa37cf6
--- /dev/null
+++ b/mcs/class/System.Drawing/System.Drawing/Region.cs
@@ -0,0 +1,640 @@
+//
+// System.Drawing.Region.cs
+//
+// Author:
+// Miguel de Icaza (miguel@ximian.com)
+// Jordi Mas i Hernandez (jordi@ximian.com)
+//
+// Copyright (C) 2003 Ximian, Inc. http://www.ximian.com
+// Copyright (C) 2004,2006 Novell, Inc. http://www.novell.com
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System.Drawing.Drawing2D;
+using System.Runtime.InteropServices;
+using System.Security.Permissions;
+
+namespace System.Drawing
+{
+#if !NET_2_0
+ [ComVisible (false)]
+#endif
+ public sealed class Region : MarshalByRefObject, IDisposable
+ {
+ private IntPtr nativeRegion = IntPtr.Zero;
+
+ public Region()
+ {
+ Status status = GDIPlus.GdipCreateRegion (out nativeRegion);
+ GDIPlus.CheckStatus (status);
+ }
+
+ internal Region(IntPtr native)
+ {
+ nativeRegion = native;
+ }
+
+ [MonoTODO ("GdipCreateRegionPath is not implemented in libgdiplus")]
+ public Region (GraphicsPath path)
+ {
+ if (path == null)
+ throw new ArgumentNullException ("path");
+ Status status = GDIPlus.GdipCreateRegionPath (path.NativeObject, out nativeRegion);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public Region (Rectangle rect)
+ {
+ Status status = GDIPlus.GdipCreateRegionRectI (ref rect, out nativeRegion);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public Region (RectangleF rect)
+ {
+ Status status = GDIPlus.GdipCreateRegionRect (ref rect, out nativeRegion);
+ GDIPlus.CheckStatus (status);
+ }
+
+ [MonoTODO ("GdipCreateRegionRgnData is not implemented in libgdiplus")]
+ public Region (RegionData rgnData)
+ {
+ if (rgnData == null)
+ throw new ArgumentNullException ("rgnData");
+ // a NullReferenceException can be throw for rgnData.Data.Length (if rgnData.Data is null) just like MS
+ Status status = GDIPlus.GdipCreateRegionRgnData (rgnData.Data, rgnData.Data.Length, out nativeRegion);
+ GDIPlus.CheckStatus (status);
+ }
+
+ //
+ // Union
+ //
+
+ public void Union (GraphicsPath path)
+ {
+ if (path == null)
+ throw new ArgumentNullException ("path");
+ Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Union);
+ GDIPlus.CheckStatus (status);
+ }
+
+
+ public void Union (Rectangle rect)
+ {
+ Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Union);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public void Union (RectangleF rect)
+ {
+ Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Union);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public void Union (Region region)
+ {
+ if (region == null)
+ throw new ArgumentNullException ("region");
+ Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Union);
+ GDIPlus.CheckStatus (status);
+ }
+
+
+ //
+ // Intersect
+ //
+ public void Intersect (GraphicsPath path)
+ {
+ if (path == null)
+ throw new ArgumentNullException ("path");
+ Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Intersect);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public void Intersect (Rectangle rect)
+ {
+ Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Intersect);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public void Intersect (RectangleF rect)
+ {
+ Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Intersect);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public void Intersect (Region region)
+ {
+ if (region == null)
+ throw new ArgumentNullException ("region");
+ Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Intersect);
+ GDIPlus.CheckStatus (status);
+ }
+
+ //
+ // Complement
+ //
+ public void Complement (GraphicsPath path)
+ {
+ if (path == null)
+ throw new ArgumentNullException ("path");
+ Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Complement);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public void Complement (Rectangle rect)
+ {
+ Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Complement);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public void Complement (RectangleF rect)
+ {
+ Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Complement);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public void Complement (Region region)
+ {
+ if (region == null)
+ throw new ArgumentNullException ("region");
+ Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Complement);
+ GDIPlus.CheckStatus (status);
+ }
+
+ //
+ // Exclude
+ //
+ public void Exclude (GraphicsPath path)
+ {
+ if (path == null)
+ throw new ArgumentNullException ("path");
+ Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Exclude);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public void Exclude (Rectangle rect)
+ {
+ Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Exclude);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public void Exclude (RectangleF rect)
+ {
+ Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Exclude);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public void Exclude (Region region)
+ {
+ if (region == null)
+ throw new ArgumentNullException ("region");
+ Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Exclude);
+ GDIPlus.CheckStatus (status);
+ }
+
+ //
+ // Xor
+ //
+ public void Xor (GraphicsPath path)
+ {
+ if (path == null)
+ throw new ArgumentNullException ("path");
+ Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Xor);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public void Xor (Rectangle rect)
+ {
+ Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Xor);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public void Xor (RectangleF rect)
+ {
+ Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Xor);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public void Xor (Region region)
+ {
+ if (region == null)
+ throw new ArgumentNullException ("region");
+ Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Xor);
+ GDIPlus.CheckStatus (status);
+ }
+
+ //
+ // GetBounds
+ //
+ public RectangleF GetBounds (Graphics graphics)
+ {
+ if (graphics == null)
+ throw new ArgumentNullException ("graphics");
+
+ RectangleF rect = new Rectangle();
+
+ Status status = GDIPlus.GdipGetRegionBounds (nativeRegion, graphics.NativeObject, ref rect);
+ GDIPlus.CheckStatus (status);
+
+ return rect;
+ }
+
+ //
+ // Translate
+ //
+ public void Translate (int dx, int dy)
+ {
+ Status status = GDIPlus.GdipTranslateRegionI (nativeRegion, dx, dy);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public void Translate (float dx, float dy)
+ {
+ Status status = GDIPlus.GdipTranslateRegion (nativeRegion, dx, dy);
+ GDIPlus.CheckStatus (status);
+ }
+
+ //
+ // IsVisible
+ //
+ public bool IsVisible (int x, int y, Graphics g)
+ {
+ IntPtr ptr = (g == null) ? IntPtr.Zero : g.NativeObject;
+ bool result;
+
+ Status status = GDIPlus.GdipIsVisibleRegionPointI (nativeRegion, x, y, ptr, out result);
+ GDIPlus.CheckStatus (status);
+
+ return result;
+ }
+
+ public bool IsVisible (int x, int y, int width, int height)
+ {
+ bool result;
+
+ Status status = GDIPlus.GdipIsVisibleRegionRectI (nativeRegion, x, y,
+ width, height, IntPtr.Zero, out result);
+
+ GDIPlus.CheckStatus (status);
+
+ return result;
+ }
+
+ public bool IsVisible (int x, int y, int width, int height, Graphics g)
+ {
+ IntPtr ptr = (g == null) ? IntPtr.Zero : g.NativeObject;
+ bool result;
+
+ Status status = GDIPlus.GdipIsVisibleRegionRectI (nativeRegion, x, y,
+ width, height, ptr, out result);
+
+ GDIPlus.CheckStatus (status);
+
+ return result;
+ }
+
+ public bool IsVisible (Point point)
+ {
+ bool result;
+
+ Status status = GDIPlus.GdipIsVisibleRegionPointI (nativeRegion, point.X, point.Y,
+ IntPtr.Zero, out result);
+
+ GDIPlus.CheckStatus (status);
+
+ return result;
+ }
+
+ public bool IsVisible (PointF point)
+ {
+ bool result;
+
+ Status status = GDIPlus.GdipIsVisibleRegionPoint (nativeRegion, point.X, point.Y,
+ IntPtr.Zero, out result);
+
+ GDIPlus.CheckStatus (status);
+
+ return result;
+ }
+
+ public bool IsVisible (Point point, Graphics g)
+ {
+ IntPtr ptr = (g == null) ? IntPtr.Zero : g.NativeObject;
+ bool result;
+
+ Status status = GDIPlus.GdipIsVisibleRegionPointI (nativeRegion, point.X, point.Y,
+ ptr, out result);
+
+ GDIPlus.CheckStatus (status);
+
+ return result;
+ }
+
+ public bool IsVisible (PointF point, Graphics g)
+ {
+ IntPtr ptr = (g == null) ? IntPtr.Zero : g.NativeObject;
+ bool result;
+
+ Status status = GDIPlus.GdipIsVisibleRegionPoint (nativeRegion, point.X, point.Y,
+ ptr, out result);
+
+ GDIPlus.CheckStatus (status);
+
+ return result;
+ }
+
+ public bool IsVisible (Rectangle rect)
+ {
+ bool result;
+
+ Status status = GDIPlus.GdipIsVisibleRegionRectI (nativeRegion, rect.X, rect.Y,
+ rect.Width, rect.Height, IntPtr.Zero, out result);
+
+ GDIPlus.CheckStatus (status);
+
+ return result;
+ }
+
+ public bool IsVisible (RectangleF rect)
+ {
+ bool result;
+
+ Status status = GDIPlus.GdipIsVisibleRegionRect (nativeRegion, rect.X, rect.Y,
+ rect.Width, rect.Height, IntPtr.Zero, out result);
+
+ GDIPlus.CheckStatus (status);
+
+ return result;
+ }
+
+ public bool IsVisible (Rectangle rect, Graphics g)
+ {
+ IntPtr ptr = (g == null) ? IntPtr.Zero : g.NativeObject;
+ bool result;
+
+ Status status = GDIPlus.GdipIsVisibleRegionRectI (nativeRegion, rect.X, rect.Y,
+ rect.Width, rect.Height, ptr, out result);
+
+ GDIPlus.CheckStatus (status);
+
+ return result;
+ }
+
+ public bool IsVisible (RectangleF rect, Graphics g)
+ {
+ IntPtr ptr = (g == null) ? IntPtr.Zero : g.NativeObject;
+ bool result;
+
+ Status status = GDIPlus.GdipIsVisibleRegionRect (nativeRegion, rect.X, rect.Y,
+ rect.Width, rect.Height, ptr, out result);
+
+ GDIPlus.CheckStatus (status);
+
+ return result;
+ }
+
+ public bool IsVisible (float x, float y)
+ {
+ bool result;
+
+ Status status = GDIPlus.GdipIsVisibleRegionPoint (nativeRegion, x, y, IntPtr.Zero, out result);
+ GDIPlus.CheckStatus (status);
+
+ return result;
+ }
+
+ public bool IsVisible (float x, float y, Graphics g)
+ {
+ IntPtr ptr = (g == null) ? IntPtr.Zero : g.NativeObject;
+ bool result;
+
+ Status status = GDIPlus.GdipIsVisibleRegionPoint (nativeRegion, x, y, ptr, out result);
+ GDIPlus.CheckStatus (status);
+
+ return result;
+ }
+
+ public bool IsVisible (float x, float y, float width, float height)
+ {
+ bool result;
+
+ Status status = GDIPlus.GdipIsVisibleRegionRect (nativeRegion, x, y, width, height, IntPtr.Zero, out result);
+ GDIPlus.CheckStatus (status);
+
+ return result;
+ }
+
+ public bool IsVisible (float x, float y, float width, float height, Graphics g)
+ {
+ IntPtr ptr = (g == null) ? IntPtr.Zero : g.NativeObject;
+ bool result;
+
+ Status status = GDIPlus.GdipIsVisibleRegionRect (nativeRegion, x, y, width, height, ptr, out result);
+ GDIPlus.CheckStatus (status);
+
+ return result;
+ }
+
+
+ //
+ // Miscellaneous
+ //
+
+ public bool IsEmpty(Graphics g)
+ {
+ if (g == null)
+ throw new ArgumentNullException ("g");
+
+ bool result;
+
+ Status status = GDIPlus.GdipIsEmptyRegion (nativeRegion, g.NativeObject, out result);
+ GDIPlus.CheckStatus (status);
+
+ return result;
+ }
+
+ public bool IsInfinite(Graphics g)
+ {
+ if (g == null)
+ throw new ArgumentNullException ("g");
+
+ bool result;
+
+ Status status = GDIPlus.GdipIsInfiniteRegion (nativeRegion, g.NativeObject, out result);
+ GDIPlus.CheckStatus (status);
+
+ return result;
+ }
+
+ public void MakeEmpty()
+ {
+ Status status = GDIPlus.GdipSetEmpty (nativeRegion);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public void MakeInfinite()
+ {
+ Status status = GDIPlus.GdipSetInfinite (nativeRegion);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public bool Equals(Region region, Graphics g)
+ {
+ if (region == null)
+ throw new ArgumentNullException ("region");
+ if (g == null)
+ throw new ArgumentNullException ("g");
+
+ bool result;
+
+ Status status = GDIPlus.GdipIsEqualRegion (nativeRegion, region.NativeObject,
+ g.NativeObject, out result);
+
+ GDIPlus.CheckStatus (status);
+
+ return result;
+ }
+
+ [SecurityPermission (SecurityAction.Demand, UnmanagedCode = true)]
+ public static Region FromHrgn (IntPtr hrgn)
+ {
+ if (hrgn == IntPtr.Zero)
+ throw new ArgumentException ("hrgn");
+ return new Region (hrgn);
+ }
+
+
+ public IntPtr GetHrgn(Graphics g)
+ {
+#if false
+ //
+ // Our WindowsForms implementation uses null to avoid
+ // creating a Graphics context when not needed
+ //
+ if (g == null)
+ throw new ArgumentNullException ("g");
+#endif
+ return nativeRegion;
+ }
+
+
+ public RegionData GetRegionData()
+ {
+ int size, filled;
+
+ Status status = GDIPlus.GdipGetRegionDataSize (nativeRegion, out size);
+ GDIPlus.CheckStatus (status);
+
+ byte[] buff = new byte [size];
+
+ status = GDIPlus.GdipGetRegionData (nativeRegion, buff, size, out filled);
+ GDIPlus.CheckStatus (status);
+
+ RegionData rgndata = new RegionData();
+ rgndata.Data = buff;
+
+ return rgndata;
+ }
+
+
+ public RectangleF[] GetRegionScans(Matrix matrix)
+ {
+ if (matrix == null)
+ throw new ArgumentNullException ("matrix");
+
+ int cnt;
+
+ Status status = GDIPlus.GdipGetRegionScansCount (nativeRegion, out cnt, matrix.NativeObject);
+ GDIPlus.CheckStatus (status);
+
+ if (cnt == 0)
+ return new RectangleF[0];
+
+ RectangleF[] rects = new RectangleF [cnt];
+ int size = Marshal.SizeOf (rects[0]);
+
+ IntPtr dest = Marshal.AllocHGlobal (size * cnt);
+
+ status = GDIPlus.GdipGetRegionScans (nativeRegion, dest, out cnt, matrix.NativeObject);
+ GDIPlus.CheckStatus (status);
+
+ GDIPlus.FromUnManagedMemoryToRectangles (dest, rects);
+ return rects;
+ }
+
+ public void Transform(Matrix matrix)
+ {
+ if (matrix == null)
+ throw new ArgumentNullException ("matrix");
+
+ Status status = GDIPlus.GdipTransformRegion (nativeRegion, matrix.NativeObject);
+ GDIPlus.CheckStatus (status);
+ }
+
+ public Region Clone()
+ {
+ IntPtr cloned;
+
+ Status status = GDIPlus.GdipCloneRegion (nativeRegion, out cloned);
+ GDIPlus.CheckStatus (status);
+
+ return new Region (cloned);
+ }
+
+ public void Dispose ()
+ {
+ DisposeHandle ();
+ System.GC.SuppressFinalize (this);
+ }
+
+ private void DisposeHandle ()
+ {
+ if (nativeRegion != IntPtr.Zero) {
+ GDIPlus.GdipDeleteRegion (nativeRegion);
+ nativeRegion = IntPtr.Zero;
+ }
+ }
+
+ ~Region ()
+ {
+ DisposeHandle ();
+ }
+
+ internal IntPtr NativeObject
+ {
+ get{
+ return nativeRegion;
+ }
+ set {
+ nativeRegion = value;
+ }
+ }
+#if NET_2_0
+ [MonoTODO]
+ [SecurityPermission (SecurityAction.Demand, UnmanagedCode = true)]
+ public void ReleaseHrgn (IntPtr regionHandle)
+ {
+ if (regionHandle == IntPtr.Zero)
+ throw new ArgumentNullException ("regionHandle");
+ }
+#endif
+ }
+}