allocate HFONT on demand instead of doing every time a font property is modified
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44789 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -145,7 +145,7 @@ public:
|
||||
virtual ~wxFontRefData();
|
||||
|
||||
// operations
|
||||
bool Alloc(wxFont *font);
|
||||
bool Alloc(const wxFont *font);
|
||||
|
||||
void Free();
|
||||
|
||||
@@ -207,11 +207,26 @@ public:
|
||||
: m_encoding;
|
||||
}
|
||||
|
||||
WXHFONT GetHFONT() const { return m_hFont; }
|
||||
WXHFONT GetHFONT(const wxFont *font) const
|
||||
{
|
||||
if ( !m_hFont )
|
||||
wx_const_cast(wxFontRefData *, this)->Alloc(font);
|
||||
|
||||
// ... and setters
|
||||
return (WXHFONT)m_hFont;
|
||||
}
|
||||
|
||||
bool HasHFONT() const
|
||||
{
|
||||
return m_hFont != 0;
|
||||
}
|
||||
|
||||
// ... and setters: notice that all of them invalidate the currently
|
||||
// allocated HFONT, if any, so that the next call to GetHFONT() recreates a
|
||||
// new one
|
||||
void SetPointSize(int pointSize)
|
||||
{
|
||||
Free();
|
||||
|
||||
if ( m_nativeFontInfoOk )
|
||||
{
|
||||
m_nativeFontInfo.SetPointSize(pointSize);
|
||||
@@ -225,6 +240,8 @@ public:
|
||||
|
||||
void SetPixelSize(const wxSize& pixelSize)
|
||||
{
|
||||
Free();
|
||||
|
||||
if ( m_nativeFontInfoOk )
|
||||
{
|
||||
m_nativeFontInfo.SetPixelSize(pixelSize);
|
||||
@@ -238,11 +255,15 @@ public:
|
||||
|
||||
void SetFamily(int family)
|
||||
{
|
||||
Free();
|
||||
|
||||
m_family = family;
|
||||
}
|
||||
|
||||
void SetStyle(int style)
|
||||
{
|
||||
Free();
|
||||
|
||||
if ( m_nativeFontInfoOk )
|
||||
m_nativeFontInfo.SetStyle((wxFontStyle)style);
|
||||
else
|
||||
@@ -251,6 +272,8 @@ public:
|
||||
|
||||
void SetWeight(int weight)
|
||||
{
|
||||
Free();
|
||||
|
||||
if ( m_nativeFontInfoOk )
|
||||
m_nativeFontInfo.SetWeight((wxFontWeight)weight);
|
||||
else
|
||||
@@ -259,6 +282,8 @@ public:
|
||||
|
||||
bool SetFaceName(const wxString& faceName)
|
||||
{
|
||||
Free();
|
||||
|
||||
if ( m_nativeFontInfoOk )
|
||||
return m_nativeFontInfo.SetFaceName(faceName);
|
||||
|
||||
@@ -268,6 +293,8 @@ public:
|
||||
|
||||
void SetUnderlined(bool underlined)
|
||||
{
|
||||
Free();
|
||||
|
||||
if ( m_nativeFontInfoOk )
|
||||
m_nativeFontInfo.SetUnderlined(underlined);
|
||||
else
|
||||
@@ -276,18 +303,23 @@ public:
|
||||
|
||||
void SetEncoding(wxFontEncoding encoding)
|
||||
{
|
||||
Free();
|
||||
|
||||
if ( m_nativeFontInfoOk )
|
||||
m_nativeFontInfo.SetEncoding(encoding);
|
||||
else
|
||||
m_encoding = encoding;
|
||||
}
|
||||
|
||||
// native font info tests
|
||||
// native font info
|
||||
bool HasNativeFontInfo() const { return m_nativeFontInfoOk; }
|
||||
|
||||
const wxNativeFontInfo& GetNativeFontInfo() const
|
||||
{ return m_nativeFontInfo; }
|
||||
|
||||
void SetNativeFontInfo(const wxNativeFontInfo& nativeFontInfo)
|
||||
{ Free(); m_nativeFontInfo = nativeFontInfo; }
|
||||
|
||||
protected:
|
||||
// common part of all ctors
|
||||
void Init(int size,
|
||||
@@ -302,7 +334,7 @@ protected:
|
||||
|
||||
void Init(const wxNativeFontInfo& info, WXHFONT hFont = 0);
|
||||
|
||||
// font characterstics
|
||||
// font characteristics
|
||||
int m_pointSize;
|
||||
wxSize m_pixelSize;
|
||||
bool m_sizeUsingPixels;
|
||||
@@ -313,8 +345,8 @@ protected:
|
||||
wxString m_faceName;
|
||||
wxFontEncoding m_encoding;
|
||||
|
||||
// Windows font handle
|
||||
WXHFONT m_hFont;
|
||||
// Windows font handle, created on demand in GetHFONT()
|
||||
HFONT m_hFont;
|
||||
|
||||
// Native font info
|
||||
wxNativeFontInfo m_nativeFontInfo;
|
||||
@@ -363,7 +395,7 @@ void wxFontRefData::Init(const wxNativeFontInfo& info, WXHFONT hFont)
|
||||
// use the exact font created in the underlying system
|
||||
// (for example where we can't guarantee conversion from HFONT
|
||||
// to LOGFONT back to HFONT)
|
||||
m_hFont = hFont;
|
||||
m_hFont = (HFONT)hFont;
|
||||
|
||||
m_nativeFontInfoOk = true;
|
||||
m_nativeFontInfo = info;
|
||||
@@ -377,7 +409,7 @@ wxFontRefData::~wxFontRefData()
|
||||
Free();
|
||||
}
|
||||
|
||||
bool wxFontRefData::Alloc(wxFont *font)
|
||||
bool wxFontRefData::Alloc(const wxFont *font)
|
||||
{
|
||||
if ( !m_nativeFontInfoOk )
|
||||
{
|
||||
@@ -385,14 +417,13 @@ bool wxFontRefData::Alloc(wxFont *font)
|
||||
m_nativeFontInfoOk = true;
|
||||
}
|
||||
|
||||
HFONT hfont = ::CreateFontIndirect(&m_nativeFontInfo.lf);
|
||||
if ( !hfont )
|
||||
m_hFont = ::CreateFontIndirect(&m_nativeFontInfo.lf);
|
||||
if ( !m_hFont )
|
||||
{
|
||||
wxLogLastError(wxT("CreateFont"));
|
||||
return false;
|
||||
}
|
||||
|
||||
m_hFont = (WXHFONT)hfont;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -400,7 +431,7 @@ void wxFontRefData::Free()
|
||||
{
|
||||
if ( m_hFont )
|
||||
{
|
||||
if ( !::DeleteObject((HFONT) m_hFont) )
|
||||
if ( !::DeleteObject(m_hFont) )
|
||||
{
|
||||
wxLogLastError(wxT("DeleteObject(font)"));
|
||||
}
|
||||
@@ -886,23 +917,12 @@ WXHANDLE wxFont::GetResourceHandle() const
|
||||
|
||||
WXHFONT wxFont::GetHFONT() const
|
||||
{
|
||||
return M_FONTDATA ? M_FONTDATA->GetHFONT() : 0;
|
||||
return M_FONTDATA ? M_FONTDATA->GetHFONT(this) : 0;
|
||||
}
|
||||
|
||||
bool wxFont::IsFree() const
|
||||
{
|
||||
return M_FONTDATA && (M_FONTDATA->GetHFONT() == 0);
|
||||
}
|
||||
|
||||
bool wxFont::Recreate()
|
||||
{
|
||||
// this function can be used to recreate the font after its wxFontRefData
|
||||
// changes and does it unconditionally, i.e. even if already had a valid
|
||||
// font before
|
||||
wxCHECK_MSG( M_FONTDATA, false, _T("no font to recreate") );
|
||||
|
||||
M_FONTDATA->Free();
|
||||
return M_FONTDATA->Alloc(this);
|
||||
return M_FONTDATA && !M_FONTDATA->HasHFONT();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -913,9 +933,8 @@ void wxFont::SetPointSize(int pointSize)
|
||||
{
|
||||
AllocExclusive();
|
||||
|
||||
M_FONTDATA->Free();
|
||||
M_FONTDATA->SetPointSize(pointSize);
|
||||
|
||||
Recreate();
|
||||
}
|
||||
|
||||
void wxFont::SetPixelSize(const wxSize& pixelSize)
|
||||
@@ -923,8 +942,6 @@ void wxFont::SetPixelSize(const wxSize& pixelSize)
|
||||
AllocExclusive();
|
||||
|
||||
M_FONTDATA->SetPixelSize(pixelSize);
|
||||
|
||||
Recreate();
|
||||
}
|
||||
|
||||
void wxFont::SetFamily(int family)
|
||||
@@ -932,8 +949,6 @@ void wxFont::SetFamily(int family)
|
||||
AllocExclusive();
|
||||
|
||||
M_FONTDATA->SetFamily(family);
|
||||
|
||||
Recreate();
|
||||
}
|
||||
|
||||
void wxFont::SetStyle(int style)
|
||||
@@ -941,8 +956,6 @@ void wxFont::SetStyle(int style)
|
||||
AllocExclusive();
|
||||
|
||||
M_FONTDATA->SetStyle(style);
|
||||
|
||||
Recreate();
|
||||
}
|
||||
|
||||
void wxFont::SetWeight(int weight)
|
||||
@@ -950,17 +963,14 @@ void wxFont::SetWeight(int weight)
|
||||
AllocExclusive();
|
||||
|
||||
M_FONTDATA->SetWeight(weight);
|
||||
|
||||
Recreate();
|
||||
}
|
||||
|
||||
bool wxFont::SetFaceName(const wxString& faceName)
|
||||
{
|
||||
AllocExclusive();
|
||||
|
||||
bool refdataok = M_FONTDATA->SetFaceName(faceName);
|
||||
|
||||
Recreate();
|
||||
if ( !M_FONTDATA->SetFaceName(faceName) )
|
||||
return false;
|
||||
|
||||
// NB: using win32's GetObject() API on M_FONTDATA->GetHFONT()
|
||||
// to retrieve a LOGFONT and then compare lf.lfFaceName
|
||||
@@ -969,7 +979,7 @@ bool wxFont::SetFaceName(const wxString& faceName)
|
||||
// without any validity check.
|
||||
// Thus we use wxFontBase::SetFaceName to check if facename
|
||||
// is valid...
|
||||
return refdataok && wxFontBase::SetFaceName(faceName);
|
||||
return wxFontBase::SetFaceName(faceName);
|
||||
}
|
||||
|
||||
void wxFont::SetUnderlined(bool underlined)
|
||||
@@ -977,8 +987,6 @@ void wxFont::SetUnderlined(bool underlined)
|
||||
AllocExclusive();
|
||||
|
||||
M_FONTDATA->SetUnderlined(underlined);
|
||||
|
||||
Recreate();
|
||||
}
|
||||
|
||||
void wxFont::SetEncoding(wxFontEncoding encoding)
|
||||
@@ -986,17 +994,13 @@ void wxFont::SetEncoding(wxFontEncoding encoding)
|
||||
AllocExclusive();
|
||||
|
||||
M_FONTDATA->SetEncoding(encoding);
|
||||
|
||||
Recreate();
|
||||
}
|
||||
|
||||
void wxFont::DoSetNativeFontInfo(const wxNativeFontInfo& info)
|
||||
{
|
||||
AllocExclusive();
|
||||
|
||||
*M_FONTDATA = wxFontRefData(info);
|
||||
|
||||
Recreate();
|
||||
M_FONTDATA->SetNativeFontInfo(info);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
Reference in New Issue
Block a user