X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/30760ce7e58df02af3308cd7de8bd7694e791b8d..7b9da2077d0975db6c965a85c91d5aca671ab5e3:/src/gtk/font.cpp diff --git a/src/gtk/font.cpp b/src/gtk/font.cpp index 0457bda88e..c2e51daba6 100644 --- a/src/gtk/font.cpp +++ b/src/gtk/font.cpp @@ -20,6 +20,8 @@ #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" @@ -122,7 +124,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,25 +152,23 @@ 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 - M_FONTDATA->m_faceName = tn.GetNextToken(); // courier + M_FONTDATA->m_faceName = tn.GetNextToken(); // family - tmp = tn.GetNextToken().MakeUpper(); + 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; @@ -177,29 +177,70 @@ 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(); + + 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); + long num = wxStrtol (tmp.c_str(), (wxChar **) NULL, 10); M_FONTDATA->m_pointSize = num / 10; tn.GetNextToken(); // x-res tn.GetNextToken(); // y-res - tmp = tn.GetNextToken().MakeUpper(); - 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; + 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, @@ -357,7 +398,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); @@ -392,10 +433,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; }