-// ----------------------------------------------------------------------------
-// font-related functions
-// ----------------------------------------------------------------------------
-
-// define the functions to create and destroy native fonts for this toolkit
-#ifdef __X__
- static inline wxNativeFont wxLoadFont(const wxString& fontSpec)
- {
- return XLoadQueryFont((Display *)wxGetDisplay(), fontSpec);
- }
-
- static inline void wxFreeFont(wxNativeFont font)
- {
- XFreeFont((Display *)wxGetDisplay(), font);
- }
-#elif defined(__WXGTK__)
- static inline wxNativeFont wxLoadFont(const wxString& fontSpec)
- {
- return gdk_font_load( wxConvCurrent->cWX2MB(fontSpec) );
- }
-
- static inline void wxFreeFont(wxNativeFont font)
- {
- gdk_font_unref(font);
- }
-#else
- #error "Unknown GUI toolkit"
-#endif
-
-// returns TRUE if there are any fonts matching this font spec
-static bool wxTestFontSpec(const wxString& fontspec)
-{
- wxNativeFont test = wxLoadFont(fontspec);
- if ( test )
- {
- wxFreeFont(test);
-
- return TRUE;
- }
- else
- {
- return FALSE;
- }
-}
-
-// TODO encoding test logic should be moved to wxLoadQueryNearestFont()
-static wxNativeFont wxLoadQueryFont(int pointSize,
- int family,
- int style,
- int weight,
- bool WXUNUSED(underlined),
- const wxString &facename,
- wxFontEncoding encoding )
-{
- wxString xfamily;
- switch (family)
- {
- case wxDECORATIVE: xfamily = _T("lucida"); break;
- case wxROMAN: xfamily = _T("times"); break;
- case wxMODERN: xfamily = _T("courier"); break;
- case wxSWISS: xfamily = _T("helvetica"); break;
- case wxTELETYPE: xfamily = _T("lucidatypewriter"); break;
- case wxSCRIPT: xfamily = _T("utopia"); break;
- default: xfamily = _T("*");
- }
-
- wxString fontSpec;
- if (!facename.IsEmpty())
- {
- fontSpec.Printf(_T("-*-%s-*-*-normal-*-*-*-*-*-*-*-*-*"),
- facename.c_str());
-
- if ( wxTestFontSpec(fontSpec) )
- {
- xfamily = facename;
- }
- //else: no such family, use default one instead
- }
-
- wxString xstyle;
- switch (style)
- {
- case wxITALIC: xstyle = _T("i"); break;
- case wxSLANT: xstyle = _T("o"); break;
- case wxNORMAL: xstyle = _T("r"); break;
- default: xstyle = _T("*"); break;
- }
-
- wxString xweight;
- switch (weight)
- {
- case wxBOLD: xweight = _T("bold"); break;
- case wxLIGHT:
- case wxNORMAL: xweight = _T("medium"); break;
- default: xweight = _T("*"); break;
- }
-
- wxString xregistry, xencoding;
- if ( encoding == wxFONTENCODING_DEFAULT )
- {
- // use the apps default
- encoding = wxFont::GetDefaultEncoding();
- }
-
- bool test = TRUE; // should we test for availability of encoding?
- switch ( encoding )
- {
- case wxFONTENCODING_ISO8859_1:
- case wxFONTENCODING_ISO8859_2:
- case wxFONTENCODING_ISO8859_3:
- case wxFONTENCODING_ISO8859_4:
- case wxFONTENCODING_ISO8859_5:
- case wxFONTENCODING_ISO8859_6:
- case wxFONTENCODING_ISO8859_7:
- case wxFONTENCODING_ISO8859_8:
- case wxFONTENCODING_ISO8859_9:
- case wxFONTENCODING_ISO8859_10:
- case wxFONTENCODING_ISO8859_11:
- case wxFONTENCODING_ISO8859_13:
- case wxFONTENCODING_ISO8859_14:
- case wxFONTENCODING_ISO8859_15:
- {
- int cp = encoding - wxFONTENCODING_ISO8859_1 + 1;
- xregistry = _T("iso8859");
- xencoding.Printf(_T("%d"), cp);
- }
- break;
-
- case wxFONTENCODING_KOI8:
- xregistry = _T("koi8");
- if ( wxTestFontSpec(_T("-*-*-*-*-*-*-*-*-*-*-*-*-koi8-1")) )
- {
- xencoding = _T("1");
-
- // test passed, no need to do it once more
- test = FALSE;
- }
- else
- {
- xencoding = _T("*");
- }
- break;
-
- case wxFONTENCODING_CP1250:
- case wxFONTENCODING_CP1251:
- case wxFONTENCODING_CP1252:
- {
- int cp = encoding - wxFONTENCODING_CP1250 + 1250;
- fontSpec.Printf(_T("-*-*-*-*-*-*-*-*-*-*-*-*-microsoft-cp%d"),
- cp);
- if ( wxTestFontSpec(fontSpec) )
- {
- xregistry = _T("microsoft");
- xencoding.Printf(_T("cp%d"), cp);
-
- // test passed, no need to do it once more
- test = FALSE;
- }
- else
- {
- // fall back to LatinX
- xregistry = _T("iso8859");
- xencoding.Printf(_T("%d"), cp - 1249);
- }
- }
- break;
-
- case wxFONTENCODING_SYSTEM:
- default:
- test = FALSE;
- xregistry =
- xencoding = _T("*");
- }
-
- if ( test )
- {
- fontSpec.Printf(_T("-*-*-*-*-*-*-*-*-*-*-*-*-%s-%s"),
- xregistry.c_str(), xencoding.c_str());
- if ( !wxTestFontSpec(fontSpec) )
- {
- // this encoding isn't available - what to do?
- xregistry =
- xencoding = _T("*");
- }
- }
-
- // construct the X font spec from our data
- fontSpec.Printf(_T("-*-%s-%s-%s-normal-*-*-%d-*-*-*-*-%s-%s"),
- xfamily.c_str(), xweight.c_str(), xstyle.c_str(),
- pointSize, xregistry.c_str(), xencoding.c_str());
-
- return wxLoadFont(fontSpec);
-}
-
-wxNativeFont wxLoadQueryNearestFont(int pointSize,
- int family,
- int style,
- int weight,
- bool underlined,
- const wxString &facename,
- wxFontEncoding encoding)
-{
- wxNativeFont font = wxLoadQueryFont( pointSize, family, style, weight,
- underlined, facename, encoding );
-
- if (!font)
- {
- // search up and down by stepsize 10
- int max_size = pointSize + 20 * (1 + (pointSize/180));
- int min_size = pointSize - 20 * (1 + (pointSize/180));
-
- int i;
-
- // Search for smaller size (approx.)
- for ( i = pointSize - 10; !font && i >= 10 && i >= min_size; i -= 10 )
- {
- font = wxLoadQueryFont(i, family, style, weight, underlined,
- facename, encoding );
- }
-
- // Search for larger size (approx.)
- for ( i = pointSize + 10; !font && i <= max_size; i += 10 )
- {
- font = wxLoadQueryFont( i, family, style, weight, underlined,
- facename, encoding );
- }
-
- // Try default family
- if ( !font && family != wxDEFAULT )
- {
- font = wxLoadQueryFont( pointSize, wxDEFAULT, style, weight,
- underlined, facename, encoding );
- }
-
- // Bogus font
- if ( !font )
- {
- font = wxLoadQueryFont(120, wxDEFAULT, wxNORMAL, wxNORMAL,
- underlined, facename, encoding );
- }
- }
-
- return font;
-}
-