1/**************************************************************************\
2*
3* Copyright (c) 2000, Microsoft Corp.  All Rights Reserved.
4*
5* Module Name:
6*
7*    GdiplusLineCaps.h
8*
9* Abstract:
10*
11*   APIs for Custom Line Caps
12*
13\**************************************************************************/
14
15#ifndef _GDIPLUSLINECAPS_H
16#define _GDIPLUSLINECAPS_H
17
18inline
19CustomLineCap::CustomLineCap(
20    IN const GraphicsPath* fillPath,
21    IN const GraphicsPath* strokePath,
22    IN LineCap baseCap,
23    IN REAL baseInset
24    )
25{
26    nativeCap = NULL;
27    GpPath* nativeFillPath = NULL;
28    GpPath* nativeStrokePath = NULL;
29
30    if(fillPath)
31        nativeFillPath = fillPath->nativePath;
32    if(strokePath)
33        nativeStrokePath = strokePath->nativePath;
34
35    lastResult = DllExports::GdipCreateCustomLineCap(
36                    nativeFillPath, nativeStrokePath,
37                    baseCap, baseInset, &nativeCap);
38}
39
40inline
41CustomLineCap::CustomLineCap()
42{
43    // This is used for default constructor for subclasses.
44    // So don't create a nativeCap.
45
46    nativeCap = NULL;
47    lastResult = Ok;
48}
49
50inline
51CustomLineCap::~CustomLineCap()
52{
53    DllExports::GdipDeleteCustomLineCap(nativeCap);
54}
55
56inline Status
57CustomLineCap::SetStrokeCaps(
58    IN LineCap startCap,
59    IN LineCap endCap)
60{
61    return SetStatus(DllExports::GdipSetCustomLineCapStrokeCaps(nativeCap,
62                startCap, endCap));
63}
64
65inline Status
66CustomLineCap::GetStrokeCaps(
67    OUT LineCap* startCap,
68    OUT LineCap* endCap) const
69{
70    return SetStatus(DllExports::GdipGetCustomLineCapStrokeCaps(nativeCap,
71                 startCap, endCap));
72}
73
74inline Status
75CustomLineCap::SetStrokeJoin(
76    IN LineJoin lineJoin)
77{
78    return SetStatus(DllExports::GdipSetCustomLineCapStrokeJoin(nativeCap, lineJoin));
79}
80
81inline LineJoin
82CustomLineCap::GetStrokeJoin() const
83{
84    LineJoin lineJoin;
85
86    SetStatus(DllExports::GdipGetCustomLineCapStrokeJoin(nativeCap, &lineJoin));
87
88    return lineJoin;
89}
90
91inline Status
92CustomLineCap::SetBaseCap(IN LineCap baseCap)
93{
94    return SetStatus(DllExports::GdipSetCustomLineCapBaseCap(nativeCap, baseCap));
95}
96
97inline LineCap
98CustomLineCap::GetBaseCap() const
99{
100    LineCap baseCap;
101    SetStatus(DllExports::GdipGetCustomLineCapBaseCap(nativeCap, &baseCap));
102
103    return baseCap;
104}
105
106inline Status
107CustomLineCap::SetBaseInset(IN REAL inset)
108{
109    return SetStatus(DllExports::GdipSetCustomLineCapBaseInset(nativeCap, inset));
110}
111
112inline REAL
113CustomLineCap::GetBaseInset() const
114{
115    REAL inset;
116    SetStatus(DllExports::GdipGetCustomLineCapBaseInset(nativeCap, &inset));
117
118    return inset;
119}
120
121
122inline Status
123CustomLineCap::SetWidthScale(IN REAL widthScale)
124{
125    return SetStatus(DllExports::GdipSetCustomLineCapWidthScale(nativeCap, widthScale));
126}
127
128inline REAL
129CustomLineCap::GetWidthScale() const
130{
131    REAL widthScale;
132    SetStatus(DllExports::GdipGetCustomLineCapWidthScale(nativeCap, &widthScale));
133
134    return widthScale;
135}
136
137inline CustomLineCap*
138CustomLineCap::Clone() const
139{
140    GpCustomLineCap *newNativeLineCap = NULL;
141
142    SetStatus(DllExports::GdipCloneCustomLineCap(nativeCap, &newNativeLineCap));
143
144    if (lastResult == Ok)
145    {
146        CustomLineCap *newLineCap = new CustomLineCap(newNativeLineCap, lastResult);
147        if (newLineCap == NULL)
148        {
149            SetStatus(DllExports::GdipDeleteCustomLineCap(newNativeLineCap));
150        }
151
152        return newLineCap;
153    }
154
155    return NULL;
156}
157
158class AdjustableArrowCap : public CustomLineCap
159{
160public:
161
162    AdjustableArrowCap(
163        IN REAL height,
164        IN REAL width,
165        IN BOOL isFilled = TRUE
166        )
167    {
168        GpAdjustableArrowCap* cap = NULL;
169
170        lastResult = DllExports::GdipCreateAdjustableArrowCap(
171                        height, width, isFilled, &cap);
172        SetNativeCap(cap);
173    }
174
175    Status SetHeight(IN REAL height)
176    {
177        GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
178        return SetStatus(DllExports::GdipSetAdjustableArrowCapHeight(
179                            cap, height));
180    }
181
182    REAL GetHeight() const
183    {
184        GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
185        REAL height;
186        SetStatus(DllExports::GdipGetAdjustableArrowCapHeight(
187                            cap, &height));
188
189        return height;
190    }
191
192    Status SetWidth(IN REAL width)
193    {
194        GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
195        return SetStatus(DllExports::GdipSetAdjustableArrowCapWidth(
196                            cap, width));
197    }
198
199    REAL GetWidth() const
200    {
201        GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
202        REAL width;
203        SetStatus(DllExports::GdipGetAdjustableArrowCapWidth(
204                            cap, &width));
205
206        return width;
207    }
208
209    Status SetMiddleInset(IN REAL middleInset)
210    {
211        GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
212        return SetStatus(DllExports::GdipSetAdjustableArrowCapMiddleInset(
213                            cap, middleInset));
214    }
215
216    REAL GetMiddleInset() const
217    {
218        GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
219        REAL middleInset;
220        SetStatus(DllExports::GdipGetAdjustableArrowCapMiddleInset(
221                            cap, &middleInset));
222
223        return middleInset;
224    }
225
226    Status SetFillState(IN BOOL isFilled)
227    {
228        GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
229        return SetStatus(DllExports::GdipSetAdjustableArrowCapFillState(
230                            cap, isFilled));
231    }
232
233    BOOL IsFilled() const
234    {
235        GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
236        BOOL isFilled;
237        SetStatus(DllExports::GdipGetAdjustableArrowCapFillState(
238                            cap, &isFilled));
239
240        return isFilled;
241    }
242
243#ifdef DCR_USE_NEW_250932
244
245private:
246    AdjustableArrowCap(const AdjustableArrowCap &);
247    AdjustableArrowCap& operator=(const AdjustableArrowCap &);
248
249#endif
250
251};
252
253#endif
254