From ad66316ffbcfd10a4fb448116371d27db3613d17 Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Thu, 31 Jul 2008 10:04:28 +0000 Subject: [PATCH] pen and brush are platform neutral on osx git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54875 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/osx/brush.cpp | 192 +++++++++++++++++++++++++++++ src/osx/pen.cpp | 308 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 500 insertions(+) create mode 100644 src/osx/brush.cpp create mode 100644 src/osx/pen.cpp diff --git a/src/osx/brush.cpp b/src/osx/brush.cpp new file mode 100644 index 0000000000..d7ec6a3369 --- /dev/null +++ b/src/osx/brush.cpp @@ -0,0 +1,192 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/mac/carbon/brush.cpp +// Purpose: wxBrush +// Author: Stefan Csomor +// Modified by: +// Created: 1998-01-01 +// RCS-ID: $Id$ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#include "wx/brush.h" + +#ifndef WX_PRECOMP + #include "wx/utils.h" +#endif + +#include "wx/osx/private.h" + +IMPLEMENT_DYNAMIC_CLASS(wxBrush, wxGDIObject) + +class WXDLLEXPORT wxBrushRefData: public wxGDIRefData +{ +public: + wxBrushRefData(const wxColour& colour = wxNullColour, wxBrushStyle style = wxBRUSHSTYLE_SOLID); + wxBrushRefData(const wxBitmap& stipple); + wxBrushRefData(const wxBrushRefData& data); + virtual ~wxBrushRefData(); + + bool operator==(const wxBrushRefData& data) const; + + const wxColour& GetColour() const { return m_colour; } + wxBrushStyle GetStyle() const { return m_style; } + wxBitmap *GetStipple() { return &m_stipple; } + + void SetColour(const wxColour& colour) { m_colour = colour; } + void SetStyle(wxBrushStyle style) { m_style = style; } + void SetStipple(const wxBitmap& stipple) { DoSetStipple(stipple); } + +protected: + void DoSetStipple(const wxBitmap& stipple); + + wxBitmap m_stipple; + wxColour m_colour; + wxBrushStyle m_style; +}; + +#define M_BRUSHDATA ((wxBrushRefData *)m_refData) + +wxBrushRefData::wxBrushRefData(const wxColour& colour, wxBrushStyle style) + : m_colour(colour), m_style( style ) +{ +} + +wxBrushRefData::wxBrushRefData(const wxBitmap& stipple) +{ + DoSetStipple( stipple ); +} + +wxBrushRefData::wxBrushRefData(const wxBrushRefData& data) + : wxGDIRefData() , + m_stipple(data.m_stipple), + m_colour(data.m_colour), + m_style(data.m_style) +{ +} + +wxBrushRefData::~wxBrushRefData() +{ +} + +bool wxBrushRefData::operator==(const wxBrushRefData& data) const +{ + return m_style == data.m_style && + m_colour == data.m_colour && + m_stipple.IsSameAs(data.m_stipple); +} + +void wxBrushRefData::DoSetStipple(const wxBitmap& stipple) +{ + m_stipple = stipple; + m_style = stipple.GetMask() ? wxBRUSHSTYLE_STIPPLE_MASK_OPAQUE : wxBRUSHSTYLE_STIPPLE; +} +// +// +// + +wxBrush::wxBrush() +{ +} + +wxBrush::~wxBrush() +{ +} + +wxBrush::wxBrush(const wxColour& col, wxBrushStyle style) +{ + m_refData = new wxBrushRefData( col, style ); +} + +#if FUTURE_WXWIN_COMPATIBILITY_3_0 +wxBrush::wxBrush(const wxColour& col, int style) +{ + m_refData = new wxBrushRefData(col, (wxBrushStyle)style); +} +#endif + +wxBrush::wxBrush(const wxBitmap& stipple) +{ + m_refData = new wxBrushRefData( stipple ); +} + +// ---------------------------------------------------------------------------- +// wxBrush house keeping stuff +// ---------------------------------------------------------------------------- + +bool wxBrush::operator==(const wxBrush& brush) const +{ + const wxBrushRefData *brushData = (wxBrushRefData *)brush.m_refData; + + // an invalid brush is considered to be only equal to another invalid brush + return m_refData ? (brushData && *M_BRUSHDATA == *brushData) : !brushData; +} + +wxGDIRefData *wxBrush::CreateGDIRefData() const +{ + return new wxBrushRefData; +} + +wxGDIRefData *wxBrush::CloneGDIRefData(const wxGDIRefData *data) const +{ + return new wxBrushRefData(*(const wxBrushRefData *)data); +} + +// ---------------------------------------------------------------------------- +// wxBrush accessors +// ---------------------------------------------------------------------------- + +wxColour wxBrush::GetColour() const +{ + wxCHECK_MSG( Ok(), wxNullColour, _T("invalid brush") ); + + return M_BRUSHDATA->GetColour(); +} + +wxBrushStyle wxBrush::GetStyle() const +{ + wxCHECK_MSG( Ok(), wxBRUSHSTYLE_INVALID, _T("invalid brush") ); + + return M_BRUSHDATA->GetStyle(); +} + +wxBitmap *wxBrush::GetStipple() const +{ + wxCHECK_MSG( Ok(), NULL, _T("invalid brush") ); + + return M_BRUSHDATA->GetStipple(); +} + +// ---------------------------------------------------------------------------- +// wxBrush setters +// ---------------------------------------------------------------------------- + +void wxBrush::SetColour(const wxColour& col) +{ + AllocExclusive(); + + M_BRUSHDATA->SetColour(col); +} + +void wxBrush::SetColour(unsigned char r, unsigned char g, unsigned char b) +{ + AllocExclusive(); + + M_BRUSHDATA->SetColour(wxColour(r, g, b)); +} + +void wxBrush::SetStyle(wxBrushStyle style) +{ + AllocExclusive(); + + M_BRUSHDATA->SetStyle(style); +} + +void wxBrush::SetStipple(const wxBitmap& stipple) +{ + AllocExclusive(); + + M_BRUSHDATA->SetStipple(stipple); +} diff --git a/src/osx/pen.cpp b/src/osx/pen.cpp new file mode 100644 index 0000000000..260f1abc82 --- /dev/null +++ b/src/osx/pen.cpp @@ -0,0 +1,308 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/mac/carbon/pen.cpp +// Purpose: wxPen +// Author: Stefan Csomor +// Modified by: +// Created: 1998-01-01 +// RCS-ID: $Id$ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "wx/wxprec.h" + +#include "wx/pen.h" + +#ifndef WX_PRECOMP + #include "wx/utils.h" +#endif + +IMPLEMENT_DYNAMIC_CLASS(wxPen, wxGDIObject) + +class WXDLLEXPORT wxPenRefData : public wxGDIRefData +{ +public: + wxPenRefData(); + wxPenRefData(const wxPenRefData& data); + virtual ~wxPenRefData(); + + wxPenRefData& operator=(const wxPenRefData& data); + + bool operator==(const wxPenRefData& data) const + { + // we intentionally don't compare m_hPen fields here + return m_style == data.m_style && + m_width == data.m_width && + m_join == data.m_join && + m_cap == data.m_cap && + m_colour == data.m_colour && + (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)); + } + +protected: + int m_width; + wxPenStyle m_style; + wxPenJoin m_join ; + wxPenCap m_cap ; + wxBitmap m_stipple ; + int m_nbDash ; + wxDash * m_dash ; + wxColour m_colour; + /* TODO: implementation + WXHPEN m_hPen; + */ + + friend class WXDLLIMPEXP_FWD_CORE wxPen; +}; + +wxPenRefData::wxPenRefData() +{ + m_style = wxPENSTYLE_SOLID; + m_width = 1; + m_join = wxJOIN_ROUND ; + m_cap = wxCAP_ROUND ; + m_nbDash = 0 ; + m_dash = 0 ; +} + +wxPenRefData::wxPenRefData(const wxPenRefData& data) +: wxGDIRefData() +{ + 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; +} + +wxPenRefData::~wxPenRefData() +{ +} + +// Pens + +#define M_PENDATA ((wxPenRefData *)m_refData) + +wxPen::wxPen() +{ +} + +wxPen::~wxPen() +{ +} + +// Should implement Create +wxPen::wxPen(const wxColour& col, int Width, wxPenStyle Style) +{ + m_refData = new wxPenRefData; + + M_PENDATA->m_colour = col; + 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 ; + + RealizeResource(); +} + +#if FUTURE_WXWIN_COMPATIBILITY_3_0 +wxPen::wxPen(const wxColour& col, int Width, int Style) +{ + m_refData = new wxPenRefData; + + M_PENDATA->m_colour = col; + M_PENDATA->m_width = Width; + M_PENDATA->m_style = (wxPenStyle)Style; + M_PENDATA->m_join = wxJOIN_ROUND ; + M_PENDATA->m_cap = wxCAP_ROUND ; + M_PENDATA->m_nbDash = 0 ; + M_PENDATA->m_dash = 0 ; + + RealizeResource(); +} +#endif + +wxPen::wxPen(const wxBitmap& stipple, int Width) +{ + m_refData = new wxPenRefData; + + M_PENDATA->m_stipple = stipple; + M_PENDATA->m_width = Width; + M_PENDATA->m_style = wxPENSTYLE_STIPPLE; + M_PENDATA->m_join = wxJOIN_ROUND ; + M_PENDATA->m_cap = wxCAP_ROUND ; + M_PENDATA->m_nbDash = 0 ; + M_PENDATA->m_dash = 0 ; + + RealizeResource(); +} + +wxGDIRefData *wxPen::CreateGDIRefData() const +{ + return new wxPenRefData; +} + +wxGDIRefData *wxPen::CloneGDIRefData(const wxGDIRefData *data) const +{ + return new wxPenRefData(*wx_static_cast(const wxPenRefData *, data)); +} + +bool wxPen::operator==(const wxPen& pen) const +{ + const wxPenRefData *penData = (wxPenRefData *)pen.m_refData; + + // an invalid pen is only equal to another invalid pen + return m_refData ? penData && *M_PENDATA == *penData : !penData; +} + +wxColour wxPen::GetColour() const +{ + wxCHECK_MSG( Ok(), wxNullColour, wxT("invalid pen") ); + + return M_PENDATA->m_colour; +} + +int wxPen::GetWidth() const +{ + wxCHECK_MSG( Ok(), -1, wxT("invalid pen") ); + + return M_PENDATA->m_width; +} + +wxPenStyle wxPen::GetStyle() const +{ + wxCHECK_MSG( Ok(), wxPENSTYLE_INVALID, wxT("invalid pen") ); + + return M_PENDATA->m_style; +} + +wxPenJoin wxPen::GetJoin() const +{ + wxCHECK_MSG( Ok(), wxJOIN_INVALID, wxT("invalid pen") ); + + return M_PENDATA->m_join; +} + +wxPenCap wxPen::GetCap() const +{ + wxCHECK_MSG( Ok(), wxCAP_INVALID, wxT("invalid pen") ); + + return M_PENDATA->m_cap; +} + +int wxPen::GetDashes(wxDash **ptr) const +{ + wxCHECK_MSG( Ok(), -1, wxT("invalid pen") ); + + *ptr = M_PENDATA->m_dash; + return M_PENDATA->m_nbDash; +} + +wxBitmap *wxPen::GetStipple() const +{ + wxCHECK_MSG( Ok(), NULL, wxT("invalid pen") ); + + return &M_PENDATA->m_stipple; +} + +void wxPen::Unshare() +{ + // 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 wxColour& col) +{ + Unshare(); + + M_PENDATA->m_colour = col; + + RealizeResource(); +} + +void wxPen::SetColour(unsigned char r, unsigned char g, unsigned char b) +{ + Unshare(); + + M_PENDATA->m_colour.Set(r, g, b); + + RealizeResource(); +} + +void wxPen::SetWidth(int Width) +{ + Unshare(); + + M_PENDATA->m_width = Width; + + RealizeResource(); +} + +void wxPen::SetStyle(wxPenStyle Style) +{ + Unshare(); + + M_PENDATA->m_style = Style; + + RealizeResource(); +} + +void wxPen::SetStipple(const wxBitmap& Stipple) +{ + Unshare(); + + M_PENDATA->m_stipple = Stipple; + M_PENDATA->m_style = wxPENSTYLE_STIPPLE; + + RealizeResource(); +} + +void wxPen::SetDashes(int nb_dashes, const wxDash *Dash) +{ + Unshare(); + + M_PENDATA->m_nbDash = nb_dashes; + M_PENDATA->m_dash = (wxDash *)Dash; + + RealizeResource(); +} + +void wxPen::SetJoin(wxPenJoin Join) +{ + Unshare(); + + M_PENDATA->m_join = Join; + + RealizeResource(); +} + +void wxPen::SetCap(wxPenCap Cap) +{ + Unshare(); + + M_PENDATA->m_cap = Cap; + + RealizeResource(); +} + +bool wxPen::RealizeResource() +{ + // nothing to do here for mac + return true; +} -- 2.45.2