nodes: color management when setting color parameters is now preserved

This commit is contained in:
itsmattkc
2020-04-18 17:43:37 +10:00
parent f73c41d3fa
commit d3b71e6576
19 changed files with 311 additions and 106 deletions
+32 -20
View File
@@ -28,16 +28,12 @@
OLIVE_NAMESPACE_ENTER
ColorDialog::ColorDialog(ColorManager* color_manager, Color start, QString input_cs, QWidget *parent) :
ColorDialog::ColorDialog(ColorManager* color_manager, const ManagedColor& start, QWidget *parent) :
QDialog(parent),
color_manager_(color_manager)
{
setWindowTitle(tr("Select Color"));
if (input_cs.isEmpty()) {
input_cs = color_manager_->GetDefaultInputColorSpace();
}
QVBoxLayout* layout = new QVBoxLayout(this);
QSplitter* splitter = new QSplitter(Qt::Horizontal);
@@ -64,7 +60,11 @@ ColorDialog::ColorDialog(ColorManager* color_manager, Color start, QString input
value_layout->addWidget(color_values_widget_);
chooser_ = new ColorSpaceChooser(color_manager_);
chooser_->set_input(input_cs);
chooser_->set_input(start.color_input());
chooser_->set_display(start.color_display());
chooser_->set_view(start.color_view());
chooser_->set_look(start.color_look());
value_layout->addWidget(chooser_);
// Split window 50/50
@@ -84,19 +84,27 @@ ColorDialog::ColorDialog(ColorManager* color_manager, Color start, QString input
connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject);
layout->addWidget(buttons);
{
Color managed_start;
if (start.color_input().isEmpty()) {
managed_start = start;
} else {
// Convert reference color to the input space
ColorProcessorPtr linear_to_input = ColorProcessor::Create(color_manager_->GetConfig(),
ColorProcessorPtr linear_to_input = ColorProcessor::Create(color_manager_,
color_manager_->GetReferenceColorSpace(),
input_cs);
start.color_input());
Color managed_start = linear_to_input->ConvertColor(start);
managed_start = linear_to_input->ConvertColor(start);
color_wheel_->SetSelectedColor(managed_start);
hsv_value_gradient_->SetSelectedColor(managed_start);
color_values_widget_->SetColor(managed_start);
}
color_wheel_->SetSelectedColor(managed_start);
hsv_value_gradient_->SetSelectedColor(managed_start);
color_values_widget_->SetColor(managed_start);
connect(chooser_, &ColorSpaceChooser::ColorSpaceChanged, this, &ColorDialog::ColorSpaceChanged);
ColorSpaceChanged(chooser_->input(), chooser_->display(), chooser_->view(), chooser_->look());
@@ -104,16 +112,20 @@ ColorDialog::ColorDialog(ColorManager* color_manager, Color start, QString input
resize(sizeHint().height() * 2, sizeHint().height());
}
Color ColorDialog::GetSelectedColor() const
ManagedColor ColorDialog::GetSelectedColor() const
{
Color selected = color_wheel_->GetSelectedColor();
ManagedColor selected = color_wheel_->GetSelectedColor();
// Convert to linear and return a linear color
if (input_to_ref_processor_) {
return input_to_ref_processor_->ConvertColor(selected);
selected = input_to_ref_processor_->ConvertColor(selected);
}
// Fallback if no processor is available
selected.set_color_input(GetColorSpaceInput());
selected.set_color_display(GetColorSpaceDisplay());
selected.set_color_view(GetColorSpaceView());
selected.set_color_look(GetColorSpaceLook());
return selected;
}
@@ -139,15 +151,15 @@ QString ColorDialog::GetColorSpaceLook() const
void ColorDialog::ColorSpaceChanged(const QString &input, const QString &display, const QString &view, const QString &look)
{
input_to_ref_processor_ = ColorProcessor::Create(color_manager_->GetConfig(), input, color_manager_->GetReferenceColorSpace());
input_to_ref_processor_ = ColorProcessor::Create(color_manager_, input, color_manager_->GetReferenceColorSpace());
ColorProcessorPtr ref_to_display = ColorProcessor::Create(color_manager_->GetConfig(),
ColorProcessorPtr ref_to_display = ColorProcessor::Create(color_manager_,
color_manager_->GetReferenceColorSpace(),
display,
view,
look);
ColorProcessorPtr ref_to_input = ColorProcessor::Create(color_manager_->GetConfig(), color_manager_->GetReferenceColorSpace(), input);
ColorProcessorPtr ref_to_input = ColorProcessor::Create(color_manager_, color_manager_->GetReferenceColorSpace(), input);
// FIXME: For some reason, using OCIO::TRANSFORM_DIR_INVERSE (wrapped by ColorProcessor::kInverse) causes OCIO to
// crash. We've disabled that functionality for now (also disabling display_tab_ in ColorValuesWidget)
+3 -2
View File
@@ -27,6 +27,7 @@
#include "colorvalueswidget.h"
#include "render/color.h"
#include "render/colormanager.h"
#include "render/managedcolor.h"
#include "widget/colorwheel/colorwheelwidget.h"
#include "widget/colorwheel/colorgradientwidget.h"
@@ -55,14 +56,14 @@ public:
*
* QWidget parent.
*/
ColorDialog(ColorManager* color_manager, Color start = Color(1.0f, 1.0f, 1.0f), QString input_cs = QString(), QWidget* parent = nullptr);
ColorDialog(ColorManager* color_manager, const ManagedColor &start = Color(1.0f, 1.0f, 1.0f), QWidget* parent = nullptr);
/**
* @brief Retrieves the color selected by the user
*
* The color is always returned in the ColorManager's reference space (usually scene linear).
*/
Color GetSelectedColor() const;
ManagedColor GetSelectedColor() const;
QString GetColorSpaceInput() const;
+37 -4
View File
@@ -135,16 +135,49 @@ QString ColorSpaceChooser::look() const
void ColorSpaceChooser::set_input(const QString &s)
{
input_combobox_->setCurrentText(s);
if (s.isEmpty()) {
input_combobox_->setCurrentText(color_manager_->GetDefaultInputColorSpace());
} else {
input_combobox_->setCurrentText(s);
}
}
void ColorSpaceChooser::UpdateViews(const QString& s)
void ColorSpaceChooser::set_display(const QString &s)
{
if (s.isEmpty()) {
display_combobox_->setCurrentText(color_manager_->GetDefaultDisplay());
} else {
display_combobox_->setCurrentText(s);
}
UpdateViews(display_combobox_->currentText());
}
void ColorSpaceChooser::set_view(const QString &s)
{
if (s.isEmpty()) {
view_combobox_->setCurrentText(color_manager_->GetDefaultView(display_combobox_->currentText()));
} else {
view_combobox_->setCurrentText(s);
}
}
void ColorSpaceChooser::set_look(const QString &s)
{
if (s.isEmpty()) {
look_combobox_->setCurrentIndex(0);
} else {
look_combobox_->setCurrentText(s);
}
}
void ColorSpaceChooser::UpdateViews(const QString& display)
{
QString v = view_combobox_->currentText();
view_combobox_->clear();
QStringList views = color_manager_->ListAvailableViews(s);
QStringList views = color_manager_->ListAvailableViews(display);
foreach (const QString& s, views) {
view_combobox_->addItem(s);
@@ -155,7 +188,7 @@ void ColorSpaceChooser::UpdateViews(const QString& s)
view_combobox_->setCurrentText(v);
} else {
// Otherwise reset to default view for this display
view_combobox_->setCurrentText(color_manager_->GetDefaultView(s));
view_combobox_->setCurrentText(color_manager_->GetDefaultView(display));
}
}
+4 -1
View File
@@ -40,6 +40,9 @@ public:
QString look() const;
void set_input(const QString& s);
void set_display(const QString& s);
void set_view(const QString& s);
void set_look(const QString& s);
signals:
void ColorSpaceChanged(const QString& input, const QString& display, const QString& view, const QString& look);
@@ -47,7 +50,7 @@ signals:
void DisplayColorSpaceChanged(const QString& display, const QString& view, const QString& look);
private slots:
void UpdateViews(const QString &s);
void UpdateViews(const QString &display);
private:
ColorManager* color_manager_;
+1 -1
View File
@@ -310,7 +310,7 @@ void ExportDialog::accept()
audio_tab_->channel_layout_combobox()->currentData().toULongLong(),
SampleFormat::GetConfiguredFormatForMode(render_mode));
ColorProcessorPtr color_processor = ColorProcessor::Create(color_manager_->GetConfig(),
ColorProcessorPtr color_processor = ColorProcessor::Create(color_manager_,
color_manager_->GetReferenceColorSpace(),
video_tab_->CurrentOCIODisplay(),
video_tab_->CurrentOCIOView(),