X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2bda0e173844e8e0f8acf4e8ad8b5c26e5c6fe5d..c6eba8f8b204b0d722db0007e3e0d5e2d2d20085:/src/msw/pen.cpp diff --git a/src/msw/pen.cpp b/src/msw/pen.cpp index 12dd825ec7..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); @@ -69,7 +80,7 @@ wxPen::~wxPen() } // Should implement Create -wxPen::wxPen(const wxColour& col, const int Width, const int Style) +wxPen::wxPen(const wxColour& col, int Width, int Style) { m_refData = new wxPenRefData; @@ -112,7 +123,7 @@ wxPen::wxPen(const wxColour& col, const int Width, const int Style) wxThePenList->AddPen(this); } -wxPen::wxPen(const wxBitmap& stipple, const int Width) +wxPen::wxPen(const wxBitmap& stipple, int Width) { m_refData = new wxPenRefData; @@ -132,31 +143,7 @@ wxPen::wxPen(const wxBitmap& stipple, const int Width) wxThePenList->AddPen(this); } -wxPen::wxPen(const wxString& col, const int Width, const 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 ; - - // In Windows, only a pen of width = 1 can be dotted or dashed! - if ((Style == wxDOT) || (Style == wxLONG_DASH) || (Style == wxSHORT_DASH) || (Style == wxDOT_DASH)) - M_PENDATA->m_width = 1; - - RealizeResource(); - - if ( wxThePenList ) - wxThePenList->AddPen(this); -} - -bool wxPen::RealizeResource(void) +bool wxPen::RealizeResource() { if (M_PENDATA && (M_PENDATA->m_hPen == 0)) { @@ -176,7 +163,8 @@ bool wxPen::RealizeResource(void) if (M_PENDATA->m_join==wxJOIN_ROUND && M_PENDATA->m_cap==wxCAP_ROUND && M_PENDATA->m_style!=wxUSER_DASH && - M_PENDATA->m_style!=wxSTIPPLE + M_PENDATA->m_style!=wxSTIPPLE && + M_PENDATA->m_width <= 1 ) M_PENDATA->m_hPen = (WXHPEN) CreatePen(wx2msPenStyle(M_PENDATA->m_style), M_PENDATA->m_width, ms_colour); else @@ -236,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 ; @@ -263,7 +256,7 @@ bool wxPen::RealizeResource(void) #else M_PENDATA->m_hPen = (WXHPEN) CreatePen(wx2msPenStyle(M_PENDATA->m_style), M_PENDATA->m_width, ms_colour); #endif -#ifdef DEBUG_CREATE +#ifdef WXDEBUG_CREATE if (M_PENDATA->m_hPen==0) wxError("Cannot create pen","Internal error") ; #endif @@ -272,7 +265,7 @@ bool wxPen::RealizeResource(void) return FALSE; } -WXHANDLE wxPen::GetResourceHandle(void) +WXHANDLE wxPen::GetResourceHandle() { if ( !M_PENDATA ) return 0; @@ -291,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(const int Width) +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(const int Style) +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(const int nb_dashes, const wxDash *Dash) +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(const int Join) +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(const int Cap) +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(); }