Make the GL thread access the canvas size in a less ridiculous way.
authorCarl Hetherington <cth@carlh.net>
Thu, 22 Apr 2021 23:09:38 +0000 (01:09 +0200)
committerCarl Hetherington <cth@carlh.net>
Thu, 22 Apr 2021 23:09:38 +0000 (01:09 +0200)
src/wx/gl_video_view.cc
src/wx/gl_video_view.h

index ad0ff38a741027bf57fc5de81762742a7a54f0a9..bda3a58ec38a4a570c1208e28fef4ac8ed7c4bf4 100644 (file)
@@ -76,13 +76,23 @@ GLVideoView::GLVideoView (FilmViewer* viewer, wxWindow *parent)
 {
        _canvas = new wxGLCanvas (parent, wxID_ANY, 0, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE);
        _canvas->Bind (wxEVT_PAINT, boost::bind(&GLVideoView::update, this));
-       _canvas->Bind (wxEVT_SIZE, boost::bind(boost::ref(Sized)));
+       _canvas->Bind (wxEVT_SIZE, boost::bind(&GLVideoView::size_changed, this, _1));
 
        _canvas->Bind (wxEVT_TIMER, boost::bind(&GLVideoView::check_for_butler_errors, this));
        _timer.reset (new wxTimer(_canvas));
        _timer->Start (2000);
 }
 
+
+void
+GLVideoView::size_changed (wxSizeEvent const& ev)
+{
+       _canvas_size = ev.GetSize ();
+       Sized ();
+}
+
+
+
 GLVideoView::~GLVideoView ()
 {
        boost::this_thread::disable_interruption dis;
@@ -160,25 +170,21 @@ GLVideoView::draw (Position<int> inter_position, dcp::Size inter_size)
        check_gl_error ("glDisable GL_DEPTH_TEST");
        glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
-       wxSize canvas_size;
-       {
-               boost::mutex::scoped_lock lm (_canvas_mutex);
-               if (_canvas) {
-                       canvas_size = _canvas->GetSize ();
-               }
-       }
+       auto const size = _canvas_size.load();
+       int const width = size.GetWidth();
+       int const height = size.GetHeight();
 
-       if (canvas_size.GetWidth() < 64 || canvas_size.GetHeight() < 0) {
+       if (width < 64 || height < 0) {
                return;
        }
 
-       glViewport (0, 0, canvas_size.GetWidth(), canvas_size.GetHeight());
+       glViewport (0, 0, width, height);
        check_gl_error ("glViewport");
        glMatrixMode (GL_PROJECTION);
        glLoadIdentity ();
 
 DCPOMATIC_DISABLE_WARNINGS
-       gluOrtho2D (0, canvas_size.GetWidth(), canvas_size.GetHeight(), 0);
+       gluOrtho2D (0, width, height, 0);
 DCPOMATIC_ENABLE_WARNINGS
        check_gl_error ("gluOrtho2d");
        glMatrixMode (GL_MODELVIEW);
@@ -212,31 +218,31 @@ DCPOMATIC_ENABLE_WARNINGS
                glEnd ();
        }
 
-       if (!_viewer->pad_black() && out_size.width < canvas_size.GetWidth()) {
+       if (!_viewer->pad_black() && out_size.width < width) {
                glBegin (GL_QUADS);
                /* XXX: these colours are right for GNOME; may need adjusting for other OS */
                glColor3ub (240, 240, 240);
                glVertex2f (out_size.width, 0);
-               glVertex2f (canvas_size.GetWidth(), 0);
-               glVertex2f (canvas_size.GetWidth(), canvas_size.GetHeight());
-               glVertex2f (out_size.width, canvas_size.GetHeight());
+               glVertex2f (width, 0);
+               glVertex2f (width, height);
+               glVertex2f (out_size.width, height);
                glEnd ();
                glColor3ub (255, 255, 255);
        }
 
-       if (!_viewer->pad_black() && out_size.height < canvas_size.GetHeight()) {
+       if (!_viewer->pad_black() && out_size.height < height) {
                glColor3ub (240, 240, 240);
-               int const gap = (canvas_size.GetHeight() - out_size.height) / 2;
+               int const gap = (height - out_size.height) / 2;
                glBegin (GL_QUADS);
                glVertex2f (0, 0);
-               glVertex2f (canvas_size.GetWidth(), 0);
-               glVertex2f (canvas_size.GetWidth(), gap);
+               glVertex2f (width, 0);
+               glVertex2f (width, gap);
                glVertex2f (0, gap);
                glEnd ();
                glBegin (GL_QUADS);
                glVertex2f (0, gap + out_size.height + 1);
-               glVertex2f (canvas_size.GetWidth(), gap + out_size.height + 1);
-               glVertex2f (canvas_size.GetWidth(), 2 * gap + out_size.height + 2);
+               glVertex2f (width, gap + out_size.height + 1);
+               glVertex2f (width, 2 * gap + out_size.height + 2);
                glVertex2f (0, 2 * gap + out_size.height + 2);
                glEnd ();
                glColor3ub (255, 255, 255);
@@ -245,10 +251,10 @@ DCPOMATIC_ENABLE_WARNINGS
        if (_viewer->outline_content()) {
                glColor3ub (255, 0, 0);
                glBegin (GL_LINE_LOOP);
-               glVertex2f (inter_position.x, inter_position.y + (canvas_size.GetHeight() - out_size.height) / 2);
-               glVertex2f (inter_position.x + inter_size.width, inter_position.y + (canvas_size.GetHeight() - out_size.height) / 2);
-               glVertex2f (inter_position.x + inter_size.width, inter_position.y + (canvas_size.GetHeight() - out_size.height) / 2 + inter_size.height);
-               glVertex2f (inter_position.x, inter_position.y + (canvas_size.GetHeight() - out_size.height) / 2 + inter_size.height);
+               glVertex2f (inter_position.x, inter_position.y + (height - out_size.height) / 2);
+               glVertex2f (inter_position.x + inter_size.width, inter_position.y + (height - out_size.height) / 2);
+               glVertex2f (inter_position.x + inter_size.width, inter_position.y + (height - out_size.height) / 2 + inter_size.height);
+               glVertex2f (inter_position.x, inter_position.y + (height - out_size.height) / 2 + inter_size.height);
                glEnd ();
                glColor3ub (255, 255, 255);
        }
index 1e6886f26cd4e91b032558f03d5acd3e486980c1..4601eb02de00ce0370f19f9c9cf7fbc2042ccca1 100644 (file)
@@ -62,6 +62,7 @@ private:
        void request_one_shot ();
        void check_for_butler_errors ();
        void ensure_context ();
+       void size_changed (wxSizeEvent const &);
 
        /* Mutex for use of _canvas; it's only contended when our ::thread
           is started up so this may be overkill.
@@ -70,6 +71,8 @@ private:
        wxGLCanvas* _canvas;
        wxGLContext* _context;
 
+       boost::atomic<wxSize> _canvas_size;
+
        GLuint _id;
        boost::optional<dcp::Size> _size;
        bool _have_storage;