// Created: 05.11.99
// RCS-ID: $Id$
// Copyright: (c) Vadim Zeitlin
-// Licence: wxWindows license
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
// headers
// ----------------------------------------------------------------------------
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "fontutil.h"
#endif
#endif
#ifndef WX_PRECOMP
+ #include "wx/font.h" // wxFont enums
+ #include "wx/encinfo.h"
#endif // PCH
#include "wx/fontutil.h"
description = NULL;
}
+void
+wxNativeFontInfo::Init(const wxNativeFontInfo& info)
+{
+ if (info.description)
+ description = pango_font_description_copy(info.description);
+ else
+ description = NULL;
+}
+
+void wxNativeFontInfo::Free()
+{
+ if (description)
+ pango_font_description_free(description);
+}
+
int wxNativeFontInfo::GetPointSize() const
{
return pango_font_description_get_size( description ) / PANGO_SCALE;
wxFontWeight wxNativeFontInfo::GetWeight() const
{
- wxFontWeight m_weight = wxFONTWEIGHT_NORMAL;
+#if 0
+ // We seem to currently initialize only by string.
+ // In that case PANGO_FONT_MASK_WEIGHT is always set.
+ if (!(pango_font_description_get_set_fields(description) & PANGO_FONT_MASK_WEIGHT))
+ return wxFONTWEIGHT_NORMAL;
+#endif
- switch (pango_font_description_get_weight( description ))
- {
- case PANGO_WEIGHT_ULTRALIGHT:
- m_weight = wxFONTWEIGHT_LIGHT;
- break;
- case PANGO_WEIGHT_LIGHT:
- m_weight = wxFONTWEIGHT_LIGHT;
- break;
- case PANGO_WEIGHT_NORMAL:
- m_weight = wxFONTWEIGHT_NORMAL;
- break;
- 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;
- }
+ PangoWeight pango_weight = pango_font_description_get_weight( description );
+
+ // Until the API can be changed the following ranges of weight values are used:
+ // wxFONTWEIGHT_LIGHT: 100 .. 349 - range of 250
+ // wxFONTWEIGHT_NORMAL: 350 .. 599 - range of 250
+ // wxFONTWEIGHT_BOLD: 600 .. 900 - range of 301 (600 is "semibold" already)
+
+ if (pango_weight >= 600)
+ return wxFONTWEIGHT_BOLD;
+
+ if (pango_weight < 350)
+ return wxFONTWEIGHT_LIGHT;
- return m_weight;
+ return wxFONTWEIGHT_NORMAL;
}
bool wxNativeFontInfo::GetUnderlined() const
return wxFONTENCODING_SYSTEM;
}
+
+void wxNativeFontInfo::SetPointSize(int WXUNUSED(pointsize))
+{
+ wxFAIL_MSG( _T("not implemented") );
+}
+
+void wxNativeFontInfo::SetStyle(wxFontStyle WXUNUSED(style))
+{
+ wxFAIL_MSG( _T("not implemented") );
+}
+
+void wxNativeFontInfo::SetWeight(wxFontWeight WXUNUSED(weight))
+{
+ wxFAIL_MSG( _T("not implemented") );
+}
+
+void wxNativeFontInfo::SetUnderlined(bool WXUNUSED(underlined))
+{
+ wxFAIL_MSG( _T("not implemented") );
+}
+
+void wxNativeFontInfo::SetFaceName(wxString WXUNUSED(facename))
+{
+ wxFAIL_MSG( _T("not implemented") );
+}
+
+void wxNativeFontInfo::SetFamily(wxFontFamily WXUNUSED(family))
+{
+ wxFAIL_MSG( _T("not implemented") );
+}
+
+void wxNativeFontInfo::SetEncoding(wxFontEncoding WXUNUSED(encoding))
+{
+ wxFAIL_MSG( _T("not implemented") );
+}
+
+
+
bool wxNativeFontInfo::FromString(const wxString& s)
{
if (description)
wxString wxNativeFontInfo::ToString() const
{
- wxString tmp = wxGTK_CONV_BACK( pango_font_description_to_string( description ) );
+ char *str = pango_font_description_to_string( description );
+ wxString tmp = wxGTK_CONV_BACK( str );
+ g_free( str );
return tmp;
}
bool wxGetNativeFontEncoding(wxFontEncoding encoding,
wxNativeEncodingInfo *info)
{
- return FALSE;
+ // we *must* return true for default encoding as otherwise wxFontMapper
+ // considers that we can't load any font and aborts with wxLogFatalError!
+ if ( encoding == wxFONTENCODING_SYSTEM )
+ {
+ info->facename.clear();
+ info->encoding = wxFONTENCODING_SYSTEM;
+ }
+
+ // pretend that we support everything, it's better than to always return
+ // false as the old code did
+ return true;
}
#else // GTK+ 1.x
#elif defined(__WXGTK__)
wxNativeFont wxLoadFont(const wxString& fontSpec)
{
- return gdk_font_load( wxConvertWX2MB(fontSpec) );
+ // VZ: we should use gdk_fontset_load() instead of gdk_font_load()
+ // here to be able to display Japanese fonts correctly (at least
+ // this is what people report) but unfortunately doing it results
+ // in tons of warnings when using GTK with "normal" European
+ // languages and so we can't always do it and I don't know enough
+ // to determine when should this be done... (FIXME)
+ return gdk_font_load( wxConvertWX2MB(fontSpec) );
}
inline void wxFreeFont(wxNativeFont font)
return FALSE;
}
- fontElements[n] = tokenizer.GetNextToken();
+ wxString field = tokenizer.GetNextToken();
+ if ( !field.empty() && field != _T('*') )
+ {
+ // we're really initialized now
+ m_isDefault = FALSE;
+ }
+
+ fontElements[n] = field;
}
// this should be all
if ( tokenizer.HasMoreTokens() )
return FALSE;
- // we're initialized now
- m_isDefault = FALSE;
-
return TRUE;
}
wxString wxNativeFontInfo::GetFaceName() const
{
- // wxWindows facename probably more accurately corresponds to X family
+ // wxWidgets facename probably more accurately corresponds to X family
return GetXFontComponent(wxXLFD_FAMILY);
}
wxFontFamily wxNativeFontInfo::GetFamily() const
{
- // and wxWindows family -- to X foundry, but we have to translate it to
+ // and wxWidgets family -- to X foundry, but we have to translate it to
// wxFontFamily somehow...
wxFAIL_MSG(_T("not implemented")); // GetXFontComponent(wxXLFD_FOUNDRY);
break;
case wxFONTENCODING_GB2312:
- info->xregistry = wxT("GB2312"); // or the otherway round?
+ info->xregistry = wxT("GB2312"); // or the otherway round?
info->xencoding = wxT("*");
break;
case wxFONTENCODING_KOI8:
+ case wxFONTENCODING_KOI8_U:
info->xregistry = wxT("koi8");
// we don't make distinction between koi8-r, koi8-u and koi8-ru (so far)
*xFontName = newFontName;
}
- // try to load exactly the font requested first
- if( !font )
- {
- font = wxLoadQueryFont( pointSize, family, style, weight,
- underlined, facename,
- info.xregistry, info.xencoding,
- xFontName );
- }
-
if ( !font )
{
// search up and down by stepsize 10
int max_size = pointSize + 20 * (1 + (pointSize/180));
int min_size = pointSize - 20 * (1 + (pointSize/180));
- int i;
+ int i, round; // counters
- // Search for smaller size (approx.)
- for ( i = pointSize - 10; !font && i >= 10 && i >= min_size; i -= 10 )
+ // first round: search for equal, then for smaller and for larger size with the given weight and style
+ int testweight = weight;
+ int teststyle = style;
+
+ for ( round = 0; round < 3; round++ )
+ {
+ // second round: use normal weight
+ if ( round == 1 )
{
- font = wxLoadQueryFont(i, family, style, weight, underlined,
+ if ( testweight != wxNORMAL )
+ {
+ testweight = wxNORMAL;
+ }
+ else
+ {
+ ++round; // fall through to third round
+ }
+ }
+
+ // third round: ... and use normal style
+ if ( round == 2 )
+ {
+ if ( teststyle != wxNORMAL )
+ {
+ teststyle = wxNORMAL;
+ }
+ else
+ {
+ break;
+ }
+ }
+ // Search for equal or smaller size (approx.)
+ for ( i = pointSize; !font && i >= 10 && i >= min_size; i -= 10 )
+ {
+ font = wxLoadQueryFont(i, family, teststyle, testweight, underlined,
facename, info.xregistry, info.xencoding,
xFontName);
}
// Search for larger size (approx.)
for ( i = pointSize + 10; !font && i <= max_size; i += 10 )
{
- font = wxLoadQueryFont(i, family, style, weight, underlined,
+ font = wxLoadQueryFont(i, family, teststyle, testweight, underlined,
facename, info.xregistry, info.xencoding,
xFontName);
+ }
}
// Try default family