2 // System.Drawing.Pen.cs
5 // Miguel de Icaza (miguel@ximian.com)
6 // Alexandre Pigolkine (pigolkine@gmx.de)
7 // Duncan Mak (duncan@ximian.com)
8 // Ravindra (rkumar@novell.com)
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:
22 // The above copyright notice and this permission notice shall be
23 // included in all copies or substantial portions of the Software.
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.
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;
46 private CustomLineCap startCap
;
47 private CustomLineCap endCap
;
48 private bool disposed
;
50 internal Pen (IntPtr 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
)
67 Status status
= GDIPlus
.GdipCreatePen2 (brush
.nativeObject
, width
, Unit
.UnitWorld
, out nativeObject
);
68 GDIPlus
.CheckStatus (status
);
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
)
83 Status status
= GDIPlus
.GdipCreatePen1 (color
.ToArgb (), width
, Unit
.UnitWorld
, out nativeObject
);
84 GDIPlus
.CheckStatus (status
);
87 brush
= new SolidBrush (color
);
88 status
= GDIPlus
.GdipSetPenBrushFill (nativeObject
, brush
.nativeObject
);
89 GDIPlus
.CheckStatus (status
);
96 public PenAlignment Alignment
{
99 Status status
= GDIPlus
.GdipGetPenMode (nativeObject
, out retval
);
100 GDIPlus
.CheckStatus (status
);
106 Status status
= GDIPlus
.GdipSetPenMode (nativeObject
, value);
107 GDIPlus
.CheckStatus (status
);
110 throw new ArgumentException ("This Pen object can't be modified.");
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
);
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
);
140 throw new ArgumentException ("This Pen object can't be modified.");
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
);
159 throw new ArgumentException ("This Pen object can't be modified.");
163 public float [] CompoundArray
{
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
);
178 int length
= value.Length
;
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
);
189 throw new ArgumentException ("This Pen object can't be modified.");
193 public CustomLineCap CustomEndCap
{
200 Status status
= GDIPlus
.GdipSetPenCustomEndCap (nativeObject
, value.nativeObject
);
201 GDIPlus
.CheckStatus (status
);
205 throw new ArgumentException ("This Pen object can't be modified.");
209 public CustomLineCap CustomStartCap
{
216 Status status
= GDIPlus
.GdipSetPenCustomStartCap (nativeObject
, value.nativeObject
);
217 GDIPlus
.CheckStatus (status
);
221 throw new ArgumentException ("This Pen object can't be modified.");
225 public DashCap DashCap
{
229 Status status
= GDIPlus
.GdipGetPenDashCap197819 (nativeObject
, out retval
);
230 GDIPlus
.CheckStatus (status
);
236 Status status
= GDIPlus
.GdipSetPenDashCap197819 (nativeObject
, value);
237 GDIPlus
.CheckStatus (status
);
240 throw new ArgumentException ("This Pen object can't be modified.");
244 public float DashOffset
{
248 Status status
= GDIPlus
.GdipGetPenDashOffset (nativeObject
, out retval
);
249 GDIPlus
.CheckStatus (status
);
255 Status status
= GDIPlus
.GdipSetPenDashOffset (nativeObject
, value);
256 GDIPlus
.CheckStatus (status
);
259 throw new ArgumentException ("This Pen object can't be modified.");
263 public float [] DashPattern
{
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
);
278 int length
= value.Length
;
280 throw new ArgumentException ("Invalid parameter.");
281 foreach (float val
in value)
283 throw new ArgumentException ("Invalid parameter.");
284 Status status
= GDIPlus
.GdipSetPenDashArray (nativeObject
, value, value.Length
);
285 GDIPlus
.CheckStatus (status
);
288 throw new ArgumentException ("This Pen object can't be modified.");
292 public DashStyle DashStyle
{
295 Status status
= GDIPlus
.GdipGetPenDashStyle (nativeObject
, out retval
);
296 GDIPlus
.CheckStatus (status
);
302 Status status
= GDIPlus
.GdipSetPenDashStyle (nativeObject
, value);
303 GDIPlus
.CheckStatus (status
);
306 throw new ArgumentException ("This Pen object can't be modified.");
310 public LineCap StartCap
{
313 Status status
= GDIPlus
.GdipGetPenStartCap (nativeObject
, out retval
);
314 GDIPlus
.CheckStatus (status
);
321 Status status
= GDIPlus
.GdipSetPenStartCap (nativeObject
, value);
322 GDIPlus
.CheckStatus (status
);
325 throw new ArgumentException ("This Pen object can't be modified.");
329 public LineCap EndCap
{
332 Status status
= GDIPlus
.GdipGetPenEndCap (nativeObject
, out retval
);
333 GDIPlus
.CheckStatus (status
);
340 Status status
= GDIPlus
.GdipSetPenEndCap (nativeObject
, value);
341 GDIPlus
.CheckStatus (status
);
344 throw new ArgumentException ("This Pen object can't be modified.");
348 public LineJoin LineJoin
{
352 Status status
= GDIPlus
.GdipGetPenLineJoin (nativeObject
, out result
);
353 GDIPlus
.CheckStatus (status
);
359 Status status
= GDIPlus
.GdipSetPenLineJoin (nativeObject
, value);
360 GDIPlus
.CheckStatus (status
);
363 throw new ArgumentException ("This Pen object can't be modified.");
368 public float MiterLimit
{
372 Status status
= GDIPlus
.GdipGetPenMiterLimit (nativeObject
, out result
);
373 GDIPlus
.CheckStatus (status
);
379 Status status
= GDIPlus
.GdipSetPenMiterLimit (nativeObject
, value);
380 GDIPlus
.CheckStatus (status
);
383 throw new ArgumentException ("This Pen object can't be modified.");
388 public PenType PenType
{
391 Status status
= GDIPlus
.GdipGetPenFillType (nativeObject
, out type
);
392 GDIPlus
.CheckStatus (status
);
398 public Matrix Transform
{
401 Matrix matrix
= new Matrix ();
402 Status status
= GDIPlus
.GdipGetPenTransform (nativeObject
, matrix
.nativeMatrix
);
403 GDIPlus
.CheckStatus (status
);
410 Status status
= GDIPlus
.GdipSetPenTransform (nativeObject
, value.nativeMatrix
);
411 GDIPlus
.CheckStatus (status
);
414 throw new ArgumentException ("This Pen object can't be modified.");
421 Status status
= GDIPlus
.GdipGetPenWidth (nativeObject
, out f
);
422 GDIPlus
.CheckStatus (status
);
427 Status status
= GDIPlus
.GdipSetPenWidth (nativeObject
, value);
428 GDIPlus
.CheckStatus (status
);
431 throw new ArgumentException ("This Pen object can't be modified.");
435 public object Clone ()
438 Status status
= GDIPlus
.GdipClonePen (nativeObject
, out ptr
);
439 GDIPlus
.CheckStatus (status
);
440 Pen p
= new Pen (ptr
);
443 p
.startCap
= startCap
;
449 public void Dispose ()
452 System
.GC
.SuppressFinalize (this);
455 void Dispose (bool disposing
)
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
462 if (isModifiable
|| disposing
== false) {
463 Status status
= GDIPlus
.GdipDeletePen (nativeObject
);
464 GDIPlus
.CheckStatus (status
);
465 nativeObject
= IntPtr
.Zero
;
470 throw new ArgumentException ("This Pen object can't be modified.");
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
)
521 Status status
= GDIPlus
.GdipSetPenLineCap197819 (nativeObject
, startCap
, endCap
, dashCap
);
522 GDIPlus
.CheckStatus (status
);
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
);