Reduce during J2K decode where possible for playback (#986).
[dcpomatic.git] / src / wx / colour_conversion_editor.cc
index 19ebc90d5173b919af1948ba7b460c51f295d420..d3762b731572b8cd3c628da8108d7a6311589191 100644 (file)
 
 */
 
-#include "lib/colour_conversion.h"
-#include "lib/safe_stringstream.h"
-#include "lib/raw_convert.h"
 #include "wx_util.h"
 #include "colour_conversion_editor.h"
+#include "lib/colour_conversion.h"
+#include <dcp/locale_convert.h>
 #include <dcp/gamma_transfer_function.h>
 #include <dcp/modified_gamma_transfer_function.h>
 #include <wx/spinctrl.h>
 #include <wx/gbsizer.h>
-#include <boost/make_shared.hpp>
 #include <iostream>
 
 using std::string;
 using std::cout;
 using boost::shared_ptr;
-using boost::make_shared;
 using boost::dynamic_pointer_cast;
+using dcp::locale_convert;
 
 ColourConversionEditor::ColourConversionEditor (wxWindow* parent, bool yuv)
        : wxPanel (parent, wxID_ANY)
@@ -195,24 +193,24 @@ ColourConversionEditor::ColourConversionEditor (wxWindow* parent, bool yuv)
        _input_power->SetDigits (6);
        _input_power->SetIncrement (0.1);
 
-       _input_gamma->Bind (wxEVT_COMMAND_SPINCTRLDOUBLE_UPDATED, boost::bind (&ColourConversionEditor::changed, this, _input_gamma));
-       _input_gamma_linearised->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&ColourConversionEditor::changed, this));
-       _input_power->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ColourConversionEditor::changed, this));
-       _input_threshold->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ColourConversionEditor::changed, this));
-       _input_A->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ColourConversionEditor::changed, this));
-       _input_B->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ColourConversionEditor::changed, this));
-       _red_x->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ColourConversionEditor::chromaticity_changed, this));
-       _red_y->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ColourConversionEditor::chromaticity_changed, this));
-       _green_x->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ColourConversionEditor::chromaticity_changed, this));
-       _green_y->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ColourConversionEditor::chromaticity_changed, this));
-       _blue_x->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ColourConversionEditor::chromaticity_changed, this));
-       _blue_y->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ColourConversionEditor::chromaticity_changed, this));
-       _white_x->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ColourConversionEditor::chromaticity_changed, this));
-       _white_y->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ColourConversionEditor::chromaticity_changed, this));
-       _adjust_white->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&ColourConversionEditor::adjusted_white_changed, this));
-       _adjusted_white_x->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ColourConversionEditor::adjusted_white_changed, this));
-       _adjusted_white_y->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ColourConversionEditor::adjusted_white_changed, this));
-       _yuv_to_rgb->Bind (wxEVT_COMMAND_CHOICE_SELECTED, boost::bind (&ColourConversionEditor::changed, this));
+       _input_gamma->Bind (wxEVT_SPINCTRLDOUBLE, boost::bind (&ColourConversionEditor::changed, this, _input_gamma));
+       _input_gamma_linearised->Bind (wxEVT_CHECKBOX, boost::bind (&ColourConversionEditor::changed, this));
+       _input_power->Bind (wxEVT_TEXT, boost::bind (&ColourConversionEditor::changed, this));
+       _input_threshold->Bind (wxEVT_TEXT, boost::bind (&ColourConversionEditor::changed, this));
+       _input_A->Bind (wxEVT_TEXT, boost::bind (&ColourConversionEditor::changed, this));
+       _input_B->Bind (wxEVT_TEXT, boost::bind (&ColourConversionEditor::changed, this));
+       _red_x->Bind (wxEVT_TEXT, boost::bind (&ColourConversionEditor::chromaticity_changed, this));
+       _red_y->Bind (wxEVT_TEXT, boost::bind (&ColourConversionEditor::chromaticity_changed, this));
+       _green_x->Bind (wxEVT_TEXT, boost::bind (&ColourConversionEditor::chromaticity_changed, this));
+       _green_y->Bind (wxEVT_TEXT, boost::bind (&ColourConversionEditor::chromaticity_changed, this));
+       _blue_x->Bind (wxEVT_TEXT, boost::bind (&ColourConversionEditor::chromaticity_changed, this));
+       _blue_y->Bind (wxEVT_TEXT, boost::bind (&ColourConversionEditor::chromaticity_changed, this));
+       _white_x->Bind (wxEVT_TEXT, boost::bind (&ColourConversionEditor::chromaticity_changed, this));
+       _white_y->Bind (wxEVT_TEXT, boost::bind (&ColourConversionEditor::chromaticity_changed, this));
+       _adjust_white->Bind (wxEVT_CHECKBOX, boost::bind (&ColourConversionEditor::adjusted_white_changed, this));
+       _adjusted_white_x->Bind (wxEVT_TEXT, boost::bind (&ColourConversionEditor::adjusted_white_changed, this));
+       _adjusted_white_y->Bind (wxEVT_TEXT, boost::bind (&ColourConversionEditor::adjusted_white_changed, this));
+       _yuv_to_rgb->Bind (wxEVT_CHOICE, boost::bind (&ColourConversionEditor::changed, this));
 }
 
 wxStaticText *
@@ -249,51 +247,32 @@ ColourConversionEditor::set (ColourConversion conversion)
 
        _ignore_chromaticity_changed = true;
 
-       SafeStringStream s;
-       s.setf (std::ios::fixed, std::ios::floatfield);
-       s.precision (6);
-
-       s << conversion.red().x;
-       _red_x->SetValue (std_to_wx (s.str ()));
-
-       s.str ("");
-       s << conversion.red().y;
-       _red_y->SetValue (std_to_wx (s.str ()));
-
-       s.str ("");
-       s << conversion.green().x;
-       _green_x->SetValue (std_to_wx (s.str ()));
-
-       s.str ("");
-       s << conversion.green().y;
-       _green_y->SetValue (std_to_wx (s.str ()));
-
-       s.str ("");
-       s << conversion.blue().x;
-       _blue_x->SetValue (std_to_wx (s.str ()));
-
-       s.str ("");
-       s << conversion.blue().y;
-       _blue_y->SetValue (std_to_wx (s.str ()));
-
-       s.str ("");
-       s << conversion.white().x;
-       _white_x->SetValue (std_to_wx (s.str ()));
-
-       s.str ("");
-       s << conversion.white().y;
-       _white_y->SetValue (std_to_wx (s.str ()));
+       char buffer[256];
+       snprintf (buffer, sizeof (buffer), "%.6f", conversion.red().x);
+       _red_x->SetValue (std_to_wx (buffer));
+       snprintf (buffer, sizeof (buffer), "%.6f", conversion.red().y);
+       _red_y->SetValue (std_to_wx (buffer));
+       snprintf (buffer, sizeof (buffer), "%.6f", conversion.green().x);
+       _green_x->SetValue (std_to_wx (buffer));
+       snprintf (buffer, sizeof (buffer), "%.6f", conversion.green().y);
+       _green_y->SetValue (std_to_wx (buffer));
+       snprintf (buffer, sizeof (buffer), "%.6f", conversion.blue().x);
+       _blue_x->SetValue (std_to_wx (buffer));
+       snprintf (buffer, sizeof (buffer), "%.6f", conversion.blue().y);
+       _blue_y->SetValue (std_to_wx (buffer));
+       snprintf (buffer, sizeof (buffer), "%.6f", conversion.white().x);
+       _white_x->SetValue (std_to_wx (buffer));
+       snprintf (buffer, sizeof (buffer), "%.6f", conversion.white().y);
+       _white_y->SetValue (std_to_wx (buffer));
 
        _ignore_chromaticity_changed = false;
 
        if (conversion.adjusted_white ()) {
                _adjust_white->SetValue (true);
-               s.str ("");
-               s << conversion.adjusted_white().get().x;
-               _adjusted_white_x->SetValue (std_to_wx (s.str ()));
-               s.str ("");
-               s << conversion.adjusted_white().get().y;
-               _adjusted_white_y->SetValue (std_to_wx (s.str ()));
+               snprintf (buffer, sizeof (buffer), "%.6f", conversion.adjusted_white().get().x);
+               _adjusted_white_x->SetValue (std_to_wx (buffer));
+               snprintf (buffer, sizeof (buffer), "%.6f", conversion.adjusted_white().get().y);
+               _adjusted_white_y->SetValue (std_to_wx (buffer));
        } else {
                _adjust_white->SetValue (false);
        }
@@ -310,44 +289,48 @@ ColourConversionEditor::get () const
 
        if (_input_gamma_linearised->GetValue ()) {
                conversion.set_in (
-                       make_shared<dcp::ModifiedGammaTransferFunction> (
-                               _input_power->GetValue (),
-                               raw_convert<double> (wx_to_std (_input_threshold->GetValue ())),
-                               raw_convert<double> (wx_to_std (_input_A->GetValue ())),
-                               raw_convert<double> (wx_to_std (_input_B->GetValue ()))
+                       shared_ptr<dcp::ModifiedGammaTransferFunction> (
+                               new dcp::ModifiedGammaTransferFunction (
+                                       _input_power->GetValue (),
+                                       locale_convert<double> (wx_to_std (_input_threshold->GetValue ())),
+                                       locale_convert<double> (wx_to_std (_input_A->GetValue ())),
+                                       locale_convert<double> (wx_to_std (_input_B->GetValue ()))
+                                       )
                                )
                        );
        } else {
-               conversion.set_in (make_shared<dcp::GammaTransferFunction> (_input_gamma->GetValue ()));
+               conversion.set_in (
+                       shared_ptr<dcp::GammaTransferFunction> (new dcp::GammaTransferFunction (_input_gamma->GetValue ()))
+                       );
        }
 
        conversion.set_yuv_to_rgb (static_cast<dcp::YUVToRGB> (_yuv_to_rgb->GetSelection ()));
 
        conversion.set_red (
-               dcp::Chromaticity (raw_convert<double> (wx_to_std (_red_x->GetValue ())), raw_convert<double> (wx_to_std (_red_y->GetValue ())))
+               dcp::Chromaticity (locale_convert<double> (wx_to_std (_red_x->GetValue ())), locale_convert<double> (wx_to_std (_red_y->GetValue ())))
                );
        conversion.set_green (
-               dcp::Chromaticity (raw_convert<double> (wx_to_std (_green_x->GetValue ())), raw_convert<double> (wx_to_std (_green_y->GetValue ())))
+               dcp::Chromaticity (locale_convert<double> (wx_to_std (_green_x->GetValue ())), locale_convert<double> (wx_to_std (_green_y->GetValue ())))
                );
        conversion.set_blue (
-               dcp::Chromaticity (raw_convert<double> (wx_to_std (_blue_x->GetValue ())), raw_convert<double> (wx_to_std (_blue_y->GetValue ())))
+               dcp::Chromaticity (locale_convert<double> (wx_to_std (_blue_x->GetValue ())), locale_convert<double> (wx_to_std (_blue_y->GetValue ())))
                );
        conversion.set_white (
-               dcp::Chromaticity (raw_convert<double> (wx_to_std (_white_x->GetValue ())), raw_convert<double> (wx_to_std (_white_y->GetValue ())))
+               dcp::Chromaticity (locale_convert<double> (wx_to_std (_white_x->GetValue ())), locale_convert<double> (wx_to_std (_white_y->GetValue ())))
                );
 
        if (_adjust_white->GetValue ()) {
                conversion.set_adjusted_white (
                        dcp::Chromaticity (
-                               raw_convert<double> (wx_to_std (_adjusted_white_x->GetValue ())),
-                               raw_convert<double> (wx_to_std (_adjusted_white_y->GetValue ()))
+                               locale_convert<double> (wx_to_std (_adjusted_white_x->GetValue ())),
+                               locale_convert<double> (wx_to_std (_adjusted_white_y->GetValue ()))
                                )
                        );
        } else {
                conversion.unset_adjusted_white ();
        }
 
-       conversion.set_out (make_shared<dcp::GammaTransferFunction> (2.6));
+       conversion.set_out (shared_ptr<dcp::GammaTransferFunction> (new dcp::GammaTransferFunction (2.6)));
 
        return conversion;
 }
@@ -392,11 +375,9 @@ ColourConversionEditor::update_bradford ()
        boost::numeric::ublas::matrix<double> m = get().bradford ();
        for (int i = 0; i < 3; ++i) {
                for (int j = 0; j < 3; ++j) {
-                       SafeStringStream s;
-                       s.setf (std::ios::fixed, std::ios::floatfield);
-                       s.precision (7);
-                       s << m (i, j);
-                       _bradford[i][j]->SetLabel (std_to_wx (s.str ()));
+                       char buffer[256];
+                       snprintf (buffer, sizeof (buffer), "%.7f", m (i, j));
+                       _bradford[i][j]->SetLabel (std_to_wx (buffer));
                }
        }
 }
@@ -407,11 +388,9 @@ ColourConversionEditor::update_rgb_to_xyz ()
        boost::numeric::ublas::matrix<double> m = get().rgb_to_xyz ();
        for (int i = 0; i < 3; ++i) {
                for (int j = 0; j < 3; ++j) {
-                       SafeStringStream s;
-                       s.setf (std::ios::fixed, std::ios::floatfield);
-                       s.precision (7);
-                       s << m (i, j);
-                       _rgb_to_xyz[i][j]->SetLabel (std_to_wx (s.str ()));
+                       char buffer[256];
+                       snprintf (buffer, sizeof (buffer), "%.7f", m (i, j));
+                       _rgb_to_xyz[i][j]->SetLabel (std_to_wx (buffer));
                }
        }
 }
@@ -440,8 +419,7 @@ ColourConversionEditor::set_spin_ctrl (wxSpinCtrlDouble* control, double value)
 void
 ColourConversionEditor::set_text_ctrl (wxTextCtrl* control, double value)
 {
-       SafeStringStream s;
-       s.precision (7);
-       s << value;
-       control->SetValue (std_to_wx (s.str ()));
+       char buffer[256];
+       snprintf (buffer, sizeof (buffer), "%.7f", value);
+       control->SetValue (std_to_wx (buffer));
 }