#ifndef WX_PRECOMP
#include "wx/string.h"
#include "wx/utils.h" // for wxGetDisplay()
+ #include "wx/settings.h"
+ #include "wx/gdicmn.h"
#endif
-#include "wx/gdicmn.h"
#include "wx/fontutil.h" // for wxNativeFontInfo
#include "wx/tokenzr.h"
-#include "wx/settings.h"
+#include "wx/fontenum.h"
#include "wx/x11/private.h"
{
public:
wxXFont();
- ~wxXFont();
+ virtual ~wxXFont();
WXFontStructPtr m_fontStruct; // XFontStruct
WXDisplay* m_display; // XDisplay
// wxFontRefData
// ----------------------------------------------------------------------------
-class wxFontRefData: public wxObjectRefData
+class wxFontRefData: public wxGDIRefData
{
friend class wxFont;
void SetStyle(int style);
void SetWeight(int weight);
void SetUnderlined(bool underlined);
- void SetFaceName(const wxString& facename);
+ bool SetFaceName(const wxString& facename);
void SetEncoding(wxFontEncoding encoding);
void SetNoAntiAliasing( bool no = true ) { m_noAA = no; }
#endif
};
+#define M_FONTDATA ((wxFontRefData*)m_refData)
+
// ----------------------------------------------------------------------------
// wxFontRefData
// ----------------------------------------------------------------------------
m_style = style == wxDEFAULT ? wxFONTSTYLE_NORMAL : style;
m_weight = weight == wxDEFAULT ? wxFONTWEIGHT_NORMAL : weight;
- // and here, do we really want to forbid creation of the font of the size
- // 90 (the value of wxDEFAULT)??
- m_pointSize = pointSize == wxDEFAULT || pointSize == -1
- ? wxDEFAULT_FONT_SIZE
- : pointSize;
-
m_underlined = underlined;
m_encoding = encoding;
#if wxUSE_UNICODE
+ if ( m_nativeFontInfo.description )
+ pango_font_description_free(m_nativeFontInfo.description);
+
// Create native font info
m_nativeFontInfo.description = pango_font_description_new();
- // And set its values
- switch (m_family)
+ // if a face name is specified, use it if it's available, otherwise use
+ // just the family
+ if ( faceName.empty() || !wxFontEnumerator::IsValidFacename(faceName) )
{
- case wxFONTFAMILY_MODERN:
- case wxFONTFAMILY_TELETYPE:
- pango_font_description_set_family( m_nativeFontInfo.description, "monospace" );
- break;
- case wxFONTFAMILY_ROMAN:
- pango_font_description_set_family( m_nativeFontInfo.description, "serif" );
- break;
- default:
- pango_font_description_set_family( m_nativeFontInfo.description, "sans" );
- break;
+ // TODO: scan system for valid fonts matching the given family instead
+ // of hardcoding them here
+ switch ( m_family )
+ {
+ case wxFONTFAMILY_TELETYPE:
+ m_faceName = wxT("monospace");
+ break;
+
+ case wxFONTFAMILY_ROMAN:
+ m_faceName = wxT("serif");
+ break;
+
+ default:
+ m_faceName = wxT("sans");
+ }
}
- SetStyle( m_style );
- SetPointSize( m_pointSize );
- SetWeight( m_weight );
-#endif
+ else // specified face name is available, use it
+ {
+ m_faceName = faceName;
+ }
+
+ m_nativeFontInfo.SetFaceName(m_faceName);
+ m_nativeFontInfo.SetWeight((wxFontWeight)m_weight);
+ m_nativeFontInfo.SetStyle((wxFontStyle)m_style);
+#endif // wxUSE_UNICODE
+
+ SetPointSize(pointSize);
}
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:
- m_weight = wxFONTWEIGHT_LIGHT;
- break;
case PANGO_WEIGHT_LIGHT:
m_weight = wxFONTWEIGHT_LIGHT;
break;
+
+ default:
+ wxFAIL_MSG(_T("unknown Pango font weight"));
+ // fall through
+
case PANGO_WEIGHT_NORMAL:
m_weight = wxFONTWEIGHT_NORMAL;
break;
+
+ case wxPANGO_WEIGHT_SEMIBOLD:
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;
}
}
- switch ( wxToupper(*m_nativeFontInfo.
- GetXFontComponent(wxXLFD_SLANT).c_str()) )
+ switch ( wxToupper( m_nativeFontInfo.
+ GetXFontComponent(wxXLFD_SLANT)[0u]).GetValue() )
{
case _T('I'): // italique
m_style = wxFONTSTYLE_ITALIC;
}
wxFontRefData::wxFontRefData( const wxFontRefData& data )
- : wxObjectRefData()
+ : wxGDIRefData()
{
m_pointSize = data.m_pointSize;
m_family = data.m_family;
void wxFontRefData::SetPointSize(int pointSize)
{
- m_pointSize = pointSize;
+ // NB: Pango doesn't support point sizes less than 1
+ m_pointSize = pointSize == wxDEFAULT || pointSize < 1 ? wxDEFAULT_FONT_SIZE
+ : pointSize;
#if wxUSE_UNICODE
- // Get native info
- PangoFontDescription *desc = m_nativeFontInfo.description;
-
- pango_font_description_set_size( desc, m_pointSize * PANGO_SCALE );
+ m_nativeFontInfo.SetPointSize(m_pointSize);
#endif
}
// the XLFD doesn't have "underlined" field anyhow
}
-void wxFontRefData::SetFaceName(const wxString& facename)
+bool wxFontRefData::SetFaceName(const wxString& facename)
{
m_faceName = facename;
+ return true;
}
void wxFontRefData::SetEncoding(wxFontEncoding encoding)
{
}
+wxGDIRefData *wxFont::CreateGDIRefData() const
+{
+ return new wxFontRefData;
+}
+
+wxGDIRefData *wxFont::CloneGDIRefData(const wxGDIRefData *data) const
+{
+ return new wxFontRefData(*wx_static_cast(const wxFontRefData *, data));
+}
+
// ----------------------------------------------------------------------------
// change the font attributes
// ----------------------------------------------------------------------------
M_FONTDATA->SetWeight(weight);
}
-void wxFont::SetFaceName(const wxString& faceName)
+bool wxFont::SetFaceName(const wxString& faceName)
{
Unshare();
- M_FONTDATA->SetFaceName(faceName);
+ return M_FONTDATA->SetFaceName(faceName) &&
+ wxFontBase::SetFaceName(faceName);
}
void wxFont::SetUnderlined(bool underlined)