Minor change to make sample output little better with a white background and black...
[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 using System;
9 using System.Drawing.Imaging;
10 using System.Drawing;
11 using System.Drawing.Drawing2D;
12
13 //
14 public class Regions
15 {       
16         public static void DumpRegion (Region rgn)
17         {
18                 Matrix matrix = new Matrix ();          
19                 RectangleF [] rects = rgn.GetRegionScans (matrix);
20
21                 for (int i = 0; i < rects.Length; i++)
22                         Console.WriteLine ( rects[i]);
23         }
24         
25         public static void Main () 
26         {
27                 Bitmap bmp = new Bitmap (600, 800);
28                 Graphics dc = Graphics.FromImage (bmp);                 
29                 Font fnt = new Font ("Arial", 8);
30                 Font fnttitle = new Font("Arial", 8, FontStyle.Underline);
31                 Matrix matrix = new Matrix ();          
32                 int x = 0;
33                 Rectangle rect1, rect2, rect3, rect4;           
34                 Region rgn1, rgn2, rgn3, rgn4;
35                                 
36                 bool complement = true, exclude = true, union = true, xor = true, intersect = true;
37                 
38                 SolidBrush whiteBrush = new SolidBrush (Color.White);                           
39                 
40                 dc.DrawString ("Region samples using two Rectangle classes", fnttitle, whiteBrush, 5, 5);
41                                 
42                 /* First */                             
43                 if (complement) {       
44                         rect1 = new Rectangle (20, 30, 60, 80);         
45                         rect2 = new Rectangle (50, 40, 60, 80);         
46                         rgn1 = new Region (rect1);
47                         rgn2 = new Region (rect2);                                              
48                         dc.DrawRectangle (Pens.Green, rect1);                           
49                         dc.DrawRectangle (Pens.Red, rect2);
50                         rgn1.Complement (rgn2);
51                         dc.FillRegion (Brushes.Blue, rgn1);             
52                         dc.DrawString ("Complement ("  + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 10, 130);                                           
53                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));          
54                         DumpRegion (rgn1);
55                 }
56                 
57                 /* Second */            
58                 if (exclude) {
59                         rect3 = new Rectangle (130, 30, 60, 80);                
60                         rect4 = new Rectangle (170, 40, 60, 80);                
61                         rgn3 = new Region (rect3);
62                         rgn4 = new Region (rect4);                      
63                         dc.DrawRectangle (Pens.Green, rect3);           
64                         dc.DrawRectangle (Pens.Red, rect4);
65                         rgn3.Exclude (rgn4);
66                         dc.FillRegion (Brushes.Blue, rgn3);             
67                         dc.DrawString ("Exclude ("  + rgn3.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 130, 130);
68                         dc.DrawRectangles (Pens.Yellow, rgn3.GetRegionScans (matrix));
69                         DumpRegion (rgn3);
70                 }
71                 
72                 /* Third */
73                 if (intersect) {                
74                         
75                         Rectangle rect5 = new Rectangle (260, 30, 60, 80);              
76                         Rectangle rect6 = new Rectangle (290, 40, 60, 80);              
77                         Region rgn5 = new Region (rect5);
78                         Region rgn6 = new Region (rect6);                       
79                         dc.DrawRectangle (Pens.Green, rect5);           
80                         dc.DrawRectangle (Pens.Red, rect6);
81                         rgn5.Intersect (rgn6);
82                         dc.FillRegion (Brushes.Blue, rgn5);             
83                         dc.DrawString ("Intersect ("  + rgn5.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 270, 130);
84                         dc.DrawRectangles (Pens.Yellow, rgn5.GetRegionScans (matrix));
85                         DumpRegion (rgn5);
86                 }
87                 
88                 /* Four */              
89                 if (xor) {
90                         Rectangle rect7 = new Rectangle (380, 30, 60, 80);              
91                         Rectangle rect8 = new Rectangle (410, 40, 60, 80);              
92                         Region rgn7 = new Region (rect7);
93                         Region rgn8 = new Region (rect8);                       
94                         dc.DrawRectangle (Pens.Green, rect7);           
95                         dc.DrawRectangle (Pens.Red, rect8);
96                         rgn7.Xor (rgn8);
97                         dc.FillRegion (Brushes.Blue, rgn7);             
98                         dc.DrawString ("Xor ("  + rgn7.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 400, 130);
99                         dc.DrawRectangles (Pens.Yellow, rgn7.GetRegionScans (matrix));
100                         DumpRegion (rgn7);
101                 }
102                 
103                 /* Fifht */             
104                 if (union) {
105                         Rectangle rect9 = new Rectangle (500, 30, 60, 80);              
106                         Rectangle rect10 = new Rectangle (520, 40, 60, 80);             
107                         Region rgn9 = new Region(rect9);
108                         Region rgn10 = new Region(rect10);                      
109                         dc.DrawRectangle (Pens.Green, rect9);           
110                         dc.DrawRectangle (Pens.Red, rect10);
111                         rgn9.Union(rgn10);
112                         dc.FillRegion (Brushes.Blue, rgn9);             
113                         dc.DrawString ("Union (" + rgn9.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 530, 130);                
114                         dc.DrawRectangles (Pens.Yellow, rgn9.GetRegionScans (matrix));          
115                         DumpRegion (rgn9);
116                 }
117                 
118                 dc.DrawString ("Region samples using three Rectangle class", fnttitle, whiteBrush, 5, 155);
119                 
120                 /* First */             
121                 x = 0;          
122                 
123                 if (complement) {       
124                         rect1 = new Rectangle (20+x, 180, 40, 50);              
125                         rect2 = new Rectangle (50+x, 190, 40, 50);              
126                         rect3 = new Rectangle (70+x, 210, 30, 50);              
127                         rgn1 = new Region (rect1);
128                         rgn2 = new Region (rect2);              
129                         rgn3 = new Region (rect3);      
130                         
131                         dc.DrawRectangle (Pens.Green, rect1);                           
132                         dc.DrawRectangle (Pens.Red, rect2);
133                         dc.DrawEllipse (Pens.Red, rect3);
134                         
135                         rgn1.Complement (rgn2);
136                         rgn1.Complement (rgn3);
137                         dc.FillRegion (Brushes.Blue, rgn1);             
138                         dc.DrawString ("Complement (" + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 10, 275);    
139                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));  
140                         DumpRegion (rgn1);
141                 }
142                 x += 110;
143                 
144                 /* Second */                            
145                 if (exclude) {  
146                         rect1 = new Rectangle (20+x, 180, 40, 50);              
147                         rect2 = new Rectangle (50+x, 190, 40, 50);              
148                         rect3 = new Rectangle (70+x, 210, 30, 50);              
149                         rgn1 = new Region (rect1);
150                         rgn2 = new Region (rect2);              
151                         rgn3 = new Region (rect3);      
152                         
153                         dc.DrawRectangle (Pens.Green, rect1);                           
154                         dc.DrawRectangle (Pens.Red, rect2);
155                         dc.DrawEllipse (Pens.Red, rect3);
156                         
157                         rgn1.Exclude (rgn2);
158                         rgn1.Exclude (rgn3);
159                         dc.FillRegion (Brushes.Blue, rgn1);             
160                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));
161                         dc.DrawString ("Exclude (" + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 130, 275);              
162                         DumpRegion (rgn1);
163                 }
164                 x += 110;
165                 
166                 /* Third */     
167                 if (intersect) {                                
168                         
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.Union (rgn2);
181                         rgn1.Intersect (rgn3);
182                         dc.FillRegion (Brushes.Blue, rgn1);             
183                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));
184                         dc.DrawString ("Intersect (" + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 270, 275);            
185                         DumpRegion (rgn1);
186                         
187                 }
188                 x += 110;
189                 
190                 /* Fourth */                            
191                 if (xor) {      
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.Xor (rgn3);
205                         dc.FillRegion (Brushes.Blue, rgn1);             
206                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));
207                         dc.DrawString ("Xor ("  + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 380, 275);         
208                         DumpRegion (rgn1);
209                 }
210                 x += 110;
211                 
212                 /* Fifth */                             
213                 if (union) {    
214                         rect1 = new Rectangle (20+x, 180, 40, 50);              
215                         rect2 = new Rectangle (50+x, 190, 40, 50);              
216                         rect3 = new Rectangle (70+x, 210, 30, 50);              
217                         rgn1 = new Region (rect1);
218                         rgn2 = new Region (rect2);              
219                         rgn3 = new Region (rect3);      
220                         
221                         dc.DrawRectangle (Pens.Green, rect1);                           
222                         dc.DrawRectangle (Pens.Red, rect2);
223                         dc.DrawEllipse (Pens.Red, rect3);
224                         
225                         rgn1.Union (rgn2);
226                         rgn1.Union (rgn3);
227                         dc.FillRegion (Brushes.Blue, rgn1);             
228                         dc.DrawString ("Union (" + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 500, 275);                
229                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));
230                         DumpRegion (rgn1);
231                 }
232                 x += 110;               
233                 
234                 dc.DrawString ("Region samples using four Rectangle class", fnttitle, whiteBrush, 5, 300);
235                 
236                 /* First */             
237                 x = 0;
238                 
239                 if (complement) {       
240                         rect1 = new Rectangle (20+x, 330, 40, 50);              
241                         rect2 = new Rectangle (50+x, 340, 40, 50);              
242                         rect3 = new Rectangle (70+x, 360, 30, 50);              
243                         rect4 = new Rectangle (80+x, 400, 30, 10);              
244                         rgn1 = new Region (rect1);
245                         rgn2 = new Region (rect2);              
246                         rgn3 = new Region (rect3);      
247                         rgn4 = new Region (rect4);      
248                         
249                         dc.DrawRectangle (Pens.Green, rect1);                           
250                         dc.DrawRectangle (Pens.Red, rect2);
251                         dc.DrawEllipse (Pens.Red, rect3);
252                         dc.DrawRectangle (Pens.Red, rect4);
253                         
254                         rgn1.Complement (rgn2);
255                         rgn1.Complement (rgn3);
256                         rgn1.Complement (rgn4);
257                         dc.FillRegion (Brushes.Blue, rgn1);             
258                         dc.DrawString ("Complement (" + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 10, 430);    
259                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));  
260                         DumpRegion (rgn1);
261                 }
262                 x += 110;
263                 
264                 /* Second */                            
265                 if (exclude) {  
266                         rect1 = new Rectangle (20+x, 330, 40, 50);              
267                         rect2 = new Rectangle (50+x, 340, 40, 50);              
268                         rect3 = new Rectangle (70+x, 360, 30, 50);              
269                         rect4 = new Rectangle (80+x, 400, 30, 10);              
270                         rgn1 = new Region (rect1);
271                         rgn2 = new Region (rect2);              
272                         rgn3 = new Region (rect3);      
273                         rgn4 = new Region (rect4);      
274                         
275                         dc.DrawRectangle (Pens.Green, rect1);                           
276                         dc.DrawRectangle (Pens.Red, rect2);
277                         dc.DrawEllipse (Pens.Red, rect3);
278                         dc.DrawRectangle (Pens.Red, rect4);
279                         
280                         rgn1.Union (rgn2);
281                         rgn1.Union (rgn3);
282                         rgn1.Exclude (rgn4);
283                         dc.FillRegion (Brushes.Blue, rgn1);             
284                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));
285                         dc.DrawString ("Exclude (" + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 130, 430);              
286                 }
287                 x += 110;
288                 
289                 /* Third */                             
290                 if (intersect) {        
291
292                         rect1 = new Rectangle (20+x, 330, 40, 50);              
293                         rect2 = new Rectangle (50+x, 340, 40, 50);              
294                         rect3 = new Rectangle (70+x, 360, 30, 50);              
295                         rect4 = new Rectangle (80+x, 400, 30, 10);              
296                         rgn1 = new Region (rect1);
297                         rgn2 = new Region (rect2);              
298                         rgn3 = new Region (rect3);      
299                         rgn4 = new Region (rect4);      
300                         
301                         dc.DrawRectangle (Pens.Green, rect1);                           
302                         dc.DrawRectangle (Pens.Red, rect2);
303                         dc.DrawEllipse (Pens.Red, rect3);
304                         dc.DrawRectangle (Pens.Red, rect4);
305                         
306                         rgn1.Union (rgn2);
307                         rgn1.Union (rgn3);
308                         rgn1.Intersect (rgn4);
309                         dc.FillRegion (Brushes.Blue, rgn1);             
310                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));
311                         dc.DrawString ("Intersect (" + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 250, 430);            
312                         DumpRegion (rgn1);              
313                 }
314                 x += 110;
315                 
316                 /* Fourth */                            
317                 if (xor) {      
318                         rect1 = new Rectangle (20+x, 330, 40, 50);              
319                         rect2 = new Rectangle (50+x, 340, 40, 50);              
320                         rect3 = new Rectangle (70+x, 360, 30, 50);              
321                         rect4 = new Rectangle (80+x, 400, 30, 10);              
322                         rgn1 = new Region (rect1);
323                         rgn2 = new Region (rect2);              
324                         rgn3 = new Region (rect3);      
325                         rgn4 = new Region (rect4);      
326                         
327                         dc.DrawRectangle (Pens.Green, rect1);                           
328                         dc.DrawRectangle (Pens.Red, rect2);
329                         dc.DrawEllipse (Pens.Red, rect3);
330                         dc.DrawRectangle (Pens.Red, rect4);             
331                         
332                         rgn1.Union (rgn2);                      
333                         rgn3.Union (rgn4);
334                         rgn1.Xor (rgn3);
335                         
336                         dc.FillRegion(Brushes.Blue, rgn1);              
337                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));
338                         dc.DrawString ("Xor ("  + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 370, 430);         
339                         DumpRegion (rgn1);
340                 }
341                 x += 110;
342                 
343                 /* Fifth */                             
344                 if (union) {    
345                         rect1 = new Rectangle (20+x, 330, 40, 50);              
346                         rect2 = new Rectangle (50+x, 340, 40, 50);              
347                         rect3 = new Rectangle (70+x, 360, 30, 50);              
348                         rect4 = new Rectangle (80+x, 400, 30, 10);                              
349                         rgn1 = new Region (rect1);
350                         rgn2 = new Region (rect2);              
351                         rgn3 = new Region (rect3);      
352                         rgn4 = new Region (rect4);      
353                         
354                         dc.DrawRectangle (Pens.Green, rect1);                           
355                         dc.DrawRectangle (Pens.Red, rect2);
356                         dc.DrawEllipse (Pens.Red, rect3);
357                         dc.DrawRectangle (Pens.Red, rect4);             
358                         
359                         rgn1.Union (rgn2);
360                         rgn1.Union (rgn3);
361                         rgn1.Union (rgn4);
362                         dc.FillRegion (Brushes.Blue, rgn1);             
363                         dc.DrawString ("Union (" + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 490, 430);                
364                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));
365                         DumpRegion (rgn1);
366                 }
367                 x += 110;
368                 
369                 dc.DrawString ("Region samples using Regions with two Rectangles", fnttitle, whiteBrush, 5, 455);
370                 
371                 x = 0;
372                 
373                 if (complement) {       
374                         rect1 = new Rectangle (20+x, 330+150, 40, 50);          
375                         rect2 = new Rectangle (50+x, 340+150, 40, 50);          
376                         rect3 = new Rectangle (70+x, 360+150, 30, 50);          
377                         rect4 = new Rectangle (80+x, 400+150, 30, 10);          
378                         rgn1 = new Region (rect1);
379                         rgn1.Union (rect2);
380                         rgn2 = new Region (rect3);      
381                         rgn2.Union (rect4);
382                         
383                         dc.DrawRectangle (Pens.Red, rect1);                             
384                         dc.DrawRectangle (Pens.Red, rect2);
385                         dc.DrawRectangle (Pens.Green, rect3);
386                         dc.DrawRectangle (Pens.Green, rect4);
387                         
388                         rgn1.Complement (rgn2);
389                         dc.FillRegion (Brushes.Blue, rgn1);             
390                         dc.DrawString ("Complement (" + rgn1.GetRegionScans (matrix).Length +")", fnt, whiteBrush, 10, 430+150);        
391                         dc.DrawRectangles (Pens.Yellow, rgn1.GetRegionScans (matrix));  
392                         DumpRegion (rgn1);
393                 }
394                 x += 110;
395                 
396                 rect1 = new Rectangle (1, 1, 4, 1);             
397                 dc.DrawRectangle (Pens.Pink, rect1);                            
398                 
399                 
400                 bmp.Save("regionsrc.bmp", ImageFormat.Bmp);                             
401         }       
402
403 }
404
405