summaryrefslogtreecommitdiff
path: root/src/lib/render_text.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2021-10-25 00:40:30 +0200
committerCarl Hetherington <cth@carlh.net>2021-10-25 10:15:18 +0200
commit500f121343adb67fdbce10a41b1902ccdbbba1e2 (patch)
tree1cab285cda96ff721cfa32ef4a2f47c1a02b08de /src/lib/render_text.cc
parent3a796160854b2bde5ffa743fb35d758e06cc9a7b (diff)
Fix fade factor calculation when there is no end time.
In this case we can't do any fade out.
Diffstat (limited to 'src/lib/render_text.cc')
-rw-r--r--src/lib/render_text.cc23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/lib/render_text.cc b/src/lib/render_text.cc
index bcf04147a..6f7614d36 100644
--- a/src/lib/render_text.cc
+++ b/src/lib/render_text.cc
@@ -244,19 +244,30 @@ calculate_fade_factor (StringText const& first, DCPTime time, int frame_rate)
*/
auto const fade_in_start = DCPTime::from_seconds(first.in().as_seconds()).round(frame_rate);
auto const fade_in_end = fade_in_start + DCPTime::from_seconds (first.fade_up_time().as_seconds ());
- auto const fade_out_end = DCPTime::from_seconds (first.out().as_seconds()).round(frame_rate);
- auto const fade_out_start = fade_out_end - DCPTime::from_seconds (first.fade_down_time().as_seconds ());
if (fade_in_start <= time && time <= fade_in_end && fade_in_start != fade_in_end) {
fade_factor *= DCPTime(time - fade_in_start).seconds() / DCPTime(fade_in_end - fade_in_start).seconds();
}
- if (fade_out_start <= time && time <= fade_out_end && fade_out_start != fade_out_end) {
- fade_factor *= 1 - DCPTime(time - fade_out_start).seconds() / DCPTime(fade_out_end - fade_out_start).seconds();
- }
- if (time < fade_in_start || time > fade_out_end) {
+
+ if (time < fade_in_start) {
fade_factor = 0;
}
+ /* first.out() may be zero if we don't know when this subtitle will finish. We can only think about
+ * fading out if we _do_ know when it will finish.
+ */
+ if (first.out() != dcp::Time()) {
+ auto const fade_out_end = DCPTime::from_seconds (first.out().as_seconds()).round(frame_rate);
+ auto const fade_out_start = fade_out_end - DCPTime::from_seconds(first.fade_down_time().as_seconds());
+
+ if (fade_out_start <= time && time <= fade_out_end && fade_out_start != fade_out_end) {
+ fade_factor *= 1 - DCPTime(time - fade_out_start).seconds() / DCPTime(fade_out_end - fade_out_start).seconds();
+ }
+ if (time > fade_out_end) {
+ fade_factor = 0;
+ }
+ }
+
return fade_factor;
}