summaryrefslogtreecommitdiffstats
path: root/xbmc/video/dialogs/GUIDialogCMSSettings.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/video/dialogs/GUIDialogCMSSettings.cpp')
-rw-r--r--xbmc/video/dialogs/GUIDialogCMSSettings.cpp233
1 files changed, 233 insertions, 0 deletions
diff --git a/xbmc/video/dialogs/GUIDialogCMSSettings.cpp b/xbmc/video/dialogs/GUIDialogCMSSettings.cpp
new file mode 100644
index 0000000..ac1a7ad
--- /dev/null
+++ b/xbmc/video/dialogs/GUIDialogCMSSettings.cpp
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "GUIDialogCMSSettings.h"
+
+#include "FileItem.h"
+#include "GUIPassword.h"
+#include "ServiceBroker.h"
+#include "addons/Skin.h"
+#include "cores/VideoPlayer/VideoRenderers/ColorManager.h"
+#include "cores/VideoPlayer/VideoRenderers/RenderManager.h"
+#include "filesystem/Directory.h"
+#include "guilib/GUIWindowManager.h"
+#include "profiles/ProfileManager.h"
+#include "settings/Settings.h"
+#include "settings/SettingsComponent.h"
+#include "settings/lib/Setting.h"
+#include "settings/lib/SettingDefinitions.h"
+#include "settings/lib/SettingsManager.h"
+#include "utils/URIUtils.h"
+#include "utils/Variant.h"
+#include "utils/log.h"
+#include "video/VideoDatabase.h"
+
+#include <vector>
+
+#define SETTING_VIDEO_CMSENABLE "videoscreen.cmsenabled"
+#define SETTING_VIDEO_CMSMODE "videoscreen.cmsmode"
+#define SETTING_VIDEO_CMS3DLUT "videoscreen.cms3dlut"
+#define SETTING_VIDEO_CMSWHITEPOINT "videoscreen.cmswhitepoint"
+#define SETTING_VIDEO_CMSPRIMARIES "videoscreen.cmsprimaries"
+#define SETTING_VIDEO_CMSGAMMAMODE "videoscreen.cmsgammamode"
+#define SETTING_VIDEO_CMSGAMMA "videoscreen.cmsgamma"
+#define SETTING_VIDEO_CMSLUTSIZE "videoscreen.cmslutsize"
+
+CGUIDialogCMSSettings::CGUIDialogCMSSettings()
+ : CGUIDialogSettingsManualBase(WINDOW_DIALOG_CMS_OSD_SETTINGS, "DialogSettings.xml")
+{ }
+
+CGUIDialogCMSSettings::~CGUIDialogCMSSettings() = default;
+
+void CGUIDialogCMSSettings::SetupView()
+{
+ CGUIDialogSettingsManualBase::SetupView();
+
+ SetHeading(36560);
+ SET_CONTROL_HIDDEN(CONTROL_SETTINGS_OKAY_BUTTON);
+ SET_CONTROL_HIDDEN(CONTROL_SETTINGS_CUSTOM_BUTTON);
+ SET_CONTROL_LABEL(CONTROL_SETTINGS_CANCEL_BUTTON, 15067);
+}
+
+void CGUIDialogCMSSettings::InitializeSettings()
+{
+ CGUIDialogSettingsManualBase::InitializeSettings();
+
+ const std::shared_ptr<CSettingCategory> category = AddCategory("cms", -1);
+ if (category == NULL)
+ {
+ CLog::Log(LOGERROR, "CGUIDialogCMSSettings: unable to setup settings");
+ return;
+ }
+
+ // get all necessary setting groups
+ const std::shared_ptr<CSettingGroup> groupColorManagement = AddGroup(category);
+ if (groupColorManagement == NULL)
+ {
+ CLog::Log(LOGERROR, "CGUIDialogCMSSettings: unable to setup settings");
+ return;
+ }
+
+ bool usePopup = g_SkinInfo->HasSkinFile("DialogSlider.xml");
+
+ TranslatableIntegerSettingOptions entries;
+
+ // create "depsCmsEnabled" for settings depending on CMS being enabled
+ CSettingDependency dependencyCmsEnabled(SettingDependencyType::Enable, GetSettingsManager());
+ dependencyCmsEnabled.Or()
+ ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_VIDEO_CMSENABLE, "true", SettingDependencyOperator::Equals, false, GetSettingsManager())));
+ SettingDependencies depsCmsEnabled;
+ depsCmsEnabled.push_back(dependencyCmsEnabled);
+
+ // create "depsCms3dlut" for 3dlut settings
+ CSettingDependency dependencyCms3dlut(SettingDependencyType::Visible, GetSettingsManager());
+ dependencyCms3dlut.And()
+ ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_VIDEO_CMSMODE, std::to_string(CMS_MODE_3DLUT), SettingDependencyOperator::Equals, false, GetSettingsManager())));
+ SettingDependencies depsCms3dlut;
+ depsCms3dlut.push_back(dependencyCmsEnabled);
+ depsCms3dlut.push_back(dependencyCms3dlut);
+
+ // create "depsCmsIcc" for display settings with icc profile
+ CSettingDependency dependencyCmsIcc(SettingDependencyType::Visible, GetSettingsManager());
+ dependencyCmsIcc.And()
+ ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_VIDEO_CMSMODE, std::to_string(CMS_MODE_PROFILE), SettingDependencyOperator::Equals, false, GetSettingsManager())));
+ SettingDependencies depsCmsIcc;
+ depsCmsIcc.push_back(dependencyCmsEnabled);
+ depsCmsIcc.push_back(dependencyCmsIcc);
+
+ // create "depsCmsGamma" for effective gamma adjustment (not available with bt.1886)
+ CSettingDependency dependencyCmsGamma(SettingDependencyType::Visible, GetSettingsManager());
+ dependencyCmsGamma.And()
+ ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_VIDEO_CMSGAMMAMODE, std::to_string(CMS_TRC_BT1886), SettingDependencyOperator::Equals, true, GetSettingsManager())));
+ SettingDependencies depsCmsGamma;
+ depsCmsGamma.push_back(dependencyCmsEnabled);
+ depsCmsGamma.push_back(dependencyCmsIcc);
+ depsCmsGamma.push_back(dependencyCmsGamma);
+
+ const std::shared_ptr<CSettings> settings = CServiceBroker::GetSettingsComponent()->GetSettings();
+
+ // color management settings
+ AddToggle(groupColorManagement, SETTING_VIDEO_CMSENABLE, 36560, SettingLevel::Basic, settings->GetBool(SETTING_VIDEO_CMSENABLE));
+
+ int currentMode = settings->GetInt(SETTING_VIDEO_CMSMODE);
+ entries.clear();
+ // entries.push_back(TranslatableIntegerSettingOption(16039, CMS_MODE_OFF)); // FIXME: get from CMS class
+ entries.push_back(TranslatableIntegerSettingOption(36580, CMS_MODE_3DLUT));
+#ifdef HAVE_LCMS2
+ entries.push_back(TranslatableIntegerSettingOption(36581, CMS_MODE_PROFILE));
+#endif
+ std::shared_ptr<CSettingInt> settingCmsMode = AddSpinner(groupColorManagement, SETTING_VIDEO_CMSMODE, 36562, SettingLevel::Basic, currentMode, entries);
+ settingCmsMode->SetDependencies(depsCmsEnabled);
+
+ std::string current3dLUT = settings->GetString(SETTING_VIDEO_CMS3DLUT);
+ std::shared_ptr<CSettingString> settingCms3dlut = AddList(groupColorManagement, SETTING_VIDEO_CMS3DLUT, 36564, SettingLevel::Basic, current3dLUT, Cms3dLutsFiller, 36564);
+ settingCms3dlut->SetDependencies(depsCms3dlut);
+
+ // display settings
+ int currentWhitepoint = settings->GetInt(SETTING_VIDEO_CMSWHITEPOINT);
+ entries.clear();
+ entries.push_back(TranslatableIntegerSettingOption(36586, CMS_WHITEPOINT_D65));
+ entries.push_back(TranslatableIntegerSettingOption(36587, CMS_WHITEPOINT_D93));
+ std::shared_ptr<CSettingInt> settingCmsWhitepoint = AddSpinner(groupColorManagement, SETTING_VIDEO_CMSWHITEPOINT, 36568, SettingLevel::Basic, currentWhitepoint, entries);
+ settingCmsWhitepoint->SetDependencies(depsCmsIcc);
+
+ int currentPrimaries = settings->GetInt(SETTING_VIDEO_CMSPRIMARIES);
+ entries.clear();
+ entries.push_back(TranslatableIntegerSettingOption(36588, CMS_PRIMARIES_AUTO));
+ entries.push_back(TranslatableIntegerSettingOption(36589, CMS_PRIMARIES_BT709));
+ entries.push_back(TranslatableIntegerSettingOption(36579, CMS_PRIMARIES_BT2020));
+ entries.push_back(TranslatableIntegerSettingOption(36590, CMS_PRIMARIES_170M));
+ entries.push_back(TranslatableIntegerSettingOption(36591, CMS_PRIMARIES_BT470M));
+ entries.push_back(TranslatableIntegerSettingOption(36592, CMS_PRIMARIES_BT470BG));
+ entries.push_back(TranslatableIntegerSettingOption(36593, CMS_PRIMARIES_240M));
+ std::shared_ptr<CSettingInt> settingCmsPrimaries = AddSpinner(groupColorManagement, SETTING_VIDEO_CMSPRIMARIES, 36570, SettingLevel::Basic, currentPrimaries, entries);
+ settingCmsPrimaries->SetDependencies(depsCmsIcc);
+
+ int currentGammaMode = settings->GetInt(SETTING_VIDEO_CMSGAMMAMODE);
+ entries.clear();
+ entries.push_back(TranslatableIntegerSettingOption(36582, CMS_TRC_BT1886));
+ entries.push_back(TranslatableIntegerSettingOption(36583, CMS_TRC_INPUT_OFFSET));
+ entries.push_back(TranslatableIntegerSettingOption(36584, CMS_TRC_OUTPUT_OFFSET));
+ entries.push_back(TranslatableIntegerSettingOption(36585, CMS_TRC_ABSOLUTE));
+ std::shared_ptr<CSettingInt> settingCmsGammaMode = AddSpinner(groupColorManagement, SETTING_VIDEO_CMSGAMMAMODE, 36572, SettingLevel::Basic, currentGammaMode, entries);
+ settingCmsGammaMode->SetDependencies(depsCmsIcc);
+
+ float currentGamma = settings->GetInt(SETTING_VIDEO_CMSGAMMA)/100.0f;
+ if (currentGamma == 0.0f)
+ currentGamma = 2.20f;
+ std::shared_ptr<CSettingNumber> settingCmsGamma = AddSlider(groupColorManagement, SETTING_VIDEO_CMSGAMMA, 36574, SettingLevel::Basic, currentGamma, 36597, 1.6, 0.05, 2.8, 36574, usePopup);
+ settingCmsGamma->SetDependencies(depsCmsGamma);
+
+ int currentLutSize = settings->GetInt(SETTING_VIDEO_CMSLUTSIZE);
+ entries.clear();
+ entries.push_back(TranslatableIntegerSettingOption(36594, 4));
+ entries.push_back(TranslatableIntegerSettingOption(36595, 6));
+ entries.push_back(TranslatableIntegerSettingOption(36596, 8));
+ std::shared_ptr<CSettingInt> settingCmsLutSize = AddSpinner(groupColorManagement, SETTING_VIDEO_CMSLUTSIZE, 36576, SettingLevel::Basic, currentLutSize, entries);
+ settingCmsLutSize->SetDependencies(depsCmsIcc);
+}
+
+void CGUIDialogCMSSettings::OnSettingChanged(const std::shared_ptr<const CSetting>& setting)
+{
+ if (setting == NULL)
+ return;
+
+ CGUIDialogSettingsManualBase::OnSettingChanged(setting);
+
+ const std::string &settingId = setting->GetId();
+ if (settingId == SETTING_VIDEO_CMSENABLE)
+ CServiceBroker::GetSettingsComponent()->GetSettings()->SetBool(SETTING_VIDEO_CMSENABLE, (std::static_pointer_cast<const CSettingBool>(setting)->GetValue()));
+ else if (settingId == SETTING_VIDEO_CMSMODE)
+ CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSMODE, std::static_pointer_cast<const CSettingInt>(setting)->GetValue());
+ else if (settingId == SETTING_VIDEO_CMS3DLUT)
+ CServiceBroker::GetSettingsComponent()->GetSettings()->SetString(SETTING_VIDEO_CMS3DLUT, std::static_pointer_cast<const CSettingString>(setting)->GetValue());
+ else if (settingId == SETTING_VIDEO_CMSWHITEPOINT)
+ CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSWHITEPOINT, std::static_pointer_cast<const CSettingInt>(setting)->GetValue());
+ else if (settingId == SETTING_VIDEO_CMSPRIMARIES)
+ CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSPRIMARIES, std::static_pointer_cast<const CSettingInt>(setting)->GetValue());
+ else if (settingId == SETTING_VIDEO_CMSGAMMAMODE)
+ CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSGAMMAMODE, std::static_pointer_cast<const CSettingInt>(setting)->GetValue());
+ else if (settingId == SETTING_VIDEO_CMSGAMMA)
+ CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSGAMMA, static_cast<float>(std::static_pointer_cast<const CSettingNumber>(setting)->GetValue())*100);
+ else if (settingId == SETTING_VIDEO_CMSLUTSIZE)
+ CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSLUTSIZE, std::static_pointer_cast<const CSettingInt>(setting)->GetValue());
+}
+
+bool CGUIDialogCMSSettings::OnBack(int actionID)
+{
+ Save();
+ return CGUIDialogSettingsBase::OnBack(actionID);
+}
+
+bool CGUIDialogCMSSettings::Save()
+{
+ CLog::Log(LOGINFO, "CGUIDialogCMSSettings: Save() called");
+ CServiceBroker::GetSettingsComponent()->GetSettings()->Save();
+
+ return true;
+}
+
+void CGUIDialogCMSSettings::Cms3dLutsFiller(const SettingConstPtr& setting,
+ std::vector<StringSettingOption>& list,
+ std::string& current,
+ void* data)
+{
+ // get 3dLut directory from settings
+ CFileItemList items;
+
+ // list .3dlut files
+ std::string current3dlut = CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(SETTING_VIDEO_CMS3DLUT);
+ if (!current3dlut.empty())
+ current3dlut = URIUtils::GetDirectory(current3dlut);
+ XFILE::CDirectory::GetDirectory(current3dlut, items, ".3dlut", XFILE::DIR_FLAG_DEFAULTS);
+
+ for (int i = 0; i < items.Size(); i++)
+ {
+ list.emplace_back(items[i]->GetLabel(), items[i]->GetPath());
+ }
+}