• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**************************************************************************\
2 *
3 * Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.
4 *
5 * Module Name:
6 *
7 *   GdiplusPen.h
8 *
9 * Abstract:
10 *
11 *   Pen API related declarations
12 *
13 \**************************************************************************/
14 #ifndef _GDIPLUSPEN_H
15 #define _GDIPLUSPEN_H
16 
17 //--------------------------------------------------------------------------
18 // class for various pen types
19 //--------------------------------------------------------------------------
20 
21 class Pen : public GdiplusBase
22 {
23 public:
24     friend class GraphicsPath;
25     friend class Graphics;
26 
27     // abstract Clone() can't be implemented here because it can't
28     // new an object with pure virtual functions
29 
30     // Constructors
31 
32     Pen(IN const Color& color,
33         IN REAL width = 1.0f)
34     {
35         Unit unit = UnitWorld;
36         nativePen = NULL;
37         lastResult = DllExports::GdipCreatePen1(color.GetValue(),
38                                     width, unit, &nativePen);
39     }
40 
41     Pen(IN const Brush* brush,
42         IN REAL width = 1.0f)
43     {
44         Unit unit = UnitWorld;
45         nativePen = NULL;
46         lastResult = DllExports::GdipCreatePen2(brush->nativeBrush,
47                                     width, unit, &nativePen);
48     }
49 
~Pen()50     ~Pen()
51     {
52         DllExports::GdipDeletePen(nativePen);
53     }
54 
Clone()55     Pen* Clone() const
56     {
57         GpPen *clonePen = NULL;
58 
59         lastResult = DllExports::GdipClonePen(nativePen, &clonePen);
60 
61         return new Pen(clonePen, lastResult);
62     }
63 
SetWidth(IN REAL width)64     Status SetWidth(IN REAL width)
65     {
66         return SetStatus(DllExports::GdipSetPenWidth(nativePen, width));
67     }
68 
GetWidth()69     REAL GetWidth() const
70     {
71         REAL width;
72 
73         SetStatus(DllExports::GdipGetPenWidth(nativePen, &width));
74 
75         return width;
76     }
77 
78     // Set/get line caps: start, end, and dash
79 
80     // Line cap and join APIs by using LineCap and LineJoin enums.
81 
82     #ifdef DCR_USE_NEW_197819
SetLineCap(IN LineCap startCap,IN LineCap endCap,IN DashCap dashCap)83     Status SetLineCap(IN LineCap startCap,
84                       IN LineCap endCap,
85                       IN DashCap dashCap)
86     {
87         return SetStatus(DllExports::GdipSetPenLineCap197819(nativePen,
88                                    startCap, endCap, dashCap));
89     }
90     #else
SetLineCap(IN LineCap startCap,IN LineCap endCap,IN LineCap dashCap)91     Status SetLineCap(IN LineCap startCap,
92                       IN LineCap endCap,
93                       IN LineCap dashCap)
94     {
95         return SetStatus(DllExports::GdipSetPenLineCap(nativePen,
96                                    startCap, endCap, dashCap));
97     }
98     #endif // DCR_USE_NEW_197819
99 
SetStartCap(IN LineCap startCap)100     Status SetStartCap(IN LineCap startCap)
101     {
102         return SetStatus(DllExports::GdipSetPenStartCap(nativePen, startCap));
103     }
104 
SetEndCap(IN LineCap endCap)105     Status SetEndCap(IN LineCap endCap)
106     {
107         return SetStatus(DllExports::GdipSetPenEndCap(nativePen, endCap));
108     }
109 
110     #ifdef DCR_USE_NEW_197819
SetDashCap(IN DashCap dashCap)111     Status SetDashCap(IN DashCap dashCap)
112     {
113         return SetStatus(DllExports::GdipSetPenDashCap197819(nativePen,
114                                    dashCap));
115     }
116     #else
SetDashCap(IN LineCap dashCap)117     Status SetDashCap(IN LineCap dashCap)
118     {
119         return SetStatus(DllExports::GdipSetPenDashCap(nativePen, dashCap));
120     }
121     #endif // DCR_USE_NEW_197819
122 
GetStartCap()123     LineCap GetStartCap() const
124     {
125         LineCap startCap;
126 
127         SetStatus(DllExports::GdipGetPenStartCap(nativePen, &startCap));
128 
129         return startCap;
130     }
131 
GetEndCap()132     LineCap GetEndCap() const
133     {
134         LineCap endCap;
135 
136         SetStatus(DllExports::GdipGetPenEndCap(nativePen, &endCap));
137 
138         return endCap;
139     }
140 
141     #ifdef DCR_USE_NEW_197819
GetDashCap()142     DashCap GetDashCap() const
143     {
144         DashCap dashCap;
145 
146         SetStatus(DllExports::GdipGetPenDashCap197819(nativePen,
147                             &dashCap));
148 
149         return dashCap;
150     }
151     #else
GetDashCap()152     LineCap GetDashCap() const
153     {
154         LineCap dashCap;
155 
156         SetStatus(DllExports::GdipGetPenDashCap(nativePen, &dashCap));
157 
158         return dashCap;
159     }
160     #endif // DCR_USE_NEW_197819
161 
162 
163     // Set/get line join
164 
SetLineJoin(IN LineJoin lineJoin)165     Status SetLineJoin(IN LineJoin lineJoin)
166     {
167         return SetStatus(DllExports::GdipSetPenLineJoin(nativePen, lineJoin));
168     }
169 
GetLineJoin()170     LineJoin GetLineJoin() const
171     {
172         LineJoin lineJoin;
173 
174         SetStatus(DllExports::GdipGetPenLineJoin(nativePen, &lineJoin));
175 
176         return lineJoin;
177     }
178 
SetCustomStartCap(IN const CustomLineCap * customCap)179     Status SetCustomStartCap(IN const CustomLineCap* customCap)
180     {
181         GpCustomLineCap* nativeCap = NULL;
182         if(customCap)
183             nativeCap = customCap->nativeCap;
184 
185         return SetStatus(DllExports::GdipSetPenCustomStartCap(nativePen, nativeCap));
186     }
187 
GetCustomStartCap(OUT CustomLineCap * customCap)188     Status GetCustomStartCap(OUT CustomLineCap* customCap) const
189     {
190         if(!customCap)
191             return SetStatus(InvalidParameter);
192 
193         return SetStatus(DllExports::GdipGetPenCustomStartCap(nativePen, &(customCap->nativeCap)));
194     }
195 
SetCustomEndCap(IN const CustomLineCap * customCap)196     Status SetCustomEndCap(IN const CustomLineCap* customCap)
197     {
198         GpCustomLineCap* nativeCap = NULL;
199         if(customCap)
200             nativeCap = customCap->nativeCap;
201 
202         return SetStatus(DllExports::GdipSetPenCustomEndCap(nativePen, nativeCap));
203     }
204 
GetCustomEndCap(OUT CustomLineCap * customCap)205     Status GetCustomEndCap(OUT CustomLineCap* customCap) const
206     {
207         if(!customCap)
208             return SetStatus(InvalidParameter);
209 
210         return SetStatus(DllExports::GdipGetPenCustomEndCap(nativePen, &(customCap->nativeCap)));
211     }
212 
SetMiterLimit(IN REAL miterLimit)213     Status SetMiterLimit(IN REAL miterLimit)
214     {
215         return SetStatus(DllExports::GdipSetPenMiterLimit(nativePen, miterLimit));
216     }
217 
GetMiterLimit()218     REAL GetMiterLimit() const
219     {
220         REAL miterLimit;
221 
222         SetStatus(DllExports::GdipGetPenMiterLimit(nativePen, &miterLimit));
223 
224         return miterLimit;
225     }
226 
227     // Set/get pen mode
SetAlignment(IN PenAlignment penAlignment)228     Status SetAlignment(IN PenAlignment penAlignment)
229     {
230         return SetStatus(DllExports::GdipSetPenMode(nativePen, penAlignment));
231     }
232 
GetAlignment()233     PenAlignment GetAlignment() const
234     {
235         PenAlignment penAlignment;
236 
237         SetStatus(DllExports::GdipGetPenMode(nativePen, &penAlignment));
238 
239         return penAlignment;
240     }
241 
242     // Set/get pen transform
SetTransform(IN const Matrix * matrix)243     Status SetTransform(IN const Matrix* matrix)
244     {
245         return SetStatus(DllExports::GdipSetPenTransform(nativePen,
246                                                          matrix->nativeMatrix));
247     }
248 
GetTransform(OUT Matrix * matrix)249     Status GetTransform(OUT Matrix* matrix) const
250     {
251         return SetStatus(DllExports::GdipGetPenTransform(nativePen, matrix->nativeMatrix));
252     }
253 
ResetTransform()254     Status ResetTransform()
255     {
256         return SetStatus(DllExports::GdipResetPenTransform(nativePen));
257     }
258 
259     Status MultiplyTransform(IN const Matrix* matrix,
260                              IN MatrixOrder order = MatrixOrderPrepend)
261     {
262         return SetStatus(DllExports::GdipMultiplyPenTransform(nativePen,
263                                                               matrix->nativeMatrix,
264                                                               order));
265     }
266 
267     Status TranslateTransform(IN REAL dx,
268                               IN REAL dy,
269                               IN MatrixOrder order = MatrixOrderPrepend)
270     {
271         return SetStatus(DllExports::GdipTranslatePenTransform(nativePen,
272                                                                dx, dy, order));
273     }
274 
275     Status ScaleTransform(IN REAL sx,
276                           IN REAL sy,
277                           IN MatrixOrder order = MatrixOrderPrepend)
278     {
279         return SetStatus(DllExports::GdipScalePenTransform(nativePen,
280                                                              sx, sy, order));
281     }
282 
283     Status RotateTransform(IN REAL angle,
284                            IN MatrixOrder order = MatrixOrderPrepend)
285     {
286         return SetStatus(DllExports::GdipRotatePenTransform(nativePen,
287                                                               angle, order));
288     }
289 
GetPenType()290     PenType GetPenType() const
291     {
292        PenType type;
293        SetStatus(DllExports::GdipGetPenFillType(nativePen, &type));
294 
295        return type;
296     }
297 
SetColor(IN const Color & color)298     Status SetColor(IN const Color& color)
299     {
300         return SetStatus(DllExports::GdipSetPenColor(nativePen,
301                                                      color.GetValue()));
302     }
303 
SetBrush(IN const Brush * brush)304     Status SetBrush(IN const Brush* brush)
305     {
306         return SetStatus(DllExports::GdipSetPenBrushFill(nativePen,
307                                        brush->nativeBrush));
308     }
309 
GetColor(OUT Color * color)310     Status GetColor(OUT Color* color) const
311     {
312         if (color == NULL)
313         {
314             return SetStatus(InvalidParameter);
315         }
316 
317         PenType type = GetPenType();
318 
319         if (type != PenTypeSolidColor)
320         {
321             return WrongState;
322         }
323 
324         ARGB argb;
325 
326         SetStatus(DllExports::GdipGetPenColor(nativePen,
327                                               &argb));
328         if (lastResult == Ok)
329         {
330             color->SetValue(argb);
331         }
332 
333         return lastResult;
334     }
335 
GetBrush()336     Brush* GetBrush() const
337     {
338        PenType type = GetPenType();
339 
340        Brush* brush = NULL;
341 
342        switch(type)
343        {
344        case PenTypeSolidColor:
345            brush = new SolidBrush();
346            break;
347 
348        case PenTypeHatchFill:
349            brush = new HatchBrush();
350            break;
351 
352        case PenTypeTextureFill:
353            brush = new TextureBrush();
354            break;
355 
356        case PenTypePathGradient:
357            brush = new Brush();
358            break;
359 
360        case PenTypeLinearGradient:
361            brush = new LinearGradientBrush();
362            break;
363 
364        default:
365            break;
366        }
367 
368        if(brush)
369        {
370            GpBrush* nativeBrush;
371 
372            SetStatus(DllExports::GdipGetPenBrushFill(nativePen, &nativeBrush));
373            brush->SetNativeBrush(nativeBrush);
374        }
375 
376        return brush;
377     }
378 
GetDashStyle()379     DashStyle GetDashStyle() const
380     {
381         DashStyle dashStyle;
382 
383         SetStatus(DllExports::GdipGetPenDashStyle(nativePen, &dashStyle));
384 
385         return dashStyle;
386     }
387 
SetDashStyle(IN DashStyle dashStyle)388     Status SetDashStyle(IN DashStyle dashStyle)
389     {
390         return SetStatus(DllExports::GdipSetPenDashStyle(nativePen, dashStyle));
391     }
392 
GetDashOffset()393     REAL GetDashOffset() const
394     {
395         REAL dashOffset;
396 
397         SetStatus(DllExports::GdipGetPenDashOffset(nativePen, &dashOffset));
398 
399         return dashOffset;
400     }
401 
SetDashOffset(IN REAL dashOffset)402     Status SetDashOffset(IN REAL dashOffset)
403     {
404         return SetStatus(DllExports::GdipSetPenDashOffset(nativePen, dashOffset));
405     }
406 
SetDashPattern(IN const REAL * dashArray,IN INT count)407     Status SetDashPattern(IN const REAL* dashArray, IN INT count)
408     {
409         return SetStatus(DllExports::GdipSetPenDashArray(nativePen, dashArray,
410                                                     count));
411     }
412 
GetDashPatternCount()413     INT GetDashPatternCount() const
414     {
415         INT count = 0;
416 
417         SetStatus(DllExports::GdipGetPenDashCount(nativePen, &count));
418 
419         return count;
420     }
421 
GetDashPattern(OUT REAL * dashArray,IN INT count)422     Status GetDashPattern(OUT REAL* dashArray,
423                           IN INT count) const
424     {
425         if (dashArray == NULL || count <= 0)
426             return SetStatus(InvalidParameter);
427 
428         return SetStatus(DllExports::GdipGetPenDashArray(nativePen,
429                                                          dashArray,
430                                                          count));
431     }
432 
SetCompoundArray(IN const REAL * compoundArray,IN INT count)433     Status SetCompoundArray(IN const REAL* compoundArray,
434                             IN INT count)
435     {
436         return SetStatus(DllExports::GdipSetPenCompoundArray(nativePen, compoundArray,
437                                                     count));
438     }
439 
GetCompoundArrayCount()440     INT GetCompoundArrayCount() const
441     {
442         INT count = 0;
443 
444         SetStatus(DllExports::GdipGetPenCompoundCount(nativePen, &count));
445 
446         return count;
447     }
448 
GetCompoundArray(OUT REAL * compoundArray,IN INT count)449     Status GetCompoundArray(OUT REAL* compoundArray,
450                             IN INT count) const
451     {
452         if (compoundArray == NULL || count <= 0)
453             return SetStatus(InvalidParameter);
454 
455         return SetStatus(DllExports::GdipGetPenCompoundArray(nativePen,
456                                                              compoundArray,
457                                                              count));
458     }
459 
GetLastStatus()460     Status GetLastStatus() const
461     {
462         Status lastStatus = lastResult;
463         lastResult = Ok;
464 
465         return lastStatus;
466     }
467 
468 protected:
469 
470 #ifdef DCR_USE_NEW_250932
471 
472 private:
473     Pen(const Pen &);
474     Pen& operator=(const Pen &);
475 protected:
476 
477 #else
478 
479     Pen(const Pen& pen)
480     {
481         pen;
482         SetStatus(NotImplemented);
483         SetNativePen(NULL);
484     }
485 
486     Pen& operator=(const Pen& pen)
487     {
488         pen;
489         SetStatus(NotImplemented);
490         return *this;
491     }
492 
493 #endif
494 
Pen(GpPen * nativePen,Status status)495     Pen(GpPen* nativePen, Status status)
496     {
497         lastResult = status;
498         SetNativePen(nativePen);
499     }
500 
SetNativePen(GpPen * nativePen)501     VOID SetNativePen(GpPen* nativePen)
502     {
503         this->nativePen = nativePen;
504     }
505 
SetStatus(Status status)506     Status SetStatus(Status status) const
507     {
508         if (status != Ok)
509             return (lastResult = status);
510         else
511             return status;
512     }
513 
514 protected:
515     GpPen* nativePen;
516     mutable Status lastResult;
517 };
518 
519 #endif
520