X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9cc79dd629918578fe8410d6597e4abaaf7afaed..1789c1c6022a63d0d7bfdf5242528f526b870bc6:/src/msw/font.cpp diff --git a/src/msw/font.cpp b/src/msw/font.cpp index ffddf1c6a6..c0ae868c0a 100644 --- a/src/msw/font.cpp +++ b/src/msw/font.cpp @@ -39,6 +39,10 @@ #include "wx/fontutil.h" #include "wx/fontmap.h" +#ifndef __WXWINCE__ + #include "wx/sysopt.h" +#endif + #include "wx/tokenzr.h" #if wxUSE_EXTENDED_RTTI @@ -112,9 +116,9 @@ public: 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) @@ -167,18 +171,18 @@ public: 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; @@ -210,7 +214,7 @@ public: WXHFONT GetHFONT(const wxFont *font) const { if ( !m_hFont ) - wx_const_cast(wxFontRefData *, this)->Alloc(font); + const_cast(this)->Alloc(font); return (WXHFONT)m_hFont; } @@ -253,14 +257,14 @@ public: } } - void SetFamily(int family) + void SetFamily(wxFontFamily family) { Free(); m_family = family; } - void SetStyle(int style) + void SetStyle(wxFontStyle style) { Free(); @@ -270,7 +274,7 @@ public: m_style = style; } - void SetWeight(int weight) + void SetWeight(wxFontWeight weight) { Free(); @@ -330,9 +334,9 @@ protected: 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); @@ -343,9 +347,9 @@ protected: 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; @@ -371,9 +375,9 @@ protected: 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) @@ -404,9 +408,10 @@ void wxFontRefData::Init(const wxNativeFontInfo& info, WXHFONT hFont) 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() @@ -418,7 +423,11 @@ bool wxFontRefData::Alloc(const wxFont *font) { 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; } @@ -453,12 +462,16 @@ void wxNativeFontInfo::Init() { 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 } @@ -468,13 +481,14 @@ int wxNativeFontInfo::GetPointSize() const // 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; } @@ -556,11 +570,16 @@ void wxNativeFontInfo::SetPointSize(int pointsize) 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 ) @@ -609,9 +628,7 @@ void wxNativeFontInfo::SetUnderlined(bool underlined) 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; } @@ -836,6 +853,13 @@ wxString wxNativeFontInfo::ToString() const // wxFont // ---------------------------------------------------------------------------- +wxFont::wxFont(const wxString& fontdesc) +{ + wxNativeFontInfo info; + if ( info.FromString(fontdesc) ) + (void)Create(info); +} + bool wxFont::Create(const wxNativeFontInfo& info, WXHFONT hFont) { UnRef(); @@ -845,19 +869,12 @@ bool wxFont::Create(const wxNativeFontInfo& info, WXHFONT hFont) 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) @@ -886,28 +903,27 @@ wxFont::~wxFont() // 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(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(); @@ -922,6 +938,8 @@ WXHANDLE wxFont::GetResourceHandle() const WXHFONT wxFont::GetHFONT() const { + // NOTE: wxFontRefData::GetHFONT() will automatically call + // wxFontRefData::Alloc() if necessary return M_FONTDATA ? M_FONTDATA->GetHFONT(this) : 0; } @@ -949,21 +967,21 @@ void wxFont::SetPixelSize(const wxSize& pixelSize) 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(); @@ -1014,93 +1032,95 @@ void wxFont::DoSetNativeFontInfo(const wxNativeFontInfo& info) 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(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(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