1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/mgl/brush.cpp 
   4 // Author:      Vaclav Slavik 
   6 // Copyright:   (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com) 
   7 // Licence:     wxWindows licence 
   8 ///////////////////////////////////////////////////////////////////////////// 
  10 // For compilers that support precompilation, includes "wx.h". 
  11 #include "wx/wxprec.h" 
  18 #include "wx/mgl/private.h" 
  19 #include "wx/mgl/dcmemory.h" 
  22 // --------------------------------------------------------------------------- 
  24 // --------------------------------------------------------------------------- 
  26 // This function converts wxBitmap into pixpattern24_t representation 
  27 // (used by wxBrush and wxPen) 
  29 void wxBitmapToPixPattern(const wxBitmap
& bitmap
, 
  30                           pixpattern24_t 
*pix
, pattern_t 
*mask
) 
  38         mem
.SelectObject(bitmap
); 
  40         wxCurrentDCSwitcher 
curDC(dc
); 
  42         for (y 
= 0; y 
< 8; y
++) 
  43             for (x 
= 0; x 
< 8; x
++) 
  44                 dc
->unpackColorFast(dc
->getPixelFast(x
, y
), 
  51     if ( mask 
&& bitmap
.GetMask() ) 
  53         mem
.SelectObject(*bitmap
.GetMask()->GetBitmap()); 
  55         wxCurrentDCSwitcher 
curDC(dc
); 
  57         for (y 
= 0; y 
< 8; y
++) 
  60             for (x 
= 0; x 
< 8; x
++) 
  61                 if ( dc
->getPixelFast(x
, y
) != 0 ) 
  62                     mask
->p
[y
] = (uchar
)(mask
->p
[y
] | (1 << (7 - x
))); 
  69 //----------------------------------------------------------------------------- 
  71 //----------------------------------------------------------------------------- 
  73 class wxBrushRefData
: public wxObjectRefData
 
  77     wxBrushRefData(const wxBrushRefData
& data
); 
  82     pixpattern24_t m_pixPattern
; 
  83     pattern_t      m_maskPattern
; 
  86 wxBrushRefData::wxBrushRefData() 
  91     for (y 
= 0; y 
< 8; y
++) 
  92         for (x 
= 0; x 
< 8; x
++) 
  93             for (c 
= 0; c 
< 3; c
++) 
  94                 m_pixPattern
.p
[y
][x
][c
] = 0; 
  95     for (y 
= 0; y 
< 8; y
++) 
  96         m_maskPattern
.p
[y
] = 0; 
  99 wxBrushRefData::wxBrushRefData(const wxBrushRefData
& data
) 
 101     m_style 
= data
.m_style
; 
 102     m_stipple 
= data
.m_stipple
; 
 103     m_colour 
= data
.m_colour
; 
 106     for (y 
= 0; y 
< 8; y
++) 
 107         for (x 
= 0; x 
< 8; x
++) 
 108             for (c 
= 0; c 
< 3; c
++) 
 109                 m_pixPattern
.p
[y
][x
][c
] = data
.m_pixPattern
.p
[y
][x
][c
]; 
 110     for (y 
= 0; y 
< 8; y
++) 
 111         m_maskPattern
.p
[y
] = data
.m_maskPattern
.p
[y
]; 
 114 //----------------------------------------------------------------------------- 
 116 #define M_BRUSHDATA ((wxBrushRefData *)m_refData) 
 118 IMPLEMENT_DYNAMIC_CLASS(wxBrush
,wxGDIObject
) 
 120 wxBrush::wxBrush(const wxColour 
&colour
, int style
) 
 122     m_refData 
= new wxBrushRefData(); 
 123     M_BRUSHDATA
->m_style 
= style
; 
 124     M_BRUSHDATA
->m_colour 
= colour
; 
 127 wxBrush::wxBrush(const wxBitmap 
&stippleBitmap
) 
 129     wxCHECK_RET( stippleBitmap
.Ok(), _T("invalid bitmap") ); 
 130     wxCHECK_RET( stippleBitmap
.GetWidth() == 8 && stippleBitmap
.GetHeight() == 8, 
 131                   _T("stipple bitmap must be 8x8") ); 
 133     m_refData 
= new wxBrushRefData(); 
 134     M_BRUSHDATA
->m_colour 
= *wxBLACK
; 
 136     M_BRUSHDATA
->m_stipple 
= stippleBitmap
; 
 137     wxBitmapToPixPattern(stippleBitmap
, &(M_BRUSHDATA
->m_pixPattern
), 
 138                                         &(M_BRUSHDATA
->m_maskPattern
)); 
 140     if (M_BRUSHDATA
->m_stipple
.GetMask()) 
 141         M_BRUSHDATA
->m_style 
= wxSTIPPLE_MASK_OPAQUE
; 
 143         M_BRUSHDATA
->m_style 
= wxSTIPPLE
; 
 146 bool wxBrush::operator == (const wxBrush
& brush
) const 
 148     return m_refData 
== brush
.m_refData
; 
 151 bool wxBrush::operator != (const wxBrush
& brush
) const 
 153     return m_refData 
!= brush
.m_refData
; 
 156 bool wxBrush::Ok() const 
 158     return ((m_refData
) && M_BRUSHDATA
->m_colour
.Ok()); 
 161 int wxBrush::GetStyle() const 
 163     if (m_refData 
== NULL
) 
 165         wxFAIL_MSG( wxT("invalid brush") ); 
 169     return M_BRUSHDATA
->m_style
; 
 172 wxColour 
&wxBrush::GetColour() const 
 174     if (m_refData 
== NULL
) 
 176         wxFAIL_MSG( wxT("invalid brush") ); 
 180     return M_BRUSHDATA
->m_colour
; 
 183 wxBitmap 
*wxBrush::GetStipple() const 
 185     if (m_refData 
== NULL
) 
 187         wxFAIL_MSG( wxT("invalid brush") ); 
 188         return &wxNullBitmap
; 
 191     return &M_BRUSHDATA
->m_stipple
; 
 194 void* wxBrush::GetMaskPattern() const 
 196     wxCHECK_MSG( Ok(), NULL
, wxT("invalid brush") ); 
 198     return (void*)&(M_BRUSHDATA
->m_maskPattern
); 
 201 void* wxBrush::GetPixPattern() const 
 203     wxCHECK_MSG( Ok(), NULL
, wxT("invalid brush") ); 
 205     return (void*)&(M_BRUSHDATA
->m_pixPattern
); 
 208 void wxBrush::SetColour(const wxColour
& col
) 
 211     M_BRUSHDATA
->m_colour 
= col
; 
 214 void wxBrush::SetColour(unsigned char r
, unsigned char g
, unsigned char b
) 
 217     M_BRUSHDATA
->m_colour
.Set(r
, g
, b
); 
 220 void wxBrush::SetStyle( int style 
) 
 223     M_BRUSHDATA
->m_style 
= style
; 
 226 void wxBrush::SetStipple(const wxBitmap
& stipple
) 
 230     wxCHECK_RET( stipple
.Ok(), _T("invalid bitmap") ); 
 231     wxCHECK_RET( stipple
.GetWidth() == 8 && stipple
.GetHeight() == 8, 
 232                   _T("stipple bitmap must be 8x8") ); 
 234     M_BRUSHDATA
->m_stipple 
= stipple
; 
 235     wxBitmapToPixPattern(stipple
, &(M_BRUSHDATA
->m_pixPattern
), 
 236                                   &(M_BRUSHDATA
->m_maskPattern
)); 
 238     if (M_BRUSHDATA
->m_stipple
.GetMask()) 
 239         M_BRUSHDATA
->m_style 
= wxSTIPPLE_MASK_OPAQUE
; 
 241         M_BRUSHDATA
->m_style 
= wxSTIPPLE
; 
 244 wxObjectRefData 
*wxBrush::CreateRefData() const 
 246     return new wxBrushRefData
; 
 249 wxObjectRefData 
*wxBrush::CloneRefData(const wxObjectRefData 
*data
) const 
 251     return new wxBrushRefData(*(wxBrushRefData 
*)data
);