* roottypes.cs: Rename from tree.cs.
[mono.git] / mcs / class / System.Drawing / Samples / System.Drawing / RegionsRectangle.cs
1 //
2 // Sample application for region graphics functions using Rects implementation
3 //
4 // Author:
5 //   Jordi Mas, jordi@ximian.com
6 //
7
8 //
9 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
10 //
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:
18 // 
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 // 
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.
29 //
30
31 using System;
32 using System.Drawing.Imaging;
33 using System.Drawing;
34 using System.Drawing.Drawing2D;
35
36 //
37 public class Regions
38 {       
39         public static void DumpRegion (Region rgn)
40         {
41                 Matrix matrix = new Matrix ();          
42                 RectangleF [] rects = rgn.GetRegionScans (matrix);
43
44                 for (int i = 0; i < rects.Length; i++)
45                         Console.WriteLine ( rects[i]);
46         }
47         
48         public static void Main () 
49         {
50                 Bitmap bmp = new Bitmap (600, 800);
51                 Graphics dc = Graphics.FromImage (bmp);                 
52                 Font fnt = new Font ("Arial", 8);
53                 Font fnttitle = new Font("Arial", 8, FontStyle.Underline);
54                 Matrix matrix = new Matrix ();          
55                 int x = 0;
56                 Rectangle rect1, rect2, rect3, rect4;           
57                 Region rgn1, rgn2, rgn3, rgn4;
58                                 
59                 bool complement = true, exclude = true, union = true, xor = true, intersect = true;
60                 
61                 SolidBrush whiteBrush = new SolidBrush (Color.White);                           
62                 
63                 dc.DrawString ("Region samples using two Rectangle classes", fnttitle, whiteBrush, 5, 5);
64                                 
65                 /* First */                             
66                 if (complement) {       
67                         rect1 = new Rectangle (20, 30, 60, 80);         
68                         rect2 = new Rectangle (50, 40, 60, 80);         
69                         rgn1 = new Region (rect1);
70                         rgn2 = new Region (rect2);                                              
71                         dc.DrawRectangle (Pens.Green, rect1);                           
72                         dc.DrawRectangle (Pens.Red, rect2);
73                         rgn1.Complement (rgn2);
74                         dc.FillRegion (Brushes.Blue, rgn1);             
75                         dc.DrawString ("Complement ("  + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 10, 130);                                           
76                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));          
77                         DumpRegion (rgn1);
78                 }
79                 
80                 /* Second */            
81                 if (exclude) {
82                         rect3 = new Rectangle (130, 30, 60, 80);                
83                         rect4 = new Rectangle (170, 40, 60, 80);                
84                         rgn3 = new Region (rect3);
85                         rgn4 = new Region (rect4);                      
86                         dc.DrawRectangle (Pens.Green, rect3);           
87                         dc.DrawRectangle (Pens.Red, rect4);
88                         rgn3.Exclude (rgn4);
89                         dc.FillRegion (Brushes.Blue, rgn3);             
90                         dc.DrawString ("Exclude ("  + rgn3.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 130, 130);
91                         dc.DrawRectangles (Pens.Yellow, rgn3.GetRegionScans (matrix));
92                         DumpRegion (rgn3);
93                 }
94                 
95                 /* Third */
96                 if (intersect) {                
97                         
98                         Rectangle rect5 = new Rectangle (260, 30, 60, 80);              
99                         Rectangle rect6 = new Rectangle (290, 40, 60, 80);              
100                         Region rgn5 = new Region (rect5);
101                         Region rgn6 = new Region (rect6);                       
102                         dc.DrawRectangle (Pens.Green, rect5);           
103                         dc.DrawRectangle (Pens.Red, rect6);
104                         rgn5.Intersect (rgn6);
105                         dc.FillRegion (Brushes.Blue, rgn5);             
106                         dc.DrawString ("Intersect ("  + rgn5.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 270, 130);
107                         dc.DrawRectangles (Pens.Yellow, rgn5.GetRegionScans (matrix));
108                         DumpRegion (rgn5);
109                 }
110                 
111                 /* Four */              
112                 if (xor) {
113                         Rectangle rect7 = new Rectangle (380, 30, 60, 80);              
114                         Rectangle rect8 = new Rectangle (410, 40, 60, 80);              
115                         Region rgn7 = new Region (rect7);
116                         Region rgn8 = new Region (rect8);                       
117                         dc.DrawRectangle (Pens.Green, rect7);           
118                         dc.DrawRectangle (Pens.Red, rect8);
119                         rgn7.Xor (rgn8);
120                         dc.FillRegion (Brushes.Blue, rgn7);             
121                         dc.DrawString ("Xor ("  + rgn7.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 400, 130);
122                         dc.DrawRectangles (Pens.Yellow, rgn7.GetRegionScans (matrix));
123                         DumpRegion (rgn7);
124                 }
125                 
126                 /* Fifht */             
127                 if (union) {
128                         Rectangle rect9 = new Rectangle (500, 30, 60, 80);              
129                         Rectangle rect10 = new Rectangle (520, 40, 60, 80);             
130                         Region rgn9 = new Region(rect9);
131                         Region rgn10 = new Region(rect10);                      
132                         dc.DrawRectangle (Pens.Green, rect9);           
133                         dc.DrawRectangle (Pens.Red, rect10);
134                         rgn9.Union(rgn10);
135                         dc.FillRegion (Brushes.Blue, rgn9);             
136                         dc.DrawString ("Union (" + rgn9.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 530, 130);                
137                         dc.DrawRectangles (Pens.Yellow, rgn9.GetRegionScans (matrix));          
138                         DumpRegion (rgn9);
139                 }
140                 
141                 dc.DrawString ("Region samples using three Rectangle class", fnttitle, whiteBrush, 5, 155);
142                 
143                 /* First */             
144                 x = 0;          
145                 
146                 if (complement) {       
147                         rect1 = new Rectangle (20+x, 180, 40, 50);              
148                         rect2 = new Rectangle (50+x, 190, 40, 50);              
149                         rect3 = new Rectangle (70+x, 210, 30, 50);              
150                         rgn1 = new Region (rect1);
151                         rgn2 = new Region (rect2);              
152                         rgn3 = new Region (rect3);      
153                         
154                         dc.DrawRectangle (Pens.Green, rect1);                           
155                         dc.DrawRectangle (Pens.Red, rect2);
156                         dc.DrawEllipse (Pens.Red, rect3);
157                         
158                         rgn1.Complement (rgn2);
159                         rgn1.Complement (rgn3);
160                         dc.FillRegion (Brushes.Blue, rgn1);             
161                         dc.DrawString ("Complement (" + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 10, 275);    
162                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));  
163                         DumpRegion (rgn1);
164                 }
165                 x += 110;
166                 
167                 /* Second */                            
168                 if (exclude) {  
169                         rect1 = new Rectangle (20+x, 180, 40, 50);              
170                         rect2 = new Rectangle (50+x, 190, 40, 50);              
171                         rect3 = new Rectangle (70+x, 210, 30, 50);              
172                         rgn1 = new Region (rect1);
173                         rgn2 = new Region (rect2);              
174                         rgn3 = new Region (rect3);      
175                         
176                         dc.DrawRectangle (Pens.Green, rect1);                           
177                         dc.DrawRectangle (Pens.Red, rect2);
178                         dc.DrawEllipse (Pens.Red, rect3);
179                         
180                         rgn1.Exclude (rgn2);
181                         rgn1.Exclude (rgn3);
182                         dc.FillRegion (Brushes.Blue, rgn1);             
183                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));
184                         dc.DrawString ("Exclude (" + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 130, 275);              
185                         DumpRegion (rgn1);
186                 }
187                 x += 110;
188                 
189                 /* Third */     
190                 if (intersect) {                                
191                         
192                         rect1 = new Rectangle (20+x, 180, 40, 50);              
193                         rect2 = new Rectangle (50+x, 190, 40, 50);              
194                         rect3 = new Rectangle (70+x, 210, 30, 50);              
195                         rgn1 = new Region (rect1);
196                         rgn2 = new Region (rect2);              
197                         rgn3 = new Region (rect3);      
198                         
199                         dc.DrawRectangle (Pens.Green, rect1);                           
200                         dc.DrawRectangle (Pens.Red, rect2);
201                         dc.DrawEllipse (Pens.Red, rect3);
202                         
203                         rgn1.Union (rgn2);
204                         rgn1.Intersect (rgn3);
205                         dc.FillRegion (Brushes.Blue, rgn1);             
206                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));
207                         dc.DrawString ("Intersect (" + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 270, 275);            
208                         DumpRegion (rgn1);
209                         
210                 }
211                 x += 110;
212                 
213                 /* Fourth */                            
214                 if (xor) {      
215                         rect1 = new Rectangle (20+x, 180, 40, 50);              
216                         rect2 = new Rectangle (50+x, 190, 40, 50);              
217                         rect3 = new Rectangle (70+x, 210, 30, 50);              
218                         rgn1 = new Region (rect1);
219                         rgn2 = new Region (rect2);              
220                         rgn3 = new Region (rect3);      
221                         
222                         dc.DrawRectangle (Pens.Green, rect1);                           
223                         dc.DrawRectangle (Pens.Red, rect2);
224                         dc.DrawEllipse (Pens.Red, rect3);
225                         
226                         rgn1.Union (rgn2);
227                         rgn1.Xor (rgn3);
228                         dc.FillRegion (Brushes.Blue, rgn1);             
229                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));
230                         dc.DrawString ("Xor ("  + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 380, 275);         
231                         DumpRegion (rgn1);
232                 }
233                 x += 110;
234                 
235                 /* Fifth */                             
236                 if (union) {    
237                         rect1 = new Rectangle (20+x, 180, 40, 50);              
238                         rect2 = new Rectangle (50+x, 190, 40, 50);              
239                         rect3 = new Rectangle (70+x, 210, 30, 50);              
240                         rgn1 = new Region (rect1);
241                         rgn2 = new Region (rect2);              
242                         rgn3 = new Region (rect3);      
243                         
244                         dc.DrawRectangle (Pens.Green, rect1);                           
245                         dc.DrawRectangle (Pens.Red, rect2);
246                         dc.DrawEllipse (Pens.Red, rect3);
247                         
248                         rgn1.Union (rgn2);
249                         rgn1.Union (rgn3);
250                         dc.FillRegion (Brushes.Blue, rgn1);             
251                         dc.DrawString ("Union (" + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 500, 275);                
252                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));
253                         DumpRegion (rgn1);
254                 }
255                 x += 110;               
256                 
257                 dc.DrawString ("Region samples using four Rectangle class", fnttitle, whiteBrush, 5, 300);
258                 
259                 /* First */             
260                 x = 0;
261                 
262                 if (complement) {       
263                         rect1 = new Rectangle (20+x, 330, 40, 50);              
264                         rect2 = new Rectangle (50+x, 340, 40, 50);              
265                         rect3 = new Rectangle (70+x, 360, 30, 50);              
266                         rect4 = new Rectangle (80+x, 400, 30, 10);              
267                         rgn1 = new Region (rect1);
268                         rgn2 = new Region (rect2);              
269                         rgn3 = new Region (rect3);      
270                         rgn4 = new Region (rect4);      
271                         
272                         dc.DrawRectangle (Pens.Green, rect1);                           
273                         dc.DrawRectangle (Pens.Red, rect2);
274                         dc.DrawEllipse (Pens.Red, rect3);
275                         dc.DrawRectangle (Pens.Red, rect4);
276                         
277                         rgn1.Complement (rgn2);
278                         rgn1.Complement (rgn3);
279                         rgn1.Complement (rgn4);
280                         dc.FillRegion (Brushes.Blue, rgn1);             
281                         dc.DrawString ("Complement (" + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 10, 430);    
282                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));  
283                         DumpRegion (rgn1);
284                 }
285                 x += 110;
286                 
287                 /* Second */                            
288                 if (exclude) {  
289                         rect1 = new Rectangle (20+x, 330, 40, 50);              
290                         rect2 = new Rectangle (50+x, 340, 40, 50);              
291                         rect3 = new Rectangle (70+x, 360, 30, 50);              
292                         rect4 = new Rectangle (80+x, 400, 30, 10);              
293                         rgn1 = new Region (rect1);
294                         rgn2 = new Region (rect2);              
295                         rgn3 = new Region (rect3);      
296                         rgn4 = new Region (rect4);      
297                         
298                         dc.DrawRectangle (Pens.Green, rect1);                           
299                         dc.DrawRectangle (Pens.Red, rect2);
300                         dc.DrawEllipse (Pens.Red, rect3);
301                         dc.DrawRectangle (Pens.Red, rect4);
302                         
303                         rgn1.Union (rgn2);
304                         rgn1.Union (rgn3);
305                         rgn1.Exclude (rgn4);
306                         dc.FillRegion (Brushes.Blue, rgn1);             
307                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));
308                         dc.DrawString ("Exclude (" + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 130, 430);              
309                 }
310                 x += 110;
311                 
312                 /* Third */                             
313                 if (intersect) {        
314
315                         rect1 = new Rectangle (20+x, 330, 40, 50);              
316                         rect2 = new Rectangle (50+x, 340, 40, 50);              
317                         rect3 = new Rectangle (70+x, 360, 30, 50);              
318                         rect4 = new Rectangle (80+x, 400, 30, 10);              
319                         rgn1 = new Region (rect1);
320                         rgn2 = new Region (rect2);              
321                         rgn3 = new Region (rect3);      
322                         rgn4 = new Region (rect4);      
323                         
324                         dc.DrawRectangle (Pens.Green, rect1);                           
325                         dc.DrawRectangle (Pens.Red, rect2);
326                         dc.DrawEllipse (Pens.Red, rect3);
327                         dc.DrawRectangle (Pens.Red, rect4);
328                         
329                         rgn1.Union (rgn2);
330                         rgn1.Union (rgn3);
331                         rgn1.Intersect (rgn4);
332                         dc.FillRegion (Brushes.Blue, rgn1);             
333                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));
334                         dc.DrawString ("Intersect (" + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 250, 430);            
335                         DumpRegion (rgn1);              
336                 }
337                 x += 110;
338                 
339                 /* Fourth */                            
340                 if (xor) {      
341                         rect1 = new Rectangle (20+x, 330, 40, 50);              
342                         rect2 = new Rectangle (50+x, 340, 40, 50);              
343                         rect3 = new Rectangle (70+x, 360, 30, 50);              
344                         rect4 = new Rectangle (80+x, 400, 30, 10);              
345                         rgn1 = new Region (rect1);
346                         rgn2 = new Region (rect2);              
347                         rgn3 = new Region (rect3);      
348                         rgn4 = new Region (rect4);      
349                         
350                         dc.DrawRectangle (Pens.Green, rect1);                           
351                         dc.DrawRectangle (Pens.Red, rect2);
352                         dc.DrawEllipse (Pens.Red, rect3);
353                         dc.DrawRectangle (Pens.Red, rect4);             
354                         
355                         rgn1.Union (rgn2);                      
356                         rgn3.Union (rgn4);
357                         rgn1.Xor (rgn3);
358                         
359                         dc.FillRegion(Brushes.Blue, rgn1);              
360                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));
361                         dc.DrawString ("Xor ("  + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 370, 430);         
362                         DumpRegion (rgn1);
363                 }
364                 x += 110;
365                 
366                 /* Fifth */                             
367                 if (union) {    
368                         rect1 = new Rectangle (20+x, 330, 40, 50);              
369                         rect2 = new Rectangle (50+x, 340, 40, 50);              
370                         rect3 = new Rectangle (70+x, 360, 30, 50);              
371                         rect4 = new Rectangle (80+x, 400, 30, 10);                              
372                         rgn1 = new Region (rect1);
373                         rgn2 = new Region (rect2);              
374                         rgn3 = new Region (rect3);      
375                         rgn4 = new Region (rect4);      
376                         
377                         dc.DrawRectangle (Pens.Green, rect1);                           
378                         dc.DrawRectangle (Pens.Red, rect2);
379                         dc.DrawEllipse (Pens.Red, rect3);
380                         dc.DrawRectangle (Pens.Red, rect4);             
381                         
382                         rgn1.Union (rgn2);
383                         rgn1.Union (rgn3);
384                         rgn1.Union (rgn4);
385                         dc.FillRegion (Brushes.Blue, rgn1);             
386                         dc.DrawString ("Union (" + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 490, 430);                
387                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));
388                         DumpRegion (rgn1);
389                 }
390                 x += 110;
391                 
392                 dc.DrawString ("Region samples using Regions with two Rectangles", fnttitle, whiteBrush, 5, 455);
393                 
394                 x = 0;
395                 
396                 if (complement) {       
397                         rect1 = new Rectangle (20+x, 330+150, 40, 50);          
398                         rect2 = new Rectangle (50+x, 340+150, 40, 50);          
399                         rect3 = new Rectangle (70+x, 360+150, 30, 50);          
400                         rect4 = new Rectangle (80+x, 400+150, 30, 10);          
401                         rgn1 = new Region (rect1);
402                         rgn1.Union (rect2);
403                         rgn2 = new Region (rect3);      
404                         rgn2.Union (rect4);
405                         
406                         dc.DrawRectangle (Pens.Red, rect1);                             
407                         dc.DrawRectangle (Pens.Red, rect2);
408                         dc.DrawRectangle (Pens.Green, rect3);
409                         dc.DrawRectangle (Pens.Green, rect4);
410                         
411                         rgn1.Complement (rgn2);
412                         dc.FillRegion (Brushes.Blue, rgn1);             
413                         dc.DrawString ("Complement (" + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 10, 430+150);        
414                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));  
415                         DumpRegion (rgn1);
416                 }
417                 x += 110;
418
419                 dc.DrawString ("Special cases (old bugs)", fnttitle, whiteBrush, 5, 610);
420                 
421                 x = 0;
422
423                 if (xor) {
424                         rect1 = new Rectangle (20+x, 330+300, 40, 50);\r
425                         rect2 = new Rectangle (40+x, 360+300, 20, 20);\r
426                         dc.DrawRectangle (Pens.Red, rect1);
427                         dc.DrawRectangle (Pens.Green, rect2);
428                         rgn1 = new Region (rect1);
429                         rgn1.Xor (rect2);
430                         dc.FillRegion (Brushes.Blue, rgn1);
431                         dc.DrawString ("Xor (" + rgn1.GetRegionScans (matrix).Length +") #77408", fnt, whiteBrush, 10, 430+300);
432                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));
433                         DumpRegion (rgn1);
434                 }
435                 
436                 rect1 = new Rectangle (1, 1, 4, 1);             
437                 dc.DrawRectangle (Pens.Pink, rect1);                            
438                 
439                 
440                 bmp.Save("regionsrc.bmp", ImageFormat.Bmp);                             
441         }       
442
443 }
444
445