Updated brush/pen implementation for OS/2 to current implementation style.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52739 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Neis
2008-03-23 17:41:16 +00:00
parent fcda20eb04
commit 1aca6611e6
4 changed files with 285 additions and 167 deletions

View File

@@ -23,19 +23,75 @@
#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
DECLARE_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(const wxColour& col, int width, wxPenStyle style)
{
Init();
m_nStyle = style;
m_nWidth = width;
m_vColour = col;
}
wxPenRefData::wxPenRefData(const wxBitmap& stipple, int width)
{
Init();
m_nStyle = wxPENSTYLE_STIPPLE;
m_nWidth = width;
m_vStipple = stipple;
}
wxPenRefData::~wxPenRefData()
{
} // end of wxPenRefData::~wxPenRefData
//
// Pens
//
wxPen::wxPen()
{
} // end of wxPen::wxPen
// ----------------------------------------------------------------------------
// wxPen
// ----------------------------------------------------------------------------
wxPen::~wxPen()
{
} // end of wxPen::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,14 +163,7 @@ 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
@@ -400,7 +449,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 +479,77 @@ void wxPen::SetCap(
RealizeResource();
} // end of wxPen::SetCap
wxColour& wxPen::GetColour() const
{
wxCHECK_MSG( Ok(), wxNullColour, wxT("invalid pen") );
return M_PENDATA->m_vColour;
}
int wxPen::GetWidth() const
{
wxCHECK_MSG( Ok(), -1, wxT("invalid pen") );
return M_PENDATA->m_nWidth;
}
wxPenStyle wxPen::GetStyle() const
{
wxCHECK_MSG( Ok(), wxPENSTYLE_INVALID, wxT("invalid pen") );
return M_PENDATA->m_nStyle;
}
wxPenJoin wxPen::GetJoin() const
{
wxCHECK_MSG( Ok(), wxJOIN_INVALID, wxT("invalid pen") );
return M_PENDATA->m_nJoin;
}
wxPenCap wxPen::GetCap() const
{
wxCHECK_MSG( Ok(), wxCAP_INVALID, wxT("invalid pen") );
return M_PENDATA->m_nCap;
}
int wxPen::GetPS() const
{
wxCHECK_MSG( Ok(), 0, wxT("invalid pen") );
return M_PENDATA->m_hPen;
}
int wxPen::GetDashes(wxDash** ptr) const
{
wxCHECK_MSG( Ok(), -1, wxT("invalid pen") );
*ptr = M_PENDATA->m_dash;
return M_PENDATA->m_nbDash;
}
wxDash* wxPen::GetDash() const
{
wxCHECK_MSG( Ok(), NULL, wxT("invalid pen") );
return M_PENDATA->m_dash;
}
int wxPen::GetDashCount() const
{
wxCHECK_MSG( Ok(), -1, wxT("invalid pen") );
return M_PENDATA->m_nbDash;
}
wxBitmap* wxPen::GetStipple() const
{
wxCHECK_MSG( Ok(), NULL, wxT("invalid pen") );
return &(M_PENDATA->m_vStipple);
}
int wx2os2PenStyle(
wxPenStyle nWxStyle
)