Untested watermarking.
[dcpomatic.git] / src / wx / film_viewer.cc
index b7e414444f1baa3b55fb274c47445ea2c3bb24e4..b116c02454167964b091cc74876c47c3a8b9d726 100644 (file)
@@ -91,15 +91,17 @@ FilmViewer::FilmViewer (wxWindow* p)
 #endif
 
        _panel->SetBackgroundStyle (wxBG_STYLE_PAINT);
+       _panel->SetBackgroundColour (*wxBLACK);
 
-       _panel->Bind            (wxEVT_PAINT,               boost::bind (&FilmViewer::paint_panel,     this));
-       _panel->Bind            (wxEVT_SIZE,                boost::bind (&FilmViewer::panel_sized,     this, _1));
-       _timer.Bind             (wxEVT_TIMER,               boost::bind (&FilmViewer::timer,           this));
+       _panel->Bind (wxEVT_PAINT, boost::bind (&FilmViewer::paint_panel, this));
+       _panel->Bind (wxEVT_SIZE,  boost::bind (&FilmViewer::panel_sized, this, _1));
+       _timer.Bind  (wxEVT_TIMER, boost::bind (&FilmViewer::timer, this));
 
        set_film (shared_ptr<Film> ());
 
        _config_changed_connection = Config::instance()->Changed.connect (bind (&FilmViewer::config_changed, this, _1));
        config_changed (Config::SOUND_OUTPUT);
+       config_changed (Config::PLAYER_WATERMARK);
 }
 
 FilmViewer::~FilmViewer ()
@@ -116,6 +118,8 @@ FilmViewer::set_film (shared_ptr<Film> film)
 
        _film = film;
 
+       FilmChanged ();
+
        _frame.reset ();
        _closed_captions_dialog->clear ();
 
@@ -309,12 +313,28 @@ FilmViewer::paint_panel ()
 
        if (!_frame || !_film || !_out_size.width || !_out_size.height || _out_size != _frame->size()) {
                dc.Clear ();
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+               optional<boost::filesystem::path> bg = Config::instance()->player_background_image();
+               if (bg) {
+                       wxImage image (std_to_wx(bg->string()));
+                       wxBitmap bitmap (image);
+                       dc.DrawBitmap (bitmap, max(0, (_panel_size.width - image.GetSize().GetWidth()) / 2), max(0, (_panel_size.height - image.GetSize().GetHeight()) / 2));
+               }
+#endif
                return;
        }
 
        wxImage frame (_out_size.width, _out_size.height, _frame->data()[0], true);
        wxBitmap frame_bitmap (frame);
-       dc.DrawBitmap (frame_bitmap, 0, 0);
+       dc.DrawBitmap (frame_bitmap, 0, max(0, (_panel_size.height - _out_size.height) / 2));
+
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+       if (_watermark && (_video_position.get() % 960000) == 0) {
+               int x = rand() % (_panel_size.width - _watermark->GetWidth());
+               int y = rand() % (_panel_size.height - _watermark->GetHeight());
+               dc.DrawBitmap (*_watermark, x, y);
+       }
+#endif
 
        if (_out_size.width < _panel_size.width) {
                wxPen p (_panel->GetParent()->GetBackgroundColour());
@@ -329,7 +349,9 @@ FilmViewer::paint_panel ()
                wxBrush b (_panel->GetParent()->GetBackgroundColour());
                dc.SetPen (p);
                dc.SetBrush (b);
-               dc.DrawRectangle (0, _out_size.height, _panel_size.width, _panel_size.height - _out_size.height);
+               int const gap = (_panel_size.height - _out_size.height) / 2;
+               dc.DrawRectangle (0, 0, _panel_size.width, gap);
+               dc.DrawRectangle (0, gap + _out_size.height, _panel_size.width, gap);
        }
 
        if (_outline_content) {
@@ -403,6 +425,12 @@ FilmViewer::start ()
                return;
        }
 
+       optional<bool> v = PlaybackPermitted ();
+       if (v && !*v) {
+               /* Computer says no */
+               return;
+       }
+
        if (_audio.isStreamOpen()) {
                _audio.setStreamTime (_video_position.seconds());
                _audio.startStream ();
@@ -411,6 +439,7 @@ FilmViewer::start ()
        _playing = true;
        _dropped = 0;
        timer ();
+       Started (position());
 }
 
 bool
@@ -426,24 +455,10 @@ FilmViewer::stop ()
        }
 
        _playing = false;
+       Stopped (position());
        return true;
 }
 
-void
-FilmViewer::go_to (DCPTime t)
-{
-       if (t < DCPTime ()) {
-               t = DCPTime ();
-       }
-
-       if (t >= _film->length ()) {
-               t = _film->length ();
-       }
-
-       seek (t, true);
-       PositionChanged ();
-}
-
 void
 FilmViewer::player_change (ChangeType type, int property, bool frequent)
 {
@@ -511,19 +526,11 @@ FilmViewer::quick_refresh ()
 }
 
 void
-FilmViewer::set_position (DCPTime p)
-{
-       _video_position = p;
-       seek (p, true);
-       PositionChanged ();
-}
-
-void
-FilmViewer::set_position (shared_ptr<Content> content, ContentTime t)
+FilmViewer::seek (shared_ptr<Content> content, ContentTime t, bool accurate)
 {
        optional<DCPTime> dt = _player->content_time_to_dcp (content, t);
        if (dt) {
-               set_position (*dt);
+               seek (*dt, accurate);
        }
 }
 
@@ -547,6 +554,14 @@ FilmViewer::seek (DCPTime t, bool accurate)
                return;
        }
 
+       if (t < DCPTime ()) {
+               t = DCPTime ();
+       }
+
+       if (t >= _film->length ()) {
+               t = _film->length ();
+       }
+
        bool const was_running = stop ();
 
        _closed_captions_dialog->clear ();
@@ -556,11 +571,31 @@ FilmViewer::seek (DCPTime t, bool accurate)
        if (was_running) {
                start ();
        }
+
+       PositionChanged ();
+       Seeked (position());
 }
 
 void
 FilmViewer::config_changed (Config::Property p)
 {
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+       if (p == Config::PLAYER_WATERMARK) {
+               optional<boost::filesystem::path> f = Config::instance()->player_watermark();
+               if (f) {
+                       _watermark = wxBitmap(wxImage(std_to_wx(f->string())));
+               } else {
+                       _watermark = boost::none;
+               }
+               return;
+       }
+
+       if (p == Config::PLAYER_BACKGROUND_IMAGE) {
+               refresh_panel ();
+               return;
+       }
+#endif
+
        if (p != Config::SOUND && p != Config::SOUND_OUTPUT) {
                return;
        }
@@ -692,6 +727,7 @@ FilmViewer::one_video_frame () const
        return DCPTime::from_frames (1, _film->video_frame_rate());
 }
 
+/** Open a dialog box showing our film's closed captions */
 void
 FilmViewer::show_closed_captions ()
 {
@@ -699,11 +735,7 @@ FilmViewer::show_closed_captions ()
 }
 
 void
-FilmViewer::move (DCPTime by)
+FilmViewer::seek_by (DCPTime by, bool accurate)
 {
-       if (!_film) {
-               return;
-       }
-
-       go_to (_video_position + by);
+       seek (_video_position + by, accurate);
 }