X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b2aef89b7a675805b601e757492c982031f38d21..a4f964122df05b83a7753ea50fb0831b9781822d:/src/msw/pen.cpp diff --git a/src/msw/pen.cpp b/src/msw/pen.cpp index 2818565949..2862a4dcc3 100644 --- a/src/msw/pen.cpp +++ b/src/msw/pen.cpp @@ -36,9 +36,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxPen, wxGDIObject) #endif -wxPenRefData::wxPenRefData(void) +wxPenRefData::wxPenRefData() { -// m_stipple = NULL ; m_style = wxSOLID; m_width = 1; m_join = wxJOIN_ROUND ; @@ -48,7 +47,19 @@ wxPenRefData::wxPenRefData(void) m_hPen = 0; } -wxPenRefData::~wxPenRefData(void) +wxPenRefData::wxPenRefData(const wxPenRefData& data) +{ + m_style = data.m_style; + m_width = data.m_width; + m_join = data.m_join; + m_cap = data.m_cap; + m_nbDash = data.m_nbDash; + m_dash = data.m_dash; + m_colour = data.m_colour; + m_hPen = 0; +} + +wxPenRefData::~wxPenRefData() { if ( m_hPen ) ::DeleteObject((HPEN) m_hPen); @@ -56,7 +67,7 @@ wxPenRefData::~wxPenRefData(void) // Pens -wxPen::wxPen(void) +wxPen::wxPen() { if ( wxThePenList ) wxThePenList->AddPen(this); @@ -132,27 +143,7 @@ wxPen::wxPen(const wxBitmap& stipple, int Width) wxThePenList->AddPen(this); } -wxPen::wxPen(const wxString& col, int Width, int Style) -{ - m_refData = new wxPenRefData; - - M_PENDATA->m_colour = col; -// M_PENDATA->m_stipple = NULL ; - M_PENDATA->m_width = Width; - M_PENDATA->m_style = Style; - M_PENDATA->m_join = wxJOIN_ROUND ; - M_PENDATA->m_cap = wxCAP_ROUND ; - M_PENDATA->m_nbDash = 0 ; - M_PENDATA->m_dash = 0 ; - M_PENDATA->m_hPen = 0 ; - - RealizeResource(); - - if ( wxThePenList ) - wxThePenList->AddPen(this); -} - -bool wxPen::RealizeResource(void) +bool wxPen::RealizeResource() { if (M_PENDATA && (M_PENDATA->m_hPen == 0)) { @@ -233,6 +224,11 @@ bool wxPen::RealizeResource(void) break ; default: logb.lbStyle = BS_SOLID ; + // this should be unnecessary (it's unused) but suppresses the Purigy + // messages about uninitialized memory read +#ifdef __WXDEBUG__ + logb.lbHatch = 0; +#endif break ; } logb.lbColor = ms_colour ; @@ -269,7 +265,7 @@ bool wxPen::RealizeResource(void) return FALSE; } -WXHANDLE wxPen::GetResourceHandle(void) +WXHANDLE wxPen::GetResourceHandle() { if ( !M_PENDATA ) return 0; @@ -288,123 +284,97 @@ bool wxPen::FreeResource(bool force) else return FALSE; } -/* -bool wxPen::UseResource(void) -{ - IncrementResourceUsage(); - return TRUE; -} - -bool wxPen::ReleaseResource(void) -{ - DecrementResourceUsage(); - return TRUE; -} -*/ - -bool wxPen::IsFree(void) +bool wxPen::IsFree() const { return (M_PENDATA && M_PENDATA->m_hPen == 0); } -void wxPen::SetColour(const wxColour& col) +void wxPen::Unshare() { - if ( !M_PENDATA ) - m_refData = new wxPenRefData; - - M_PENDATA->m_colour = col; - - if (FreeResource()) - RealizeResource(); + // Don't change shared data + if (!m_refData) + { + m_refData = new wxPenRefData(); + } + else + { + wxPenRefData* ref = new wxPenRefData(*(wxPenRefData*)m_refData); + UnRef(); + m_refData = ref; + } } -void wxPen::SetColour(const wxString& col) +void wxPen::SetColour(const wxColour& col) { - if ( !M_PENDATA ) - m_refData = new wxPenRefData; + Unshare(); - M_PENDATA->m_colour = col; + M_PENDATA->m_colour = col; - if (FreeResource()) RealizeResource(); } -void wxPen::SetColour(const unsigned char r, const unsigned char g, const unsigned char b) +void wxPen::SetColour(unsigned char r, unsigned char g, unsigned char b) { - if ( !M_PENDATA ) - m_refData = new wxPenRefData; + Unshare(); - M_PENDATA->m_colour.Set(r, g, b); + M_PENDATA->m_colour.Set(r, g, b); - if (FreeResource()) RealizeResource(); } void wxPen::SetWidth(int Width) { - if ( !M_PENDATA ) - m_refData = new wxPenRefData; + Unshare(); - M_PENDATA->m_width = Width; + M_PENDATA->m_width = Width; - if (FreeResource()) RealizeResource(); } void wxPen::SetStyle(int Style) { - if ( !M_PENDATA ) - m_refData = new wxPenRefData; + Unshare(); - M_PENDATA->m_style = Style; + M_PENDATA->m_style = Style; - if (FreeResource()) RealizeResource(); } void wxPen::SetStipple(const wxBitmap& Stipple) { - if ( !M_PENDATA ) - m_refData = new wxPenRefData; + Unshare(); - M_PENDATA->m_stipple = Stipple; - M_PENDATA->m_style = wxSTIPPLE; + M_PENDATA->m_stipple = Stipple; + M_PENDATA->m_style = wxSTIPPLE; - if (FreeResource()) RealizeResource(); } void wxPen::SetDashes(int nb_dashes, const wxDash *Dash) { - if ( !M_PENDATA ) - m_refData = new wxPenRefData; + Unshare(); - M_PENDATA->m_nbDash = nb_dashes; - M_PENDATA->m_dash = (wxDash *)Dash; + M_PENDATA->m_nbDash = nb_dashes; + M_PENDATA->m_dash = (wxDash *)Dash; - if (FreeResource()) RealizeResource(); } void wxPen::SetJoin(int Join) { - if ( !M_PENDATA ) - m_refData = new wxPenRefData; + Unshare(); - M_PENDATA->m_join = Join; + M_PENDATA->m_join = Join; - if (FreeResource()) RealizeResource(); } void wxPen::SetCap(int Cap) { - if ( !M_PENDATA ) - m_refData = new wxPenRefData; + Unshare(); - M_PENDATA->m_cap = Cap; + M_PENDATA->m_cap = Cap; - if (FreeResource()) RealizeResource(); }