summaryrefslogtreecommitdiff
path: root/src/lib/font.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-11-02 22:47:57 +0000
committerCarl Hetherington <cth@carlh.net>2015-11-02 22:47:57 +0000
commit9bf2cf3509380663e6943f6b0d22dbec6002c332 (patch)
tree86999381629818072353ffb15d78f5815efabf69 /src/lib/font.cc
parent8a673bcf0cd26268899face63723c0f201fabcce (diff)
Fix incorrect preview of italic subtitles (#728).
This requires fonts to be configured with their italic versions so that the italic font can be given to FontConfig and hence used to render text. Bold font configuration is also added here although bold subtitles aren't yet supported.
Diffstat (limited to 'src/lib/font.cc')
-rw-r--r--src/lib/font.cc51
1 files changed, 46 insertions, 5 deletions
diff --git a/src/lib/font.cc b/src/lib/font.cc
index d729c2696..e9df66cf7 100644
--- a/src/lib/font.cc
+++ b/src/lib/font.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2014 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2014-2015 Carl Hetherington <cth@carlh.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -18,26 +18,67 @@
*/
#include "font.h"
+#include "dcpomatic_assert.h"
#include <libxml++/libxml++.h>
+#include <boost/foreach.hpp>
+
+using std::string;
+
+static char const * names[] = {
+ "Normal",
+ "Italic",
+ "Bold"
+};
Font::Font (cxml::NodePtr node)
: _id (node->string_child ("Id"))
- , _file (node->optional_string_child ("File"))
{
+ DCPOMATIC_ASSERT (FontFiles::VARIANTS == 3);
+ BOOST_FOREACH (cxml::NodePtr i, node->node_children ("File")) {
+ string variant = i->optional_string_attribute("Variant").get_value_or ("Normal");
+ for (int j = 0; j < FontFiles::VARIANTS; ++j) {
+ if (variant == names[j]) {
+ _files.set (static_cast<FontFiles::Variant>(j), i->content());
+ }
+ }
+ }
}
void
Font::as_xml (xmlpp::Node* node)
{
+ DCPOMATIC_ASSERT (FontFiles::VARIANTS == 3);
+
node->add_child("Id")->add_child_text (_id);
- if (_file) {
- node->add_child("File")->add_child_text (_file.get().string ());
+ for (int i = 0; i < FontFiles::VARIANTS; ++i) {
+ if (_files.get(static_cast<FontFiles::Variant>(i))) {
+ xmlpp::Element* e = node->add_child ("File");
+ e->set_attribute ("Variant", names[i]);
+ e->add_child_text (_files.get(static_cast<FontFiles::Variant>(i)).get().string ());
+ }
}
}
+
+bool
+operator== (Font const & a, Font const & b)
+{
+ if (a.id() != b.id()) {
+ return false;
+ }
+
+ for (int i = 0; i < FontFiles::VARIANTS; ++i) {
+ if (a.file(static_cast<FontFiles::Variant>(i)) != b.file(static_cast<FontFiles::Variant>(i))) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
bool
operator!= (Font const & a, Font const & b)
{
- return (a.id() != b.id() || a.file() != b.file());
+ return !(a == b);
}