From 4843bf7b6820fe9f027699cf30c41804e714fbac Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 27 Jul 2018 15:19:30 +0100 Subject: [PATCH] Check for long CCAP lines and too many CCAP lines. --- src/lib/hints.cc | 26 +++++++++++++++++++++++--- src/lib/hints.h | 3 +++ src/lib/util.h | 4 ++++ src/wx/closed_captions_dialog.cc | 19 ++++++++----------- src/wx/closed_captions_dialog.h | 2 -- 5 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/lib/hints.cc b/src/lib/hints.cc index 77b10da15..e11312eb0 100644 --- a/src/lib/hints.cc +++ b/src/lib/hints.cc @@ -54,6 +54,8 @@ Hints::Hints (weak_ptr film) : _film (film) , _thread (0) , _long_ccap (false) + , _overlap_ccap (false) + , _too_many_ccap_lines (false) { } @@ -84,6 +86,8 @@ Hints::start () { stop_thread (); _long_ccap = false; + _overlap_ccap = false; + _too_many_ccap_lines = false; _thread = new boost::thread (bind(&Hints::thread, this)); } @@ -283,10 +287,26 @@ Hints::text (PlayerText text, TextType type, DCPTimePeriod period) return; } + int lines = text.text.size(); BOOST_FOREACH (StringText i, text.text) { - if (!_long_ccap && i.text().length() > 30) { - _long_ccap = true; - hint (_("Some of your closed captions have lines longer than 30 characters, so they will probably be word-wrapped.")); + if (i.text().length() > CLOSED_CAPTION_LENGTH) { + ++lines; + if (!_long_ccap) { + _long_ccap = true; + hint (String::compose(_("Some of your closed captions have lines longer than %1 characters, so they will probably be word-wrapped."), CLOSED_CAPTION_LENGTH)); + } } } + + if (!_too_many_ccap_lines && lines > CLOSED_CAPTION_LINES) { + hint (String::compose(_("Some of your closed captions span more than %1 lines, so they will be truncated."), CLOSED_CAPTION_LINES)); + _too_many_ccap_lines = true; + } + + if (!_overlap_ccap && _last && _last->overlap(period)) { + _overlap_ccap = true; + hint (_("You have overlapping closed captions, which is not allowed.")); + } + + _last = period; } diff --git a/src/lib/hints.h b/src/lib/hints.h index ad66fb472..6ee398c88 100644 --- a/src/lib/hints.h +++ b/src/lib/hints.h @@ -52,4 +52,7 @@ private: boost::thread* _thread; bool _long_ccap; + bool _overlap_ccap; + bool _too_many_ccap_lines; + boost::optional _last; }; diff --git a/src/lib/util.h b/src/lib/util.h index 5ca198ebb..d6fddcdda 100644 --- a/src/lib/util.h +++ b/src/lib/util.h @@ -57,6 +57,10 @@ namespace dcp { #define TEXT_FONT_ID "font" /** Largest KDM size (in bytes) that will be accepted */ #define MAX_KDM_SIZE (256 * 1024) +/** Number of lines that closed caption viewers will display */ +#define CLOSED_CAPTION_LINES 3 +/** Maximum line length of closed caption viewers */ +#define CLOSED_CAPTION_LENGTH 30 extern std::string program_name; extern bool is_batch_converter; diff --git a/src/wx/closed_captions_dialog.cc b/src/wx/closed_captions_dialog.cc index 1e13f867a..ea7db88f0 100644 --- a/src/wx/closed_captions_dialog.cc +++ b/src/wx/closed_captions_dialog.cc @@ -29,9 +29,6 @@ using std::make_pair; using boost::shared_ptr; using boost::weak_ptr; -int const ClosedCaptionsDialog::_num_lines = 3; -int const ClosedCaptionsDialog::_num_chars_per_line = 30; - ClosedCaptionsDialog::ClosedCaptionsDialog (wxWindow* parent) : wxDialog (parent, wxID_ANY, _("Closed captions"), wxDefaultPosition, wxDefaultSize, #ifdef DCPOMATIC_OSX @@ -45,7 +42,7 @@ ClosedCaptionsDialog::ClosedCaptionsDialog (wxWindow* parent) ) { - _lines.resize (_num_lines); + _lines.resize (CLOSED_CAPTION_LINES); Bind (wxEVT_PAINT, boost::bind (&ClosedCaptionsDialog::paint, this)); } @@ -58,16 +55,16 @@ ClosedCaptionsDialog::paint () dc.SetTextForeground (*wxWHITE); /* Choose a font which fits vertically */ - int const line_height = max (8, dc.GetSize().GetHeight() / _num_lines); + int const line_height = max (8, dc.GetSize().GetHeight() / CLOSED_CAPTION_LINES); wxFont font (*wxNORMAL_FONT); font.SetPixelSize (wxSize (0, line_height * 0.8)); dc.SetFont (font); - for (int i = 0; i < _num_lines; ++i) { - wxString const good = _lines[i].Left (_num_chars_per_line); + for (int i = 0; i < CLOSED_CAPTION_LINES; ++i) { + wxString const good = _lines[i].Left (CLOSED_CAPTION_LENGTH); dc.DrawText (good, 8, line_height * i); - if (_lines[i].Length() > _num_chars_per_line) { - wxString const bad = _lines[i].Right (_lines[i].Length() - _num_chars_per_line); + if (_lines[i].Length() > CLOSED_CAPTION_LENGTH) { + wxString const bad = _lines[i].Right (_lines[i].Length() - CLOSED_CAPTION_LENGTH); wxSize size = dc.GetTextExtent (good); dc.SetTextForeground (*wxRED); dc.DrawText (bad, 8 + size.GetWidth(), line_height * i); @@ -112,7 +109,7 @@ ClosedCaptionsDialog::update (DCPTime time) } } - for (int j = 0; j < _num_lines; ++j) { + for (int j = 0; j < CLOSED_CAPTION_LINES; ++j) { _lines[j] = ""; } @@ -120,7 +117,7 @@ ClosedCaptionsDialog::update (DCPTime time) list::const_iterator j = to_show.begin(); int k = 0; - while (j != to_show.end() && k < _num_lines) { + while (j != to_show.end() && k < CLOSED_CAPTION_LINES) { _lines[k] = j->text(); ++j; ++k; diff --git a/src/wx/closed_captions_dialog.h b/src/wx/closed_captions_dialog.h index a599bc703..be5b3664d 100644 --- a/src/wx/closed_captions_dialog.h +++ b/src/wx/closed_captions_dialog.h @@ -38,6 +38,4 @@ private: std::vector _lines; boost::weak_ptr _player; - static int const _num_lines; - static int const _num_chars_per_line; }; -- 2.30.2