// Author: Vadim Zeitlin
// Modified by:
// Created: 20.09.99
-// RCS-ID: $Id$
// Copyright: (c) wxWidgets team
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef WX_PRECOMP
#include "wx/dc.h"
#include "wx/intl.h"
+ #include "wx/math.h"
#include "wx/dcscreen.h"
#include "wx/log.h"
#include "wx/gdicmn.h"
wxT("Helpstring"), wxT("group")) // wxFontWeight
wxPROPERTY( Underlined, bool, SetUnderlined, GetUnderlined, false, 0 /*flags*/, \
wxT("Helpstring"), wxT("group"))
+wxPROPERTY( Strikethrough, bool, SetStrikethrough, GetStrikethrough, false, 0, \
+ wxT("Helpstring"), wxT("group"))
wxPROPERTY( Face, wxString, SetFaceName, GetFaceName, wxEMPTY_PARAMETER_VALUE, \
0 /*flags*/, wxT("Helpstring"), wxT("group"))
wxPROPERTY( Encoding, wxFontEncoding, SetEncoding, GetEncoding, \
// implementation
// ============================================================================
-// ----------------------------------------------------------------------------
-// helper functions
-// ----------------------------------------------------------------------------
-
-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;
-}
-
// ----------------------------------------------------------------------------
// wxFontBase
// ----------------------------------------------------------------------------
const wxString& face,
wxFontEncoding encoding)
{
- return New(pointSize, family, flags2Style(flags), flags2Weight(flags),
- flags2Underlined(flags), face, encoding);
+ return New(pointSize, family,
+ GetStyleFromFlags(flags),
+ GetWeightFromFlags(flags),
+ GetUnderlinedFromFlags(flags),
+ face, encoding);
}
/* static */
const wxString& face,
wxFontEncoding encoding)
{
- return New(pixelSize, family, flags2Style(flags), flags2Weight(flags),
- flags2Underlined(flags), face, encoding);
+ return New(pixelSize, family,
+ GetStyleFromFlags(flags),
+ GetWeightFromFlags(flags),
+ GetUnderlinedFromFlags(flags),
+ face, encoding);
}
/* static */
SetStyle(info.style);
SetWeight(info.weight);
SetUnderlined(info.underlined);
+ SetStrikethrough(info.strikethrough);
SetFaceName(info.faceName);
SetEncoding(info.encoding);
#else
GetStyle() == font.GetStyle() &&
GetWeight() == font.GetWeight() &&
GetUnderlined() == font.GetUnderlined() &&
+ GetStrikethrough() == font.GetStrikethrough() &&
GetFaceName().IsSameAs(font.GetFaceName(), false) &&
GetEncoding() == font.GetEncoding()
);
return true;
}
+void wxFontBase::SetSymbolicSize(wxFontSymbolicSize size)
+{
+ SetSymbolicSizeRelativeTo(size, wxNORMAL_FONT->GetPointSize());
+}
+
+/* static */
+int wxFontBase::AdjustToSymbolicSize(wxFontSymbolicSize size, int base)
+{
+ // Using a fixed factor (1.2, from CSS2) is a bad idea as explained at
+ // http://www.w3.org/TR/CSS21/fonts.html#font-size-props so use the values
+ // from http://style.cleverchimp.com/font_size_intervals/altintervals.html
+ // instead.
+ static const float factors[] = { 0.60f, 0.75f, 0.89f, 1.f, 1.2f, 1.5f, 2.f };
+
+ wxCOMPILE_TIME_ASSERT
+ (
+ WXSIZEOF(factors) == wxFONTSIZE_XX_LARGE - wxFONTSIZE_XX_SMALL + 1,
+ WrongFontSizeFactorsSize
+ );
+
+ return wxRound(factors[size - wxFONTSIZE_XX_SMALL]*base);
+}
+
wxFont& wxFont::MakeBold()
{
SetWeight(wxFONTWEIGHT_BOLD);
wxFont wxFont::Italic() const
{
wxFont font(*this);
- font.SetStyle(wxFONTSTYLE_ITALIC);
+ font.MakeItalic();
return font;
}
+wxFont& wxFont::MakeUnderlined()
+{
+ SetUnderlined(true);
+ return *this;
+}
+
+wxFont wxFont::Underlined() const
+{
+ wxFont font(*this);
+ font.MakeUnderlined();
+ return font;
+}
+
+wxFont wxFont::Strikethrough() const
+{
+ wxFont font(*this);
+ font.MakeStrikethrough();
+ return font;
+}
+
+wxFont& wxFont::MakeStrikethrough()
+{
+ SetStrikethrough(true);
+ return *this;
+}
+
wxFont& wxFont::Scale(float x)
{
SetPointSize(int(x*GetPointSize() + 0.5));
// These are the generic forms of FromString()/ToString.
//
-// convert to/from the string representation: format is
-// version;pointsize;family;style;weight;underlined;facename;encoding
+// convert to/from the string representation: the general format is
+// "version;the rest..." with currently defined versions being:
+//
+// 0;pointsize;family;style;weight;underlined;facename;encoding
+// 1;pointsize;family;style;weight;underlined;strikethrough;facename;encoding
bool wxNativeFontInfo::FromString(const wxString& s)
{
long l;
+ unsigned long version;
wxStringTokenizer tokenizer(s, wxT(";"));
wxString token = tokenizer.GetNextToken();
- //
- // Ignore the version for now
- //
+ if ( !token.ToULong(&version) || version > 1 )
+ return false;
token = tokenizer.GetNextToken();
if ( !token.ToLong(&l) )
return false;
underlined = l != 0;
+ if ( version == 1 )
+ {
+ token = tokenizer.GetNextToken();
+ if ( !token.ToLong(&l) )
+ return false;
+ strikethrough = l != 0;
+ }
+
faceName = tokenizer.GetNextToken();
#ifndef __WXMAC__
{
wxString s;
- s.Printf(wxT("%d;%d;%d;%d;%d;%d;%s;%d"),
- 0, // version
+ s.Printf(wxT("%d;%d;%d;%d;%d;%d;%d;%s;%d"),
+ 1, // version
pointSize,
family,
(int)style,
(int)weight,
underlined,
+ strikethrough,
faceName.GetData(),
(int)encoding);
style = wxFONTSTYLE_NORMAL;
weight = wxFONTWEIGHT_NORMAL;
underlined = false;
+ strikethrough = false;
faceName.clear();
encoding = wxFONTENCODING_DEFAULT;
}
return underlined;
}
+bool wxNativeFontInfo::GetStrikethrough() const
+{
+ return strikethrough;
+}
+
wxString wxNativeFontInfo::GetFaceName() const
{
return faceName;
underlined = underlined_;
}
+void wxNativeFontInfo::SetStrikethrough(bool strikethrough_)
+{
+ strikethrough = strikethrough_;
+}
+
bool wxNativeFontInfo::SetFaceName(const wxString& facename_)
{
faceName = facename_;
desc << _("underlined");
}
+ if ( GetStrikethrough() )
+ {
+ desc << _("strikethrough");
+ }
+
switch ( GetWeight() )
{
default:
// that the different words which compose this facename are
// not different adjectives or other data but rather all parts
// of the facename
- desc << wxT(" '") << face << _("'");
+ desc << wxT(" '") << face << wxT("'");
}
else
desc << wxT(' ') << face;
{
SetUnderlined(true);
}
+ else if ( token == wxT("strikethrough") || token == _("strikethrough") )
+ {
+ SetStrikethrough(true);
+ }
else if ( token == wxT("light") || token == _("light") )
{
SetWeight(wxFONTWEIGHT_LIGHT);
SetFamily(family);
}
// NB: the check on the facename is implemented in wxFontBase::SetFaceName
- // and not in wxNativeFontInfo::SetFaceName thus we need to explicitely
+ // and not in wxNativeFontInfo::SetFaceName thus we need to explicitly
// call here wxFontEnumerator::IsValidFacename
else if (
#if wxUSE_FONTENUM
if ( !face.empty() )
{
// NB: the check on the facename is implemented in wxFontBase::SetFaceName
- // and not in wxNativeFontInfo::SetFaceName thus we need to explicitely
+ // and not in wxNativeFontInfo::SetFaceName thus we need to explicitly
// call here wxFontEnumerator::IsValidFacename
if (
#if wxUSE_FONTENUM