Colour in 'masking' in GL mode.
[dcpomatic.git] / src / wx / simple_video_view.cc
index 3cc14625ea1876f6566d077180e3ab602a756f3b..524106b6769fd2f7be9b89647d3439d86fbb94e0 100644 (file)
 
 */
 
-SimpleVideoView::SimpleVideoView (wxWindow* parent)
+#include "simple_video_view.h"
+#include "film_viewer.h"
+#include "lib/image.h"
+#include <dcp/util.h>
+#include <wx/wx.h>
+#include <boost/bind.hpp>
+
+using std::max;
+
+SimpleVideoView::SimpleVideoView (FilmViewer* viewer, wxWindow* parent)
+       : VideoView (viewer)
 {
        _panel = new wxPanel (parent);
 
@@ -30,6 +40,7 @@ SimpleVideoView::SimpleVideoView (wxWindow* parent)
        _panel->SetBackgroundColour (*wxBLACK);
 
        _panel->Bind (wxEVT_PAINT, boost::bind (&SimpleVideoView::paint, this));
+       _panel->Bind (wxEVT_SIZE, boost::bind(boost::ref(Sized)));
 }
 
 void
@@ -38,23 +49,26 @@ SimpleVideoView::paint ()
        wxPaintDC dc (_panel);
 
 #ifdef DCPOMATIC_VARIANT_SWAROOP
-       if (_background_image) {
+       if (viewer->background_image()) {
                dc.Clear ();
                maybe_draw_background_image (dc);
-               _state_timer.unset ();
                return;
        }
 #endif
 
-       if (!_out_size.width || !_out_size.height || !_film || !_frame || _out_size != _frame->size()) {
+       dcp::Size const out_size = _viewer->out_size ();
+       wxSize const panel_size = _panel->GetSize ();
+
+       if (!out_size.width || !out_size.height || !_image || out_size != _image->size()) {
                dc.Clear ();
        } else {
 
-               wxImage frame (_out_size.width, _out_size.height, _frame->data()[0], true);
+               wxImage frame (out_size.width, out_size.height, _image->data()[0], true);
                wxBitmap frame_bitmap (frame);
-               dc.DrawBitmap (frame_bitmap, 0, max(0, (_panel_size.height - _out_size.height) / 2));
+               dc.DrawBitmap (frame_bitmap, 0, max(0, (panel_size.GetHeight() - out_size.height) / 2));
 
 #ifdef DCPOMATIC_VARIANT_SWAROOP
+               XXX
                DCPTime const period = DCPTime::from_seconds(Config::instance()->player_watermark_period() * 60);
                int64_t n = _video_position.get() / period.get();
                DCPTime from(n * period.get());
@@ -76,29 +90,38 @@ SimpleVideoView::paint ()
 #endif
        }
 
-       if (_out_size.width < _panel_size.width) {
+       if (out_size.width < panel_size.GetWidth()) {
                /* XXX: these colours are right for GNOME; may need adjusting for other OS */
-               wxPen   p (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240));
-               wxBrush b (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240));
+               wxPen   p (_viewer->pad_black() ? wxColour(0, 0, 0) : wxColour(240, 240, 240));
+               wxBrush b (_viewer->pad_black() ? wxColour(0, 0, 0) : wxColour(240, 240, 240));
                dc.SetPen (p);
                dc.SetBrush (b);
-               dc.DrawRectangle (_out_size.width, 0, _panel_size.width - _out_size.width, _panel_size.height);
+               dc.DrawRectangle (out_size.width, 0, panel_size.GetWidth() - out_size.width, panel_size.GetHeight());
        }
 
-       if (_out_size.height < _panel_size.height) {
-               wxPen   p (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240));
-               wxBrush b (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240));
+       if (out_size.height < panel_size.GetHeight()) {
+               wxPen   p (_viewer->pad_black() ? wxColour(0, 0, 0) : wxColour(240, 240, 240));
+               wxBrush b (_viewer->pad_black() ? wxColour(0, 0, 0) : wxColour(240, 240, 240));
                dc.SetPen (p);
                dc.SetBrush (b);
-               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 + 1, _panel_size.width, gap + 1);
+               int const gap = (panel_size.GetHeight() - out_size.height) / 2;
+               dc.DrawRectangle (0, 0, panel_size.GetWidth(), gap);
+               dc.DrawRectangle (0, gap + out_size.height + 1, panel_size.GetWidth(), gap + 1);
        }
 
-       if (_outline_content) {
+       if (_viewer->outline_content()) {
+               Position<int> inter_position = _viewer->inter_position ();
+               dcp::Size inter_size = _viewer->inter_size ();
                wxPen p (wxColour (255, 0, 0), 2);
                dc.SetPen (p);
                dc.SetBrush (*wxTRANSPARENT_BRUSH);
-               dc.DrawRectangle (_inter_position.x, _inter_position.y + (_panel_size.height - _out_size.height) / 2, _inter_size.width, _inter_size.height);
+               dc.DrawRectangle (inter_position.x, inter_position.y + (panel_size.GetHeight() - out_size.height) / 2, inter_size.width, inter_size.height);
        }
 }
+
+void
+SimpleVideoView::update ()
+{
+       _panel->Refresh ();
+       _panel->Update ();
+}