X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/284b4c8866ab36694b6ec2a308690bba4db4fed2..e8b04eb349f772582534d3e466983ada85f2460d:/src/gtk/font.cpp diff --git a/src/gtk/font.cpp b/src/gtk/font.cpp index 7de3862b47..9dd58ea182 100644 --- a/src/gtk/font.cpp +++ b/src/gtk/font.cpp @@ -4,11 +4,19 @@ // Author: Robert Roebling // Id: $Id$ // Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + #ifdef __GNUG__ -#pragma implementation "font.h" + #pragma implementation "font.h" #endif #include "wx/font.h" @@ -16,35 +24,82 @@ #include "wx/log.h" #include "wx/gdicmn.h" #include "wx/tokenzr.h" + #include #include "gdk/gdk.h" -//----------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- // local data -//----------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- -/* -extern wxFontNameDirectory *wxTheFontNameDirectory; -*/ +#if wxUSE_FONTNAMEDIRECTORY + extern wxFontNameDirectory *wxTheFontNameDirectory; +#endif -//----------------------------------------------------------------------------- -// wxFont -//----------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +static GdkFont *wxLoadQueryFont( int pointSize, + int family, + int style, + int weight, + bool underlined, + const wxString &facename, + wxFontEncoding encoding ); -class wxFontRefData: public wxObjectRefData +static GdkFont *wxLoadQueryNearestFont( int pointSize, + int family, + int style, + int weight, + bool underlined, + const wxString &facename, + wxFontEncoding encoding); + +// ---------------------------------------------------------------------------- +// wxFontRefData +// ---------------------------------------------------------------------------- + +class wxFontRefData : public wxObjectRefData { public: + wxFontRefData(int size = wxDEFAULT, + int family = wxDEFAULT, + int style = wxDEFAULT, + int weight = wxDEFAULT, + bool underlined = FALSE, + const wxString& faceName = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT) + : m_scaled_xfonts(wxKEY_INTEGER) + { + Init(size, family, style, weight, underlined, faceName, encoding); + } - wxFontRefData(); wxFontRefData( const wxFontRefData& data ); - ~wxFontRefData(); + virtual ~wxFontRefData(); + +protected: + // common part of all ctors + void Init(int pointSize, + int family, + int style, + int weight, + bool underlined, + const wxString& faceName, + wxFontEncoding encoding); + +private: wxList m_scaled_xfonts; + int m_pointSize; - int m_family, m_style, m_weight; + int m_family, + m_style, + m_weight; bool m_underlined; wxString m_faceName; + wxFontEncoding m_encoding; bool m_byXFontName; GdkFont *m_font; @@ -52,28 +107,59 @@ public: friend wxFont; }; -wxFontRefData::wxFontRefData() : m_scaled_xfonts(wxKEY_INTEGER) +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxFontRefData +// ---------------------------------------------------------------------------- + +void wxFontRefData::Init(int pointSize, + int family, + int style, + int weight, + bool underlined, + const wxString& faceName, + wxFontEncoding encoding) { + if (family == wxDEFAULT) + m_family = wxSWISS; + else + m_family = family; + + m_faceName = faceName; + + if (style == wxDEFAULT) + m_style = wxNORMAL; + else + m_style = style; + + if (weight == wxDEFAULT) + m_weight = wxNORMAL; + else + m_weight = weight; + + if (pointSize == wxDEFAULT) + m_pointSize = 12; + else + m_pointSize = pointSize; + + m_underlined = underlined; + m_encoding = encoding; + m_byXFontName = FALSE; - m_pointSize = 12; - m_family = wxSWISS; - m_style = wxNORMAL; - m_weight = wxNORMAL; - m_underlined = FALSE; m_font = (GdkFont *) NULL; } -wxFontRefData::wxFontRefData( const wxFontRefData& data ) : m_scaled_xfonts(wxKEY_INTEGER) +wxFontRefData::wxFontRefData( const wxFontRefData& data ) + : m_scaled_xfonts(wxKEY_INTEGER) { - m_byXFontName = FALSE; - m_pointSize = data.m_pointSize; - m_family = data.m_family; - m_style = data.m_style; - m_weight = data.m_weight; - m_underlined = data.m_underlined; - m_faceName = data.m_faceName; - m_font = (GdkFont *) NULL; - if (data.m_font) m_font = gdk_font_ref( data.m_font ); + Init(data.m_pointSize, data.m_family, data.m_style, data.m_weight, + data.m_underlined, data.m_faceName, data.m_encoding); + + if (data.m_font) + m_font = gdk_font_ref( data.m_font ); } wxFontRefData::~wxFontRefData() @@ -86,23 +172,31 @@ wxFontRefData::~wxFontRefData() gdk_font_unref( font ); node = next; } - if (m_font) gdk_font_unref( m_font ); -} -//----------------------------------------------------------------------------- + if (m_font) + gdk_font_unref( m_font ); +} -#define M_FONTDATA ((wxFontRefData *)m_refData) +// ---------------------------------------------------------------------------- +// wxFont +// ---------------------------------------------------------------------------- IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject) -wxFont::wxFont() +void wxFont::Init() { - if (wxTheFontList) wxTheFontList->Append( this ); + if (wxTheFontList) + wxTheFontList->Append( this ); } wxFont::wxFont( GdkFont *font, char *xFontName ) { - if (!xFontName) return; + if (!xFontName) + return; + + // VZ: this ctor ddidn't append the font to wxTheFontList before, but + // there is no reason to not do it, is there? + Init(); m_refData = new wxFontRefData(); @@ -145,71 +239,45 @@ wxFont::wxFont( GdkFont *font, char *xFontName ) else if (M_FONTDATA->m_faceName == _T("UTOPIA")) M_FONTDATA->m_family = wxSCRIPT; } -wxFont::wxFont( int pointSize, int family, int style, int weight, bool underlined, const wxString& face ) +bool wxFont::Create( int pointSize, + int family, + int style, + int weight, + bool underlined, + const wxString& face, + wxFontEncoding encoding ) { - m_refData = new wxFontRefData(); - - if (family == wxDEFAULT) - M_FONTDATA->m_family = wxSWISS; - else - M_FONTDATA->m_family = family; - - if (!face.IsEmpty()) M_FONTDATA->m_faceName = face; - - if (style == wxDEFAULT) - M_FONTDATA->m_style = wxNORMAL; - else - M_FONTDATA->m_style = style; - - if (weight == wxDEFAULT) - M_FONTDATA->m_weight = wxNORMAL; - else - M_FONTDATA->m_weight = weight; - - if (pointSize == wxDEFAULT) - M_FONTDATA->m_pointSize = 12; - else - M_FONTDATA->m_pointSize = pointSize; + m_refData = new wxFontRefData(pointSize, family, style, weight, + underlined, face, encoding); - M_FONTDATA->m_underlined = underlined; - - if (wxTheFontList) wxTheFontList->Append( this ); + Init(); + return TRUE; } -wxFont::wxFont( const wxFont& font ) +void wxFont::Unshare() { - Ref( font ); - - if (wxTheFontList) wxTheFontList->Append( this ); + if (!m_refData) + { + m_refData = new wxFontRefData(); + } + else + { + wxFontRefData* ref = new wxFontRefData(*(wxFontRefData*)m_refData); + UnRef(); + m_refData = ref; + } } wxFont::~wxFont() { - if (wxTheFontList) wxTheFontList->DeleteObject( this ); + if (wxTheFontList) + wxTheFontList->DeleteObject( this ); } -wxFont& wxFont::operator = ( const wxFont& font ) -{ - if (*this == font) return (*this); - Ref( font ); - return *this; -} - -bool wxFont::operator == ( const wxFont& font ) const -{ - return m_refData == font.m_refData; -} - -bool wxFont::operator != ( const wxFont& font ) const -{ - return m_refData != font.m_refData; -} - -bool wxFont::Ok() const -{ - return (m_refData != NULL); -} +// ---------------------------------------------------------------------------- +// accessors +// ---------------------------------------------------------------------------- int wxFont::GetPointSize() const { @@ -232,24 +300,6 @@ int wxFont::GetFamily() const return M_FONTDATA->m_family; } -wxString wxFont::GetFamilyString() const -{ - wxCHECK_MSG( Ok(), _T("wxDEFAULT"), _T("invalid font") ); - - switch (M_FONTDATA->m_family) - { - case wxDECORATIVE: return wxString(_T("wxDECORATIVE")); - case wxROMAN: return wxString(_T("wxROMAN")); - case wxSCRIPT: return wxString(_T("wxSCRIPT")); - case wxSWISS: return wxString(_T("wxSWISS")); - case wxMODERN: return wxString(_T("wxMODERN")); - case wxTELETYPE: return wxString(_T("wxTELETYPE")); - default: return _T("wxDEFAULT"); - } - - return "wxDEFAULT"; -} - int wxFont::GetStyle() const { wxCHECK_MSG( Ok(), 0, _T("invalid font") ); @@ -257,21 +307,6 @@ int wxFont::GetStyle() const return M_FONTDATA->m_style; } -wxString wxFont::GetStyleString() const -{ - wxCHECK_MSG( Ok(), _T("wxDEFAULT"), _T("invalid font") ); - - switch (M_FONTDATA->m_style) - { - case wxNORMAL: return wxString(_T("wxNORMAL")); - case wxSLANT: return wxString(_T("wxSLANT")); - case wxITALIC: return wxString(_T("wxITALIC")); - default: return wxString(_T("wxDEFAULT")); - } - - return wxString(_T("wxDEFAULT")); -} - int wxFont::GetWeight() const { wxCHECK_MSG( Ok(), 0, _T("invalid font") ); @@ -279,21 +314,6 @@ int wxFont::GetWeight() const return M_FONTDATA->m_weight; } -wxString wxFont::GetWeightString() const -{ - wxCHECK_MSG( Ok(), _T("wxDEFAULT"), _T("invalid font") ); - - switch (M_FONTDATA->m_weight) - { - case wxNORMAL: return wxString(_T("wxNORMAL")); - case wxBOLD: return wxString(_T("wxBOLD")); - case wxLIGHT: return wxString(_T("wxLIGHT")); - default: return wxString(_T("wxDEFAULT")); - } - - return wxString(_T("wxDEFAULT")); -} - bool wxFont::GetUnderlined() const { wxCHECK_MSG( Ok(), FALSE, _T("invalid font") ); @@ -301,20 +321,18 @@ bool wxFont::GetUnderlined() const return M_FONTDATA->m_underlined; } -void wxFont::Unshare() + +wxFontEncoding wxFont::GetEncoding() const { - if (!m_refData) - { - m_refData = new wxFontRefData(); - } - else - { - wxFontRefData* ref = new wxFontRefData(*(wxFontRefData*)m_refData); - UnRef(); - m_refData = ref; - } + wxCHECK_MSG( Ok(), wxFONTENCODING_DEFAULT, _T("invalid font") ); + + return M_FONTDATA->m_encoding; } +// ---------------------------------------------------------------------------- +// change font attributes +// ---------------------------------------------------------------------------- + void wxFont::SetPointSize(int pointSize) { Unshare(); @@ -357,23 +375,29 @@ void wxFont::SetUnderlined(bool underlined) M_FONTDATA->m_underlined = underlined; } -//----------------------------------------------------------------------------- -// get internal representation of font -//----------------------------------------------------------------------------- +void wxFont::SetEncoding(wxFontEncoding encoding) +{ + Unshare(); -static GdkFont *wxLoadQueryNearestFont( int point_size, int family, int style, int weight, - bool underlined, const wxString &facename ); + M_FONTDATA->m_encoding = encoding; +} + +// ---------------------------------------------------------------------------- +// get internal representation of font +// ---------------------------------------------------------------------------- GdkFont *wxFont::GetInternalFont( float scale ) const { if (!Ok()) { wxFAIL_MSG( _T("invalid font") ); + return (GdkFont*) NULL; } /* short cut if the special X font constructor has been used */ - if (M_FONTDATA->m_byXFontName) return M_FONTDATA->m_font; + if (M_FONTDATA->m_byXFontName) + return M_FONTDATA->m_font; long int_scale = long(scale * 100.0 + 0.5); /* key for fontlist */ int point_scale = (M_FONTDATA->m_pointSize * 10 * int_scale) / 100; @@ -386,7 +410,7 @@ GdkFont *wxFont::GetInternalFont( float scale ) const } else { -/* +#if 0 if ((int_scale == 100) && (M_FONTDATA->m_family == wxSWISS) && (M_FONTDATA->m_style == wxNORMAL) && @@ -397,11 +421,17 @@ GdkFont *wxFont::GetInternalFont( float scale ) const font = gdk_font_load( "-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*" ); } else -*/ +#endif // 0 { - font = wxLoadQueryNearestFont( point_scale, M_FONTDATA->m_family, M_FONTDATA->m_style, - M_FONTDATA->m_weight, M_FONTDATA->m_underlined, M_FONTDATA->m_faceName ); + font = wxLoadQueryNearestFont( point_scale, + M_FONTDATA->m_family, + M_FONTDATA->m_style, + M_FONTDATA->m_weight, + M_FONTDATA->m_underlined, + M_FONTDATA->m_faceName, + M_FONTDATA->m_encoding ); } + M_FONTDATA->m_scaled_xfonts.Append( int_scale, (wxObject*)font ); } @@ -417,90 +447,8 @@ GdkFont *wxFont::GetInternalFont( float scale ) const // local utilities to find a X font //----------------------------------------------------------------------------- -static GdkFont*wxLoadQueryFont( int pointSize, int family, int style, int weight, - bool WXUNUSED(underlined), const wxString &facename ) -{ - wxChar *xfamily = (wxChar*) NULL; - wxChar *xstyle = (wxChar*) NULL; - wxChar *xweight = (wxChar*) NULL; - - switch (family) - { - case wxDECORATIVE: xfamily = _T("lucida"); break; - case wxROMAN: xfamily = _T("times"); break; - case wxMODERN: xfamily = _T("courier"); break; - case wxSWISS: xfamily = _T("helvetica"); break; - case wxTELETYPE: xfamily = _T("lucidatypewriter"); break; - case wxSCRIPT: xfamily = _T("utopia"); break; - default: xfamily = _T("*"); - } - - if (!facename.IsEmpty()) - { - wxSprintf( wxBuffer, _T("-*-%s-*-*-normal-*-*-*-*-*-*-*-*-*"), facename.c_str() ); - GdkFont *test = gdk_font_load( wxConvCurrent->cWX2MB(wxBuffer) ); - if (test) - { - gdk_font_unref( test ); - xfamily = WXSTRINGCAST facename; - } - } - - switch (style) - { - case wxITALIC: xstyle = _T("i"); break; - case wxSLANT: xstyle = _T("o"); break; - case wxNORMAL: xstyle = _T("r"); break; - default: xstyle = _T("*"); break; - } - switch (weight) - { - case wxBOLD: xweight = _T("bold"); break; - case wxLIGHT: - case wxNORMAL: xweight = _T("medium"); break; - default: xweight = _T("*"); break; - } - - wxSprintf( wxBuffer, _T("-*-%s-%s-%s-normal-*-*-%d-*-*-*-*-*-*"), - xfamily, xweight, xstyle, pointSize); - - return gdk_font_load( wxConvCurrent->cWX2MB(wxBuffer) ); -} - -static GdkFont *wxLoadQueryNearestFont( int point_size, int family, int style, int weight, - bool underlined, const wxString &facename ) -{ - GdkFont *font = wxLoadQueryFont( point_size, family, style, weight, underlined, facename ); - - if (!font) - { - /* search up and down by stepsize 10 */ - int max_size = point_size + 20 * (1 + (point_size/180)); - int min_size = point_size - 20 * (1 + (point_size/180)); - - int i; - - /* Search for smaller size (approx.) */ - for (i=point_size-10; !font && i >= 10 && i >= min_size; i -= 10) - font = wxLoadQueryFont(i, family, style, weight, underlined, facename ); - - /* Search for larger size (approx.) */ - for (i=point_size+10; !font && i <= max_size; i += 10) - font = wxLoadQueryFont( i, family, style, weight, underlined, facename ); - - /* Try default family */ - if (!font && family != wxDEFAULT) - font = wxLoadQueryFont( point_size, wxDEFAULT, style, weight, underlined, facename ); - - /* Bogus font */ - if (!font) - font = wxLoadQueryFont(120, wxDEFAULT, wxNORMAL, wxNORMAL, underlined, facename ); - } - - return font; -} - -/* +// wow, what's this stuff? Is it used/useful? (VZ) +#if 0 //----------------------------------------------------------------------------- // face names and index functions @@ -1047,4 +995,4 @@ int wxFontNameDirectory::GetFamily(int fontid) return wxDEFAULT; } -*/ +#endif // 0