X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e90c1d2a19361551eb07778280f22be3e759cf64..2035e10e83324c6925d12725b842768f6e2b00a2:/src/gtk/font.cpp diff --git a/src/gtk/font.cpp b/src/gtk/font.cpp index c27134680f..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,49 +154,95 @@ 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, T("-") ); + wxStringTokenizer tn( fontname, wxT("-") ); tn.GetNextToken(); // foundry - M_FONTDATA->m_faceName = tn.GetNextToken(); // courier + M_FONTDATA->m_faceName = tn.GetNextToken(); // family - tmp = tn.GetNextToken().MakeUpper(); - if (tmp == T("BOLD")) M_FONTDATA->m_weight = wxBOLD; + tmp = tn.GetNextToken().MakeUpper(); // weight + if (tmp == wxT("BOLD")) M_FONTDATA->m_weight = wxBOLD; + if (tmp == wxT("BLACK")) M_FONTDATA->m_weight = wxBOLD; + if (tmp == wxT("EXTRABOLD")) M_FONTDATA->m_weight = wxBOLD; + if (tmp == wxT("DEMIBOLD")) M_FONTDATA->m_weight = wxBOLD; + if (tmp == wxT("ULTRABOLD")) M_FONTDATA->m_weight = wxBOLD; - tmp = tn.GetNextToken().MakeUpper(); - if (tmp == T("I")) M_FONTDATA->m_style = wxITALIC; - if (tmp == T("O")) M_FONTDATA->m_style = wxITALIC; + 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; tn.GetNextToken(); // set width - tn.GetNextToken(); // ? + tn.GetNextToken(); // add. style 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 - tmp = tn.GetNextToken().MakeUpper(); - if (tmp == T("M")) M_FONTDATA->m_family = wxMODERN; - else if (M_FONTDATA->m_faceName == T("TIMES")) M_FONTDATA->m_family = wxROMAN; - else if (M_FONTDATA->m_faceName == T("HELVETICA")) M_FONTDATA->m_family = wxSWISS; - else if (M_FONTDATA->m_faceName == T("LUCIDATYPEWRITER")) M_FONTDATA->m_family = wxTELETYPE; - else if (M_FONTDATA->m_faceName == T("LUCIDA")) M_FONTDATA->m_family = wxDECORATIVE; - else if (M_FONTDATA->m_faceName == T("UTOPIA")) M_FONTDATA->m_family = wxSCRIPT; + tmp = tn.GetNextToken().MakeUpper(); // spacing + + if (tmp == wxT("M")) + M_FONTDATA->m_family = wxMODERN; + else if (M_FONTDATA->m_faceName == wxT("TIMES")) + M_FONTDATA->m_family = wxROMAN; + else if (M_FONTDATA->m_faceName == wxT("HELVETICA")) + M_FONTDATA->m_family = wxSWISS; + else if (M_FONTDATA->m_faceName == wxT("LUCIDATYPEWRITER")) + M_FONTDATA->m_family = wxTELETYPE; + else if (M_FONTDATA->m_faceName == wxT("LUCIDA")) + M_FONTDATA->m_family = wxDECORATIVE; + else if (M_FONTDATA->m_faceName == wxT("UTOPIA")) + M_FONTDATA->m_family = wxSCRIPT; + + tn.GetNextToken(); // avg width + + // deal with font encoding + M_FONTDATA->m_encoding = fontdata.GetEncoding(); + if ( M_FONTDATA->m_encoding == wxFONTENCODING_SYSTEM ) + { + wxString registry = tn.GetNextToken().MakeUpper(), + encoding = tn.GetNextToken().MakeUpper(); + + if ( registry == _T("ISO8859") ) + { + 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, 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? + } } bool wxFont::Create( int pointSize, @@ -235,42 +285,42 @@ wxFont::~wxFont() int wxFont::GetPointSize() const { - wxCHECK_MSG( Ok(), 0, T("invalid font") ); + wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); return M_FONTDATA->m_pointSize; } wxString wxFont::GetFaceName() const { - wxCHECK_MSG( Ok(), T(""), T("invalid font") ); + wxCHECK_MSG( Ok(), wxT(""), wxT("invalid font") ); return M_FONTDATA->m_faceName; } int wxFont::GetFamily() const { - wxCHECK_MSG( Ok(), 0, T("invalid font") ); + wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); return M_FONTDATA->m_family; } int wxFont::GetStyle() const { - wxCHECK_MSG( Ok(), 0, T("invalid font") ); + wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); return M_FONTDATA->m_style; } int wxFont::GetWeight() const { - wxCHECK_MSG( Ok(), 0, T("invalid font") ); + wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); return M_FONTDATA->m_weight; } bool wxFont::GetUnderlined() const { - wxCHECK_MSG( Ok(), FALSE, T("invalid font") ); + wxCHECK_MSG( Ok(), FALSE, wxT("invalid font") ); return M_FONTDATA->m_underlined; } @@ -278,7 +328,7 @@ bool wxFont::GetUnderlined() const wxFontEncoding wxFont::GetEncoding() const { - wxCHECK_MSG( Ok(), wxFONTENCODING_DEFAULT, T("invalid font") ); + wxCHECK_MSG( Ok(), wxFONTENCODING_DEFAULT, wxT("invalid font") ); return M_FONTDATA->m_encoding; } @@ -340,17 +390,40 @@ 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()) { - wxFAIL_MSG( T("invalid font") ); + wxFAIL_MSG( wxT("invalid font") ); return (GdkFont*) NULL; } 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); @@ -360,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, @@ -385,10 +451,9 @@ GdkFont *wxFont::GetInternalFont( float scale ) const M_FONTDATA->m_scaled_xfonts.Append( int_scale, (wxObject*)font ); } - if (!font) - { - wxLogError(T("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; }