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:
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user