From: Vadim Zeitlin Date: Sat, 25 Sep 2004 23:03:44 +0000 (+0000) Subject: added a way to create fonts with specified pixel size X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/544229d1069a20ca4c81fac6059aa4d92d8559ef added a way to create fonts with specified pixel size git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29356 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/changes.txt b/docs/changes.txt index f8e01251bf..532d802b88 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -240,6 +240,7 @@ All (GUI): - smoother time estimation updates in wxProgressDialog (Christian Sturmlechner) - the XRC contrib library was moved to the core - wx(Choice/List/Note)book controls send CHANG(ED/ING) events in SetSelection +- it is now possible to create a wxFont with given size in pixels (d2walter) Unix: diff --git a/docs/latex/wx/font.tex b/docs/latex/wx/font.tex index 7e17100438..8986f71f8e 100644 --- a/docs/latex/wx/font.tex +++ b/docs/latex/wx/font.tex @@ -19,6 +19,23 @@ You can retrieve the current system font settings with \helpref{wxSystemSettings \wxheading{Constants} +The possible values for the \arg{family} parameter of \helpref{wxFont +constructor}{wxfontconstr} are (the old names are for compatibility only): + +\begin{verbatim} +enum wxFontFamily +{ + wxFONTFAMILY_DEFAULT = wxDEFAULT, + wxFONTFAMILY_DECORATIVE = wxDECORATIVE, + wxFONTFAMILY_ROMAN = wxROMAN, + wxFONTFAMILY_SCRIPT = wxSCRIPT, + wxFONTFAMILY_SWISS = wxSWISS, + wxFONTFAMILY_MODERN = wxMODERN, + wxFONTFAMILY_TELETYPE = wxTELETYPE, + wxFONTFAMILY_MAX +}; +\end{verbatim} + The font flags which can be used during the font creation are: \begin{verbatim} @@ -128,23 +145,32 @@ wxSWISS\_FONT} \latexignore{\rtfignore{\wxheading{Members}}} + \membersection{wxFont::wxFont}\label{wxfontconstr} \func{}{wxFont}{\void} Default constructor. -\func{}{wxFont}{\param{int}{ pointSize}, \param{int}{ family}, \param{int}{ style}, \param{int}{ weight}, +\func{}{wxFont}{\param{int}{ pointSize}, \param{wxFontFamily}{ family}, \param{int}{ style}, \param{int}{ weight}, + \param{const bool}{ underline = false}, \param{const wxString\& }{faceName = ""}, + \param{wxFontEncoding }{encoding = wxFONTENCODING\_DEFAULT}} + +\func{}{wxFont}{\param{const wxSize\&}{ pixelSize}, \param{wxFontFamily}{ family}, \param{int}{ style}, \param{int}{ weight}, \param{const bool}{ underline = false}, \param{const wxString\& }{faceName = ""}, \param{wxFontEncoding }{encoding = wxFONTENCODING\_DEFAULT}} -Creates a font object (see \helpref{font encoding -overview}{wxfontencodingoverview} for the meaning of the last parameter). +Creates a font object with the specified attributes. \wxheading{Parameters} \docparam{pointSize}{Size in points.} +\docparam{pixelSize}{Size in pixels: this is directly supported only under MSW +currently where this constructor can be used directly, under other platforms a +font with the closest size to the given one is found using binary search and +the static \helpref{New}{wxfontnew} method must be used.} + \docparam{family}{Font family, a generic way of referring to fonts without specifying actual facename. One of: \twocolwidtha{5cm} @@ -179,7 +205,8 @@ default application encoding is the same as default system encoding.} \twocolitem{{\bf wxFONTENCODING\_KOI8}}{The standard Russian encoding for Internet.} \twocolitem{{\bf wxFONTENCODING\_CP1250...1252}}{Windows encodings similar to ISO8859 (but not identical).} \end{twocollist} -If the specified encoding isn't available, no font is created. +If the specified encoding isn't available, no font is created +(see also \helpref{font encoding overview}{wxfontencodingoverview}). } \wxheading{Remarks} @@ -190,6 +217,7 @@ Under Windows, only scalable TrueType fonts are used. See also \helpref{wxDC::SetFont}{wxdcsetfont}, \helpref{wxDC::DrawText}{wxdcdrawtext} and \helpref{wxDC::GetTextExtent}{wxdcgettextextent}. + \membersection{wxFont::\destruct{wxFont}} \func{}{\destruct{wxFont}}{\void} @@ -206,6 +234,7 @@ the application should try to clean up all fonts itself. This is because wxWidgets cannot know if a pointer to the font object is stored in an application data structure, and there is a risk of double deletion. + \membersection{wxFont::IsFixedWidth}\label{wxfontisfixedwidth} \constfunc{bool}{IsFixedWidth}{\void} @@ -213,6 +242,7 @@ application data structure, and there is a risk of double deletion. Returns {\tt true} if the font is a fixed width (or monospaced) font, {\tt false} if it is a proportional one or font is invalid. + \membersection{wxFont::GetDefaultEncoding}\label{wxfontgetdefaultencoding} \func{static wxFontEncoding}{GetDefaultEncoding}{\void} @@ -224,6 +254,7 @@ Returns the current application's default encoding. \helpref{Font encoding overview}{wxfontencodingoverview}, \helpref{SetDefaultEncoding}{wxfontsetdefaultencoding} + \membersection{wxFont::GetFaceName}\label{wxfontgetfacename} \constfunc{wxString}{GetFaceName}{\void} @@ -235,6 +266,7 @@ typeface information. \helpref{wxFont::SetFaceName}{wxfontsetfacename} + \membersection{wxFont::GetFamily}\label{wxfontgetfamily} \constfunc{int}{GetFamily}{\void} @@ -246,6 +278,7 @@ family identifiers. \helpref{wxFont::SetFamily}{wxfontsetfamily} + \membersection{wxFont::GetNativeFontInfoDesc}\label{wxfontgetnativefontinfodesc} \constfunc{wxString}{GetNativeFontInfoDesc}{\void} @@ -257,6 +290,7 @@ empty string if the font wasn't constructed using the native font description. \helpref{wxFont::SetNativeFontInfo}{wxfontsetnativefontinfo} + \membersection{wxFont::GetPointSize}\label{wxfontgetpointsize} \constfunc{int}{GetPointSize}{\void} @@ -267,6 +301,7 @@ Gets the point size. \helpref{wxFont::SetPointSize}{wxfontsetpointsize} + \membersection{wxFont::GetStyle}\label{wxfontgetstyle} \constfunc{int}{GetStyle}{\void} @@ -278,6 +313,7 @@ styles. \helpref{wxFont::SetStyle}{wxfontsetstyle} + \membersection{wxFont::GetUnderlined}\label{wxfontgetunderlined} \constfunc{bool}{GetUnderlined}{\void} @@ -288,6 +324,7 @@ Returns true if the font is underlined, false otherwise. \helpref{wxFont::SetUnderlined}{wxfontsetunderlined} + \membersection{wxFont::GetWeight}\label{wxfontgetweight} \constfunc{int}{GetWeight}{\void} @@ -299,12 +336,39 @@ weight identifiers. \helpref{wxFont::SetWeight}{wxfontsetweight} + +\membersection{wxFont::New}\label{wxfontnew} + +\func{static wxFont *}{New}{\param{int}{ pointSize}, \param{wxFontFamily}{ family}, \param{int}{ style}, \param{int}{ weight}, + \param{const bool}{ underline = false}, \param{const wxString\& }{faceName = ""}, + \param{wxFontEncoding }{encoding = wxFONTENCODING\_DEFAULT}} + +\func{static wxFont *}{New}{\param{int}{ pointSize}, \param{wxFontFamily}{ family}, + \param{int}{ flags = \texttt{wxFONTFLAG\_DEFAULT}}, \param{const wxString\& }{faceName = ""}, + \param{wxFontEncoding }{encoding = wxFONTENCODING\_DEFAULT}} + +\func{static wxFont *}{New}{\param{const wxSize\&}{ pixelSize}, \param{wxFontFamily}{ family}, \param{int}{ style}, \param{int}{ weight}, + \param{const bool}{ underline = false}, \param{const wxString\& }{faceName = ""}, + \param{wxFontEncoding }{encoding = wxFONTENCODING\_DEFAULT}} + +\func{static wxFont *}{New}{\param{const wxSize\&}{ pixelSize}, \param{wxFontFamily}{ family}, + \param{int}{ flags = \texttt{wxFONTFLAG\_DEFAULT}}, \param{const wxString\& }{faceName = ""}, + \param{wxFontEncoding }{encoding = wxFONTENCODING\_DEFAULT}} + +These functions take the same parameters as \helpref{wxFont +constructor}{wxfontconstr} and return a new font object allocated on the heap. + +Using \texttt{New()} is currently the only way to directly create a font with +the given size in pixels on platforms other than wxMSW. + + \membersection{wxFont::Ok}\label{wxfontok} \constfunc{bool}{Ok}{\void} Returns {\tt true} if this object is a valid font, {\tt false} otherwise. + \membersection{wxFont::SetDefaultEncoding}\label{wxfontsetdefaultencoding} \func{static void}{SetDefaultEncoding}{\param{wxFontEncoding }{encoding}} @@ -316,6 +380,7 @@ Sets the default font encoding. \helpref{Font encoding overview}{wxfontencodingoverview}, \helpref{GetDefaultEncoding}{wxfontgetdefaultencoding} + \membersection{wxFont::SetFaceName}\label{wxfontsetfacename} \func{void}{SetFaceName}{\param{const wxString\& }{faceName}} @@ -337,6 +402,7 @@ and then for a font belonging to the same family. \helpref{wxFont::GetFaceName}{wxfontgetfacename}, \helpref{wxFont::SetFamily}{wxfontsetfamily} + \membersection{wxFont::SetFamily}\label{wxfontsetfamily} \func{void}{SetFamily}{\param{int}{ family}} @@ -361,6 +427,7 @@ Sets the font family. \helpref{wxFont::GetFamily}{wxfontgetfamily}, \helpref{wxFont::SetFaceName}{wxfontsetfacename} + \membersection{wxFont::SetNativeFontInfo}\label{wxfontsetnativefontinfo} \func{void}{SetNativeFontInfo}{\param{const wxString\& }{info}} @@ -370,6 +437,7 @@ which must have been previously returned by \helpref{GetNativeFontInfoDesc}{wxfontgetnativefontinfodesc}. If the string is invalid, font is unchanged. + \membersection{wxFont::SetPointSize}\label{wxfontsetpointsize} \func{void}{SetPointSize}{\param{int}{ pointSize}} @@ -384,6 +452,7 @@ Sets the point size. \helpref{wxFont::GetPointSize}{wxfontgetpointsize} + \membersection{wxFont::SetStyle}\label{wxfontsetstyle} \func{void}{SetStyle}{\param{int}{ style}} @@ -398,6 +467,7 @@ Sets the font style. \helpref{wxFont::GetStyle}{wxfontgetstyle} + \membersection{wxFont::SetUnderlined}\label{wxfontsetunderlined} \func{void}{SetUnderlined}{\param{const bool}{ underlined}} @@ -412,6 +482,7 @@ Sets underlining. \helpref{wxFont::GetUnderlined}{wxfontgetunderlined} + \membersection{wxFont::SetWeight}\label{wxfontsetweight} \func{void}{SetWeight}{\param{int}{ weight}} @@ -426,6 +497,7 @@ Sets the font weight. \helpref{wxFont::GetWeight}{wxfontgetweight} + \membersection{wxFont::operator $=$}\label{wxfontassignment} \func{wxFont\&}{operator $=$}{\param{const wxFont\& }{font}} @@ -433,6 +505,7 @@ Sets the font weight. Assignment operator, using reference counting. Returns a reference to `this'. + \membersection{wxFont::operator $==$}\label{wxfontequals} \func{bool}{operator $==$}{\param{const wxFont\& }{font}} @@ -442,6 +515,7 @@ to the same underlying font data. It does not compare each attribute, so two independently-created fonts using the same parameters will fail the test. + \membersection{wxFont::operator $!=$}\label{wxfontnotequals} \func{bool}{operator $!=$}{\param{const wxFont\& }{font}} diff --git a/include/wx/font.h b/include/wx/font.h index 7bbda314ab..dd1665ab0a 100644 --- a/include/wx/font.h +++ b/include/wx/font.h @@ -135,6 +135,24 @@ public: const wxString& face = wxEmptyString, wxFontEncoding encoding = wxFONTENCODING_DEFAULT); + // from the font components + static wxFont *New( + const wxSize& pixelSize, // size of the font in pixels + int family, // see wxFontFamily enum + int style, // see wxFontStyle enum + int weight, // see wxFontWeight enum + bool underlined = FALSE, // not underlined by default + const wxString& face = wxEmptyString, // facename + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); // ISO8859-X, ... + + // from the font components but using the font flags instead of separate + // parameters for each flag + static wxFont *New(const wxSize& pixelSize, + wxFontFamily family, + int flags = wxFONTFLAG_DEFAULT, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); + // from the (opaque) native font description object static wxFont *New(const wxNativeFontInfo& nativeFontDesc); @@ -150,6 +168,8 @@ public: // accessors: get the font characteristics virtual int GetPointSize() const = 0; + virtual wxSize GetPixelSize() const; + virtual bool IsUsingSizeInPixels() const; virtual int GetFamily() const = 0; virtual int GetStyle() const = 0; virtual int GetWeight() const = 0; @@ -165,6 +185,7 @@ public: // change the font characteristics virtual void SetPointSize( int pointSize ) = 0; + virtual void SetPixelSize( const wxSize& pixelSize ); virtual void SetFamily( int family ) = 0; virtual void SetStyle( int style ) = 0; virtual void SetWeight( int weight ) = 0; diff --git a/include/wx/fontutil.h b/include/wx/fontutil.h index 882333fa95..1a1b917ba1 100644 --- a/include/wx/fontutil.h +++ b/include/wx/fontutil.h @@ -162,7 +162,14 @@ public: SetStyle((wxFontStyle)font.GetStyle()); SetWeight((wxFontWeight)font.GetWeight()); SetUnderlined(font.GetUnderlined()); +#if defined(__WXMSW__) + if ( font.IsUsingSizeInPixels() ) + SetPixelSize(font.GetPixelSize()); + else + SetPointSize(font.GetPointSize()); +#else SetPointSize(font.GetPointSize()); +#endif // set the family/facename SetFamily((wxFontFamily)font.GetFamily()); @@ -179,6 +186,7 @@ public: // accessors and modifiers for the font elements int GetPointSize() const; + wxSize GetPixelSize() const; wxFontStyle GetStyle() const; wxFontWeight GetWeight() const; bool GetUnderlined() const; @@ -187,6 +195,7 @@ public: wxFontEncoding GetEncoding() const; void SetPointSize(int pointsize); + void SetPixelSize(const wxSize& pixelSize); void SetStyle(wxFontStyle style); void SetWeight(wxFontWeight weight); void SetUnderlined(bool underlined); diff --git a/include/wx/msw/font.h b/include/wx/msw/font.h index 22708e45ae..01e7a41c76 100644 --- a/include/wx/msw/font.h +++ b/include/wx/msw/font.h @@ -37,7 +37,22 @@ public: { Init(); - (void)Create(size, family, style, weight, underlined, face, encoding); + (void)Create(size, wxSize(0, 0), FALSE, family, style, weight, + underlined, face, encoding); + } + + wxFont(const wxSize& pixelSize, + int family, + int style, + int weight, + bool underlined = false, + const wxString& face = wxEmptyString, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT) + { + Init(); + + (void)Create(0, pixelSize, TRUE, family, style, weight, underlined, + face, encoding); } wxFont(const wxNativeFontInfo& info, WXHFONT hFont = 0) @@ -50,6 +65,8 @@ public: wxFont(const wxString& fontDesc); bool Create(int size, + const wxSize& pixelSize, + bool sizeUsingPixels, int family, int style, int weight, @@ -66,6 +83,8 @@ public: // implement base class pure virtuals virtual int GetPointSize() const; + virtual wxSize GetPixelSize() const; + virtual bool IsUsingSizeInPixels() const; virtual int GetFamily() const; virtual int GetStyle() const; virtual int GetWeight() const; @@ -75,6 +94,7 @@ public: virtual const wxNativeFontInfo *GetNativeFontInfo() const; virtual void SetPointSize(int pointSize); + virtual void SetPixelSize(const wxSize& pixelSize); virtual void SetFamily(int family); virtual void SetStyle(int style); virtual void SetWeight(int weight); diff --git a/src/common/fontcmn.cpp b/src/common/fontcmn.cpp index 7a5e05ca0c..cb10a1772d 100644 --- a/src/common/fontcmn.cpp +++ b/src/common/fontcmn.cpp @@ -49,6 +49,61 @@ // implementation // ============================================================================ +// ---------------------------------------------------------------------------- +// helper functions +// ---------------------------------------------------------------------------- + +static void AdjustFontSize(wxFont font, wxDC& dc, const wxSize& pixelSize) +{ + int currentSize = font.GetPointSize(); + int largestGood; + int smallestBad; + + bool initialGoodFound = false; + bool initialBadFound = false; + + while (currentSize > 0) + { + dc.SetFont(font); + + // if currentSize (in points) results in a font that is smaller + // than required by pixelSize it is considered a good size + if (dc.GetCharHeight() <= pixelSize.GetHeight() && + (!pixelSize.GetWidth() || + dc.GetCharWidth() <= pixelSize.GetWidth())) + { + largestGood = currentSize; + initialGoodFound = true; + } + else + { + smallestBad = currentSize; + initialBadFound = true; + } + if (!initialGoodFound) + { + currentSize /= 2; + } + else if (!initialBadFound) + { + currentSize *= 2; + } + else + { + int distance = smallestBad - largestGood; + if (distance == 1) + break; + + currentSize = largestGood + distance / 2; + } + + font.SetPointSize(currentSize); + } + + if (currentSize != largestGood) + font.SetPointSize(largestGood); +} + // ---------------------------------------------------------------------------- // wxFontBase // ---------------------------------------------------------------------------- @@ -83,31 +138,87 @@ wxFont *wxFontBase::New(int size, return new wxFont(size, family, style, weight, underlined, face, encoding); } -/* static */ -wxFont *wxFontBase::New(int pointSize, - wxFontFamily family, - int flags, - const wxString& face, - wxFontEncoding encoding) +static inline int flags2Style(int flags) { - return New - ( - pointSize, - family, - flags & wxFONTFLAG_ITALIC + return flags & wxFONTFLAG_ITALIC ? wxFONTSTYLE_ITALIC : flags & wxFONTFLAG_SLANT ? wxFONTSTYLE_SLANT - : wxFONTSTYLE_NORMAL, - flags & wxFONTFLAG_LIGHT + : wxFONTSTYLE_NORMAL; +} + +static inline int flags2Weight(int flags) +{ + return flags & wxFONTFLAG_LIGHT ? wxFONTWEIGHT_LIGHT : flags & wxFONTFLAG_BOLD ? wxFONTWEIGHT_BOLD - : wxFONTWEIGHT_NORMAL, - (flags & wxFONTFLAG_UNDERLINED) != 0, - face, - encoding - ); + : wxFONTWEIGHT_NORMAL; +} + +static inline bool flags2Underlined(int flags) +{ + return (flags & wxFONTFLAG_UNDERLINED) != 0; +} + +/* static */ +wxFont *wxFontBase::New(int pointSize, + wxFontFamily family, + int flags, + const wxString& face, + wxFontEncoding encoding) +{ + return New(pointSize, family, flags2Style(flags), flags2Weight(flags), + flags2Underlined(flags), face, encoding); +} + +/* static */ +wxFont *wxFontBase::New(const wxSize& pixelSize, + int family, + int style, + int weight, + bool underlined, + const wxString& face, + wxFontEncoding encoding) +{ +#if defined(__WXMSW__) + return new wxFont(pixelSize, family, style, weight, underlined, + face, encoding); +#else + wxFont * ret = New(10, family, style, weight, underlined, face, encoding); + wxScreenDC dc; + ret->AdjustFontSize(*(wxFont *)this, dc, pixelSize); + return ret; +#endif +} + +/* static */ +wxFont *wxFontBase::New(const wxSize& pixelSize, + wxFontFamily family, + int flags, + const wxString& face, + wxFontEncoding encoding) +{ + return New(pixelSize, family, flags2Style(flags), flags2Weight(flags), + flags2Underlined(flags), face, encoding); +} + +wxSize wxFontBase::GetPixelSize() const +{ + wxScreenDC dc; + dc.SetFont(*(wxFont *)this); + return wxSize(dc.GetCharWidth(), dc.GetCharHeight()); +} + +bool wxFontBase::IsUsingSizeInPixels() const +{ + return false; +} + +void wxFontBase::SetPixelSize( const wxSize& pixelSize ) +{ + wxScreenDC dc; + AdjustFontSize(*(wxFont *)this, dc, pixelSize); } /* static */ diff --git a/src/msw/font.cpp b/src/msw/font.cpp index ba360fa3d4..28ff194ba0 100644 --- a/src/msw/font.cpp +++ b/src/msw/font.cpp @@ -108,11 +108,14 @@ public: // constructors wxFontRefData() { - Init(-1, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, - false, wxEmptyString, wxFONTENCODING_DEFAULT); + Init(-1, wxSize(0, 0), FALSE, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, + wxFONTWEIGHT_NORMAL, FALSE, wxEmptyString, + wxFONTENCODING_DEFAULT); } wxFontRefData(int size, + const wxSize& pixelSize, + bool sizeUsingPixels, int family, int style, int weight, @@ -120,7 +123,8 @@ public: const wxString& faceName, wxFontEncoding encoding) { - Init(size, family, style, weight, underlined, faceName, encoding); + Init(size, pixelSize, sizeUsingPixels, family, style, weight, + underlined, faceName, encoding); } wxFontRefData(const wxNativeFontInfo& info, WXHFONT hFont = 0) @@ -136,7 +140,8 @@ public: } else { - Init(data.m_pointSize, data.m_family, data.m_style, data.m_weight, + Init(data.m_pointSize, data.m_pixelSize, data.m_sizeUsingPixels, + data.m_family, data.m_style, data.m_weight, data.m_underlined, data.m_faceName, data.m_encoding); } } @@ -155,6 +160,17 @@ public: : m_pointSize; } + wxSize GetPixelSize() const + { + return m_nativeFontInfoOk ? m_nativeFontInfo.GetPixelSize() + : m_pixelSize; + } + + bool IsUsingSizeInPixels() const + { + return m_nativeFontInfoOk ? TRUE : m_sizeUsingPixels; + } + int GetFamily() const { return m_family; @@ -201,9 +217,27 @@ public: void SetPointSize(int pointSize) { if ( m_nativeFontInfoOk ) + { m_nativeFontInfo.SetPointSize(pointSize); + } else + { m_pointSize = pointSize; + m_sizeUsingPixels = FALSE; + } + } + + void SetPixelSize(const wxSize& pixelSize) + { + if ( m_nativeFontInfoOk ) + { + m_nativeFontInfo.SetPixelSize(pixelSize); + } + else + { + m_pixelSize = pixelSize; + m_sizeUsingPixels = TRUE; + } } void SetFamily(int family) @@ -260,6 +294,8 @@ public: protected: // common part of all ctors void Init(int size, + const wxSize& pixelSize, + bool sizeUsingPixels, int family, int style, int weight, @@ -271,6 +307,8 @@ protected: // font characterstics int m_pointSize; + wxSize m_pixelSize; + bool m_sizeUsingPixels; int m_family; int m_style; int m_weight; @@ -295,6 +333,8 @@ protected: // ---------------------------------------------------------------------------- void wxFontRefData::Init(int pointSize, + const wxSize& pixelSize, + bool sizeUsingPixels, int family, int style, int weight, @@ -304,6 +344,8 @@ void wxFontRefData::Init(int pointSize, { m_style = style; m_pointSize = pointSize == -1 ? wxNORMAL_FONT->GetPointSize() : pointSize; + m_pixelSize = pixelSize; + m_sizeUsingPixels = sizeUsingPixels; m_family = family; m_style = style; m_weight = weight; @@ -388,6 +430,14 @@ int wxNativeFontInfo::GetPointSize() const return (int) (((72.0*(double)abs(lf.lfHeight)) / (double) ppInch) + 0.5); } +wxSize wxNativeFontInfo::GetPixelSize() const +{ + wxSize ret; + ret.SetHeight(lf.lfHeight); + ret.SetWidth(lf.lfWidth); + return ret; +} + wxFontStyle wxNativeFontInfo::GetStyle() const { return lf.lfItalic ? wxFONTSTYLE_ITALIC : wxFONTSTYLE_NORMAL; @@ -468,6 +518,13 @@ void wxNativeFontInfo::SetPointSize(int pointsize) #endif // wxFONT_SIZE_COMPATIBILITY/!wxFONT_SIZE_COMPATIBILITY } +void wxNativeFontInfo::SetPixelSize(const wxSize& pixelSize) +{ + lf.lfHeight = pixelSize.GetHeight(); + lf.lfWidth = pixelSize.GetWidth(); +} + + void wxNativeFontInfo::SetStyle(wxFontStyle style) { switch ( style ) @@ -731,6 +788,8 @@ wxFont::wxFont(const wxString& fontdesc) * in wxDC::SetFont, when information is available about scaling etc. */ bool wxFont::Create(int pointSize, + const wxSize& pixelSize, + bool sizeUsingPixels, int family, int style, int weight, @@ -747,7 +806,8 @@ bool wxFont::Create(int pointSize, pointSize = wxNORMAL_FONT->GetPointSize(); } - m_refData = new wxFontRefData(pointSize, family, style, weight, + m_refData = new wxFontRefData(pointSize, pixelSize, sizeUsingPixels, + family, style, weight, underlined, faceName, encoding); RealizeResource(); @@ -830,6 +890,15 @@ void wxFont::SetPointSize(int pointSize) RealizeResource(); } +void wxFont::SetPixelSize(const wxSize& pixelSize) +{ + Unshare(); + + M_FONTDATA->SetPixelSize(pixelSize); + + RealizeResource(); +} + void wxFont::SetFamily(int family) { Unshare(); @@ -906,6 +975,18 @@ int wxFont::GetPointSize() const return M_FONTDATA->GetPointSize(); } +wxSize wxFont::GetPixelSize() const +{ + return M_FONTDATA->GetPixelSize(); +} + +bool wxFont::IsUsingSizeInPixels() const +{ + wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); + + return M_FONTDATA->IsUsingSizeInPixels(); +} + int wxFont::GetFamily() const { wxCHECK_MSG( Ok(), 0, wxT("invalid font") );