X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Ffilm_viewer.cc;h=b116c02454167964b091cc74876c47c3a8b9d726;hb=f76453d0b78e5b71abbd9b4fcfda9e8eb0b61ad0;hp=b7e414444f1baa3b55fb274c47445ea2c3bb24e4;hpb=54ef7357a87885ec329a25e758fb6b132816ec67;p=dcpomatic.git diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index b7e414444..b116c0245 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -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 ()); _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; + 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 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 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, ContentTime t) +FilmViewer::seek (shared_ptr content, ContentTime t, bool accurate) { optional 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 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); }