+ if (trim_start() != dcpomatic::ContentTime()) {
+ /// TRANSLATORS: this string will follow "Cannot reference this DCP: "
+ why_not = _("it has a start trim so its subtitles or closed captions must be re-written.");
+ return false;
+ }
+
+ /// TRANSLATORS: this string will follow "Cannot reference this DCP: "
+ return can_reference (film, bind (&check_text, _1), _("it overlaps other text content; remove the other content."), why_not);
+}
+
+void
+DCPContent::take_settings_from (shared_ptr<const Content> c)
+{
+ auto dc = dynamic_pointer_cast<const DCPContent>(c);
+ if (!dc) {
+ return;
+ }
+
+ _reference_video = dc->_reference_video;
+ _reference_audio = dc->_reference_audio;
+ for (int i = 0; i < static_cast<int>(TextType::COUNT); ++i) {
+ _reference_text[i] = dc->_reference_text[i];
+ }
+}
+
+void
+DCPContent::set_cpl (string id)
+{
+ ContentChangeSignaller cc (this, DCPContentProperty::CPL);
+
+ {
+ boost::mutex::scoped_lock lm (_mutex);
+ _cpl = id;
+ }
+}
+
+bool
+DCPContent::kdm_timing_window_valid () const
+{
+ if (!_kdm) {
+ return true;
+ }
+
+ dcp::LocalTime now;
+ return _kdm->not_valid_before() < now && now < _kdm->not_valid_after();
+}
+
+
+Resolution
+DCPContent::resolution () const
+{
+ if (video->size().width > 2048 || video->size().height > 1080) {
+ return Resolution::FOUR_K;
+ }
+
+ return Resolution::TWO_K;
+}
+
+
+void
+add_fonts_from_examiner(shared_ptr<TextContent> text, vector<vector<shared_ptr<Font>>> const & all_fonts)
+{
+ int reel_number = 0;
+ for (auto reel_fonts: all_fonts) {
+ for (auto font: reel_fonts) {
+ /* Each reel could have its own font with the same ID, so we disambiguate them here
+ * by prepending the reel number. We do the same disambiguation when emitting the
+ * subtitles in the DCP decoder.
+ */
+ font->set_id(id_for_font_in_reel(font->id(), reel_number));
+ text->add_font(font);
+ }
+ ++reel_number;
+ }
+