diff --git a/app/dialog/color/colordialog.cpp b/app/dialog/color/colordialog.cpp index 385fba95b..e578cfdd2 100644 --- a/app/dialog/color/colordialog.cpp +++ b/app/dialog/color/colordialog.cpp @@ -61,9 +61,7 @@ ColorDialog::ColorDialog(ColorManager* color_manager, const ManagedColor& start, chooser_ = new ColorSpaceChooser(color_manager_); chooser_->set_input(start.color_input()); - chooser_->set_display(start.color_display()); - chooser_->set_view(start.color_view()); - chooser_->set_look(start.color_look()); + chooser_->set_output(start.color_output()); value_layout->addWidget(chooser_); @@ -106,7 +104,7 @@ ColorDialog::ColorDialog(ColorManager* color_manager, const ManagedColor& start, color_values_widget_->SetColor(managed_start); connect(chooser_, &ColorSpaceChooser::ColorSpaceChanged, this, &ColorDialog::ColorSpaceChanged); - ColorSpaceChanged(chooser_->input(), chooser_->display(), chooser_->view(), chooser_->look()); + ColorSpaceChanged(chooser_->input(), chooser_->output()); // Set default size ratio to 2:1 resize(sizeHint().height() * 2, sizeHint().height()); @@ -122,9 +120,7 @@ ManagedColor ColorDialog::GetSelectedColor() const } selected.set_color_input(GetColorSpaceInput()); - selected.set_color_display(GetColorSpaceDisplay()); - selected.set_color_view(GetColorSpaceView()); - selected.set_color_look(GetColorSpaceLook()); + selected.set_color_output(GetColorSpaceOutput()); return selected; } @@ -134,30 +130,18 @@ QString ColorDialog::GetColorSpaceInput() const return chooser_->input(); } -QString ColorDialog::GetColorSpaceDisplay() const +ColorTransform ColorDialog::GetColorSpaceOutput() const { - return chooser_->display(); + return chooser_->output(); } -QString ColorDialog::GetColorSpaceView() const -{ - return chooser_->view(); -} - -QString ColorDialog::GetColorSpaceLook() const -{ - return chooser_->look(); -} - -void ColorDialog::ColorSpaceChanged(const QString &input, const QString &display, const QString &view, const QString &look) +void ColorDialog::ColorSpaceChanged(const QString &input, const ColorTransform &output) { input_to_ref_processor_ = ColorProcessor::Create(color_manager_, input, color_manager_->GetReferenceColorSpace()); ColorProcessorPtr ref_to_display = ColorProcessor::Create(color_manager_, color_manager_->GetReferenceColorSpace(), - display, - view, - look); + output); ColorProcessorPtr ref_to_input = ColorProcessor::Create(color_manager_, color_manager_->GetReferenceColorSpace(), input); diff --git a/app/dialog/color/colordialog.h b/app/dialog/color/colordialog.h index 76ebb3d43..356924c5b 100644 --- a/app/dialog/color/colordialog.h +++ b/app/dialog/color/colordialog.h @@ -23,13 +23,13 @@ #include -#include "colorspacechooser.h" -#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" +#include "widget/colorwheel/colorspacechooser.h" +#include "widget/colorwheel/colorvalueswidget.h" +#include "widget/colorwheel/colorwheelwidget.h" OLIVE_NAMESPACE_ENTER @@ -67,11 +67,7 @@ public: QString GetColorSpaceInput() const; - QString GetColorSpaceDisplay() const; - - QString GetColorSpaceView() const; - - QString GetColorSpaceLook() const; + ColorTransform GetColorSpaceOutput() const; private: ColorManager* color_manager_; @@ -87,7 +83,7 @@ private: ColorSpaceChooser* chooser_; private slots: - void ColorSpaceChanged(const QString& input, const QString& display, const QString& view, const QString& look); + void ColorSpaceChanged(const QString& input, const ColorTransform &output); }; diff --git a/app/dialog/export/export.cpp b/app/dialog/export/export.cpp index b9b8d5d27..220b0f919 100644 --- a/app/dialog/export/export.cpp +++ b/app/dialog/export/export.cpp @@ -218,12 +218,12 @@ ExportDialog::ExportDialog(ViewerOutput *viewer_node, QWidget *parent) : connect(video_tab_, &ExportVideoTab::ColorSpaceChanged, preview_viewer_, - static_cast(&ViewerWidget::SetOCIODisplay)); + static_cast(&ViewerWidget::SetColorTransform)); // Set viewer to view the node preview_viewer_->ConnectViewerNode(viewer_node_); preview_viewer_->SetColorMenuEnabled(false); - preview_viewer_->SetOCIODisplay(video_tab_->CurrentOCIOColorSpace()); + preview_viewer_->SetColorTransform(video_tab_->CurrentOCIOColorSpace()); // Update renderer // FIXME: This is going to be VERY slow since it will need to hash every single frame. It would be better to have a diff --git a/app/dialog/export/exportvideotab.h b/app/dialog/export/exportvideotab.h index 7cba35dcf..23e1de6bd 100644 --- a/app/dialog/export/exportvideotab.h +++ b/app/dialog/export/exportvideotab.h @@ -26,10 +26,10 @@ #include #include "common/rational.h" -#include "dialog/color/colorspacechooser.h" #include "dialog/export/codec/h264section.h" #include "dialog/export/codec/imagesection.h" #include "render/colormanager.h" +#include "widget/colorwheel/colorspacechooser.h" #include "widget/slider/integerslider.h" OLIVE_NAMESPACE_ENTER diff --git a/app/render/backend/opengl/openglcolorprocessor.cpp b/app/render/backend/opengl/openglcolorprocessor.cpp index 7d2c96215..bc0993f4f 100644 --- a/app/render/backend/opengl/openglcolorprocessor.cpp +++ b/app/render/backend/opengl/openglcolorprocessor.cpp @@ -71,31 +71,20 @@ void OpenGLColorProcessor::ClearTexture() } } -OpenGLColorProcessor::OpenGLColorProcessor(ColorManager* config, const QString &source_space, const QString &dest_space) : +OpenGLColorProcessor::OpenGLColorProcessor(ColorManager* config, const QString &source_space, const ColorTransform &dest_space) : ColorProcessor(config, source_space, dest_space), ocio_lut_(0) { } -OpenGLColorProcessor::OpenGLColorProcessor(ColorManager* config, const QString &source_space, QString display, QString view, const QString &look, Direction dir) : - ColorProcessor(config, source_space, display, view, look, dir), - ocio_lut_(0) -{ -} - OpenGLColorProcessor::~OpenGLColorProcessor() { ClearTexture(); } -OpenGLColorProcessorPtr OpenGLColorProcessor::Create(ColorManager *config, const QString &source_space, const QString &dest_space) +OpenGLColorProcessorPtr OpenGLColorProcessor::Create(ColorManager *config, const QString &source_space, const ColorTransform &dest_space) { return std::make_shared(config, source_space, dest_space); } -OpenGLColorProcessorPtr OpenGLColorProcessor::Create(ColorManager *config, const QString &source_space, const QString &display, const QString &view, const QString &look, Direction dir) -{ - return std::make_shared(config, source_space, display, view, look, dir); -} - OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/opengl/openglcolorprocessor.h b/app/render/backend/opengl/openglcolorprocessor.h index 00c891196..85d429c68 100644 --- a/app/render/backend/opengl/openglcolorprocessor.h +++ b/app/render/backend/opengl/openglcolorprocessor.h @@ -33,25 +33,15 @@ class OpenGLColorProcessor : public QObject, public ColorProcessor { Q_OBJECT public: - OpenGLColorProcessor(ColorManager *config, const QString &source_space, const QString &dest_space); - OpenGLColorProcessor(ColorManager *config, - const QString& source_space, - QString display, - QString view, - const QString& look, - Direction dir); + const QString& input, + const ColorTransform& dest); - ~OpenGLColorProcessor(); - - static OpenGLColorProcessorPtr Create(ColorManager* config, const QString& source_space, const QString& dest_space); + virtual ~OpenGLColorProcessor() override; static OpenGLColorProcessorPtr Create(ColorManager* config, - const QString& source_space, - const QString& display, - const QString& view, - const QString& look, - Direction dir = kNormal); + const QString& input, + const ColorTransform& dest); void Enable(QOpenGLContext* context, bool alpha_is_associated); bool IsEnabled() const; diff --git a/app/render/colormanager.cpp b/app/render/colormanager.cpp index 6721168c7..004e3934f 100644 --- a/app/render/colormanager.cpp +++ b/app/render/colormanager.cpp @@ -218,6 +218,53 @@ void ColorManager::SetReferenceColorSpace(const QString &s) emit ConfigChanged(); } +QString ColorManager::GetCompliantColorSpace(const QString &s) +{ + if (ListAvailableInputColorspaces().contains(s)) { + return s; + } else { + return GetDefaultInputColorSpace(); + } +} + +ColorTransform ColorManager::GetCompliantColorSpace(const ColorTransform &transform, bool force_display) +{ + if (transform.is_display() || force_display) { + // Get display information + QString display = transform.display(); + QString view = transform.view(); + QString look = transform.look(); + + // Check if display still exists in config + if (!ListAvailableDisplays().contains(display)) { + display = GetDefaultDisplay(); + } + + // Check if view still exists in display + if (!ListAvailableViews(display).contains(view)) { + view = GetDefaultView(display); + } + + // Check if looks still exists + if (!ListAvailableLooks().contains(look)) { + look.clear(); + } + + return ColorTransform(display, view, look); + + } else { + + QString output = transform.output(); + + if (!ListAvailableInputColorspaces().contains(output)) { + output = GetDefaultInputColorSpace(); + } + + return ColorTransform(output); + + } +} + QStringList ColorManager::ListAvailableInputColorspaces(OCIO::ConstConfigRcPtr config) { QStringList spaces; diff --git a/app/render/colormanager.h b/app/render/colormanager.h index 74166a92a..a0f88b198 100644 --- a/app/render/colormanager.h +++ b/app/render/colormanager.h @@ -72,6 +72,10 @@ public: void SetReferenceColorSpace(const QString& s); + QString GetCompliantColorSpace(const QString& s); + + ColorTransform GetCompliantColorSpace(const ColorTransform& transform, bool force_display = false); + static QStringList ListAvailableInputColorspaces(OCIO::ConstConfigRcPtr config); enum OCIOMethod { diff --git a/app/render/colorprocessor.cpp b/app/render/colorprocessor.cpp index 1188b7270..6f4a18e52 100644 --- a/app/render/colorprocessor.cpp +++ b/app/render/colorprocessor.cpp @@ -25,45 +25,33 @@ OLIVE_NAMESPACE_ENTER -ColorProcessor::ColorProcessor(ColorManager *config, const QString& source_space, const QString& dest_space) +ColorProcessor::ColorProcessor(ColorManager *config, const QString &input, const ColorTransform &transform) { - processor_ = config->GetConfig()->getProcessor(source_space.toUtf8(), - dest_space.toUtf8()); -} + const QString& output = (transform.output().isEmpty()) ? config->GetDefaultDisplay() : transform.output(); + + if (transform.is_display()) { + + const QString& view = (transform.view().isEmpty()) ? config->GetDefaultView(output) : transform.view(); + + OCIO::DisplayTransformRcPtr display_transform = OCIO::DisplayTransform::Create(); + + display_transform->setInputColorSpaceName(input.toUtf8()); + display_transform->setDisplay(output.toUtf8()); + display_transform->setView(view.toUtf8()); + + if (!transform.look().isEmpty()) { + display_transform->setLooksOverride(transform.look().toUtf8()); + display_transform->setLooksOverrideEnabled(true); + } + + processor_ = config->GetConfig()->getProcessor(display_transform); + + } else { + + processor_ = config->GetConfig()->getProcessor(input.toUtf8(), + output.toUtf8()); -ColorProcessor::ColorProcessor(ColorManager *config, - QString source_space, - QString display, - QString view, - const QString& look, - Direction direction) -{ - if (source_space.isEmpty()) { - source_space = config->GetDefaultInputColorSpace(); } - - if (display.isEmpty()) { - display = config->GetDefaultDisplay(); - } - - if (view.isEmpty()) { - view = config->GetDefaultView(display); - } - - // Get current display stats - OCIO::DisplayTransformRcPtr transform = OCIO::DisplayTransform::Create(); - transform->setInputColorSpaceName(source_space.toUtf8()); - transform->setDisplay(display.toUtf8()); - transform->setView(view.toUtf8()); - - if (!look.isEmpty()) { - transform->setLooksOverride(look.toUtf8()); - transform->setLooksOverrideEnabled(true); - } - - OCIO::TransformDirection dir = (direction == kInverse) ? OCIO::TRANSFORM_DIR_INVERSE : OCIO::TRANSFORM_DIR_FORWARD; - - processor_ = config->GetConfig()->getProcessor(transform, dir); } void ColorProcessor::ConvertFrame(Frame *f) @@ -85,14 +73,9 @@ Color ColorProcessor::ConvertColor(Color in) return in; } -ColorProcessorPtr ColorProcessor::Create(ColorManager *config, const QString& source_space, const QString& dest_space) +ColorProcessorPtr ColorProcessor::Create(ColorManager *config, const QString& input, const ColorTransform &transform) { - return std::make_shared(config, source_space, dest_space); -} - -ColorProcessorPtr ColorProcessor::Create(ColorManager *config, const QString &source_space, const QString &display, const QString &view, const QString &look, Direction direction) -{ - return std::make_shared(config, source_space, display, view, look, direction); + return std::make_shared(config, input, transform); } OCIO::ConstProcessorRcPtr ColorProcessor::GetProcessor() diff --git a/app/render/colorprocessor.h b/app/render/colorprocessor.h index 23f7adaf1..6912cd66d 100644 --- a/app/render/colorprocessor.h +++ b/app/render/colorprocessor.h @@ -21,11 +21,9 @@ #ifndef COLORPROCESSOR_H #define COLORPROCESSOR_H -#include -namespace OCIO = OCIO_NAMESPACE::v1; - #include "codec/frame.h" #include "render/color.h" +#include "render/colortransform.h" OLIVE_NAMESPACE_ENTER @@ -42,25 +40,11 @@ public: kInverse }; - ColorProcessor(ColorManager* config, const QString &source_space, const QString &dest_space); - - ColorProcessor(ColorManager* config, - QString source_space, - QString display, - QString view, - const QString& look, - Direction direction); + ColorProcessor(ColorManager* config, const QString& input, const ColorTransform& dest_space); DISABLE_COPY_MOVE(ColorProcessor) - static ColorProcessorPtr Create(ColorManager* config, const QString& source_space, const QString& dest_space); - - static ColorProcessorPtr Create(ColorManager* config, - const QString& source_space, - const QString& display, - const QString& view, - const QString& look, - Direction direction = kNormal); + static ColorProcessorPtr Create(ColorManager* config, const QString& input, const ColorTransform& dest_space); OCIO::ConstProcessorRcPtr GetProcessor(); @@ -74,6 +58,8 @@ private: }; +using ColorProcessorChain = QList; + OLIVE_NAMESPACE_EXIT #endif // COLORPROCESSOR_H diff --git a/app/render/colortransform.h b/app/render/colortransform.h new file mode 100644 index 000000000..cd183dda3 --- /dev/null +++ b/app/render/colortransform.h @@ -0,0 +1,86 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef COLORTRANSFORM_H +#define COLORTRANSFORM_H + +#include +namespace OCIO = OCIO_NAMESPACE::v1; + +#include + +#include "common/define.h" + +OLIVE_NAMESPACE_ENTER + +class ColorTransform +{ +public: + ColorTransform() + { + is_display_ = false; + } + + ColorTransform(const QString& output) + { + is_display_ = false; + output_ = output; + } + + ColorTransform(const QString& display, const QString& view, const QString& look) + { + is_display_ = true; + output_ = display; + view_ = view; + look_ = look; + } + + bool is_display() const { + return is_display_; + } + + const QString& display() const { + return output_; + } + + const QString& output() const { + return output_; + } + + const QString& view() const { + return view_; + } + + const QString& look() const { + return look_; + } + +private: + QString output_; + + bool is_display_; + QString view_; + QString look_; + +}; + +OLIVE_NAMESPACE_EXIT + +#endif // COLORTRANSFORM_H diff --git a/app/render/managedcolor.cpp b/app/render/managedcolor.cpp index 2b9842fd9..f4d86e197 100644 --- a/app/render/managedcolor.cpp +++ b/app/render/managedcolor.cpp @@ -51,34 +51,14 @@ void ManagedColor::set_color_input(const QString &color_input) color_input_ = color_input; } -const QString &ManagedColor::color_display() const +const ColorTransform &ManagedColor::color_output() const { - return color_display_; + return color_transform_; } -void ManagedColor::set_color_display(const QString &color_display) +void ManagedColor::set_color_output(const ColorTransform &color_output) { - color_display_ = color_display; -} - -const QString &ManagedColor::color_view() const -{ - return color_view_; -} - -void ManagedColor::set_color_view(const QString &color_view) -{ - color_view_ = color_view; -} - -const QString &ManagedColor::color_look() const -{ - return color_look_; -} - -void ManagedColor::set_color_look(const QString &color_look) -{ - color_look_ = color_look; + color_transform_ = color_output; } OLIVE_NAMESPACE_EXIT diff --git a/app/render/managedcolor.h b/app/render/managedcolor.h index 3090ab8c2..c214f57b4 100644 --- a/app/render/managedcolor.h +++ b/app/render/managedcolor.h @@ -22,6 +22,7 @@ #define MANAGEDCOLOR_H #include "color.h" +#include "colortransform.h" OLIVE_NAMESPACE_ENTER @@ -36,23 +37,13 @@ public: const QString& color_input() const; void set_color_input(const QString &color_input); - const QString& color_display() const; - void set_color_display(const QString &color_display); - - const QString& color_view() const; - void set_color_view(const QString &color_view); - - const QString& color_look() const; - void set_color_look(const QString &color_look); + const ColorTransform& color_output() const; + void set_color_output(const ColorTransform &color_output); private: QString color_input_; - QString color_display_; - - QString color_view_; - - QString color_look_; + ColorTransform color_transform_; }; diff --git a/app/widget/colorbutton/colorbutton.cpp b/app/widget/colorbutton/colorbutton.cpp index c4778c06f..be5dc2b69 100644 --- a/app/widget/colorbutton/colorbutton.cpp +++ b/app/widget/colorbutton/colorbutton.cpp @@ -27,14 +27,13 @@ OLIVE_NAMESPACE_ENTER ColorButton::ColorButton(ColorManager* color_manager, QWidget *parent) : QPushButton(parent), color_manager_(color_manager), - color_(1.0f, 1.0f, 1.0f), color_processor_(nullptr) { setAutoFillBackground(true); connect(this, &ColorButton::clicked, this, &ColorButton::ShowColorDialog); - UpdateColor(); + SetColor(Color(1.0f, 1.0f, 1.0f)); } const ManagedColor &ColorButton::GetColor() const @@ -46,6 +45,9 @@ void ColorButton::SetColor(const ManagedColor &c) { color_ = c; + color_.set_color_input(color_manager_->GetCompliantColorSpace(color_.color_input())); + color_.set_color_output(color_manager_->GetCompliantColorSpace(color_.color_output())); + UpdateColor(); } @@ -66,9 +68,7 @@ void ColorButton::UpdateColor() { color_processor_ = ColorProcessor::Create(color_manager_, color_.color_input(), - color_.color_display(), - color_.color_view(), - color_.color_look()); + color_.color_output()); QColor managed = color_processor_->ConvertColor(color_).toQColor(); diff --git a/app/widget/colorwheel/colorspacechooser.cpp b/app/widget/colorwheel/colorspacechooser.cpp index 6259f3ad8..41c8e3fbc 100644 --- a/app/widget/colorwheel/colorspacechooser.cpp +++ b/app/widget/colorwheel/colorspacechooser.cpp @@ -131,68 +131,29 @@ QString ColorSpaceChooser::input() const } } -QString ColorSpaceChooser::display() const +ColorTransform ColorSpaceChooser::output() const { - if (display_combobox_) { - return display_combobox_->currentText(); - } else { - return QString(); - } -} - -QString ColorSpaceChooser::view() const -{ - if (view_combobox_) { - return view_combobox_->currentText(); - } else { - return QString(); - } -} - -QString ColorSpaceChooser::look() const -{ - if (look_combobox_) { - return look_combobox_->currentData().toString(); - } else { - return QString(); - } + return ColorTransform(display_combobox_->currentText(), + view_combobox_->currentText(), + look_combobox_->currentIndex() == 0 ? QString() : look_combobox_->currentText()); } void ColorSpaceChooser::set_input(const QString &s) { - if (s.isEmpty()) { - input_combobox_->setCurrentText(color_manager_->GetDefaultInputColorSpace()); - } else { - input_combobox_->setCurrentText(s); - } + input_combobox_->setCurrentText(color_manager_->GetCompliantColorSpace(s)); } -void ColorSpaceChooser::set_display(const QString &s) +void ColorSpaceChooser::set_output(const ColorTransform &out) { - if (s.isEmpty()) { - display_combobox_->setCurrentText(color_manager_->GetDefaultDisplay()); - } else { - display_combobox_->setCurrentText(s); - } + ColorTransform compliant = color_manager_->GetCompliantColorSpace(out); - UpdateViews(display_combobox_->currentText()); -} + display_combobox_->setCurrentText(compliant.display()); + view_combobox_->setCurrentText(compliant.view()); -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()) { + if (compliant.look().isEmpty()) { look_combobox_->setCurrentIndex(0); } else { - look_combobox_->setCurrentText(s); + look_combobox_->setCurrentText(compliant.look()); } } @@ -224,11 +185,11 @@ void ColorSpaceChooser::ComboBoxChanged() } if (display_combobox_) { - emit DisplayColorSpaceChanged(display(), view(), look()); + emit OutputColorSpaceChanged(output()); } if (input_combobox_ && display_combobox_) { - emit ColorSpaceChanged(input(), display(), view(), look()); + emit ColorSpaceChanged(input(), output()); } } diff --git a/app/widget/colorwheel/colorspacechooser.h b/app/widget/colorwheel/colorspacechooser.h index 0b2a41673..eba0db6ce 100644 --- a/app/widget/colorwheel/colorspacechooser.h +++ b/app/widget/colorwheel/colorspacechooser.h @@ -35,21 +35,17 @@ public: ColorSpaceChooser(ColorManager* color_manager, bool enable_input_field = true, bool enable_display_fields = true, QWidget* parent = nullptr); QString input() const; - QString display() const; - QString view() const; - QString look() const; + ColorTransform output() 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); + void set_output(const ColorTransform& out); signals: void InputColorSpaceChanged(const QString& input); - void ColorSpaceChanged(const QString& input, const QString& display, const QString& view, const QString& look); + void OutputColorSpaceChanged(const ColorTransform& out); - void DisplayColorSpaceChanged(const QString& display, const QString& view, const QString& look); + void ColorSpaceChanged(const QString& input, const ColorTransform& out); private slots: void UpdateViews(const QString &display); diff --git a/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp b/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp index 8bb24106a..bc90a50e0 100644 --- a/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp +++ b/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp @@ -361,9 +361,9 @@ void NodeParamViewWidgetBridge::WidgetCallback() input_->blockSignals(true); input_->set_property(QStringLiteral("col_input"), c.color_input()); - input_->set_property(QStringLiteral("col_display"), c.color_display()); - input_->set_property(QStringLiteral("col_view"), c.color_view()); - input_->set_property(QStringLiteral("col_look"), c.color_look()); + input_->set_property(QStringLiteral("col_display"), c.color_output().display()); + input_->set_property(QStringLiteral("col_view"), c.color_output().view()); + input_->set_property(QStringLiteral("col_look"), c.color_output().look()); input_->blockSignals(false); Core::instance()->undo_stack()->pushIfHasChildren(command); @@ -471,9 +471,12 @@ void NodeParamViewWidgetBridge::UpdateWidgetValues() ManagedColor mc = input_->get_value_at_time(node_time).value(); mc.set_color_input(input_->get_property(QStringLiteral("col_input")).toString()); - mc.set_color_display(input_->get_property(QStringLiteral("col_display")).toString()); - mc.set_color_view(input_->get_property(QStringLiteral("col_view")).toString()); - mc.set_color_look(input_->get_property(QStringLiteral("col_look")).toString()); + + QString d = input_->get_property(QStringLiteral("col_display")).toString(); + QString v = input_->get_property(QStringLiteral("col_view")).toString(); + QString l = input_->get_property(QStringLiteral("col_look")).toString(); + + mc.set_color_output(ColorTransform(d, v, l)); static_cast(widgets_.first())->SetColor(mc); break; diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 2c7d4e876..c9978551d 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -421,6 +421,11 @@ void ViewerWidget::UpdateMinimumScale() } } +void ViewerWidget::SetColorTransform(const ColorTransform &transform, ViewerGLWidget *sender) +{ + sender->SetColorTransform(transform); +} + void ViewerWidget::UpdateStack() { if (!GetConnectedNode() || GetConnectedNode()->texture_input()->IsConnected()) { @@ -536,6 +541,10 @@ void ViewerWidget::ShowContextMenu(const QPoint &pos) // Color options if (context_menu_widget_->color_manager() && color_menu_enabled_) { + const ColorTransform& transform = context_menu_widget_->GetColorTransform(); + + qDebug() << "CMW transform" << transform.display() << transform.view() << transform.look(); + { QStringList displays = context_menu_widget_->color_manager()->ListAvailableDisplays(); @@ -546,13 +555,13 @@ void ViewerWidget::ShowContextMenu(const QPoint &pos) foreach (const QString& d, displays) { QAction* action = ocio_display_menu->addAction(d); action->setCheckable(true); - action->setChecked(context_menu_widget_->ocio_display() == d); + action->setChecked(transform.display() == d); action->setData(d); } } { - QStringList views = context_menu_widget_->color_manager()->ListAvailableViews(context_menu_widget_->ocio_display()); + QStringList views = context_menu_widget_->color_manager()->ListAvailableViews(transform.display()); Menu* ocio_view_menu = new Menu(tr("View"), &menu); menu.addMenu(ocio_view_menu); @@ -561,7 +570,7 @@ void ViewerWidget::ShowContextMenu(const QPoint &pos) foreach (const QString& v, views) { QAction* action = ocio_view_menu->addAction(v); action->setCheckable(true); - action->setChecked(context_menu_widget_->ocio_view() == v); + action->setChecked(transform.view() == v); action->setData(v); } } @@ -575,11 +584,11 @@ void ViewerWidget::ShowContextMenu(const QPoint &pos) connect(ocio_look_menu, &QMenu::triggered, this, &ViewerWidget::ContextMenuOCIOLook); QAction* no_look_action = ocio_look_menu->addAction(tr("(None)")); no_look_action->setCheckable(true); - no_look_action->setChecked(context_menu_widget_->ocio_look().isEmpty()); + no_look_action->setChecked(transform.look().isEmpty()); foreach (const QString& l, looks) { QAction* action = ocio_look_menu->addAction(l); action->setCheckable(true); - action->setChecked(context_menu_widget_->ocio_look() == l); + action->setChecked(transform.look() == l); action->setData(l); } } @@ -751,44 +760,9 @@ void ViewerWidget::ShuttleRight() PlayInternal(current_speed, false); } -void ViewerWidget::SetOCIOParameters(const QString &display, const QString &view, const QString &look) +void ViewerWidget::SetColorTransform(const ColorTransform &transform) { - SetOCIOParameters(display, view, look, main_gl_widget()); -} - -void ViewerWidget::SetOCIOParameters(const QString &display, const QString &view, const QString &look, ViewerGLWidget* sender) -{ - sender->SetOCIOParameters(display, view, look); -} - -void ViewerWidget::SetOCIODisplay(const QString &display) -{ - SetOCIODisplay(display, main_gl_widget()); -} - -void ViewerWidget::SetOCIODisplay(const QString &display, ViewerGLWidget* sender) -{ - sender->SetOCIODisplay(display); -} - -void ViewerWidget::SetOCIOView(const QString &view) -{ - SetOCIOView(view, main_gl_widget()); -} - -void ViewerWidget::SetOCIOLook(const QString &look) -{ - SetOCIOLook(look, main_gl_widget()); -} - -void ViewerWidget::SetOCIOView(const QString &view, ViewerGLWidget* sender) -{ - sender->SetOCIOView(view); -} - -void ViewerWidget::SetOCIOLook(const QString &look, ViewerGLWidget* sender) -{ - sender->SetOCIOLook(look); + SetColorTransform(transform, main_gl_widget()); } void ViewerWidget::SetSignalCursorColorEnabled(bool e) @@ -909,17 +883,35 @@ void ViewerWidget::LengthChangedSlot(const rational &length) void ViewerWidget::ContextMenuOCIODisplay(QAction* action) { - SetOCIODisplay(action->data().toString(), context_menu_widget_); + const ColorTransform& old_transform = context_menu_widget_->GetColorTransform(); + + ColorTransform new_transform = context_menu_widget_->color_manager()->GetCompliantColorSpace(ColorTransform(action->data().toString(), + old_transform.view(), + old_transform.look())); + + SetColorTransform(new_transform, context_menu_widget_); } void ViewerWidget::ContextMenuOCIOView(QAction *action) { - SetOCIOView(action->data().toString(), context_menu_widget_); + const ColorTransform& old_transform = context_menu_widget_->GetColorTransform(); + + ColorTransform new_transform = context_menu_widget_->color_manager()->GetCompliantColorSpace(ColorTransform(old_transform.display(), + action->data().toString(), + old_transform.look())); + + SetColorTransform(new_transform, context_menu_widget_); } void ViewerWidget::ContextMenuOCIOLook(QAction *action) { - SetOCIOLook(action->data().toString(), context_menu_widget_); + const ColorTransform& old_transform = context_menu_widget_->GetColorTransform(); + + ColorTransform new_transform = context_menu_widget_->color_manager()->GetCompliantColorSpace(ColorTransform(old_transform.display(), + old_transform.view(), + action->data().toString())); + + SetColorTransform(new_transform, context_menu_widget_); } void ViewerWidget::SetDividerFromMenu(QAction *action) diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index 1f790a90e..53d1b00a3 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -98,28 +98,7 @@ public slots: void ShuttleRight(); - void SetOCIOParameters(const QString& display, const QString& view, const QString& look); - - /** - * @brief Externally set the OCIO display to use - * - * This value must be a valid display in the current OCIO configuration. - */ - void SetOCIODisplay(const QString& display); - - /** - * @brief Externally set the OCIO view to use - * - * This value must be a valid display in the current OCIO configuration. - */ - void SetOCIOView(const QString& view); - - /** - * @brief Externally set the OCIO look to use (use empty string if none) - * - * This value must be a valid display in the current OCIO configuration. - */ - void SetOCIOLook(const QString& look); + void SetColorTransform(const ColorTransform& transform); /** * @brief Wrapper for ViewerGLWidget::SetSignalCursorColorEnabled() @@ -197,10 +176,7 @@ private: void UpdateMinimumScale(); - void SetOCIOParameters(const QString& display, const QString& view, const QString& look, ViewerGLWidget* sender); - void SetOCIODisplay(const QString& display, ViewerGLWidget* sender); - void SetOCIOView(const QString& view, ViewerGLWidget* sender); - void SetOCIOLook(const QString& look, ViewerGLWidget* sender); + void SetColorTransform(const ColorTransform& transform, ViewerGLWidget* sender); QStackedWidget* stack_; diff --git a/app/widget/viewer/viewerglwidget.cpp b/app/widget/viewer/viewerglwidget.cpp index 00d4c943d..6697b3a7b 100644 --- a/app/widget/viewer/viewerglwidget.cpp +++ b/app/widget/viewer/viewerglwidget.cpp @@ -63,16 +63,16 @@ void ViewerGLWidget::ConnectColorManager(ColorManager *color_manager) } if (color_manager_ != nullptr) { - disconnect(color_manager_, &ColorManager::ConfigChanged, this, &ViewerGLWidget::RefreshColorPipeline); + disconnect(color_manager_, &ColorManager::ConfigChanged, this, &ViewerGLWidget::ColorConfigChanged); } color_manager_ = color_manager; if (color_manager_ != nullptr) { - connect(color_manager_, &ColorManager::ConfigChanged, this, &ViewerGLWidget::RefreshColorPipeline); + connect(color_manager_, &ColorManager::ConfigChanged, this, &ViewerGLWidget::ColorConfigChanged); } - RefreshColorPipeline(); + ColorConfigChanged(); } void ViewerGLWidget::DisconnectColorManager() @@ -185,55 +185,11 @@ void ViewerGLWidget::SetEmitDrewManagedTextureEnabled(bool e) } } -void ViewerGLWidget::SetOCIODisplay(const QString &display) -{ - ocio_display_ = display; - - // Determine if the selected view is available in this display - if (color_manager_ - && !color_manager_->ListAvailableViews(ocio_display_).contains(ocio_view_)) { - // If not, set to the default view for this display - ocio_view_ = color_manager_->GetDefaultView(ocio_display_); - } - - SetupColorProcessor(); - update(); -} - -void ViewerGLWidget::SetOCIOView(const QString &view) -{ - ocio_view_ = view; - SetupColorProcessor(); - update(); -} - -void ViewerGLWidget::SetOCIOLook(const QString &look) -{ - ocio_look_ = look; - SetupColorProcessor(); - update(); -} - ColorManager *ViewerGLWidget::color_manager() const { return color_manager_; } -const QString &ViewerGLWidget::ocio_display() const -{ - return ocio_display_; -} - -const QString &ViewerGLWidget::ocio_view() const -{ - return ocio_view_; -} - -const QString &ViewerGLWidget::ocio_look() const -{ - return ocio_look_; -} - void ViewerGLWidget::ConnectSibling(ViewerGLWidget *sibling) { connect(this, &ViewerGLWidget::LoadedBuffer, sibling, &ViewerGLWidget::SetImageFromLoadBuffer, Qt::QueuedConnection); @@ -252,6 +208,18 @@ void ViewerGLWidget::SetSafeMargins(const ViewerSafeMarginInfo &safe_margin) update(); } +const ColorTransform &ViewerGLWidget::GetColorTransform() const +{ + return color_transform_; +} + +void ViewerGLWidget::SetColorTransform(const ColorTransform &transform) +{ + color_transform_ = transform; + SetupColorProcessor(); + update(); +} + void ViewerGLWidget::mousePressEvent(QMouseEvent *event) { QOpenGLWidget::mousePressEvent(event); @@ -284,15 +252,6 @@ void ViewerGLWidget::mouseMoveEvent(QMouseEvent *event) } } -void ViewerGLWidget::SetOCIOParameters(const QString &display, const QString &view, const QString &look) -{ - ocio_display_ = display; - ocio_view_ = view; - ocio_look_ = look; - SetupColorProcessor(); - update(); -} - void ViewerGLWidget::initializeGL() { SetupColorProcessor(); @@ -416,30 +375,14 @@ void ViewerGLWidget::paintGL() } } -void ViewerGLWidget::RefreshColorPipeline() +void ViewerGLWidget::ColorConfigChanged() { if (!color_manager_) { color_service_ = nullptr; return; } - QStringList displays = color_manager_->ListAvailableDisplays(); - if (!displays.contains(ocio_display_)) { - ocio_display_ = color_manager_->GetDefaultDisplay(); - } - - QStringList views = color_manager_->ListAvailableViews(ocio_display_); - if (!views.contains(ocio_view_)) { - ocio_view_ = color_manager_->GetDefaultView(ocio_display_); - } - - QStringList looks = color_manager_->ListAvailableLooks(); - if (!looks.contains(ocio_look_)) { - ocio_look_.clear(); - } - - SetupColorProcessor(); - update(); + SetColorTransform(color_manager_->GetCompliantColorSpace(color_transform_, true)); } #ifdef Q_OS_LINUX @@ -467,17 +410,9 @@ void ViewerGLWidget::SetupColorProcessor() try { - if (ocio_view_.isEmpty()) { - color_service_ = OpenGLColorProcessor::Create(color_manager_, - color_manager_->GetReferenceColorSpace(), - ocio_display_); - } else { - color_service_ = OpenGLColorProcessor::Create(color_manager_, - color_manager_->GetReferenceColorSpace(), - ocio_display_, - ocio_view_, - ocio_look_); - } + color_service_ = OpenGLColorProcessor::Create(color_manager_, + color_manager_->GetReferenceColorSpace(), + color_transform_); makeCurrent(); color_service_->Enable(context(), true); diff --git a/app/widget/viewer/viewerglwidget.h b/app/widget/viewer/viewerglwidget.h index 03b756bfa..39620f994 100644 --- a/app/widget/viewer/viewerglwidget.h +++ b/app/widget/viewer/viewerglwidget.h @@ -80,10 +80,6 @@ public: ColorManager* color_manager() const; - const QString& ocio_display() const; - const QString& ocio_view() const; - const QString& ocio_look() const; - const QMatrix4x4& GetMatrix(); void ConnectSibling(ViewerGLWidget* sibling); @@ -91,38 +87,13 @@ public: const ViewerSafeMarginInfo& GetSafeMargin() const; void SetSafeMargins(const ViewerSafeMarginInfo& safe_margin); + const ColorTransform& GetColorTransform() const; + public slots: /** - * @brief Set the texture to draw and draw it - * - * Use this function to update the viewer. - * - * @param tex + * @brief Replaces the color transform with a new one */ - //void SetTexture(OpenGLTexturePtr tex); - - void SetOCIOParameters(const QString& display, const QString& view, const QString& look); - - /** - * @brief Externally set the OCIO display to use - * - * This value must be a valid display in the current OCIO configuration. - */ - void SetOCIODisplay(const QString& display); - - /** - * @brief Externally set the OCIO view to use - * - * This value must be a valid display in the current OCIO configuration. - */ - void SetOCIOView(const QString& view); - - /** - * @brief Externally set the OCIO look to use (use empty string if none) - * - * This value must be a valid display in the current OCIO configuration. - */ - void SetOCIOLook(const QString& look); + void SetColorTransform(const ColorTransform& transform); /** * @brief Set the transformation matrix to draw with @@ -231,19 +202,9 @@ private: void ClearOCIOLutTexture(); /** - * @brief Internal variable to set color space to + * @brief Internal color transform storage */ - QString ocio_display_; - - /** - * @brief Internal variable to set color space to - */ - QString ocio_view_; - - /** - * @brief Internal variable to set color space to - */ - QString ocio_look_; + ColorTransform color_transform_; /** * @brief Internal reference to the OpenGL texture to draw. Set in SetTexture() and used in paintGL(). @@ -308,7 +269,7 @@ private slots: /** * @brief Sets all color settings to the defaults pertaining to this configuration */ - void RefreshColorPipeline(); + void ColorConfigChanged(); #ifdef Q_OS_LINUX /**