From ed8491f8c5710ad8901021a12c3b187e29201f71 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 16 Dec 2014 11:16:48 +0000 Subject: [PATCH] Save and load subtitle font details. --- src/lib/font.cc | 45 +++++++++++++++++++++++++++++++++++++ src/lib/font.h | 9 ++++++++ src/lib/subtitle_content.cc | 32 ++++++++++++++++++++++++++ src/lib/wscript | 1 + 4 files changed, 87 insertions(+) create mode 100644 src/lib/font.cc diff --git a/src/lib/font.cc b/src/lib/font.cc new file mode 100644 index 000000000..bf7a79a3d --- /dev/null +++ b/src/lib/font.cc @@ -0,0 +1,45 @@ +/* + Copyright (C) 2014 Carl Hetherington + + 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 + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "font.h" +#include + +Font::Font (cxml::NodePtr node) +{ + id = node->optional_string_child ("Id"); + file = node->optional_string_child ("File"); +} + +void +Font::as_xml (xmlpp::Node* node) +{ + if (id) { + node->add_child("Id")->add_child_text (id.get ()); + } + + if (file) { + node->add_child("File")->add_child_text (file.get().string ()); + } +} + +bool +operator!= (Font const & a, Font const & b) +{ + return (a.id != b.id || a.file != b.file); +} diff --git a/src/lib/font.h b/src/lib/font.h index 59d983277..7a26eefc9 100644 --- a/src/lib/font.h +++ b/src/lib/font.h @@ -17,6 +17,7 @@ */ +#include #include #include #include @@ -25,10 +26,18 @@ class Font { public: Font () {} + Font (std::string id_) : id (id_) {} + + Font (cxml::NodePtr node); + + void as_xml (xmlpp::Node* node); /** Font ID, or empty for the default font */ boost::optional id; boost::optional file; }; + +bool +operator!= (Font const & a, Font const & b); diff --git a/src/lib/subtitle_content.cc b/src/lib/subtitle_content.cc index f6bceb753..6f9bdf3a4 100644 --- a/src/lib/subtitle_content.cc +++ b/src/lib/subtitle_content.cc @@ -23,12 +23,14 @@ #include "util.h" #include "exceptions.h" #include "safe_stringstream.h" +#include "font.h" #include "i18n.h" using std::string; using std::vector; using std::cout; +using std::list; using boost::shared_ptr; using boost::dynamic_pointer_cast; using dcp::raw_convert; @@ -92,6 +94,11 @@ SubtitleContent::SubtitleContent (shared_ptr f, cxml::ConstNodePtr n } _subtitle_language = node->optional_string_child ("SubtitleLanguage").get_value_or (""); + + list fonts = node->node_children ("Font"); + for (list::const_iterator i = fonts.begin(); i != fonts.end(); ++i) { + _fonts.push_back (shared_ptr (new Font (*i))); + } } SubtitleContent::SubtitleContent (shared_ptr f, vector > c) @@ -99,6 +106,7 @@ SubtitleContent::SubtitleContent (shared_ptr f, vector ref = dynamic_pointer_cast (c[0]); assert (ref); + list > ref_fonts = ref->fonts (); for (size_t i = 0; i < c.size(); ++i) { shared_ptr sc = dynamic_pointer_cast (c[i]); @@ -122,6 +130,22 @@ SubtitleContent::SubtitleContent (shared_ptr f, vectorsubtitle_y_scale() != ref->subtitle_y_scale()) { throw JoinError (_("Content to be joined must have the same subtitle Y scale.")); } + + list > fonts = sc->fonts (); + if (fonts.size() != ref_fonts.size()) { + throw JoinError (_("Content to be joined must use the same fonts.")); + } + + list >::const_iterator j = ref_fonts.begin (); + list >::const_iterator k = fonts.begin (); + + while (j != ref_fonts.end ()) { + if (**j != **k) { + throw JoinError (_("Content to be joined must use the same fonts.")); + } + ++j; + ++k; + } } _use_subtitles = ref->use_subtitles (); @@ -130,17 +154,25 @@ SubtitleContent::SubtitleContent (shared_ptr f, vectorsubtitle_x_scale (); _subtitle_y_scale = ref->subtitle_y_scale (); _subtitle_language = ref->subtitle_language (); + _fonts = ref_fonts; } +/** _mutex must not be held on entry */ void SubtitleContent::as_xml (xmlpp::Node* root) const { + boost::mutex::scoped_lock lm (_mutex); + root->add_child("UseSubtitles")->add_child_text (raw_convert (_use_subtitles)); root->add_child("SubtitleXOffset")->add_child_text (raw_convert (_subtitle_x_offset)); root->add_child("SubtitleYOffset")->add_child_text (raw_convert (_subtitle_y_offset)); root->add_child("SubtitleXScale")->add_child_text (raw_convert (_subtitle_x_scale)); root->add_child("SubtitleYScale")->add_child_text (raw_convert (_subtitle_y_scale)); root->add_child("SubtitleLanguage")->add_child_text (_subtitle_language); + + for (list >::const_iterator i = _fonts.begin(); i != _fonts.end(); ++i) { + (*i)->as_xml (root->add_child("Font")); + } } void diff --git a/src/lib/wscript b/src/lib/wscript index 7edd5dcdf..ca6a49375 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -42,6 +42,7 @@ sources = """ ffmpeg_subtitle_stream.cc film.cc filter.cc + font.cc frame_rate_change.cc internet.cc image.cc -- 2.30.2