]>
git.saurik.com Git - wxWidgets.git/blob - src/os2/brush.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/os2/brush.cpp
4 // Author: David Webster
8 // Copyright: (c) David Webster
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // For compilers that support precompilation, includes "wx.h".
13 #include "wx/wxprec.h"
24 #include "wx/os2/private.h"
28 IMPLEMENT_DYNAMIC_CLASS(wxBrush
, wxGDIObject
)
30 wxBrushRefData::wxBrushRefData()
34 memset(&m_vBundle
, '\0', sizeof(AREABUNDLE
));
35 } // end of wxBrushRefData::wxBrushRefData
37 wxBrushRefData::wxBrushRefData(const wxBrushRefData
& rData
)
39 m_nStyle
= rData
.m_nStyle
;
40 m_vStipple
= rData
.m_vStipple
;
41 m_vColour
= rData
.m_vColour
;
43 memcpy(&m_vBundle
, &rData
.m_vBundle
, sizeof(AREABUNDLE
));
44 } // end of wxBrushRefData::wxBrushRefData
46 wxBrushRefData::~wxBrushRefData()
48 } // end of wxBrushRefData::~wxBrushRefData
55 } // end of wxBrush::wxBrush
59 } // end of wxBrush::~wxBrush
62 const wxColour
& rColour
66 m_refData
= new wxBrushRefData
;
68 M_BRUSHDATA
->m_vColour
= rColour
;
69 M_BRUSHDATA
->m_nStyle
= nStyle
;
70 M_BRUSHDATA
->m_hBrush
= 0;
71 memset(&M_BRUSHDATA
->m_vBundle
, '\0', sizeof(AREABUNDLE
));
74 } // end of wxBrush::wxBrush
76 wxBrush::wxBrush(const wxBitmap
& rStipple
)
78 m_refData
= new wxBrushRefData
;
80 M_BRUSHDATA
->m_nStyle
= wxSTIPPLE
;
81 M_BRUSHDATA
->m_vStipple
= rStipple
;
82 M_BRUSHDATA
->m_hBrush
= 0;
83 memset(&M_BRUSHDATA
->m_vBundle
, '\0', sizeof(AREABUNDLE
));
86 } // end of wxBrush::wxBrush
88 bool wxBrush::RealizeResource()
94 if (M_BRUSHDATA
&& M_BRUSHDATA
->m_hBrush
== 0L)
97 DEVOPENSTRUC vDop
= {0L, "DISPLAY", NULL
, 0L, 0L, 0L, 0L, 0L, 0L};
98 HDC hDC
= ::DevOpenDC( vHabmain
105 M_BRUSHDATA
->m_hBrush
= (WXHPEN
)::GpiCreatePS( vHabmain
108 ,PU_PELS
| GPIT_MICRO
| GPIA_ASSOC
114 // Set the color table to RGB mode
116 if (!::GpiCreateLogColorTable( (HPS
)M_BRUSHDATA
->m_hBrush
124 vError
= ::WinGetLastError(vHabmain
);
125 sError
= wxPMErrorToStr(vError
);
126 wxLogError(_T("Unable to set current color table to RGB mode. Error: %s\n"), sError
.c_str());
130 if (M_BRUSHDATA
->m_nStyle
==wxTRANSPARENT
)
134 COLORREF vPmColour
= 0L;
136 vPmColour
= M_BRUSHDATA
->m_vColour
.GetPixel() ;
138 M_BRUSHDATA
->m_vBundle
.usSet
= LCID_DEFAULT
;
139 switch (M_BRUSHDATA
->m_nStyle
)
142 M_BRUSHDATA
->m_hBrush
= NULL
; // Must always select a suitable background brush
143 break; // - could choose white always for a quick solution
145 case wxBDIAGONAL_HATCH
:
146 M_BRUSHDATA
->m_vBundle
.usSymbol
= PATSYM_DIAG3
;
149 case wxCROSSDIAG_HATCH
:
150 M_BRUSHDATA
->m_vBundle
.usSymbol
= PATSYM_DIAGHATCH
;
153 case wxFDIAGONAL_HATCH
:
154 M_BRUSHDATA
->m_vBundle
.usSymbol
= PATSYM_DIAG1
;
158 M_BRUSHDATA
->m_vBundle
.usSymbol
= PATSYM_HATCH
;
161 case wxHORIZONTAL_HATCH
:
162 M_BRUSHDATA
->m_vBundle
.usSymbol
= PATSYM_HORIZ
;
165 case wxVERTICAL_HATCH
:
166 M_BRUSHDATA
->m_vBundle
.usSymbol
= PATSYM_VERT
;
170 if (M_BRUSHDATA
->m_vStipple
.Ok())
172 ::GpiSetBitmapId( M_BRUSHDATA
->m_hBrush
173 ,(USHORT
)M_BRUSHDATA
->m_vStipple
.GetHBITMAP()
174 ,(USHORT
)M_BRUSHDATA
->m_vStipple
.GetId()
176 ::GpiSetPatternSet( M_BRUSHDATA
->m_hBrush
177 ,(USHORT
)M_BRUSHDATA
->m_vStipple
.GetId()
181 M_BRUSHDATA
->m_vBundle
.usSymbol
= PATSYM_SOLID
;
186 M_BRUSHDATA
->m_vBundle
.usSymbol
= PATSYM_SOLID
;
189 #ifdef WXDEBUG_CREATE
190 if (M_BRUSHDATA
->m_hBrush
==NULL
) wxError("Cannot create brush","Internal error") ;
192 M_BRUSHDATA
->m_vBundle
.lColor
= vPmColour
;
193 M_BRUSHDATA
->m_vBundle
.lBackColor
= RGB_WHITE
;
194 M_BRUSHDATA
->m_vBundle
.usMixMode
= FM_OVERPAINT
;
195 M_BRUSHDATA
->m_vBundle
.usBackMixMode
= BM_OVERPAINT
;
197 bOk
= (bool)::GpiSetAttrs( M_BRUSHDATA
->m_hBrush
199 ,ABB_COLOR
| ABB_BACK_COLOR
| ABB_MIX_MODE
| ABB_BACK_MIX_MODE
|
202 ,&M_BRUSHDATA
->m_vBundle
206 vError
= ::WinGetLastError(vHabmain
);
207 sError
= wxPMErrorToStr(vError
);
208 wxLogError(_T("Can't set Gpi attributes for an AREABUNDLE. Error: %s\n"), sError
.c_str());
213 } // end of wxBrush::RealizeResource
215 WXHANDLE
wxBrush::GetResourceHandle()
219 return (WXHANDLE
)M_BRUSHDATA
->m_hBrush
;
220 } // end of wxBrush::GetResourceHandle
222 bool wxBrush::FreeResource( bool WXUNUSED(bForce
) )
224 if (M_BRUSHDATA
&& (M_BRUSHDATA
->m_hBrush
!= 0))
226 M_BRUSHDATA
->m_hBrush
= 0;
230 } // end of wxBrush::FreeResource
232 bool wxBrush::IsFree() const
234 return (M_BRUSHDATA
&& (M_BRUSHDATA
->m_hBrush
== 0));
235 } // end of wxBrush::IsFree
237 void wxBrush::Unshare()
240 // Don't change shared data
244 m_refData
= new wxBrushRefData();
248 wxBrushRefData
* ref
= new wxBrushRefData(*(wxBrushRefData
*)m_refData
);
252 } // end of wxBrush::Unshare
254 void wxBrush::SetColour( const wxColour
& rColour
)
257 M_BRUSHDATA
->m_vColour
= rColour
;
261 void wxBrush::SetColour(unsigned char cRed
, unsigned char cGreen
, unsigned char cBlue
)
264 M_BRUSHDATA
->m_vColour
.Set( cRed
, cGreen
, cBlue
);
266 } // end of wxBrush::SetColour
268 void wxBrush::SetStyle(int nStyle
)
271 M_BRUSHDATA
->m_nStyle
= nStyle
;
273 } // end of wxBrush::SetStyle
275 void wxBrush::SetStipple(
276 const wxBitmap
& rStipple
280 M_BRUSHDATA
->m_vStipple
= rStipple
;
282 } // end of wxBrush::SetStipple
289 if (M_BRUSHDATA
->m_hBrush
)
290 ::GpiDestroyPS(M_BRUSHDATA
->m_hBrush
);
291 M_BRUSHDATA
->m_hBrush
= hPS
;
293 } // end of WxWinGdi_CPen::SetPS