1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/cocoa/pen.mm
4 // Author: David Elliott
8 // Copyright: (c) 2003 David Elliott
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
14 #include "wx/bitmap.h"
15 #include "wx/colour.h"
17 #import <AppKit/NSColor.h>
19 // ========================================================================
21 // ========================================================================
22 class WXDLLEXPORT wxPenRefData: public wxGDIRefData
24 friend class WXDLLEXPORT wxPen;
26 wxPenRefData(const wxColour& colour = wxNullColour,
27 int width = 1, int style = wxSOLID,
28 const wxBitmap& stipple = wxNullBitmap);
29 wxPenRefData(const wxPenRefData& data);
30 ~wxPenRefData() { Free(); }
32 void SetWidth(int Width) { m_width = Width; }
33 void SetStyle(int Style) { m_style = Style; }
34 void SetJoin(int Join) { m_join = Join; }
35 void SetCap(int Cap) { m_cap = Cap; }
36 void SetColour(const wxColour& col) { Free(); m_colour = col; }
37 void SetDashes(int nb_dashes, const wxDash *Dash)
40 m_dash = (wxDash *)Dash;
42 void SetStipple(const wxBitmap& Stipple)
48 WX_NSColor GetNSColor();
60 WX_NSColor m_cocoaNSColor;
62 // Don't allow assignment
63 wxPenRefData& operator=(const wxPenRefData& data);
66 #define M_PENDATA ((wxPenRefData *)m_refData)
68 inline wxPenRefData::wxPenRefData(const wxColour& colour,
69 int width, int style, const wxBitmap& stipple)
73 m_join = wxJOIN_ROUND;
82 inline wxPenRefData::wxPenRefData(const wxPenRefData& data)
84 m_width = data.m_width;
85 m_style = data.m_style;
88 m_colour = data.m_colour;
89 m_nbDash = data.m_nbDash;
91 m_stipple = data.m_stipple;
92 m_cocoaNSColor = [data.m_cocoaNSColor retain];
95 inline void wxPenRefData::Free()
97 [m_cocoaNSColor release];
101 inline WX_NSColor wxPenRefData::GetNSColor()
108 m_cocoaNSColor = [[NSColor clearColor] retain];
111 // wxBitmap isn't implemented yet
112 // m_cocoaNSColor = [[NSColor colorWithPatternImage: m_stipple.GetNSImage()] retain];
114 // The hatch brushes are going to be tricky
115 case wxBDIAGONAL_HATCH:
116 case wxCROSSDIAG_HATCH:
117 case wxFDIAGONAL_HATCH:
119 case wxHORIZONTAL_HATCH:
120 case wxVERTICAL_HATCH:
122 // Dot/dashed pens use solid colors
129 NSColor *colour_NSColor = m_colour.GetNSColor();
131 colour_NSColor = [NSColor clearColor];
132 m_cocoaNSColor = [colour_NSColor copyWithZone:nil];
136 return m_cocoaNSColor;
139 // ========================================================================
141 // ========================================================================
142 IMPLEMENT_DYNAMIC_CLASS(wxPen, wxGDIObject)
152 // Should implement Create
153 wxPen::wxPen(const wxColour& colour, int width, int style)
155 m_refData = new wxPenRefData(colour,width,style);
158 wxPen::wxPen(const wxBitmap& stipple, int width)
160 m_refData = new wxPenRefData(wxNullColour,width,wxSTIPPLE,stipple);
163 wxObjectRefData *wxPen::CreateRefData() const
165 return new wxPenRefData;
168 wxObjectRefData *wxPen::CloneRefData(const wxObjectRefData *data) const
170 return new wxPenRefData(*(wxPenRefData *)data);
173 void wxPen::SetWidth(int Width)
176 M_PENDATA->SetWidth(Width);
179 void wxPen::SetStyle(int Style)
182 M_PENDATA->SetStyle(Style);
185 void wxPen::SetJoin(int Join)
188 M_PENDATA->SetJoin(Join);
191 void wxPen::SetCap(int Cap)
194 M_PENDATA->SetCap(Cap);
197 void wxPen::SetColour(const wxColour& col)
200 M_PENDATA->SetColour(col);
203 void wxPen::SetColour(unsigned char r, unsigned char g, unsigned char b)
206 M_PENDATA->SetColour(wxColour(r, g, b));
209 void wxPen::SetDashes(int nb_dashes, const wxDash *Dash)
212 M_PENDATA->SetDashes(nb_dashes, Dash);
215 void wxPen::SetStipple(const wxBitmap& Stipple)
218 M_PENDATA->SetStipple(Stipple);
221 wxColour& wxPen::GetColour() const
223 return (M_PENDATA ? M_PENDATA->m_colour : wxNullColour);
226 int wxPen::GetWidth() const
228 return (M_PENDATA ? M_PENDATA->m_width : 0);
231 int wxPen::GetStyle() const
233 return (M_PENDATA ? M_PENDATA->m_style : 0);
236 int wxPen::GetJoin() const
238 return (M_PENDATA ? M_PENDATA->m_join : 0);
241 int wxPen::GetCap() const
243 return (M_PENDATA ? M_PENDATA->m_cap : 0);
246 int wxPen::GetDashes(wxDash **ptr) const
248 *ptr = (M_PENDATA ? M_PENDATA->m_dash : (wxDash*) NULL); return (M_PENDATA ? M_PENDATA->m_nbDash : 0);
251 wxBitmap *wxPen::GetStipple() const
253 return (M_PENDATA ? (& M_PENDATA->m_stipple) : (wxBitmap*) NULL);
256 WX_NSColor wxPen::GetNSColor()
258 return (M_PENDATA ? M_PENDATA->GetNSColor() : nil);