X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fgl_video_view.cc;h=7bf9e3adc6d8e880403a601f5b268c6e21bffeba;hb=924f4edb20d14bc697956254951fb87513cf2e19;hp=076cb49ecedf2ec2a0fccdc13d0cb202c8504c7a;hpb=5ba3832a034eec21b491215f7fb2d0fff55ee7b2;p=dcpomatic.git diff --git a/src/wx/gl_video_view.cc b/src/wx/gl_video_view.cc index 076cb49ec..7bf9e3adc 100644 --- a/src/wx/gl_video_view.cc +++ b/src/wx/gl_video_view.cc @@ -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; @@ -112,20 +122,18 @@ GLVideoView::check_for_butler_errors () } +/** Called from the UI thread */ void GLVideoView::update () { - { - boost::mutex::scoped_lock lm (_canvas_mutex); - if (!_canvas->IsShownOnScreen()) { - return; - } + if (!_canvas->IsShownOnScreen()) { + return; + } #ifdef DCPOMATIC_OSX - /* macOS gives errors if we don't do this (and therefore [NSOpenGLContext setView:]) from the main thread */ - ensure_context (); + /* macOS gives errors if we don't do this (and therefore [NSOpenGLContext setView:]) from the main thread */ + ensure_context (); #endif - } if (!_thread.joinable()) { _thread = boost::thread (boost::bind(&GLVideoView::thread, this)); @@ -160,25 +168,21 @@ GLVideoView::draw (Position 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 +216,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 +249,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); } @@ -256,7 +260,6 @@ DCPOMATIC_ENABLE_WARNINGS glFlush(); check_gl_error ("glFlush"); - boost::mutex::scoped_lock lm (_canvas_mutex); _canvas->SwapBuffers(); } @@ -356,23 +359,21 @@ void GLVideoView::thread () try { - { - boost::mutex::scoped_lock lm (_canvas_mutex); + start_of_thread ("GLVideoView"); #if defined(DCPOMATIC_OSX) - /* Without this we see errors like - * ../src/osx/cocoa/glcanvas.mm(194): assert ""context"" failed in SwapBuffers(): should have current context [in thread 700006970000] - */ - WXGLSetCurrentContext (_context->GetWXGLContext()); + /* Without this we see errors like + * ../src/osx/cocoa/glcanvas.mm(194): assert ""context"" failed in SwapBuffers(): should have current context [in thread 700006970000] + */ + WXGLSetCurrentContext (_context->GetWXGLContext()); #else - /* We must call this here on Linux otherwise we get no image (for reasons - * that aren't clear). However, doing ensure_context() from this thread - * on macOS gives - * "[NSOpenGLContext setView:] must be called from the main thread". - */ - ensure_context (); + /* We must call this here on Linux otherwise we get no image (for reasons + * that aren't clear). However, doing ensure_context() from this thread + * on macOS gives + * "[NSOpenGLContext setView:] must be called from the main thread". + */ + ensure_context (); #endif - } #if defined(DCPOMATIC_LINUX) && defined(DCPOMATIC_HAVE_GLX_SWAP_INTERVAL_EXT) if (_canvas->IsExtensionSupported("GLX_EXT_swap_control")) {