#include "wx/fontutil.h"
#include "wx/fontmap.h"
+#ifndef __WXWINCE__
+ #include "wx/sysopt.h"
+#endif
+
#include "wx/tokenzr.h"
#if wxUSE_EXTENDED_RTTI
wxFontRefData(int size,
const wxSize& pixelSize,
bool sizeUsingPixels,
- int family,
- int style,
- int weight,
+ wxFontFamily family,
+ wxFontStyle style,
+ wxFontWeight weight,
bool underlined,
const wxString& faceName,
wxFontEncoding encoding)
return m_nativeFontInfoOk ? true : m_sizeUsingPixels;
}
- int GetFamily() const
+ wxFontFamily GetFamily() const
{
return m_family;
}
- int GetStyle() const
+ wxFontStyle GetStyle() const
{
return m_nativeFontInfoOk ? m_nativeFontInfo.GetStyle()
: m_style;
}
- int GetWeight() const
+ wxFontWeight GetWeight() const
{
return m_nativeFontInfoOk ? m_nativeFontInfo.GetWeight()
: m_weight;
WXHFONT GetHFONT(const wxFont *font) const
{
if ( !m_hFont )
- wx_const_cast(wxFontRefData *, this)->Alloc(font);
+ const_cast<wxFontRefData *>(this)->Alloc(font);
return (WXHFONT)m_hFont;
}
}
}
- void SetFamily(int family)
+ void SetFamily(wxFontFamily family)
{
Free();
m_family = family;
}
- void SetStyle(int style)
+ void SetStyle(wxFontStyle style)
{
Free();
m_style = style;
}
- void SetWeight(int weight)
+ void SetWeight(wxFontWeight weight)
{
Free();
{ return m_nativeFontInfo; }
void SetNativeFontInfo(const wxNativeFontInfo& nativeFontInfo)
- { Free(); m_nativeFontInfo = nativeFontInfo; }
+ {
+ Free();
+
+ m_nativeFontInfo = nativeFontInfo;
+ m_nativeFontInfoOk = true;
+ }
protected:
// common part of all ctors
void Init(int size,
const wxSize& pixelSize,
bool sizeUsingPixels,
- int family,
- int style,
- int weight,
+ wxFontFamily family,
+ wxFontStyle style,
+ wxFontWeight weight,
bool underlined,
const wxString& faceName,
wxFontEncoding encoding);
int m_pointSize;
wxSize m_pixelSize;
bool m_sizeUsingPixels;
- int m_family;
- int m_style;
- int m_weight;
+ wxFontFamily m_family;
+ wxFontStyle m_style;
+ wxFontWeight m_weight;
bool m_underlined;
wxString m_faceName;
wxFontEncoding m_encoding;
void wxFontRefData::Init(int pointSize,
const wxSize& pixelSize,
bool sizeUsingPixels,
- int family,
- int style,
- int weight,
+ wxFontFamily family,
+ wxFontStyle style,
+ wxFontWeight weight,
bool underlined,
const wxString& faceName,
wxFontEncoding encoding)
m_nativeFontInfoOk = true;
m_nativeFontInfo = info;
+
// This is the best we can do since we don't have the
// correct information at this point.
- m_family = wxSWISS;
+ m_family = wxFONTFAMILY_SWISS;
}
wxFontRefData::~wxFontRefData()
{
if ( !m_nativeFontInfoOk )
{
- wxFillLogFont(&m_nativeFontInfo.lf, font);
+ // NOTE: we use wxNativeInfo::InitFromFont to avoid code duplication:
+ // it results in using our m_* variables (except for m_hFont and
+ // for m_nativeFontInfo obviously) for the initialization
+ // of the wxNativeInfo::lf member.
+ m_nativeFontInfo.InitFromFont(*font);
m_nativeFontInfoOk = true;
}
{
wxZeroMemory(lf);
- // we get better font quality if we use this instead of DEFAULT_QUALITY
- // apparently without any drawbacks
+ // we get better font quality if we use PROOF_QUALITY instead of
+ // DEFAULT_QUALITY but some fonts (e.g. "Terminal 6pt") are not available
+ // then so we allow to set a global option to choose between quality and
+ // wider font selection
#ifdef __WXWINCE__
lf.lfQuality = CLEARTYPE_QUALITY;
#else
- lf.lfQuality = PROOF_QUALITY;
+ lf.lfQuality = wxSystemOptions::GetOptionInt(_T("msw.font.no-proof-quality"))
+ ? DEFAULT_QUALITY
+ : PROOF_QUALITY;
#endif
}
// for printing!
const int ppInch = ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY);
- return (int) (((72.0*(double)abs(lf.lfHeight)) / (double) ppInch) + 0.5);
+ // BC++ 2007 doesn't provide abs(long) overload, hence the cast
+ return (int) (((72.0*abs((int)lf.lfHeight)) / (double) ppInch) + 0.5);
}
wxSize wxNativeFontInfo::GetPixelSize() const
{
wxSize ret;
- ret.SetHeight(lf.lfHeight);
+ ret.SetHeight(abs((int)lf.lfHeight));
ret.SetWidth(lf.lfWidth);
return ret;
}
void wxNativeFontInfo::SetPixelSize(const wxSize& pixelSize)
{
+ // NOTE: although the MSW port allows for negative pixel size heights,
+ // other ports don't and since it's a very useful feature assert
+ // here if we get a negative height:
+ wxCHECK_RET( pixelSize.GetWidth() >= 0 && pixelSize.GetHeight() > 0,
+ "Negative values for the pixel size or zero pixel height are not allowed" );
+
lf.lfHeight = pixelSize.GetHeight();
lf.lfWidth = pixelSize.GetWidth();
}
-
void wxNativeFontInfo::SetStyle(wxFontStyle style)
{
switch ( style )
bool wxNativeFontInfo::SetFaceName(const wxString& facename)
{
- size_t len = WXSIZEOF(lf.lfFaceName);
- wxStrncpy(lf.lfFaceName, facename, len);
- lf.lfFaceName[len - 1] = '\0'; // truncate the face name
+ wxStrlcpy(lf.lfFaceName, facename.c_str(), WXSIZEOF(lf.lfFaceName));
return true;
}
lf.lfClipPrecision,
lf.lfQuality,
lf.lfPitchAndFamily,
- lf.lfFaceName);
+ (const wxChar*)lf.lfFaceName);
return s;
}
// wxFont
// ----------------------------------------------------------------------------
+wxFont::wxFont(const wxString& fontdesc)
+{
+ wxNativeFontInfo info;
+ if ( info.FromString(fontdesc) )
+ (void)Create(info);
+}
+
bool wxFont::Create(const wxNativeFontInfo& info, WXHFONT hFont)
{
UnRef();
return RealizeResource();
}
-wxFont::wxFont(const wxString& fontdesc)
-{
- wxNativeFontInfo info;
- if ( info.FromString(fontdesc) )
- (void)Create(info);
-}
-
bool wxFont::DoCreate(int pointSize,
const wxSize& pixelSize,
bool sizeUsingPixels,
- int family,
- int style,
- int weight,
+ wxFontFamily family,
+ wxFontStyle style,
+ wxFontWeight weight,
bool underlined,
const wxString& faceName,
wxFontEncoding encoding)
// real implementation
// ----------------------------------------------------------------------------
-wxObjectRefData *wxFont::CreateRefData() const
+wxGDIRefData *wxFont::CreateGDIRefData() const
{
return new wxFontRefData();
}
-wxObjectRefData *wxFont::CloneRefData(const wxObjectRefData *data) const
+wxGDIRefData *wxFont::CloneGDIRefData(const wxGDIRefData *data) const
{
- return new wxFontRefData(*wx_static_cast(const wxFontRefData *, data));
+ return new wxFontRefData(*static_cast<const wxFontRefData *>(data));
}
bool wxFont::RealizeResource()
{
- // don't do anything if we already have a valid font
- if ( GetHFONT() )
- return true;
-
- return M_FONTDATA->Alloc(this);
+ // NOTE: the GetHFONT() call automatically triggers a reallocation of
+ // the HFONT if necessary (will do nothing if we already have the resource);
+ // it returns NULL only if there is a failure in wxFontRefData::Alloc()...
+ return GetHFONT() != NULL;
}
bool wxFont::FreeResource(bool WXUNUSED(force))
{
- if ( !GetHFONT() )
+ if ( !M_FONTDATA )
return false;
M_FONTDATA->Free();
WXHFONT wxFont::GetHFONT() const
{
+ // NOTE: wxFontRefData::GetHFONT() will automatically call
+ // wxFontRefData::Alloc() if necessary
return M_FONTDATA ? M_FONTDATA->GetHFONT(this) : 0;
}
M_FONTDATA->SetPixelSize(pixelSize);
}
-void wxFont::SetFamily(int family)
+void wxFont::SetFamily(wxFontFamily family)
{
AllocExclusive();
M_FONTDATA->SetFamily(family);
}
-void wxFont::SetStyle(int style)
+void wxFont::SetStyle(wxFontStyle style)
{
AllocExclusive();
M_FONTDATA->SetStyle(style);
}
-void wxFont::SetWeight(int weight)
+void wxFont::SetWeight(wxFontWeight weight)
{
AllocExclusive();
int wxFont::GetPointSize() const
{
- wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
+ wxCHECK_MSG( IsOk(), 0, wxT("invalid font") );
return M_FONTDATA->GetPointSize();
}
wxSize wxFont::GetPixelSize() const
{
- wxCHECK_MSG( Ok(), wxDefaultSize, wxT("invalid font") );
+ wxCHECK_MSG( IsOk(), wxDefaultSize, wxT("invalid font") );
return M_FONTDATA->GetPixelSize();
}
bool wxFont::IsUsingSizeInPixels() const
{
- wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
+ wxCHECK_MSG( IsOk(), 0, wxT("invalid font") );
return M_FONTDATA->IsUsingSizeInPixels();
}
-int wxFont::GetFamily() const
+wxFontFamily wxFont::GetFamily() const
{
- wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
+ wxCHECK_MSG( IsOk(), wxFONTFAMILY_MAX, wxT("invalid font") );
return M_FONTDATA->GetFamily();
}
-int wxFont::GetStyle() const
+wxFontStyle wxFont::GetStyle() const
{
- wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
+ wxCHECK_MSG( IsOk(), wxFONTSTYLE_MAX, wxT("invalid font") );
return M_FONTDATA->GetStyle();
}
-int wxFont::GetWeight() const
+wxFontWeight wxFont::GetWeight() const
{
- wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
+ wxCHECK_MSG( IsOk(), wxFONTWEIGHT_MAX, wxT("invalid font") );
return M_FONTDATA->GetWeight();
}
bool wxFont::GetUnderlined() const
{
- wxCHECK_MSG( Ok(), false, wxT("invalid font") );
+ wxCHECK_MSG( IsOk(), false, wxT("invalid font") );
return M_FONTDATA->GetUnderlined();
}
wxString wxFont::GetFaceName() const
{
- wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid font") );
+ wxCHECK_MSG( IsOk(), wxEmptyString, wxT("invalid font") );
return M_FONTDATA->GetFaceName();
}
wxFontEncoding wxFont::GetEncoding() const
{
- wxCHECK_MSG( Ok(), wxFONTENCODING_DEFAULT, wxT("invalid font") );
+ wxCHECK_MSG( IsOk(), wxFONTENCODING_DEFAULT, wxT("invalid font") );
return M_FONTDATA->GetEncoding();
}
const wxNativeFontInfo *wxFont::GetNativeFontInfo() const
{
- return Ok() && M_FONTDATA->HasNativeFontInfo() ? &(M_FONTDATA->GetNativeFontInfo())
+ return IsOk() && M_FONTDATA->HasNativeFontInfo() ? &(M_FONTDATA->GetNativeFontInfo())
: NULL;
}
wxString wxFont::GetNativeFontInfoDesc() const
{
- wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid font") );
+ wxCHECK_MSG( IsOk(), wxEmptyString, wxT("invalid font") );
// be sure we have an HFONT associated...
- wxConstCast(this, wxFont)->RealizeResource();
+ const_cast<wxFont*>(this)->RealizeResource();
return wxFontBase::GetNativeFontInfoDesc();
}
wxString wxFont::GetNativeFontInfoUserDesc() const
{
- wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid font") );
+ wxCHECK_MSG( IsOk(), wxEmptyString, wxT("invalid font") );
// be sure we have an HFONT associated...
- wxConstCast(this, wxFont)->RealizeResource();
+ const_cast<wxFont*>(this)->RealizeResource();
return wxFontBase::GetNativeFontInfoUserDesc();
}
bool wxFont::IsFixedWidth() const
{
+ wxCHECK_MSG( IsOk(), false, wxT("invalid font") );
+
if ( M_FONTDATA->HasNativeFontInfo() )
{
// the two low-order bits specify the pitch of the font, the rest is