X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/36f210c81e5f8cdc65b80e57aad0c11bf2d08e63..2035e10e83324c6925d12725b842768f6e2b00a2:/src/gtk/font.cpp diff --git a/src/gtk/font.cpp b/src/gtk/font.cpp index 738981520b..5e9d1ce629 100644 --- a/src/gtk/font.cpp +++ b/src/gtk/font.cpp @@ -20,14 +20,18 @@ #endif #include "wx/font.h" +#include "wx/fontutil.h" +#include "wx/cmndata.h" #include "wx/utils.h" #include "wx/log.h" #include "wx/gdicmn.h" #include "wx/tokenzr.h" +#include "wx/settings.h" #include -#include "gdk/gdk.h" +#include +#include // ---------------------------------------------------------------------------- // wxFontRefData @@ -122,7 +126,7 @@ wxFontRefData::wxFontRefData(int size, int family, int style, int weight, bool underlined, const wxString& faceName, wxFontEncoding encoding ) : m_scaled_xfonts(wxKEY_INTEGER) { - Init(size, family, style, weight, + Init(size, family, style, weight, underlined, faceName, encoding); } @@ -150,18 +154,16 @@ void wxFont::Init() wxTheFontList->Append( this ); } -wxFont::wxFont( GdkFont *WXUNUSED(font), char *xFontName ) +wxFont::wxFont( const wxString& fontname, const wxFontData& fontdata ) { - if (!xFontName) - return; - Init(); + wxCHECK_RET( !!fontname, _T("invalid font spec") ); + m_refData = new wxFontRefData(); wxString tmp; - wxString fontname( xFontName ); wxStringTokenizer tn( fontname, wxT("-") ); tn.GetNextToken(); // foundry @@ -177,7 +179,7 @@ wxFont::wxFont( GdkFont *WXUNUSED(font), char *xFontName ) if (tmp == wxT("LIGHT")) M_FONTDATA->m_weight = wxLIGHT; if (tmp == wxT("THIN")) M_FONTDATA->m_weight = wxLIGHT; - + tmp = tn.GetNextToken().MakeUpper(); // slant if (tmp == wxT("I")) M_FONTDATA->m_style = wxITALIC; if (tmp == wxT("O")) M_FONTDATA->m_style = wxITALIC; @@ -187,8 +189,8 @@ wxFont::wxFont( GdkFont *WXUNUSED(font), char *xFontName ) tn.GetNextToken(); // pixel size tmp = tn.GetNextToken(); // pointsize - int num = wxStrtol (tmp.c_str(), (wxChar **) NULL, 10); - M_FONTDATA->m_pointSize = num / 10; + long num = wxStrtol (tmp.c_str(), (wxChar **) NULL, 10); + M_FONTDATA->m_pointSize = (int)(num / 10); tn.GetNextToken(); // x-res tn.GetNextToken(); // y-res @@ -211,32 +213,36 @@ wxFont::wxFont( GdkFont *WXUNUSED(font), char *xFontName ) tn.GetNextToken(); // avg width // deal with font encoding - wxString registry = tn.GetNextToken().MakeUpper(), - encoding = tn.GetNextToken().MakeUpper(); - - if ( registry == _T("ISO8859") ) + M_FONTDATA->m_encoding = fontdata.GetEncoding(); + if ( M_FONTDATA->m_encoding == wxFONTENCODING_SYSTEM ) { - int cp; - if ( wxSscanf(encoding, "%d", &cp) == 1 ) + wxString registry = tn.GetNextToken().MakeUpper(), + encoding = tn.GetNextToken().MakeUpper(); + + if ( registry == _T("ISO8859") ) { - M_FONTDATA->m_encoding = - (wxFontEncoding)(wxFONTENCODING_ISO8859_1 + cp - 1); + int cp; + if ( wxSscanf(encoding, wxT("%d"), &cp) == 1 ) + { + M_FONTDATA->m_encoding = + (wxFontEncoding)(wxFONTENCODING_ISO8859_1 + cp - 1); + } } - } - else if ( registry == _T("MICROSOFT") ) - { - int cp; - if ( wxSscanf(encoding, "cp125%d", &cp) == 1 ) + else if ( registry == _T("MICROSOFT") ) { - M_FONTDATA->m_encoding = - (wxFontEncoding)(wxFONTENCODING_CP1250 + cp); + int cp; + if ( wxSscanf(encoding, wxT("cp125%d"), &cp) == 1 ) + { + M_FONTDATA->m_encoding = + (wxFontEncoding)(wxFONTENCODING_CP1250 + cp); + } } + else if ( registry == _T("KOI8") ) + { + M_FONTDATA->m_encoding = wxFONTENCODING_KOI8; + } + //else: unknown encoding - may be give a warning here? } - else if ( registry == _T("KOI8") ) - { - M_FONTDATA->m_encoding = wxFONTENCODING_KOI8; - } - //else: unknown encoding - may be give a warning here? } bool wxFont::Create( int pointSize, @@ -384,6 +390,29 @@ void wxFont::SetEncoding(wxFontEncoding encoding) // get internal representation of font // ---------------------------------------------------------------------------- +static GdkFont *g_systemDefaultGuiFont = (GdkFont*) NULL; + +static GdkFont *GtkGetDefaultGuiFont() +{ + if (!g_systemDefaultGuiFont) + { + GtkWidget *widget = gtk_button_new(); + GtkStyle *def = gtk_rc_get_style( widget ); + if (def) + { + g_systemDefaultGuiFont = gdk_font_ref( def->font ); + } + else + { + def = gtk_widget_get_default_style(); + if (def) + g_systemDefaultGuiFont = gdk_font_ref( def->font ); + } + gtk_widget_destroy( widget ); + } + return g_systemDefaultGuiFont; +} + GdkFont *wxFont::GetInternalFont( float scale ) const { if (!Ok()) @@ -394,7 +423,7 @@ GdkFont *wxFont::GetInternalFont( float scale ) const } long int_scale = long(scale * 100.0 + 0.5); /* key for fontlist */ - int point_scale = (M_FONTDATA->m_pointSize * 10 * int_scale) / 100; + int point_scale = (int)((M_FONTDATA->m_pointSize * 10 * int_scale) / 100); GdkFont *font = (GdkFont *) NULL; wxNode *node = M_FONTDATA->m_scaled_xfonts.Find(int_scale); @@ -404,18 +433,11 @@ GdkFont *wxFont::GetInternalFont( float scale ) const } else { -#if 0 - if ((int_scale == 100) && - (M_FONTDATA->m_family == wxSWISS) && - (M_FONTDATA->m_style == wxNORMAL) && - (M_FONTDATA->m_pointSize == 12) && - (M_FONTDATA->m_weight == wxNORMAL) && - (M_FONTDATA->m_underlined == FALSE)) + if (*this == wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT)) { - font = gdk_font_load( "-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*" ); + font = GtkGetDefaultGuiFont(); } - else -#endif // 0 + if (!font) { font = wxLoadQueryNearestFont( point_scale, M_FONTDATA->m_family, @@ -429,10 +451,9 @@ GdkFont *wxFont::GetInternalFont( float scale ) const M_FONTDATA->m_scaled_xfonts.Append( int_scale, (wxObject*)font ); } - if (!font) - { - wxLogError(wxT("could not load any font")); - } + // it's quite useless to make it a wxCHECK because we're going to crash + // anyhow... + wxASSERT_MSG( font, wxT("could not load any font?") ); return font; }