summaryrefslogtreecommitdiff
path: root/src/player/FontStyle.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/player/FontStyle.cpp')
-rw-r--r--src/player/FontStyle.cpp315
1 files changed, 315 insertions, 0 deletions
diff --git a/src/player/FontStyle.cpp b/src/player/FontStyle.cpp
new file mode 100644
index 0000000..2980aa3
--- /dev/null
+++ b/src/player/FontStyle.cpp
@@ -0,0 +1,315 @@
+//
+// libavg - Media Playback Engine.
+// Copyright (C) 2003-2014 Ulrich von Zadow
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// Current versions can be found at www.libavg.de
+//
+
+#include "FontStyle.h"
+
+#include "../base/ObjectCounter.h"
+#include "../base/Exception.h"
+
+#include "TypeDefinition.h"
+#include "Arg.h"
+
+using namespace std;
+
+namespace avg {
+
+void FontStyle::registerType()
+{
+ TypeDefinition def = TypeDefinition("fontstyle", "",
+ ExportedObject::buildObject<FontStyle>)
+ .addArg(Arg<string>("font", "sans", false, offsetof(FontStyle, m_sName)))
+ .addArg(Arg<string>("variant", "", false, offsetof(FontStyle, m_sVariant)))
+ .addArg(Arg<string>("color", "FFFFFF", false, offsetof(FontStyle, m_sColorName)))
+ .addArg(Arg<float>("aagamma", 1.0f, false, offsetof(FontStyle, m_AAGamma)))
+ .addArg(Arg<float>("fontsize", 15, false, offsetof(FontStyle, m_Size)))
+ .addArg(Arg<int>("indent", 0, false, offsetof(FontStyle, m_Indent)))
+ .addArg(Arg<float>("linespacing", 0, false, offsetof(FontStyle, m_LineSpacing)))
+ .addArg(Arg<string>("alignment", "left"))
+ .addArg(Arg<string>("wrapmode", "word"))
+ .addArg(Arg<bool>("justify", false, false, offsetof(FontStyle, m_bJustify)))
+ .addArg(Arg<float>("letterspacing", 0, false,
+ offsetof(FontStyle, m_LetterSpacing)))
+ .addArg(Arg<bool>("hint", true, false, offsetof(FontStyle, m_bHint)))
+ .addArg(Arg<FontStylePtr>("basestyle", FontStylePtr()))
+ ;
+ TypeRegistry::get()->registerType(def);
+}
+
+FontStyle::FontStyle(const ArgList& args)
+{
+ args.setMembers(this);
+ setAlignment(args.getArgVal<string>("alignment"));
+ setWrapMode(args.getArgVal<string>("wrapmode"));
+ m_Color = colorStringToColor(m_sColorName);
+ if (args.getArgVal<FontStylePtr>("basestyle") != 0) {
+ applyBaseStyle(*(args.getArgVal<FontStylePtr>("basestyle")), args);
+ }
+}
+
+FontStyle::FontStyle()
+{
+ const ArgList& args = TypeRegistry::get()->getTypeDef("fontstyle").getDefaultArgs();
+ args.setMembers(this);
+ setAlignment(args.getArgVal<string>("alignment"));
+ setWrapMode(args.getArgVal<string>("wrapmode"));
+ m_Color = colorStringToColor(m_sColorName);
+}
+
+FontStyle::~FontStyle()
+{
+}
+
+template<class ATTR>
+void setDefaultedAttr(ATTR& member, const string& sName, const ArgList& args,
+ const ATTR& attr)
+{
+ if (args.getArg(sName)->isDefault()) {
+ member = attr;
+ }
+}
+
+void FontStyle::applyBaseStyle(const FontStyle& baseStyle, const ArgList& args)
+{
+ setDefaultedAttr(m_sName, "font", args, baseStyle.getFont());
+ setDefaultedAttr(m_sVariant, "variant", args, baseStyle.getFontVariant());
+ setDefaultedAttr(m_sColorName, "color", args, baseStyle.getColor());
+ m_Color = colorStringToColor(m_sColorName);
+ setDefaultedAttr(m_AAGamma, "aagamma", args, baseStyle.getAAGamma());
+ setDefaultedAttr(m_Size, "fontsize", args, baseStyle.getFontSize());
+ setDefaultedAttr(m_Indent, "indent", args, baseStyle.getIndent());
+ setDefaultedAttr(m_LineSpacing, "linespacing", args, baseStyle.getLineSpacing());
+ setDefaultedAttr(m_Alignment, "alignment", args, baseStyle.getAlignmentVal());
+ setDefaultedAttr(m_WrapMode, "wrapmode", args, baseStyle.getWrapModeVal());
+ setDefaultedAttr(m_bJustify, "justify", args, baseStyle.getJustify());
+ setDefaultedAttr(m_LetterSpacing, "letterspacing", args,
+ baseStyle.getLetterSpacing());
+ setDefaultedAttr(m_bHint, "hint", args, baseStyle.getHint());
+}
+
+template<class ARG>
+void setDefaultedArg(ARG& member, const string& sName, const ArgList& args)
+{
+ if (!args.getArg(sName)->isDefault()) {
+ member = args.getArgVal<ARG>(sName);
+ }
+}
+
+void FontStyle::setDefaultedArgs(const ArgList& args)
+{
+ // Warning: The ArgList here contains args that are for a different class originally,
+ // so the member offsets are wrong.
+ setDefaultedArg(m_sName, "font", args);
+ setDefaultedArg(m_sVariant, "variant", args);
+ setDefaultedArg(m_sColorName, "color", args);
+ setColor(m_sColorName);
+ setDefaultedArg(m_AAGamma, "aagamma", args);
+ setDefaultedArg(m_Size, "fontsize", args);
+ setDefaultedArg(m_Indent, "indent", args);
+ setDefaultedArg(m_LineSpacing, "linespacing", args);
+ string s = getAlignment();
+ setDefaultedArg(s, "alignment", args);
+ setAlignment(s);
+ s = getWrapMode();
+ setDefaultedArg(s, "wrapmode", args);
+ setWrapMode(s);
+ setDefaultedArg(m_bJustify, "justify", args);
+ setDefaultedArg(m_LetterSpacing, "letterspacing", args);
+ setDefaultedArg(m_bHint, "hint", args);
+}
+
+const std::string& FontStyle::getFont() const
+{
+ return m_sName;
+}
+
+void FontStyle::setFont(const string& sName)
+{
+ m_sName = sName;
+}
+
+const std::string& FontStyle::getFontVariant() const
+{
+ return m_sVariant;
+}
+
+void FontStyle::setFontVariant(const std::string& sVariant)
+{
+ m_sVariant = sVariant;
+}
+
+const std::string& FontStyle::getColor() const
+{
+ return m_sColorName;
+}
+
+void FontStyle::setColor(const string& sColor)
+{
+ m_sColorName = sColor;
+ m_Color = colorStringToColor(m_sColorName);
+}
+
+float FontStyle::getAAGamma() const
+{
+ return m_AAGamma;
+}
+
+void FontStyle::setAAGamma(float gamma)
+{
+ m_AAGamma = gamma;
+}
+
+float FontStyle::getFontSize() const
+{
+ return m_Size;
+}
+
+void FontStyle::setFontSize(float size)
+{
+ if (size <= 1) {
+ throw Exception(AVG_ERR_INVALID_ARGS, "Font size < 1 is illegal.");
+ }
+ m_Size = size;
+}
+
+int FontStyle::getIndent() const
+{
+ return m_Indent;
+}
+
+void FontStyle::setIndent(int indent)
+{
+ m_Indent = indent;
+}
+
+float FontStyle::getLineSpacing() const
+{
+ return m_LineSpacing;
+}
+
+void FontStyle::setLineSpacing(float lineSpacing)
+{
+ m_LineSpacing = lineSpacing;
+}
+
+string FontStyle::getAlignment() const
+{
+ switch(m_Alignment) {
+ case PANGO_ALIGN_LEFT:
+ return "left";
+ case PANGO_ALIGN_CENTER:
+ return "center";
+ case PANGO_ALIGN_RIGHT:
+ return "right";
+ default:
+ AVG_ASSERT(false);
+ return "";
+ }
+}
+
+void FontStyle::setAlignment(const string& sAlign)
+{
+ if (sAlign == "left") {
+ m_Alignment = PANGO_ALIGN_LEFT;
+ } else if (sAlign == "center") {
+ m_Alignment = PANGO_ALIGN_CENTER;
+ } else if (sAlign == "right") {
+ m_Alignment = PANGO_ALIGN_RIGHT;
+ } else {
+ throw(Exception(AVG_ERR_UNSUPPORTED,
+ "Alignment "+sAlign+" not supported."));
+ }
+}
+
+void FontStyle::setWrapMode(const string& sWrapMode)
+{
+ if (sWrapMode == "word") {
+ m_WrapMode = PANGO_WRAP_WORD;
+ } else if (sWrapMode == "char") {
+ m_WrapMode = PANGO_WRAP_CHAR;
+ } else if (sWrapMode == "wordchar") {
+ m_WrapMode = PANGO_WRAP_WORD_CHAR;
+ } else {
+ throw(Exception(AVG_ERR_UNSUPPORTED,
+ "FontStyle wrapping mode "+sWrapMode+" not supported."));
+ }
+}
+
+string FontStyle::getWrapMode() const
+{
+ switch(m_WrapMode) {
+ case PANGO_WRAP_WORD:
+ return "word";
+ case PANGO_WRAP_CHAR:
+ return "char";
+ case PANGO_WRAP_WORD_CHAR:
+ return "wordchar";
+ default:
+ AVG_ASSERT(false);
+ return "";
+ }
+}
+
+bool FontStyle::getJustify() const
+{
+ return m_bJustify;
+}
+
+void FontStyle::setJustify(bool bJustify)
+{
+ m_bJustify = bJustify;
+}
+
+float FontStyle::getLetterSpacing() const
+{
+ return m_LetterSpacing;
+}
+
+void FontStyle::setLetterSpacing(float letterSpacing)
+{
+ m_LetterSpacing = letterSpacing;
+}
+
+bool FontStyle::getHint() const
+{
+ return m_bHint;
+}
+
+void FontStyle::setHint(bool bHint)
+{
+ m_bHint = bHint;
+}
+
+PangoAlignment FontStyle::getAlignmentVal() const
+{
+ return m_Alignment;
+}
+
+PangoWrapMode FontStyle::getWrapModeVal() const
+{
+ return m_WrapMode;
+}
+
+Pixel32 FontStyle::getColorVal() const
+{
+ return m_Color;
+}
+
+}