diff --git a/src/common/fontcmn.cpp b/src/common/fontcmn.cpp index cef604180a..b088f2adb3 100644 --- a/src/common/fontcmn.cpp +++ b/src/common/fontcmn.cpp @@ -747,6 +747,7 @@ void wxNativeFontInfo::SetPointSize(int pointsize) bool wxNativeFontInfo::FromString(const wxString& s) { long l; + double d; unsigned long version; wxStringTokenizer tokenizer(s, wxT(";")); @@ -756,9 +757,11 @@ bool wxNativeFontInfo::FromString(const wxString& s) return false; token = tokenizer.GetNextToken(); - if ( !token.ToLong(&l) ) + if ( !token.ToCDouble(&d) ) + return false; + pointSize = static_cast(d); + if ( static_cast(pointSize) != d ) return false; - pointSize = (int)l; token = tokenizer.GetNextToken(); if ( !token.ToLong(&l) ) @@ -773,7 +776,9 @@ bool wxNativeFontInfo::FromString(const wxString& s) token = tokenizer.GetNextToken(); if ( !token.ToLong(&l) ) return false; - weight = (wxFontWeight)l; + weight = ConvertFromLegacyWeightIfNecessary(l); + if ( weight <= wxFONTWEIGHT_INVALID || weight > wxFONTWEIGHT_MAX ) + return false; token = tokenizer.GetNextToken(); if ( !token.ToLong(&l) ) @@ -807,12 +812,12 @@ wxString wxNativeFontInfo::ToString() const { wxString s; - s.Printf(wxT("%d;%d;%d;%d;%d;%d;%d;%s;%d"), + s.Printf(wxT("%d;%f;%d;%d;%d;%d;%d;%s;%d"), 1, // version - GetPointSize(), + GetFractionalPointSize(), family, (int)style, - (int)weight, + weight, underlined, strikethrough, faceName.GetData(), diff --git a/src/msw/font.cpp b/src/msw/font.cpp index 5f7f34c6c6..76a2cc3c35 100644 --- a/src/msw/font.cpp +++ b/src/msw/font.cpp @@ -635,9 +635,32 @@ bool wxNativeFontInfo::FromString(const wxString& s) // first the version wxString token = tokenizer.GetNextToken(); - if ( token != wxS('0') ) + if ( !token.ToLong(&l) ) return false; + switch ( l ) + { + case 0: + // Fractional point size is not present in this version. + pointSize = 0.0f; + break; + + case 1: + { + double d; + if ( !tokenizer.GetNextToken().ToCDouble(&d) ) + return false; + pointSize = static_cast(d); + if ( static_cast(pointSize) != d ) + return false; + } + break; + + default: + // Unknown version. + return false; + } + token = tokenizer.GetNextToken(); if ( !token.ToLong(&l) ) return false; @@ -716,8 +739,9 @@ wxString wxNativeFontInfo::ToString() const { wxString s; - s.Printf(wxS("%d;%ld;%ld;%ld;%ld;%ld;%d;%d;%d;%d;%d;%d;%d;%d;%s"), - 0, // version, in case we want to change the format later + s.Printf(wxS("%d;%f;%ld;%ld;%ld;%ld;%ld;%d;%d;%d;%d;%d;%d;%d;%d;%s"), + 1, // version + pointSize, lf.lfHeight, lf.lfWidth, lf.lfEscapement, diff --git a/src/osx/carbon/font.cpp b/src/osx/carbon/font.cpp index 7de7178551..8dc154e8a5 100644 --- a/src/osx/carbon/font.cpp +++ b/src/osx/carbon/font.cpp @@ -889,6 +889,7 @@ CGFloat wxNativeFontInfo::GetCTSlant(CTFontDescriptorRef descr) // bool wxNativeFontInfo::FromString(const wxString& s) { + double d; long l, version; Init(); @@ -904,9 +905,16 @@ bool wxNativeFontInfo::FromString(const wxString& s) // token = tokenizer.GetNextToken(); - if ( !token.ToLong(&l) ) + if ( !token.ToCDouble(&d) ) return false; - m_ctSize = (int)l; +#ifdef __LP64__ + // CGFloat is just double in this case. + m_ctSize = d; +#else // !__LP64__ + m_ctSize = static_cast(d); + if ( static_cast(m_ctSize) != d ) + return false; +#endif // __LP64__/!__LP64__ token = tokenizer.GetNextToken(); if ( !token.ToLong(&l) ) @@ -959,12 +967,12 @@ wxString wxNativeFontInfo::ToString() const { wxString s; - s.Printf(wxT("%d;%d;%d;%d;%d;%d;%d;%s;%d"), + s.Printf(wxT("%d;%f;%d;%d;%d;%d;%d;%s;%d"), 1, // version - GetPointSize(), + GetFractionalPointSize(), GetFamily(), (int)GetStyle(), - (int)GetWeight(), + GetNumericWeight(), GetUnderlined(), GetStrikethrough(), GetFaceName().GetData(),