// helper functions
// ----------------------------------------------------------------------------
-static void AdjustFontSize(wxFont& font, wxDC& dc, const wxSize& pixelSize)
+static inline int flags2Style(int flags)
{
- int currentSize = 0;
- 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
- currentSize = font.GetPointSize();
- 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;
- }
+ return flags & wxFONTFLAG_ITALIC
+ ? wxFONTSTYLE_ITALIC
+ : flags & wxFONTFLAG_SLANT
+ ? wxFONTSTYLE_SLANT
+ : wxFONTSTYLE_NORMAL;
+}
- font.SetPointSize(currentSize);
- }
+static inline int flags2Weight(int flags)
+{
+ return flags & wxFONTFLAG_LIGHT
+ ? wxFONTWEIGHT_LIGHT
+ : flags & wxFONTFLAG_BOLD
+ ? wxFONTWEIGHT_BOLD
+ : wxFONTWEIGHT_NORMAL;
+}
- if (currentSize != largestGood)
- font.SetPointSize(largestGood);
+static inline bool flags2Underlined(int flags)
+{
+ return (flags & wxFONTFLAG_UNDERLINED) != 0;
}
// ----------------------------------------------------------------------------
/* static */
wxFont *wxFontBase::New(int size,
- int family,
- int style,
- int weight,
+ wxFontFamily family,
+ wxFontStyle style,
+ wxFontWeight weight,
bool underlined,
const wxString& face,
wxFontEncoding encoding)
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)
+/* static */
+wxFont *wxFontBase::New(const wxSize& pixelSize,
+ wxFontFamily family,
+ wxFontStyle style,
+ wxFontWeight weight,
+ bool underlined,
+ const wxString& face,
+ wxFontEncoding encoding)
{
- return (flags & wxFONTFLAG_UNDERLINED) != 0;
+ return new wxFont(pixelSize, family, style, weight, underlined,
+ face, encoding);
}
/* static */
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 *self = New(10, family, style, weight, underlined, face, encoding);
- wxScreenDC dc;
- AdjustFontSize(*(wxFont *)self, dc, pixelSize);
- return self;
-#endif
-}
-
/* static */
wxFont *wxFontBase::New(const wxSize& pixelSize,
wxFontFamily family,
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 */
wxFont *wxFontBase::New(const wxNativeFontInfo& info)
{
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)
{
#ifdef wxNO_NATIVE_FONTINFO
return true;
}
- UnRef();
return false;
}
return true;
}
- UnRef();
return false;
}
{
// either it is the same font, i.e. they share the same common data or they
// have different ref datas but still describe the same font
- return GetFontData() == font.GetFontData() ||
+ return IsSameAs(font) ||
(
- Ok() == font.Ok() &&
+ IsOk() == font.IsOk() &&
GetPointSize() == font.GetPointSize() &&
// in wxGTK1 GetPixelSize() calls GetInternalFont() which uses
// operator==() resulting in infinite recursion so we can't use it
);
}
-bool wxFontBase::operator!=(const wxFont& font) const
-{
- return !(*this == font);
-}
-
wxString wxFontBase::GetFamilyString() const
{
- wxCHECK_MSG( Ok(), wxT("wxDEFAULT"), wxT("invalid font") );
+ wxCHECK_MSG( IsOk(), "wxFONTFAMILY_DEFAULT", "invalid font" );
switch ( GetFamily() )
{
- case wxDECORATIVE: return wxT("wxDECORATIVE");
- case wxROMAN: return wxT("wxROMAN");
- case wxSCRIPT: return wxT("wxSCRIPT");
- case wxSWISS: return wxT("wxSWISS");
- case wxMODERN: return wxT("wxMODERN");
- case wxTELETYPE: return wxT("wxTELETYPE");
- default: return wxT("wxDEFAULT");
+ case wxFONTFAMILY_DECORATIVE: return "wxFONTFAMILY_DECORATIVE";
+ case wxFONTFAMILY_ROMAN: return "wxFONTFAMILY_ROMAN";
+ case wxFONTFAMILY_SCRIPT: return "wxFONTFAMILY_SCRIPT";
+ case wxFONTFAMILY_SWISS: return "wxFONTFAMILY_SWISS";
+ case wxFONTFAMILY_MODERN: return "wxFONTFAMILY_MODERN";
+ case wxFONTFAMILY_TELETYPE: return "wxFONTFAMILY_TELETYPE";
+ default: return "wxFONTFAMILY_DEFAULT";
}
}
wxString wxFontBase::GetStyleString() const
{
- wxCHECK_MSG( Ok(), wxT("wxDEFAULT"), wxT("invalid font") );
+ wxCHECK_MSG( IsOk(), "wxFONTSTYLE_DEFAULT", "invalid font" );
switch ( GetStyle() )
{
- case wxNORMAL: return wxT("wxNORMAL");
- case wxSLANT: return wxT("wxSLANT");
- case wxITALIC: return wxT("wxITALIC");
- default: return wxT("wxDEFAULT");
+ case wxFONTSTYLE_NORMAL: return "wxFONTSTYLE_NORMAL";
+ case wxFONTSTYLE_SLANT: return "wxFONTSTYLE_SLANT";
+ case wxFONTSTYLE_ITALIC: return "wxFONTSTYLE_ITALIC";
+ default: return "wxFONTSTYLE_DEFAULT";
}
}
wxString wxFontBase::GetWeightString() const
{
- wxCHECK_MSG( Ok(), wxT("wxDEFAULT"), wxT("invalid font") );
+ wxCHECK_MSG( IsOk(), "wxFONTWEIGHT_DEFAULT", "invalid font" );
switch ( GetWeight() )
{
- case wxNORMAL: return wxT("wxNORMAL");
- case wxBOLD: return wxT("wxBOLD");
- case wxLIGHT: return wxT("wxLIGHT");
- default: return wxT("wxDEFAULT");
+ case wxFONTWEIGHT_NORMAL: return "wxFONTWEIGHT_NORMAL";
+ case wxFONTWEIGHT_BOLD: return "wxFONTWEIGHT_BOLD";
+ case wxFONTWEIGHT_LIGHT: return "wxFONTWEIGHT_LIGHT";
+ default: return "wxFONTWEIGHT_DEFAULT";
}
}
-bool wxFontBase::SetFaceName(const wxString &facename)
+bool wxFontBase::SetFaceName(const wxString& facename)
{
+#if wxUSE_FONTENUM
if (!wxFontEnumerator::IsValidFacename(facename))
{
- UnRef(); // make Ok() return false
+ UnRef(); // make IsOk() return false
return false;
}
+#else // !wxUSE_FONTENUM
+ wxUnusedVar(facename);
+#endif // wxUSE_FONTENUM/!wxUSE_FONTENUM
return true;
}
// ----------------------------------------------------------------------------
// Up to now, there are no native implementations of this function:
-void wxNativeFontInfo::SetFaceName(const wxArrayString &facenames)
+void wxNativeFontInfo::SetFaceName(const wxArrayString& facenames)
{
+#if wxUSE_FONTENUM
for (size_t i=0; i < facenames.GetCount(); i++)
{
if (wxFontEnumerator::IsValidFacename(facenames[i]))
wxString validfacename = wxFontEnumerator::GetFacenames().Item(0);
wxLogTrace(wxT("font"), wxT("Falling back to '%s'"), validfacename.c_str());
SetFaceName(validfacename);
+#else // !wxUSE_FONTENUM
+ SetFaceName(facenames[0]);
+#endif // wxUSE_FONTENUM/!wxUSE_FONTENUM
}
wxString face;
unsigned long size;
- bool weightfound = false, pointsizefound = false, encodingfound = false;
+ bool weightfound = false, pointsizefound = false;
+#if wxUSE_FONTMAP
+ bool encodingfound = false;
+#endif
while ( tokenizer.HasMoreTokens() )
{
// NB: the check on the facename is implemented in wxFontBase::SetFaceName
// and not in wxNativeFontInfo::SetFaceName thus we need to explicitely
// call here wxFontEnumerator::IsValidFacename
- if (!wxFontEnumerator::IsValidFacename(face) ||
- !SetFaceName(face))
+ if (
+#if wxUSE_FONTENUM
+ !wxFontEnumerator::IsValidFacename(face) ||
+#endif // wxUSE_FONTENUM
+ !SetFaceName(face) )
+ {
SetFaceName(wxNORMAL_FONT->GetFaceName());
+ }
+
face.clear();
}
}
// NB: the check on the facename is implemented in wxFontBase::SetFaceName
// and not in wxNativeFontInfo::SetFaceName thus we need to explicitely
// call here wxFontEnumerator::IsValidFacename
- if (!wxFontEnumerator::IsValidFacename(face) ||
- !SetFaceName(face))
- SetFaceName(wxNORMAL_FONT->GetFaceName());
+ if (
+#if wxUSE_FONTENUM
+ !wxFontEnumerator::IsValidFacename(face) ||
+#endif // wxUSE_FONTENUM
+ !SetFaceName(face) )
+ {
+ SetFaceName(wxNORMAL_FONT->GetFaceName());
+ }
}
// set point size to default value if size was not given
}
#endif // generic or wxMSW or wxOS2
+
+
+// wxFont <-> wxString utilities, used by wxConfig
+wxString wxToString(const wxFontBase& font)
+{
+ return font.IsOk() ? font.GetNativeFontInfoDesc()
+ : wxString();
+}
+
+bool wxFromString(const wxString& str, wxFontBase *font)
+{
+ wxCHECK_MSG( font, false, _T("NULL output parameter") );
+
+ if ( str.empty() )
+ {
+ *font = wxNullFont;
+ return true;
+ }
+
+ return font->SetNativeFontInfo(str);
+}
+
+