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
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 using System.Drawing.Drawing2D;
33 using System.Runtime.InteropServices;
35 namespace System.Drawing
38 public sealed class Region : MarshalByRefObject, IDisposable
40 private IntPtr nativeRegion = IntPtr.Zero;
44 Status status = GDIPlus.GdipCreateRegion (out nativeRegion);
45 GDIPlus.CheckStatus (status);
48 internal Region(IntPtr native)
50 nativeRegion = native;
54 public Region (GraphicsPath path)
56 Status status = GDIPlus.GdipCreateRegionPath (path.NativeObject, out nativeRegion);
57 GDIPlus.CheckStatus (status);
60 public Region (Rectangle rect)
62 Status status = GDIPlus.GdipCreateRegionRectI (ref rect, out nativeRegion);
63 GDIPlus.CheckStatus (status);
66 public Region (RectangleF rect)
68 Status status = GDIPlus.GdipCreateRegionRect (ref rect, out nativeRegion);
69 GDIPlus.CheckStatus (status);
73 public Region (RegionData region_data)
75 throw new NotImplementedException ();
82 public void Union (GraphicsPath path)
84 Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Union);
85 GDIPlus.CheckStatus (status);
89 public void Union (Rectangle rect)
91 Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Union);
92 GDIPlus.CheckStatus (status);
95 public void Union (RectangleF rect)
97 Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Union);
98 GDIPlus.CheckStatus (status);
101 public void Union (Region region)
103 Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Union);
104 GDIPlus.CheckStatus (status);
111 public void Intersect (GraphicsPath path)
113 Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Intersect);
114 GDIPlus.CheckStatus (status);
117 public void Intersect (Rectangle rect)
119 Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Intersect);
120 GDIPlus.CheckStatus (status);
123 public void Intersect (RectangleF rect)
125 Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Intersect);
126 GDIPlus.CheckStatus (status);
129 public void Intersect (Region region)
131 Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Intersect);
132 GDIPlus.CheckStatus (status);
138 public void Complement (GraphicsPath path)
140 Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Complement);
141 GDIPlus.CheckStatus (status);
144 public void Complement (Rectangle rect)
146 Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Complement);
147 GDIPlus.CheckStatus (status);
150 public void Complement (RectangleF rect)
152 Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Complement);
153 GDIPlus.CheckStatus (status);
156 public void Complement (Region region)
158 Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Complement);
159 GDIPlus.CheckStatus (status);
165 public void Exclude (GraphicsPath path)
167 Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Exclude);
168 GDIPlus.CheckStatus (status);
171 public void Exclude (Rectangle rect)
173 Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Exclude);
174 GDIPlus.CheckStatus (status);
177 public void Exclude (RectangleF rect)
179 Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Exclude);
180 GDIPlus.CheckStatus (status);
183 public void Exclude (Region region)
185 Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Exclude);
186 GDIPlus.CheckStatus (status);
192 public void Xor (GraphicsPath path)
194 Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Xor);
195 GDIPlus.CheckStatus (status);
198 public void Xor (Rectangle rect)
200 Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Xor);
201 GDIPlus.CheckStatus (status);
204 public void Xor (RectangleF rect)
206 Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Xor);
207 GDIPlus.CheckStatus (status);
210 public void Xor (Region region)
212 Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Xor);
213 GDIPlus.CheckStatus (status);
219 public RectangleF GetBounds (Graphics graphics)
221 RectangleF rect = new Rectangle();
223 Status status = GDIPlus.GdipGetRegionBounds (nativeRegion, graphics.NativeObject, ref rect);
224 GDIPlus.CheckStatus (status);
232 public void Translate (int dx, int dy)
234 Status status = GDIPlus.GdipTranslateRegionI (nativeRegion, dx, dy);
235 GDIPlus.CheckStatus (status);
238 public void Translate (float dx, float dy)
240 Status status = GDIPlus.GdipTranslateRegion (nativeRegion, dx, dy);
241 GDIPlus.CheckStatus (status);
247 public bool IsVisible (int x, int y, Graphics g)
251 Status status = GDIPlus.GdipIsVisibleRegionPointI (nativeRegion, x, y, g.NativeObject, out result);
252 GDIPlus.CheckStatus (status);
257 public bool IsVisible (int x, int y, int width, int height)
261 Status status = GDIPlus.GdipIsVisibleRegionRectI (nativeRegion, x, y,
262 width, height, IntPtr.Zero, out result);
264 GDIPlus.CheckStatus (status);
269 public bool IsVisible (int x, int y, int width, int height, Graphics g)
273 Status status = GDIPlus.GdipIsVisibleRegionRectI (nativeRegion, x, y,
274 width, height, g.NativeObject, out result);
276 GDIPlus.CheckStatus (status);
281 public bool IsVisible (Point point)
285 Status status = GDIPlus.GdipIsVisibleRegionPointI (nativeRegion, point.X, point.Y,
286 IntPtr.Zero, out result);
288 GDIPlus.CheckStatus (status);
293 public bool IsVisible (PointF point)
297 Status status = GDIPlus.GdipIsVisibleRegionPoint (nativeRegion, point.X, point.Y,
298 IntPtr.Zero, out result);
300 GDIPlus.CheckStatus (status);
305 public bool IsVisible (Point point, Graphics g)
309 Status status = GDIPlus.GdipIsVisibleRegionPointI (nativeRegion, point.X, point.Y,
310 g.NativeObject, out result);
312 GDIPlus.CheckStatus (status);
317 public bool IsVisible (PointF point, Graphics g)
321 Status status = GDIPlus.GdipIsVisibleRegionPoint (nativeRegion, point.X, point.Y,
322 g.NativeObject, out result);
324 GDIPlus.CheckStatus (status);
329 public bool IsVisible (Rectangle rect)
333 Status status = GDIPlus.GdipIsVisibleRegionRectI (nativeRegion, rect.X, rect.Y,
334 rect.Width, rect.Height, IntPtr.Zero, out result);
336 GDIPlus.CheckStatus (status);
341 public bool IsVisible (RectangleF rect)
345 Status status = GDIPlus.GdipIsVisibleRegionRect (nativeRegion, rect.X, rect.Y,
346 rect.Width, rect.Height, IntPtr.Zero, out result);
348 GDIPlus.CheckStatus (status);
353 public bool IsVisible (Rectangle rect, Graphics g)
357 Status status = GDIPlus.GdipIsVisibleRegionRectI (nativeRegion, rect.X, rect.Y,
358 rect.Width, rect.Height, g.NativeObject, out result);
360 GDIPlus.CheckStatus (status);
365 public bool IsVisible (RectangleF rect, Graphics g)
369 Status status = GDIPlus.GdipIsVisibleRegionRect (nativeRegion, rect.X, rect.Y,
370 rect.Width, rect.Height, g.NativeObject, out result);
372 GDIPlus.CheckStatus (status);
377 public bool IsVisible (float x, float y)
381 Status status = GDIPlus.GdipIsVisibleRegionPoint (nativeRegion, x, y, IntPtr.Zero, out result);
382 GDIPlus.CheckStatus (status);
387 public bool IsVisible (float x, float y, Graphics g)
391 Status status = GDIPlus.GdipIsVisibleRegionPoint (nativeRegion, x, y, g.NativeObject, out result);
392 GDIPlus.CheckStatus (status);
397 public bool IsVisible (float x, float y, float width, float height)
401 Status status = GDIPlus.GdipIsVisibleRegionRect (nativeRegion, x, y, width, height, IntPtr.Zero, out result);
402 GDIPlus.CheckStatus (status);
407 public bool IsVisible (float x, float y, float width, float height, Graphics g)
411 Status status = GDIPlus.GdipIsVisibleRegionRect (nativeRegion, x, y, width, height, g.NativeObject, out result);
412 GDIPlus.CheckStatus (status);
422 public bool IsEmpty(Graphics g)
426 Status status = GDIPlus.GdipIsEmptyRegion (nativeRegion, g.NativeObject, out result);
427 GDIPlus.CheckStatus (status);
432 public bool IsInfinite(Graphics g)
436 Status status = GDIPlus.GdipIsInfiniteRegion (nativeRegion, g.NativeObject, out result);
437 GDIPlus.CheckStatus (status);
442 public void MakeEmpty()
444 Status status = GDIPlus.GdipSetEmpty (nativeRegion);
445 GDIPlus.CheckStatus (status);
448 public void MakeInfinite()
450 Status status = GDIPlus.GdipSetInfinite (nativeRegion);
451 GDIPlus.CheckStatus (status);
454 public bool Equals(Region region, Graphics g)
458 Status status = GDIPlus.GdipIsEqualRegion (nativeRegion, region.NativeObject,
459 g.NativeObject, out result);
461 GDIPlus.CheckStatus (status);
467 public static Region FromHrgn(IntPtr hrgn)
469 return new Region (hrgn);
473 public IntPtr GetHrgn(Graphics g)
479 public RegionData GetRegionData()
483 Status status = GDIPlus.GdipGetRegionDataSize (nativeRegion, out size);
484 GDIPlus.CheckStatus (status);
486 byte[] buff = new byte [size];
488 status = GDIPlus.GdipGetRegionData (nativeRegion, buff, size, out filled);
489 GDIPlus.CheckStatus (status);
491 RegionData rgndata = new RegionData();
498 public RectangleF[] GetRegionScans(Matrix matrix)
502 Status status = GDIPlus.GdipGetRegionScansCount (nativeRegion, out cnt, matrix.NativeObject);
503 GDIPlus.CheckStatus (status);
506 return new RectangleF[0];
508 RectangleF[] rects = new RectangleF [cnt];
509 int size = Marshal.SizeOf (rects[0]);
511 IntPtr dest = Marshal.AllocHGlobal (size * cnt);
513 status = GDIPlus.GdipGetRegionScans (nativeRegion, dest, out cnt, matrix.NativeObject);
514 GDIPlus.CheckStatus (status);
516 GDIPlus.FromUnManagedMemoryToRectangles (dest, rects);
520 public void Transform(Matrix matrix)
522 Status status = GDIPlus.GdipTransformRegion (nativeRegion, matrix.NativeObject);
523 GDIPlus.CheckStatus (status);
526 public Region Clone()
530 Status status = GDIPlus.GdipCloneRegion (nativeRegion, out cloned);
531 GDIPlus.CheckStatus (status);
533 return new Region (cloned);
536 public void Dispose ()
539 System.GC.SuppressFinalize (this);
542 void Dispose (bool disposing)
545 GDIPlus.GdipDeleteRegion (nativeRegion);
546 nativeRegion = IntPtr.Zero;
555 internal IntPtr NativeObject
561 nativeRegion = value;