2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
9 #include "GUIDialogCMSSettings.h"
12 #include "FileItemList.h"
13 #include "GUIPassword.h"
14 #include "ServiceBroker.h"
15 #include "addons/Skin.h"
16 #include "cores/VideoPlayer/VideoRenderers/ColorManager.h"
17 #include "cores/VideoPlayer/VideoRenderers/RenderManager.h"
18 #include "filesystem/Directory.h"
19 #include "guilib/GUIWindowManager.h"
20 #include "profiles/ProfileManager.h"
21 #include "settings/Settings.h"
22 #include "settings/SettingsComponent.h"
23 #include "settings/lib/Setting.h"
24 #include "settings/lib/SettingDefinitions.h"
25 #include "settings/lib/SettingsManager.h"
26 #include "utils/URIUtils.h"
27 #include "utils/Variant.h"
28 #include "utils/log.h"
29 #include "video/VideoDatabase.h"
34 #define SETTING_VIDEO_CMSENABLE "videoscreen.cmsenabled"
35 #define SETTING_VIDEO_CMSMODE "videoscreen.cmsmode"
36 #define SETTING_VIDEO_CMS3DLUT "videoscreen.cms3dlut"
37 #define SETTING_VIDEO_CMSWHITEPOINT "videoscreen.cmswhitepoint"
38 #define SETTING_VIDEO_CMSPRIMARIES "videoscreen.cmsprimaries"
39 #define SETTING_VIDEO_CMSGAMMAMODE "videoscreen.cmsgammamode"
40 #define SETTING_VIDEO_CMSGAMMA "videoscreen.cmsgamma"
41 #define SETTING_VIDEO_CMSLUTSIZE "videoscreen.cmslutsize"
43 CGUIDialogCMSSettings::CGUIDialogCMSSettings()
44 : CGUIDialogSettingsManualBase(WINDOW_DIALOG_CMS_OSD_SETTINGS
, "DialogSettings.xml")
47 CGUIDialogCMSSettings::~CGUIDialogCMSSettings() = default;
49 void CGUIDialogCMSSettings::SetupView()
51 CGUIDialogSettingsManualBase::SetupView();
54 SET_CONTROL_HIDDEN(CONTROL_SETTINGS_OKAY_BUTTON
);
55 SET_CONTROL_HIDDEN(CONTROL_SETTINGS_CUSTOM_BUTTON
);
56 SET_CONTROL_LABEL(CONTROL_SETTINGS_CANCEL_BUTTON
, 15067);
59 void CGUIDialogCMSSettings::InitializeSettings()
61 CGUIDialogSettingsManualBase::InitializeSettings();
63 const std::shared_ptr
<CSettingCategory
> category
= AddCategory("cms", -1);
66 CLog::Log(LOGERROR
, "CGUIDialogCMSSettings: unable to setup settings");
70 // get all necessary setting groups
71 const std::shared_ptr
<CSettingGroup
> groupColorManagement
= AddGroup(category
);
72 if (groupColorManagement
== NULL
)
74 CLog::Log(LOGERROR
, "CGUIDialogCMSSettings: unable to setup settings");
78 bool usePopup
= g_SkinInfo
->HasSkinFile("DialogSlider.xml");
80 TranslatableIntegerSettingOptions entries
;
82 // create "depsCmsEnabled" for settings depending on CMS being enabled
83 CSettingDependency
dependencyCmsEnabled(SettingDependencyType::Enable
, GetSettingsManager());
84 dependencyCmsEnabled
.Or()->Add(std::make_shared
<CSettingDependencyCondition
>(
85 SETTING_VIDEO_CMSENABLE
, "true", SettingDependencyOperator::Equals
, false,
86 GetSettingsManager()));
87 SettingDependencies depsCmsEnabled
;
88 depsCmsEnabled
.push_back(dependencyCmsEnabled
);
90 // create "depsCms3dlut" for 3dlut settings
91 CSettingDependency
dependencyCms3dlut(SettingDependencyType::Visible
, GetSettingsManager());
92 dependencyCms3dlut
.And()->Add(std::make_shared
<CSettingDependencyCondition
>(
93 SETTING_VIDEO_CMSMODE
, std::to_string(CMS_MODE_3DLUT
), SettingDependencyOperator::Equals
,
94 false, GetSettingsManager()));
95 SettingDependencies depsCms3dlut
;
96 depsCms3dlut
.push_back(dependencyCmsEnabled
);
97 depsCms3dlut
.push_back(dependencyCms3dlut
);
99 // create "depsCmsIcc" for display settings with icc profile
100 CSettingDependency
dependencyCmsIcc(SettingDependencyType::Visible
, GetSettingsManager());
101 dependencyCmsIcc
.And()->Add(std::make_shared
<CSettingDependencyCondition
>(
102 SETTING_VIDEO_CMSMODE
, std::to_string(CMS_MODE_PROFILE
), SettingDependencyOperator::Equals
,
103 false, GetSettingsManager()));
104 SettingDependencies depsCmsIcc
;
105 depsCmsIcc
.push_back(dependencyCmsEnabled
);
106 depsCmsIcc
.push_back(dependencyCmsIcc
);
108 // create "depsCmsGamma" for effective gamma adjustment (not available with bt.1886)
109 CSettingDependency
dependencyCmsGamma(SettingDependencyType::Visible
, GetSettingsManager());
110 dependencyCmsGamma
.And()->Add(std::make_shared
<CSettingDependencyCondition
>(
111 SETTING_VIDEO_CMSGAMMAMODE
, std::to_string(CMS_TRC_BT1886
), SettingDependencyOperator::Equals
,
112 true, GetSettingsManager()));
113 SettingDependencies depsCmsGamma
;
114 depsCmsGamma
.push_back(dependencyCmsEnabled
);
115 depsCmsGamma
.push_back(dependencyCmsIcc
);
116 depsCmsGamma
.push_back(dependencyCmsGamma
);
118 const std::shared_ptr
<CSettings
> settings
= CServiceBroker::GetSettingsComponent()->GetSettings();
120 // color management settings
121 AddToggle(groupColorManagement
, SETTING_VIDEO_CMSENABLE
, 36560, SettingLevel::Basic
, settings
->GetBool(SETTING_VIDEO_CMSENABLE
));
123 int currentMode
= settings
->GetInt(SETTING_VIDEO_CMSMODE
);
125 // entries.push_back(TranslatableIntegerSettingOption(16039, CMS_MODE_OFF)); // FIXME: get from CMS class
126 entries
.emplace_back(36580, CMS_MODE_3DLUT
);
128 entries
.emplace_back(36581, CMS_MODE_PROFILE
);
130 std::shared_ptr
<CSettingInt
> settingCmsMode
= AddSpinner(groupColorManagement
, SETTING_VIDEO_CMSMODE
, 36562, SettingLevel::Basic
, currentMode
, entries
);
131 settingCmsMode
->SetDependencies(depsCmsEnabled
);
133 std::string current3dLUT
= settings
->GetString(SETTING_VIDEO_CMS3DLUT
);
134 std::shared_ptr
<CSettingString
> settingCms3dlut
= AddList(groupColorManagement
, SETTING_VIDEO_CMS3DLUT
, 36564, SettingLevel::Basic
, current3dLUT
, Cms3dLutsFiller
, 36564);
135 settingCms3dlut
->SetDependencies(depsCms3dlut
);
138 int currentWhitepoint
= settings
->GetInt(SETTING_VIDEO_CMSWHITEPOINT
);
140 entries
.emplace_back(36586, CMS_WHITEPOINT_D65
);
141 entries
.emplace_back(36587, CMS_WHITEPOINT_D93
);
142 std::shared_ptr
<CSettingInt
> settingCmsWhitepoint
= AddSpinner(groupColorManagement
, SETTING_VIDEO_CMSWHITEPOINT
, 36568, SettingLevel::Basic
, currentWhitepoint
, entries
);
143 settingCmsWhitepoint
->SetDependencies(depsCmsIcc
);
145 int currentPrimaries
= settings
->GetInt(SETTING_VIDEO_CMSPRIMARIES
);
147 entries
.emplace_back(36588, CMS_PRIMARIES_AUTO
);
148 entries
.emplace_back(36589, CMS_PRIMARIES_BT709
);
149 entries
.emplace_back(36579, CMS_PRIMARIES_BT2020
);
150 entries
.emplace_back(36590, CMS_PRIMARIES_170M
);
151 entries
.emplace_back(36591, CMS_PRIMARIES_BT470M
);
152 entries
.emplace_back(36592, CMS_PRIMARIES_BT470BG
);
153 entries
.emplace_back(36593, CMS_PRIMARIES_240M
);
154 std::shared_ptr
<CSettingInt
> settingCmsPrimaries
= AddSpinner(groupColorManagement
, SETTING_VIDEO_CMSPRIMARIES
, 36570, SettingLevel::Basic
, currentPrimaries
, entries
);
155 settingCmsPrimaries
->SetDependencies(depsCmsIcc
);
157 int currentGammaMode
= settings
->GetInt(SETTING_VIDEO_CMSGAMMAMODE
);
159 entries
.emplace_back(36582, CMS_TRC_BT1886
);
160 entries
.emplace_back(36583, CMS_TRC_INPUT_OFFSET
);
161 entries
.emplace_back(36584, CMS_TRC_OUTPUT_OFFSET
);
162 entries
.emplace_back(36585, CMS_TRC_ABSOLUTE
);
163 std::shared_ptr
<CSettingInt
> settingCmsGammaMode
= AddSpinner(groupColorManagement
, SETTING_VIDEO_CMSGAMMAMODE
, 36572, SettingLevel::Basic
, currentGammaMode
, entries
);
164 settingCmsGammaMode
->SetDependencies(depsCmsIcc
);
166 float currentGamma
= settings
->GetInt(SETTING_VIDEO_CMSGAMMA
)/100.0f
;
167 if (currentGamma
== 0.0f
)
168 currentGamma
= 2.20f
;
169 std::shared_ptr
<CSettingNumber
> settingCmsGamma
= AddSlider(groupColorManagement
, SETTING_VIDEO_CMSGAMMA
, 36574, SettingLevel::Basic
, currentGamma
, 36597, 1.6, 0.05, 2.8, 36574, usePopup
);
170 settingCmsGamma
->SetDependencies(depsCmsGamma
);
172 int currentLutSize
= settings
->GetInt(SETTING_VIDEO_CMSLUTSIZE
);
174 entries
.emplace_back(36594, 4);
175 entries
.emplace_back(36595, 6);
176 entries
.emplace_back(36596, 8);
177 std::shared_ptr
<CSettingInt
> settingCmsLutSize
= AddSpinner(groupColorManagement
, SETTING_VIDEO_CMSLUTSIZE
, 36576, SettingLevel::Basic
, currentLutSize
, entries
);
178 settingCmsLutSize
->SetDependencies(depsCmsIcc
);
181 void CGUIDialogCMSSettings::OnSettingChanged(const std::shared_ptr
<const CSetting
>& setting
)
186 CGUIDialogSettingsManualBase::OnSettingChanged(setting
);
188 const std::string
&settingId
= setting
->GetId();
189 if (settingId
== SETTING_VIDEO_CMSENABLE
)
190 CServiceBroker::GetSettingsComponent()->GetSettings()->SetBool(SETTING_VIDEO_CMSENABLE
, (std::static_pointer_cast
<const CSettingBool
>(setting
)->GetValue()));
191 else if (settingId
== SETTING_VIDEO_CMSMODE
)
192 CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSMODE
, std::static_pointer_cast
<const CSettingInt
>(setting
)->GetValue());
193 else if (settingId
== SETTING_VIDEO_CMS3DLUT
)
194 CServiceBroker::GetSettingsComponent()->GetSettings()->SetString(SETTING_VIDEO_CMS3DLUT
, std::static_pointer_cast
<const CSettingString
>(setting
)->GetValue());
195 else if (settingId
== SETTING_VIDEO_CMSWHITEPOINT
)
196 CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSWHITEPOINT
, std::static_pointer_cast
<const CSettingInt
>(setting
)->GetValue());
197 else if (settingId
== SETTING_VIDEO_CMSPRIMARIES
)
198 CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSPRIMARIES
, std::static_pointer_cast
<const CSettingInt
>(setting
)->GetValue());
199 else if (settingId
== SETTING_VIDEO_CMSGAMMAMODE
)
200 CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSGAMMAMODE
, std::static_pointer_cast
<const CSettingInt
>(setting
)->GetValue());
201 else if (settingId
== SETTING_VIDEO_CMSGAMMA
)
202 CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSGAMMA
, static_cast<float>(std::static_pointer_cast
<const CSettingNumber
>(setting
)->GetValue())*100);
203 else if (settingId
== SETTING_VIDEO_CMSLUTSIZE
)
204 CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSLUTSIZE
, std::static_pointer_cast
<const CSettingInt
>(setting
)->GetValue());
207 bool CGUIDialogCMSSettings::OnBack(int actionID
)
210 return CGUIDialogSettingsBase::OnBack(actionID
);
213 bool CGUIDialogCMSSettings::Save()
215 CLog::Log(LOGINFO
, "CGUIDialogCMSSettings: Save() called");
216 CServiceBroker::GetSettingsComponent()->GetSettings()->Save();
221 void CGUIDialogCMSSettings::Cms3dLutsFiller(const SettingConstPtr
& setting
,
222 std::vector
<StringSettingOption
>& list
,
223 std::string
& current
,
226 // get 3dLut directory from settings
230 std::string current3dlut
= CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(SETTING_VIDEO_CMS3DLUT
);
231 if (!current3dlut
.empty())
232 current3dlut
= URIUtils::GetDirectory(current3dlut
);
233 XFILE::CDirectory::GetDirectory(current3dlut
, items
, ".3dlut", XFILE::DIR_FLAG_DEFAULTS
);
235 for (int i
= 0; i
< items
.Size(); i
++)
237 list
.emplace_back(items
[i
]->GetLabel(), items
[i
]->GetPath());