X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/64932e4105654e784d0276671f5ac28f9bdb4ee9..60d66be369d360e1528e4dd4bb65a909a8c6ac9a:/src/common/fontcmn.cpp diff --git a/src/common/fontcmn.cpp b/src/common/fontcmn.cpp index a59e671c5b..52936bfbe1 100644 --- a/src/common/fontcmn.cpp +++ b/src/common/fontcmn.cpp @@ -29,6 +29,7 @@ #ifndef WX_PRECOMP #include "wx/dc.h" #include "wx/intl.h" + #include "wx/math.h" #include "wx/dcscreen.h" #include "wx/log.h" #include "wx/gdicmn.h" @@ -71,36 +72,63 @@ extern const char *wxDumpFont(const wxFont *font) return buf; } -// ============================================================================ -// implementation -// ============================================================================ - // ---------------------------------------------------------------------------- -// helper functions +// XTI // ---------------------------------------------------------------------------- -static inline int flags2Style(int flags) -{ - return flags & wxFONTFLAG_ITALIC - ? wxFONTSTYLE_ITALIC - : flags & wxFONTFLAG_SLANT - ? wxFONTSTYLE_SLANT - : wxFONTSTYLE_NORMAL; -} +wxBEGIN_ENUM( wxFontFamily ) +wxENUM_MEMBER( wxFONTFAMILY_DEFAULT ) +wxENUM_MEMBER( wxFONTFAMILY_DECORATIVE ) +wxENUM_MEMBER( wxFONTFAMILY_ROMAN ) +wxENUM_MEMBER( wxFONTFAMILY_SCRIPT ) +wxENUM_MEMBER( wxFONTFAMILY_SWISS ) +wxENUM_MEMBER( wxFONTFAMILY_MODERN ) +wxENUM_MEMBER( wxFONTFAMILY_TELETYPE ) +wxEND_ENUM( wxFontFamily ) + +wxBEGIN_ENUM( wxFontStyle ) +wxENUM_MEMBER( wxFONTSTYLE_NORMAL ) +wxENUM_MEMBER( wxFONTSTYLE_ITALIC ) +wxENUM_MEMBER( wxFONTSTYLE_SLANT ) +wxEND_ENUM( wxFontStyle ) + +wxBEGIN_ENUM( wxFontWeight ) +wxENUM_MEMBER( wxFONTWEIGHT_NORMAL ) +wxENUM_MEMBER( wxFONTWEIGHT_LIGHT ) +wxENUM_MEMBER( wxFONTWEIGHT_BOLD ) +wxEND_ENUM( wxFontWeight ) + +wxIMPLEMENT_DYNAMIC_CLASS_WITH_COPY_XTI(wxFont, wxGDIObject, "wx/font.h") + +//WX_IMPLEMENT_ANY_VALUE_TYPE(wxAnyValueTypeImpl) + +wxBEGIN_PROPERTIES_TABLE(wxFont) +wxPROPERTY( Size,int, SetPointSize, GetPointSize, 12, 0 /*flags*/, \ + wxT("Helpstring"), wxT("group")) +wxPROPERTY( Family, wxFontFamily , SetFamily, GetFamily, (wxFontFamily)wxDEFAULT, \ + 0 /*flags*/, wxT("Helpstring"), wxT("group")) // wxFontFamily +wxPROPERTY( Style, wxFontStyle, SetStyle, GetStyle, (wxFontStyle)wxNORMAL, 0 /*flags*/, \ + wxT("Helpstring"), wxT("group")) // wxFontStyle +wxPROPERTY( Weight, wxFontWeight, SetWeight, GetWeight, (wxFontWeight)wxNORMAL, 0 /*flags*/, \ + wxT("Helpstring"), wxT("group")) // wxFontWeight +wxPROPERTY( Underlined, bool, SetUnderlined, GetUnderlined, false, 0 /*flags*/, \ + wxT("Helpstring"), wxT("group")) +wxPROPERTY( Strikethrough, bool, SetStrikethrough, GetStrikethrough, false, 0, \ + wxT("Helpstring"), wxT("group")) +wxPROPERTY( Face, wxString, SetFaceName, GetFaceName, wxEMPTY_PARAMETER_VALUE, \ + 0 /*flags*/, wxT("Helpstring"), wxT("group")) +wxPROPERTY( Encoding, wxFontEncoding, SetEncoding, GetEncoding, \ + wxFONTENCODING_DEFAULT, 0 /*flags*/, wxT("Helpstring"), wxT("group")) +wxEND_PROPERTIES_TABLE() + +wxCONSTRUCTOR_6( wxFont, int, Size, wxFontFamily, Family, wxFontStyle, Style, wxFontWeight, Weight, \ + bool, Underlined, wxString, Face ) + +wxEMPTY_HANDLERS_TABLE(wxFont) -static inline int flags2Weight(int flags) -{ - return flags & wxFONTFLAG_LIGHT - ? wxFONTWEIGHT_LIGHT - : flags & wxFONTFLAG_BOLD - ? wxFONTWEIGHT_BOLD - : wxFONTWEIGHT_NORMAL; -} - -static inline bool flags2Underlined(int flags) -{ - return (flags & wxFONTFLAG_UNDERLINED) != 0; -} +// ============================================================================ +// implementation +// ============================================================================ // ---------------------------------------------------------------------------- // wxFontBase @@ -156,8 +184,11 @@ wxFont *wxFontBase::New(int pointSize, const wxString& face, wxFontEncoding encoding) { - return New(pointSize, family, flags2Style(flags), flags2Weight(flags), - flags2Underlined(flags), face, encoding); + return New(pointSize, family, + GetStyleFromFlags(flags), + GetWeightFromFlags(flags), + GetUnderlinedFromFlags(flags), + face, encoding); } /* static */ @@ -167,8 +198,11 @@ wxFont *wxFontBase::New(const wxSize& pixelSize, const wxString& face, wxFontEncoding encoding) { - return New(pixelSize, family, flags2Style(flags), flags2Weight(flags), - flags2Underlined(flags), face, encoding); + return New(pixelSize, family, + GetStyleFromFlags(flags), + GetWeightFromFlags(flags), + GetUnderlinedFromFlags(flags), + face, encoding); } /* static */ @@ -275,6 +309,7 @@ void wxFontBase::DoSetNativeFontInfo(const wxNativeFontInfo& info) SetStyle(info.style); SetWeight(info.weight); SetUnderlined(info.underlined); + SetStrikethrough(info.strikethrough); SetFaceName(info.faceName); SetEncoding(info.encoding); #else @@ -362,11 +397,26 @@ bool wxFontBase::operator==(const wxFont& font) const GetStyle() == font.GetStyle() && GetWeight() == font.GetWeight() && GetUnderlined() == font.GetUnderlined() && + GetStrikethrough() == font.GetStrikethrough() && GetFaceName().IsSameAs(font.GetFaceName(), false) && GetEncoding() == font.GetEncoding() ); } +wxFontFamily wxFontBase::GetFamily() const +{ + wxCHECK_MSG( IsOk(), wxFONTFAMILY_UNKNOWN, wxS("invalid font") ); + + // Don't return wxFONTFAMILY_UNKNOWN from here because it prevents the code + // like wxFont(size, wxNORMAL_FONT->GetFamily(), ...) from working (see + // #12330). This is really just a hack but it allows to keep compatibility + // and doesn't really have any bad drawbacks so do this until someone comes + // up with a better idea. + const wxFontFamily family = DoGetFamily(); + + return family == wxFONTFAMILY_UNKNOWN ? wxFONTFAMILY_DEFAULT : family; +} + wxString wxFontBase::GetFamilyString() const { wxCHECK_MSG( IsOk(), "wxFONTFAMILY_DEFAULT", "invalid font" ); @@ -425,6 +475,29 @@ bool wxFontBase::SetFaceName(const wxString& facename) return true; } +void wxFontBase::SetSymbolicSize(wxFontSymbolicSize size) +{ + SetSymbolicSizeRelativeTo(size, wxNORMAL_FONT->GetPointSize()); +} + +/* static */ +int wxFontBase::AdjustToSymbolicSize(wxFontSymbolicSize size, int base) +{ + // Using a fixed factor (1.2, from CSS2) is a bad idea as explained at + // http://www.w3.org/TR/CSS21/fonts.html#font-size-props so use the values + // from http://style.cleverchimp.com/font_size_intervals/altintervals.html + // instead. + static const float factors[] = { 0.60f, 0.75f, 0.89f, 1.f, 1.2f, 1.5f, 2.f }; + + wxCOMPILE_TIME_ASSERT + ( + WXSIZEOF(factors) == wxFONTSIZE_XX_LARGE - wxFONTSIZE_XX_SMALL + 1, + WrongFontSizeFactorsSize + ); + + return wxRound(factors[size - wxFONTSIZE_XX_SMALL]*base); +} + wxFont& wxFont::MakeBold() { SetWeight(wxFONTWEIGHT_BOLD); @@ -447,10 +520,36 @@ wxFont& wxFont::MakeItalic() wxFont wxFont::Italic() const { wxFont font(*this); - font.SetStyle(wxFONTSTYLE_ITALIC); + font.MakeItalic(); + return font; +} + +wxFont& wxFont::MakeUnderlined() +{ + SetUnderlined(true); + return *this; +} + +wxFont wxFont::Underlined() const +{ + wxFont font(*this); + font.MakeUnderlined(); return font; } +wxFont wxFont::Strikethrough() const +{ + wxFont font(*this); + font.MakeStrikethrough(); + return font; +} + +wxFont& wxFont::MakeStrikethrough() +{ + SetStrikethrough(true); + return *this; +} + wxFont& wxFont::Scale(float x) { SetPointSize(int(x*GetPointSize() + 0.5)); @@ -495,19 +594,22 @@ void wxNativeFontInfo::SetFaceName(const wxArrayString& facenames) // These are the generic forms of FromString()/ToString. // -// convert to/from the string representation: format is -// version;pointsize;family;style;weight;underlined;facename;encoding +// convert to/from the string representation: the general format is +// "version;the rest..." with currently defined versions being: +// +// 0;pointsize;family;style;weight;underlined;facename;encoding +// 1;pointsize;family;style;weight;underlined;strikethrough;facename;encoding bool wxNativeFontInfo::FromString(const wxString& s) { long l; + unsigned long version; wxStringTokenizer tokenizer(s, wxT(";")); wxString token = tokenizer.GetNextToken(); - // - // Ignore the version for now - // + if ( !token.ToULong(&version) || version > 1 ) + return false; token = tokenizer.GetNextToken(); if ( !token.ToLong(&l) ) @@ -534,6 +636,14 @@ bool wxNativeFontInfo::FromString(const wxString& s) return false; underlined = l != 0; + if ( version == 1 ) + { + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return false; + strikethrough = l != 0; + } + faceName = tokenizer.GetNextToken(); #ifndef __WXMAC__ @@ -553,13 +663,14 @@ wxString wxNativeFontInfo::ToString() const { wxString s; - s.Printf(wxT("%d;%d;%d;%d;%d;%d;%s;%d"), - 0, // version + s.Printf(wxT("%d;%d;%d;%d;%d;%d;%d;%s;%d"), + 1, // version pointSize, family, (int)style, (int)weight, underlined, + strikethrough, faceName.GetData(), (int)encoding); @@ -573,6 +684,7 @@ void wxNativeFontInfo::Init() style = wxFONTSTYLE_NORMAL; weight = wxFONTWEIGHT_NORMAL; underlined = false; + strikethrough = false; faceName.clear(); encoding = wxFONTENCODING_DEFAULT; } @@ -597,6 +709,11 @@ bool wxNativeFontInfo::GetUnderlined() const return underlined; } +bool wxNativeFontInfo::GetStrikethrough() const +{ + return strikethrough; +} + wxString wxNativeFontInfo::GetFaceName() const { return faceName; @@ -632,6 +749,11 @@ void wxNativeFontInfo::SetUnderlined(bool underlined_) underlined = underlined_; } +void wxNativeFontInfo::SetStrikethrough(bool strikethrough_) +{ + strikethrough = strikethrough_; +} + bool wxNativeFontInfo::SetFaceName(const wxString& facename_) { faceName = facename_; @@ -668,6 +790,11 @@ wxString wxNativeFontInfo::ToUserString() const desc << _("underlined"); } + if ( GetStrikethrough() ) + { + desc << _("strikethrough"); + } + switch ( GetWeight() ) { default: @@ -840,6 +967,10 @@ bool wxNativeFontInfo::FromUserString(const wxString& s) { SetUnderlined(true); } + else if ( token == wxT("strikethrough") || token == _("strikethrough") ) + { + SetStrikethrough(true); + } else if ( token == wxT("light") || token == _("light") ) { SetWeight(wxFONTWEIGHT_LIGHT); @@ -918,7 +1049,7 @@ bool wxNativeFontInfo::FromUserString(const wxString& s) SetFamily(family); } // NB: the check on the facename is implemented in wxFontBase::SetFaceName - // and not in wxNativeFontInfo::SetFaceName thus we need to explicitely + // and not in wxNativeFontInfo::SetFaceName thus we need to explicitly // call here wxFontEnumerator::IsValidFacename else if ( #if wxUSE_FONTENUM @@ -937,7 +1068,7 @@ bool wxNativeFontInfo::FromUserString(const wxString& s) if ( !face.empty() ) { // NB: the check on the facename is implemented in wxFontBase::SetFaceName - // and not in wxNativeFontInfo::SetFaceName thus we need to explicitely + // and not in wxNativeFontInfo::SetFaceName thus we need to explicitly // call here wxFontEnumerator::IsValidFacename if ( #if wxUSE_FONTENUM