X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4ea45e6ba3d47ef3f1a98d64a51149b7f004975f..758bce950ba9236d0a9edc4c880c3ec73b5173f3:/src/unix/fontutil.cpp?ds=sidebyside diff --git a/src/unix/fontutil.cpp b/src/unix/fontutil.cpp index 3b3444b4ab..f190de22b6 100644 --- a/src/unix/fontutil.cpp +++ b/src/unix/fontutil.cpp @@ -192,16 +192,14 @@ bool wxGetNativeFontEncoding(wxFontEncoding encoding, break; case wxFONTENCODING_UTF8: - // FIXME: this is probably false, but this is how they are called on - // my system and I don't know what the standard XFLD is (VZ) - info->xregistry = wxT("iso646.1991"); + info->xregistry = wxT("iso10646"); info->xencoding = wxT("*"); break; case wxFONTENCODING_KOI8: info->xregistry = wxT("koi8"); - // we don't make distinction between koi8-r and koi8-u (so far) + // we don't make distinction between koi8-r, koi8-u and koi8-ru (so far) info->xencoding = wxT("*"); break; @@ -278,7 +276,9 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize, if ( !wxGetNativeFontEncoding(encoding, &info) || !wxTestFontEncoding(info) ) { +#if wxUSE_FONTMAP if ( !wxTheFontMapper->GetAltForEncoding(encoding, &info) ) +#endif // wxUSE_FONTMAP { // unspported encoding - replace it with the default // @@ -318,11 +318,14 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize, *xFontName = newFontName; } + // try to load exactly the font requested first if( !font ) + { font = wxLoadQueryFont( pointSize, family, style, weight, - underlined, facename, + underlined, facename, info.xregistry, info.xencoding, xFontName ); + } if ( !font ) { @@ -357,22 +360,49 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize, xFontName ); } - // Bogus font I + // ignore size, family, style and weight but try to find font with the + // given facename and encoding if ( !font ) { font = wxLoadQueryFont(120, wxDEFAULT, wxNORMAL, wxNORMAL, underlined, facename, info.xregistry, info.xencoding, xFontName); - } - // Bogus font II - if ( !font ) - { - font = wxLoadQueryFont(120, wxDEFAULT, wxNORMAL, wxNORMAL, - underlined, wxEmptyString, - info.xregistry, info.xencoding, - xFontName); + // ignore family as well + if ( !font ) + { + font = wxLoadQueryFont(120, wxDEFAULT, wxNORMAL, wxNORMAL, + underlined, wxEmptyString, + info.xregistry, info.xencoding, + xFontName); + + // if it still failed, try to get the font of any size but + // with the requested encoding: this can happen if the + // encoding is only available in one size which happens to be + // different from 120 + if ( !font ) + { + font = wxLoadQueryFont(-1, wxDEFAULT, wxNORMAL, wxNORMAL, + FALSE, wxEmptyString, + info.xregistry, info.xencoding, + xFontName); + + // this should never happen as we had tested for it in the + // very beginning, but if it does, do return something non + // NULL or we'd crash in wxFont code + if ( !font ) + { + wxFAIL_MSG( _T("this encoding should be available!") ); + + font = wxLoadQueryFont(-1, + wxDEFAULT, wxNORMAL, wxNORMAL, + FALSE, wxEmptyString, + _T("*"), _T("*"), + xFontName); + } + } + } } } @@ -591,10 +621,21 @@ static wxNativeFont wxLoadQueryFont(int pointSize, default: xweight = wxT("*"); break; } + // if pointSize is -1, don't specify any + wxString sizeSpec; + if ( fontSpec == -1 ) + { + sizeSpec = _T('*'); + } + else + { + sizeSpec.Printf(_T("%d"), pointSize); + } + // construct the X font spec from our data - fontSpec.Printf(wxT("-*-%s-%s-%s-normal-*-*-%d-*-*-*-*-%s-%s"), + fontSpec.Printf(wxT("-*-%s-%s-%s-normal-*-*-%s-*-*-*-*-%s-%s"), xfamily.c_str(), xweight.c_str(), xstyle.c_str(), - pointSize, xregistry.c_str(), xencoding.c_str()); + sizeSpec.c_str(), xregistry.c_str(), xencoding.c_str()); if( xFontName ) *xFontName = fontSpec;