diff options
| author | Carl Hetherington <cth@carlh.net> | 2025-03-20 23:43:34 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2025-03-24 01:12:45 +0100 |
| commit | 86ba8bd464c04d622c28b6461386aedcae44d7c6 (patch) | |
| tree | 94a2f743449487d626ad7d8371cb641c4bba6961 | |
| parent | e93b66f4236ec25dbd0603bbe74c904b53180e91 (diff) | |
Basic support for variable-Z 3D subtitles.
| -rw-r--r-- | cscript | 2 | ||||
| -rw-r--r-- | src/lib/config.cc | 4 | ||||
| -rw-r--r-- | src/lib/dcp_text_track.cc | 4 | ||||
| -rw-r--r-- | src/lib/film.cc | 8 | ||||
| -rw-r--r-- | src/lib/reel_writer.cc | 11 | ||||
| -rw-r--r-- | src/lib/subtitle_film_encoder.cc | 2 | ||||
| -rw-r--r-- | src/lib/text_content.cc | 2 | ||||
| -rw-r--r-- | src/lib/text_decoder.cc | 1 | ||||
| -rw-r--r-- | src/lib/util.cc | 4 | ||||
| -rw-r--r-- | src/lib/video_content.cc | 2 | ||||
| -rw-r--r-- | src/wx/closed_captions_dialog.cc | 2 | ||||
| -rw-r--r-- | src/wx/dcp_panel.cc | 2 | ||||
| -rw-r--r-- | src/wx/language_tag_dialog.cc | 2 | ||||
| -rw-r--r-- | src/wx/language_tag_widget.cc | 2 | ||||
| -rw-r--r-- | test/cpl_metadata_test.cc | 4 | ||||
| -rw-r--r-- | test/render_subtitles_test.cc | 6 | ||||
| -rw-r--r-- | test/subtitle_metadata_test.cc | 2 | ||||
| -rw-r--r-- | test/vf_test.cc | 3 |
18 files changed, 36 insertions, 27 deletions
@@ -436,7 +436,7 @@ def build_with_cpp17(target): def dependencies(target, options): - deps = [('libdcp', 'v1.10.15', {'c++17': build_with_cpp17(target)})] + deps = [('libdcp', 'v1.10.16', {'c++17': build_with_cpp17(target)})] deps.append(('libsub', 'v1.6.53')) deps.append(('leqm-nrt', '30dcaea1373ac62fba050e02ce5b0c1085797a23')) deps.append(('rtaudio', 'f619b76')) diff --git a/src/lib/config.cc b/src/lib/config.cc index 49c64e5b6..86bc343da 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -807,7 +807,7 @@ Config::write_config() const cxml::add_text_child(root, "DefaultAudioDelay", fmt::to_string(_default_audio_delay)); if (_default_audio_language) { /* [XML] DefaultAudioLanguage Default audio language to use for new films */ - cxml::add_text_child(root, "DefaultAudioLanguage", _default_audio_language->to_string()); + cxml::add_text_child(root, "DefaultAudioLanguage", _default_audio_language->as_string()); } if (_default_kdm_directory) { /* [XML:opt] DefaultKDMDirectory Default directory to write KDMs to. */ @@ -1111,7 +1111,7 @@ Config::write_config() const _audio_mapping->as_xml(cxml::add_child(root, "AudioMapping")); } for (auto const& i: _custom_languages) { - cxml::add_text_child(root, "CustomLanguage", i.to_string()); + cxml::add_text_child(root, "CustomLanguage", i.as_string()); } for (auto const& initial: _initial_paths) { if (initial.second) { diff --git a/src/lib/dcp_text_track.cc b/src/lib/dcp_text_track.cc index 292932396..ec1d6828b 100644 --- a/src/lib/dcp_text_track.cc +++ b/src/lib/dcp_text_track.cc @@ -50,7 +50,7 @@ DCPTextTrack::DCPTextTrack (string name_, optional<dcp::LanguageTag> language_) string DCPTextTrack::summary () const { - return String::compose("%1 (%2)", name, language ? language->to_string() : _("Unknown")); + return String::compose("%1 (%2)", name, language ? language->as_string() : _("Unknown")); } void @@ -58,7 +58,7 @@ DCPTextTrack::as_xml (xmlpp::Element* parent) const { cxml::add_text_child(parent, "Name", name); if (language) { - cxml::add_text_child(parent, "Language", language->to_string()); + cxml::add_text_child(parent, "Language", language->as_string()); } } diff --git a/src/lib/film.cc b/src/lib/film.cc index 6adc7dff4..5c3b6cee9 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -442,13 +442,13 @@ Film::metadata(bool with_content_paths) const for (auto i: _content_versions) { cxml::add_text_child(root, "ContentVersion", i); } - cxml::add_text_child(root, "NameLanguage", _name_language.to_string()); + cxml::add_text_child(root, "NameLanguage", _name_language.as_string()); cxml::add_text_child(root, "TerritoryType", territory_type_to_string(_territory_type)); if (_release_territory) { cxml::add_text_child(root, "ReleaseTerritory", _release_territory->subtag()); } if (_sign_language_video_language) { - cxml::add_text_child(root, "SignLanguageVideoLanguage", _sign_language_video_language->to_string()); + cxml::add_text_child(root, "SignLanguageVideoLanguage", _sign_language_video_language->as_string()); } cxml::add_text_child(root, "VersionNumber", fmt::to_string(_version_number)); cxml::add_text_child(root, "Status", dcp::status_to_string(_status)); @@ -475,7 +475,7 @@ Film::metadata(bool with_content_paths) const cxml::add_text_child(root, "UserExplicitContainer", _user_explicit_container ? "1" : "0"); cxml::add_text_child(root, "UserExplicitResolution", _user_explicit_resolution ? "1" : "0"); if (_audio_language) { - cxml::add_text_child(root, "AudioLanguage", _audio_language->to_string()); + cxml::add_text_child(root, "AudioLanguage", _audio_language->as_string()); } _playlist->as_xml( cxml::add_child(root, "Playlist"), @@ -1004,7 +1004,7 @@ Film::isdcf_name(bool if_created_now) const auto entry_for_language = [](dcp::LanguageTag const& tag) { /* Look up what we should be using for this tag in the DCNC name */ for (auto const& dcnc: dcp::dcnc_tags()) { - if (tag.to_string() == dcnc.first) { + if (tag.as_string() == dcnc.first) { return dcnc.second; } } diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc index 9037c9ef9..90cd9f26b 100644 --- a/src/lib/reel_writer.cc +++ b/src/lib/reel_writer.cc @@ -801,9 +801,9 @@ ReelWriter::empty_text_asset (TextType type, optional<DCPTextTrack> track, bool auto s = make_shared<dcp::InteropTextAsset>(); s->set_movie_title (film()->name()); if (is_open(type)) { - s->set_language (lang.first ? lang.first->to_string() : "Unknown"); + s->set_language(lang.first ? lang.first->as_string() : "Unknown"); } else if (track->language) { - s->set_language (track->language->to_string()); + s->set_language(track->language->as_string()); } s->set_reel_number(fmt::to_string(_reel_index + 1)); asset = s; @@ -814,7 +814,7 @@ ReelWriter::empty_text_asset (TextType type, optional<DCPTextTrack> track, bool if (is_open(type) && lang.first) { s->set_language (*lang.first); } else if (track && track->language) { - s->set_language (dcp::LanguageTag(track->language->to_string())); + s->set_language(dcp::LanguageTag(track->language->as_string())); } s->set_edit_rate (dcp::Fraction (film()->video_frame_rate(), 1)); s->set_reel_number (_reel_index + 1); @@ -843,6 +843,7 @@ ReelWriter::empty_text_asset (TextType type, optional<DCPTextTrack> track, bool 0.5, dcp::VAlign::CENTER, 0, + vector<dcp::Text::VariableZPosition>(), dcp::Direction::LTR, " ", dcp::Effect::NONE, @@ -958,11 +959,11 @@ ReelWriter::write(PlayerText subs, TextType type, optional<DCPTextTrack> track, for (auto i: subs.bitmap) { asset->add ( - make_shared<dcp::TextImage>( + std::make_shared<dcp::TextImage>( image_as_png(i.image), dcp::Time(period.from.seconds() - _period.from.seconds(), tcr), dcp::Time(period.to.seconds() - _period.from.seconds(), tcr), - i.rectangle.x, dcp::HAlign::LEFT, i.rectangle.y, dcp::VAlign::TOP, 0, + i.rectangle.x, dcp::HAlign::LEFT, i.rectangle.y, dcp::VAlign::TOP, 0, vector<dcp::Text::VariableZPosition>(), dcp::Time(), dcp::Time() ) ); diff --git a/src/lib/subtitle_film_encoder.cc b/src/lib/subtitle_film_encoder.cc index a127ba73f..2de74bc67 100644 --- a/src/lib/subtitle_film_encoder.cc +++ b/src/lib/subtitle_film_encoder.cc @@ -145,7 +145,7 @@ SubtitleFilmEncoder::text(PlayerText subs, TextType type, optional<DCPTextTrack> auto s = make_shared<dcp::InteropTextAsset>(); s->set_movie_title (_film->name()); if (lang.first) { - s->set_language (lang.first->to_string()); + s->set_language(lang.first->as_string()); } s->set_reel_number(fmt::to_string(_reel_index + 1)); _assets[_reel_index].first = s; diff --git a/src/lib/text_content.cc b/src/lib/text_content.cc index 4a333bb76..93dad2639 100644 --- a/src/lib/text_content.cc +++ b/src/lib/text_content.cc @@ -411,7 +411,7 @@ TextContent::as_xml(xmlpp::Element* root) const } if (_language) { auto lang = cxml::add_child(text, "Language"); - lang->add_child_text (_language->to_string()); + lang->add_child_text(_language->as_string()); lang->set_attribute("additional", _language_is_additional ? "1" : "0"); } } diff --git a/src/lib/text_decoder.cc b/src/lib/text_decoder.cc index ab82177f7..52d6c58d3 100644 --- a/src/lib/text_decoder.cc +++ b/src/lib/text_decoder.cc @@ -284,6 +284,7 @@ TextDecoder::emit_plain_start(ContentTime from, sub::Subtitle const & sub_subtit v_position, v_align, 0, + vector<dcp::Text::VariableZPosition>(), dcp::Direction::LTR, remove_invalid_characters_for_xml(block.text), dcp::Effect::NONE, diff --git a/src/lib/util.cc b/src/lib/util.cc index 1e2f7d61f..828c0d9d9 100644 --- a/src/lib/util.cc +++ b/src/lib/util.cc @@ -479,8 +479,8 @@ LIBDCP_ENABLE_WARNINGS /* Render something to fontconfig to create its cache */ vector<StringText> subs; dcp::TextString ss( - optional<string>(), false, false, false, dcp::Colour(), 42, 1, dcp::Time(), dcp::Time(), 0, dcp::HAlign::CENTER, 0, dcp::VAlign::CENTER, 0, dcp::Direction::LTR, - "Hello dolly", dcp::Effect::NONE, dcp::Colour(), dcp::Time(), dcp::Time(), 0, std::vector<dcp::Ruby>() + optional<string>(), false, false, false, dcp::Colour(), 42, 1, dcp::Time(), dcp::Time(), 0, dcp::HAlign::CENTER, 0, dcp::VAlign::CENTER, 0, optional<string>(), + dcp::Direction::LTR, "Hello dolly", dcp::Effect::NONE, dcp::Colour(), dcp::Time(), dcp::Time(), 0, std::vector<dcp::Ruby>() ); subs.push_back(StringText(ss, 0, make_shared<dcpomatic::Font>("foo"), dcp::SubtitleStandard::SMPTE_2014)); render_text(subs, dcp::Size(640, 480), DCPTime(), 24); diff --git a/src/lib/video_content.cc b/src/lib/video_content.cc index 56262cd14..ae13e1eca 100644 --- a/src/lib/video_content.cc +++ b/src/lib/video_content.cc @@ -304,7 +304,7 @@ VideoContent::as_xml(xmlpp::Element* element) const cxml::add_text_child(element, "Range", _range == VideoRange::FULL ? "full" : "video"); _pixel_quanta.as_xml(cxml::add_child(element, "PixelQuanta")); if (_burnt_subtitle_language) { - cxml::add_text_child(element, "BurntSubtitleLanguage", _burnt_subtitle_language->to_string()); + cxml::add_text_child(element, "BurntSubtitleLanguage", _burnt_subtitle_language->as_string()); } } diff --git a/src/wx/closed_captions_dialog.cc b/src/wx/closed_captions_dialog.cc index c8a04993c..b8618c0cd 100644 --- a/src/wx/closed_captions_dialog.cc +++ b/src/wx/closed_captions_dialog.cc @@ -254,7 +254,7 @@ ClosedCaptionsDialog::update_tracks (shared_ptr<const Film> film) _track->Clear (); for (auto const& i: _tracks) { - _track->Append (std_to_wx(String::compose("%1 (%2)", i.name, i.language ? i.language->to_string() : wx_to_std(_("Unknown"))))); + _track->Append(std_to_wx(String::compose("%1 (%2)", i.name, i.language ? i.language->as_string() : wx_to_std(_("Unknown"))))); } if (_track->GetCount() > 0) { diff --git a/src/wx/dcp_panel.cc b/src/wx/dcp_panel.cc index 0f0edc971..aeddb2a8d 100644 --- a/src/wx/dcp_panel.cc +++ b/src/wx/dcp_panel.cc @@ -484,7 +484,7 @@ DCPPanel::film_changed(FilmProperty p) { auto al = _film->audio_language(); checked_set (_enable_audio_language, static_cast<bool>(al)); - checked_set (_audio_language, al ? std_to_wx(al->to_string()) : wxString{}); + checked_set(_audio_language, al ? std_to_wx(al->as_string()) : wxString{}); setup_dcp_name (); setup_sensitivity (); _audio_panel_sizer->Layout(); diff --git a/src/wx/language_tag_dialog.cc b/src/wx/language_tag_dialog.cc index c898d3edb..f5a239c6c 100644 --- a/src/wx/language_tag_dialog.cc +++ b/src/wx/language_tag_dialog.cc @@ -96,7 +96,7 @@ LanguageTagDialog::populate_list () it.SetText (std_to_wx(i.description())); _list->InsertItem (it); it.SetColumn (1); - it.SetText (std_to_wx(i.to_string())); + it.SetText(std_to_wx(i.as_string())); _list->SetItem (it); } }; diff --git a/src/wx/language_tag_widget.cc b/src/wx/language_tag_widget.cc index cefa4b90c..ff2883bc2 100644 --- a/src/wx/language_tag_widget.cc +++ b/src/wx/language_tag_widget.cc @@ -78,7 +78,7 @@ LanguageTagWidget::set (optional<dcp::LanguageTag> tag) { _tag = tag; if (tag) { - checked_set (_language, std_to_wx(tag->to_string())); + checked_set(_language, std_to_wx(tag->as_string())); } else { checked_set(_language, wxString{}); } diff --git a/test/cpl_metadata_test.cc b/test/cpl_metadata_test.cc index 59ceed064..c0a3c658d 100644 --- a/test/cpl_metadata_test.cc +++ b/test/cpl_metadata_test.cc @@ -71,7 +71,7 @@ BOOST_AUTO_TEST_CASE(main_sound_configuration_test_51_vi) BOOST_REQUIRE(msc); /* We think this should say 51 not 71 at the start (#2580) */ - BOOST_CHECK_EQUAL(msc->to_string(), "51/L,R,C,LFE,Ls,Rs,-,VIN"); + BOOST_CHECK_EQUAL(msc->as_string(), "51/L,R,C,LFE,Ls,Rs,-,VIN"); } @@ -117,5 +117,5 @@ BOOST_AUTO_TEST_CASE(main_sound_configuration_test_71) auto msc = cpl->main_sound_configuration(); BOOST_REQUIRE(msc); - BOOST_CHECK_EQUAL(msc->to_string(), "71/L,R,C,LFE,Lss,Rss,-,VIN,-,-,Lrs,Rrs"); + BOOST_CHECK_EQUAL(msc->as_string(), "71/L,R,C,LFE,Lss,Rss,-,VIN,-,-,Lrs,Rrs"); } diff --git a/test/render_subtitles_test.cc b/test/render_subtitles_test.cc index e89890542..1fe43c6d8 100644 --- a/test/render_subtitles_test.cc +++ b/test/render_subtitles_test.cc @@ -37,6 +37,9 @@ using std::make_shared; using std::shared_ptr; +using std::string; +using std::vector; +using boost::optional; static void @@ -59,6 +62,7 @@ add(std::vector<StringText>& s, std::string text, bool italic, bool bold, bool u 1, dcp::VAlign::TOP, 0, + vector<dcp::Text::VariableZPosition>(), dcp::Direction::LTR, text, dcp::Effect::NONE, @@ -133,6 +137,7 @@ BOOST_AUTO_TEST_CASE(render_text_with_newline_test) 0.5, dcp::HAlign::CENTER, 0.5, dcp::VAlign::CENTER, 0.0, + vector<dcp::Text::VariableZPosition>(), dcp::Direction::LTR, "Hello world", dcp::Effect::NONE, dcp::Colour(0, 0, 0), @@ -146,6 +151,7 @@ BOOST_AUTO_TEST_CASE(render_text_with_newline_test) 0.5, dcp::HAlign::CENTER, 0.5, dcp::VAlign::CENTER, 0.0, + vector<dcp::Text::VariableZPosition>(), dcp::Direction::LTR, "\n", dcp::Effect::NONE, dcp::Colour(0, 0, 0), diff --git a/test/subtitle_metadata_test.cc b/test/subtitle_metadata_test.cc index d8b887576..fcea278d7 100644 --- a/test/subtitle_metadata_test.cc +++ b/test/subtitle_metadata_test.cc @@ -50,6 +50,6 @@ BOOST_AUTO_TEST_CASE (subtitle_metadata_test1) auto langs = film->open_text_languages(); BOOST_REQUIRE (langs.first); - BOOST_CHECK_EQUAL (langs.first->to_string(), "de-DE"); + BOOST_CHECK_EQUAL(langs.first->as_string(), "de-DE"); } diff --git a/test/vf_test.cc b/test/vf_test.cc index cb5116910..2b59b68ba 100644 --- a/test/vf_test.cc +++ b/test/vf_test.cc @@ -59,6 +59,7 @@ using std::make_shared; using std::shared_ptr; using std::string; using std::vector; +using boost::optional; using namespace dcpomatic; @@ -465,7 +466,7 @@ BOOST_AUTO_TEST_CASE(test_referencing_ov_with_missing_subtitle_in_some_reels) 42, 1, dcp::Time(0, 0, 5, 0, 24), dcp::Time(0, 0, 9, 0, 24), 0, dcp::HAlign::CENTER, 0, dcp::VAlign::CENTER, - 0, dcp::Direction::LTR, + 0, vector<dcp::Text::VariableZPosition>(), dcp::Direction::LTR, "Hello", dcp::Effect::NONE, dcp::Colour(0, 0, 0), dcp::Time{}, dcp::Time{}, |
