summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2019-05-10 23:22:34 +0100
committerCarl Hetherington <cth@carlh.net>2019-05-10 23:43:55 +0100
commitec1df37a1940063dc0dbc45ad2dab638bdc92c0d (patch)
tree8879c467bdf0d119f4c3edb1956025a6ca578884 /src
parente153d7f5dc128d97160e41bdda3c4e4a05c7140b (diff)
Colour in 'masking' in GL mode.
Diffstat (limited to 'src')
-rw-r--r--src/wx/film_viewer.cc2
-rw-r--r--src/wx/gl_video_view.cc57
-rw-r--r--src/wx/gl_video_view.h2
-rw-r--r--src/wx/simple_video_view.cc2
-rw-r--r--src/wx/simple_video_view.h1
-rw-r--r--src/wx/video_view.h8
6 files changed, 64 insertions, 8 deletions
diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc
index cb12a78e2..7004ff517 100644
--- a/src/wx/film_viewer.cc
+++ b/src/wx/film_viewer.cc
@@ -99,7 +99,7 @@ FilmViewer::FilmViewer (wxWindow* p)
{
switch (Config::instance()->video_view_type()) {
case Config::VIDEO_VIEW_OPENGL:
- _video_view = new GLVideoView (p);
+ _video_view = new GLVideoView (this, p);
break;
case Config::VIDEO_VIEW_SIMPLE:
_video_view = new SimpleVideoView (this, p);
diff --git a/src/wx/gl_video_view.cc b/src/wx/gl_video_view.cc
index b3f036ded..fefc08849 100644
--- a/src/wx/gl_video_view.cc
+++ b/src/wx/gl_video_view.cc
@@ -19,6 +19,7 @@
*/
#include "gl_video_view.h"
+#include "film_viewer.h"
#include "lib/image.h"
#include "lib/dcpomatic_assert.h"
#include "lib/exceptions.h"
@@ -37,7 +38,8 @@ using std::cout;
using boost::shared_ptr;
using boost::optional;
-GLVideoView::GLVideoView (wxWindow *parent)
+GLVideoView::GLVideoView (FilmViewer* viewer, wxWindow *parent)
+ : VideoView (viewer)
{
_canvas = new wxGLCanvas (parent, wxID_ANY, 0, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE);
_context = new wxGLContext (_canvas);
@@ -56,7 +58,7 @@ GLVideoView::~GLVideoView ()
}
static void
-check_gl_error (char const * last)
+ check_gl_error (char const * last)
{
GLenum const e = glGetError ();
if (e != GL_NO_ERROR) {
@@ -92,8 +94,6 @@ GLVideoView::draw ()
check_gl_error ("glClearColor");
glEnable (GL_TEXTURE_2D);
check_gl_error ("glEnable GL_TEXTURE_2D");
- glEnable (GL_COLOR_MATERIAL);
- check_gl_error ("glEnable GL_COLOR_MATERIAL");
glEnable (GL_BLEND);
check_gl_error ("glEnable GL_BLEND");
glDisable (GL_DEPTH_TEST);
@@ -125,6 +125,55 @@ GLVideoView::draw ()
glEnd ();
}
+ glDisable (GL_TEXTURE_2D);
+ check_gl_error ("glDisable GL_TEXTURE_2D");
+
+ dcp::Size const out_size = _viewer->out_size ();
+ wxSize const canvas_size = _canvas->GetSize ();
+
+ if (!_viewer->pad_black() && out_size.width < canvas_size.GetWidth()) {
+ 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());
+ glEnd ();
+ glColor3ub (255, 255, 255);
+ }
+
+ if (!_viewer->pad_black() && out_size.height < canvas_size.GetHeight()) {
+ glColor3ub (240, 240, 240);
+ int const gap = (canvas_size.GetHeight() - out_size.height) / 2;
+ glBegin (GL_QUADS);
+ glVertex2f (0, 0);
+ glVertex2f (canvas_size.GetWidth(), 0);
+ glVertex2f (canvas_size.GetWidth(), 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 (0, 2 * gap + out_size.height + 2);
+ glEnd ();
+ glColor3ub (255, 255, 255);
+ }
+
+ if (_viewer->outline_content()) {
+ glColor3ub (255, 0, 0);
+ glBegin (GL_LINE_LOOP);
+ Position<int> inter_position = _viewer->inter_position ();
+ dcp::Size inter_size = _viewer->inter_size ();
+ 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);
+ glEnd ();
+ glColor3ub (255, 255, 255);
+ }
+
glFlush();
_canvas->SwapBuffers();
}
diff --git a/src/wx/gl_video_view.h b/src/wx/gl_video_view.h
index 54c64e4ea..42a3f89ba 100644
--- a/src/wx/gl_video_view.h
+++ b/src/wx/gl_video_view.h
@@ -30,7 +30,7 @@
class GLVideoView : public VideoView
{
public:
- GLVideoView (wxWindow* parent);
+ GLVideoView (FilmViewer* viewer, wxWindow* parent);
~GLVideoView ();
void set_image (boost::shared_ptr<const Image> image);
diff --git a/src/wx/simple_video_view.cc b/src/wx/simple_video_view.cc
index ef0c96ef2..524106b67 100644
--- a/src/wx/simple_video_view.cc
+++ b/src/wx/simple_video_view.cc
@@ -28,7 +28,7 @@
using std::max;
SimpleVideoView::SimpleVideoView (FilmViewer* viewer, wxWindow* parent)
- : _viewer (viewer)
+ : VideoView (viewer)
{
_panel = new wxPanel (parent);
diff --git a/src/wx/simple_video_view.h b/src/wx/simple_video_view.h
index 40924839f..686a1a1f3 100644
--- a/src/wx/simple_video_view.h
+++ b/src/wx/simple_video_view.h
@@ -41,7 +41,6 @@ public:
private:
void paint ();
- FilmViewer* _viewer;
wxPanel* _panel;
boost::shared_ptr<const Image> _image;
};
diff --git a/src/wx/video_view.h b/src/wx/video_view.h
index 44969ad2d..af6655ec4 100644
--- a/src/wx/video_view.h
+++ b/src/wx/video_view.h
@@ -26,10 +26,15 @@
class Image;
class wxWindow;
+class FilmViewer;
class VideoView
{
public:
+ VideoView (FilmViewer* viewer)
+ : _viewer (viewer)
+ {}
+
virtual ~VideoView () {}
virtual void set_image (boost::shared_ptr<const Image> image) = 0;
@@ -37,6 +42,9 @@ public:
virtual void update () = 0;
boost::signals2::signal<void()> Sized;
+
+protected:
+ FilmViewer* _viewer;
};
#endif