X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/338dd992160bf20205743c092b353d96ef7604fb..c25a510b30bd87f26deaf3532a48d29a158f0aea:/src/unix/fontutil.cpp diff --git a/src/unix/fontutil.cpp b/src/unix/fontutil.cpp index d1af8fa759..19c96b3df6 100644 --- a/src/unix/fontutil.cpp +++ b/src/unix/fontutil.cpp @@ -48,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 @@ -324,7 +332,16 @@ static bool wxTestFontSpec(const wxString& fontspec) return TRUE; } - wxNativeFont test = wxLoadFont(fontspec); + 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); @@ -374,10 +391,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; @@ -484,3 +538,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; +}