]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/pen.cpp
Ensure there is valid context for DrawRectangle
[wxWidgets.git] / src / msw / pen.cpp
index 9df28c6731a3099d7deebfe97d81391690c26000..518e4d91e0d60dd4692995c1ed59a29708ead66f 100644 (file)
@@ -52,7 +52,7 @@ public:
 
     wxPenRefData();
     wxPenRefData(const wxPenRefData& data);
-    wxPenRefData(const wxColour& col, int width, int style);
+    wxPenRefData(const wxColour& col, int width, wxPenStyle style);
     wxPenRefData(const wxBitmap& stipple, int width);
     virtual ~wxPenRefData();
 
@@ -64,8 +64,8 @@ public:
                m_join == data.m_join &&
                m_cap == data.m_cap &&
                m_colour == data.m_colour &&
-               (m_style != wxSTIPPLE || m_stipple.IsSameAs(data.m_stipple)) &&
-               (m_style != wxUSER_DASH ||
+               (m_style != wxPENSTYLE_STIPPLE || m_stipple.IsSameAs(data.m_stipple)) &&
+               (m_style != wxPENSTYLE_USER_DASH ||
                 (m_nbDash == data.m_nbDash &&
                     memcmp(m_dash, data.m_dash, m_nbDash*sizeof(wxDash)) == 0));
     }
@@ -74,23 +74,23 @@ public:
     // accessors and setters
     // ---------------------
 
-    wxColour& GetColour() const { return wx_const_cast(wxColour&, m_colour); }
+    wxColour& GetColour() const { return const_cast<wxColour&>(m_colour); }
     int GetWidth() const { return m_width; }
-    int GetStyle() const { return m_style; }
-    int GetJoin() const { return m_join; }
-    int GetCap() const { return m_cap; }
+    wxPenStyle GetStyle() const { return m_style; }
+    wxPenJoin GetJoin() const { return m_join; }
+    wxPenCap GetCap() const { return m_cap; }
     wxDash* GetDash() const { return m_dash; }
     int GetDashCount() const { return m_nbDash; }
-    wxBitmap* GetStipple() const { return wx_const_cast(wxBitmap *, &m_stipple); }
+    wxBitmap* GetStipple() const { return const_cast<wxBitmap *>(&m_stipple); }
 
     void SetColour(const wxColour& col) { Free(); m_colour = col; }
     void SetWidth(int width) { Free(); m_width = width; }
-    void SetStyle(int style) { Free(); m_style = style; }
+    void SetStyle(wxPenStyle style) { Free(); m_style = style; }
     void SetStipple(const wxBitmap& stipple)
     {
         Free();
 
-        m_style = wxSTIPPLE;
+        m_style = wxPENSTYLE_STIPPLE;
         m_stipple = stipple;
     }
 
@@ -99,11 +99,11 @@ public:
         Free();
 
         m_nbDash = nb_dashes;
-        m_dash = wx_const_cast(wxDash *, dash);
+        m_dash = const_cast<wxDash *>(dash);
     }
 
-    void SetJoin(int join) { Free(); m_join = join; }
-    void SetCap(int cap) { Free(); m_cap = cap; }
+    void SetJoin(wxPenJoin join) { Free(); m_join = join; }
+    void SetCap(wxPenCap cap) { Free(); m_cap = cap; }
 
 
     // HPEN management
@@ -135,16 +135,16 @@ private:
     }
 
     int           m_width;
-    int           m_style;
-    int           m_join;
-    int           m_cap;
+    wxPenStyle    m_style;
+    wxPenJoin     m_join;
+    wxPenCap      m_cap;
     wxBitmap      m_stipple;
     int           m_nbDash;
     wxDash *      m_dash;
     wxColour      m_colour;
     HPEN          m_hPen;
 
-    DECLARE_NO_ASSIGN_CLASS(wxPenRefData)
+    wxDECLARE_NO_ASSIGN_CLASS(wxPenRefData);
 };
 
 // ============================================================================
@@ -159,7 +159,7 @@ wxPenRefData::wxPenRefData()
 {
     Init();
 
-    m_style = wxSOLID;
+    m_style = wxPENSTYLE_SOLID;
     m_width = 1;
 }
 
@@ -176,7 +176,7 @@ wxPenRefData::wxPenRefData(const wxPenRefData& data)
     m_hPen = 0;
 }
 
-wxPenRefData::wxPenRefData(const wxColour& col, int width, int style)
+wxPenRefData::wxPenRefData(const wxColour& col, int width, wxPenStyle style)
 {
     Init();
 
@@ -190,7 +190,7 @@ wxPenRefData::wxPenRefData(const wxBitmap& stipple, int width)
 {
     Init();
 
-    m_style = wxSTIPPLE;
+    m_style = wxPENSTYLE_STIPPLE;
     m_width = width;
 
     m_stipple = stipple;
@@ -206,39 +206,39 @@ wxPenRefData::~wxPenRefData()
 // wxPenRefData HPEN management
 // ----------------------------------------------------------------------------
 
-static int ConvertPenStyle(int style)
+static int ConvertPenStyle(wxPenStyle style)
 {
     switch ( style )
     {
-        case wxSHORT_DASH:
-        case wxLONG_DASH:
+        case wxPENSTYLE_SHORT_DASH:
+        case wxPENSTYLE_LONG_DASH:
             return PS_DASH;
 
-        case wxTRANSPARENT:
+        case wxPENSTYLE_TRANSPARENT:
             return PS_NULL;
 
         default:
-            wxFAIL_MSG( _T("unknown pen style") );
+            wxFAIL_MSG( wxT("unknown pen style") );
             // fall through
 
 #ifdef wxHAVE_EXT_CREATE_PEN
-        case wxDOT:
+        case wxPENSTYLE_DOT:
             return PS_DOT;
 
-        case wxDOT_DASH:
+        case wxPENSTYLE_DOT_DASH:
             return PS_DASHDOT;
 
-        case wxUSER_DASH:
+        case wxPENSTYLE_USER_DASH:
             return PS_USERSTYLE;
 
-        case wxSTIPPLE:
-        case wxBDIAGONAL_HATCH:
-        case wxCROSSDIAG_HATCH:
-        case wxFDIAGONAL_HATCH:
-        case wxCROSS_HATCH:
-        case wxHORIZONTAL_HATCH:
-        case wxVERTICAL_HATCH:
-        case wxSOLID:
+        case wxPENSTYLE_STIPPLE:
+        case wxPENSTYLE_BDIAGONAL_HATCH:
+        case wxPENSTYLE_CROSSDIAG_HATCH:
+        case wxPENSTYLE_FDIAGONAL_HATCH:
+        case wxPENSTYLE_CROSS_HATCH:
+        case wxPENSTYLE_HORIZONTAL_HATCH:
+        case wxPENSTYLE_VERTICAL_HATCH:
+        case wxPENSTYLE_SOLID:
 #endif // wxHAVE_EXT_CREATE_PEN
 
             return PS_SOLID;
@@ -247,7 +247,7 @@ static int ConvertPenStyle(int style)
 
 #ifdef wxHAVE_EXT_CREATE_PEN
 
-static int ConvertJoinStyle(int join)
+static int ConvertJoinStyle(wxPenJoin join)
 {
     switch( join )
     {
@@ -258,7 +258,7 @@ static int ConvertJoinStyle(int join)
             return PS_JOIN_MITER;
 
         default:
-            wxFAIL_MSG( _T("unknown pen join style") );
+            wxFAIL_MSG( wxT("unknown pen join style") );
             // fall through
 
         case wxJOIN_ROUND:
@@ -266,7 +266,7 @@ static int ConvertJoinStyle(int join)
     }
 }
 
-static int ConvertCapStyle(int cap)
+static int ConvertCapStyle(wxPenCap cap)
 {
     switch ( cap )
     {
@@ -277,7 +277,7 @@ static int ConvertCapStyle(int cap)
             return PS_ENDCAP_FLAT;
 
         default:
-            wxFAIL_MSG( _T("unknown pen cap style") );
+            wxFAIL_MSG( wxT("unknown pen cap style") );
             // fall through
 
         case wxCAP_ROUND:
@@ -292,7 +292,7 @@ bool wxPenRefData::Alloc()
    if ( m_hPen )
        return false;
 
-   if ( m_style == wxTRANSPARENT )
+   if ( m_style == wxPENSTYLE_TRANSPARENT )
    {
        m_hPen = (HPEN)::GetStockObject(NULL_PEN);
        return true;
@@ -304,11 +304,11 @@ bool wxPenRefData::Alloc()
    // Only NT can display dashed or dotted lines with width > 1
    static const int os = wxGetOsVersion();
    if ( os != wxOS_WINDOWS_NT &&
-           (m_style == wxDOT ||
-            m_style == wxLONG_DASH ||
-            m_style == wxSHORT_DASH ||
-            m_style == wxDOT_DASH ||
-            m_style == wxUSER_DASH) &&
+           (m_style == wxPENSTYLE_DOT ||
+            m_style == wxPENSTYLE_LONG_DASH ||
+            m_style == wxPENSTYLE_SHORT_DASH ||
+            m_style == wxPENSTYLE_DOT_DASH ||
+            m_style == wxPENSTYLE_USER_DASH) &&
             m_width > 1 )
    {
        m_width = 1;
@@ -318,9 +318,9 @@ bool wxPenRefData::Alloc()
    // CreatePen()
    if ( m_join == wxJOIN_ROUND &&
             m_cap == wxCAP_ROUND &&
-                m_style != wxUSER_DASH &&
-                    m_style != wxSTIPPLE &&
-                        (m_width <= 1 || m_style == wxSOLID) )
+                m_style != wxPENSTYLE_USER_DASH &&
+                    m_style != wxPENSTYLE_STIPPLE &&
+                        (m_width <= 1 || m_style == wxPENSTYLE_SOLID) )
 #endif // !wxHAVE_EXT_CREATE_PEN
    {
        m_hPen = ::CreatePen(ConvertPenStyle(m_style), m_width, col);
@@ -336,55 +336,53 @@ bool wxPenRefData::Alloc()
        LOGBRUSH lb;
        switch( m_style )
        {
-           case wxSTIPPLE:
+           case wxPENSTYLE_STIPPLE:
                lb.lbStyle = BS_PATTERN;
-               lb.lbHatch = (LONG)m_stipple.GetHBITMAP();
+               lb.lbHatch = wxPtrToUInt(m_stipple.GetHBITMAP());
                break;
 
-           case wxBDIAGONAL_HATCH:
+           case wxPENSTYLE_BDIAGONAL_HATCH:
                lb.lbStyle = BS_HATCHED;
                lb.lbHatch = HS_BDIAGONAL;
                break;
 
-           case wxCROSSDIAG_HATCH:
+           case wxPENSTYLE_CROSSDIAG_HATCH:
                lb.lbStyle = BS_HATCHED;
                lb.lbHatch = HS_DIAGCROSS;
                break;
 
-           case wxFDIAGONAL_HATCH:
+           case wxPENSTYLE_FDIAGONAL_HATCH:
                lb.lbStyle = BS_HATCHED;
                lb.lbHatch = HS_FDIAGONAL;
                break;
 
-           case wxCROSS_HATCH:
+           case wxPENSTYLE_CROSS_HATCH:
                lb.lbStyle = BS_HATCHED;
                lb.lbHatch = HS_CROSS;
                break;
 
-           case wxHORIZONTAL_HATCH:
+           case wxPENSTYLE_HORIZONTAL_HATCH:
                lb.lbStyle = BS_HATCHED;
                lb.lbHatch = HS_HORIZONTAL;
                break;
 
-           case wxVERTICAL_HATCH:
+           case wxPENSTYLE_VERTICAL_HATCH:
                lb.lbStyle = BS_HATCHED;
                lb.lbHatch = HS_VERTICAL;
                break;
 
            default:
                lb.lbStyle = BS_SOLID;
-#ifdef __WXDEBUG__
                // this should be unnecessary (it's unused) but suppresses the
                // Purify messages about uninitialized memory read
                lb.lbHatch = 0;
-#endif
                break;
        }
 
        lb.lbColor = col;
 
        DWORD *dash;
-       if ( m_style == wxUSER_DASH && m_nbDash && m_dash )
+       if ( m_style == wxPENSTYLE_USER_DASH && m_nbDash && m_dash )
        {
            dash = new DWORD[m_nbDash];
            int rw = m_width > 1 ? m_width : 1;
@@ -419,7 +417,7 @@ bool wxPenRefData::Free()
 WXHPEN wxPenRefData::GetHPEN() const
 {
     if ( !m_hPen )
-        wx_const_cast(wxPenRefData *, this)->Alloc();
+        const_cast<wxPenRefData *>(this)->Alloc();
 
     return (WXHPEN)m_hPen;
 }
@@ -430,11 +428,18 @@ WXHPEN wxPenRefData::GetHPEN() const
 
 IMPLEMENT_DYNAMIC_CLASS(wxPen, wxGDIObject)
 
-wxPen::wxPen(const wxColour& col, int width, int style)
+wxPen::wxPen(const wxColour& col, int width, wxPenStyle style)
 {
     m_refData = new wxPenRefData(col, width, style);
 }
 
+#if FUTURE_WXWIN_COMPATIBILITY_3_0
+wxPen::wxPen(const wxColour& colour, int width, int style)
+{
+    m_refData = new wxPenRefData(colour, width, (wxPenStyle)style);
+}
+#endif
+
 wxPen::wxPen(const wxBitmap& stipple, int width)
 {
     m_refData = new wxPenRefData(stipple, width);
@@ -443,7 +448,7 @@ wxPen::wxPen(const wxBitmap& stipple, int width)
 bool wxPen::operator==(const wxPen& pen) const
 {
     const wxPenRefData *
-        penData = wx_static_cast(const wxPenRefData *, pen.m_refData);
+        penData = static_cast<const wxPenRefData *>(pen.m_refData);
 
     // an invalid pen is only equal to another invalid pen
     return m_refData ? penData && *M_PENDATA == *penData : !penData;
@@ -476,7 +481,7 @@ wxGDIRefData* wxPen::CreateGDIRefData() const
 
 wxGDIRefData* wxPen::CloneGDIRefData(const wxGDIRefData* data) const
 {
-    return new wxPenRefData(*wx_static_cast(const wxPenRefData*, data));
+    return new wxPenRefData(*static_cast<const wxPenRefData*>(data));
 }
 
 void wxPen::SetColour(const wxColour& col)
@@ -498,7 +503,7 @@ void wxPen::SetWidth(int width)
     M_PENDATA->SetWidth(width);
 }
 
-void wxPen::SetStyle(int style)
+void wxPen::SetStyle(wxPenStyle style)
 {
     AllocExclusive();
 
@@ -519,52 +524,58 @@ void wxPen::SetDashes(int nb_dashes, const wxDash *dash)
     M_PENDATA->SetDashes(nb_dashes, dash);
 }
 
-void wxPen::SetJoin(int join)
+void wxPen::SetJoin(wxPenJoin join)
 {
     AllocExclusive();
 
     M_PENDATA->SetJoin(join);
 }
 
-void wxPen::SetCap(int cap)
+void wxPen::SetCap(wxPenCap cap)
 {
     AllocExclusive();
 
     M_PENDATA->SetCap(cap);
 }
 
-wxColour& wxPen::GetColour() const
+wxColour wxPen::GetColour() const
 {
-    return m_refData ? M_PENDATA->GetColour() : wxNullColour;
+    wxCHECK_MSG( IsOk(), wxNullColour, wxT("invalid pen") );
+
+    return M_PENDATA->GetColour();
 }
 
 int wxPen::GetWidth() const
 {
-    return m_refData ? M_PENDATA->GetWidth() : 0;
+    wxCHECK_MSG( IsOk(), -1, wxT("invalid pen") );
+
+    return M_PENDATA->GetWidth();
 }
 
-int wxPen::GetStyle() const
+wxPenStyle wxPen::GetStyle() const
 {
-    return m_refData ? M_PENDATA->GetStyle() : 0;
+    wxCHECK_MSG( IsOk(), wxPENSTYLE_INVALID, wxT("invalid pen") );
+
+    return M_PENDATA->GetStyle();
 }
 
-int wxPen::GetJoin() const
+wxPenJoin wxPen::GetJoin() const
 {
-    return m_refData ? M_PENDATA->GetJoin() : 0;
+    wxCHECK_MSG( IsOk(), wxJOIN_INVALID, wxT("invalid pen") );
+
+    return M_PENDATA->GetJoin();
 }
 
-int wxPen::GetCap() const
+wxPenCap wxPen::GetCap() const
 {
-    return m_refData ? M_PENDATA->GetCap() : 0;
+    wxCHECK_MSG( IsOk(), wxCAP_INVALID, wxT("invalid pen") );
+
+    return M_PENDATA->GetCap();
 }
 
 int wxPen::GetDashes(wxDash** ptr) const
 {
-    if ( !m_refData )
-    {
-        *ptr = NULL;
-        return 0;
-    }
+    wxCHECK_MSG( IsOk(), -1, wxT("invalid pen") );
 
     *ptr = M_PENDATA->GetDash();
     return M_PENDATA->GetDashCount();
@@ -572,15 +583,21 @@ int wxPen::GetDashes(wxDash** ptr) const
 
 wxDash* wxPen::GetDash() const
 {
+    wxCHECK_MSG( IsOk(), NULL, wxT("invalid pen") );
+
     return m_refData ? M_PENDATA->GetDash() : NULL;
 }
 
 int wxPen::GetDashCount() const
 {
+    wxCHECK_MSG( IsOk(), -1, wxT("invalid pen") );
+
     return m_refData ? M_PENDATA->GetDashCount() : 0;
 }
 
 wxBitmap* wxPen::GetStipple() const
 {
+    wxCHECK_MSG( IsOk(), NULL, wxT("invalid pen") );
+
     return m_refData ? M_PENDATA->GetStipple() : NULL;
 }