]>
git.saurik.com Git - wxWidgets.git/blob - src/os2/pen.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/os2/pen.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"
25 #include "wx/os2/private.h"
28 IMPLEMENT_DYNAMIC_CLASS(wxPen
, wxGDIObject
)
30 wxPenRefData::wxPenRefData()
34 m_nJoin
= wxJOIN_ROUND
;
35 m_nCap
= wxCAP_ROUND
;
37 m_dash
= (wxDash
*)NULL
;
39 } // end of wxPenRefData::wxPenRefData
41 wxPenRefData::wxPenRefData(
42 const wxPenRefData
& rData
45 m_nStyle
= rData
.m_nStyle
;
46 m_nWidth
= rData
.m_nWidth
;
47 m_nJoin
= rData
.m_nJoin
;
48 m_nCap
= rData
.m_nCap
;
49 m_nbDash
= rData
.m_nbDash
;
50 m_dash
= rData
.m_dash
;
51 m_vColour
= rData
.m_vColour
;
53 } // end of wxPenRefData::wxPenRefData
55 wxPenRefData::~wxPenRefData()
57 } // end of wxPenRefData::~wxPenRefData
64 } // end of wxPen::wxPen
68 } // end of wxPen::wxPen
70 // Should implement Create
72 const wxColour
& rColour
77 m_refData
= new wxPenRefData
;
79 M_PENDATA
->m_vColour
= rColour
;
80 M_PENDATA
->m_nWidth
= nWidth
;
81 M_PENDATA
->m_nStyle
= nStyle
;
82 M_PENDATA
->m_nJoin
= wxJOIN_ROUND
;
83 M_PENDATA
->m_nCap
= wxCAP_ROUND
;
84 M_PENDATA
->m_hPen
= 0L;
87 } // end of wxPen::wxPen
90 const wxBitmap
& rStipple
94 m_refData
= new wxPenRefData
;
96 M_PENDATA
->m_vStipple
= rStipple
;
97 M_PENDATA
->m_nWidth
= nWidth
;
98 M_PENDATA
->m_nStyle
= wxSTIPPLE
;
99 M_PENDATA
->m_nJoin
= wxJOIN_ROUND
;
100 M_PENDATA
->m_nCap
= wxCAP_ROUND
;
101 M_PENDATA
->m_hPen
= 0;
104 } // end of wxPen::wxPen
110 bool wxPen::RealizeResource()
116 if (M_PENDATA
&& M_PENDATA
->m_hPen
== 0L)
118 SIZEL vSize
= {0, 0};
119 DEVOPENSTRUC vDop
= {0L, "DISPLAY", NULL
, 0L, 0L, 0L, 0L, 0L, 0L};
120 HDC hDC
= ::DevOpenDC( vHabmain
127 M_PENDATA
->m_hPen
= (WXHPEN
)::GpiCreatePS( vHabmain
130 ,PU_PELS
| GPIT_MICRO
| GPIA_ASSOC
136 // Set the color table to RGB mode
138 if (!::GpiCreateLogColorTable( (HPS
)M_PENDATA
->m_hPen
146 vError
= ::WinGetLastError(vHabmain
);
147 sError
= wxPMErrorToStr(vError
);
148 wxLogError(_T("Unable to set current color table to RGB mode. Error: %s\n"), sError
.c_str());
151 if (M_PENDATA
->m_nStyle
== wxTRANSPARENT
)
156 COLORREF vPmColour
= 0L;
157 USHORT uLineType
= (USHORT
)wx2os2PenStyle(M_PENDATA
->m_nStyle
);
159 vPmColour
= M_PENDATA
->m_vColour
.GetPixel();
163 switch(M_PENDATA
->m_nJoin
)
166 uJoin
= LINEJOIN_BEVEL
;
170 uJoin
= LINEJOIN_MITRE
;
174 uJoin
= LINEJOIN_ROUND
;
180 switch(M_PENDATA
->m_nCap
)
182 case wxCAP_PROJECTING
:
183 uCap
= LINEEND_SQUARE
;
191 uCap
= LINEEND_ROUND
;
194 m_vLineBundle
.lColor
= (LONG
)vPmColour
;
195 m_vLineBundle
.usMixMode
= FM_OVERPAINT
;
196 m_vLineBundle
.fxWidth
= M_PENDATA
->m_nWidth
;
197 m_vLineBundle
.lGeomWidth
= M_PENDATA
->m_nWidth
;
198 m_vLineBundle
.usType
= uLineType
;
199 m_vLineBundle
.usEnd
= uCap
;
200 m_vLineBundle
.usJoin
= uJoin
;
202 bOk
= ::GpiSetAttrs( M_PENDATA
->m_hPen
204 ,LBB_COLOR
| LBB_MIX_MODE
| LBB_WIDTH
| LBB_GEOM_WIDTH
| LBB_TYPE
| LBB_END
| LBB_JOIN
210 vError
= ::WinGetLastError(vHabmain
);
211 sError
= wxPMErrorToStr(vError
);
212 wxLogError(_T("Can't set Gpi attributes for a LINEBUNDLE. Error: %s\n"), sError
.c_str());
216 ULONG flAttrMask
= 0L;
217 ULONG flDefMask
= 0L;
218 switch(M_PENDATA
->m_nStyle
)
221 ::GpiSetBitmapId( M_PENDATA
->m_hPen
222 ,(USHORT
)M_PENDATA
->m_vStipple
.GetHBITMAP()
223 ,(USHORT
)M_PENDATA
->m_vStipple
.GetId()
225 ::GpiSetPatternSet( M_PENDATA
->m_hPen
226 ,(USHORT
)M_PENDATA
->m_vStipple
.GetId()
228 flAttrMask
= ABB_COLOR
| ABB_BACK_COLOR
| ABB_MIX_MODE
| ABB_BACK_MIX_MODE
| ABB_SET
| ABB_SYMBOL
;
229 flDefMask
= ABB_REF_POINT
;
232 case wxBDIAGONAL_HATCH
:
233 m_vAreaBundle
.usSymbol
= PATSYM_DIAG3
;
234 m_vAreaBundle
.usSet
= LCID_DEFAULT
;
235 flAttrMask
= ABB_COLOR
| ABB_BACK_COLOR
| ABB_MIX_MODE
| ABB_BACK_MIX_MODE
| ABB_SYMBOL
;
236 flDefMask
= ABB_SET
| ABB_REF_POINT
;
239 case wxCROSSDIAG_HATCH
:
240 m_vAreaBundle
.usSymbol
= PATSYM_DIAGHATCH
;
241 m_vAreaBundle
.usSet
= LCID_DEFAULT
;
242 flAttrMask
= ABB_COLOR
| ABB_BACK_COLOR
| ABB_MIX_MODE
| ABB_BACK_MIX_MODE
| ABB_SYMBOL
;
243 flDefMask
= ABB_SET
| ABB_REF_POINT
;
246 case wxFDIAGONAL_HATCH
:
247 m_vAreaBundle
.usSymbol
= PATSYM_DIAG1
;
248 m_vAreaBundle
.usSet
= LCID_DEFAULT
;
249 flAttrMask
= ABB_COLOR
| ABB_BACK_COLOR
| ABB_MIX_MODE
| ABB_BACK_MIX_MODE
| ABB_SYMBOL
;
250 flDefMask
= ABB_SET
| ABB_REF_POINT
;
254 m_vAreaBundle
.usSymbol
= PATSYM_HATCH
;
255 m_vAreaBundle
.usSet
= LCID_DEFAULT
;
256 flAttrMask
= ABB_COLOR
| ABB_BACK_COLOR
| ABB_MIX_MODE
| ABB_BACK_MIX_MODE
| ABB_SYMBOL
;
257 flDefMask
= ABB_SET
| ABB_REF_POINT
;
260 case wxHORIZONTAL_HATCH
:
261 m_vAreaBundle
.usSymbol
= PATSYM_HORIZ
;
262 m_vAreaBundle
.usSet
= LCID_DEFAULT
;
263 flAttrMask
= ABB_COLOR
| ABB_BACK_COLOR
| ABB_MIX_MODE
| ABB_BACK_MIX_MODE
| ABB_SYMBOL
;
264 flDefMask
= ABB_SET
| ABB_REF_POINT
;
267 case wxVERTICAL_HATCH
:
268 m_vAreaBundle
.usSymbol
= PATSYM_VERT
;
269 m_vAreaBundle
.usSet
= LCID_DEFAULT
;
270 flAttrMask
= ABB_COLOR
| ABB_BACK_COLOR
| ABB_MIX_MODE
| ABB_BACK_MIX_MODE
| ABB_SYMBOL
;
271 flDefMask
= ABB_SET
| ABB_REF_POINT
;
275 m_vAreaBundle
.usSymbol
= PATSYM_SOLID
;
276 m_vAreaBundle
.usSet
= LCID_DEFAULT
;
277 flAttrMask
= ABB_COLOR
| ABB_BACK_COLOR
| ABB_MIX_MODE
| ABB_BACK_MIX_MODE
| ABB_SYMBOL
;
278 flDefMask
= ABB_SET
| ABB_REF_POINT
;
282 m_vAreaBundle
.lColor
= vPmColour
;
283 m_vAreaBundle
.lBackColor
= RGB_WHITE
;
284 m_vAreaBundle
.usMixMode
= FM_OVERPAINT
;
285 m_vAreaBundle
.usBackMixMode
= BM_OVERPAINT
;
287 bOk
= ::GpiSetAttrs( M_PENDATA
->m_hPen
295 vError
= ::WinGetLastError(vHabmain
);
296 sError
= wxPMErrorToStr(vError
);
297 wxLogError(_T("Can't set Gpi attributes for an AREABUNDLE. Error: %s\n"), sError
.c_str());
303 } // end of wxPen::RealizeResource
305 WXHANDLE
wxPen::GetResourceHandle()
310 return (WXHANDLE
)M_PENDATA
->m_hPen
;
311 } // end of wxPen::GetResourceHandle
313 bool wxPen::FreeResource( bool WXUNUSED(bForce
) )
315 if (M_PENDATA
&& (M_PENDATA
->m_hPen
!= 0))
317 M_PENDATA
->m_hPen
= 0;
321 } // end of wxPen::FreeResource
323 bool wxPen::IsFree() const
325 return (M_PENDATA
&& M_PENDATA
->m_hPen
== 0);
328 void wxPen::Unshare()
330 // Don't change shared data
333 m_refData
= new wxPenRefData();
337 wxPenRefData
* ref
= new wxPenRefData(*(wxPenRefData
*)m_refData
);
341 } // end of wxPen::Unshare
343 void wxPen::SetColour( const wxColour
& rColour
)
346 M_PENDATA
->m_vColour
= rColour
;
348 } // end of wxPen::SetColour
350 void wxPen::SetColour( unsigned char cRed
, unsigned char cGreen
, unsigned char cBlue
)
353 M_PENDATA
->m_vColour
.Set(cRed
, cGreen
, cBlue
);
355 } // end of wxPen::SetColour
357 void wxPen::SetPS( HPS hPS
)
360 if (M_PENDATA
->m_hPen
)
361 ::GpiDestroyPS(M_PENDATA
->m_hPen
);
362 M_PENDATA
->m_hPen
= hPS
;
364 } // end of WxWinGdi_CPen::SetPS
366 void wxPen::SetWidth(
371 M_PENDATA
->m_nWidth
= nWidth
;
373 } // end of wxPen::SetWidth
375 void wxPen::SetStyle(
380 M_PENDATA
->m_nStyle
= nStyle
;
382 } // end of wxPen::SetStyle
384 void wxPen::SetStipple(
385 const wxBitmap
& rStipple
389 M_PENDATA
->m_vStipple
= rStipple
;
390 M_PENDATA
->m_nStyle
= wxSTIPPLE
;
392 } // end of wxPen::SetStipple
394 void wxPen::SetDashes( int WXUNUSED(nNbDashes
),
395 const wxDash
* WXUNUSED(pDash
) )
398 // Does nothing under OS/2
400 } // end of wxPen::SetDashes
407 M_PENDATA
->m_nJoin
= nJoin
;
409 } // end of wxPen::SetJoin
416 M_PENDATA
->m_nCap
= nCap
;
418 } // end of wxPen::SetCap
429 nPMStyle
= LINETYPE_DOT
;
433 nPMStyle
= LINETYPE_DASHDOT
;
437 nPMStyle
= LINETYPE_SHORTDASH
;
441 nPMStyle
= LINETYPE_LONGDASH
;
445 nPMStyle
= LINETYPE_INVISIBLE
;
449 nPMStyle
= LINETYPE_DASHDOUBLEDOT
; // We must make a choice... This is mine!
454 nPMStyle
= LINETYPE_SOLID
;
458 } // end of wx2os2PenStyle