(DISTFILES): Comment out a few missing files.
[mono-project.git] / mcs / class / System.Drawing / System.Drawing / Pen.cs
blobfd00ae62c6ceb58f66d6ff663758ece8627376fc
1 //
2 // System.Drawing.Pen.cs
3 //
4 // Authors:
5 // Miguel de Icaza (miguel@ximian.com)
6 // Alexandre Pigolkine (pigolkine@gmx.de)
7 // Duncan Mak (duncan@ximian.com)
8 // Ravindra (rkumar@novell.com)
9 //
10 // Copyright (C) Ximian, Inc. http://www.ximian.com
12 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
14 // Permission is hereby granted, free of charge, to any person obtaining
15 // a copy of this software and associated documentation files (the
16 // "Software"), to deal in the Software without restriction, including
17 // without limitation the rights to use, copy, modify, merge, publish,
18 // distribute, sublicense, and/or sell copies of the Software, and to
19 // permit persons to whom the Software is furnished to do so, subject to
20 // the following conditions:
21 //
22 // The above copyright notice and this permission notice shall be
23 // included in all copies or substantial portions of the Software.
24 //
25 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
29 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
30 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 using System;
35 using System.Drawing.Drawing2D;
36 using System.Runtime.InteropServices;
38 namespace System.Drawing
40 public sealed class Pen : MarshalByRefObject, ICloneable, IDisposable
42 internal IntPtr nativeObject;
43 internal bool isModifiable = true;
44 internal Brush brush;
45 internal Color color;
46 private CustomLineCap startCap;
47 private CustomLineCap endCap;
48 private bool disposed;
50 internal Pen (IntPtr p)
52 nativeObject = p;
55 public Pen (Brush brush) : this (brush, 1.0F)
59 public Pen (Color color) : this (color, 1.0F)
63 public Pen (Brush brush, float width)
65 lock (this)
67 Status status = GDIPlus.GdipCreatePen2 (brush.nativeObject, width, Unit.UnitWorld, out nativeObject);
68 GDIPlus.CheckStatus (status);
70 this.brush = brush;
71 if (brush is SolidBrush) {
72 color = ((SolidBrush) brush).Color;
73 status = GDIPlus.GdipSetPenColor (nativeObject, color.ToArgb ());
74 GDIPlus.CheckStatus (status);
79 public Pen (Color color, float width)
81 lock (this)
83 Status status = GDIPlus.GdipCreatePen1 (color.ToArgb (), width, Unit.UnitWorld, out nativeObject);
84 GDIPlus.CheckStatus (status);
86 this.color = color;
87 brush = new SolidBrush (color);
88 status = GDIPlus.GdipSetPenBrushFill (nativeObject, brush.nativeObject);
89 GDIPlus.CheckStatus (status);
94 // Properties
96 public PenAlignment Alignment {
97 get {
98 PenAlignment retval;
99 Status status = GDIPlus.GdipGetPenMode (nativeObject, out retval);
100 GDIPlus.CheckStatus (status);
101 return retval;
104 set {
105 if (isModifiable) {
106 Status status = GDIPlus.GdipSetPenMode (nativeObject, value);
107 GDIPlus.CheckStatus (status);
109 else
110 throw new ArgumentException ("This Pen object can't be modified.");
115 public Brush Brush {
116 get {
117 return brush;
120 set {
121 if (isModifiable) {
122 brush = value;
123 if (value is SolidBrush) {
124 Status status = GDIPlus.GdipSetPenBrushFill (nativeObject, value.nativeObject);
125 GDIPlus.CheckStatus (status);
126 color = ((SolidBrush) brush).Color;
127 status = GDIPlus.GdipSetPenColor (nativeObject, color.ToArgb ());
128 GDIPlus.CheckStatus (status);
130 else {
131 // other brushes should clear the color property
132 Status status = GDIPlus.GdipSetPenBrushFill (nativeObject, value.nativeObject);
133 GDIPlus.CheckStatus (status);
134 status = GDIPlus.GdipSetPenColor (nativeObject, 0);
135 GDIPlus.CheckStatus (status);
136 color = Color.Empty;
139 else
140 throw new ArgumentException ("This Pen object can't be modified.");
144 public Color Color {
145 get {
146 return color;
149 set {
150 if (isModifiable) {
151 color = value;
152 Status status = GDIPlus.GdipSetPenColor (nativeObject, value.ToArgb ());
153 GDIPlus.CheckStatus (status);
154 brush = new SolidBrush (color);
155 status = GDIPlus.GdipSetPenBrushFill (nativeObject, brush.nativeObject);
156 GDIPlus.CheckStatus (status);
158 else
159 throw new ArgumentException ("This Pen object can't be modified.");
163 public float [] CompoundArray {
164 get {
165 int count;
166 Status status = GDIPlus.GdipGetPenCompoundCount (nativeObject, out count);
167 GDIPlus.CheckStatus (status);
169 float [] compArray = new float [count];
170 status = GDIPlus.GdipGetPenCompoundArray (nativeObject, compArray, count);
171 GDIPlus.CheckStatus (status);
173 return compArray;
176 set {
177 if (isModifiable) {
178 int length = value.Length;
179 if (length < 2)
180 throw new ArgumentException ("Invalid parameter.");
181 foreach (float val in value)
182 if (val < 0 || val > 1)
183 throw new ArgumentException ("Invalid parameter.");
185 Status status = GDIPlus.GdipSetPenCompoundArray (nativeObject, value, value.Length);
186 GDIPlus.CheckStatus (status);
188 else
189 throw new ArgumentException ("This Pen object can't be modified.");
193 public CustomLineCap CustomEndCap {
194 get {
195 return endCap;
198 set {
199 if (isModifiable) {
200 Status status = GDIPlus.GdipSetPenCustomEndCap (nativeObject, value.nativeObject);
201 GDIPlus.CheckStatus (status);
202 endCap = value;
204 else
205 throw new ArgumentException ("This Pen object can't be modified.");
209 public CustomLineCap CustomStartCap {
210 get {
211 return startCap;
214 set {
215 if (isModifiable) {
216 Status status = GDIPlus.GdipSetPenCustomStartCap (nativeObject, value.nativeObject);
217 GDIPlus.CheckStatus (status);
218 startCap = value;
220 else
221 throw new ArgumentException ("This Pen object can't be modified.");
225 public DashCap DashCap {
227 get {
228 DashCap retval;
229 Status status = GDIPlus.GdipGetPenDashCap197819 (nativeObject, out retval);
230 GDIPlus.CheckStatus (status);
231 return retval;
234 set {
235 if (isModifiable) {
236 Status status = GDIPlus.GdipSetPenDashCap197819 (nativeObject, value);
237 GDIPlus.CheckStatus (status);
239 else
240 throw new ArgumentException ("This Pen object can't be modified.");
244 public float DashOffset {
246 get {
247 float retval;
248 Status status = GDIPlus.GdipGetPenDashOffset (nativeObject, out retval);
249 GDIPlus.CheckStatus (status);
250 return retval;
253 set {
254 if (isModifiable) {
255 Status status = GDIPlus.GdipSetPenDashOffset (nativeObject, value);
256 GDIPlus.CheckStatus (status);
258 else
259 throw new ArgumentException ("This Pen object can't be modified.");
263 public float [] DashPattern {
264 get {
265 int count;
266 Status status = GDIPlus.GdipGetPenDashCount (nativeObject, out count);
267 GDIPlus.CheckStatus (status);
269 float [] pattern = new float [count];
270 status = GDIPlus.GdipGetPenDashArray (nativeObject, pattern, count);
271 GDIPlus.CheckStatus (status);
273 return pattern;
276 set {
277 if (isModifiable) {
278 int length = value.Length;
279 if (length == 0)
280 throw new ArgumentException ("Invalid parameter.");
281 foreach (float val in value)
282 if (val <= 0)
283 throw new ArgumentException ("Invalid parameter.");
284 Status status = GDIPlus.GdipSetPenDashArray (nativeObject, value, value.Length);
285 GDIPlus.CheckStatus (status);
287 else
288 throw new ArgumentException ("This Pen object can't be modified.");
292 public DashStyle DashStyle {
293 get {
294 DashStyle retval;
295 Status status = GDIPlus.GdipGetPenDashStyle (nativeObject, out retval);
296 GDIPlus.CheckStatus (status);
297 return retval;
300 set {
301 if (isModifiable) {
302 Status status = GDIPlus.GdipSetPenDashStyle (nativeObject, value);
303 GDIPlus.CheckStatus (status);
305 else
306 throw new ArgumentException ("This Pen object can't be modified.");
310 public LineCap StartCap {
311 get {
312 LineCap retval;
313 Status status = GDIPlus.GdipGetPenStartCap (nativeObject, out retval);
314 GDIPlus.CheckStatus (status);
316 return retval;
319 set {
320 if (isModifiable) {
321 Status status = GDIPlus.GdipSetPenStartCap (nativeObject, value);
322 GDIPlus.CheckStatus (status);
324 else
325 throw new ArgumentException ("This Pen object can't be modified.");
329 public LineCap EndCap {
330 get {
331 LineCap retval;
332 Status status = GDIPlus.GdipGetPenEndCap (nativeObject, out retval);
333 GDIPlus.CheckStatus (status);
335 return retval;
338 set {
339 if (isModifiable) {
340 Status status = GDIPlus.GdipSetPenEndCap (nativeObject, value);
341 GDIPlus.CheckStatus (status);
343 else
344 throw new ArgumentException ("This Pen object can't be modified.");
348 public LineJoin LineJoin {
350 get {
351 LineJoin result;
352 Status status = GDIPlus.GdipGetPenLineJoin (nativeObject, out result);
353 GDIPlus.CheckStatus (status);
354 return result;
357 set {
358 if (isModifiable) {
359 Status status = GDIPlus.GdipSetPenLineJoin (nativeObject, value);
360 GDIPlus.CheckStatus (status);
362 else
363 throw new ArgumentException ("This Pen object can't be modified.");
368 public float MiterLimit {
370 get {
371 float result;
372 Status status = GDIPlus.GdipGetPenMiterLimit (nativeObject, out result);
373 GDIPlus.CheckStatus (status);
374 return result;
377 set {
378 if (isModifiable) {
379 Status status = GDIPlus.GdipSetPenMiterLimit (nativeObject, value);
380 GDIPlus.CheckStatus (status);
382 else
383 throw new ArgumentException ("This Pen object can't be modified.");
388 public PenType PenType {
389 get {
390 PenType type;
391 Status status = GDIPlus.GdipGetPenFillType (nativeObject, out type);
392 GDIPlus.CheckStatus (status);
394 return type;
398 public Matrix Transform {
400 get {
401 Matrix matrix = new Matrix ();
402 Status status = GDIPlus.GdipGetPenTransform (nativeObject, matrix.nativeMatrix);
403 GDIPlus.CheckStatus (status);
405 return matrix;
408 set {
409 if (isModifiable) {
410 Status status = GDIPlus.GdipSetPenTransform (nativeObject, value.nativeMatrix);
411 GDIPlus.CheckStatus (status);
413 else
414 throw new ArgumentException ("This Pen object can't be modified.");
418 public float Width {
419 get {
420 float f;
421 Status status = GDIPlus.GdipGetPenWidth (nativeObject, out f);
422 GDIPlus.CheckStatus (status);
423 return f;
425 set {
426 if (isModifiable) {
427 Status status = GDIPlus.GdipSetPenWidth (nativeObject, value);
428 GDIPlus.CheckStatus (status);
430 else
431 throw new ArgumentException ("This Pen object can't be modified.");
435 public object Clone ()
437 IntPtr ptr;
438 Status status = GDIPlus.GdipClonePen (nativeObject, out ptr);
439 GDIPlus.CheckStatus (status);
440 Pen p = new Pen (ptr);
441 p.brush = brush;
442 p.color = color;
443 p.startCap = startCap;
444 p.endCap = endCap;
446 return p;
449 public void Dispose ()
451 Dispose (true);
452 System.GC.SuppressFinalize (this);
455 void Dispose (bool disposing)
457 lock (this){
458 // Pen is disposed if and only if it is not disposed and
459 // it is modifiable OR it is not disposed and it is being
460 // collected by GC.
461 if (! disposed) {
462 if (isModifiable || disposing == false) {
463 Status status = GDIPlus.GdipDeletePen (nativeObject);
464 GDIPlus.CheckStatus (status);
465 nativeObject = IntPtr.Zero;
466 disposed = true;
469 else
470 throw new ArgumentException ("This Pen object can't be modified.");
474 ~Pen ()
476 Dispose (false);
479 public void MultiplyTransform (Matrix matrix)
481 MultiplyTransform (matrix, MatrixOrder.Prepend);
484 public void MultiplyTransform (Matrix matrix, MatrixOrder order)
486 Status status = GDIPlus.GdipMultiplyPenTransform (nativeObject, matrix.nativeMatrix, order);
487 GDIPlus.CheckStatus (status);
490 public void ResetTransform ()
492 Status status = GDIPlus.GdipResetPenTransform (nativeObject);
493 GDIPlus.CheckStatus (status);
496 public void RotateTransform (float angle)
498 RotateTransform (angle, MatrixOrder.Prepend);
501 public void RotateTransform (float angle, MatrixOrder order)
503 Status status = GDIPlus.GdipRotatePenTransform (nativeObject, angle, order);
504 GDIPlus.CheckStatus (status);
507 public void ScaleTransform (float sx, float sy)
509 ScaleTransform (sx, sy, MatrixOrder.Prepend);
512 public void ScaleTransform (float sx, float sy, MatrixOrder order)
514 Status status = GDIPlus.GdipScalePenTransform (nativeObject, sx, sy, order);
515 GDIPlus.CheckStatus (status);
518 public void SetLineCap (LineCap startCap, LineCap endCap, DashCap dashCap)
520 if (isModifiable) {
521 Status status = GDIPlus.GdipSetPenLineCap197819 (nativeObject, startCap, endCap, dashCap);
522 GDIPlus.CheckStatus (status);
524 else
525 throw new ArgumentException ("This Pen object can't be modified.");
528 public void TranslateTransform (float dx, float dy)
530 TranslateTransform (dx, dy, MatrixOrder.Prepend);
533 public void TranslateTransform (float dx, float dy, MatrixOrder order)
535 Status status = GDIPlus.GdipTranslatePenTransform (nativeObject, dx, dy, order);
536 GDIPlus.CheckStatus (status);