X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a4bacadeb2bf081d4d9911af2505ec06f17eb2a3..77611ad4da9df336a0805508276a81b8f4437107:/src/unix/fontutil.cpp diff --git a/src/unix/fontutil.cpp b/src/unix/fontutil.cpp index be3861a149..036c84272d 100644 --- a/src/unix/fontutil.cpp +++ b/src/unix/fontutil.cpp @@ -32,7 +32,13 @@ #endif // PCH #ifdef __X__ - #include +#ifdef __VMS__ +#pragma message disable nosimpint +#endif +#include +#ifdef __VMS__ +#pragma message enable nosimpint +#endif #include "wx/utils.h" // for wxGetDisplay() #elif defined(__WXGTK__) @@ -42,6 +48,14 @@ #include "wx/fontutil.h" #include "wx/fontmap.h" #include "wx/tokenzr.h" +#include "wx/hash.h" +#include "wx/module.h" + +// ---------------------------------------------------------------------------- +// private data +// ---------------------------------------------------------------------------- + +static wxHashTable *g_fontHash = (wxHashTable*) NULL; // ---------------------------------------------------------------------------- // private functions @@ -61,17 +75,7 @@ #elif defined(__WXGTK__) static inline wxNativeFont wxLoadFont(const wxString& fontSpec) { - wxNativeFont font = gdk_font_load( wxConvertWX2MB(fontSpec) ); - if(fontSpec == "-*-*-*-*-*-*-*-*-*-*-*-*-*-*") - { - if(font == NULL) - font = gdk_font_load (wxConvertWX2MB("-*-*-*-*-*-*-*-*-75-*-*-*-*-*")); - if(font == NULL) - font = gdk_font_load (wxConvertWX2MB("-*-*-*-*-*-*-*-*-100-*-*-*-*-*")); - if(font == NULL) - font = gdk_font_load (wxConvertWX2MB("-*-fixed-*-*-*-*-*-*-*-*-*-*-*-*")); - } - return font; + return gdk_font_load( wxConvertWX2MB(fontSpec) ); } static inline void wxFreeFont(wxNativeFont font) @@ -102,10 +106,17 @@ static wxNativeFont wxLoadQueryFont(int pointSize, // ---------------------------------------------------------------------------- // convert to/from the string representation: format is -// registry-encoding[-facename] +// encodingid;registry;encoding[;facename] bool wxNativeEncodingInfo::FromString(const wxString& s) { - wxStringTokenizer tokenizer(s, _T("-")); + wxStringTokenizer tokenizer(s, _T(";")); + // cannot use "-" because it may be part of encoding name + + wxString encid = tokenizer.GetNextToken(); + long enc; + if ( !encid.ToLong(&enc) ) + return FALSE; + encoding = (wxFontEncoding)enc; xregistry = tokenizer.GetNextToken(); if ( !xregistry ) @@ -124,10 +135,10 @@ bool wxNativeEncodingInfo::FromString(const wxString& s) wxString wxNativeEncodingInfo::ToString() const { wxString s; - s << xregistry << _T('-') << xencoding; + s << (long)encoding << _T(';') << xregistry << _T(';') << xencoding; if ( !!facename ) { - s << _T('-') << facename; + s << _T(';') << facename; } return s; @@ -202,6 +213,8 @@ bool wxGetNativeFontEncoding(wxFontEncoding encoding, return FALSE; } + info->encoding = encoding; + return TRUE; } @@ -228,11 +241,16 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize, const wxString &facename, wxFontEncoding encoding) { + if ( encoding == wxFONTENCODING_DEFAULT ) + { + encoding = wxFont::GetDefaultEncoding(); + } + // first determine the encoding - if the font doesn't exist at all in this // encoding, it's useless to do all other approximations (i.e. size, // family &c don't matter much) wxNativeEncodingInfo info; - if (encoding == wxFONTENCODING_SYSTEM) + if ( encoding == wxFONTENCODING_SYSTEM ) { // This will always work so we don't test to save time wxGetNativeFontEncoding(wxFONTENCODING_SYSTEM, &info); @@ -251,11 +269,10 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize, // so it would provoke a crash wxGetNativeFontEncoding(wxFONTENCODING_SYSTEM, &info); } - } + } } // OK, we have the correct xregistry/xencoding in info structure - wxNativeFont font = wxLoadQueryFont( pointSize, family, style, weight, underlined, facename, info.xregistry, info.xencoding ); @@ -317,7 +334,23 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize, // returns TRUE if there are any fonts matching this font spec static bool wxTestFontSpec(const wxString& fontspec) { - wxNativeFont test = wxLoadFont(fontspec); + // some X servers will fail to load this font because there are too many + // matches so we must test explicitly for this + if ( fontspec == _T("-*-*-*-*-*-*-*-*-*-*-*-*-*-*") ) + { + return TRUE; + } + + wxNativeFont test = (wxNativeFont) g_fontHash->Get( fontspec ); + if (test) + { +// printf( "speed up\n" ); + return TRUE; + } + + test = wxLoadFont(fontspec); + g_fontHash->Put( fontspec, (wxObject*) test ); + if ( test ) { wxFreeFont(test); @@ -367,10 +400,47 @@ static wxNativeFont wxLoadQueryFont(int pointSize, wxString xstyle; switch (style) { - case wxITALIC: xstyle = wxT("i"); break; - case wxSLANT: xstyle = wxT("o"); break; - case wxNORMAL: xstyle = wxT("r"); break; - default: xstyle = wxT("*"); break; + case wxSLANT: + fontSpec.Printf(wxT("-*-%s-*-o-*-*-*-*-*-*-*-*-*-*"), + xfamily.c_str()); + if ( wxTestFontSpec(fontSpec) ) + { + xstyle = wxT("o"); + break; + } + // fall through - try wxITALIC now + + case wxITALIC: + fontSpec.Printf(wxT("-*-%s-*-i-*-*-*-*-*-*-*-*-*-*"), + xfamily.c_str()); + if ( wxTestFontSpec(fontSpec) ) + { + xstyle = wxT("i"); + } + else if ( style == wxITALIC ) // and not wxSLANT + { + // try wxSLANT + fontSpec.Printf(wxT("-*-%s-*-o-*-*-*-*-*-*-*-*-*-*"), + xfamily.c_str()); + if ( wxTestFontSpec(fontSpec) ) + { + xstyle = wxT("o"); + } + else + { + // no italic, no slant - leave default + xstyle = wxT("*"); + } + } + break; + + default: + wxFAIL_MSG(_T("unknown font style")); + // fall back to normal + + case wxNORMAL: + xstyle = wxT("r"); + break; } wxString xweight; @@ -477,3 +547,32 @@ static wxNativeFont wxLoadQueryFont(int pointSize, return wxLoadFont(fontSpec); } +// ---------------------------------------------------------------------------- +// wxFontModule +// ---------------------------------------------------------------------------- + +class wxFontModule : public wxModule +{ +public: + bool OnInit(); + void OnExit(); + +private: + DECLARE_DYNAMIC_CLASS(wxFontModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxFontModule, wxModule) + +bool wxFontModule::OnInit() +{ + g_fontHash = new wxHashTable( wxKEY_STRING ); + + return TRUE; +} + +void wxFontModule::OnExit() +{ + delete g_fontHash; + + g_fontHash = (wxHashTable *)NULL; +}