]>
Commit | Line | Data |
---|---|---|
0e320a79 | 1 | ///////////////////////////////////////////////////////////////////////////// |
46562151 | 2 | // Name: src/os2/brush.cpp |
0e320a79 | 3 | // Purpose: wxBrush |
37f214d5 | 4 | // Author: David Webster |
0e320a79 | 5 | // Modified by: |
37f214d5 | 6 | // Created: 10/13/99 |
0e320a79 | 7 | // RCS-ID: $Id$ |
37f214d5 | 8 | // Copyright: (c) David Webster |
65571936 | 9 | // Licence: wxWindows licence |
0e320a79 DW |
10 | ///////////////////////////////////////////////////////////////////////////// |
11 | ||
37f214d5 DW |
12 | // For compilers that support precompilation, includes "wx.h". |
13 | #include "wx/wxprec.h" | |
0e320a79 | 14 | |
37f214d5 DW |
15 | #ifndef WX_PRECOMP |
16 | #include <stdio.h> | |
37f214d5 | 17 | #include "wx/list.h" |
0e320a79 | 18 | #include "wx/utils.h" |
37f214d5 | 19 | #include "wx/app.h" |
0e320a79 | 20 | #include "wx/brush.h" |
6eb280e9 | 21 | #include "wx/log.h" |
37f214d5 DW |
22 | #endif |
23 | ||
24 | #include "wx/os2/private.h" | |
25 | ||
26 | #include "assert.h" | |
0e320a79 | 27 | |
0e320a79 | 28 | IMPLEMENT_DYNAMIC_CLASS(wxBrush, wxGDIObject) |
0e320a79 DW |
29 | |
30 | wxBrushRefData::wxBrushRefData() | |
31 | { | |
15f03b25 | 32 | m_nStyle = wxSOLID; |
37f214d5 | 33 | m_hBrush = 0; |
15f03b25 DW |
34 | memset(&m_vBundle, '\0', sizeof(AREABUNDLE)); |
35 | } // end of wxBrushRefData::wxBrushRefData | |
0e320a79 | 36 | |
15f03b25 DW |
37 | wxBrushRefData::wxBrushRefData( |
38 | const wxBrushRefData& rData | |
39 | ) | |
0e320a79 | 40 | { |
15f03b25 DW |
41 | m_nStyle = rData.m_nStyle; |
42 | m_vStipple = rData.m_vStipple; | |
43 | m_vColour = rData.m_vColour; | |
44 | m_hBrush = 0; | |
45 | memcpy(&m_vBundle, &rData.m_vBundle, sizeof(AREABUNDLE)); | |
46 | } // end of wxBrushRefData::wxBrushRefData | |
0e320a79 DW |
47 | |
48 | wxBrushRefData::~wxBrushRefData() | |
49 | { | |
15f03b25 | 50 | } // end of wxBrushRefData::~wxBrushRefData |
0e320a79 | 51 | |
15f03b25 | 52 | // |
0e320a79 | 53 | // Brushes |
15f03b25 | 54 | // |
0e320a79 DW |
55 | wxBrush::wxBrush() |
56 | { | |
15f03b25 | 57 | } // end of wxBrush::wxBrush |
0e320a79 DW |
58 | |
59 | wxBrush::~wxBrush() | |
60 | { | |
15f03b25 | 61 | } // end of wxBrush::~wxBrush |
0e320a79 | 62 | |
15f03b25 DW |
63 | wxBrush::wxBrush( |
64 | const wxColour& rColour | |
65 | , int nStyle | |
66 | ) | |
0e320a79 DW |
67 | { |
68 | m_refData = new wxBrushRefData; | |
69 | ||
15f03b25 DW |
70 | M_BRUSHDATA->m_vColour = rColour; |
71 | M_BRUSHDATA->m_nStyle = nStyle; | |
72 | M_BRUSHDATA->m_hBrush = 0; | |
73 | memset(&M_BRUSHDATA->m_vBundle, '\0', sizeof(AREABUNDLE)); | |
0e320a79 DW |
74 | |
75 | RealizeResource(); | |
15f03b25 | 76 | } // end of wxBrush::wxBrush |
0e320a79 | 77 | |
15f03b25 DW |
78 | wxBrush::wxBrush( |
79 | const wxBitmap& rStipple | |
80 | ) | |
0e320a79 DW |
81 | { |
82 | m_refData = new wxBrushRefData; | |
83 | ||
15f03b25 DW |
84 | M_BRUSHDATA->m_nStyle = wxSTIPPLE; |
85 | M_BRUSHDATA->m_vStipple = rStipple; | |
86 | M_BRUSHDATA->m_hBrush = 0; | |
87 | memset(&M_BRUSHDATA->m_vBundle, '\0', sizeof(AREABUNDLE)); | |
0e320a79 DW |
88 | |
89 | RealizeResource(); | |
15f03b25 | 90 | } // end of wxBrush::wxBrush |
0e320a79 | 91 | |
15f03b25 | 92 | bool wxBrush::RealizeResource() |
37f214d5 | 93 | { |
6670f564 WS |
94 | bool bOk; |
95 | ERRORID vError; | |
96 | wxString sError; | |
15f03b25 DW |
97 | |
98 | if (M_BRUSHDATA && M_BRUSHDATA->m_hBrush == 0L) | |
37f214d5 | 99 | { |
15f03b25 DW |
100 | SIZEL vSize = {0, 0}; |
101 | DEVOPENSTRUC vDop = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L}; | |
102 | HDC hDC = ::DevOpenDC( vHabmain | |
103 | ,OD_MEMORY | |
104 | ,"*" | |
105 | ,5L | |
106 | ,(PDEVOPENDATA)&vDop | |
107 | ,NULLHANDLE | |
108 | ); | |
109 | M_BRUSHDATA->m_hBrush = (WXHPEN)::GpiCreatePS( vHabmain | |
110 | ,hDC | |
111 | ,&vSize | |
112 | ,PU_PELS | GPIT_MICRO | GPIA_ASSOC | |
113 | ); | |
114 | } | |
115 | if (M_BRUSHDATA) | |
116 | { | |
117 | // | |
118 | // Set the color table to RGB mode | |
119 | // | |
120 | if (!::GpiCreateLogColorTable( (HPS)M_BRUSHDATA->m_hBrush | |
121 | ,0L | |
122 | ,LCOLF_RGB | |
123 | ,0L | |
124 | ,0L | |
125 | ,NULL | |
126 | )) | |
127 | { | |
128 | vError = ::WinGetLastError(vHabmain); | |
129 | sError = wxPMErrorToStr(vError); | |
0fba44b4 | 130 | wxLogError(_T("Unable to set current color table to RGB mode. Error: %s\n"), sError.c_str()); |
46562151 | 131 | return false; |
15f03b25 DW |
132 | } |
133 | ||
134 | if (M_BRUSHDATA->m_nStyle==wxTRANSPARENT) | |
37f214d5 | 135 | { |
6670f564 | 136 | return true; |
37f214d5 | 137 | } |
15f03b25 | 138 | COLORREF vPmColour = 0L; |
37f214d5 | 139 | |
15f03b25 | 140 | vPmColour = M_BRUSHDATA->m_vColour.GetPixel() ; |
37f214d5 | 141 | |
15f03b25 DW |
142 | M_BRUSHDATA->m_vBundle.usSet = LCID_DEFAULT; |
143 | switch (M_BRUSHDATA->m_nStyle) | |
37f214d5 | 144 | { |
15f03b25 DW |
145 | case wxTRANSPARENT: |
146 | M_BRUSHDATA->m_hBrush = NULL; // Must always select a suitable background brush | |
147 | break; // - could choose white always for a quick solution | |
148 | ||
37f214d5 | 149 | case wxBDIAGONAL_HATCH: |
15f03b25 DW |
150 | M_BRUSHDATA->m_vBundle.usSymbol = PATSYM_DIAG3; |
151 | break; | |
37f214d5 DW |
152 | |
153 | case wxCROSSDIAG_HATCH: | |
15f03b25 DW |
154 | M_BRUSHDATA->m_vBundle.usSymbol = PATSYM_DIAGHATCH; |
155 | break; | |
37f214d5 DW |
156 | |
157 | case wxFDIAGONAL_HATCH: | |
15f03b25 DW |
158 | M_BRUSHDATA->m_vBundle.usSymbol = PATSYM_DIAG1; |
159 | break; | |
37f214d5 DW |
160 | |
161 | case wxCROSS_HATCH: | |
15f03b25 DW |
162 | M_BRUSHDATA->m_vBundle.usSymbol = PATSYM_HATCH; |
163 | break; | |
37f214d5 DW |
164 | |
165 | case wxHORIZONTAL_HATCH: | |
15f03b25 DW |
166 | M_BRUSHDATA->m_vBundle.usSymbol = PATSYM_HORIZ; |
167 | break; | |
37f214d5 DW |
168 | |
169 | case wxVERTICAL_HATCH: | |
15f03b25 DW |
170 | M_BRUSHDATA->m_vBundle.usSymbol = PATSYM_VERT; |
171 | break; | |
37f214d5 DW |
172 | |
173 | case wxSTIPPLE: | |
15f03b25 DW |
174 | if (M_BRUSHDATA->m_vStipple.Ok()) |
175 | { | |
176 | ::GpiSetBitmapId( M_BRUSHDATA->m_hBrush | |
177 | ,(USHORT)M_BRUSHDATA->m_vStipple.GetHBITMAP() | |
178 | ,(USHORT)M_BRUSHDATA->m_vStipple.GetId() | |
179 | ); | |
180 | ::GpiSetPatternSet( M_BRUSHDATA->m_hBrush | |
181 | ,(USHORT)M_BRUSHDATA->m_vStipple.GetId() | |
182 | ); | |
183 | } | |
37f214d5 | 184 | else |
15f03b25 | 185 | M_BRUSHDATA->m_vBundle.usSymbol = PATSYM_SOLID; |
37f214d5 DW |
186 | break ; |
187 | ||
188 | case wxSOLID: | |
189 | default: | |
15f03b25 | 190 | M_BRUSHDATA->m_vBundle.usSymbol = PATSYM_SOLID; |
37f214d5 DW |
191 | break; |
192 | } | |
193 | #ifdef WXDEBUG_CREATE | |
194 | if (M_BRUSHDATA->m_hBrush==NULL) wxError("Cannot create brush","Internal error") ; | |
195 | #endif | |
15f03b25 | 196 | M_BRUSHDATA->m_vBundle.lColor = vPmColour; |
8d854fa9 | 197 | M_BRUSHDATA->m_vBundle.lBackColor = RGB_WHITE; |
15f03b25 DW |
198 | M_BRUSHDATA->m_vBundle.usMixMode = FM_OVERPAINT; |
199 | M_BRUSHDATA->m_vBundle.usBackMixMode = BM_OVERPAINT; | |
200 | ||
6670f564 WS |
201 | bOk = (bool)::GpiSetAttrs( M_BRUSHDATA->m_hBrush |
202 | ,PRIM_AREA | |
203 | ,ABB_COLOR | ABB_BACK_COLOR | ABB_MIX_MODE | ABB_BACK_MIX_MODE | | |
204 | ABB_SET | ABB_SYMBOL | |
205 | ,ABB_REF_POINT | |
206 | ,&M_BRUSHDATA->m_vBundle | |
207 | ); | |
15f03b25 DW |
208 | if (!bOk) |
209 | { | |
210 | vError = ::WinGetLastError(vHabmain); | |
211 | sError = wxPMErrorToStr(vError); | |
0fba44b4 | 212 | wxLogError(_T("Can't set Gpi attributes for an AREABUNDLE. Error: %s\n"), sError.c_str()); |
15f03b25 DW |
213 | } |
214 | return bOk; | |
37f214d5 | 215 | } |
46562151 | 216 | return false; |
15f03b25 | 217 | } // end of wxBrush::RealizeResource |
37f214d5 | 218 | |
15f03b25 | 219 | WXHANDLE wxBrush::GetResourceHandle() |
37f214d5 | 220 | { |
15f03b25 DW |
221 | if (!M_BRUSHDATA) |
222 | return 0; | |
223 | return (WXHANDLE)M_BRUSHDATA->m_hBrush; | |
224 | } // end of wxBrush::GetResourceHandle | |
225 | ||
6670f564 | 226 | bool wxBrush::FreeResource( bool WXUNUSED(bForce) ) |
37f214d5 DW |
227 | { |
228 | if (M_BRUSHDATA && (M_BRUSHDATA->m_hBrush != 0)) | |
229 | { | |
37f214d5 | 230 | M_BRUSHDATA->m_hBrush = 0; |
6670f564 | 231 | return true; |
37f214d5 | 232 | } |
46562151 | 233 | else return false; |
15f03b25 | 234 | } // end of wxBrush::FreeResource |
37f214d5 DW |
235 | |
236 | bool wxBrush::IsFree() const | |
237 | { | |
238 | return (M_BRUSHDATA && (M_BRUSHDATA->m_hBrush == 0)); | |
15f03b25 | 239 | } // end of wxBrush::IsFree |
37f214d5 DW |
240 | |
241 | void wxBrush::Unshare() | |
242 | { | |
15f03b25 | 243 | // |
37f214d5 | 244 | // Don't change shared data |
15f03b25 | 245 | // |
37f214d5 DW |
246 | if (!m_refData) |
247 | { | |
248 | m_refData = new wxBrushRefData(); | |
249 | } | |
250 | else | |
251 | { | |
252 | wxBrushRefData* ref = new wxBrushRefData(*(wxBrushRefData*)m_refData); | |
253 | UnRef(); | |
254 | m_refData = ref; | |
255 | } | |
15f03b25 | 256 | } // end of wxBrush::Unshare |
0e320a79 | 257 | |
46562151 | 258 | void wxBrush::SetColour( const wxColour& rColour ) |
0e320a79 DW |
259 | { |
260 | Unshare(); | |
15f03b25 | 261 | M_BRUSHDATA->m_vColour = rColour; |
0e320a79 DW |
262 | RealizeResource(); |
263 | } | |
264 | ||
1a1498c0 | 265 | void wxBrush::SetColour(unsigned char cRed, unsigned char cGreen, unsigned char cBlue) |
0e320a79 DW |
266 | { |
267 | Unshare(); | |
46562151 | 268 | M_BRUSHDATA->m_vColour.Set( cRed, cGreen, cBlue ); |
0e320a79 | 269 | RealizeResource(); |
15f03b25 | 270 | } // end of wxBrush::SetColour |
0e320a79 | 271 | |
46562151 | 272 | void wxBrush::SetStyle(int nStyle) |
0e320a79 DW |
273 | { |
274 | Unshare(); | |
15f03b25 | 275 | M_BRUSHDATA->m_nStyle = nStyle; |
0e320a79 | 276 | RealizeResource(); |
15f03b25 | 277 | } // end of wxBrush::SetStyle |
0e320a79 | 278 | |
15f03b25 DW |
279 | void wxBrush::SetStipple( |
280 | const wxBitmap& rStipple | |
281 | ) | |
0e320a79 DW |
282 | { |
283 | Unshare(); | |
15f03b25 DW |
284 | M_BRUSHDATA->m_vStipple = rStipple; |
285 | RealizeResource(); | |
286 | } // end of wxBrush::SetStipple | |
0e320a79 | 287 | |
15f03b25 DW |
288 | void wxBrush::SetPS( |
289 | HPS hPS | |
290 | ) | |
291 | { | |
292 | Unshare(); | |
293 | if (M_BRUSHDATA->m_hBrush) | |
294 | ::GpiDestroyPS(M_BRUSHDATA->m_hBrush); | |
295 | M_BRUSHDATA->m_hBrush = hPS; | |
0e320a79 | 296 | RealizeResource(); |
15f03b25 | 297 | } // end of WxWinGdi_CPen::SetPS |