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()
32 m_nStyle
= wxPENSTYLE_SOLID
;
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
89 #if FUTURE_WXWIN_COMPATIBILITY_3_0
90 wxPen::wxPen(const wxColour
& colour
, int width
, int style
)
92 m_refData
= new wxPenRefData
;
94 M_PENDATA
->m_vColour
= colour
;
95 M_PENDATA
->m_nWidth
= width
;
96 M_PENDATA
->m_nStyle
= (wxPenStyle
)nStyle
;
97 M_PENDATA
->m_nJoin
= wxJOIN_ROUND
;
98 M_PENDATA
->m_nCap
= wxCAP_ROUND
;
99 M_PENDATA
->m_hPen
= 0L;
106 const wxBitmap
& rStipple
110 m_refData
= new wxPenRefData
;
112 M_PENDATA
->m_vStipple
= rStipple
;
113 M_PENDATA
->m_nWidth
= nWidth
;
114 M_PENDATA
->m_nStyle
= wxSTIPPLE
;
115 M_PENDATA
->m_nJoin
= wxJOIN_ROUND
;
116 M_PENDATA
->m_nCap
= wxCAP_ROUND
;
117 M_PENDATA
->m_hPen
= 0;
120 } // end of wxPen::wxPen
126 bool wxPen::RealizeResource()
132 if (M_PENDATA
&& M_PENDATA
->m_hPen
== 0L)
134 SIZEL vSize
= {0, 0};
135 DEVOPENSTRUC vDop
= {0L, "DISPLAY", NULL
, 0L, 0L, 0L, 0L, 0L, 0L};
136 HDC hDC
= ::DevOpenDC( vHabmain
143 M_PENDATA
->m_hPen
= (WXHPEN
)::GpiCreatePS( vHabmain
146 ,PU_PELS
| GPIT_MICRO
| GPIA_ASSOC
152 // Set the color table to RGB mode
154 if (!::GpiCreateLogColorTable( (HPS
)M_PENDATA
->m_hPen
162 vError
= ::WinGetLastError(vHabmain
);
163 sError
= wxPMErrorToStr(vError
);
164 wxLogError(_T("Unable to set current color table to RGB mode. Error: %s\n"), sError
.c_str());
167 if (M_PENDATA
->m_nStyle
== wxPENSTYLE_TRANSPARENT
)
172 COLORREF vPmColour
= 0L;
173 USHORT uLineType
= (USHORT
)wx2os2PenStyle(M_PENDATA
->m_nStyle
);
175 vPmColour
= M_PENDATA
->m_vColour
.GetPixel();
179 switch(M_PENDATA
->m_nJoin
)
182 uJoin
= LINEJOIN_BEVEL
;
186 uJoin
= LINEJOIN_MITRE
;
190 uJoin
= LINEJOIN_ROUND
;
196 switch(M_PENDATA
->m_nCap
)
198 case wxCAP_PROJECTING
:
199 uCap
= LINEEND_SQUARE
;
207 uCap
= LINEEND_ROUND
;
210 m_vLineBundle
.lColor
= (LONG
)vPmColour
;
211 m_vLineBundle
.usMixMode
= FM_OVERPAINT
;
212 if (M_PENDATA
->m_nWidth
< 1)
213 M_PENDATA
->m_nWidth
= 1;
214 m_vLineBundle
.fxWidth
= M_PENDATA
->m_nWidth
;
215 m_vLineBundle
.lGeomWidth
= M_PENDATA
->m_nWidth
;
216 m_vLineBundle
.usType
= uLineType
;
217 m_vLineBundle
.usEnd
= uCap
;
218 m_vLineBundle
.usJoin
= uJoin
;
220 bOk
= ::GpiSetAttrs( M_PENDATA
->m_hPen
222 ,LBB_COLOR
| LBB_MIX_MODE
| LBB_WIDTH
| LBB_GEOM_WIDTH
| LBB_TYPE
| LBB_END
| LBB_JOIN
228 vError
= ::WinGetLastError(vHabmain
);
229 sError
= wxPMErrorToStr(vError
);
230 wxLogError(_T("Can't set Gpi attributes for a LINEBUNDLE. Error: %s\n"), sError
.c_str());
234 ULONG flAttrMask
= 0L;
235 ULONG flDefMask
= 0L;
236 switch(M_PENDATA
->m_nStyle
)
238 case wxPENSTYLE_STIPPLE
:
239 ::GpiSetBitmapId( M_PENDATA
->m_hPen
240 ,(USHORT
)M_PENDATA
->m_vStipple
.GetHBITMAP()
241 ,(USHORT
)M_PENDATA
->m_vStipple
.GetId()
243 ::GpiSetPatternSet( M_PENDATA
->m_hPen
244 ,(USHORT
)M_PENDATA
->m_vStipple
.GetId()
246 flAttrMask
= ABB_COLOR
| ABB_BACK_COLOR
| ABB_MIX_MODE
| ABB_BACK_MIX_MODE
| ABB_SET
| ABB_SYMBOL
;
247 flDefMask
= ABB_REF_POINT
;
250 case wxPENSTYLE_BDIAGONAL_HATCH
:
251 m_vAreaBundle
.usSymbol
= PATSYM_DIAG3
;
252 m_vAreaBundle
.usSet
= LCID_DEFAULT
;
253 flAttrMask
= ABB_COLOR
| ABB_BACK_COLOR
| ABB_MIX_MODE
| ABB_BACK_MIX_MODE
| ABB_SYMBOL
;
254 flDefMask
= ABB_SET
| ABB_REF_POINT
;
257 case wxPENSTYLE_CROSSDIAG_HATCH
:
258 m_vAreaBundle
.usSymbol
= PATSYM_DIAGHATCH
;
259 m_vAreaBundle
.usSet
= LCID_DEFAULT
;
260 flAttrMask
= ABB_COLOR
| ABB_BACK_COLOR
| ABB_MIX_MODE
| ABB_BACK_MIX_MODE
| ABB_SYMBOL
;
261 flDefMask
= ABB_SET
| ABB_REF_POINT
;
264 case wxPENSTYLE_FDIAGONAL_HATCH
:
265 m_vAreaBundle
.usSymbol
= PATSYM_DIAG1
;
266 m_vAreaBundle
.usSet
= LCID_DEFAULT
;
267 flAttrMask
= ABB_COLOR
| ABB_BACK_COLOR
| ABB_MIX_MODE
| ABB_BACK_MIX_MODE
| ABB_SYMBOL
;
268 flDefMask
= ABB_SET
| ABB_REF_POINT
;
271 case wxPENSTYLE_CROSS_HATCH
:
272 m_vAreaBundle
.usSymbol
= PATSYM_HATCH
;
273 m_vAreaBundle
.usSet
= LCID_DEFAULT
;
274 flAttrMask
= ABB_COLOR
| ABB_BACK_COLOR
| ABB_MIX_MODE
| ABB_BACK_MIX_MODE
| ABB_SYMBOL
;
275 flDefMask
= ABB_SET
| ABB_REF_POINT
;
278 case wxPENSTYLE_HORIZONTAL_HATCH
:
279 m_vAreaBundle
.usSymbol
= PATSYM_HORIZ
;
280 m_vAreaBundle
.usSet
= LCID_DEFAULT
;
281 flAttrMask
= ABB_COLOR
| ABB_BACK_COLOR
| ABB_MIX_MODE
| ABB_BACK_MIX_MODE
| ABB_SYMBOL
;
282 flDefMask
= ABB_SET
| ABB_REF_POINT
;
285 case wxPENSTYLE_VERTICAL_HATCH
:
286 m_vAreaBundle
.usSymbol
= PATSYM_VERT
;
287 m_vAreaBundle
.usSet
= LCID_DEFAULT
;
288 flAttrMask
= ABB_COLOR
| ABB_BACK_COLOR
| ABB_MIX_MODE
| ABB_BACK_MIX_MODE
| ABB_SYMBOL
;
289 flDefMask
= ABB_SET
| ABB_REF_POINT
;
293 m_vAreaBundle
.usSymbol
= PATSYM_SOLID
;
294 m_vAreaBundle
.usSet
= LCID_DEFAULT
;
295 flAttrMask
= ABB_COLOR
| ABB_BACK_COLOR
| ABB_MIX_MODE
| ABB_BACK_MIX_MODE
| ABB_SYMBOL
;
296 flDefMask
= ABB_SET
| ABB_REF_POINT
;
300 m_vAreaBundle
.lColor
= vPmColour
;
301 m_vAreaBundle
.lBackColor
= RGB_WHITE
;
302 m_vAreaBundle
.usMixMode
= FM_OVERPAINT
;
303 m_vAreaBundle
.usBackMixMode
= BM_OVERPAINT
;
305 bOk
= ::GpiSetAttrs( M_PENDATA
->m_hPen
313 vError
= ::WinGetLastError(vHabmain
);
314 sError
= wxPMErrorToStr(vError
);
315 wxLogError(_T("Can't set Gpi attributes for an AREABUNDLE. Error: %s\n"), sError
.c_str());
321 } // end of wxPen::RealizeResource
323 WXHANDLE
wxPen::GetResourceHandle() const
328 return (WXHANDLE
)M_PENDATA
->m_hPen
;
329 } // end of wxPen::GetResourceHandle
331 bool wxPen::FreeResource( bool WXUNUSED(bForce
) )
333 if (M_PENDATA
&& (M_PENDATA
->m_hPen
!= 0))
335 M_PENDATA
->m_hPen
= 0;
339 } // end of wxPen::FreeResource
341 bool wxPen::IsFree() const
343 return (M_PENDATA
&& M_PENDATA
->m_hPen
== 0);
346 wxGDIRefData
* wxPen::CreateGDIRefData() const
348 return new wxPenRefData
;
351 wxGDIRefData
* wxPen::CloneGDIRefData(const wxGDIRefData
* data
) const
353 return new wxPenRefData(*wx_static_cast(const wxPenRefData
*, data
));
356 void wxPen::SetColour( const wxColour
& rColour
)
359 M_PENDATA
->m_vColour
= rColour
;
361 } // end of wxPen::SetColour
363 void wxPen::SetColour( unsigned char cRed
, unsigned char cGreen
, unsigned char cBlue
)
366 M_PENDATA
->m_vColour
.Set(cRed
, cGreen
, cBlue
);
368 } // end of wxPen::SetColour
370 void wxPen::SetPS( HPS hPS
)
373 if (M_PENDATA
->m_hPen
)
374 ::GpiDestroyPS(M_PENDATA
->m_hPen
);
375 M_PENDATA
->m_hPen
= hPS
;
377 } // end of WxWinGdi_CPen::SetPS
379 void wxPen::SetWidth(
384 M_PENDATA
->m_nWidth
= nWidth
;
386 } // end of wxPen::SetWidth
388 void wxPen::SetStyle(
393 M_PENDATA
->m_nStyle
= nStyle
;
395 } // end of wxPen::SetStyle
397 void wxPen::SetStipple(
398 const wxBitmap
& rStipple
402 M_PENDATA
->m_vStipple
= rStipple
;
403 M_PENDATA
->m_nStyle
= wxSTIPPLE
;
405 } // end of wxPen::SetStipple
407 void wxPen::SetDashes( int WXUNUSED(nNbDashes
),
408 const wxDash
* WXUNUSED(pDash
) )
411 // Does nothing under OS/2
413 } // end of wxPen::SetDashes
420 M_PENDATA
->m_nJoin
= nJoin
;
422 } // end of wxPen::SetJoin
429 M_PENDATA
->m_nCap
= nCap
;
431 } // end of wxPen::SetCap
442 nPMStyle
= LINETYPE_DOT
;
445 case wxPENSTYLE_DOT_DASH
:
446 nPMStyle
= LINETYPE_DASHDOT
;
449 case wxPENSTYLE_SHORT_DASH
:
450 nPMStyle
= LINETYPE_SHORTDASH
;
453 case wxPENSTYLE_LONG_DASH
:
454 nPMStyle
= LINETYPE_LONGDASH
;
457 case wxPENSTYLE_TRANSPARENT
:
458 nPMStyle
= LINETYPE_INVISIBLE
;
461 case wxPENSTYLE_USER_DASH
:
462 nPMStyle
= LINETYPE_DASHDOUBLEDOT
; // We must make a choice... This is mine!
465 case wxPENSTYLE_SOLID
:
467 nPMStyle
= LINETYPE_SOLID
;
471 } // end of wx2os2PenStyle