From 83f58e27da5d705413707f30a52746bd380db92a Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Thu, 10 Mar 2022 18:09:43 +0000 Subject: [PATCH 01/16] Use MenuHelper to clean up input menu --- .../videostreamproperties.cpp | 22 ++++++++++++++----- app/render/ocioconf/config.ocio | 14 ++++++++---- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp index 6fcbdd914c..7fc845152d 100644 --- a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp +++ b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp @@ -65,14 +65,24 @@ VideoStreamProperties::VideoStreamProperties(Footage *footage, int video_index) video_color_space_ = new QComboBox(); OCIO::ConstConfigRcPtr config = footage_->project()->color_manager()->GetConfig(); - int number_of_colorspaces = config->getNumColorSpaces(); - video_color_space_->addItem(tr("Default (%1)").arg(footage_->project()->color_manager()->GetDefaultInputColorSpace())); + OCIO::ColorSpaceMenuHelperRcPtr menu_helper; + auto params = OCIO::ColorSpaceMenuParameters::Create(config); + params->setAppCategories("Camera"); + menu_helper = OCIO::ColorSpaceMenuHelper::Create(params); - for (int i=0;igetColorSpaceNameByIndex(i); - - video_color_space_->addItem(colorspace); + if (menu_helper->getNumColorSpaces() > 0) { + for (int i = 0; i < menu_helper->getNumColorSpaces(); i++) { + QString colorspace = menu_helper->getName(i); + video_color_space_->addItem(colorspace); + video_color_space_->setItemData(i, menu_helper->getDescription(i), Qt::ToolTipRole); + } + } else { + // Config doesn't use our Camera category so fall back and list all available color spaces + for (int i = 0; i < config->getNumColorSpaces(); i++) { + QString colorspace = config->getColorSpaceNameByIndex(i); + video_color_space_->addItem(colorspace); + } } video_color_space_->setCurrentText(vp.colorspace()); diff --git a/app/render/ocioconf/config.ocio b/app/render/ocioconf/config.ocio index 0253fb63bf..770686dfa1 100755 --- a/app/render/ocioconf/config.ocio +++ b/app/render/ocioconf/config.ocio @@ -7,7 +7,7 @@ # Price, Nick Shaw, and Timothy # Lottes. -ocio_profile_version: 1 +ocio_profile_version: 2 search_path: "luts:looks" strictparsing: true @@ -46,7 +46,7 @@ displays: - ! {name: Linear Raw, colorspace: Linear} - ! {name: Filmic Log Encoding Base, colorspace: AppleP3 Filmic Log Encoding} -active_displays: [sRGB, BT.1886, Apple Display P3, None] +active_displays: [sRGB, BT.1886, Apple Display P3] #active_views: [Filmic Log Encoding Base, sRGB OETF, Non-Colour Data, Linear Raw, No View] colorspaces: @@ -86,6 +86,7 @@ colorspaces: description: | sRGB specification display referred Optical-Electro Transfer Function. isdata: false + categories: [ Camera ] allocation: uniform allocationvars: [0.0, 1.0] to_reference: ! {src: sRGB_OETF_to_Linear.spi1d, interpolation: linear} @@ -183,6 +184,7 @@ colorspaces: description: | Fuji F-Log transfer function isdata: false + categories: [ Camera ] allocation: uniform allocationvars: [0, 1] to_reference: ! {src: F-Log_to_Linear.spi1d, interpolation: linear} @@ -195,6 +197,7 @@ colorspaces: description: | Fuji F-Log / F-Gamut isdata: false + categories: [ Camera ] allocation: uniform allocationvars: [0, 1] to_reference: ! @@ -211,6 +214,7 @@ colorspaces: description: | Panasonic V-Log / V-Gamut isdata: false + categories: [ Camera ] allocation: uniform allocationvars: [0, 1] to_reference: ! @@ -224,8 +228,9 @@ colorspaces: equalitygroup: "" bitdepth: 32f description: | - Panasonic V-Log / V-Gamut + Arri WIde Gamut at EI 800 isdata: false + categories: [ Camera ] allocation: uniform allocationvars: [0, 1] to_reference: ! @@ -239,8 +244,9 @@ colorspaces: equalitygroup: "" bitdepth: 32f description: | - Panasonic V-Log / V-Gamut + Arri Wide Gamut Space at EI 400 isdata: false + categories: [ Camera ] allocation: uniform allocationvars: [0, 1] to_reference: ! From d65470f51ce94c19ba17f78003945524227ec648 Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Fri, 11 Mar 2022 16:32:07 +0000 Subject: [PATCH 02/16] Improve config validation --- .../projectproperties/projectproperties.cpp | 1 + app/node/color/colormanager/colormanager.cpp | 30 +++++++++++++++---- app/node/color/colormanager/colormanager.h | 2 ++ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/app/dialog/projectproperties/projectproperties.cpp b/app/dialog/projectproperties/projectproperties.cpp index 2c75edc9ed..cadeab644b 100644 --- a/app/dialog/projectproperties/projectproperties.cpp +++ b/app/dialog/projectproperties/projectproperties.cpp @@ -219,6 +219,7 @@ void ProjectPropertiesDialog::OCIOFilenameUpdated() c = ColorManager::GetDefaultConfig(); } else { c = ColorManager::CreateConfigFromFile(ocio_filename_->text()); + c->validate(); } ocio_filename_->setStyleSheet(QString()); diff --git a/app/node/color/colormanager/colormanager.cpp b/app/node/color/colormanager/colormanager.cpp index 4f946a5138..9b8de4ea2e 100644 --- a/app/node/color/colormanager/colormanager.cpp +++ b/app/node/color/colormanager/colormanager.cpp @@ -79,13 +79,8 @@ void ColorManager::SetUpDefaultConfig() { if (!qEnvironmentVariableIsEmpty("OCIO")) { // Attempt to set config from "OCIO" environment variable - try { - OCIO_SET_C_LOCALE_FOR_SCOPE; - default_config_ = OCIO::Config::CreateFromEnv(); - + if (LoadConfigFromPath(qEnvironmentVariable("OCIO"))) { return; - } catch (OCIO::Exception& e) { - qWarning() << "Failed to load config from OCIO environment variable config:" << e.what(); } } @@ -104,6 +99,29 @@ void ColorManager::SetUpDefaultConfig() } } +bool ColorManager::LoadConfigFromPath(QString path) +{ + try { + OCIO_SET_C_LOCALE_FOR_SCOPE; + default_config_ = OCIO::Config::CreateFromFile(path.toStdString().c_str()); + + try { + default_config_->validate(); + qInfo() << "Succesfully loaded OCIO config from: " << path; + return true; + } catch (OCIO::Exception &e) { + qWarning() << "Failed to validate config from OCIO environment vairable:" << e.what(); + } + + } catch (OCIO::Exception &e) { + qWarning() << "Failed to load config from OCIO environment variable config:" << e.what(); + } + + qWarning() << "Falling back on internal config."; + + return false; +} + void ColorManager::SetConfigFilename(const QString &filename) { SetStandardValue(kConfigFilenameIn, filename); diff --git a/app/node/color/colormanager/colormanager.h b/app/node/color/colormanager/colormanager.h index 2dccc72707..797bbf01f8 100644 --- a/app/node/color/colormanager/colormanager.h +++ b/app/node/color/colormanager/colormanager.h @@ -135,6 +135,8 @@ class ColorManager : public Node void SetConfig(OCIO::ConstConfigRcPtr config); + static bool LoadConfigFromPath(QString path); + OCIO::ConstConfigRcPtr config_; QMutex mutex_; From d3becaa0ffd05ab76faa10e2c9a9457f9b770317 Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Fri, 11 Mar 2022 19:45:03 +0000 Subject: [PATCH 03/16] Improve menu helper usage --- .../videostreamproperties.cpp | 17 +++++++------- .../projectproperties/projectproperties.cpp | 23 +++++++++++++------ app/node/color/colormanager/colormanager.cpp | 9 ++++++++ app/node/color/colormanager/colormanager.h | 2 ++ app/render/ocioconf/config.ocio | 19 ++++++++++----- 5 files changed, 49 insertions(+), 21 deletions(-) diff --git a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp index 7fc845152d..825616cf45 100644 --- a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp +++ b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp @@ -64,12 +64,10 @@ VideoStreamProperties::VideoStreamProperties(Footage *footage, int video_index) video_layout->addWidget(new QLabel(tr("Color Space:")), row, 0); video_color_space_ = new QComboBox(); - OCIO::ConstConfigRcPtr config = footage_->project()->color_manager()->GetConfig(); + ColorManager* color_manager = footage_->project()->color_manager(); + OCIO::ConstConfigRcPtr config = color_manager->GetConfig(); - OCIO::ColorSpaceMenuHelperRcPtr menu_helper; - auto params = OCIO::ColorSpaceMenuParameters::Create(config); - params->setAppCategories("Camera"); - menu_helper = OCIO::ColorSpaceMenuHelper::Create(params); + OCIO::ColorSpaceMenuHelperRcPtr menu_helper = color_manager->CreateMenuHelper(config, "Input"); if (menu_helper->getNumColorSpaces() > 0) { for (int i = 0; i < menu_helper->getNumColorSpaces(); i++) { @@ -78,14 +76,17 @@ VideoStreamProperties::VideoStreamProperties(Footage *footage, int video_index) video_color_space_->setItemData(i, menu_helper->getDescription(i), Qt::ToolTipRole); } } else { - // Config doesn't use our Camera category so fall back and list all available color spaces + // Config doesn't use our Input category so fall back and list all available color spaces for (int i = 0; i < config->getNumColorSpaces(); i++) { QString colorspace = config->getColorSpaceNameByIndex(i); video_color_space_->addItem(colorspace); } } - - video_color_space_->setCurrentText(vp.colorspace()); + if (!vp.colorspace().isEmpty()) { + video_color_space_->setCurrentText(vp.colorspace()); + } else { + video_color_space_->setCurrentIndex(video_color_space_->findText(color_manager->GetDefaultInputColorSpace())); + } video_layout->addWidget(video_color_space_, row, 1); diff --git a/app/dialog/projectproperties/projectproperties.cpp b/app/dialog/projectproperties/projectproperties.cpp index cadeab644b..512dcf8a5f 100644 --- a/app/dialog/projectproperties/projectproperties.cpp +++ b/app/dialog/projectproperties/projectproperties.cpp @@ -225,16 +225,25 @@ void ProjectPropertiesDialog::OCIOFilenameUpdated() ocio_filename_->setStyleSheet(QString()); ocio_config_is_valid_ = true; - // List input color spaces - QStringList input_cs = ColorManager::ListAvailableColorspaces(c); + OCIO::ColorSpaceMenuHelperRcPtr menu_helper = ColorManager::CreateMenuHelper(c, "Input"); - foreach (QString cs, input_cs) { - default_input_colorspace_->addItem(cs); - - if (cs == working_project_->color_manager()->GetDefaultInputColorSpace()) { - default_input_colorspace_->setCurrentIndex(default_input_colorspace_->count()-1); + if (menu_helper->getNumColorSpaces() > 0) { + for (int i = 0; i < menu_helper->getNumColorSpaces(); i++) { + QString colorspace = menu_helper->getName(i); + default_input_colorspace_->addItem(colorspace); + default_input_colorspace_->setItemData(i, menu_helper->getDescription(i), Qt::ToolTipRole); + } + } else { + // Config doesn't use our Input category so fall back and list all available color spaces + for (int i = 0; i < c->getNumColorSpaces(); i++) { + QString colorspace = c->getColorSpaceNameByIndex(i); + default_input_colorspace_->addItem(colorspace); } } + + default_input_colorspace_->setCurrentIndex(default_input_colorspace_->findText( + working_project_->color_manager()->GetDefaultInputColorSpace())); + } catch (OCIO::Exception& e) { ocio_config_is_valid_ = false; ocio_filename_->setStyleSheet(QStringLiteral("QLineEdit {color: red;}")); diff --git a/app/node/color/colormanager/colormanager.cpp b/app/node/color/colormanager/colormanager.cpp index 9b8de4ea2e..65b95553f0 100644 --- a/app/node/color/colormanager/colormanager.cpp +++ b/app/node/color/colormanager/colormanager.cpp @@ -269,6 +269,15 @@ void ColorManager::GetDefaultLumaCoefs(double *rgb) const config_->getDefaultLumaCoefs(rgb); } +OCIO::ColorSpaceMenuHelperRcPtr ColorManager::CreateMenuHelper(OCIO::ConstConfigRcPtr config, QString categories) { + OCIO::ColorSpaceMenuHelperRcPtr menu_helper; + auto params = OCIO::ColorSpaceMenuParameters::Create(config); + params->setAppCategories(categories.toStdString().c_str()); + menu_helper = OCIO::ColorSpaceMenuHelper::Create(params); + + return menu_helper; +} + void ColorManager::Retranslate() { SetInputName(kConfigFilenameIn, tr("Configuration")); diff --git a/app/node/color/colormanager/colormanager.h b/app/node/color/colormanager/colormanager.h index 797bbf01f8..1bacfaba80 100644 --- a/app/node/color/colormanager/colormanager.h +++ b/app/node/color/colormanager/colormanager.h @@ -101,6 +101,8 @@ class ColorManager : public Node void GetDefaultLumaCoefs(double *rgb) const; + static OCIO::ColorSpaceMenuHelperRcPtr CreateMenuHelper(OCIO::ConstConfigRcPtr config, QString categories = QString()); + class SetLocale { public: diff --git a/app/render/ocioconf/config.ocio b/app/render/ocioconf/config.ocio index 770686dfa1..999275ec5f 100755 --- a/app/render/ocioconf/config.ocio +++ b/app/render/ocioconf/config.ocio @@ -9,6 +9,7 @@ ocio_profile_version: 2 +environment: {} search_path: "luts:looks" strictparsing: true luma: [0.2126, 0.7152, 0.0722] @@ -49,6 +50,10 @@ displays: active_displays: [sRGB, BT.1886, Apple Display P3] #active_views: [Filmic Log Encoding Base, sRGB OETF, Non-Colour Data, Linear Raw, No View] +file_rules: + - ! {name: OpenEXR, extension: "exr", pattern: "*", colorspace: Linear} + - ! {name: Default, colorspace: default} + colorspaces: - ! name: Linear @@ -58,6 +63,7 @@ colorspaces: description: | ITU BT.709 primaries based scene referred linear space. isdata: false + categories: [ Input ] allocation: lg2 allocationvars: [-12.4739311883, 12.5260688117, 0.00392156862] @@ -86,7 +92,7 @@ colorspaces: description: | sRGB specification display referred Optical-Electro Transfer Function. isdata: false - categories: [ Camera ] + categories: [ Input ] allocation: uniform allocationvars: [0.0, 1.0] to_reference: ! {src: sRGB_OETF_to_Linear.spi1d, interpolation: linear} @@ -184,7 +190,7 @@ colorspaces: description: | Fuji F-Log transfer function isdata: false - categories: [ Camera ] + categories: [ Camera, Input ] allocation: uniform allocationvars: [0, 1] to_reference: ! {src: F-Log_to_Linear.spi1d, interpolation: linear} @@ -197,7 +203,7 @@ colorspaces: description: | Fuji F-Log / F-Gamut isdata: false - categories: [ Camera ] + categories: [ Camera, Input ] allocation: uniform allocationvars: [0, 1] to_reference: ! @@ -214,7 +220,7 @@ colorspaces: description: | Panasonic V-Log / V-Gamut isdata: false - categories: [ Camera ] + categories: [ Camera, Input ] allocation: uniform allocationvars: [0, 1] to_reference: ! @@ -230,7 +236,7 @@ colorspaces: description: | Arri WIde Gamut at EI 800 isdata: false - categories: [ Camera ] + categories: [ Camera, Input ] allocation: uniform allocationvars: [0, 1] to_reference: ! @@ -246,7 +252,7 @@ colorspaces: description: | Arri Wide Gamut Space at EI 400 isdata: false - categories: [ Camera ] + categories: [ Camera, Input ] allocation: uniform allocationvars: [0, 1] to_reference: ! @@ -262,6 +268,7 @@ colorspaces: equalitygroup: bitdepth: 32f isdata: true + categories: [ Input ] allocation: uniform allocationvars: [0, 1] From 06ccfbcab93f62d982f9e8aba57148c353925617 Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Fri, 11 Mar 2022 21:44:33 +0000 Subject: [PATCH 04/16] Use file rules to try and set the correct color space --- .../videostreamproperties.cpp | 2 +- app/node/project/footage/footage.cpp | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp index 825616cf45..206b44c687 100644 --- a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp +++ b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp @@ -83,7 +83,7 @@ VideoStreamProperties::VideoStreamProperties(Footage *footage, int video_index) } } if (!vp.colorspace().isEmpty()) { - video_color_space_->setCurrentText(vp.colorspace()); + video_color_space_->setCurrentText(color_manager->GetConfig()->getCanonicalName(vp.colorspace().toStdString().c_str())); } else { video_color_space_->setCurrentIndex(video_color_space_->findText(color_manager->GetDefaultInputColorSpace())); } diff --git a/app/node/project/footage/footage.cpp b/app/node/project/footage/footage.cpp index de87caa4f3..57d9a14a24 100644 --- a/app/node/project/footage/footage.cpp +++ b/app/node/project/footage/footage.cpp @@ -123,6 +123,28 @@ void Footage::InputValueChangedEvent(const QString &input, int element) // FIXME: Make this customizable vp.set_divider(VideoParams::generate_auto_divider(vp.width(), vp.height())); + // FIXME: Expand to use metadata from files + QString colorspace = ColorManager::GetDefaultConfig()->getColorSpaceFromFilepath(filename().toStdString().c_str()); + QString default_rule_space = ColorManager::GetDefaultConfig()->getFileRules()->getColorSpace( + ColorManager::GetDefaultConfig()->getFileRules()->getNumEntries() - 1); + + if (colorspace.compare(default_rule_space) == 0) { + // If our file rules haven't worked and the config has a default float and byte type + // try and set them based on the buffer type + if (ColorManager::GetDefaultConfig()->hasRole("default_byte") && + ColorManager::GetDefaultConfig()->hasRole("default_float")) { + if (vp.format() == VideoParams::Format::kFormatUnsigned8 || + vp.format() == VideoParams::Format::kFormatUnsigned16) { + colorspace = "default_byte"; + } else if (vp.format() == VideoParams::Format::kFormatFloat16 || + vp.format() == VideoParams::Format::kFormatFloat32) { + colorspace = "default_float"; + } + } + } + + vp.set_colorspace(colorspace); + AddStream(Track::kVideo, QVariant::fromValue(vp)); } From fb5451fa7a5d61b22a470385006b2f44dc4e835f Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Fri, 11 Mar 2022 21:45:09 +0000 Subject: [PATCH 05/16] Improve comments --- app/node/project/footage/footage.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/node/project/footage/footage.cpp b/app/node/project/footage/footage.cpp index 57d9a14a24..9d26a6ae8e 100644 --- a/app/node/project/footage/footage.cpp +++ b/app/node/project/footage/footage.cpp @@ -124,13 +124,16 @@ void Footage::InputValueChangedEvent(const QString &input, int element) vp.set_divider(VideoParams::generate_auto_divider(vp.width(), vp.height())); // FIXME: Expand to use metadata from files + + // Attempt to use file rules to set colorspace QString colorspace = ColorManager::GetDefaultConfig()->getColorSpaceFromFilepath(filename().toStdString().c_str()); + QString default_rule_space = ColorManager::GetDefaultConfig()->getFileRules()->getColorSpace( ColorManager::GetDefaultConfig()->getFileRules()->getNumEntries() - 1); + // If the config file rules haven't worked AND the config has a default float and byte type + // try and set them based on the buffer type if (colorspace.compare(default_rule_space) == 0) { - // If our file rules haven't worked and the config has a default float and byte type - // try and set them based on the buffer type if (ColorManager::GetDefaultConfig()->hasRole("default_byte") && ColorManager::GetDefaultConfig()->hasRole("default_float")) { if (vp.format() == VideoParams::Format::kFormatUnsigned8 || From f8090096b77a347ff4c6faf4ebd07881d57905ac Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Fri, 11 Mar 2022 23:22:31 +0000 Subject: [PATCH 06/16] config.ocio: Update family --- app/render/ocioconf/config.ocio | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/render/ocioconf/config.ocio b/app/render/ocioconf/config.ocio index 999275ec5f..bec027ec68 100755 --- a/app/render/ocioconf/config.ocio +++ b/app/render/ocioconf/config.ocio @@ -184,7 +184,7 @@ colorspaces: - ! name: Fuji F-Log OETF - family: Camera Footage + family: Input/Fuji equalitygroup: "" bitdepth: 32f description: | @@ -197,7 +197,7 @@ colorspaces: - ! name: Fuji F-Log F-Gamut - family: "" + family: Input/Fuji equalitygroup: "" bitdepth: 32f description: | @@ -214,7 +214,7 @@ colorspaces: - ! name: Panasonic V-Log V-Gamut - family: Camera Footage + family: Input/Panasonic equalitygroup: "" bitdepth: 32f description: | @@ -230,7 +230,7 @@ colorspaces: - ! name: Arri Wide Gamut / LogC EI 800 - family: Camera Footage + family: Input/Arri equalitygroup: "" bitdepth: 32f description: | @@ -246,7 +246,7 @@ colorspaces: - ! name: Arri Wide Gamut / LogC EI 400 - family: Camera Footage + family: Input/Arri equalitygroup: "" bitdepth: 32f description: | From 02c4d3b429382906b9ce9696e636c0bacce93800 Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Sat, 12 Mar 2022 20:16:26 +0000 Subject: [PATCH 07/16] Implement ColorSpaceComboBox This is an extended version of QComboBox with a built in MenuHelper from OCIOv2. These menus are filtered based on config categories and sub menus are created by config familes. --- .../videostreamproperties.cpp | 32 ++------ .../streamproperties/videostreamproperties.h | 3 +- .../projectproperties/projectproperties.cpp | 26 ++----- .../projectproperties/projectproperties.h | 3 +- app/widget/CMakeLists.txt | 1 + app/widget/colorspacecombobox/CMakeLists.txt | 22 ++++++ .../colorspacecombobox/colorspacecombobox.cpp | 76 +++++++++++++++++++ .../colorspacecombobox/colorspacecombobox.h | 46 +++++++++++ 8 files changed, 161 insertions(+), 48 deletions(-) create mode 100644 app/widget/colorspacecombobox/CMakeLists.txt create mode 100644 app/widget/colorspacecombobox/colorspacecombobox.cpp create mode 100644 app/widget/colorspacecombobox/colorspacecombobox.h diff --git a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp index 206b44c687..2aa85e1029 100644 --- a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp +++ b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp @@ -63,29 +63,15 @@ VideoStreamProperties::VideoStreamProperties(Footage *footage, int video_index) video_layout->addWidget(new QLabel(tr("Color Space:")), row, 0); - video_color_space_ = new QComboBox(); + video_color_space_ = new ColorSpaceComboBox(footage_->project()->color_manager(), "Input", true, this); ColorManager* color_manager = footage_->project()->color_manager(); - OCIO::ConstConfigRcPtr config = color_manager->GetConfig(); - - OCIO::ColorSpaceMenuHelperRcPtr menu_helper = color_manager->CreateMenuHelper(config, "Input"); - - if (menu_helper->getNumColorSpaces() > 0) { - for (int i = 0; i < menu_helper->getNumColorSpaces(); i++) { - QString colorspace = menu_helper->getName(i); - video_color_space_->addItem(colorspace); - video_color_space_->setItemData(i, menu_helper->getDescription(i), Qt::ToolTipRole); - } - } else { - // Config doesn't use our Input category so fall back and list all available color spaces - for (int i = 0; i < config->getNumColorSpaces(); i++) { - QString colorspace = config->getColorSpaceNameByIndex(i); - video_color_space_->addItem(colorspace); - } - } + if (!vp.colorspace().isEmpty()) { - video_color_space_->setCurrentText(color_manager->GetConfig()->getCanonicalName(vp.colorspace().toStdString().c_str())); + video_color_space_->setPlaceholderText(color_manager->GetConfig()->getCanonicalName( + vp.colorspace().toStdString().c_str())); } else { - video_color_space_->setCurrentIndex(video_color_space_->findText(color_manager->GetDefaultInputColorSpace())); + video_color_space_->setPlaceholderText(color_manager->GetConfig()->getCanonicalName( + color_manager->GetDefaultInputColorSpace().toStdString().c_str())); } video_layout->addWidget(video_color_space_, row, 1); @@ -136,11 +122,7 @@ VideoStreamProperties::VideoStreamProperties(Footage *footage, int video_index) void VideoStreamProperties::Accept(MultiUndoCommand *parent) { - QString set_colorspace; - - if (video_color_space_->currentIndex() > 0) { - set_colorspace = video_color_space_->currentText(); - } + QString set_colorspace = video_color_space_->placeholderText(); VideoParams vp = footage_->GetVideoParams(video_index_); diff --git a/app/dialog/footageproperties/streamproperties/videostreamproperties.h b/app/dialog/footageproperties/streamproperties/videostreamproperties.h index ea689e2f08..227e0a7692 100644 --- a/app/dialog/footageproperties/streamproperties/videostreamproperties.h +++ b/app/dialog/footageproperties/streamproperties/videostreamproperties.h @@ -26,6 +26,7 @@ #include "node/project/footage/footage.h" #include "streamproperties.h" +#include "widget/colorspacecombobox/colorspacecombobox.h" #include "widget/slider/integerslider.h" #include "widget/standardcombos/standardcombos.h" @@ -54,7 +55,7 @@ class VideoStreamProperties : public StreamProperties /** * @brief Setting for this media's color space */ - QComboBox* video_color_space_; + ColorSpaceComboBox* video_color_space_; /** * @brief Setting for video interlacing diff --git a/app/dialog/projectproperties/projectproperties.cpp b/app/dialog/projectproperties/projectproperties.cpp index 512dcf8a5f..daefaca628 100644 --- a/app/dialog/projectproperties/projectproperties.cpp +++ b/app/dialog/projectproperties/projectproperties.cpp @@ -72,7 +72,7 @@ ProjectPropertiesDialog::ProjectPropertiesDialog(Project* p, QWidget *parent) : color_layout->addWidget(new QLabel(tr("Default Input Color Space:")), row, 0); - default_input_colorspace_ = new QComboBox(); + default_input_colorspace_ = new ColorSpaceComboBox(working_project_->color_manager(), "Input"); color_layout->addWidget(default_input_colorspace_, row, 1, 1, 2); row++; @@ -177,8 +177,8 @@ void ProjectPropertiesDialog::accept() if (working_project_->color_manager()->GetConfigFilename() != ocio_filename_->text()) { working_project_->color_manager()->SetConfigFilename(ocio_filename_->text()); } - if (working_project_->color_manager()->GetDefaultInputColorSpace() != default_input_colorspace_->currentText()) { - working_project_->color_manager()->SetDefaultInputColorSpace(default_input_colorspace_->currentText()); + if (working_project_->color_manager()->GetDefaultInputColorSpace() != default_input_colorspace_->placeholderText()) { + working_project_->color_manager()->SetDefaultInputColorSpace(default_input_colorspace_->placeholderText()); } super::accept(); @@ -225,24 +225,8 @@ void ProjectPropertiesDialog::OCIOFilenameUpdated() ocio_filename_->setStyleSheet(QString()); ocio_config_is_valid_ = true; - OCIO::ColorSpaceMenuHelperRcPtr menu_helper = ColorManager::CreateMenuHelper(c, "Input"); - - if (menu_helper->getNumColorSpaces() > 0) { - for (int i = 0; i < menu_helper->getNumColorSpaces(); i++) { - QString colorspace = menu_helper->getName(i); - default_input_colorspace_->addItem(colorspace); - default_input_colorspace_->setItemData(i, menu_helper->getDescription(i), Qt::ToolTipRole); - } - } else { - // Config doesn't use our Input category so fall back and list all available color spaces - for (int i = 0; i < c->getNumColorSpaces(); i++) { - QString colorspace = c->getColorSpaceNameByIndex(i); - default_input_colorspace_->addItem(colorspace); - } - } - - default_input_colorspace_->setCurrentIndex(default_input_colorspace_->findText( - working_project_->color_manager()->GetDefaultInputColorSpace())); + default_input_colorspace_->setPlaceholderText(working_project_->color_manager()->GetConfig()->getCanonicalName( + working_project_->color_manager()->GetDefaultInputColorSpace().toStdString().c_str())); } catch (OCIO::Exception& e) { ocio_config_is_valid_ = false; diff --git a/app/dialog/projectproperties/projectproperties.h b/app/dialog/projectproperties/projectproperties.h index e6963e5419..2853628b00 100644 --- a/app/dialog/projectproperties/projectproperties.h +++ b/app/dialog/projectproperties/projectproperties.h @@ -29,6 +29,7 @@ #include #include "node/project/project.h" +#include "widget/colorspacecombobox/colorspacecombobox.h" #include "widget/path/pathwidget.h" namespace olive { @@ -49,7 +50,7 @@ public slots: QLineEdit* ocio_filename_; - QComboBox* default_input_colorspace_; + ColorSpaceComboBox* default_input_colorspace_; bool ocio_config_is_valid_; diff --git a/app/widget/CMakeLists.txt b/app/widget/CMakeLists.txt index 9faf9c4627..7f0d0c086f 100644 --- a/app/widget/CMakeLists.txt +++ b/app/widget/CMakeLists.txt @@ -20,6 +20,7 @@ add_subdirectory(clickablelabel) add_subdirectory(collapsebutton) add_subdirectory(colorbutton) add_subdirectory(colorlabelmenu) +add_subdirectory(colorspacecombobox) add_subdirectory(colorwheel) add_subdirectory(columnedgridlayout) add_subdirectory(curvewidget) diff --git a/app/widget/colorspacecombobox/CMakeLists.txt b/app/widget/colorspacecombobox/CMakeLists.txt new file mode 100644 index 0000000000..1064e87812 --- /dev/null +++ b/app/widget/colorspacecombobox/CMakeLists.txt @@ -0,0 +1,22 @@ +# Olive - Non-Linear Video Editor +# Copyright (C) 2021 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 . + +set(OLIVE_SOURCES + ${OLIVE_SOURCES} + widget/colorspacecombobox/colorspacecombobox.cpp + widget/colorspacecombobox/colorspacecombobox.h + PARENT_SCOPE +) diff --git a/app/widget/colorspacecombobox/colorspacecombobox.cpp b/app/widget/colorspacecombobox/colorspacecombobox.cpp new file mode 100644 index 0000000000..dee5c804ac --- /dev/null +++ b/app/widget/colorspacecombobox/colorspacecombobox.cpp @@ -0,0 +1,76 @@ +/*** + Olive - Non-Linear Video Editor + Copyright (C) 2021 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 . +***/ + +#include "colorspacecombobox.h" + +#include +#include + +#include "ui/colorcoding.h" + +namespace olive { + +ColorSpaceComboBox::ColorSpaceComboBox(ColorManager* color_manager, QString categories, bool use_family, QWidget* parent) : + QComboBox(parent), + color_manager_(color_manager), + categories_(categories), + use_family_(use_family) +{ + +} + +void ColorSpaceComboBox::showPopup() +{ + QMenu menu(this); + menu.setMinimumWidth(width()); + + OCIO::ConstConfigRcPtr config = color_manager_->GetConfig(); + + OCIO::ColorSpaceMenuHelperRcPtr menu_helper = color_manager_->CreateMenuHelper(config, categories_); + + QMap submenu_map; + + for (int i = 0; i < menu_helper->getNumColorSpaces(); i++) { + QString colorspace = menu_helper->getName(i); + QString family = menu_helper->getFamily(i); + + QAction* item = new QAction(colorspace); + item->setData(colorspace); + item->setToolTip(menu_helper->getDescription(i)); + + if (!family.isEmpty()) { + QString submenu_title = family.split(config->getFamilySeparator()).last(); + if (!submenu_map.keys().contains(submenu_title)) { + QMenu* submenu = new QMenu(submenu_title); + submenu_map.insert(submenu_title, submenu); + submenu->addAction(item); + menu.addMenu(submenu); + } else { + submenu_map.value(submenu_title)->addAction(item); + } + + } else { + menu.addAction(item); + } + } + + QAction* a = menu.exec(parentWidget()->mapToGlobal(pos())); + + if (a) { + this->setPlaceholderText(a->data().toString()); + } +} + +} diff --git a/app/widget/colorspacecombobox/colorspacecombobox.h b/app/widget/colorspacecombobox/colorspacecombobox.h new file mode 100644 index 0000000000..f558b4fed9 --- /dev/null +++ b/app/widget/colorspacecombobox/colorspacecombobox.h @@ -0,0 +1,46 @@ +/*** + Olive - Non-Linear Video Editor + Copyright (C) 2021 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 COLORSPACECOMBOBOX_H +#define COLORSPACECOMBOBOX_H + +#include + +#include "node/color/colormanager/colormanager.h" + + +namespace olive { + +class ColorSpaceComboBox : public QComboBox +{ + Q_OBJECT +public: + ColorSpaceComboBox(ColorManager* color_manager, QString categories, bool use_family = true, QWidget* parent = nullptr); + + virtual void showPopup() override; + +private: + + ColorManager* color_manager_;// + + QString categories_; + + bool use_family_; + +}; + +} + +#endif // COLORSPACECOMBOBOX_H \ No newline at end of file From 3d71382419519b2e7968fd6fdbc10dcefb2c2b51 Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Sat, 12 Mar 2022 21:04:12 +0000 Subject: [PATCH 08/16] Add default float and byte color spaces These replace the previous default color space. If an OCIO config has the roles default_byte and default_float we use them. Otherwise we fall back onto OCIO::ROLE_DEAFULT. --- .../videostreamproperties.cpp | 9 +++- .../projectproperties/projectproperties.cpp | 30 ++++++++---- .../projectproperties/projectproperties.h | 3 +- app/node/color/colormanager/colormanager.cpp | 47 ++++++++++++++----- app/node/color/colormanager/colormanager.h | 11 +++-- app/node/project/footage/footage.cpp | 31 ++++++------ app/widget/colorwheel/colorspacechooser.cpp | 4 +- 7 files changed, 95 insertions(+), 40 deletions(-) diff --git a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp index 2aa85e1029..d035965d1a 100644 --- a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp +++ b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp @@ -70,8 +70,15 @@ VideoStreamProperties::VideoStreamProperties(Footage *footage, int video_index) video_color_space_->setPlaceholderText(color_manager->GetConfig()->getCanonicalName( vp.colorspace().toStdString().c_str())); } else { + QString colorspace; + if (vp.format() == VideoParams::Format::kFormatUnsigned8 || + vp.format() == VideoParams::Format::kFormatUnsigned16) { + colorspace = color_manager->GetDefaultByteInputColorSpace(); + } else { + colorspace = color_manager->GetDefaultFloatInputColorSpace(); + } video_color_space_->setPlaceholderText(color_manager->GetConfig()->getCanonicalName( - color_manager->GetDefaultInputColorSpace().toStdString().c_str())); + colorspace.toStdString().c_str())); } video_layout->addWidget(video_color_space_, row, 1); diff --git a/app/dialog/projectproperties/projectproperties.cpp b/app/dialog/projectproperties/projectproperties.cpp index daefaca628..7b74f5b906 100644 --- a/app/dialog/projectproperties/projectproperties.cpp +++ b/app/dialog/projectproperties/projectproperties.cpp @@ -70,10 +70,17 @@ ProjectPropertiesDialog::ProjectPropertiesDialog(Project* p, QWidget *parent) : row++; - color_layout->addWidget(new QLabel(tr("Default Input Color Space:")), row, 0); + color_layout->addWidget(new QLabel(tr("Default Float Input Color Space:")), row, 0); - default_input_colorspace_ = new ColorSpaceComboBox(working_project_->color_manager(), "Input"); - color_layout->addWidget(default_input_colorspace_, row, 1, 1, 2); + default_float_input_colorspace_ = new ColorSpaceComboBox(working_project_->color_manager(), "Input"); + color_layout->addWidget(default_float_input_colorspace_, row, 1, 1, 2); + + row++; + + color_layout->addWidget(new QLabel(tr("Default Byte Input Color Space:")), row, 0); + + default_byte_input_colorspace_ = new ColorSpaceComboBox(working_project_->color_manager(), "Input"); + color_layout->addWidget(default_byte_input_colorspace_, row, 1, 1, 2); row++; @@ -177,8 +184,11 @@ void ProjectPropertiesDialog::accept() if (working_project_->color_manager()->GetConfigFilename() != ocio_filename_->text()) { working_project_->color_manager()->SetConfigFilename(ocio_filename_->text()); } - if (working_project_->color_manager()->GetDefaultInputColorSpace() != default_input_colorspace_->placeholderText()) { - working_project_->color_manager()->SetDefaultInputColorSpace(default_input_colorspace_->placeholderText()); + if (working_project_->color_manager()->GetDefaultFloatInputColorSpace() != default_float_input_colorspace_->placeholderText()) { + working_project_->color_manager()->SetDefaultFloatInputColorSpace(default_float_input_colorspace_->placeholderText()); + } + if (working_project_->color_manager()->GetDefaultByteInputColorSpace() != default_byte_input_colorspace_->placeholderText()) { + working_project_->color_manager()->SetDefaultByteInputColorSpace(default_byte_input_colorspace_->placeholderText()); } super::accept(); @@ -210,7 +220,8 @@ void ProjectPropertiesDialog::BrowseForOCIOConfig() void ProjectPropertiesDialog::OCIOFilenameUpdated() { - default_input_colorspace_->clear(); + default_float_input_colorspace_->clear(); + default_byte_input_colorspace_->clear(); try { OCIO::ConstConfigRcPtr c; @@ -225,8 +236,11 @@ void ProjectPropertiesDialog::OCIOFilenameUpdated() ocio_filename_->setStyleSheet(QString()); ocio_config_is_valid_ = true; - default_input_colorspace_->setPlaceholderText(working_project_->color_manager()->GetConfig()->getCanonicalName( - working_project_->color_manager()->GetDefaultInputColorSpace().toStdString().c_str())); + default_float_input_colorspace_->setPlaceholderText(working_project_->color_manager()->GetConfig()->getCanonicalName( + working_project_->color_manager()->GetDefaultFloatInputColorSpace().toStdString().c_str())); + + default_byte_input_colorspace_->setPlaceholderText(working_project_->color_manager()->GetConfig()->getCanonicalName( + working_project_->color_manager()->GetDefaultByteInputColorSpace().toStdString().c_str())); } catch (OCIO::Exception& e) { ocio_config_is_valid_ = false; diff --git a/app/dialog/projectproperties/projectproperties.h b/app/dialog/projectproperties/projectproperties.h index 2853628b00..0a75dcc497 100644 --- a/app/dialog/projectproperties/projectproperties.h +++ b/app/dialog/projectproperties/projectproperties.h @@ -50,7 +50,8 @@ public slots: QLineEdit* ocio_filename_; - ColorSpaceComboBox* default_input_colorspace_; + ColorSpaceComboBox* default_float_input_colorspace_; + ColorSpaceComboBox* default_byte_input_colorspace_; bool ocio_config_is_valid_; diff --git a/app/node/color/colormanager/colormanager.cpp b/app/node/color/colormanager/colormanager.cpp index 65b95553f0..c8f1996409 100644 --- a/app/node/color/colormanager/colormanager.cpp +++ b/app/node/color/colormanager/colormanager.cpp @@ -31,7 +31,8 @@ namespace olive { const QString ColorManager::kConfigFilenameIn = QStringLiteral("config"); -const QString ColorManager::kDefaultColorspaceIn = QStringLiteral("default_input"); +const QString ColorManager::kDefaultFloatColorspaceIn = QStringLiteral("default_float_input"); +const QString ColorManager::kDefaultByteColorspaceIn = QStringLiteral("default_byte_input"); const QString ColorManager::kReferenceSpaceIn = QStringLiteral("reference_space"); OCIO::ConstConfigRcPtr ColorManager::default_config_ = nullptr; @@ -43,14 +44,27 @@ ColorManager::ColorManager() : AddInput(kConfigFilenameIn, NodeValue::kFile, InputFlags(kInputFlagNotConnectable | kInputFlagNotKeyframable)); // Colorspace input - AddInput(kDefaultColorspaceIn, NodeValue::kCombo, InputFlags(kInputFlagNotConnectable | kInputFlagNotKeyframable)); + AddInput(kDefaultFloatColorspaceIn, NodeValue::kCombo, InputFlags(kInputFlagNotConnectable | kInputFlagNotKeyframable)); + AddInput(kDefaultByteColorspaceIn, NodeValue::kCombo, InputFlags(kInputFlagNotConnectable | kInputFlagNotKeyframable)); // Default reference space is scene linear AddInput(kReferenceSpaceIn, NodeValue::kCombo, 0, InputFlags(kInputFlagNotConnectable | kInputFlagNotKeyframable)); // Set config to our built-in default SetConfig(GetDefaultConfig()); - SetDefaultInputColorSpace(config_->getCanonicalName(OCIO::ROLE_DEFAULT)); + + if (config_->hasRole("default_float")) { + SetDefaultFloatInputColorSpace(config_->getCanonicalName("default_float")); + } + else { + SetDefaultFloatInputColorSpace(config_->getCanonicalName(OCIO::ROLE_DEFAULT)); + } + + if (config_->hasRole("default_byte")) { + SetDefaultByteInputColorSpace(config_->getCanonicalName("default_byte")); + } else { + SetDefaultByteInputColorSpace(config_->getCanonicalName(OCIO::ROLE_DEFAULT)); + } } OCIO::ConstConfigRcPtr ColorManager::GetConfig() const @@ -181,14 +195,24 @@ QStringList ColorManager::ListAvailableColorspaces() const return ListAvailableColorspaces(config_); } -QString ColorManager::GetDefaultInputColorSpace() const +QString ColorManager::GetDefaultFloatInputColorSpace() const +{ + return ListAvailableColorspaces().at(GetStandardValue(kDefaultFloatColorspaceIn).toInt()); +} + +void ColorManager::SetDefaultFloatInputColorSpace(const QString &s) +{ + SetStandardValue(kDefaultFloatColorspaceIn, ListAvailableColorspaces().indexOf(s)); +} + +QString ColorManager::GetDefaultByteInputColorSpace() const { - return ListAvailableColorspaces().at(GetStandardValue(kDefaultColorspaceIn).toInt()); + return ListAvailableColorspaces().at(GetStandardValue(kDefaultByteColorspaceIn).toInt()); } -void ColorManager::SetDefaultInputColorSpace(const QString &s) +void ColorManager::SetDefaultByteInputColorSpace(const QString &s) { - SetStandardValue(kDefaultColorspaceIn, ListAvailableColorspaces().indexOf(s)); + SetStandardValue(kDefaultByteColorspaceIn, ListAvailableColorspaces().indexOf(s)); } QString ColorManager::GetReferenceColorSpace() const @@ -207,7 +231,7 @@ QString ColorManager::GetCompliantColorSpace(const QString &s) if (ListAvailableColorspaces().contains(s)) { return s; } else { - return GetDefaultInputColorSpace(); + return config_->getCanonicalName(OCIO::ROLE_DEFAULT); } } @@ -241,7 +265,7 @@ ColorTransform ColorManager::GetCompliantColorSpace(const ColorTransform &transf QString output = transform.output(); if (!ListAvailableColorspaces().contains(output)) { - output = GetDefaultInputColorSpace(); + output = config_->getCanonicalName(OCIO::ROLE_DEFAULT); } return ColorTransform(output); @@ -281,7 +305,8 @@ OCIO::ColorSpaceMenuHelperRcPtr ColorManager::CreateMenuHelper(OCIO::ConstConfig void ColorManager::Retranslate() { SetInputName(kConfigFilenameIn, tr("Configuration")); - SetInputName(kDefaultColorspaceIn, tr("Default Input")); + SetInputName(kDefaultFloatColorspaceIn, tr("Default Float Input")); + SetInputName(kDefaultByteColorspaceIn, tr("Default Byte Input")); SetInputName(kReferenceSpaceIn, tr("Reference Space")); SetComboBoxStrings(kReferenceSpaceIn, {tr("Scene Linear"), tr("Compositing Log")}); @@ -316,7 +341,7 @@ void ColorManager::SetConfig(OCIO::ConstConfigRcPtr config) { config_ = config; - SetComboBoxStrings(kDefaultColorspaceIn, ListAvailableColorspaces()); + //SetComboBoxStrings(kDefaultColorspaceIn, ListAvailableColorspaces()); } } diff --git a/app/node/color/colormanager/colormanager.h b/app/node/color/colormanager/colormanager.h index 1bacfaba80..23f2a283fc 100644 --- a/app/node/color/colormanager/colormanager.h +++ b/app/node/color/colormanager/colormanager.h @@ -87,9 +87,13 @@ class ColorManager : public Node QStringList ListAvailableColorspaces() const; - QString GetDefaultInputColorSpace() const; + QString GetDefaultFloatInputColorSpace() const; - void SetDefaultInputColorSpace(const QString& s); + void SetDefaultFloatInputColorSpace(const QString& s); + + QString GetDefaultByteInputColorSpace() const; + + void SetDefaultByteInputColorSpace(const QString& s); QString GetReferenceColorSpace() const; @@ -121,7 +125,8 @@ class ColorManager : public Node } static const QString kConfigFilenameIn; - static const QString kDefaultColorspaceIn; + static const QString kDefaultByteColorspaceIn; + static const QString kDefaultFloatColorspaceIn; static const QString kReferenceSpaceIn; virtual void Retranslate() override; diff --git a/app/node/project/footage/footage.cpp b/app/node/project/footage/footage.cpp index 9d26a6ae8e..0acd6f9ff0 100644 --- a/app/node/project/footage/footage.cpp +++ b/app/node/project/footage/footage.cpp @@ -123,26 +123,24 @@ void Footage::InputValueChangedEvent(const QString &input, int element) // FIXME: Make this customizable vp.set_divider(VideoParams::generate_auto_divider(vp.width(), vp.height())); - // FIXME: Expand to use metadata from files + // FIXME Tom: Expand to use metadata from files // Attempt to use file rules to set colorspace - QString colorspace = ColorManager::GetDefaultConfig()->getColorSpaceFromFilepath(filename().toStdString().c_str()); + ColorManager *color_manager = Core::instance()->GetActiveProject()->color_manager(); + QString colorspace = color_manager->GetConfig()->getColorSpaceFromFilepath(filename().toStdString().c_str()); - QString default_rule_space = ColorManager::GetDefaultConfig()->getFileRules()->getColorSpace( - ColorManager::GetDefaultConfig()->getFileRules()->getNumEntries() - 1); + QString default_rule_space = color_manager->GetConfig()->getFileRules()->getColorSpace( + color_manager->GetConfig()->getFileRules()->getNumEntries() - 1); // If the config file rules haven't worked AND the config has a default float and byte type // try and set them based on the buffer type if (colorspace.compare(default_rule_space) == 0) { - if (ColorManager::GetDefaultConfig()->hasRole("default_byte") && - ColorManager::GetDefaultConfig()->hasRole("default_float")) { - if (vp.format() == VideoParams::Format::kFormatUnsigned8 || - vp.format() == VideoParams::Format::kFormatUnsigned16) { - colorspace = "default_byte"; - } else if (vp.format() == VideoParams::Format::kFormatFloat16 || - vp.format() == VideoParams::Format::kFormatFloat32) { - colorspace = "default_float"; - } + if (vp.format() == VideoParams::Format::kFormatUnsigned8 || + vp.format() == VideoParams::Format::kFormatUnsigned16) { + colorspace = color_manager->GetDefaultByteInputColorSpace(); + } else if (vp.format() == VideoParams::Format::kFormatFloat16 || + vp.format() == VideoParams::Format::kFormatFloat32) { + colorspace = color_manager->GetDefaultFloatInputColorSpace(); } } @@ -188,7 +186,12 @@ rational Footage::VerifyLengthInternal(Track::Type type) const QString Footage::GetColorspaceToUse(const VideoParams ¶ms) const { if (params.colorspace().isEmpty()) { - return project()->color_manager()->GetDefaultInputColorSpace(); + if (params.format() == VideoParams::Format::kFormatUnsigned8 || + params.format() == VideoParams::Format::kFormatUnsigned16) { + return Core::instance()->GetActiveProject()->color_manager()->GetDefaultByteInputColorSpace(); + } else { + return Core::instance()->GetActiveProject()->color_manager()->GetDefaultFloatInputColorSpace(); + } } else { return params.colorspace(); } diff --git a/app/widget/colorwheel/colorspacechooser.cpp b/app/widget/colorwheel/colorspacechooser.cpp index 8617f891d3..c9f8788af9 100644 --- a/app/widget/colorwheel/colorspacechooser.cpp +++ b/app/widget/colorwheel/colorspacechooser.cpp @@ -58,8 +58,8 @@ ColorSpaceChooser::ColorSpaceChooser(ColorManager* color_manager, bool enable_in input_combobox_->addItem(s); } - if (!color_manager_->GetDefaultInputColorSpace().isEmpty()) { - input_combobox_->setCurrentText(color_manager_->GetDefaultInputColorSpace()); + if (!color_manager_->GetDefaultFloatInputColorSpace().isEmpty()) { + input_combobox_->setCurrentText(color_manager_->GetDefaultFloatInputColorSpace()); } connect(input_combobox_, &QComboBox::currentTextChanged, this, &ColorSpaceChooser::ComboBoxChanged); From d31e5cf15178e0e9f78c018d7cc15c1641da189f Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Sat, 12 Mar 2022 21:10:03 +0000 Subject: [PATCH 09/16] Add FIXME --- app/node/color/colormanager/colormanager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/app/node/color/colormanager/colormanager.cpp b/app/node/color/colormanager/colormanager.cpp index c8f1996409..62fbb0e6cf 100644 --- a/app/node/color/colormanager/colormanager.cpp +++ b/app/node/color/colormanager/colormanager.cpp @@ -341,6 +341,7 @@ void ColorManager::SetConfig(OCIO::ConstConfigRcPtr config) { config_ = config; + // FIXME Tom:Do we ever see this on the node properties window? //SetComboBoxStrings(kDefaultColorspaceIn, ListAvailableColorspaces()); } From 8de5d06c2cff6fbf6a52e972322ac6a652ff23d6 Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Sun, 13 Mar 2022 17:19:13 +0000 Subject: [PATCH 10/16] colorspacechooser: Use colorspacecombobox for Input --- .../colorspacecombobox/colorspacecombobox.cpp | 1 + app/widget/colorwheel/colorspacechooser.cpp | 14 ++++---------- app/widget/colorwheel/colorspacechooser.h | 3 ++- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/app/widget/colorspacecombobox/colorspacecombobox.cpp b/app/widget/colorspacecombobox/colorspacecombobox.cpp index dee5c804ac..5c79bbc9aa 100644 --- a/app/widget/colorspacecombobox/colorspacecombobox.cpp +++ b/app/widget/colorspacecombobox/colorspacecombobox.cpp @@ -70,6 +70,7 @@ void ColorSpaceComboBox::showPopup() if (a) { this->setPlaceholderText(a->data().toString()); + emit currentTextChanged(a->data().toString()); } } diff --git a/app/widget/colorwheel/colorspacechooser.cpp b/app/widget/colorwheel/colorspacechooser.cpp index c9f8788af9..17f83d1ad6 100644 --- a/app/widget/colorwheel/colorspacechooser.cpp +++ b/app/widget/colorwheel/colorspacechooser.cpp @@ -49,17 +49,11 @@ ColorSpaceChooser::ColorSpaceChooser(ColorManager* color_manager, bool enable_in layout->addWidget(new QLabel(field_text), row, 0); - input_combobox_ = new QComboBox(); + input_combobox_ = new ColorSpaceComboBox(color_manager_, "Input"); layout->addWidget(input_combobox_, row, 1); - QStringList input_spaces = color_manager->ListAvailableColorspaces(); - - foreach (const QString& s, input_spaces) { - input_combobox_->addItem(s); - } - if (!color_manager_->GetDefaultFloatInputColorSpace().isEmpty()) { - input_combobox_->setCurrentText(color_manager_->GetDefaultFloatInputColorSpace()); + input_combobox_->setPlaceholderText(color_manager_->GetDefaultFloatInputColorSpace()); } connect(input_combobox_, &QComboBox::currentTextChanged, this, &ColorSpaceChooser::ComboBoxChanged); @@ -128,7 +122,7 @@ ColorSpaceChooser::ColorSpaceChooser(ColorManager* color_manager, bool enable_in QString ColorSpaceChooser::input() const { if (input_combobox_) { - return input_combobox_->currentText(); + return input_combobox_->placeholderText(); } else { return QString(); } @@ -143,7 +137,7 @@ ColorTransform ColorSpaceChooser::output() const void ColorSpaceChooser::set_input(const QString &s) { - input_combobox_->setCurrentText(color_manager_->GetCompliantColorSpace(s)); + input_combobox_->setPlaceholderText(color_manager_->GetCompliantColorSpace(s)); } void ColorSpaceChooser::set_output(const ColorTransform &out) diff --git a/app/widget/colorwheel/colorspacechooser.h b/app/widget/colorwheel/colorspacechooser.h index 4bcf326b80..14806515b9 100644 --- a/app/widget/colorwheel/colorspacechooser.h +++ b/app/widget/colorwheel/colorspacechooser.h @@ -25,6 +25,7 @@ #include #include "node/color/colormanager/colormanager.h" +#include "widget/colorspacecombobox/colorspacecombobox.h" namespace olive { @@ -53,7 +54,7 @@ private slots: private: ColorManager* color_manager_; - QComboBox* input_combobox_; + ColorSpaceComboBox* input_combobox_; QComboBox* display_combobox_; From 25181c492e72d3449a9ecf0c7e222ef167ea6398 Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Mon, 14 Mar 2022 16:39:31 +0000 Subject: [PATCH 11/16] Re add display input for the color picker --- app/dialog/color/colordialog.cpp | 10 ++++------ app/render/colorprocessor.cpp | 18 +++++++++++++----- app/render/colorprocessor.h | 6 ++++-- app/widget/colorwheel/colorvalueswidget.cpp | 2 +- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/app/dialog/color/colordialog.cpp b/app/dialog/color/colordialog.cpp index cd36864e91..7af8be5f80 100644 --- a/app/dialog/color/colordialog.cpp +++ b/app/dialog/color/colordialog.cpp @@ -149,16 +149,14 @@ void ColorDialog::ColorSpaceChanged(const QString &input, const ColorTransform & // 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) - /*ColorProcessorPtr display_to_ref = ColorProcessor::Create(color_manager_->GetConfig(), + ColorProcessorPtr display_to_ref = ColorProcessor::Create(color_manager_, color_manager_->GetReferenceColorSpace(), - display, - view, - look, - ColorProcessor::kInverse);*/ + output, + ColorProcessor::Direction::kInverse); color_wheel_->SetColorProcessor(input_to_ref_processor_, ref_to_display); hsv_value_gradient_->SetColorProcessor(input_to_ref_processor_, ref_to_display); - color_values_widget_->SetColorProcessor(input_to_ref_processor_, ref_to_display, nullptr, ref_to_input); + color_values_widget_->SetColorProcessor(input_to_ref_processor_, ref_to_display, display_to_ref, ref_to_input); } } diff --git a/app/render/colorprocessor.cpp b/app/render/colorprocessor.cpp index 9d981871f6..45077dc20d 100644 --- a/app/render/colorprocessor.cpp +++ b/app/render/colorprocessor.cpp @@ -26,7 +26,8 @@ namespace olive { -ColorProcessor::ColorProcessor(ColorManager *config, const QString &input, const ColorTransform &transform) +ColorProcessor::ColorProcessor(ColorManager *config, const QString &input, const ColorTransform &transform, Direction direction): + dir_(direction) { QMutexLocker locker(config->mutex()); @@ -41,10 +42,13 @@ ColorProcessor::ColorProcessor(ColorManager *config, const QString &input, const display_transform->setSrc(input.toUtf8()); display_transform->setDisplay(output.toUtf8()); display_transform->setView(view.toUtf8()); + display_transform->setDirection(dir_ == Direction::kNormal ? OCIO::TRANSFORM_DIR_FORWARD : OCIO::TRANSFORM_DIR_INVERSE); OCIO_SET_C_LOCALE_FOR_SCOPE; if (transform.look().isEmpty()) { + display_transform->setDirection(dir_ == Direction::kNormal ? OCIO::TRANSFORM_DIR_FORWARD + : OCIO::TRANSFORM_DIR_INVERSE); processor_ = config->GetConfig()->getProcessor(display_transform); } else { auto group = OCIO::GroupTransform::Create(); @@ -62,6 +66,7 @@ ColorProcessor::ColorProcessor(ColorManager *config, const QString &input, const display_transform->setSrc(out_cs); group->appendTransform(display_transform); + group->setDirection(dir_ == Direction::kNormal ? OCIO::TRANSFORM_DIR_FORWARD : OCIO::TRANSFORM_DIR_INVERSE); processor_ = config->GetConfig()->getProcessor(group); } @@ -69,8 +74,11 @@ ColorProcessor::ColorProcessor(ColorManager *config, const QString &input, const } else { OCIO_SET_C_LOCALE_FOR_SCOPE; - processor_ = config->GetConfig()->getProcessor(input.toUtf8(), - output.toUtf8()); + if (dir_ == kNormal) { + processor_ = config->GetConfig()->getProcessor(input.toUtf8(), output.toUtf8()); + } else { + processor_ = config->GetConfig()->getProcessor(output.toUtf8(), input.toUtf8()); + } } @@ -118,9 +126,9 @@ QString ColorProcessor::GenerateID(ColorManager *config, const QString &input, c transform.look()); } -ColorProcessorPtr ColorProcessor::Create(ColorManager *config, const QString& input, const ColorTransform &transform) +ColorProcessorPtr ColorProcessor::Create(ColorManager *config, const QString& input, const ColorTransform &transform, Direction direction) { - return std::make_shared(config, input, transform); + return std::make_shared(config, input, transform, direction); } OCIO::ConstProcessorRcPtr ColorProcessor::GetProcessor() diff --git a/app/render/colorprocessor.h b/app/render/colorprocessor.h index 60205055a1..d0ef7203f9 100644 --- a/app/render/colorprocessor.h +++ b/app/render/colorprocessor.h @@ -41,11 +41,11 @@ class ColorProcessor kInverse }; - ColorProcessor(ColorManager* config, const QString& input, const ColorTransform& dest_space); + ColorProcessor(ColorManager* config, const QString& input, const ColorTransform& dest_space, Direction direction=kNormal); DISABLE_COPY_MOVE(ColorProcessor) - static ColorProcessorPtr Create(ColorManager* config, const QString& input, const ColorTransform& dest_space); + static ColorProcessorPtr Create(ColorManager* config, const QString& input, const ColorTransform& dest_space, Direction direction=kNormal); OCIO::ConstProcessorRcPtr GetProcessor(); @@ -68,6 +68,8 @@ class ColorProcessor QString id_; + Direction dir_; + }; using ColorProcessorChain = QVector; diff --git a/app/widget/colorwheel/colorvalueswidget.cpp b/app/widget/colorwheel/colorvalueswidget.cpp index c286d2f24b..ebe5a0c6b7 100644 --- a/app/widget/colorwheel/colorvalueswidget.cpp +++ b/app/widget/colorwheel/colorvalueswidget.cpp @@ -79,7 +79,7 @@ ColorValuesWidget::ColorValuesWidget(ColorManager *manager, QWidget *parent) : connect(display_tab_, &ColorValuesTab::ColorChanged, this, &ColorValuesWidget::UpdateValuesFromDisplay); // FIXME: Display -> Ref temporarily disabled due to OCIO crash (see ColorDialog::ColorSpaceChanged for more info) - display_tab_->setEnabled(false); + //display_tab_->setEnabled(false); layout->addWidget(tabs); } From d63257f80372c6c7001baa6109c0e01903b6a723 Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Mon, 14 Mar 2022 16:52:09 +0000 Subject: [PATCH 12/16] Cleanup --- app/widget/colorwheel/colorvalueswidget.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/widget/colorwheel/colorvalueswidget.cpp b/app/widget/colorwheel/colorvalueswidget.cpp index ebe5a0c6b7..4ef349f98d 100644 --- a/app/widget/colorwheel/colorvalueswidget.cpp +++ b/app/widget/colorwheel/colorvalueswidget.cpp @@ -78,9 +78,6 @@ ColorValuesWidget::ColorValuesWidget(ColorManager *manager, QWidget *parent) : tabs->addTab(display_tab_, tr("Display")); connect(display_tab_, &ColorValuesTab::ColorChanged, this, &ColorValuesWidget::UpdateValuesFromDisplay); - // FIXME: Display -> Ref temporarily disabled due to OCIO crash (see ColorDialog::ColorSpaceChanged for more info) - //display_tab_->setEnabled(false); - layout->addWidget(tabs); } } From d571144edc9c554b40e1d319fec324d75d58eec8 Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Sun, 8 May 2022 15:51:36 +0100 Subject: [PATCH 13/16] Update to master --- app/node/generator/text/textv3.cpp | 2 +- app/render/ocioconf/config.ocio | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/node/generator/text/textv3.cpp b/app/node/generator/text/textv3.cpp index 4413d6f656..93e645bd49 100644 --- a/app/node/generator/text/textv3.cpp +++ b/app/node/generator/text/textv3.cpp @@ -86,7 +86,7 @@ void TextGeneratorV3::Value(const NodeValueRow &value, const NodeGlobals &global job.SetRequestedFormat(VideoParams::kFormatUnsigned8); // FIXME: Provide user override for this - job.SetColorspace(project()->color_manager()->GetDefaultInputColorSpace()); + job.SetColorspace(project()->color_manager()->GetDefaultFloatInputColorSpace()); if (!job.GetValue(kTextInput).data().toString().isEmpty()) { PushMergableJob(value, QVariant::fromValue(job), table); diff --git a/app/render/ocioconf/config.ocio b/app/render/ocioconf/config.ocio index 2c56c64861..56f1d47f2b 100755 --- a/app/render/ocioconf/config.ocio +++ b/app/render/ocioconf/config.ocio @@ -279,12 +279,13 @@ colorspaces: - ! name: Blackmagic Film Wide Gamut (Gen 5) - family: Camera Footage + family: Input/BlackMagic equalitygroup: "" bitdepth: 32f description: | Blackmagic Film Wide Gamut (Gen 5) isdata: false + categories: [ Camera, Input ] allocation: uniform allocationvars: [0, 1] to_reference: ! From e8f58bc1dce9215a069e54e41af6ab68a2d301d5 Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Sun, 8 May 2022 16:07:04 +0100 Subject: [PATCH 14/16] Fix CI build issue --- app/widget/colorspacecombobox/colorspacecombobox.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/widget/colorspacecombobox/colorspacecombobox.cpp b/app/widget/colorspacecombobox/colorspacecombobox.cpp index 5c79bbc9aa..990c28b9a3 100644 --- a/app/widget/colorspacecombobox/colorspacecombobox.cpp +++ b/app/widget/colorspacecombobox/colorspacecombobox.cpp @@ -42,7 +42,7 @@ void ColorSpaceComboBox::showPopup() QMap submenu_map; - for (int i = 0; i < menu_helper->getNumColorSpaces(); i++) { + for (size_t i = 0; i < menu_helper->getNumColorSpaces(); i++) { QString colorspace = menu_helper->getName(i); QString family = menu_helper->getFamily(i); From 237c0fb9ce2601d15147d7d3087861857c16c0d4 Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Sun, 8 May 2022 16:33:41 +0100 Subject: [PATCH 15/16] Add check that user OCIO configs implement the CIE XYZ role --- app/node/color/colormanager/colormanager.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/node/color/colormanager/colormanager.cpp b/app/node/color/colormanager/colormanager.cpp index 9bbda588d9..71358bdd3d 100644 --- a/app/node/color/colormanager/colormanager.cpp +++ b/app/node/color/colormanager/colormanager.cpp @@ -123,6 +123,10 @@ bool ColorManager::LoadConfigFromPath(QString path) try { default_config_->validate(); + if (!default_config_->hasRole("cie_xyz_d65_interchange")) { + qWarning() << "Failed to validate config from OCIO environment vairable: Missing required role cie_xyz_d65_interchange"; + return false; + } qInfo() << "Succesfully loaded OCIO config from: " << path; return true; } catch (OCIO::Exception &e) { From 5cd4a669243b49aad6701daa3a1b5f481a218c88 Mon Sep 17 00:00:00 2001 From: Thomas Wilshaw Date: Sat, 8 Oct 2022 17:52:30 +0100 Subject: [PATCH 16/16] Fix breakages from merge --- .../videostreamproperties.cpp | 8 +++---- .../projectproperties/projectproperties.cpp | 10 +++++---- app/node/color/colormanager/colormanager.cpp | 21 ++++++++++++++----- app/node/project/footage/footage.cpp | 15 +++++++------ app/render/colorprocessor.cpp | 4 ++-- .../colorspacecombobox/colorspacecombobox.cpp | 12 +++++++++-- .../colorspacecombobox/colorspacecombobox.h | 9 +++++++- app/widget/colorwheel/colorspacechooser.cpp | 2 +- 8 files changed, 54 insertions(+), 27 deletions(-) diff --git a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp index 602b4cb937..823d34520a 100644 --- a/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp +++ b/app/dialog/footageproperties/streamproperties/videostreamproperties.cpp @@ -63,11 +63,11 @@ VideoStreamProperties::VideoStreamProperties(Footage *footage, int video_index) video_layout->addWidget(new QLabel(tr("Color Space:")), row, 0); + ColorManager *color_manager = footage_->project()->color_manager(); video_color_space_ = new ColorSpaceComboBox(footage_->project()->color_manager(), "Input", true, this); - ColorManager* color_manager = footage_->project()->color_manager(); if (!vp.colorspace().isEmpty()) { - video_color_space_->setPlaceholderText(color_manager->GetConfig()->getCanonicalName( + video_color_space_->setColorSpacePlaceHolder(color_manager->GetConfig()->getCanonicalName( vp.colorspace().toStdString().c_str())); } else { QString colorspace; @@ -77,7 +77,7 @@ VideoStreamProperties::VideoStreamProperties(Footage *footage, int video_index) } else { colorspace = color_manager->GetDefaultFloatInputColorSpace(); } - video_color_space_->setPlaceholderText(color_manager->GetConfig()->getCanonicalName( + video_color_space_->setColorSpacePlaceHolder(color_manager->GetConfig()->getCanonicalName( colorspace.toStdString().c_str())); } @@ -140,7 +140,7 @@ VideoStreamProperties::VideoStreamProperties(Footage *footage, int video_index) void VideoStreamProperties::Accept(MultiUndoCommand *parent) { - QString set_colorspace = video_color_space_->placeholderText(); + QString set_colorspace = video_color_space_->ColorSpacePlaceHolder(); VideoParams vp = footage_->GetVideoParams(video_index_); diff --git a/app/dialog/projectproperties/projectproperties.cpp b/app/dialog/projectproperties/projectproperties.cpp index 852d7ee989..08418e936d 100644 --- a/app/dialog/projectproperties/projectproperties.cpp +++ b/app/dialog/projectproperties/projectproperties.cpp @@ -73,6 +73,7 @@ ProjectPropertiesDialog::ProjectPropertiesDialog(Project* p, QWidget *parent) : color_layout->addWidget(new QLabel(tr("Default Float Input Color Space:")), row, 0); default_float_input_colorspace_ = new ColorSpaceComboBox(working_project_->color_manager(), "Input"); + default_float_input_colorspace_->setColorSpacePlaceHolder(working_project_->color_manager()->GetDefaultFloatInputColorSpace()); color_layout->addWidget(default_float_input_colorspace_, row, 1, 1, 2); row++; @@ -80,6 +81,7 @@ ProjectPropertiesDialog::ProjectPropertiesDialog(Project* p, QWidget *parent) : color_layout->addWidget(new QLabel(tr("Default Byte Input Color Space:")), row, 0); default_byte_input_colorspace_ = new ColorSpaceComboBox(working_project_->color_manager(), "Input"); + default_byte_input_colorspace_->setColorSpacePlaceHolder(working_project_->color_manager()->GetDefaultByteInputColorSpace()); color_layout->addWidget(default_byte_input_colorspace_, row, 1, 1, 2); row++; @@ -184,11 +186,11 @@ void ProjectPropertiesDialog::accept() if (working_project_->color_manager()->GetConfigFilename() != ocio_filename_->text()) { working_project_->color_manager()->SetConfigFilename(ocio_filename_->text()); } - if (working_project_->color_manager()->GetDefaultFloatInputColorSpace() != default_float_input_colorspace_->placeholderText()) { - working_project_->color_manager()->SetDefaultFloatInputColorSpace(default_float_input_colorspace_->placeholderText()); + if (working_project_->color_manager()->GetDefaultFloatInputColorSpace() != default_float_input_colorspace_->ColorSpacePlaceHolder()) { + working_project_->color_manager()->SetDefaultFloatInputColorSpace(default_float_input_colorspace_->ColorSpacePlaceHolder()); } - if (working_project_->color_manager()->GetDefaultByteInputColorSpace() != default_byte_input_colorspace_->placeholderText()) { - working_project_->color_manager()->SetDefaultByteInputColorSpace(default_byte_input_colorspace_->placeholderText()); + if (working_project_->color_manager()->GetDefaultByteInputColorSpace() != default_byte_input_colorspace_->ColorSpacePlaceHolder()) { + working_project_->color_manager()->SetDefaultByteInputColorSpace(default_byte_input_colorspace_->ColorSpacePlaceHolder()); } super::accept(); diff --git a/app/node/color/colormanager/colormanager.cpp b/app/node/color/colormanager/colormanager.cpp index fdc74d6906..bf27ae4943 100644 --- a/app/node/color/colormanager/colormanager.cpp +++ b/app/node/color/colormanager/colormanager.cpp @@ -328,20 +328,31 @@ void ColorManager::InputValueChangedEvent(const QString &input, int element) if (input == kConfigFilenameIn) { try { - QString old_default_cs = GetDefaultInputColorSpace(); + QString old_default_float_cs = GetDefaultFloatInputColorSpace(); + QString old_default_byte_cs = GetDefaultByteInputColorSpace(); SetConfig(OCIO::Config::CreateFromFile(GetConfigFilename().toUtf8())); // Set new default colorspace appropriately - int new_default = 0; + int new_default_float = 0; QStringList available_cs = ListAvailableColorspaces(); for (int i=0; iGetActiveProject()->color_manager(); - QString colorspace = color_manager->GetConfig()->getColorSpaceFromFilepath(filename().toStdString().c_str()); - + QString colorspace = color_manager->GetConfig()->getColorSpaceFromFilepath(filename.toStdString().c_str()); QString default_rule_space = color_manager->GetConfig()->getFileRules()->getColorSpace( color_manager->GetConfig()->getFileRules()->getNumEntries() - 1); // If the config file rules haven't worked AND the config has a default float and byte type // try and set them based on the buffer type if (colorspace.compare(default_rule_space) == 0) { - if (existing.format() == VideoParams::Format::kFormatUnsigned8 || - existing.format() == VideoParams::Format::kFormatUnsigned16) { + if (video_stream.format() == VideoParams::Format::kFormatUnsigned8 || + video_stream.format() == VideoParams::Format::kFormatUnsigned16) { colorspace = color_manager->GetDefaultByteInputColorSpace(); - } else if (existing.format() == VideoParams::Format::kFormatFloat16 || - existing.format() == VideoParams::Format::kFormatFloat32) { + } else if (video_stream.format() == VideoParams::Format::kFormatFloat16 || + video_stream.format() == VideoParams::Format::kFormatFloat32) { colorspace = color_manager->GetDefaultFloatInputColorSpace(); } } - - existing.set_colorspace(colorspace); + video_stream.set_colorspace(colorspace); if (existing.is_valid()) { video_stream = MergeVideoStream(video_stream, existing); @@ -555,6 +553,7 @@ VideoParams Footage::MergeVideoStream(const VideoParams &base, const VideoParams merged.set_premultiplied_alpha(over.premultiplied_alpha()); merged.set_video_type(over.video_type()); merged.set_color_range(over.color_range()); + merged.set_colorspace(over.colorspace()); if (merged.video_type() == VideoParams::kVideoTypeImageSequence) { merged.set_start_time(over.start_time()); merged.set_duration(over.duration()); diff --git a/app/render/colorprocessor.cpp b/app/render/colorprocessor.cpp index 05211b9e94..2464426968 100644 --- a/app/render/colorprocessor.cpp +++ b/app/render/colorprocessor.cpp @@ -46,7 +46,7 @@ ColorProcessor::ColorProcessor(ColorManager *config, const QString &input, const OCIO_SET_C_LOCALE_FOR_SCOPE; if (transform.look().isEmpty()) { - display_transform->setDirection(dir_ == Direction::kNormal ? OCIO::TRANSFORM_DIR_FORWARD + display_transform->setDirection(direction == Direction::kNormal ? OCIO::TRANSFORM_DIR_FORWARD : OCIO::TRANSFORM_DIR_INVERSE); processor_ = config->GetConfig()->getProcessor(display_transform); } else { @@ -65,7 +65,7 @@ ColorProcessor::ColorProcessor(ColorManager *config, const QString &input, const display_transform->setSrc(out_cs); group->appendTransform(display_transform); - group->setDirection(dir_ == Direction::kNormal ? OCIO::TRANSFORM_DIR_FORWARD : OCIO::TRANSFORM_DIR_INVERSE); + group->setDirection(direction == Direction::kNormal ? OCIO::TRANSFORM_DIR_FORWARD : OCIO::TRANSFORM_DIR_INVERSE); processor_ = config->GetConfig()->getProcessor(group); } diff --git a/app/widget/colorspacecombobox/colorspacecombobox.cpp b/app/widget/colorspacecombobox/colorspacecombobox.cpp index 990c28b9a3..dc82927cf9 100644 --- a/app/widget/colorspacecombobox/colorspacecombobox.cpp +++ b/app/widget/colorspacecombobox/colorspacecombobox.cpp @@ -15,6 +15,8 @@ #include "colorspacecombobox.h" + +#include #include #include @@ -28,7 +30,13 @@ ColorSpaceComboBox::ColorSpaceComboBox(ColorManager* color_manager, QString cate categories_(categories), use_family_(use_family) { - + auto space = QString(" "); + placeholder_ = new QLabel(space + "Select Color Space"); + this->setLayout(new QVBoxLayout()); + this->layout()->setContentsMargins(0, 0, 0, 0); + this->layout()->addWidget(placeholder_); + + setCurrentIndex(-1); } void ColorSpaceComboBox::showPopup() @@ -69,7 +77,7 @@ void ColorSpaceComboBox::showPopup() QAction* a = menu.exec(parentWidget()->mapToGlobal(pos())); if (a) { - this->setPlaceholderText(a->data().toString()); + setColorSpacePlaceHolder(a->data().toString()); emit currentTextChanged(a->data().toString()); } } diff --git a/app/widget/colorspacecombobox/colorspacecombobox.h b/app/widget/colorspacecombobox/colorspacecombobox.h index f558b4fed9..d1da47c2bd 100644 --- a/app/widget/colorspacecombobox/colorspacecombobox.h +++ b/app/widget/colorspacecombobox/colorspacecombobox.h @@ -17,6 +17,7 @@ #define COLORSPACECOMBOBOX_H #include +#include #include "node/color/colormanager/colormanager.h" @@ -31,14 +32,20 @@ class ColorSpaceComboBox : public QComboBox virtual void showPopup() override; + void setColorSpacePlaceHolder(QString text) { placeholder_->setText(QString(" ") + text); }; + + QString ColorSpacePlaceHolder() { return placeholder_->text().trimmed(); }; + private: - ColorManager* color_manager_;// + ColorManager* color_manager_; QString categories_; bool use_family_; + QLabel* placeholder_; + }; } diff --git a/app/widget/colorwheel/colorspacechooser.cpp b/app/widget/colorwheel/colorspacechooser.cpp index 272ea05378..00157f7487 100644 --- a/app/widget/colorwheel/colorspacechooser.cpp +++ b/app/widget/colorwheel/colorspacechooser.cpp @@ -53,7 +53,7 @@ ColorSpaceChooser::ColorSpaceChooser(ColorManager* color_manager, bool enable_in layout->addWidget(input_combobox_, row, 1); if (!color_manager_->GetDefaultFloatInputColorSpace().isEmpty()) { - input_combobox_->setPlaceholderText(color_manager_->GetDefaultFloatInputColorSpace()); + input_combobox_->setColorSpacePlaceHolder(color_manager_->GetDefaultFloatInputColorSpace()); } connect(input_combobox_, &QComboBox::currentTextChanged, this, &ColorSpaceChooser::ComboBoxChanged);