Refactor handling point size in wxNativeFontInfo
No real changes yet, this commit just prepares for adding support for per-monitor DPI by reorganizing some code.
This commit is contained in:
@@ -118,7 +118,11 @@ public:
|
|||||||
// set the XFLD
|
// set the XFLD
|
||||||
void SetXFontName(const wxString& xFontName);
|
void SetXFontName(const wxString& xFontName);
|
||||||
#elif defined(__WXMSW__)
|
#elif defined(__WXMSW__)
|
||||||
wxNativeFontInfo(const LOGFONT& lf_) : lf(lf_), pointSize(0.0f) { }
|
wxNativeFontInfo(const LOGFONT& lf_);
|
||||||
|
|
||||||
|
// MSW-specific: get the height value in pixels using LOGFONT convention
|
||||||
|
// (i.e. negative) corresponding to the given size in points and DPI.
|
||||||
|
int GetLogFontHeightAtPPI(int ppi) const;
|
||||||
|
|
||||||
LOGFONT lf;
|
LOGFONT lf;
|
||||||
|
|
||||||
|
@@ -152,6 +152,16 @@ public:
|
|||||||
return m_hFont != 0;
|
return m_hFont != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int GetLogFontHeight() const
|
||||||
|
{
|
||||||
|
return m_nativeFontInfo.lf.lfHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
int GetLogFontHeightAtPPI(int ppi) const
|
||||||
|
{
|
||||||
|
return m_nativeFontInfo.GetLogFontHeightAtPPI(ppi);
|
||||||
|
}
|
||||||
|
|
||||||
// ... and setters: notice that all of them invalidate the currently
|
// ... and setters: notice that all of them invalidate the currently
|
||||||
// allocated HFONT, if any, so that the next call to GetHFONT() recreates a
|
// allocated HFONT, if any, so that the next call to GetHFONT() recreates a
|
||||||
// new one
|
// new one
|
||||||
@@ -223,6 +233,13 @@ public:
|
|||||||
m_nativeFontInfo.SetEncoding(encoding);
|
m_nativeFontInfo.SetEncoding(encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetLogFontHeight(int height)
|
||||||
|
{
|
||||||
|
Free();
|
||||||
|
|
||||||
|
m_nativeFontInfo.lf.lfHeight = height;
|
||||||
|
}
|
||||||
|
|
||||||
const wxNativeFontInfo& GetNativeFontInfo() const
|
const wxNativeFontInfo& GetNativeFontInfo() const
|
||||||
{
|
{
|
||||||
// we need to create the font now to get the corresponding LOGFONT if
|
// we need to create the font now to get the corresponding LOGFONT if
|
||||||
@@ -385,6 +402,15 @@ void wxFontRefData::Free()
|
|||||||
// wxNativeFontInfo
|
// wxNativeFontInfo
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxNativeFontInfo::wxNativeFontInfo(const LOGFONT& lf_)
|
||||||
|
: lf(lf_)
|
||||||
|
{
|
||||||
|
// Determine the size in points using the primary screen DPI as we don't
|
||||||
|
// have anything else here.
|
||||||
|
const float ppi = ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY);
|
||||||
|
pointSize = 72.0f * abs(lf.lfHeight) / ppi;
|
||||||
|
}
|
||||||
|
|
||||||
void wxNativeFontInfo::Init()
|
void wxNativeFontInfo::Init()
|
||||||
{
|
{
|
||||||
wxZeroMemory(lf);
|
wxZeroMemory(lf);
|
||||||
@@ -402,14 +428,7 @@ void wxNativeFontInfo::Init()
|
|||||||
|
|
||||||
float wxNativeFontInfo::GetFractionalPointSize() const
|
float wxNativeFontInfo::GetFractionalPointSize() const
|
||||||
{
|
{
|
||||||
if ( pointSize != 0.0f )
|
return pointSize;
|
||||||
return pointSize;
|
|
||||||
|
|
||||||
// FIXME: using the screen here results in incorrect font size calculation
|
|
||||||
// for printing!
|
|
||||||
const int ppInch = ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY);
|
|
||||||
|
|
||||||
return (72.0*abs(lf.lfHeight)) / (double) ppInch;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wxSize wxNativeFontInfo::GetPixelSize() const
|
wxSize wxNativeFontInfo::GetPixelSize() const
|
||||||
@@ -490,17 +509,31 @@ wxFontEncoding wxNativeFontInfo::GetEncoding() const
|
|||||||
return wxGetFontEncFromCharSet(lf.lfCharSet);
|
return wxGetFontEncFromCharSet(lf.lfCharSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxNativeFontInfo::SetFractionalPointSize(float pointsize)
|
int wxNativeFontInfo::GetLogFontHeightAtPPI(int ppi) const
|
||||||
{
|
{
|
||||||
// Store it to be able to return it from GetFractionalPointSize() later
|
return -wxRound(pointSize * ppi / 72.0);
|
||||||
// exactly.
|
}
|
||||||
pointSize = pointsize;
|
|
||||||
|
|
||||||
// FIXME: using the screen here results in incorrect font size calculation
|
void wxNativeFontInfo::SetFractionalPointSize(float pointSizeNew)
|
||||||
// for printing!
|
{
|
||||||
const int ppInch = ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY);
|
if ( pointSize == 0.0f )
|
||||||
|
{
|
||||||
|
// Do this before calling GetLogFontHeightAtPPI() below.
|
||||||
|
pointSize = pointSizeNew;
|
||||||
|
|
||||||
lf.lfHeight = -wxRound(pointsize*((double)ppInch)/72.0);
|
// We don't have the correct DPI to use here, so use that of the
|
||||||
|
// primary screen.
|
||||||
|
const int ppi = ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY);
|
||||||
|
lf.lfHeight = GetLogFontHeightAtPPI(ppi);
|
||||||
|
}
|
||||||
|
else // Changing the size of a valid font.
|
||||||
|
{
|
||||||
|
// Scale the font using the ratio of sizes, to ensure that we use the
|
||||||
|
// same DPI as before.
|
||||||
|
lf.lfHeight = -wxRound(abs(lf.lfHeight) * pointSizeNew / pointSize);
|
||||||
|
|
||||||
|
pointSize = pointSizeNew;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxNativeFontInfo::SetPixelSize(const wxSize& pixelSize)
|
void wxNativeFontInfo::SetPixelSize(const wxSize& pixelSize)
|
||||||
@@ -516,6 +549,11 @@ void wxNativeFontInfo::SetPixelSize(const wxSize& pixelSize)
|
|||||||
// versions by passing a negative value explicitly itself.
|
// versions by passing a negative value explicitly itself.
|
||||||
lf.lfHeight = -abs(pixelSize.GetHeight());
|
lf.lfHeight = -abs(pixelSize.GetHeight());
|
||||||
lf.lfWidth = pixelSize.GetWidth();
|
lf.lfWidth = pixelSize.GetWidth();
|
||||||
|
|
||||||
|
// We don't have the right DPI to use here neither, but we need to update
|
||||||
|
// the point size too, so fall back to the default.
|
||||||
|
const float ppi = ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY);
|
||||||
|
pointSize = 72.0f * pixelSize.GetHeight() / ppi;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxNativeFontInfo::SetStyle(wxFontStyle style)
|
void wxNativeFontInfo::SetStyle(wxFontStyle style)
|
||||||
|
Reference in New Issue
Block a user