]> git.saurik.com Git - wxWidgets.git/blame - src/osx/pen.cpp
wxRTC: save and load the 'shown' status in case there's a situation where layout...
[wxWidgets.git] / src / osx / pen.cpp
CommitLineData
ad66316f 1/////////////////////////////////////////////////////////////////////////////
96dabe43 2// Name: src/osx/pen.cpp
ad66316f
SC
3// Purpose: wxPen
4// Author: Stefan Csomor
5// Modified by:
6// Created: 1998-01-01
ad66316f
SC
7// Copyright: (c) Stefan Csomor
8// Licence: wxWindows licence
9/////////////////////////////////////////////////////////////////////////////
10
11#include "wx/wxprec.h"
12
13#include "wx/pen.h"
14
15#ifndef WX_PRECOMP
16 #include "wx/utils.h"
17#endif
18
19IMPLEMENT_DYNAMIC_CLASS(wxPen, wxGDIObject)
20
21class WXDLLEXPORT wxPenRefData : public wxGDIRefData
22{
23public:
24 wxPenRefData();
25 wxPenRefData(const wxPenRefData& data);
26 virtual ~wxPenRefData();
27
28 wxPenRefData& operator=(const wxPenRefData& data);
29
30 bool operator==(const wxPenRefData& data) const
31 {
32 // we intentionally don't compare m_hPen fields here
33 return m_style == data.m_style &&
34 m_width == data.m_width &&
35 m_join == data.m_join &&
36 m_cap == data.m_cap &&
37 m_colour == data.m_colour &&
38 (m_style != wxPENSTYLE_STIPPLE || m_stipple.IsSameAs(data.m_stipple)) &&
39 (m_style != wxPENSTYLE_USER_DASH ||
40 (m_nbDash == data.m_nbDash &&
41 memcmp(m_dash, data.m_dash, m_nbDash*sizeof(wxDash)) == 0));
42 }
43
44protected:
45 int m_width;
46 wxPenStyle m_style;
47 wxPenJoin m_join ;
48 wxPenCap m_cap ;
49 wxBitmap m_stipple ;
50 int m_nbDash ;
51 wxDash * m_dash ;
52 wxColour m_colour;
53 /* TODO: implementation
54 WXHPEN m_hPen;
55 */
56
57 friend class WXDLLIMPEXP_FWD_CORE wxPen;
58};
59
60wxPenRefData::wxPenRefData()
61{
62 m_style = wxPENSTYLE_SOLID;
63 m_width = 1;
64 m_join = wxJOIN_ROUND ;
65 m_cap = wxCAP_ROUND ;
66 m_nbDash = 0 ;
67 m_dash = 0 ;
68}
69
70wxPenRefData::wxPenRefData(const wxPenRefData& data)
71: wxGDIRefData()
72{
73 m_style = data.m_style;
74 m_width = data.m_width;
75 m_join = data.m_join;
76 m_cap = data.m_cap;
77 m_nbDash = data.m_nbDash;
78 m_dash = data.m_dash;
79 m_colour = data.m_colour;
80}
81
82wxPenRefData::~wxPenRefData()
83{
84}
85
86// Pens
87
88#define M_PENDATA ((wxPenRefData *)m_refData)
89
90wxPen::wxPen()
91{
92}
93
94wxPen::~wxPen()
95{
96}
97
98// Should implement Create
99wxPen::wxPen(const wxColour& col, int Width, wxPenStyle Style)
100{
101 m_refData = new wxPenRefData;
102
103 M_PENDATA->m_colour = col;
104 M_PENDATA->m_width = Width;
105 M_PENDATA->m_style = Style;
106 M_PENDATA->m_join = wxJOIN_ROUND ;
107 M_PENDATA->m_cap = wxCAP_ROUND ;
108 M_PENDATA->m_nbDash = 0 ;
109 M_PENDATA->m_dash = 0 ;
110
111 RealizeResource();
112}
113
114#if FUTURE_WXWIN_COMPATIBILITY_3_0
115wxPen::wxPen(const wxColour& col, int Width, int Style)
116{
117 m_refData = new wxPenRefData;
118
119 M_PENDATA->m_colour = col;
120 M_PENDATA->m_width = Width;
121 M_PENDATA->m_style = (wxPenStyle)Style;
122 M_PENDATA->m_join = wxJOIN_ROUND ;
123 M_PENDATA->m_cap = wxCAP_ROUND ;
124 M_PENDATA->m_nbDash = 0 ;
125 M_PENDATA->m_dash = 0 ;
126
127 RealizeResource();
128}
129#endif
130
131wxPen::wxPen(const wxBitmap& stipple, int Width)
132{
133 m_refData = new wxPenRefData;
134
135 M_PENDATA->m_stipple = stipple;
136 M_PENDATA->m_width = Width;
137 M_PENDATA->m_style = wxPENSTYLE_STIPPLE;
138 M_PENDATA->m_join = wxJOIN_ROUND ;
139 M_PENDATA->m_cap = wxCAP_ROUND ;
140 M_PENDATA->m_nbDash = 0 ;
141 M_PENDATA->m_dash = 0 ;
142
143 RealizeResource();
144}
145
146wxGDIRefData *wxPen::CreateGDIRefData() const
147{
148 return new wxPenRefData;
149}
150
151wxGDIRefData *wxPen::CloneGDIRefData(const wxGDIRefData *data) const
152{
5c33522f 153 return new wxPenRefData(*static_cast<const wxPenRefData *>(data));
ad66316f
SC
154}
155
156bool wxPen::operator==(const wxPen& pen) const
157{
158 const wxPenRefData *penData = (wxPenRefData *)pen.m_refData;
159
160 // an invalid pen is only equal to another invalid pen
161 return m_refData ? penData && *M_PENDATA == *penData : !penData;
162}
163
164wxColour wxPen::GetColour() const
165{
a1b806b9 166 wxCHECK_MSG( IsOk(), wxNullColour, wxT("invalid pen") );
ad66316f
SC
167
168 return M_PENDATA->m_colour;
169}
170
171int wxPen::GetWidth() const
172{
a1b806b9 173 wxCHECK_MSG( IsOk(), -1, wxT("invalid pen") );
ad66316f
SC
174
175 return M_PENDATA->m_width;
176}
177
178wxPenStyle wxPen::GetStyle() const
179{
a1b806b9 180 wxCHECK_MSG( IsOk(), wxPENSTYLE_INVALID, wxT("invalid pen") );
ad66316f
SC
181
182 return M_PENDATA->m_style;
183}
184
185wxPenJoin wxPen::GetJoin() const
186{
a1b806b9 187 wxCHECK_MSG( IsOk(), wxJOIN_INVALID, wxT("invalid pen") );
ad66316f
SC
188
189 return M_PENDATA->m_join;
190}
191
192wxPenCap wxPen::GetCap() const
193{
a1b806b9 194 wxCHECK_MSG( IsOk(), wxCAP_INVALID, wxT("invalid pen") );
ad66316f
SC
195
196 return M_PENDATA->m_cap;
197}
198
199int wxPen::GetDashes(wxDash **ptr) const
200{
a1b806b9 201 wxCHECK_MSG( IsOk(), -1, wxT("invalid pen") );
ad66316f
SC
202
203 *ptr = M_PENDATA->m_dash;
204 return M_PENDATA->m_nbDash;
205}
206
e2cb366f
KO
207int wxPen::GetDashCount() const
208{
209 return M_PENDATA->m_nbDash;
210}
211
ad66316f
SC
212wxBitmap *wxPen::GetStipple() const
213{
a1b806b9 214 wxCHECK_MSG( IsOk(), NULL, wxT("invalid pen") );
ad66316f
SC
215
216 return &M_PENDATA->m_stipple;
217}
218
219void wxPen::Unshare()
220{
221 // Don't change shared data
222 if (!m_refData)
223 {
224 m_refData = new wxPenRefData();
225 }
226 else
227 {
228 wxPenRefData* ref = new wxPenRefData(*(wxPenRefData*)m_refData);
229 UnRef();
230 m_refData = ref;
231 }
232}
233
234void wxPen::SetColour(const wxColour& col)
235{
236 Unshare();
237
238 M_PENDATA->m_colour = col;
239
240 RealizeResource();
241}
242
243void wxPen::SetColour(unsigned char r, unsigned char g, unsigned char b)
244{
245 Unshare();
246
247 M_PENDATA->m_colour.Set(r, g, b);
248
249 RealizeResource();
250}
251
252void wxPen::SetWidth(int Width)
253{
254 Unshare();
255
256 M_PENDATA->m_width = Width;
257
258 RealizeResource();
259}
260
261void wxPen::SetStyle(wxPenStyle Style)
262{
263 Unshare();
264
265 M_PENDATA->m_style = Style;
266
267 RealizeResource();
268}
269
270void wxPen::SetStipple(const wxBitmap& Stipple)
271{
272 Unshare();
273
274 M_PENDATA->m_stipple = Stipple;
275 M_PENDATA->m_style = wxPENSTYLE_STIPPLE;
276
277 RealizeResource();
278}
279
280void wxPen::SetDashes(int nb_dashes, const wxDash *Dash)
281{
282 Unshare();
283
284 M_PENDATA->m_nbDash = nb_dashes;
285 M_PENDATA->m_dash = (wxDash *)Dash;
286
287 RealizeResource();
288}
289
290void wxPen::SetJoin(wxPenJoin Join)
291{
292 Unshare();
293
294 M_PENDATA->m_join = Join;
295
296 RealizeResource();
297}
298
299void wxPen::SetCap(wxPenCap Cap)
300{
301 Unshare();
302
303 M_PENDATA->m_cap = Cap;
304
305 RealizeResource();
306}
307
308bool wxPen::RealizeResource()
309{
310 // nothing to do here for mac
311 return true;
312}