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
This commit is contained in:
Vadim Zeitlin
2004-09-25 23:03:44 +00:00
parent 6294ac2e91
commit 544229d106
7 changed files with 345 additions and 28 deletions

View File

@@ -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,6 +138,29 @@ wxFont *wxFontBase::New(int size,
return new wxFont(size, family, style, weight, underlined, face, encoding);
}
static inline int flags2Style(int flags)
{
return flags & wxFONTFLAG_ITALIC
? wxFONTSTYLE_ITALIC
: flags & wxFONTFLAG_SLANT
? wxFONTSTYLE_SLANT
: wxFONTSTYLE_NORMAL;
}
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;
}
/* static */
wxFont *wxFontBase::New(int pointSize,
wxFontFamily family,
@@ -90,24 +168,57 @@ wxFont *wxFontBase::New(int pointSize,
const wxString& face,
wxFontEncoding encoding)
{
return New
(
pointSize,
family,
flags & wxFONTFLAG_ITALIC
? wxFONTSTYLE_ITALIC
: flags & wxFONTFLAG_SLANT
? wxFONTSTYLE_SLANT
: wxFONTSTYLE_NORMAL,
flags & wxFONTFLAG_LIGHT
? wxFONTWEIGHT_LIGHT
: flags & wxFONTFLAG_BOLD
? wxFONTWEIGHT_BOLD
: wxFONTWEIGHT_NORMAL,
(flags & wxFONTFLAG_UNDERLINED) != 0,
face,
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 */