This commit was manufactured by cvs2svn to create branch 'mono-1-0'.
[mono.git] / mcs / class / System.Drawing / System.Drawing / Region.cs
1 //
2 // System.Drawing.Region.cs
3 //
4 // Author:
5 //      Miguel de Icaza (miguel@ximian.com)
6 //      Jordi Mas i Hernandez (jordi@ximian.com)
7 //
8 // Copyright (C) 2003 Ximian, Inc. http://www.ximian.com
9 // Copyright (C) 2004 Novell, Inc. http://www.novell.com
10 //
11
12 //
13 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
14 //
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:
22 // 
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
25 // 
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.
33 //
34
35 using System;
36 using System.Drawing.Drawing2D;
37 using System.Runtime.InteropServices;
38
39 namespace System.Drawing
40 {
41         [ComVisible (false)]
42         public sealed class Region : MarshalByRefObject, IDisposable
43         {
44                 private IntPtr nativeRegion = IntPtr.Zero;
45                 
46                 public Region()
47                 {                  
48                         lock (this)
49                         {      
50                                 Status status = GDIPlus.GdipCreateRegion (out nativeRegion);
51                                 GDIPlus.CheckStatus (status);
52                         }
53                 }
54
55                 internal Region(IntPtr native)
56                 {
57                         nativeRegion = native; 
58                 }
59                 
60                 
61                 public Region (GraphicsPath path)
62                 {       
63                         lock (this)
64                         {                                       
65                                 Status status = GDIPlus.GdipCreateRegionPath (path.NativeObject, out nativeRegion);
66                                 GDIPlus.CheckStatus (status);
67                         }
68                 }
69
70                 public Region (Rectangle rect)                
71                 {
72                         lock (this)
73                         {                       
74                                 Status status = GDIPlus.GdipCreateRegionRectI (ref rect, out nativeRegion);
75                                 GDIPlus.CheckStatus (status);
76                         }
77                 }
78
79                 public Region (RectangleF rect)
80                 {
81                         lock (this)
82                         {                                                       
83                                 Status status = GDIPlus.GdipCreateRegionRect (ref rect, out nativeRegion);
84                                 GDIPlus.CheckStatus (status);
85                         }
86                 }
87
88                 [MonoTODO]
89                 public Region (RegionData region_data)
90                 {
91                         throw new NotImplementedException ();
92                 }
93                 
94                 //                                                                                                     
95                 // Union
96                 //
97
98                 public void Union (GraphicsPath path)
99                 {
100                         Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Union);
101                         GDIPlus.CheckStatus (status);                        
102                 }
103
104
105                 public void Union (Rectangle rect)
106                 {                                    
107                         Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Union);
108                         GDIPlus.CheckStatus (status);
109                 }
110
111                 public void Union (RectangleF rect)
112                 {
113                         Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Union);
114                         GDIPlus.CheckStatus (status);
115                 }
116
117                 public void Union (Region region)
118                 {
119                         Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Union);
120                         GDIPlus.CheckStatus (status);
121                 }                                                                                         
122
123                 
124                 //
125                 // Intersect
126                 //
127                 public void Intersect (GraphicsPath path)
128                 {
129                         Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Intersect);
130                         GDIPlus.CheckStatus (status);  
131                 }
132
133                 public void Intersect (Rectangle rect)
134                 {
135                         Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Intersect);
136                         GDIPlus.CheckStatus (status);
137                 }
138
139                 public void Intersect (RectangleF rect)
140                 {
141                         Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Intersect);
142                         GDIPlus.CheckStatus (status);
143                 }
144
145                 public void Intersect (Region region)
146                 {
147                         Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Intersect);
148                         GDIPlus.CheckStatus (status);
149                 }
150
151                 //
152                 // Complement
153                 //
154                 public void Complement (GraphicsPath path)
155                 {
156                         Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Complement);
157                         GDIPlus.CheckStatus (status);  
158                 }
159
160                 public void Complement (Rectangle rect)
161                 {
162                         Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Complement);
163                         GDIPlus.CheckStatus (status);
164                 }
165
166                 public void Complement (RectangleF rect)
167                 {
168                         Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Complement);
169                         GDIPlus.CheckStatus (status);
170                 }
171
172                 public void Complement (Region region)
173                 {
174                         Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Complement);
175                         GDIPlus.CheckStatus (status);
176                 }
177
178                 //
179                 // Exclude
180                 //
181                 public void Exclude (GraphicsPath path)
182                 {
183                         Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Exclude);
184                         GDIPlus.CheckStatus (status);                                                   
185                 }
186
187                 public void Exclude (Rectangle rect)
188                 {
189                         Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Exclude);
190                         GDIPlus.CheckStatus (status);
191                 }
192
193                 public void Exclude (RectangleF rect)
194                 {
195                         Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Exclude);
196                         GDIPlus.CheckStatus (status);
197                 }
198
199                 public void Exclude (Region region)
200                 {
201                         Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Exclude);
202                         GDIPlus.CheckStatus (status);
203                 }
204
205                 //
206                 // Xor
207                 //
208                 public void Xor (GraphicsPath path)
209                 {
210                         Status status = GDIPlus.GdipCombineRegionPath (nativeRegion, path.NativeObject, CombineMode.Xor);
211                         GDIPlus.CheckStatus (status);  
212                 }
213
214                 public void Xor (Rectangle rect)
215                 {
216                         Status status = GDIPlus.GdipCombineRegionRectI (nativeRegion, ref rect, CombineMode.Xor);
217                         GDIPlus.CheckStatus (status);
218                 }
219
220                 public void Xor (RectangleF rect)
221                 {
222                         Status status = GDIPlus.GdipCombineRegionRect (nativeRegion, ref rect, CombineMode.Xor);
223                         GDIPlus.CheckStatus (status);
224                 }
225
226                 public void Xor (Region region)
227                 {
228                         Status status = GDIPlus.GdipCombineRegionRegion (nativeRegion, region.NativeObject, CombineMode.Xor);
229                         GDIPlus.CheckStatus (status); 
230                 }
231
232                 //
233                 // GetBounds
234                 //
235                 public RectangleF GetBounds (Graphics graphics)
236                 {
237                         RectangleF rect = new Rectangle();
238                         
239                         Status status = GDIPlus.GdipGetRegionBounds (nativeRegion, graphics.NativeObject, ref rect);
240                         GDIPlus.CheckStatus (status);
241
242                         return rect;
243                 }
244
245                 //
246                 // Translate
247                 //
248                 public void Translate (int dx, int dy)
249                 {
250                         Status status = GDIPlus.GdipTranslateRegionI (nativeRegion, dx, dy);
251                         GDIPlus.CheckStatus (status);   
252                 }
253
254                 public void Translate (float dx, float dy)
255                 {
256                         Status status = GDIPlus.GdipTranslateRegion (nativeRegion, dx, dy);
257                         GDIPlus.CheckStatus (status);
258                 }
259
260                 //
261                 // IsVisible
262                 //
263                 public bool IsVisible (int x, int y, Graphics g)
264                 {
265                         bool result;
266                         
267                         Status status = GDIPlus.GdipIsVisibleRegionPointI (nativeRegion, x, y, g.NativeObject, out result);
268                         GDIPlus.CheckStatus (status);
269
270                         return result;
271                 }
272
273                 public bool IsVisible (int x, int y, int width, int height)
274                 {
275                         bool result;
276
277                         Status status = GDIPlus.GdipIsVisibleRegionRectI (nativeRegion, x, y,
278                                 width, height, IntPtr.Zero, out result);
279
280                         GDIPlus.CheckStatus (status);
281
282                         return result;
283                 }
284
285                 public bool IsVisible (int x, int y, int width, int height, Graphics g)
286                 {
287                         bool result;
288
289                         Status status = GDIPlus.GdipIsVisibleRegionRectI (nativeRegion, x, y,
290                                 width, height, g.NativeObject, out result);
291
292                         GDIPlus.CheckStatus (status);
293
294                         return result;
295                 }
296
297                 public bool IsVisible (Point point)
298                 {
299                         bool result;
300
301                         Status status = GDIPlus.GdipIsVisibleRegionPointI (nativeRegion, point.X, point.Y,
302                                 IntPtr.Zero, out result);
303                                 
304                         GDIPlus.CheckStatus (status);
305
306                         return result;
307                 }
308
309                 public bool IsVisible (PointF point)
310                 {
311                        bool result;
312
313                         Status status = GDIPlus.GdipIsVisibleRegionPoint (nativeRegion, point.X, point.Y,
314                                 IntPtr.Zero, out result);
315
316                         GDIPlus.CheckStatus (status);
317
318                         return result;
319                 }
320
321                 public bool IsVisible (Point point, Graphics g)
322                 {
323                         bool result;
324
325                         Status status = GDIPlus.GdipIsVisibleRegionPointI (nativeRegion, point.X, point.Y,
326                                 g.NativeObject, out result);
327
328                         GDIPlus.CheckStatus (status);
329
330                         return result;                                                      
331                 }
332
333                 public bool IsVisible (PointF point, Graphics g)
334                 {
335                         bool result;
336
337                         Status status = GDIPlus.GdipIsVisibleRegionPoint (nativeRegion, point.X, point.Y,
338                                 g.NativeObject, out result);
339
340                         GDIPlus.CheckStatus (status);
341
342                         return result;
343                 }
344
345                 public bool IsVisible (Rectangle rect)
346                 {
347                         bool result;
348
349                         Status status = GDIPlus.GdipIsVisibleRegionRectI (nativeRegion, rect.X, rect.Y,
350                                 rect.Width, rect.Height, IntPtr.Zero, out result);
351
352                         GDIPlus.CheckStatus (status);
353
354                         return result;
355                 }
356
357                 public bool IsVisible (RectangleF rect)
358                 {
359                         bool result;
360
361                         Status status = GDIPlus.GdipIsVisibleRegionRect (nativeRegion, rect.X, rect.Y,
362                                 rect.Width, rect.Height, IntPtr.Zero, out result);
363
364                         GDIPlus.CheckStatus (status);
365
366                         return result;
367                 }
368
369                 public bool IsVisible (Rectangle rect, Graphics g)
370                 {
371                         bool result;
372
373                         Status status = GDIPlus.GdipIsVisibleRegionRectI (nativeRegion, rect.X, rect.Y,
374                                 rect.Width, rect.Height, g.NativeObject, out result);
375                         
376                         GDIPlus.CheckStatus (status);
377
378                         return result;
379                 }
380
381                 public bool IsVisible (RectangleF rect, Graphics g)
382                 {
383                       bool result;
384
385                         Status status = GDIPlus.GdipIsVisibleRegionRect (nativeRegion, rect.X, rect.Y,
386                                 rect.Width, rect.Height, g.NativeObject, out result);
387                                 
388                         GDIPlus.CheckStatus (status);
389
390                         return result;
391                 }
392
393                 public bool IsVisible (float x, float y)
394                 {
395                         bool result;
396
397                         Status status = GDIPlus.GdipIsVisibleRegionPoint (nativeRegion, x, y, IntPtr.Zero, out result);
398                         GDIPlus.CheckStatus (status);
399
400                         return result;
401                 }
402
403                 public bool IsVisible (float x, float y, Graphics g)
404                 {
405                         bool result;
406
407                         Status status = GDIPlus.GdipIsVisibleRegionPoint (nativeRegion, x, y, g.NativeObject, out result);
408                         GDIPlus.CheckStatus (status);
409
410                         return result;
411                 }
412
413                 public bool IsVisible (float x, float y, float width, float height)
414                 {
415                         bool result;
416                         
417                         Status status = GDIPlus.GdipIsVisibleRegionRect (nativeRegion, x, y, width, height, IntPtr.Zero, out result);
418                         GDIPlus.CheckStatus (status);
419
420                         return result;
421                 }
422
423                 public bool IsVisible (float x, float y, float width, float height, Graphics g) 
424                 {
425                         bool result;
426
427                         Status status = GDIPlus.GdipIsVisibleRegionRect (nativeRegion, x, y, width, height, g.NativeObject, out result);
428                         GDIPlus.CheckStatus (status);
429
430                         return result;
431                 }
432
433
434                 //
435                 // Miscellaneous
436                 //
437
438                 public bool IsEmpty(Graphics g)
439                 {
440                         bool result;               
441
442                         Status status = GDIPlus.GdipIsEmptyRegion (nativeRegion, g.NativeObject, out result);
443                         GDIPlus.CheckStatus (status);
444
445                         return result;                        
446                 }
447
448                 public bool IsInfinite(Graphics g)
449                 {
450                         bool result;
451
452                         Status status = GDIPlus.GdipIsInfiniteRegion (nativeRegion, g.NativeObject, out result);
453                         GDIPlus.CheckStatus (status);
454
455                         return result;  
456                 }
457
458                 public void MakeEmpty()
459                 {
460                         Status status = GDIPlus.GdipSetEmpty (nativeRegion);
461                         GDIPlus.CheckStatus (status);               
462                 }
463
464                 public void MakeInfinite()
465                 {
466                         Status status = GDIPlus.GdipSetInfinite (nativeRegion);
467                         GDIPlus.CheckStatus (status);                      
468                 }
469                 
470                 public bool Equals(Region region, Graphics g)
471                 {
472                         bool result;
473                         
474                         Status status = GDIPlus.GdipIsEqualRegion (nativeRegion, region.NativeObject,
475                            g.NativeObject, out result);                                   
476                            
477                         GDIPlus.CheckStatus (status);                      
478                         
479                         return result;                  
480                 }
481                 
482                 
483                 public static Region FromHrgn(IntPtr hrgn)
484                 {
485                         return new Region (hrgn);
486                 }
487                 
488                 
489                 public IntPtr GetHrgn(Graphics g)
490                 {
491                         return nativeRegion;
492                 }
493                 
494                 
495                 public RegionData GetRegionData()
496                 {
497                         int size, filled;                       
498                         
499                         Status status = GDIPlus.GdipGetRegionDataSize (nativeRegion, out size);                  
500                         GDIPlus.CheckStatus (status);                      
501                         
502                         byte[] buff = new byte [size];                  
503                         
504                         status = GDIPlus.GdipGetRegionData (nativeRegion, buff, size, out filled);
505                         GDIPlus.CheckStatus (status);                      
506                         
507                         RegionData rgndata = new RegionData();
508                         rgndata.Data = buff;
509                         
510                         return rgndata;
511                 }
512                 
513                 
514                 public RectangleF[] GetRegionScans(Matrix matrix)
515                 {
516                         int cnt;                        
517                         
518                         Status status = GDIPlus.GdipGetRegionScansCount (nativeRegion, out cnt, matrix.NativeObject);                  
519                         GDIPlus.CheckStatus (status);                                 
520                         
521                         if (cnt == 0)
522                                 return new RectangleF[0];
523                                                 
524                         RectangleF[] rects = new RectangleF [cnt];                                      
525                         int size = Marshal.SizeOf (rects[0]);                  
526                         
527                         IntPtr dest = Marshal.AllocHGlobal (size * cnt);                        
528                         
529                         status = GDIPlus.GdipGetRegionScans (nativeRegion, dest, out cnt, matrix.NativeObject);
530                         GDIPlus.CheckStatus (status);                   
531                         
532                         GDIPlus.FromUnManagedMemoryToRectangles (dest, rects);                  
533                         return rects;                   
534                 }               
535                 
536                 public void Transform(Matrix matrix)
537                 {
538                         Status status = GDIPlus.GdipTransformRegion (nativeRegion, matrix.NativeObject);
539                         GDIPlus.CheckStatus (status);                                                   
540                 }               
541                 
542                 public Region Clone()
543                 {
544                         lock (this)
545                         {
546                                 IntPtr cloned;
547                                 
548                                 Status status = GDIPlus.GdipCloneRegion (nativeRegion, out cloned);
549                                 GDIPlus.CheckStatus (status);
550                                 
551                                 return new Region (cloned); 
552                         }
553                 }
554
555                 public void Dispose ()
556                 {
557                         Dispose (true);
558                         System.GC.SuppressFinalize (this);
559                 }
560
561                 void Dispose (bool disposing)
562                 {
563                         if (disposing) {
564                                 lock (this)
565                                 {
566                                         GDIPlus.GdipDeleteRegion (nativeRegion);
567                                         nativeRegion = IntPtr.Zero;
568                                 }
569                         }
570                 }
571
572                 ~Region ()
573                 {
574                         Dispose (false);
575                 }
576
577                 internal IntPtr NativeObject
578                 {
579                         get{
580                                 return nativeRegion;
581                         }
582                         set     {
583                                 nativeRegion = value;
584                         }
585                 }
586
587         
588         }
589 }