Set up new watermark config.
[dcpomatic.git] / src / wx / film_viewer.cc
index 2d53db9ef5ec8e162f7a7b61e91979ad4e0caed3..0f18f2e722433d382513764362356aa971803c7c 100644 (file)
@@ -91,10 +91,11 @@ 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> ());
 
@@ -311,12 +312,24 @@ 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
+       /* XXX: watermark */
+#endif
 
        if (_out_size.width < _panel_size.width) {
                wxPen p (_panel->GetParent()->GetBackgroundColour());
@@ -331,7 +344,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) {
@@ -405,6 +420,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 ();
@@ -413,7 +434,7 @@ FilmViewer::start ()
        _playing = true;
        _dropped = 0;
        timer ();
-       Started ();
+       Started (position());
 }
 
 bool
@@ -429,25 +450,10 @@ FilmViewer::stop ()
        }
 
        _playing = false;
-       Stopped ();
+       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)
 {
@@ -515,19 +521,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);
        }
 }
 
@@ -551,6 +549,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 ();
@@ -560,11 +566,21 @@ 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_BACKGROUND_IMAGE) {
+               refresh_panel ();
+               return;
+       }
+#endif
+
        if (p != Config::SOUND && p != Config::SOUND_OUTPUT) {
                return;
        }
@@ -696,6 +712,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 ()
 {
@@ -703,11 +720,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);
 }