Implement arbitrary font weight support for wxX11

This is mostly done to fix (half of) compilation errors after
introduction of pure virtual wxFont::{Get,Set}NumericWeight() as wxFont
in wxX11 couldn't be compiled any more as it didn't define them.
This commit is contained in:
Vadim Zeitlin 2018-09-05 02:31:15 +02:00
parent 8ff36f98f3
commit 979d541072
2 changed files with 36 additions and 60 deletions

View File

@ -83,7 +83,7 @@ public:
// implement base class pure virtuals
virtual int GetPointSize() const;
virtual wxFontStyle GetStyle() const;
virtual wxFontWeight GetWeight() const;
virtual int GetNumericWeight() const;
virtual bool GetUnderlined() const;
virtual bool GetStrikethrough() const wxOVERRIDE;
virtual wxString GetFaceName() const;
@ -95,7 +95,7 @@ public:
virtual void SetPointSize(int pointSize);
virtual void SetFamily(wxFontFamily family);
virtual void SetStyle(wxFontStyle style);
virtual void SetWeight(wxFontWeight weight);
virtual void SetNumericWeight(int weight);
virtual bool SetFaceName(const wxString& faceName);
virtual void SetUnderlined(bool underlined);
virtual void SetStrikethrough(bool strikethrough) wxOVERRIDE;

View File

@ -52,6 +52,28 @@
static const int wxDEFAULT_FONT_SIZE = 12;
// ----------------------------------------------------------------------------
// helper functions
// ----------------------------------------------------------------------------
static wxFontWeight ParseWeightString(wxString s)
{
s.MakeUpper();
if (s == "THIN") return wxFONTWEIGHT_THIN;
if (s == "EXTRALIGHT" || s == "ULTRALIGHT") return wxFONTWEIGHT_EXTRALIGHT;
if (s == "LIGHT") return wxFONTWEIGHT_LIGHT;
if (s == "NORMAL") return wxFONTWEIGHT_NORMAL;
if (s == "MEDIUM") return wxFONTWEIGHT_MEDIUM;
if (s == "DEMIBOLD" || s == "SEMIBOLD") return wxFONTWEIGHT_SEMIBOLD;
if (s == "BOLD") return wxFONTWEIGHT_BOLD;
if (s == "EXTRABOLD" || s == "ULTRABOLD") return wxFONTWEIGHT_EXTRABOLD;
if (s == "BLACK" || s == "HEAVY") return wxFONTWEIGHT_HEAVY;
if (s == "EXTRAHEAVY") return wxFONTWEIGHT_EXTRAHEAVY;
return wxFONTWEIGHT_NORMAL;
}
#if wxUSE_UNICODE
#else
// ----------------------------------------------------------------------------
@ -119,7 +141,7 @@ public:
void SetPointSize(int pointSize);
void SetFamily(wxFontFamily family);
void SetStyle(wxFontStyle style);
void SetWeight(wxFontWeight weight);
void SetNumericWeight(int weight);
void SetUnderlined(bool underlined);
void SetStrikethrough(bool strikethrough);
bool SetFaceName(const wxString& facename);
@ -146,7 +168,7 @@ protected:
int m_pointSize;
wxFontFamily m_family;
wxFontStyle m_style;
wxFontWeight m_weight;
int m_weight;
bool m_underlined;
bool m_strikethrough;
wxString m_faceName;
@ -223,7 +245,7 @@ void wxFontRefData::Init(int pointSize,
}
m_nativeFontInfo.SetFaceName(m_faceName);
m_nativeFontInfo.SetWeight((wxFontWeight)m_weight);
m_nativeFontInfo.SetNumericWeight(m_weight);
m_nativeFontInfo.SetStyle((wxFontStyle)m_style);
m_nativeFontInfo.SetUnderlined(underlined);
#endif // wxUSE_UNICODE
@ -255,56 +277,18 @@ void wxFontRefData::InitFromNative()
break;
}
// Not defined in some Pango versions
#define wxPANGO_WEIGHT_SEMIBOLD 600
switch (pango_font_description_get_weight( desc ))
{
case PANGO_WEIGHT_ULTRALIGHT:
case PANGO_WEIGHT_LIGHT:
m_weight = wxFONTWEIGHT_LIGHT;
break;
default:
wxFAIL_MSG(wxT("unknown Pango font weight"));
// fall through
case PANGO_WEIGHT_NORMAL:
m_weight = wxFONTWEIGHT_NORMAL;
break;
case wxPANGO_WEIGHT_SEMIBOLD:
case PANGO_WEIGHT_BOLD:
case PANGO_WEIGHT_ULTRABOLD:
case PANGO_WEIGHT_HEAVY:
m_weight = wxFONTWEIGHT_BOLD;
break;
}
m_weight = pango_font_description_get_weight( desc );
#else // X11
// get the font parameters from the XLFD
// -------------------------------------
m_faceName = m_nativeFontInfo.GetXFontComponent(wxXLFD_FAMILY);
m_weight = wxFONTWEIGHT_NORMAL;
wxString w = m_nativeFontInfo.GetXFontComponent(wxXLFD_WEIGHT).Upper();
if ( !w.empty() && w != wxT('*') )
{
// the test below catches all of BOLD, EXTRABOLD, DEMIBOLD, ULTRABOLD
// and BLACK
if ( ((w[0u] == wxT('B') && (!wxStrcmp(w.c_str() + 1, wxT("OLD")) ||
!wxStrcmp(w.c_str() + 1, wxT("LACK"))))) ||
wxStrstr(w.c_str() + 1, wxT("BOLD")) )
{
m_weight = wxFONTWEIGHT_BOLD;
}
else if ( w == wxT("LIGHT") || w == wxT("THIN") )
{
m_weight = wxFONTWEIGHT_LIGHT;
}
}
m_weight = ParseWeightString(w);
else
m_weight = wxFONTWEIGHT_NORMAL;
switch ( wxToupper( m_nativeFontInfo.
GetXFontComponent(wxXLFD_SLANT)[0u]).GetValue() )
@ -486,7 +470,7 @@ void wxFontRefData::SetStyle(wxFontStyle style)
#endif
}
void wxFontRefData::SetWeight(wxFontWeight weight)
void wxFontRefData::SetNumericWeight(int weight)
{
m_weight = weight;
}
@ -594,15 +578,7 @@ bool wxFont::Create(const wxString& fontname, wxFontEncoding enc)
M_FONTDATA->m_faceName = tn.GetNextToken(); // family
tmp = tn.GetNextToken().MakeUpper(); // weight
if (tmp == wxT("BOLD")) M_FONTDATA->m_weight = wxFONTWEIGHT_BOLD;
if (tmp == wxT("BLACK")) M_FONTDATA->m_weight = wxFONTWEIGHT_BOLD;
if (tmp == wxT("EXTRABOLD")) M_FONTDATA->m_weight = wxFONTWEIGHT_BOLD;
if (tmp == wxT("DEMIBOLD")) M_FONTDATA->m_weight = wxFONTWEIGHT_BOLD;
if (tmp == wxT("ULTRABOLD")) M_FONTDATA->m_weight = wxFONTWEIGHT_BOLD;
if (tmp == wxT("LIGHT")) M_FONTDATA->m_weight = wxFONTWEIGHT_LIGHT;
if (tmp == wxT("THIN")) M_FONTDATA->m_weight = wxFONTWEIGHT_LIGHT;
M_FONTDATA->m_weight = ParseWeightString(tn.GetNextToken()); // weight
tmp = tn.GetNextToken().MakeUpper(); // slant
if (tmp == wxT("I")) M_FONTDATA->m_style = wxFONTSTYLE_ITALIC;
@ -742,7 +718,7 @@ wxFontStyle wxFont::GetStyle() const
return M_FONTDATA->m_style;
}
wxFontWeight wxFont::GetWeight() const
int wxFont::GetNumericWeight() const
{
wxCHECK_MSG( IsOk(), wxFONTWEIGHT_MAX, wxT("invalid font") );
@ -844,11 +820,11 @@ void wxFont::SetStyle(wxFontStyle style)
M_FONTDATA->SetStyle(style);
}
void wxFont::SetWeight(wxFontWeight weight)
void wxFont::SetNumericWeight(int weight)
{
Unshare();
M_FONTDATA->SetWeight(weight);
M_FONTDATA->SetNumericWeight(weight);
}
bool wxFont::SetFaceName(const wxString& faceName)