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:
@@ -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];
|
||||||
|
|
||||||
|
@@ -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,7 +67,8 @@ 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);
|
||||||
virtual void SetStyle(int style);
|
virtual void SetStyle(int style);
|
||||||
@@ -70,7 +76,8 @@ 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
|
||||||
|
|
||||||
// Find an existing, or create a new, XFontStruct
|
// Find an existing, or create a new, XFontStruct
|
||||||
|
@@ -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,7 +349,8 @@ 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,7 +359,8 @@ 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,7 +369,8 @@ 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,7 +379,8 @@ 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,7 +389,8 @@ 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();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -288,7 +399,7 @@ void wxFont::SetUnderlined(bool underlined)
|
|||||||
Unshare();
|
Unshare();
|
||||||
|
|
||||||
M_FONTDATA->m_underlined = underlined;
|
M_FONTDATA->m_underlined = underlined;
|
||||||
|
|
||||||
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
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user