Allow ContentBitmapText to contain multiple BitmapText objects.
authorCarl Hetherington <cth@carlh.net>
Thu, 28 Apr 2022 11:47:57 +0000 (13:47 +0200)
committerCarl Hetherington <cth@carlh.net>
Thu, 28 Apr 2022 11:47:57 +0000 (13:47 +0200)
src/lib/content_text.h
src/lib/player.cc

index 5edb9af2083be0993339caefa876dc09e3627e7d..fb86bc78637b599b7ff820b583583c0b324c7e2f 100644 (file)
@@ -50,11 +50,11 @@ class ContentBitmapText : public ContentText
 public:
        ContentBitmapText (dcpomatic::ContentTime f, std::shared_ptr<const Image> im, dcpomatic::Rect<double> r)
                : ContentText (f)
-               , sub (im, r)
+               , subs{ {im, r} }
        {}
 
-       /* Our text, with its rectangle unmodified by any offsets or scales that the content specifies */
-       BitmapText sub;
+       /* Our texts, with their rectangles unmodified by any offsets or scales that the content specifies */
+       std::vector<BitmapText> subs;
 };
 
 /** A text caption.  We store the time period separately (as well as in the dcp::SubtitleStrings)
index 981078636bf87764fe172783a371668b7fcbe380..619a3583cbb770e6c5d6f3f2329e4aa0d6e4f43d 100644 (file)
@@ -1104,32 +1104,35 @@ Player::bitmap_text_start (weak_ptr<Piece> weak_piece, weak_ptr<const TextConten
                return;
        }
 
-       /* Apply content's subtitle offsets */
-       subtitle.sub.rectangle.x += content->x_offset ();
-       subtitle.sub.rectangle.y += content->y_offset ();
+       PlayerText ps;
+       for (auto& sub: subtitle.subs)
+       {
+               /* Apply content's subtitle offsets */
+               sub.rectangle.x += content->x_offset ();
+               sub.rectangle.y += content->y_offset ();
 
-       /* Apply a corrective translation to keep the subtitle centred after the scale that is coming up */
-       subtitle.sub.rectangle.x -= subtitle.sub.rectangle.width * ((content->x_scale() - 1) / 2);
-       subtitle.sub.rectangle.y -= subtitle.sub.rectangle.height * ((content->y_scale() - 1) / 2);
+               /* Apply a corrective translation to keep the subtitle centred after the scale that is coming up */
+               sub.rectangle.x -= sub.rectangle.width * ((content->x_scale() - 1) / 2);
+               sub.rectangle.y -= sub.rectangle.height * ((content->y_scale() - 1) / 2);
 
-       /* Apply content's subtitle scale */
-       subtitle.sub.rectangle.width *= content->x_scale ();
-       subtitle.sub.rectangle.height *= content->y_scale ();
+               /* Apply content's subtitle scale */
+               sub.rectangle.width *= content->x_scale ();
+               sub.rectangle.height *= content->y_scale ();
 
-       PlayerText ps;
-       auto image = subtitle.sub.image;
+               auto image = sub.image;
 
-       /* We will scale the subtitle up to fit _video_container_size */
-       int const width = subtitle.sub.rectangle.width * _video_container_size.width;
-       int const height = subtitle.sub.rectangle.height * _video_container_size.height;
-       if (width == 0 || height == 0) {
-               return;
-       }
+               /* We will scale the subtitle up to fit _video_container_size */
+               int const width = sub.rectangle.width * _video_container_size.width;
+               int const height = sub.rectangle.height * _video_container_size.height;
+               if (width == 0 || height == 0) {
+                       return;
+               }
 
-       dcp::Size scaled_size (width, height);
-       ps.bitmap.push_back (BitmapText(image->scale(scaled_size, dcp::YUVToRGB::REC601, image->pixel_format(), Image::Alignment::PADDED, _fast), subtitle.sub.rectangle));
-       DCPTime from (content_time_to_dcp (piece, subtitle.from()));
+               dcp::Size scaled_size (width, height);
+               ps.bitmap.push_back (BitmapText(image->scale(scaled_size, dcp::YUVToRGB::REC601, image->pixel_format(), Image::Alignment::PADDED, _fast), sub.rectangle));
+       }
 
+       DCPTime from(content_time_to_dcp(piece, subtitle.from()));
        _active_texts[static_cast<int>(content->type())].add_from(weak_content, ps, from);
 }