add the wxFont(const wxSize& pixelSize, ...) ctor to all ports; add some wxCHECK_MSGs to ensure that the wxSize objects contains non-negative arguments; document that passing zero for the width parameter is allowed; other minor doc fixes

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59564 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Francesco Montorsi
2009-03-15 16:28:33 +00:00
parent 2fd716136a
commit b5791cc7af
19 changed files with 372 additions and 158 deletions

View File

@@ -63,6 +63,18 @@ public:
(void)Create(size, family, style, weight, underlined, face, encoding); (void)Create(size, family, style, weight, underlined, face, encoding);
} }
wxFont(const wxSize& pixelSize,
wxFontFamily family,
wxFontStyle style,
wxFontWeight weight,
bool underlined = false,
const wxString& face = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
{
Create(10, family, style, weight, underlined, face, encoding);
SetPixelSize(pixelSize);
}
/*! @abstract Construction with opaque wxNativeFontInfo /*! @abstract Construction with opaque wxNativeFontInfo
*/ */
wxFont(const wxNativeFontInfo& info) wxFont(const wxNativeFontInfo& info)

View File

@@ -48,6 +48,18 @@ public:
Create(size, family, style, weight, underlined, face, encoding); Create(size, family, style, weight, underlined, face, encoding);
} }
wxFont(const wxSize& pixelSize,
wxFontFamily family,
wxFontStyle style,
wxFontWeight weight,
bool underlined = false,
const wxString& face = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
{
Create(10, family, style, weight, underlined, face, encoding);
SetPixelSize(pixelSize);
}
bool Create(int size, bool Create(int size,
wxFontFamily family, wxFontFamily family,
wxFontStyle style, wxFontStyle style,

View File

@@ -111,6 +111,28 @@ class WXDLLIMPEXP_FWD_CORE wxNativeFontInfo;
class WXDLLIMPEXP_CORE wxFontBase : public wxGDIObject class WXDLLIMPEXP_CORE wxFontBase : public wxGDIObject
{ {
public: public:
/*
derived classes should provide the following ctors:
wxFont();
wxFont(const wxString& nativeFontInfoString);
wxFont(const wxNativeFontInfo& info);
wxFont(int size,
wxFontFamily family,
wxFontStyle style,
wxFontWeight weight,
bool underlined = false,
const wxString& face = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT);
wxFont(const wxSize& pixelSize,
wxFontFamily family,
wxFontStyle style,
wxFontWeight weight,
bool underlined = false,
const wxString& face = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT);
*/
// creator function // creator function
virtual ~wxFontBase(); virtual ~wxFontBase();

View File

@@ -51,6 +51,18 @@ public:
Create(size, family, style, weight, underlined, face, encoding); Create(size, family, style, weight, underlined, face, encoding);
} }
wxFont(const wxSize& pixelSize,
wxFontFamily family,
wxFontStyle style,
wxFontWeight weight,
bool underlined = false,
const wxString& face = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
{
Create(10, family, style, weight, underlined, face, encoding);
SetPixelSize(pixelSize);
}
bool Create(int size, bool Create(int size,
wxFontFamily family, wxFontFamily family,
wxFontStyle style, wxFontStyle style,

View File

@@ -64,6 +64,18 @@ public:
Create(size, family, style, weight, underlined, face, encoding); Create(size, family, style, weight, underlined, face, encoding);
} }
wxFont(const wxSize& pixelSize,
wxFontFamily family,
wxFontStyle style,
wxFontWeight weight,
bool underlined = false,
const wxString& face = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
{
Create(10, family, style, weight, underlined, face, encoding);
SetPixelSize(pixelSize);
}
bool Create(int size, bool Create(int size,
wxFontFamily family, wxFontFamily family,
wxFontStyle style, wxFontStyle style,

View File

@@ -61,6 +61,18 @@ public:
Create(size, family, style, weight, underlined, face, encoding); Create(size, family, style, weight, underlined, face, encoding);
} }
wxFont(const wxSize& pixelSize,
wxFontFamily family,
wxFontStyle style,
wxFontWeight weight,
bool underlined = false,
const wxString& face = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
{
Create(10, family, style, weight, underlined, face, encoding);
SetPixelSize(pixelSize);
}
bool Create(int size, bool Create(int size,
wxFontFamily family, wxFontFamily family,
wxFontStyle style, wxFontStyle style,

View File

@@ -54,6 +54,18 @@ public:
Create(size, family, style, weight, underlined, face, encoding); Create(size, family, style, weight, underlined, face, encoding);
} }
wxFont(const wxSize& pixelSize,
wxFontFamily family,
wxFontStyle style,
wxFontWeight weight,
bool underlined = false,
const wxString& face = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
{
Create(10, family, style, weight, underlined, face, encoding);
SetPixelSize(pixelSize);
}
bool Create(int size, bool Create(int size,
wxFontFamily family, wxFontFamily family,
wxFontStyle style, wxFontStyle style,

View File

@@ -48,6 +48,18 @@ public:
Create(size, family, style, weight, underlined, face, encoding); Create(size, family, style, weight, underlined, face, encoding);
} }
wxFont(const wxSize& pixelSize,
wxFontFamily family,
wxFontStyle style,
wxFontWeight weight,
bool underlined = false,
const wxString& face = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
{
Create(10, family, style, weight, underlined, face, encoding);
SetPixelSize(pixelSize);
}
bool Create(int size, bool Create(int size,
wxFontFamily family, wxFontFamily family,
wxFontStyle style, wxFontStyle style,

View File

@@ -51,6 +51,18 @@ public:
Create(size, family, style, weight, underlined, face, encoding); Create(size, family, style, weight, underlined, face, encoding);
} }
wxFont(const wxSize& pixelSize,
wxFontFamily family,
wxFontStyle style,
wxFontWeight weight,
bool underlined = false,
const wxString& face = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
{
Create(10, family, style, weight, underlined, face, encoding);
SetPixelSize(pixelSize);
}
bool Create(int size, bool Create(int size,
wxFontFamily family, wxFontFamily family,
wxFontStyle style, wxFontStyle style,

View File

@@ -46,6 +46,18 @@ public:
Create(size, family, style, weight, underlined, face, encoding); Create(size, family, style, weight, underlined, face, encoding);
} }
wxFont(const wxSize& pixelSize,
wxFontFamily family,
wxFontStyle style,
wxFontWeight weight,
bool underlined = false,
const wxString& face = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
{
Create(10, family, style, weight, underlined, face, encoding);
SetPixelSize(pixelSize);
}
bool Create(int size, bool Create(int size,
wxFontFamily family, wxFontFamily family,
wxFontStyle style, wxFontStyle style,

View File

@@ -48,6 +48,18 @@ public:
Create(size, family, style, weight, underlined, face, encoding); Create(size, family, style, weight, underlined, face, encoding);
} }
wxFont(const wxSize& pixelSize,
wxFontFamily family,
wxFontStyle style,
wxFontWeight weight,
bool underlined = false,
const wxString& face = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
{
Create(10, family, style, weight, underlined, face, encoding);
SetPixelSize(pixelSize);
}
bool Create(int size, bool Create(int size,
wxFontFamily family, wxFontFamily family,
wxFontStyle style, wxFontStyle style,

View File

@@ -45,6 +45,18 @@ public:
Create(size, family, style, weight, underlined, face, encoding); Create(size, family, style, weight, underlined, face, encoding);
} }
wxFont(const wxSize& pixelSize,
wxFontFamily family,
wxFontStyle style,
wxFontWeight weight,
bool underlined = false,
const wxString& face = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
{
Create(10, family, style, weight, underlined, face, encoding);
SetPixelSize(pixelSize);
}
bool Create(int size, bool Create(int size,
wxFontFamily family, wxFontFamily family,
wxFontStyle style, wxFontStyle style,

View File

@@ -250,7 +250,6 @@ enum wxFontEncoding
class wxFont : public wxGDIObject class wxFont : public wxGDIObject
{ {
public: public:
//@{
/** /**
Default ctor. Default ctor.
*/ */
@@ -265,15 +264,15 @@ public:
Creates a font object with the specified attributes. Creates a font object with the specified attributes.
@param pointSize @param pointSize
Size in points. Size in points. See SetPointSize() for more info.
@param family @param family
Font family, a generic way of referring to fonts without specifying actual Font family, a generic way of referring to fonts without specifying actual
facename. One of the ::wxFontFamily enumeration values. facename. One of the ::wxFontFamily enumeration values.
@param style @param style
One of wxFONTSTYLE_NORMAL, wxFONTSTYLE_SLANT and wxFONTSTYLE_ITALIC. One of @c wxFONTSTYLE_NORMAL, @c wxFONTSTYLE_SLANT and @c wxFONTSTYLE_ITALIC.
@param weight @param weight
Font weight, sometimes also referred to as font boldness. One of Font weight, sometimes also referred to as font boldness.
the ::wxFontWeight enumeration values. One of the ::wxFontWeight enumeration values.
@param underline @param underline
The value can be @true or @false. The value can be @true or @false.
At present this has an effect on Windows and Motif 2.x only. At present this has an effect on Windows and Motif 2.x only.
@@ -284,16 +283,16 @@ public:
An encoding which may be one of the enumeration values of ::wxFontEncoding. An encoding which may be one of the enumeration values of ::wxFontEncoding.
Briefly these can be summed up as: Briefly these can be summed up as:
<TABLE> <TABLE>
<TR><TD>wxFONTENCODING_SYSTEM</TD><TD>Default system encoding.</TD></TR> <TR><TD>@c wxFONTENCODING_SYSTEM</TD><TD>Default system encoding.</TD></TR>
<TR><TD>wxFONTENCODING_DEFAULT</TD><TD> <TR><TD>@c wxFONTENCODING_DEFAULT</TD><TD>
Default application encoding: this Default application encoding: this
is the encoding set by calls to is the encoding set by calls to
SetDefaultEncoding and which may be set to, SetDefaultEncoding and which may be set to,
say, KOI8 to create all fonts by default with KOI8 encoding. Initially, the say, KOI8 to create all fonts by default with KOI8 encoding. Initially, the
default application encoding is the same as default system encoding.</TD></TR> default application encoding is the same as default system encoding.</TD></TR>
<TR><TD>wxFONTENCODING_ISO8859_1...15</TD><TD>ISO8859 encodings.</TD></TR> <TR><TD>@c wxFONTENCODING_ISO8859_1...15</TD><TD>ISO8859 encodings.</TD></TR>
<TR><TD>wxFONTENCODING_KOI8</TD><TD>The standard Russian encoding for Internet.</TD></TR> <TR><TD>@c wxFONTENCODING_KOI8</TD><TD>The standard Russian encoding for Internet.</TD></TR>
<TR><TD>wxFONTENCODING_CP1250...1252</TD><TD>Windows encodings similar to ISO8859 (but not identical).</TD></TR> <TR><TD>@c wxFONTENCODING_CP1250...1252</TD><TD>Windows encodings similar to ISO8859 (but not identical).</TD></TR>
</TABLE> </TABLE>
If the specified encoding isn't available, no font is created If the specified encoding isn't available, no font is created
(see also font encoding overview). (see also font encoding overview).
@@ -311,15 +310,12 @@ public:
Creates a font object with the specified attributes. Creates a font object with the specified attributes.
@param pixelSize @param pixelSize
Size in pixels: this is directly supported only under MSW currently Size in pixels. See SetPixelSize() for more info.
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 New method must be used.
@param family @param family
Font family, a generic way of referring to fonts without specifying actual Font family, a generic way of referring to fonts without specifying actual
facename. One of ::wxFontFamily enumeration values. facename. One of ::wxFontFamily enumeration values.
@param style @param style
One of wxFONTSTYLE_NORMAL, wxFONTSTYLE_SLANT and wxFONTSTYLE_ITALIC. One of @c wxFONTSTYLE_NORMAL, @c wxFONTSTYLE_SLANT and @c wxFONTSTYLE_ITALIC.
@param weight @param weight
Font weight, sometimes also referred to as font boldness. Font weight, sometimes also referred to as font boldness.
One of the ::wxFontWeight enumeration values. One of the ::wxFontWeight enumeration values.
@@ -333,16 +329,16 @@ public:
An encoding which may be one of the enumeration values of ::wxFontEncoding. An encoding which may be one of the enumeration values of ::wxFontEncoding.
Briefly these can be summed up as: Briefly these can be summed up as:
<TABLE> <TABLE>
<TR><TD>wxFONTENCODING_SYSTEM</TD><TD>Default system encoding.</TD></TR> <TR><TD>@c wxFONTENCODING_SYSTEM</TD><TD>Default system encoding.</TD></TR>
<TR><TD>wxFONTENCODING_DEFAULT</TD><TD> <TR><TD>@c wxFONTENCODING_DEFAULT</TD><TD>
Default application encoding: this Default application encoding: this
is the encoding set by calls to is the encoding set by calls to
SetDefaultEncoding and which may be set to, SetDefaultEncoding and which may be set to,
say, KOI8 to create all fonts by default with KOI8 encoding. Initially, the say, KOI8 to create all fonts by default with KOI8 encoding. Initially, the
default application encoding is the same as default system encoding.</TD></TR> default application encoding is the same as default system encoding.</TD></TR>
<TR><TD>wxFONTENCODING_ISO8859_1...15</TD><TD>ISO8859 encodings.</TD></TR> <TR><TD>@c wxFONTENCODING_ISO8859_1...15</TD><TD>ISO8859 encodings.</TD></TR>
<TR><TD>wxFONTENCODING_KOI8</TD><TD>The standard Russian encoding for Internet.</TD></TR> <TR><TD>@c wxFONTENCODING_KOI8</TD><TD>The standard Russian encoding for Internet.</TD></TR>
<TR><TD>wxFONTENCODING_CP1250...1252</TD><TD>Windows encodings similar to ISO8859 (but not identical).</TD></TR> <TR><TD>@c wxFONTENCODING_CP1250...1252</TD><TD>Windows encodings similar to ISO8859 (but not identical).</TD></TR>
</TABLE> </TABLE>
If the specified encoding isn't available, no font is created If the specified encoding isn't available, no font is created
(see also font encoding overview). (see also font encoding overview).
@@ -355,7 +351,6 @@ public:
bool underline = false, bool underline = false,
const wxString& faceName = wxEmptyString, const wxString& faceName = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT); wxFontEncoding encoding = wxFONTENCODING_DEFAULT);
//@}
/** /**
Destructor. Destructor.
@@ -424,7 +419,18 @@ public:
virtual int GetPointSize() const; virtual int GetPointSize() const;
/** /**
Gets the font style. See wxFontStyle for a list of valid styles. Gets the pixel size.
Note that under wxMSW if you passed to SetPixelSize() (or to the ctor)
a wxSize object with a null width value, you'll get a null width in
the returned object.
@see SetPixelSize()
*/
virtual wxSize GetPixelSize() const;
/**
Gets the font style. See ::wxFontStyle for a list of valid styles.
@see SetStyle() @see SetStyle()
*/ */
@@ -438,7 +444,7 @@ public:
virtual bool GetUnderlined() const; virtual bool GetUnderlined() const;
/** /**
Gets the font weight. See wxFontWeight for a list of valid weight identifiers. Gets the font weight. See ::wxFontWeight for a list of valid weight identifiers.
@see SetWeight() @see SetWeight()
*/ */
@@ -457,11 +463,11 @@ public:
//@{ //@{
/** /**
These functions take the same parameters as This function takes the same parameters as
@ref wxFont::wxFont "wxFont constructors" and return a new font @ref wxFont::wxFont "wxFont constructors" and returns a new font
object allocated on the heap. object allocated on the heap.
Using @c New() is currently the only way to directly create a font with Using New() is currently the only way to directly create a font with
the given size in pixels on platforms other than wxMSW. the given size in pixels on platforms other than wxMSW.
*/ */
static wxFont* New(int pointSize, wxFontFamily family, wxFontStyle style, static wxFont* New(int pointSize, wxFontFamily family, wxFontStyle style,
@@ -545,8 +551,8 @@ public:
@beginTable @beginTable
@hdr3col{platform, generic syntax, example} @hdr3col{platform, generic syntax, example}
@row3col{wxGTK2, @c [FACE-NAME] [bold] [oblique|italic] [POINTSIZE], Monospace bold 10} @row3col{wxGTK2, <tt>[FACE-NAME] [bold] [oblique|italic] [POINTSIZE]</tt>, Monospace bold 10}
@row3col{wxMSW, @c [light|bold] [italic] [FACE-NAME] [POINTSIZE] [ENCODING], Tahoma 10 WINDOWS-1252} @row3col{wxMSW, <tt>[light|bold] [italic] [FACE-NAME] [POINTSIZE] [ENCODING]</tt>, Tahoma 10 WINDOWS-1252}
@endTable @endTable
@todo add an example for wxMac @todo add an example for wxMac
@@ -562,6 +568,9 @@ public:
/** /**
Sets the point size. Sets the point size.
The <em>point size</em> is defined as 1/72 of the anglo-Saxon inch
(25.4 mm): it is approximately 0.0139 inch or 352.8 um.
@param pointSize @param pointSize
Size in points. Size in points.
@@ -569,6 +578,21 @@ public:
*/ */
virtual void SetPointSize(int pointSize); virtual void SetPointSize(int pointSize);
/**
Sets the pixel size.
The height parameter of @a pixelSize must be positive while the width
parameter may also be zero (to indicate that you're not interested in the
width of the characters: a suitable width will be chosen for best rendering).
This feature (specifying the font pixel size) is directly supported only
under wxMSW and wxGTK currently; under other platforms a font with the
closest size to the given one is found using binary search (this maybe slower).
@see GetPixelSize()
*/
virtual void SetPixelSize(const wxSize& pixelSize);
/** /**
Sets the font style. Sets the font style.
@@ -629,24 +653,26 @@ wxFont wxNullFont;
/** /**
Equivalent to wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT). Equivalent to wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).
@see wxSystemSettings
*/ */
wxFont wxNORMAL_FONT; wxFont wxNORMAL_FONT;
/** /**
A font using the wxFONTFAMILY_SWISS family and 2 points smaller than A font using the @c wxFONTFAMILY_SWISS family and 2 points smaller than
::wxNORMAL_FONT. ::wxNORMAL_FONT.
*/ */
wxFont wxSMALL_FONT; wxFont wxSMALL_FONT;
/** /**
A font using the wxFONTFAMILY_ROMAN family and wxFONTSTYLE_ITALIC style and A font using the @c wxFONTFAMILY_ROMAN family and @c wxFONTSTYLE_ITALIC style and
of the same size of ::wxNORMAL_FONT. of the same size of ::wxNORMAL_FONT.
*/ */
wxFont wxITALIC_FONT; wxFont wxITALIC_FONT;
/** /**
A font identic to ::wxNORMAL_FONT except for the family used which is A font identic to ::wxNORMAL_FONT except for the family used which is
wxFONTFAMILY_SWISS. @c wxFONTFAMILY_SWISS.
*/ */
wxFont wxSWISS_FONT; wxFont wxSWISS_FONT;

View File

@@ -53,57 +53,27 @@
// helper functions // helper functions
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
static void AdjustFontSize(wxFont& font, wxDC& dc, const wxSize& pixelSize) static inline int flags2Style(int flags)
{ {
int largestGood = 0; return flags & wxFONTFLAG_ITALIC
int smallestBad = 0; ? wxFONTSTYLE_ITALIC
: flags & wxFONTFLAG_SLANT
? wxFONTSTYLE_SLANT
: wxFONTSTYLE_NORMAL;
}
bool initialGoodFound = false; static inline int flags2Weight(int flags)
bool initialBadFound = false; {
return flags & wxFONTFLAG_LIGHT
? wxFONTWEIGHT_LIGHT
: flags & wxFONTFLAG_BOLD
? wxFONTWEIGHT_BOLD
: wxFONTWEIGHT_NORMAL;
}
// NB: this assignment was separated from the variable definition static inline bool flags2Underlined(int flags)
// in order to fix a gcc v3.3.3 compiler crash {
int currentSize = font.GetPointSize(); return (flags & wxFONTFLAG_UNDERLINED) != 0;
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);
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -140,27 +110,17 @@ wxFont *wxFontBase::New(int size,
return new wxFont(size, family, style, weight, underlined, face, encoding); return new wxFont(size, family, style, weight, underlined, face, encoding);
} }
static inline int flags2Style(int flags) /* static */
wxFont *wxFontBase::New(const wxSize& pixelSize,
wxFontFamily family,
wxFontStyle style,
wxFontWeight weight,
bool underlined,
const wxString& face,
wxFontEncoding encoding)
{ {
return flags & wxFONTFLAG_ITALIC return new wxFont(pixelSize, family, style, weight, underlined,
? wxFONTSTYLE_ITALIC face, encoding);
: 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 */ /* static */
@@ -174,26 +134,6 @@ wxFont *wxFontBase::New(int pointSize,
flags2Underlined(flags), face, encoding); flags2Underlined(flags), face, encoding);
} }
/* static */
wxFont *wxFontBase::New(const wxSize& pixelSize,
wxFontFamily family,
wxFontStyle style,
wxFontWeight weight,
bool underlined,
const wxString& face,
wxFontEncoding encoding)
{
#if defined(__WXMSW__)
return new wxFont(pixelSize, family, style, weight, underlined,
face, encoding);
#else
wxFont *self = New(10, family, style, weight, underlined, face, encoding);
wxScreenDC dc;
AdjustFontSize(*(wxFont *)self, dc, pixelSize);
return self;
#endif
}
/* static */ /* static */
wxFont *wxFontBase::New(const wxSize& pixelSize, wxFont *wxFontBase::New(const wxSize& pixelSize,
wxFontFamily family, wxFontFamily family,
@@ -205,24 +145,6 @@ wxFont *wxFontBase::New(const wxSize& pixelSize,
flags2Underlined(flags), face, encoding); 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 */ /* static */
wxFont *wxFontBase::New(const wxNativeFontInfo& info) wxFont *wxFontBase::New(const wxNativeFontInfo& info)
{ {
@@ -244,6 +166,81 @@ bool wxFontBase::IsFixedWidth() const
return GetFamily() == wxFONTFAMILY_TELETYPE; return GetFamily() == wxFONTFAMILY_TELETYPE;
} }
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 )
{
wxCHECK_RET( pixelSize.GetWidth() >= 0 && pixelSize.GetHeight() > 0,
"Negative values for the pixel size or zero pixel height are not allowed" );
wxScreenDC dc;
// NOTE: this algorithm for adjusting the font size is used by all
// implementations of wxFont except under wxMSW and wxGTK where
// native support to font creation using pixel-size is provided.
int largestGood = 0;
int smallestBad = 0;
bool initialGoodFound = false;
bool initialBadFound = false;
// NB: this assignment was separated from the variable definition
// in order to fix a gcc v3.3.3 compiler crash
int currentSize = GetPointSize();
while (currentSize > 0)
{
dc.SetFont(*static_cast<wxFont*>(this));
// if currentSize (in points) results in a font that is smaller
// than required by pixelSize it is considered a good size
// NOTE: the pixel size width may be zero
if (dc.GetCharHeight() <= pixelSize.GetHeight() &&
(pixelSize.GetWidth() == 0 ||
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;
}
SetPointSize(currentSize);
}
if (currentSize != largestGood)
SetPointSize(largestGood);
}
void wxFontBase::DoSetNativeFontInfo(const wxNativeFontInfo& info) void wxFontBase::DoSetNativeFontInfo(const wxNativeFontInfo& info)
{ {
#ifdef wxNO_NATIVE_FONTINFO #ifdef wxNO_NATIVE_FONTINFO

View File

@@ -1,6 +1,6 @@
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// Name: src/gtk/font.cpp // Name: src/gtk/font.cpp
// Purpose: // Purpose: wxFont for wxGTK
// Author: Robert Roebling // Author: Robert Roebling
// Id: $Id$ // Id: $Id$
// Copyright: (c) 1998 Robert Roebling and Julian Smart // Copyright: (c) 1998 Robert Roebling and Julian Smart
@@ -113,8 +113,7 @@ private:
wxFontEncoding m_encoding; wxFontEncoding m_encoding;
bool m_noAA; // No anti-aliasing bool m_noAA; // No anti-aliasing
// The native font info, basicly an XFLD under GTK 1.2 and // The native font info: basically a PangoFontDescription
// the pango font description under GTK 2.0.
wxNativeFontInfo m_nativeFontInfo; wxNativeFontInfo m_nativeFontInfo;
friend class wxFont; friend class wxFont;
@@ -287,6 +286,36 @@ void wxFontRefData::SetPointSize(int pointSize)
m_nativeFontInfo.SetPointSize(pointSize); m_nativeFontInfo.SetPointSize(pointSize);
} }
/*
NOTE: disabled because pango_font_description_set_absolute_size() and
wxDC::GetCharHeight() do not mix well: setting with the former a pixel
size of "30" makes the latter return 36...
Besides, we need to return GetPointSize() a point size value even if
SetPixelSize() was used and this would require further changes
(and use of pango_font_description_get_size_is_absolute in some places).
bool wxFontRefData::SetPixelSize(const wxSize& pixelSize)
{
wxCHECK_MSG( pixelSize.GetWidth() >= 0 && pixelSize.GetHeight() > 0, false,
"Negative values for the pixel size or zero pixel height are not allowed" );
if (wx_pango_version_check(1,8,0) != NULL ||
pixelSize.GetWidth() != 0)
{
// NOTE: pango_font_description_set_absolute_size() only sets the font height;
// if the user set the pixel width of the font explicitly or the pango
// library is too old, we cannot proceed
return false;
}
pango_font_description_set_absolute_size( m_nativeFontInfo.description,
pixelSize.GetHeight() * PANGO_SCALE );
return true;
}
*/
void wxFontRefData::SetFamily(wxFontFamily family) void wxFontRefData::SetFamily(wxFontFamily family)
{ {
m_family = family; m_family = family;
@@ -361,7 +390,7 @@ bool wxFont::Create( int pointSize,
wxFontWeight weight, wxFontWeight weight,
bool underlined, bool underlined,
const wxString& face, const wxString& face,
wxFontEncoding encoding) wxFontEncoding encoding )
{ {
UnRef(); UnRef();

View File

@@ -186,6 +186,10 @@ wxConvertFromGTK(const wxString& s, wxFontEncoding enc)
// availability of pango version major.minor.micro, nor the non-availability // availability of pango version major.minor.micro, nor the non-availability
const gchar *wx_pango_version_check (int major, int minor, int micro) const gchar *wx_pango_version_check (int major, int minor, int micro)
{ {
// NOTE: you don't need to use this macro to check for Pango features
// added in pango-1.4 or earlier since GTK 2.4 (our minimum requirement
// for GTK lib) required pango 1.4...
#ifdef PANGO_VERSION_MAJOR #ifdef PANGO_VERSION_MAJOR
if (!gtk_check_version (2,11,0)) if (!gtk_check_version (2,11,0))
{ {

View File

@@ -565,11 +565,16 @@ void wxNativeFontInfo::SetPointSize(int pointsize)
void wxNativeFontInfo::SetPixelSize(const wxSize& pixelSize) void wxNativeFontInfo::SetPixelSize(const wxSize& pixelSize)
{ {
// NOTE: although the MSW port allows for negative pixel size heights,
// other ports don't and since it's a very useful feature assert
// here if we get a negative height:
wxCHECK_RET( pixelSize.GetWidth() >= 0 && pixelSize.GetHeight() > 0,
"Negative values for the pixel size or zero pixel height are not allowed" );
lf.lfHeight = pixelSize.GetHeight(); lf.lfHeight = pixelSize.GetHeight();
lf.lfWidth = pixelSize.GetWidth(); lf.lfWidth = pixelSize.GetWidth();
} }
void wxNativeFontInfo::SetStyle(wxFontStyle style) void wxNativeFontInfo::SetStyle(wxFontStyle style)
{ {
switch ( style ) switch ( style )

View File

@@ -1,6 +1,6 @@
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// Name: src/unix/fontutil.cpp // Name: src/unix/fontutil.cpp
// Purpose: Font helper functions for X11 (GDK/X) // Purpose: Font helper functions for wxX11, wxGTK, wxMotif
// Author: Vadim Zeitlin // Author: Vadim Zeitlin
// Modified by: // Modified by:
// Created: 05.11.99 // Created: 05.11.99
@@ -218,7 +218,6 @@ wxFontEncoding wxNativeFontInfo::GetEncoding() const
return wxFONTENCODING_SYSTEM; return wxFONTENCODING_SYSTEM;
} }
void wxNativeFontInfo::SetPointSize(int pointsize) void wxNativeFontInfo::SetPointSize(int pointsize)
{ {
pango_font_description_set_size( description, pointsize * PANGO_SCALE ); pango_font_description_set_size( description, pointsize * PANGO_SCALE );