nodes: color management when setting color parameters is now preserved
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user