Fix update on drag with GL canvas.
[dcpomatic.git] / src / wx / film_viewer.cc
index 8ed566bfcbd5ce39abcfa836c25797128e38de87..cb12a78e2fc797266b973e7d8b65ea2788dc8cd6 100644 (file)
@@ -28,6 +28,7 @@
 #include "wx_util.h"
 #include "closed_captions_dialog.h"
 #include "gl_video_view.h"
+#include "simple_video_view.h"
 #include "lib/film.h"
 #include "lib/ratio.h"
 #include "lib/util.h"
@@ -78,9 +79,7 @@ rtaudio_callback (void* out, void *, unsigned int frames, double, RtAudioStreamS
 }
 
 FilmViewer::FilmViewer (wxWindow* p)
-       /* XXX: make this configurable */
-       : _video_view (new GLVideoView(p))
-       , _coalesce_player_changes (false)
+       : _coalesce_player_changes (false)
        , _audio (DCPOMATIC_RTAUDIO_API)
        , _audio_channels (0)
        , _audio_block_size (1024)
@@ -98,9 +97,17 @@ FilmViewer::FilmViewer (wxWindow* p)
        , _state_timer ("viewer")
        , _gets (0)
 {
-       /* XXX: maybe this should be proxied through the VideoView */
-       _video_view->get()->Bind (wxEVT_SIZE, boost::bind (&FilmViewer::video_view_sized, this));
-       _timer.Bind  (wxEVT_TIMER, boost::bind (&FilmViewer::timer, this));
+       switch (Config::instance()->video_view_type()) {
+       case Config::VIDEO_VIEW_OPENGL:
+               _video_view = new GLVideoView (p);
+               break;
+       case Config::VIDEO_VIEW_SIMPLE:
+               _video_view = new SimpleVideoView (this, p);
+               break;
+       }
+
+       _video_view->Sized.connect (boost::bind(&FilmViewer::video_view_sized, this));
+       _timer.Bind (wxEVT_TIMER, boost::bind(&FilmViewer::timer, this));
 
        set_film (shared_ptr<Film> ());
 
@@ -125,14 +132,13 @@ FilmViewer::set_film (shared_ptr<Film> film)
        _player_video.first.reset ();
        _player_video.second = DCPTime ();
 
-       _frame.reset ();
+       _video_view->set_image (shared_ptr<Image>());
        _closed_captions_dialog->clear ();
 
        if (!_film) {
                _player.reset ();
                recreate_butler ();
-               _frame.reset ();
-               refresh_panel ();
+               refresh_view ();
                return;
        }
 
@@ -207,11 +213,10 @@ FilmViewer::recreate_butler ()
 }
 
 void
-FilmViewer::refresh_panel ()
+FilmViewer::refresh_view ()
 {
-       _state_timer.set ("refresh-panel");
-       _video_view->get()->Refresh ();
-       _video_view->get()->Update ();
+       _state_timer.set ("update-view");
+       _video_view->update ();
        _state_timer.unset ();
 }
 
@@ -244,8 +249,8 @@ void
 FilmViewer::display_player_video ()
 {
        if (!_player_video.first) {
-               _frame.reset ();
-               refresh_panel ();
+               _video_view->set_image (shared_ptr<Image>());
+               refresh_view ();
                return;
        }
 
@@ -278,9 +283,9 @@ FilmViewer::display_player_video ()
 
        _state_timer.set ("get image");
 
-       /* XXX: do we need to store _frame? */
-       _frame = _player_video.first->image (bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), false, true);
-       _video_view->set_image (_frame);
+       _video_view->set_image (
+               _player_video.first->image(bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), false, true)
+               );
 
        _state_timer.set ("ImageChanged");
        ImageChanged (_player_video.first);
@@ -290,7 +295,7 @@ FilmViewer::display_player_video ()
        _inter_position = _player_video.first->inter_position ();
        _inter_size = _player_video.first->inter_size ();
 
-       refresh_panel ();
+       refresh_view ();
 
        _closed_captions_dialog->update (time());
 }
@@ -346,7 +351,7 @@ void
 FilmViewer::set_outline_content (bool o)
 {
        _outline_content = o;
-       refresh_panel ();
+       refresh_view ();
 }
 
 void
@@ -561,7 +566,7 @@ FilmViewer::config_changed (Config::Property p)
 {
 #ifdef DCPOMATIC_VARIANT_SWAROOP
        if (p == Config::PLAYER_BACKGROUND_IMAGE) {
-               refresh_panel ();
+               refresh_view ();
                return;
        }
 #endif