implemented native font stuff for wxMotif

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13303 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Gilles Depeyrot
2002-01-01 17:27:49 +00:00
parent 1ff301c4eb
commit 563f868d38
3 changed files with 167 additions and 22 deletions

View File

@@ -45,9 +45,7 @@
// further it might make sense to make it a real class with virtual methods // further it might make sense to make it a real class with virtual methods
struct WXDLLEXPORT wxNativeFontInfo struct WXDLLEXPORT wxNativeFontInfo
{ {
#if defined(__WXGTK__) // || defined(__WXMOTIF__) #if defined(__WXGTK__) || defined(__WXMOTIF__)
// TODO: wxMotif should use this too but motif/font.cpp
// must be updated for this!
// the components of the XLFD // the components of the XLFD
wxString fontElements[14]; wxString fontElements[14];

View File

@@ -49,6 +49,11 @@ public:
const wxString& face = wxEmptyString, const wxString& face = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT); wxFontEncoding encoding = wxFONTENCODING_DEFAULT);
// wxMOTIF-specific
bool Create(const wxString& fontname,
wxFontEncoding fontenc = wxFONTENCODING_DEFAULT);
bool Create(const wxNativeFontInfo& fontinfo);
virtual ~wxFont(); virtual ~wxFont();
// assignment // assignment
@@ -62,6 +67,7 @@ public:
virtual bool GetUnderlined() const; virtual bool GetUnderlined() const;
virtual wxString GetFaceName() const; virtual wxString GetFaceName() const;
virtual wxFontEncoding GetEncoding() const; virtual wxFontEncoding GetEncoding() const;
virtual wxNativeFontInfo *GetNativeFontInfo() const;
virtual void SetPointSize(int pointSize); virtual void SetPointSize(int pointSize);
virtual void SetFamily(int family); virtual void SetFamily(int family);
@@ -70,6 +76,7 @@ public:
virtual void SetFaceName(const wxString& faceName); virtual void SetFaceName(const wxString& faceName);
virtual void SetUnderlined(bool underlined); virtual void SetUnderlined(bool underlined);
virtual void SetEncoding(wxFontEncoding encoding); virtual void SetEncoding(wxFontEncoding encoding);
virtual void SetNativeFontInfo( const wxNativeFontInfo& info );
// Implementation // Implementation

View File

@@ -36,6 +36,8 @@
#include "wx/gdicmn.h" #include "wx/gdicmn.h"
#include "wx/utils.h" // for wxGetDisplay() #include "wx/utils.h" // for wxGetDisplay()
#include "wx/fontutil.h" // for wxNativeFontInfo #include "wx/fontutil.h" // for wxNativeFontInfo
#include "wx/tokenzr.h"
#include "wx/settings.h"
IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject) IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject)
@@ -100,6 +102,8 @@ protected:
wxString m_faceName; wxString m_faceName;
wxFontEncoding m_encoding; wxFontEncoding m_encoding;
wxNativeFontInfo m_nativeFontInfo;
// A list of wxXFonts // A list of wxXFonts
wxList m_fonts; wxList m_fonts;
}; };
@@ -190,8 +194,7 @@ wxFont::wxFont(const wxNativeFontInfo& info)
{ {
Init(); Init();
(void)Create(info.pointSize, info.family, info.style, info.weight, (void)Create(info.xFontName);
info.underlined, info.faceName, info.encoding);
} }
void wxFont::Init() void wxFont::Init()
@@ -215,6 +218,109 @@ bool wxFont::Create(int pointSize,
return TRUE; return TRUE;
} }
bool wxFont::Create(const wxString& fontname, wxFontEncoding enc)
{
if( !fontname )
{
*this = wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT);
return TRUE;
}
m_refData = new wxFontRefData();
M_FONTDATA->m_nativeFontInfo.xFontName = fontname; // X font name
wxString tmp;
wxStringTokenizer tn( fontname, wxT("-") );
tn.GetNextToken(); // skip initial empty token
tn.GetNextToken(); // foundry
M_FONTDATA->m_faceName = tn.GetNextToken(); // family
tmp = tn.GetNextToken().MakeUpper(); // weight
if (tmp == wxT("BOLD")) M_FONTDATA->m_weight = wxBOLD;
if (tmp == wxT("BLACK")) M_FONTDATA->m_weight = wxBOLD;
if (tmp == wxT("EXTRABOLD")) M_FONTDATA->m_weight = wxBOLD;
if (tmp == wxT("DEMIBOLD")) M_FONTDATA->m_weight = wxBOLD;
if (tmp == wxT("ULTRABOLD")) M_FONTDATA->m_weight = wxBOLD;
if (tmp == wxT("LIGHT")) M_FONTDATA->m_weight = wxLIGHT;
if (tmp == wxT("THIN")) M_FONTDATA->m_weight = wxLIGHT;
tmp = tn.GetNextToken().MakeUpper(); // slant
if (tmp == wxT("I")) M_FONTDATA->m_style = wxITALIC;
if (tmp == wxT("O")) M_FONTDATA->m_style = wxITALIC;
tn.GetNextToken(); // set width
tn.GetNextToken(); // add. style
tn.GetNextToken(); // pixel size
tmp = tn.GetNextToken(); // pointsize
if (tmp != wxT("*"))
{
long num = wxStrtol (tmp.c_str(), (wxChar **) NULL, 10);
M_FONTDATA->m_pointSize = (int)(num / 10);
}
tn.GetNextToken(); // x-res
tn.GetNextToken(); // y-res
tmp = tn.GetNextToken().MakeUpper(); // spacing
if (tmp == wxT("M"))
M_FONTDATA->m_family = wxMODERN;
else if (M_FONTDATA->m_faceName == wxT("TIMES"))
M_FONTDATA->m_family = wxROMAN;
else if (M_FONTDATA->m_faceName == wxT("HELVETICA"))
M_FONTDATA->m_family = wxSWISS;
else if (M_FONTDATA->m_faceName == wxT("LUCIDATYPEWRITER"))
M_FONTDATA->m_family = wxTELETYPE;
else if (M_FONTDATA->m_faceName == wxT("LUCIDA"))
M_FONTDATA->m_family = wxDECORATIVE;
else if (M_FONTDATA->m_faceName == wxT("UTOPIA"))
M_FONTDATA->m_family = wxSCRIPT;
tn.GetNextToken(); // avg width
// deal with font encoding
M_FONTDATA->m_encoding = enc;
if ( M_FONTDATA->m_encoding == wxFONTENCODING_SYSTEM )
{
wxString registry = tn.GetNextToken().MakeUpper(),
encoding = tn.GetNextToken().MakeUpper();
if ( registry == _T("ISO8859") )
{
int cp;
if ( wxSscanf(encoding, wxT("%d"), &cp) == 1 )
{
M_FONTDATA->m_encoding =
(wxFontEncoding)(wxFONTENCODING_ISO8859_1 + cp - 1);
}
}
else if ( registry == _T("MICROSOFT") )
{
int cp;
if ( wxSscanf(encoding, wxT("cp125%d"), &cp) == 1 )
{
M_FONTDATA->m_encoding =
(wxFontEncoding)(wxFONTENCODING_CP1250 + cp);
}
}
else if ( registry == _T("KOI8") )
{
M_FONTDATA->m_encoding = wxFONTENCODING_KOI8;
}
//else: unknown encoding - may be give a warning here?
else
return FALSE;
}
return TRUE;
}
wxFont::~wxFont() wxFont::~wxFont()
{ {
} }
@@ -243,6 +349,7 @@ void wxFont::SetPointSize(int pointSize)
Unshare(); Unshare();
M_FONTDATA->m_pointSize = pointSize; M_FONTDATA->m_pointSize = pointSize;
M_FONTDATA->m_nativeFontInfo.xFontName.Clear(); // invalid now
RealizeResource(); RealizeResource();
} }
@@ -252,6 +359,7 @@ void wxFont::SetFamily(int family)
Unshare(); Unshare();
M_FONTDATA->m_family = family; M_FONTDATA->m_family = family;
M_FONTDATA->m_nativeFontInfo.xFontName.Clear(); // invalid now
RealizeResource(); RealizeResource();
} }
@@ -261,6 +369,7 @@ void wxFont::SetStyle(int style)
Unshare(); Unshare();
M_FONTDATA->m_style = style; M_FONTDATA->m_style = style;
M_FONTDATA->m_nativeFontInfo.xFontName.Clear(); // invalid now
RealizeResource(); RealizeResource();
} }
@@ -270,6 +379,7 @@ void wxFont::SetWeight(int weight)
Unshare(); Unshare();
M_FONTDATA->m_weight = weight; M_FONTDATA->m_weight = weight;
M_FONTDATA->m_nativeFontInfo.xFontName.Clear(); // invalid now
RealizeResource(); RealizeResource();
} }
@@ -279,6 +389,7 @@ void wxFont::SetFaceName(const wxString& faceName)
Unshare(); Unshare();
M_FONTDATA->m_faceName = faceName; M_FONTDATA->m_faceName = faceName;
M_FONTDATA->m_nativeFontInfo.xFontName.Clear(); // invalid now
RealizeResource(); RealizeResource();
} }
@@ -297,52 +408,81 @@ void wxFont::SetEncoding(wxFontEncoding encoding)
Unshare(); Unshare();
M_FONTDATA->m_encoding = encoding; M_FONTDATA->m_encoding = encoding;
M_FONTDATA->m_nativeFontInfo.xFontName.Clear(); // invalid now
RealizeResource(); RealizeResource();
} }
void wxFont::SetNativeFontInfo(const wxNativeFontInfo& info)
{
Unshare();
M_FONTDATA->m_nativeFontInfo = info;
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// query font attributes // query font attributes
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
int wxFont::GetPointSize() const int wxFont::GetPointSize() const
{ {
wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
return M_FONTDATA->m_pointSize; return M_FONTDATA->m_pointSize;
} }
wxString wxFont::GetFaceName() const
{
wxCHECK_MSG( Ok(), wxT(""), wxT("invalid font") );
return M_FONTDATA->m_faceName ;
}
int wxFont::GetFamily() const int wxFont::GetFamily() const
{ {
wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
return M_FONTDATA->m_family; return M_FONTDATA->m_family;
} }
int wxFont::GetStyle() const int wxFont::GetStyle() const
{ {
wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
return M_FONTDATA->m_style; return M_FONTDATA->m_style;
} }
int wxFont::GetWeight() const int wxFont::GetWeight() const
{ {
wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
return M_FONTDATA->m_weight; return M_FONTDATA->m_weight;
} }
bool wxFont::GetUnderlined() const bool wxFont::GetUnderlined() const
{ {
return M_FONTDATA->m_underlined; wxCHECK_MSG( Ok(), FALSE, wxT("invalid font") );
}
wxString wxFont::GetFaceName() const return M_FONTDATA->m_underlined;
{
wxString str;
if ( M_FONTDATA )
str = M_FONTDATA->m_faceName ;
return str;
} }
wxFontEncoding wxFont::GetEncoding() const wxFontEncoding wxFont::GetEncoding() const
{ {
wxCHECK_MSG( Ok(), wxFONTENCODING_DEFAULT, wxT("invalid font") );
return M_FONTDATA->m_encoding; return M_FONTDATA->m_encoding;
} }
wxNativeFontInfo *wxFont::GetNativeFontInfo() const
{
wxCHECK_MSG( Ok(), (wxNativeFontInfo *)NULL, wxT("invalid font") );
if(M_FONTDATA->m_nativeFontInfo.xFontName.IsEmpty())
GetInternalFont();
return new wxNativeFontInfo(M_FONTDATA->m_nativeFontInfo);
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// real implementation // real implementation
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------