summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2012-08-21 16:13:22 +0100
committerCarl Hetherington <cth@carlh.net>2012-08-21 16:13:22 +0100
commitb56b008e2ad86bd2c29a42390891a32ae658d6c4 (patch)
tree1b40a20756da219dd495f1b67ecea37f8cccf8ce
parentf902811342bb9f72bb11e2658aea14cfe8b04c64 (diff)
Recurse into font nodes and pick up details of italics.
-rw-r--r--src/subtitle_asset.cc19
-rw-r--r--src/subtitle_asset.h8
-rw-r--r--src/xml.cc15
-rw-r--r--src/xml.h2
-rw-r--r--test/tests.cc29
5 files changed, 60 insertions, 13 deletions
diff --git a/src/subtitle_asset.cc b/src/subtitle_asset.cc
index be036856..2b200a2f 100644
--- a/src/subtitle_asset.cc
+++ b/src/subtitle_asset.cc
@@ -51,13 +51,14 @@ void
SubtitleAsset::examine_font_node (shared_ptr<FontNode> font_node, list<shared_ptr<FontNode> >& current_font_nodes)
{
current_font_nodes.push_back (font_node);
-
+
for (list<shared_ptr<SubtitleNode> >::iterator j = font_node->subtitle_nodes.begin(); j != font_node->subtitle_nodes.end(); ++j) {
for (list<shared_ptr<TextNode> >::iterator k = (*j)->text_nodes.begin(); k != (*j)->text_nodes.end(); ++k) {
_subtitles.push_back (
shared_ptr<Subtitle> (
new Subtitle (
font_id_to_name (id_from_font_nodes (current_font_nodes)),
+ italic_from_font_nodes (current_font_nodes),
size_from_font_nodes (current_font_nodes),
(*j)->in,
(*j)->out,
@@ -101,11 +102,25 @@ SubtitleAsset::size_from_font_nodes (list<shared_ptr<FontNode> > const & font_no
}
+bool
+SubtitleAsset::italic_from_font_nodes (list<shared_ptr<FontNode> > const & font_nodes) const
+{
+ for (list<shared_ptr<FontNode> >::const_reverse_iterator i = font_nodes.rbegin(); i != font_nodes.rend(); ++i) {
+ if ((*i)->italic) {
+ return (*i)->italic.get ();
+ }
+ }
+
+ return false;
+
+}
+
FontNode::FontNode (xmlpp::Node const * node)
: XMLNode (node)
{
id = string_attribute ("Id");
size = optional_int64_attribute ("Size");
+ italic = optional_bool_attribute ("Italic");
subtitle_nodes = sub_nodes<SubtitleNode> ("Subtitle");
font_nodes = sub_nodes<FontNode> ("Font");
}
@@ -167,6 +182,7 @@ SubtitleAsset::font_id_to_name (string id) const
Subtitle::Subtitle (
std::string font,
+ bool italic,
int size,
Time in,
Time out,
@@ -174,6 +190,7 @@ Subtitle::Subtitle (
std::string text
)
: _font (font)
+ , _italic (italic)
, _size (size)
, _in (in)
, _out (out)
diff --git a/src/subtitle_asset.h b/src/subtitle_asset.h
index 6a04bed3..04154a45 100644
--- a/src/subtitle_asset.h
+++ b/src/subtitle_asset.h
@@ -53,6 +53,7 @@ public:
std::string id;
int size;
+ boost::optional<bool> italic;
std::list<boost::shared_ptr<SubtitleNode> > subtitle_nodes;
std::list<boost::shared_ptr<FontNode> > font_nodes;
@@ -73,6 +74,7 @@ class Subtitle
public:
Subtitle (
std::string font,
+ bool italic,
int size,
Time in,
Time out,
@@ -84,6 +86,10 @@ public:
return _font;
}
+ bool italic () const {
+ return _italic;
+ }
+
Time in () const {
return _in;
}
@@ -104,6 +110,7 @@ public:
private:
std::string _font;
+ bool _italic;
int _size;
Time _in;
Time _out;
@@ -133,6 +140,7 @@ private:
void examine_font_node (boost::shared_ptr<FontNode> font_node, std::list<boost::shared_ptr<FontNode> >& current_font_nodes);
std::string id_from_font_nodes (std::list<boost::shared_ptr<FontNode> > const & font_nodes) const;
int size_from_font_nodes (std::list<boost::shared_ptr<FontNode> > const & font_nodes) const;
+ bool italic_from_font_nodes (std::list<boost::shared_ptr<FontNode> > const & font_nodes) const;
std::string _subtitle_id;
std::string _movie_title;
diff --git a/src/xml.cc b/src/xml.cc
index 08a43ea9..bc42ebce 100644
--- a/src/xml.cc
+++ b/src/xml.cc
@@ -174,6 +174,21 @@ XMLNode::optional_int64_attribute (string name)
return lexical_cast<int64_t> (s);
}
+optional<bool>
+XMLNode::optional_bool_attribute (string name)
+{
+ string const s = string_attribute (name);
+ if (s.empty ()) {
+ return optional<bool> ();
+ }
+
+ if (s == "1" || s == "yes") {
+ return optional<bool> (true);
+ }
+
+ return optional<bool> (false);
+}
+
void
XMLNode::done ()
{
diff --git a/src/xml.h b/src/xml.h
index 5ff5f614..f1e39b55 100644
--- a/src/xml.h
+++ b/src/xml.h
@@ -6,6 +6,7 @@
#include <stdint.h>
#include <glibmm.h>
#include <boost/shared_ptr.hpp>
+#include <boost/optional.hpp>
#include "types.h"
#include "exceptions.h"
#include "dcp_time.h"
@@ -39,6 +40,7 @@ protected:
std::string string_attribute (std::string);
int64_t int64_attribute (std::string);
int64_t optional_int64_attribute (std::string);
+ boost::optional<bool> optional_bool_attribute (std::string);
std::string content ();
diff --git a/test/tests.cc b/test/tests.cc
index 486db0bd..d717faf4 100644
--- a/test/tests.cc
+++ b/test/tests.cc
@@ -123,6 +123,7 @@ BOOST_AUTO_TEST_CASE (subtitles)
BOOST_CHECK_EQUAL (s.front()->in(), libdcp::Time (0, 0, 5, 198));
BOOST_CHECK_EQUAL (s.front()->out(), libdcp::Time (0, 0, 7, 115));
BOOST_CHECK_EQUAL (s.front()->font(), "Arial");
+ BOOST_CHECK_EQUAL (s.front()->italic(), false);
BOOST_CHECK_EQUAL (s.front()->size_in_pixels(1080), 53);
s = subs.subtitles_at (libdcp::Time (0, 0, 7, 190));
@@ -132,31 +133,35 @@ BOOST_AUTO_TEST_CASE (subtitles)
BOOST_CHECK_EQUAL (s.front()->in(), libdcp::Time (0, 0, 7, 177));
BOOST_CHECK_EQUAL (s.front()->out(), libdcp::Time (0, 0, 11, 31));
BOOST_CHECK_EQUAL (s.front()->font(), "Arial");
+ BOOST_CHECK_EQUAL (s.front()->italic(), true);
BOOST_CHECK_EQUAL (s.front()->size_in_pixels(1080), 53);
BOOST_CHECK_EQUAL (s.back()->text(), "My large wonderbra");
BOOST_CHECK_EQUAL (s.back()->v_position(), 15);
BOOST_CHECK_EQUAL (s.back()->in(), libdcp::Time (0, 0, 7, 177));
BOOST_CHECK_EQUAL (s.back()->out(), libdcp::Time (0, 0, 11, 31));
BOOST_CHECK_EQUAL (s.back()->font(), "Arial");
+ BOOST_CHECK_EQUAL (s.front()->italic(), true);
BOOST_CHECK_EQUAL (s.back()->size_in_pixels(1080), 53);
s = subs.subtitles_at (libdcp::Time (0, 0, 11, 95));
BOOST_CHECK_EQUAL (s.size(), 1);
- BOOST_CHECK_EQUAL (s.front ()->text(), "Once belonged to the Shah");
- BOOST_CHECK_EQUAL (s.front ()->v_position(), 15);
- BOOST_CHECK_EQUAL (s.front ()->in(), libdcp::Time (0, 0, 11, 94));
- BOOST_CHECK_EQUAL (s.front ()->out(), libdcp::Time (0, 0, 13, 63));
- BOOST_CHECK_EQUAL (s.front ()->font(), "Arial");
- BOOST_CHECK_EQUAL (s.front ()->size_in_pixels(1080), 53);
+ BOOST_CHECK_EQUAL (s.front()->text(), "Once belonged to the Shah");
+ BOOST_CHECK_EQUAL (s.front()->v_position(), 15);
+ BOOST_CHECK_EQUAL (s.front()->in(), libdcp::Time (0, 0, 11, 94));
+ BOOST_CHECK_EQUAL (s.front()->out(), libdcp::Time (0, 0, 13, 63));
+ BOOST_CHECK_EQUAL (s.front()->font(), "Arial");
+ BOOST_CHECK_EQUAL (s.front()->italic(), false);
+ BOOST_CHECK_EQUAL (s.front()->size_in_pixels(1080), 53);
s = subs.subtitles_at (libdcp::Time (0, 0, 14, 42));
BOOST_CHECK_EQUAL (s.size(), 1);
- BOOST_CHECK_EQUAL (s.front ()->text(), "And these are Roy Hattersley's jeans");
- BOOST_CHECK_EQUAL (s.front ()->v_position(), 15);
- BOOST_CHECK_EQUAL (s.front ()->in(), libdcp::Time (0, 0, 13, 104));
- BOOST_CHECK_EQUAL (s.front ()->out(), libdcp::Time (0, 0, 15, 177));
- BOOST_CHECK_EQUAL (s.front ()->font(), "Arial");
- BOOST_CHECK_EQUAL (s.front ()->size_in_pixels(1080), 53);
+ BOOST_CHECK_EQUAL (s.front()->text(), "And these are Roy Hattersley's jeans");
+ BOOST_CHECK_EQUAL (s.front()->v_position(), 15);
+ BOOST_CHECK_EQUAL (s.front()->in(), libdcp::Time (0, 0, 13, 104));
+ BOOST_CHECK_EQUAL (s.front()->out(), libdcp::Time (0, 0, 15, 177));
+ BOOST_CHECK_EQUAL (s.front()->font(), "Arial");
+ BOOST_CHECK_EQUAL (s.front()->italic(), false);
+ BOOST_CHECK_EQUAL (s.front()->size_in_pixels(1080), 53);
}
BOOST_AUTO_TEST_CASE (dcp_time)