X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2e0e025ecd13ae6d1470e72b428e934748ce66d6..844f90fba68fc9fbd3e839825d406839ee9fb9fb:/src/unix/fontutil.cpp diff --git a/src/unix/fontutil.cpp b/src/unix/fontutil.cpp index 62b8e604f5..2c371f3c1f 100644 --- a/src/unix/fontutil.cpp +++ b/src/unix/fontutil.cpp @@ -95,7 +95,8 @@ static wxNativeFont wxLoadQueryFont(int pointSize, bool underlined, const wxString& facename, const wxString& xregistry, - const wxString& xencoding); + const wxString& xencoding, + wxString* xFontName); // ============================================================================ // implementation @@ -106,10 +107,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 ) @@ -128,10 +136,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; @@ -164,6 +172,7 @@ bool wxGetNativeFontEncoding(wxFontEncoding encoding, case wxFONTENCODING_ISO8859_9: case wxFONTENCODING_ISO8859_10: case wxFONTENCODING_ISO8859_11: + case wxFONTENCODING_ISO8859_12: case wxFONTENCODING_ISO8859_13: case wxFONTENCODING_ISO8859_14: case wxFONTENCODING_ISO8859_15: @@ -206,6 +215,8 @@ bool wxGetNativeFontEncoding(wxFontEncoding encoding, return FALSE; } + info->encoding = encoding; + return TRUE; } @@ -230,7 +241,8 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize, int weight, bool underlined, const wxString &facename, - wxFontEncoding encoding) + wxFontEncoding encoding, + wxString* xFontName) { if ( encoding == wxFONTENCODING_DEFAULT ) { @@ -264,9 +276,17 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize, } // OK, we have the correct xregistry/xencoding in info structure - wxNativeFont font = wxLoadQueryFont( pointSize, family, style, weight, + wxNativeFont font = 0; + + // if we already have the X font name, try to use it + if( xFontName && !xFontName->IsEmpty() ) + font = wxLoadFont(*xFontName); + + if( !font ) + font = wxLoadQueryFont( pointSize, family, style, weight, underlined, facename, - info.xregistry, info.xencoding ); + info.xregistry, info.xencoding, + xFontName ); if ( !font ) { @@ -280,14 +300,16 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize, for ( i = pointSize - 10; !font && i >= 10 && i >= min_size; i -= 10 ) { font = wxLoadQueryFont(i, family, style, weight, underlined, - facename, info.xregistry, info.xencoding); + facename, info.xregistry, info.xencoding, + xFontName); } // Search for larger size (approx.) for ( i = pointSize + 10; !font && i <= max_size; i += 10 ) { font = wxLoadQueryFont(i, family, style, weight, underlined, - facename, info.xregistry, info.xencoding); + facename, info.xregistry, info.xencoding, + xFontName); } // Try default family @@ -295,7 +317,8 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize, { font = wxLoadQueryFont(pointSize, wxDEFAULT, style, weight, underlined, facename, - info.xregistry, info.xencoding ); + info.xregistry, info.xencoding, + xFontName ); } // Bogus font I @@ -303,7 +326,8 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize, { font = wxLoadQueryFont(120, wxDEFAULT, wxNORMAL, wxNORMAL, underlined, facename, - info.xregistry, info.xencoding); + info.xregistry, info.xencoding, + xFontName); } // Bogus font II @@ -311,7 +335,8 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize, { font = wxLoadQueryFont(120, wxDEFAULT, wxNORMAL, wxNORMAL, underlined, wxEmptyString, - info.xregistry, info.xencoding); + info.xregistry, info.xencoding, + xFontName); } } @@ -361,7 +386,8 @@ static wxNativeFont wxLoadQueryFont(int pointSize, bool WXUNUSED(underlined), const wxString& facename, const wxString& xregistry, - const wxString& xencoding) + const wxString& xencoding, + wxString* xFontName) { wxString xfamily; switch (family) @@ -391,10 +417,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; @@ -498,6 +561,9 @@ static wxNativeFont wxLoadQueryFont(int pointSize, xfamily.c_str(), xweight.c_str(), xstyle.c_str(), pointSize, xregistry.c_str(), xencoding.c_str()); + if( xFontName ) + *xFontName = fontSpec; + return wxLoadFont(fontSpec); }