// define the functions to create and destroy native fonts for this toolkit
#ifdef __X__
- static inline wxNativeFont wxLoadFont(const wxString& fontSpec)
+ wxNativeFont wxLoadFont(const wxString& fontSpec)
{
return XLoadQueryFont((Display *)wxGetDisplay(), fontSpec);
}
- static inline void wxFreeFont(wxNativeFont font)
+ inline void wxFreeFont(wxNativeFont font)
{
XFreeFont((Display *)wxGetDisplay(), (XFontStruct *)font);
}
#elif defined(__WXGTK__)
- static inline wxNativeFont wxLoadFont(const wxString& fontSpec)
+ wxNativeFont wxLoadFont(const wxString& fontSpec)
{
return gdk_font_load( wxConvertWX2MB(fontSpec) );
}
- static inline void wxFreeFont(wxNativeFont font)
+ inline void wxFreeFont(wxNativeFont font)
{
gdk_font_unref(font);
}
return s;
}
+// ----------------------------------------------------------------------------
+// wxNativeFontInfo
+// ----------------------------------------------------------------------------
+
+void wxNativeFontInfo::Init()
+{
+ m_isDefault = TRUE;
+}
+
+bool wxNativeFontInfo::FromString(const wxString& s)
+{
+ wxStringTokenizer tokenizer(s, _T(";"));
+
+ // check the version
+ wxString token = tokenizer.GetNextToken();
+ if ( token != _T('0') )
+ return FALSE;
+
+ xFontName = tokenizer.GetNextToken();
+
+ // this should be the end
+ if ( tokenizer.HasMoreTokens() )
+ return FALSE;
+
+ return FromXFontName(xFontName);
+}
+
+wxString wxNativeFontInfo::ToString() const
+{
+ // 0 is the version
+ return wxString::Format(_T("%d;%s"), 0, GetXFontName().c_str());
+}
+
+bool wxNativeFontInfo::FromUserString(const wxString& s)
+{
+ return FromXFontName(s);
+}
+
+wxString wxNativeFontInfo::ToUserString() const
+{
+ return GetXFontName();
+}
+
+bool wxNativeFontInfo::HasElements() const
+{
+ // we suppose that the foundry is never empty, so if it is it means that we
+ // had never parsed the XLFD
+ return !fontElements[0].empty();
+}
+
+wxString wxNativeFontInfo::GetXFontComponent(wxXLFDField field) const
+{
+ wxCHECK_MSG( field < wxXLFD_MAX, _T(""), _T("invalid XLFD field") );
+
+ if ( !HasElements() )
+ {
+ // const_cast
+ if ( !((wxNativeFontInfo *)this)->FromXFontName(xFontName) )
+ return _T("");
+ }
+
+ return fontElements[field];
+}
+
+bool wxNativeFontInfo::FromXFontName(const wxString& fontname)
+{
+ // TODO: we should be able to handle the font aliases here, but how?
+ wxStringTokenizer tokenizer(fontname, _T("-"));
+
+ // skip the leading, usually empty field (font name registry)
+ if ( !tokenizer.HasMoreTokens() )
+ return FALSE;
+
+ (void)tokenizer.GetNextToken();
+
+ for ( size_t n = 0; n < WXSIZEOF(fontElements); n++ )
+ {
+ if ( !tokenizer.HasMoreTokens() )
+ {
+ // not enough elements in the XLFD - or maybe an alias
+ return FALSE;
+ }
+
+ fontElements[n] = tokenizer.GetNextToken();
+ }
+
+ // this should be all
+ return !tokenizer.HasMoreTokens();
+}
+
+wxString wxNativeFontInfo::GetXFontName() const
+{
+ if ( xFontName.empty() )
+ {
+ for ( size_t n = 0; n < WXSIZEOF(fontElements); n++ )
+ {
+ // replace the non specified elements with '*' except for the
+ // additional style which is usually just omitted
+ wxString elt = fontElements[n];
+ if ( elt.empty() && n != wxXLFD_ADDSTYLE )
+ {
+ elt = _T('*');
+ }
+
+ // const_cast
+ ((wxNativeFontInfo *)this)->xFontName << _T('-') << elt;
+ }
+ }
+
+ return xFontName;
+}
+
+void
+wxNativeFontInfo::SetXFontComponent(wxXLFDField field, const wxString& value)
+{
+ wxCHECK_RET( field < wxXLFD_MAX, _T("invalid XLFD field") );
+
+ // this class should be initialized with a valid font spec first and only
+ // then the fields may be modified!
+ wxASSERT_MSG( !IsDefault(), _T("can't modify an uninitialized XLFD") );
+
+ if ( !HasElements() )
+ {
+ // const_cast
+ if ( !((wxNativeFontInfo *)this)->FromXFontName(xFontName) )
+ {
+ wxFAIL_MSG( _T("can't set font element for invalid XLFD") );
+
+ return;
+ }
+ }
+
+ fontElements[field] = value;
+
+ // invalidate the XFLD, it doesn't correspond to the font elements any more
+ xFontName.clear();
+}
+
+void wxNativeFontInfo::SetXFontName(const wxString& xFontName_)
+{
+ // invalidate the font elements, GetXFontComponent() will reparse the XLFD
+ fontElements[0].clear();
+
+ xFontName = xFontName_;
+
+ m_isDefault = FALSE;
+}
+
// ----------------------------------------------------------------------------
// common functions
// ----------------------------------------------------------------------------
break;
case wxFONTENCODING_UTF8:
- // FIXME: this is probably false, but this is how they are called on
- // my system and I don't know what the standard XFLD is (VZ)
- info->xregistry = wxT("iso646.1991");
+ info->xregistry = wxT("iso10646");
info->xencoding = wxT("*");
break;
case wxFONTENCODING_KOI8:
info->xregistry = wxT("koi8");
- // we don't make distinction between koi8-r and koi8-u (so far)
+ // we don't make distinction between koi8-r, koi8-u and koi8-ru (so far)
info->xencoding = wxT("*");
break;
return FALSE;
}
- info->encoding = encoding;
+ info->encoding = encoding;
return TRUE;
}
if ( !wxGetNativeFontEncoding(encoding, &info) ||
!wxTestFontEncoding(info) )
{
- if ( !wxTheFontMapper->GetAltForEncoding(encoding, &info) )
+#if wxUSE_FONTMAP
+ if ( !wxFontMapper::Get()->GetAltForEncoding(encoding, &info) )
+#endif // wxUSE_FONTMAP
{
// unspported encoding - replace it with the default
//
case wxSCRIPT: xfamily = wxT("utopia"); break;
default: xfamily = wxT("*");
}
+#if wxUSE_NANOX
+ int xweight;
+ switch (weight)
+ {
+ case wxBOLD:
+ {
+ xweight = MWLF_WEIGHT_BOLD;
+ break;
+ }
+ case wxLIGHT:
+ {
+ xweight = MWLF_WEIGHT_LIGHT;
+ break;
+ }
+ case wxNORMAL:
+ {
+ xweight = MWLF_WEIGHT_NORMAL;
+ break;
+ }
+ default:
+ {
+ xweight = MWLF_WEIGHT_DEFAULT;
+ break;
+ }
+ }
+ GR_SCREEN_INFO screenInfo;
+ GrGetScreenInfo(& screenInfo);
+
+ int yPixelsPerCM = screenInfo.ydpcm;
+
+ // A point is 1/72 of an inch.
+ // An inch is 2.541 cm.
+ // So pixelHeight = (pointSize / 72) (inches) * 2.541 (for cm) * yPixelsPerCM (for pixels)
+ // In fact pointSize is 10 * the normal point size so
+ // divide by 10.
+
+ int pixelHeight = (int) ( (((float)pointSize) / 720.0) * 2.541 * (float) yPixelsPerCM) ;
+
+ // An alternative: assume that the screen is 72 dpi.
+ //int pixelHeight = (int) (((float)pointSize / 720.0) * 72.0) ;
+ //int pixelHeight = (int) ((float)pointSize / 10.0) ;
+
+ GR_LOGFONT logFont;
+ logFont.lfHeight = pixelHeight;
+ logFont.lfWidth = 0;
+ logFont.lfEscapement = 0;
+ logFont.lfOrientation = 0;
+ logFont.lfWeight = xweight;
+ logFont.lfItalic = (style == wxNORMAL ? 0 : 1) ;
+ logFont.lfUnderline = 0;
+ logFont.lfStrikeOut = 0;
+ logFont.lfCharSet = MWLF_CHARSET_DEFAULT; // TODO: select appropriate one
+ logFont.lfOutPrecision = MWLF_TYPE_DEFAULT;
+ logFont.lfClipPrecision = 0; // Not used
+ logFont.lfRoman = (family == wxROMAN ? 1 : 0) ;
+ logFont.lfSerif = (family == wxSWISS ? 0 : 1) ;
+ logFont.lfSansSerif = !logFont.lfSerif ;
+ logFont.lfModern = (family == wxMODERN ? 1 : 0) ;
+ logFont.lfProportional = (family == wxTELETYPE ? 0 : 1) ;
+ logFont.lfOblique = 0;
+ logFont.lfSmallCaps = 0;
+ logFont.lfPitch = 0; // 0 = default
+ strcpy(logFont.lfFaceName, facename.c_str());
+
+ XFontStruct* fontInfo = (XFontStruct*) malloc(sizeof(XFontStruct));
+ fontInfo->fid = GrCreateFont((GR_CHAR*) facename.c_str(), pixelHeight, & logFont);
+ GrGetFontInfo(fontInfo->fid, & fontInfo->info);
+ return (wxNativeFont) fontInfo;
+
+#else
wxString fontSpec;
if (!facename.IsEmpty())
{
// if pointSize is -1, don't specify any
wxString sizeSpec;
- if ( fontSpec == -1 )
+ if ( pointSize == -1 )
{
sizeSpec = _T('*');
}
*xFontName = fontSpec;
return wxLoadFont(fontSpec);
+#endif
+ // wxUSE_NANOX
}
// ----------------------------------------------------------------------------