2 // Sample application for region graphics functions using Rects implementation
5 // Jordi Mas, jordi@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.Imaging;
34 using System.Drawing.Drawing2D;
39 public static void DumpRegion (Region rgn)
41 Matrix matrix = new Matrix ();
42 RectangleF [] rects = rgn.GetRegionScans (matrix);
44 for (int i = 0; i < rects.Length; i++)
45 Console.WriteLine ( rects[i]);
48 public static void Main ()
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 ();
56 Rectangle rect1, rect2, rect3, rect4;
57 Region rgn1, rgn2, rgn3, rgn4;
59 bool complement = true, exclude = true, union = true, xor = true, intersect = true;
61 SolidBrush whiteBrush = new SolidBrush (Color.White);
63 dc.DrawString ("Region samples using two Rectangle classes", fnttitle, whiteBrush, 5, 5);
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));
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);
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));
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));
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);
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));
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);
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));
141 dc.DrawString ("Region samples using three Rectangle class", fnttitle, whiteBrush, 5, 155);
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);
154 dc.DrawRectangle (Pens.Green, rect1);
155 dc.DrawRectangle (Pens.Red, rect2);
156 dc.DrawEllipse (Pens.Red, rect3);
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));
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);
176 dc.DrawRectangle (Pens.Green, rect1);
177 dc.DrawRectangle (Pens.Red, rect2);
178 dc.DrawEllipse (Pens.Red, rect3);
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);
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);
199 dc.DrawRectangle (Pens.Green, rect1);
200 dc.DrawRectangle (Pens.Red, rect2);
201 dc.DrawEllipse (Pens.Red, rect3);
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);
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);
222 dc.DrawRectangle (Pens.Green, rect1);
223 dc.DrawRectangle (Pens.Red, rect2);
224 dc.DrawEllipse (Pens.Red, rect3);
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);
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);
244 dc.DrawRectangle (Pens.Green, rect1);
245 dc.DrawRectangle (Pens.Red, rect2);
246 dc.DrawEllipse (Pens.Red, rect3);
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));
257 dc.DrawString ("Region samples using four Rectangle class", fnttitle, whiteBrush, 5, 300);
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);
272 dc.DrawRectangle (Pens.Green, rect1);
273 dc.DrawRectangle (Pens.Red, rect2);
274 dc.DrawEllipse (Pens.Red, rect3);
275 dc.DrawRectangle (Pens.Red, rect4);
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));
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);
298 dc.DrawRectangle (Pens.Green, rect1);
299 dc.DrawRectangle (Pens.Red, rect2);
300 dc.DrawEllipse (Pens.Red, rect3);
301 dc.DrawRectangle (Pens.Red, rect4);
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);
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);
324 dc.DrawRectangle (Pens.Green, rect1);
325 dc.DrawRectangle (Pens.Red, rect2);
326 dc.DrawEllipse (Pens.Red, rect3);
327 dc.DrawRectangle (Pens.Red, rect4);
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);
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);
350 dc.DrawRectangle (Pens.Green, rect1);
351 dc.DrawRectangle (Pens.Red, rect2);
352 dc.DrawEllipse (Pens.Red, rect3);
353 dc.DrawRectangle (Pens.Red, rect4);
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);
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);
377 dc.DrawRectangle (Pens.Green, rect1);
378 dc.DrawRectangle (Pens.Red, rect2);
379 dc.DrawEllipse (Pens.Red, rect3);
380 dc.DrawRectangle (Pens.Red, rect4);
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));
392 dc.DrawString ("Region samples using Regions with two Rectangles", fnttitle, whiteBrush, 5, 455);
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);
403 rgn2 = new Region (rect3);
406 dc.DrawRectangle (Pens.Red, rect1);
407 dc.DrawRectangle (Pens.Red, rect2);
408 dc.DrawRectangle (Pens.Green, rect3);
409 dc.DrawRectangle (Pens.Green, rect4);
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));
419 dc.DrawString ("Special cases (old bugs)", fnttitle, whiteBrush, 5, 610);
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);
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));
436 rect1 = new Rectangle (1, 1, 4, 1);
437 dc.DrawRectangle (Pens.Pink, rect1);
440 bmp.Save("regionsrc.bmp", ImageFormat.Bmp);