2 // System.Drawing.Region.cs
5 // Miguel de Icaza (miguel@ximian.com)
6 // Jordi Mas i Hernandez (jordi@ximian.com)
8 // Copyright (C) 2003 Ximian, Inc. http://www.ximian.com
9 // Copyright (C) 2004 Novell, Inc. http://www.novell.com
13 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
15 // Permission is hereby granted, free of charge, to any person obtaining
16 // a copy of this software and associated documentation files (the
17 // "Software"), to deal in the Software without restriction, including
18 // without limitation the rights to use, copy, modify, merge, publish,
19 // distribute, sublicense, and/or sell copies of the Software, and to
20 // permit persons to whom the Software is furnished to do so, subject to
21 // the following conditions:
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
26 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
36 using System.Drawing.Drawing2D;
37 using System.Runtime.InteropServices;
39 namespace System.Drawing
42 public sealed class Region : MarshalByRefObject, IDisposable
44 private IntPtr nativeRegion = IntPtr.Zero;
50 Status status = GDIPlus.GdipCreateRegion (out nativeRegion);
51 GDIPlus.CheckStatus (status);
55 internal Region(IntPtr native)
57 nativeRegion = native;
61 public Region (GraphicsPath path)
65 Status status = GDIPlus.GdipCreateRegionPath (path.NativeObject, out nativeRegion);
66 GDIPlus.CheckStatus (status);
70 public Region (Rectangle rect)
74 Status status = GDIPlus.GdipCreateRegionRectI (ref rect, out nativeRegion);
75 GDIPlus.CheckStatus (status);
79 public Region (RectangleF rect)
83 Status status = GDIPlus.GdipCreateRegionRect (ref rect, out nativeRegion);
84 GDIPlus.CheckStatus (status);
89 public Region (RegionData region_data)
91 throw new NotImplementedException ();
98 public void Union (GraphicsPath path)
100 Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Union);
101 GDIPlus.CheckStatus (status);
105 public void Union (Rectangle rect)
107 Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Union);
108 GDIPlus.CheckStatus (status);
111 public void Union (RectangleF rect)
113 Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Union);
114 GDIPlus.CheckStatus (status);
117 public void Union (Region region)
119 Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Union);
120 GDIPlus.CheckStatus (status);
127 public void Intersect (GraphicsPath path)
129 Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Intersect);
130 GDIPlus.CheckStatus (status);
133 public void Intersect (Rectangle rect)
135 Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Intersect);
136 GDIPlus.CheckStatus (status);
139 public void Intersect (RectangleF rect)
141 Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Intersect);
142 GDIPlus.CheckStatus (status);
145 public void Intersect (Region region)
147 Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Intersect);
148 GDIPlus.CheckStatus (status);
154 public void Complement (GraphicsPath path)
156 Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Complement);
157 GDIPlus.CheckStatus (status);
160 public void Complement (Rectangle rect)
162 Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Complement);
163 GDIPlus.CheckStatus (status);
166 public void Complement (RectangleF rect)
168 Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Complement);
169 GDIPlus.CheckStatus (status);
172 public void Complement (Region region)
174 Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Complement);
175 GDIPlus.CheckStatus (status);
181 public void Exclude (GraphicsPath path)
183 Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Exclude);
184 GDIPlus.CheckStatus (status);
187 public void Exclude (Rectangle rect)
189 Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Exclude);
190 GDIPlus.CheckStatus (status);
193 public void Exclude (RectangleF rect)
195 Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Exclude);
196 GDIPlus.CheckStatus (status);
199 public void Exclude (Region region)
201 Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Exclude);
202 GDIPlus.CheckStatus (status);
208 public void Xor (GraphicsPath path)
210 Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Xor);
211 GDIPlus.CheckStatus (status);
214 public void Xor (Rectangle rect)
216 Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Xor);
217 GDIPlus.CheckStatus (status);
220 public void Xor (RectangleF rect)
222 Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Xor);
223 GDIPlus.CheckStatus (status);
226 public void Xor (Region region)
228 Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Xor);
229 GDIPlus.CheckStatus (status);
235 public RectangleF GetBounds (Graphics graphics)
237 RectangleF rect = new Rectangle();
239 Status status = GDIPlus.GdipGetRegionBounds (nativeRegion, graphics.NativeObject, ref rect);
240 GDIPlus.CheckStatus (status);
248 public void Translate (int dx, int dy)
250 Status status = GDIPlus.GdipTranslateRegionI (nativeRegion, dx, dy);
251 GDIPlus.CheckStatus (status);
254 public void Translate (float dx, float dy)
256 Status status = GDIPlus.GdipTranslateRegion (nativeRegion, dx, dy);
257 GDIPlus.CheckStatus (status);
263 public bool IsVisible (int x, int y, Graphics g)
267 Status status = GDIPlus.GdipIsVisibleRegionPointI (nativeRegion, x, y, g.NativeObject, out result);
268 GDIPlus.CheckStatus (status);
273 public bool IsVisible (int x, int y, int width, int height)
277 Status status = GDIPlus.GdipIsVisibleRegionRectI (nativeRegion, x, y,
278 width, height, IntPtr.Zero, out result);
280 GDIPlus.CheckStatus (status);
285 public bool IsVisible (int x, int y, int width, int height, Graphics g)
289 Status status = GDIPlus.GdipIsVisibleRegionRectI (nativeRegion, x, y,
290 width, height, g.NativeObject, out result);
292 GDIPlus.CheckStatus (status);
297 public bool IsVisible (Point point)
301 Status status = GDIPlus.GdipIsVisibleRegionPointI (nativeRegion, point.X, point.Y,
302 IntPtr.Zero, out result);
304 GDIPlus.CheckStatus (status);
309 public bool IsVisible (PointF point)
313 Status status = GDIPlus.GdipIsVisibleRegionPoint (nativeRegion, point.X, point.Y,
314 IntPtr.Zero, out result);
316 GDIPlus.CheckStatus (status);
321 public bool IsVisible (Point point, Graphics g)
325 Status status = GDIPlus.GdipIsVisibleRegionPointI (nativeRegion, point.X, point.Y,
326 g.NativeObject, out result);
328 GDIPlus.CheckStatus (status);
333 public bool IsVisible (PointF point, Graphics g)
337 Status status = GDIPlus.GdipIsVisibleRegionPoint (nativeRegion, point.X, point.Y,
338 g.NativeObject, out result);
340 GDIPlus.CheckStatus (status);
345 public bool IsVisible (Rectangle rect)
349 Status status = GDIPlus.GdipIsVisibleRegionRectI (nativeRegion, rect.X, rect.Y,
350 rect.Width, rect.Height, IntPtr.Zero, out result);
352 GDIPlus.CheckStatus (status);
357 public bool IsVisible (RectangleF rect)
361 Status status = GDIPlus.GdipIsVisibleRegionRect (nativeRegion, rect.X, rect.Y,
362 rect.Width, rect.Height, IntPtr.Zero, out result);
364 GDIPlus.CheckStatus (status);
369 public bool IsVisible (Rectangle rect, Graphics g)
373 Status status = GDIPlus.GdipIsVisibleRegionRectI (nativeRegion, rect.X, rect.Y,
374 rect.Width, rect.Height, g.NativeObject, out result);
376 GDIPlus.CheckStatus (status);
381 public bool IsVisible (RectangleF rect, Graphics g)
385 Status status = GDIPlus.GdipIsVisibleRegionRect (nativeRegion, rect.X, rect.Y,
386 rect.Width, rect.Height, g.NativeObject, out result);
388 GDIPlus.CheckStatus (status);
393 public bool IsVisible (float x, float y)
397 Status status = GDIPlus.GdipIsVisibleRegionPoint (nativeRegion, x, y, IntPtr.Zero, out result);
398 GDIPlus.CheckStatus (status);
403 public bool IsVisible (float x, float y, Graphics g)
407 Status status = GDIPlus.GdipIsVisibleRegionPoint (nativeRegion, x, y, g.NativeObject, out result);
408 GDIPlus.CheckStatus (status);
413 public bool IsVisible (float x, float y, float width, float height)
417 Status status = GDIPlus.GdipIsVisibleRegionRect (nativeRegion, x, y, width, height, IntPtr.Zero, out result);
418 GDIPlus.CheckStatus (status);
423 public bool IsVisible (float x, float y, float width, float height, Graphics g)
427 Status status = GDIPlus.GdipIsVisibleRegionRect (nativeRegion, x, y, width, height, g.NativeObject, out result);
428 GDIPlus.CheckStatus (status);
438 public bool IsEmpty(Graphics g)
442 Status status = GDIPlus.GdipIsEmptyRegion (nativeRegion, g.NativeObject, out result);
443 GDIPlus.CheckStatus (status);
448 public bool IsInfinite(Graphics g)
452 Status status = GDIPlus.GdipIsInfiniteRegion (nativeRegion, g.NativeObject, out result);
453 GDIPlus.CheckStatus (status);
458 public void MakeEmpty()
460 Status status = GDIPlus.GdipSetEmpty (nativeRegion);
461 GDIPlus.CheckStatus (status);
464 public void MakeInfinite()
466 Status status = GDIPlus.GdipSetInfinite (nativeRegion);
467 GDIPlus.CheckStatus (status);
470 public bool Equals(Region region, Graphics g)
474 Status status = GDIPlus.GdipIsEqualRegion (nativeRegion, region.NativeObject,
475 g.NativeObject, out result);
477 GDIPlus.CheckStatus (status);
483 public static Region FromHrgn(IntPtr hrgn)
485 return new Region (hrgn);
489 public IntPtr GetHrgn(Graphics g)
495 public RegionData GetRegionData()
499 Status status = GDIPlus.GdipGetRegionDataSize (nativeRegion, out size);
500 GDIPlus.CheckStatus (status);
502 byte[] buff = new byte [size];
504 status = GDIPlus.GdipGetRegionData (nativeRegion, buff, size, out filled);
505 GDIPlus.CheckStatus (status);
507 RegionData rgndata = new RegionData();
514 public RectangleF[] GetRegionScans(Matrix matrix)
518 Status status = GDIPlus.GdipGetRegionScansCount (nativeRegion, out cnt, matrix.NativeObject);
519 GDIPlus.CheckStatus (status);
522 return new RectangleF[0];
524 RectangleF[] rects = new RectangleF [cnt];
525 int size = Marshal.SizeOf (rects[0]);
527 IntPtr dest = Marshal.AllocHGlobal (size * cnt);
529 status = GDIPlus.GdipGetRegionScans (nativeRegion, dest, out cnt, matrix.NativeObject);
530 GDIPlus.CheckStatus (status);
532 GDIPlus.FromUnManagedMemoryToRectangles (dest, rects);
536 public void Transform(Matrix matrix)
538 Status status = GDIPlus.GdipTransformRegion (nativeRegion, matrix.NativeObject);
539 GDIPlus.CheckStatus (status);
542 public Region Clone()
548 Status status = GDIPlus.GdipCloneRegion (nativeRegion, out cloned);
549 GDIPlus.CheckStatus (status);
551 return new Region (cloned);
555 public void Dispose ()
558 System.GC.SuppressFinalize (this);
561 void Dispose (bool disposing)
566 GDIPlus.GdipDeleteRegion (nativeRegion);
567 nativeRegion = IntPtr.Zero;
577 internal IntPtr NativeObject
583 nativeRegion = value;