X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5c33522fca7cddc441a316f5b9fb50d7685435ba..1789c1c6022a63d0d7bfdf5242528f526b870bc6:/src/msw/font.cpp diff --git a/src/msw/font.cpp b/src/msw/font.cpp index 992dea1f0d..c0ae868c0a 100644 --- a/src/msw/font.cpp +++ b/src/msw/font.cpp @@ -116,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) @@ -171,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; @@ -257,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(); @@ -274,7 +274,7 @@ public: m_style = style; } - void SetWeight(int weight) + void SetWeight(wxFontWeight weight) { Free(); @@ -334,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); @@ -347,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; @@ -375,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) @@ -408,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() @@ -422,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; } @@ -565,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 ) @@ -618,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; } @@ -845,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(); @@ -854,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) @@ -907,16 +915,15 @@ wxGDIRefData *wxFont::CloneGDIRefData(const wxGDIRefData *data) const 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(); @@ -931,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; } @@ -958,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(); @@ -1023,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