Work around deadlock when destroying J2KEncoder with a full writer queue (#2784).
[dcpomatic.git] / src / wx / audio_plot.cc
index 90a4aa91df39b5a5cc468ba8a3850b0b5f4b2ba4..abd538037e5f6e53ff996443dfa283d883406aff 100644 (file)
 
 
 #include "audio_plot.h"
-#include "wx_util.h"
 #include "film_viewer.h"
+#include "wx_util.h"
 #include "lib/audio_decoder.h"
 #include "lib/audio_analysis.h"
 #include "lib/compose.hpp"
+#include "lib/constants.h"
+#include "lib/maths_util.h"
+#include <dcp/warnings.h>
+LIBDCP_DISABLE_WARNINGS
 #include <wx/graphics.h>
+LIBDCP_ENABLE_WARNINGS
 #include <boost/bind/bind.hpp>
-#include <iostream>
 #include <cfloat>
 
 
-using std::cout;
-using std::vector;
 using std::list;
+using std::map;
 using std::max;
 using std::min;
-using std::map;
-using boost::bind;
-using boost::optional;
 using std::shared_ptr;
+using std::vector;
 using std::weak_ptr;
+using boost::bind;
+using boost::optional;
 #if BOOST_VERSION >= 106100
 using namespace boost::placeholders;
 #endif
@@ -52,7 +55,7 @@ int const AudioPlot::_cursor_size = 8;
 int const AudioPlot::max_smoothing = 128;
 
 
-AudioPlot::AudioPlot (wxWindow* parent, weak_ptr<FilmViewer> viewer)
+AudioPlot::AudioPlot(wxWindow* parent, FilmViewer& viewer)
        : wxPanel (parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE)
        , _viewer (viewer)
        , _smoothing (max_smoothing / 2)
@@ -70,7 +73,11 @@ AudioPlot::AudioPlot (wxWindow* parent, weak_ptr<FilmViewer> viewer)
                _type_visible[i] = false;
        }
 
-       _colours.push_back (wxColour (  0,   0,   0));
+       if (gui_is_dark()) {
+               _colours.push_back(wxColour(255, 255, 255));
+       } else {
+               _colours.push_back(wxColour(0, 0, 0));
+       }
        _colours.push_back (wxColour (255,   0,   0));
        _colours.push_back (wxColour (  0, 255,   0));
        _colours.push_back (wxColour (139,   0, 204));
@@ -163,14 +170,14 @@ AudioPlot::paint ()
        gc->SetAntialiasMode (wxANTIALIAS_DEFAULT);
 
        if (!_analysis || _analysis->channels() == 0) {
-               gc->SetFont (gc->CreateFont (*wxNORMAL_FONT));
+               gc->SetFont(gc->CreateFont(*wxNORMAL_FONT, gui_is_dark() ? *wxWHITE : *wxBLACK));
                gc->DrawText (_message, 32, 32);
                delete gc;
                return;
        }
 
        auto h_grid = gc->CreatePath ();
-       gc->SetFont (gc->CreateFont (*wxSMALL_FONT));
+       gc->SetFont(gc->CreateFont(*wxSMALL_FONT, gui_is_dark() ? *wxWHITE : *wxBLACK));
        wxDouble db_label_height;
        wxDouble db_label_descent;
        wxDouble db_label_leading;
@@ -193,7 +200,9 @@ AudioPlot::paint ()
                gc->DrawText (std_to_wx (String::compose ("%1dB", i)), 0, y - (db_label_height / 2));
        }
 
-       gc->SetPen (wxPen (wxColour (200, 200, 200)));
+       wxColour const grid_colour = gui_is_dark() ? wxColour(80, 80, 80) : wxColour(200, 200, 200);
+
+       gc->SetPen(wxPen(grid_colour));
        gc->StrokePath (h_grid);
 
        /* Draw an x axis with marks */
@@ -203,8 +212,6 @@ AudioPlot::paint ()
        DCPOMATIC_ASSERT (_analysis->samples_per_point() != 0.0);
        double const pps = _analysis->sample_rate() * metrics.x_scale / _analysis->samples_per_point();
 
-       gc->SetPen (*wxThePenList->FindOrCreatePen (wxColour (0, 0, 0), 1, wxPENSTYLE_SOLID));
-
        double const mark_interval = calculate_mark_interval (rint (128 / pps));
 
        auto t = DCPTime::from_seconds (mark_interval);
@@ -232,7 +239,7 @@ AudioPlot::paint ()
                t += DCPTime::from_seconds (mark_interval);
        }
 
-       gc->SetPen (wxPen (wxColour (200, 200, 200)));
+       gc->SetPen(wxPen(grid_colour));
        gc->StrokePath (v_grid);
 
        if (_type_visible[AudioPoint::PEAK]) {
@@ -263,7 +270,7 @@ AudioPlot::paint ()
        axes.MoveToPoint (metrics.db_label_width, 0);
        axes.AddLineToPoint (metrics.db_label_width, metrics.height - metrics.y_origin);
        axes.AddLineToPoint (metrics.db_label_width + data_width, metrics.height - metrics.y_origin);
-       gc->SetPen (wxPen (wxColour (0, 0, 0)));
+       gc->SetPen(wxPen(grid_colour));
        gc->StrokePath (axes);
 
        if (_cursor) {
@@ -443,9 +450,7 @@ void
 AudioPlot::left_down ()
 {
        if (_cursor) {
-               if (auto fv = _viewer.lock()) {
-                       fv->seek (_cursor->time, true);
-               }
+               _viewer.seek(_cursor->time, true);
        }
 }