]> git.saurik.com Git - wxWidgets.git/blame - src/os2/brush.cpp
don't use the return result of wxLocaltime_r, we receive the output in second paramet...
[wxWidgets.git] / src / os2 / brush.cpp
CommitLineData
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 28IMPLEMENT_DYNAMIC_CLASS(wxBrush, wxGDIObject)
0e320a79
DW
29
30wxBrushRefData::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
37wxBrushRefData::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
48wxBrushRefData::~wxBrushRefData()
49{
15f03b25 50} // end of wxBrushRefData::~wxBrushRefData
0e320a79 51
15f03b25 52//
0e320a79 53// Brushes
15f03b25 54//
0e320a79
DW
55wxBrush::wxBrush()
56{
15f03b25 57} // end of wxBrush::wxBrush
0e320a79
DW
58
59wxBrush::~wxBrush()
60{
15f03b25 61} // end of wxBrush::~wxBrush
0e320a79 62
15f03b25
DW
63wxBrush::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
78wxBrush::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 92bool 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 219WXHANDLE 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 226bool 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
236bool wxBrush::IsFree() const
237{
238 return (M_BRUSHDATA && (M_BRUSHDATA->m_hBrush == 0));
15f03b25 239} // end of wxBrush::IsFree
37f214d5
DW
240
241void 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 258void wxBrush::SetColour( const wxColour& rColour )
0e320a79
DW
259{
260 Unshare();
15f03b25 261 M_BRUSHDATA->m_vColour = rColour;
0e320a79
DW
262 RealizeResource();
263}
264
1a1498c0 265void 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 272void 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
279void 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
288void 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