]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/pen.cpp
fixing osx_carbon
[wxWidgets.git] / src / os2 / pen.cpp
index 5c3ed2e24dcb4d0c12a4b1e753d29a78221ad6df..c1c9f7253ca7159d8d946c3cf4f831e50f6d0e2f 100644 (file)
 #endif
 
 #include "wx/os2/private.h"
-#include "assert.h"
 
-IMPLEMENT_DYNAMIC_CLASS(wxPen, wxGDIObject)
+class WXDLLIMPEXP_FWD_CORE wxPen;
+
+// ----------------------------------------------------------------------------
+// wxPenRefData: contains information about an HPEN and its handle
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxPenRefData: public wxGDIRefData
+{
+    friend class WXDLLIMPEXP_FWD_CORE wxPen;
+public:
+    wxPenRefData();
+    wxPenRefData(const wxPenRefData& rData);
+    wxPenRefData(const wxColour& col, int width, wxPenStyle style);
+    wxPenRefData(const wxBitmap& stipple, int width);
+    virtual ~wxPenRefData();
+
+    bool operator==(const wxPenRefData& data) const
+    {
+        // we intentionally don't compare m_hPen fields here
+        return m_nStyle == data.m_nStyle &&
+               m_nWidth == data.m_nWidth &&
+               m_nJoin == data.m_nJoin &&
+               m_nCap == data.m_nCap &&
+               m_vColour == data.m_vColour &&
+               (m_nStyle != wxPENSTYLE_STIPPLE || m_vStipple.IsSameAs(data.m_vStipple)) &&
+               (m_nStyle != wxPENSTYLE_USER_DASH ||
+                (m_dash == data.m_dash &&
+                    memcmp(m_dash, data.m_dash, m_nbDash*sizeof(wxDash)) == 0));
+    }
+
+private:
+    // initialize the fields which have reasonable default values
+    //
+    // doesn't initialize m_width and m_style which must be initialize in ctor
+    void Init()
+    {
+        m_nJoin = wxJOIN_ROUND;
+        m_nCap = wxCAP_ROUND;
+        m_nbDash = 0;
+        m_dash = NULL;
+        m_hPen = 0;
+    }
+
+    int                             m_nWidth;
+    wxPenStyle                      m_nStyle;
+    wxPenJoin                       m_nJoin;
+    wxPenCap                        m_nCap;
+    wxBitmap                        m_vStipple;
+    int                             m_nbDash;
+    wxDash *                        m_dash;
+    wxColour                        m_vColour;
+    WXHPEN                          m_hPen;// in OS/2 GPI this will be the PS the pen is associated with
+
+    wxDECLARE_NO_ASSIGN_CLASS(wxPenRefData);
+};
+
+#define M_PENDATA ((wxPenRefData *)m_refData)
+
+// ----------------------------------------------------------------------------
+// wxPenRefData ctors/dtor
+// ----------------------------------------------------------------------------
 
 wxPenRefData::wxPenRefData()
 {
+    Init();
+
     m_nStyle  = wxPENSTYLE_SOLID;
     m_nWidth  = 1;
-    m_nJoin   = wxJOIN_ROUND ;
-    m_nCap    = wxCAP_ROUND ;
-    m_nbDash  = 0 ;
-    m_dash    = (wxDash*)NULL;
-    m_hPen    = 0L;
 } // end of wxPenRefData::wxPenRefData
 
 wxPenRefData::wxPenRefData(
@@ -52,36 +108,43 @@ wxPenRefData::wxPenRefData(
     m_hPen    = 0L;
 } // end of wxPenRefData::wxPenRefData
 
-wxPenRefData::~wxPenRefData()
+wxPenRefData::wxPenRefData(const wxColour& col, int width, wxPenStyle style)
 {
-} // end of wxPenRefData::~wxPenRefData
+    Init();
+
+    m_nStyle = style;
+    m_nWidth = width;
+
+    m_vColour = col;
+}
 
-//
-// Pens
-//
-wxPen::wxPen()
+wxPenRefData::wxPenRefData(const wxBitmap& stipple, int width)
 {
-} // end of wxPen::wxPen
+    Init();
+
+    m_nStyle = wxPENSTYLE_STIPPLE;
+    m_nWidth = width;
+
+    m_vStipple = stipple;
+}
 
-wxPen::~wxPen()
+wxPenRefData::~wxPenRefData()
 {
-} // end of wxPen::wxPen
+} // end of wxPenRefData::~wxPenRefData
+
+// ----------------------------------------------------------------------------
+// wxPen
+// ----------------------------------------------------------------------------
+
+IMPLEMENT_DYNAMIC_CLASS(wxPen, wxGDIObject)
 
-// Should implement Create
 wxPen::wxPen(
   const wxColour&                   rColour
 , int                               nWidth
 , wxPenStyle                        nStyle
 )
 {
-    m_refData = new wxPenRefData;
-
-    M_PENDATA->m_vColour = rColour;
-    M_PENDATA->m_nWidth  = nWidth;
-    M_PENDATA->m_nStyle  = nStyle;
-    M_PENDATA->m_nJoin   = wxJOIN_ROUND ;
-    M_PENDATA->m_nCap    = wxCAP_ROUND ;
-    M_PENDATA->m_hPen    = 0L;
+    m_refData = new wxPenRefData(rColour, nWidth, nStyle);
 
     RealizeResource();
 } // end of wxPen::wxPen
@@ -89,14 +152,7 @@ wxPen::wxPen(
 #if FUTURE_WXWIN_COMPATIBILITY_3_0
 wxPen::wxPen(const wxColour& colour, int width, int style)
 {
-    m_refData = new wxPenRefData;
-
-    M_PENDATA->m_vColour = colour;
-    M_PENDATA->m_nWidth  = width;
-    M_PENDATA->m_nStyle  = (wxPenStyle)nStyle;
-    M_PENDATA->m_nJoin   = wxJOIN_ROUND ;
-    M_PENDATA->m_nCap    = wxCAP_ROUND ;
-    M_PENDATA->m_hPen    = 0L;
+    m_refData = new wxPenRefData(colour, width, (wxPenStyle)style);
 
     RealizeResource();
 }
@@ -107,18 +163,20 @@ wxPen::wxPen(
 , int                               nWidth
 )
 {
-    m_refData = new wxPenRefData;
-
-    M_PENDATA->m_vStipple = rStipple;
-    M_PENDATA->m_nWidth   = nWidth;
-    M_PENDATA->m_nStyle   = wxSTIPPLE;
-    M_PENDATA->m_nJoin    = wxJOIN_ROUND ;
-    M_PENDATA->m_nCap     = wxCAP_ROUND ;
-    M_PENDATA->m_hPen     = 0;
+    m_refData = new wxPenRefData (rStipple, nWidth);
 
     RealizeResource();
 } // end of wxPen::wxPen
 
+bool wxPen::operator==(const wxPen& pen) const
+{
+    const wxPenRefData *
+        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;
+}
+
 int wx2os2PenStyle(
   wxPenStyle                               nWxStyle
 );
@@ -161,7 +219,7 @@ bool wxPen::RealizeResource()
         {
             vError = ::WinGetLastError(vHabmain);
             sError = wxPMErrorToStr(vError);
-            wxLogError(_T("Unable to set current color table to RGB mode. Error: %s\n"), sError.c_str());
+            wxLogError(wxT("Unable to set current color table to RGB mode. Error: %s\n"), sError.c_str());
             return false;
         }
         if (M_PENDATA->m_nStyle == wxPENSTYLE_TRANSPARENT)
@@ -227,7 +285,7 @@ bool wxPen::RealizeResource()
         {
             vError = ::WinGetLastError(vHabmain);
             sError = wxPMErrorToStr(vError);
-            wxLogError(_T("Can't set Gpi attributes for a LINEBUNDLE. Error: %s\n"), sError.c_str());
+            wxLogError(wxT("Can't set Gpi attributes for a LINEBUNDLE. Error: %s\n"), sError.c_str());
             return false;
         }
 
@@ -312,7 +370,7 @@ bool wxPen::RealizeResource()
         {
             vError = ::WinGetLastError(vHabmain);
             sError = wxPMErrorToStr(vError);
-            wxLogError(_T("Can't set Gpi attributes for an AREABUNDLE. Error: %s\n"), sError.c_str());
+            wxLogError(wxT("Can't set Gpi attributes for an AREABUNDLE. Error: %s\n"), sError.c_str());
         }
 
         return (bool)bOk;
@@ -350,7 +408,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& rColour )
@@ -400,7 +458,7 @@ void wxPen::SetStipple(
 {
     AllocExclusive();
     M_PENDATA->m_vStipple = rStipple;
-    M_PENDATA->m_nStyle = wxSTIPPLE;
+    M_PENDATA->m_nStyle = wxPENSTYLE_STIPPLE;
     RealizeResource();
 } // end of wxPen::SetStipple
 
@@ -430,6 +488,77 @@ void wxPen::SetCap(
     RealizeResource();
 } // end of wxPen::SetCap
 
+wxColour wxPen::GetColour() const
+{
+    wxCHECK_MSG( IsOk(), wxNullColour, wxT("invalid pen") );
+
+    return M_PENDATA->m_vColour;
+}
+
+int wxPen::GetWidth() const
+{
+    wxCHECK_MSG( IsOk(), -1, wxT("invalid pen") );
+
+    return M_PENDATA->m_nWidth;
+}
+
+wxPenStyle wxPen::GetStyle() const
+{
+    wxCHECK_MSG( IsOk(), wxPENSTYLE_INVALID, wxT("invalid pen") );
+
+    return M_PENDATA->m_nStyle;
+}
+
+wxPenJoin wxPen::GetJoin() const
+{
+    wxCHECK_MSG( IsOk(), wxJOIN_INVALID, wxT("invalid pen") );
+
+    return M_PENDATA->m_nJoin;
+}
+
+wxPenCap wxPen::GetCap() const
+{
+    wxCHECK_MSG( IsOk(), wxCAP_INVALID, wxT("invalid pen") );
+
+    return M_PENDATA->m_nCap;
+}
+
+int wxPen::GetPS() const
+{
+    wxCHECK_MSG( IsOk(), 0, wxT("invalid pen") );
+
+    return M_PENDATA->m_hPen;
+}
+
+int wxPen::GetDashes(wxDash** ptr) const
+{
+    wxCHECK_MSG( IsOk(), -1, wxT("invalid pen") );
+
+    *ptr = M_PENDATA->m_dash;
+    return M_PENDATA->m_nbDash;
+}
+
+wxDash* wxPen::GetDash() const
+{
+    wxCHECK_MSG( IsOk(), NULL, wxT("invalid pen") );
+
+    return M_PENDATA->m_dash;
+}
+
+int wxPen::GetDashCount() const
+{
+    wxCHECK_MSG( IsOk(), -1, wxT("invalid pen") );
+
+    return M_PENDATA->m_nbDash;
+}
+
+wxBitmap* wxPen::GetStipple() const
+{
+    wxCHECK_MSG( IsOk(), NULL, wxT("invalid pen") );
+
+    return &(M_PENDATA->m_vStipple);
+}
+
 int wx2os2PenStyle(
   wxPenStyle                               nWxStyle
 )