From 19da7aaa9bf7aa54850bf087f5a670fc04e80183 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 27 Feb 2011 12:47:05 +0000 Subject: [PATCH] Add wxFont::SetSymbolicSize() and SetSymbolicSizeRelativeTo(). These methods allow to set the font size using CSS-like absolute size specifications. Notice that the factors used here are incompatible with (but better than) the ones used in wxBuildFontSizes() in src/html/winpars.cpp. In the future it would be nice to reuse the new wxFont functions in wxHTML code. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67052 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + include/wx/font.h | 25 ++++++++++++++++++++++++ interface/wx/font.h | 43 ++++++++++++++++++++++++++++++++++++++++++ src/common/fontcmn.cpp | 23 ++++++++++++++++++++++ 4 files changed, 92 insertions(+) diff --git a/docs/changes.txt b/docs/changes.txt index dd27fe19ee..7cc55df247 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -468,6 +468,7 @@ All (GUI): - Added support for saving as GIF and animated GIF (troelsk). - Fix wxWrapSizer minimal size calculation (Catalin Raceanu). - Added wxFont::Underlined() and MakeUnderlined() methods. +- Added wxFont::SetSymbolicSize() and related methods. GTK: diff --git a/include/wx/font.h b/include/wx/font.h index 3109409104..43968049b3 100644 --- a/include/wx/font.h +++ b/include/wx/font.h @@ -66,6 +66,18 @@ enum wxFontWeight wxFONTWEIGHT_MAX }; +// Symbolic font sizes as defined in CSS specification. +enum wxFontSymbolicSize +{ + wxFONTSIZE_XX_SMALL = -3, + wxFONTSIZE_X_SMALL, + wxFONTSIZE_SMALL, + wxFONTSIZE_MEDIUM, + wxFONTSIZE_LARGE, + wxFONTSIZE_X_LARGE, + wxFONTSIZE_XX_LARGE +}; + // the font flag bits for the new font ctor accepting one combined flags word enum wxFontFlag { @@ -240,6 +252,19 @@ public: bool SetNativeFontInfo(const wxString& info); bool SetNativeFontInfoUserDesc(const wxString& info); + // Symbolic font sizes support: set the font size to "large" or "very + // small" either absolutely (i.e. compared to the default font size) or + // relatively to the given font size. + void SetSymbolicSize(wxFontSymbolicSize size); + void SetSymbolicSizeRelativeTo(wxFontSymbolicSize size, int base) + { + SetPointSize(AdjustToSymbolicSize(size, base)); + } + + // Adjust the base size in points according to symbolic size. + static int AdjustToSymbolicSize(wxFontSymbolicSize size, int base); + + // translate the fonts into human-readable string (i.e. GetStyleString() // will return "wxITALIC" for an italic font, ...) wxString GetFamilyString() const; diff --git a/interface/wx/font.h b/interface/wx/font.h index 47afe9019a..3d4d3b1fdc 100644 --- a/interface/wx/font.h +++ b/interface/wx/font.h @@ -70,6 +70,27 @@ enum wxFontWeight wxFONTWEIGHT_MAX }; +/** + Symbolic font sizes. + + The elements of this enum correspond to CSS absolute size specifications, + see http://www.w3.org/TR/CSS21/fonts.html#font-size-props + + @see wxFont::SetSymbolicSize() + + @since 2.9.2 + */ +enum wxFontSymbolicSize +{ + wxFONTSIZE_XX_SMALL = -3, //!< Extra small. + wxFONTSIZE_X_SMALL, //!< Very small. + wxFONTSIZE_SMALL, //!< Small. + wxFONTSIZE_MEDIUM, //!< Normal. + wxFONTSIZE_LARGE, //!< Large. + wxFONTSIZE_X_LARGE, //!< Very large. + wxFONTSIZE_XX_LARGE //!< Extra large. +}; + /** The font flag bits for the new font ctor accepting one combined flags word. */ @@ -791,6 +812,28 @@ public: */ virtual void SetStyle(wxFontStyle style); + /** + Sets the font size using a predefined symbolic size name. + + This function allows to change font size to be (very) large or small + compared to the standard font size. + + @see SetSymbolicSizeRelativeTo(). + + @since 2.9.2 + */ + void SetSymbolicSize(wxFontSymbolicSize size); + + /** + Sets the font size compared to the base font size. + + This is the same as SetSymbolicSize() except that it uses the given + font size as the normal font size instead of the standard font size. + + @since 2.9.2 + */ + void SetSymbolicSizeRelativeTo(wxFontSymbolicSize size, int base); + /** Sets underlining. diff --git a/src/common/fontcmn.cpp b/src/common/fontcmn.cpp index 2125ea97e9..036066d29f 100644 --- a/src/common/fontcmn.cpp +++ b/src/common/fontcmn.cpp @@ -491,6 +491,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 factors[size - wxFONTSIZE_XX_SMALL]*base; +} + wxFont& wxFont::MakeBold() { SetWeight(wxFONTWEIGHT_BOLD); -- 2.45.2