1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxFont class
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "font.h"
17 #include "wx/string.h"
19 #include "wx/gdicmn.h"
24 #if !USE_SHARED_LIBRARIES
25 IMPLEMENT_DYNAMIC_CLASS(wxFont
, wxGDIObject
)
28 wxFontRefData
::wxFontRefData(): m_fontsByScale(wxKEY_INTEGER
)
39 wxFontRefData
::wxFontRefData(const wxFontRefData
& data
): m_fontsByScale(wxKEY_INTEGER
)
41 m_style
= data
.m_style
;
42 m_pointSize
= data
.m_pointSize
;
43 m_family
= data
.m_family
;
44 m_style
= data
.m_style
;
45 m_weight
= data
.m_weight
;
46 m_underlined
= data
.m_underlined
;
47 m_faceName
= data
.m_faceName
;
49 // Don't have to copy actual fonts, because they'll be created
53 wxFontRefData
::~wxFontRefData()
55 wxNode
* node
= m_fontsByScale
.First();
58 XFontStruct
* fontStruct
= (XFontStruct
*) node
->Data();
59 XFreeFont((Display
*) wxGetDisplay
, fontStruct
);
62 m_fontsByScale
.Clear();
68 wxTheFontList
->Append(this);
71 wxFont
::wxFont(int pointSize
, int family
, int style
, int weight
, bool underlined
, const wxString
& faceName
)
73 Create(pointSize
, family
, style
, weight
, underlined
, faceName
);
76 wxTheFontList
->Append(this);
79 bool wxFont
::Create(int pointSize
, int family
, int style
, int weight
, bool underlined
, const wxString
& faceName
)
82 m_refData
= new wxFontRefData
;
84 M_FONTDATA
->m_family
= family
;
85 M_FONTDATA
->m_style
= style
;
86 M_FONTDATA
->m_weight
= weight
;
87 M_FONTDATA
->m_pointSize
= pointSize
;
88 M_FONTDATA
->m_underlined
= underlined
;
89 M_FONTDATA
->m_faceName
= faceName
;
99 wxTheFontList
->DeleteObject(this);
102 bool wxFont
::RealizeResource()
104 // TODO: create the font (if there is a native font object)
108 void wxFont
::Unshare()
110 // Don't change shared data
113 m_refData
= new wxFontRefData();
117 wxFontRefData
* ref
= new wxFontRefData(*(wxFontRefData
*)m_refData
);
123 void wxFont
::SetPointSize(int pointSize
)
127 M_FONTDATA
->m_pointSize
= pointSize
;
132 void wxFont
::SetFamily(int family
)
136 M_FONTDATA
->m_family
= family
;
141 void wxFont
::SetStyle(int style
)
145 M_FONTDATA
->m_style
= style
;
150 void wxFont
::SetWeight(int weight
)
154 M_FONTDATA
->m_weight
= weight
;
159 void wxFont
::SetFaceName(const wxString
& faceName
)
163 M_FONTDATA
->m_faceName
= faceName
;
168 void wxFont
::SetUnderlined(bool underlined
)
172 M_FONTDATA
->m_underlined
= underlined
;
177 wxString wxFont
::GetFamilyString() const
183 fam
= "wxDECORATIVE";
207 /* New font system */
208 wxString wxFont
::GetFaceName() const
212 str
= M_FONTDATA
->m_faceName
;
216 wxString wxFont
::GetStyleString() const
234 wxString wxFont
::GetWeightString() const
252 // Find an existing, or create a new, XFontStruct
253 // based on this wxFont and the given scale. Append the
254 // font to list in the private data for future reference.
255 WXFontStructPtr wxFont
::FindOrCreateFontStruct(double scale
)
260 long intScale
= long(scale
* 100.0 + 0.5); // key for fontlist
261 int pointSize
= (M_FONTDATA
->m_pointSize
* 10 * intScale
) / 100;
263 wxNode
* node
= M_FONTDATA
->m_fontsByScale
.Find(intScale
);
266 return (WXFontStructPtr
) node
->Data();
269 WXFontStructPtr font
= LoadQueryFont(pointSize
, M_FONTDATA
->m_family
,
270 M_FONTDATA
->m_style
, M_FONTDATA
->m_weight
, M_FONTDATA
->m_underlined
);
274 // search up and down by stepsize 10
275 int max_size
= pointSize
+ 20 * (1 + (pointSize
/180));
276 int min_size
= pointSize
- 20 * (1 + (pointSize
/180));
279 // Search for smaller size (approx.)
280 for (i
=pointSize
-10; !font
&& i
>= 10 && i
>= min_size
; i
-= 10)
281 font
= LoadQueryFont(i
, M_FONTDATA
->m_family
, M_FONTDATA
->m_style
, M_FONTDATA
->m_weight
, M_FONTDATA
->m_underlined
);
282 // Search for larger size (approx.)
283 for (i
=pointSize
+10; !font
&& i
<= max_size
; i
+= 10)
284 font
= LoadQueryFont(i
, M_FONTDATA
->m_family
, M_FONTDATA
->m_style
, M_FONTDATA
->m_weight
, M_FONTDATA
->m_underlined
);
285 // Try default family
286 if (!font
&& M_FONTDATA
->m_family
!= wxDEFAULT
)
287 font
= LoadQueryFont(pointSize
, wxDEFAULT
, M_FONTDATA
->m_style
,
288 M_FONTDATA
->m_weight
, M_FONTDATA
->m_underlined
);
291 font
= LoadQueryFont(120, wxDEFAULT
, wxNORMAL
, wxNORMAL
,
292 M_FONTDATA
->m_underlined
);
296 M_FONTDATA
->m_fontsByScale
.Append(intScale
, (wxObject
*) font
);
297 return (WXFontStructPtr
) font
;
302 WXFontStructPtr wxFont
::LoadQueryFont(int pointSize
, int family
, int style
,
303 int weight
, bool underlined
)
310 case wxDECORATIVE
: xfamily
= "lucida";
312 case wxROMAN
: xfamily
= "times";
314 case wxMODERN
: xfamily
= "courier";
316 case wxSWISS
: xfamily
= "lucida";
319 default: xfamily
= "*";
323 case wxITALIC
: xstyle
= "i";
325 case wxSLANT
: xstyle
= "o";
327 case wxNORMAL
: xstyle
= "r";
329 default: xstyle
= "*";
334 case wxBOLD
: xweight
= "bold";
337 case wxNORMAL
: xweight
= "medium";
339 default: xweight
= "*";
343 sprintf(wxBuffer
, "-*-%s-%s-%s-normal-*-*-%d-*-*-*-*-*-*",
344 xfamily
, xweight
, xstyle
, pointSize
);
346 Display
*dpy
= (Display
*) wxGetDisplay();
347 XFontStruct
* font
= XLoadQueryFont(dpy
, wxBuffer
);
349 return (WXFontStructPtr
) font
;