X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b4e4abb51c35065b48ce5abe6b727aac498101dd..222702b112dcc7bebe018d6f4d66fe469fefd02c:/src/unix/fontutil.cpp diff --git a/src/unix/fontutil.cpp b/src/unix/fontutil.cpp index e1521328fc..082ce17f8b 100644 --- a/src/unix/fontutil.cpp +++ b/src/unix/fontutil.cpp @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "fontutil.h" #endif @@ -29,6 +29,8 @@ #endif #ifndef WX_PRECOMP + #include "wx/font.h" // wxFont enums + #include "wx/encinfo.h" #endif // PCH #include "wx/fontutil.h" @@ -56,6 +58,21 @@ void wxNativeFontInfo::Init() description = NULL; } +void +wxNativeFontInfo::Init(const wxNativeFontInfo& info) +{ + if (info.description) + description = pango_font_description_copy(info.description); + else + description = NULL; +} + +void wxNativeFontInfo::Free() +{ + if (description) + pango_font_description_free(description); +} + int wxNativeFontInfo::GetPointSize() const { return pango_font_description_get_size( description ) / PANGO_SCALE; @@ -83,31 +100,27 @@ wxFontStyle wxNativeFontInfo::GetStyle() const wxFontWeight wxNativeFontInfo::GetWeight() const { - wxFontWeight m_weight = wxFONTWEIGHT_NORMAL; +#if 0 + // We seem to currently initialize only by string. + // In that case PANGO_FONT_MASK_WEIGHT is always set. + if (!(pango_font_description_get_set_fields(description) & PANGO_FONT_MASK_WEIGHT)) + return wxFONTWEIGHT_NORMAL; +#endif - switch (pango_font_description_get_weight( description )) - { - case PANGO_WEIGHT_ULTRALIGHT: - m_weight = wxFONTWEIGHT_LIGHT; - break; - case PANGO_WEIGHT_LIGHT: - m_weight = wxFONTWEIGHT_LIGHT; - break; - case PANGO_WEIGHT_NORMAL: - m_weight = wxFONTWEIGHT_NORMAL; - break; - case PANGO_WEIGHT_BOLD: - m_weight = wxFONTWEIGHT_BOLD; - break; - case PANGO_WEIGHT_ULTRABOLD: - m_weight = wxFONTWEIGHT_BOLD; - break; - case PANGO_WEIGHT_HEAVY: - m_weight = wxFONTWEIGHT_BOLD; - break; - } + PangoWeight pango_weight = pango_font_description_get_weight( description ); + + // Until the API can be changed the following ranges of weight values are used: + // wxFONTWEIGHT_LIGHT: 100 .. 349 - range of 250 + // wxFONTWEIGHT_NORMAL: 350 .. 599 - range of 250 + // wxFONTWEIGHT_BOLD: 600 .. 900 - range of 301 (600 is "semibold" already) + + if (pango_weight >= 600) + return wxFONTWEIGHT_BOLD; - return m_weight; + if (pango_weight < 350) + return wxFONTWEIGHT_LIGHT; + + return wxFONTWEIGHT_NORMAL; } bool wxNativeFontInfo::GetUnderlined() const @@ -132,6 +145,44 @@ wxFontEncoding wxNativeFontInfo::GetEncoding() const return wxFONTENCODING_SYSTEM; } + +void wxNativeFontInfo::SetPointSize(int WXUNUSED(pointsize)) +{ + wxFAIL_MSG( _T("not implemented") ); +} + +void wxNativeFontInfo::SetStyle(wxFontStyle WXUNUSED(style)) +{ + wxFAIL_MSG( _T("not implemented") ); +} + +void wxNativeFontInfo::SetWeight(wxFontWeight WXUNUSED(weight)) +{ + wxFAIL_MSG( _T("not implemented") ); +} + +void wxNativeFontInfo::SetUnderlined(bool WXUNUSED(underlined)) +{ + wxFAIL_MSG( _T("not implemented") ); +} + +void wxNativeFontInfo::SetFaceName(wxString WXUNUSED(facename)) +{ + wxFAIL_MSG( _T("not implemented") ); +} + +void wxNativeFontInfo::SetFamily(wxFontFamily WXUNUSED(family)) +{ + wxFAIL_MSG( _T("not implemented") ); +} + +void wxNativeFontInfo::SetEncoding(wxFontEncoding WXUNUSED(encoding)) +{ + wxFAIL_MSG( _T("not implemented") ); +} + + + bool wxNativeFontInfo::FromString(const wxString& s) { if (description) @@ -183,7 +234,17 @@ bool wxTestFontEncoding(const wxNativeEncodingInfo& info) bool wxGetNativeFontEncoding(wxFontEncoding encoding, wxNativeEncodingInfo *info) { - return FALSE; + // we *must* return true for default encoding as otherwise wxFontMapper + // considers that we can't load any font and aborts with wxLogFatalError! + if ( encoding == wxFONTENCODING_SYSTEM ) + { + info->facename.clear(); + info->encoding = wxFONTENCODING_SYSTEM; + } + + // pretend that we support everything, it's better than to always return + // false as the old code did + return true; } #else // GTK+ 1.x @@ -235,10 +296,13 @@ static wxHashTable *g_fontHash = (wxHashTable*) NULL; #elif defined(__WXGTK__) wxNativeFont wxLoadFont(const wxString& fontSpec) { - // use gdk_fontset_load() instead of gdk_font_load() because otherwise - // we have problems with Japanese (not terribly precise, I know, but - // this is all the patch said) - return gdk_fontset_load( wxConvertWX2MB(fontSpec) ); + // VZ: we should use gdk_fontset_load() instead of gdk_font_load() + // here to be able to display Japanese fonts correctly (at least + // this is what people report) but unfortunately doing it results + // in tons of warnings when using GTK with "normal" European + // languages and so we can't always do it and I don't know enough + // to determine when should this be done... (FIXME) + return gdk_font_load( wxConvertWX2MB(fontSpec) ); } inline void wxFreeFont(wxNativeFont font) @@ -521,13 +585,13 @@ bool wxNativeFontInfo::GetUnderlined() const wxString wxNativeFontInfo::GetFaceName() const { - // wxWindows facename probably more accurately corresponds to X family + // wxWidgets facename probably more accurately corresponds to X family return GetXFontComponent(wxXLFD_FAMILY); } wxFontFamily wxNativeFontInfo::GetFamily() const { - // and wxWindows family -- to X foundry, but we have to translate it to + // and wxWidgets family -- to X foundry, but we have to translate it to // wxFontFamily somehow... wxFAIL_MSG(_T("not implemented")); // GetXFontComponent(wxXLFD_FOUNDRY); @@ -668,11 +732,12 @@ bool wxGetNativeFontEncoding(wxFontEncoding encoding, break; case wxFONTENCODING_GB2312: - info->xregistry = wxT("GB2312"); // or the otherway round? + info->xregistry = wxT("GB2312"); // or the otherway round? info->xencoding = wxT("*"); break; case wxFONTENCODING_KOI8: + case wxFONTENCODING_KOI8_U: info->xregistry = wxT("koi8"); // we don't make distinction between koi8-r, koi8-u and koi8-ru (so far) @@ -794,27 +859,49 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize, *xFontName = newFontName; } - // try to load exactly the font requested first - if( !font ) - { - font = wxLoadQueryFont( pointSize, family, style, weight, - underlined, facename, - info.xregistry, info.xencoding, - xFontName ); - } - 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; + int i, round; // counters + + // first round: search for equal, then for smaller and for larger size with the given weight and style + int testweight = weight; + int teststyle = style; - // Search for smaller size (approx.) - for ( i = pointSize - 10; !font && i >= 10 && i >= min_size; i -= 10 ) + for ( round = 0; round < 3; round++ ) { - font = wxLoadQueryFont(i, family, style, weight, underlined, + // second round: use normal weight + if ( round == 1 ) + { + if ( testweight != wxNORMAL ) + { + testweight = wxNORMAL; + } + else + { + ++round; // fall through to third round + } + } + + // third round: ... and use normal style + if ( round == 2 ) + { + if ( teststyle != wxNORMAL ) + { + teststyle = wxNORMAL; + } + else + { + break; + } + } + // Search for equal or smaller size (approx.) + for ( i = pointSize; !font && i >= 10 && i >= min_size; i -= 10 ) + { + font = wxLoadQueryFont(i, family, teststyle, testweight, underlined, facename, info.xregistry, info.xencoding, xFontName); } @@ -822,9 +909,10 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize, // Search for larger size (approx.) for ( i = pointSize + 10; !font && i <= max_size; i += 10 ) { - font = wxLoadQueryFont(i, family, style, weight, underlined, + font = wxLoadQueryFont(i, family, teststyle, testweight, underlined, facename, info.xregistry, info.xencoding, xFontName); + } } // Try default family