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 "GUIPassword.h"
13 #include "ServiceBroker.h"
14 #include "addons/Skin.h"
15 #include "cores/VideoPlayer/VideoRenderers/ColorManager.h"
16 #include "cores/VideoPlayer/VideoRenderers/RenderManager.h"
17 #include "filesystem/Directory.h"
18 #include "guilib/GUIWindowManager.h"
19 #include "profiles/ProfileManager.h"
20 #include "settings/Settings.h"
21 #include "settings/SettingsComponent.h"
22 #include "settings/lib/Setting.h"
23 #include "settings/lib/SettingDefinitions.h"
24 #include "settings/lib/SettingsManager.h"
25 #include "utils/URIUtils.h"
26 #include "utils/Variant.h"
27 #include "utils/log.h"
28 #include "video/VideoDatabase.h"
32 #define SETTING_VIDEO_CMSENABLE "videoscreen.cmsenabled"
33 #define SETTING_VIDEO_CMSMODE "videoscreen.cmsmode"
34 #define SETTING_VIDEO_CMS3DLUT "videoscreen.cms3dlut"
35 #define SETTING_VIDEO_CMSWHITEPOINT "videoscreen.cmswhitepoint"
36 #define SETTING_VIDEO_CMSPRIMARIES "videoscreen.cmsprimaries"
37 #define SETTING_VIDEO_CMSGAMMAMODE "videoscreen.cmsgammamode"
38 #define SETTING_VIDEO_CMSGAMMA "videoscreen.cmsgamma"
39 #define SETTING_VIDEO_CMSLUTSIZE "videoscreen.cmslutsize"
41 CGUIDialogCMSSettings::CGUIDialogCMSSettings()
42 : CGUIDialogSettingsManualBase(WINDOW_DIALOG_CMS_OSD_SETTINGS
, "DialogSettings.xml")
45 CGUIDialogCMSSettings::~CGUIDialogCMSSettings() = default;
47 void CGUIDialogCMSSettings::SetupView()
49 CGUIDialogSettingsManualBase::SetupView();
52 SET_CONTROL_HIDDEN(CONTROL_SETTINGS_OKAY_BUTTON
);
53 SET_CONTROL_HIDDEN(CONTROL_SETTINGS_CUSTOM_BUTTON
);
54 SET_CONTROL_LABEL(CONTROL_SETTINGS_CANCEL_BUTTON
, 15067);
57 void CGUIDialogCMSSettings::InitializeSettings()
59 CGUIDialogSettingsManualBase::InitializeSettings();
61 const std::shared_ptr
<CSettingCategory
> category
= AddCategory("cms", -1);
64 CLog::Log(LOGERROR
, "CGUIDialogCMSSettings: unable to setup settings");
68 // get all necessary setting groups
69 const std::shared_ptr
<CSettingGroup
> groupColorManagement
= AddGroup(category
);
70 if (groupColorManagement
== NULL
)
72 CLog::Log(LOGERROR
, "CGUIDialogCMSSettings: unable to setup settings");
76 bool usePopup
= g_SkinInfo
->HasSkinFile("DialogSlider.xml");
78 TranslatableIntegerSettingOptions entries
;
80 // create "depsCmsEnabled" for settings depending on CMS being enabled
81 CSettingDependency
dependencyCmsEnabled(SettingDependencyType::Enable
, GetSettingsManager());
82 dependencyCmsEnabled
.Or()
83 ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_VIDEO_CMSENABLE
, "true", SettingDependencyOperator::Equals
, false, GetSettingsManager())));
84 SettingDependencies depsCmsEnabled
;
85 depsCmsEnabled
.push_back(dependencyCmsEnabled
);
87 // create "depsCms3dlut" for 3dlut settings
88 CSettingDependency
dependencyCms3dlut(SettingDependencyType::Visible
, GetSettingsManager());
89 dependencyCms3dlut
.And()
90 ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_VIDEO_CMSMODE
, std::to_string(CMS_MODE_3DLUT
), SettingDependencyOperator::Equals
, false, GetSettingsManager())));
91 SettingDependencies depsCms3dlut
;
92 depsCms3dlut
.push_back(dependencyCmsEnabled
);
93 depsCms3dlut
.push_back(dependencyCms3dlut
);
95 // create "depsCmsIcc" for display settings with icc profile
96 CSettingDependency
dependencyCmsIcc(SettingDependencyType::Visible
, GetSettingsManager());
97 dependencyCmsIcc
.And()
98 ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_VIDEO_CMSMODE
, std::to_string(CMS_MODE_PROFILE
), SettingDependencyOperator::Equals
, false, GetSettingsManager())));
99 SettingDependencies depsCmsIcc
;
100 depsCmsIcc
.push_back(dependencyCmsEnabled
);
101 depsCmsIcc
.push_back(dependencyCmsIcc
);
103 // create "depsCmsGamma" for effective gamma adjustment (not available with bt.1886)
104 CSettingDependency
dependencyCmsGamma(SettingDependencyType::Visible
, GetSettingsManager());
105 dependencyCmsGamma
.And()
106 ->Add(CSettingDependencyConditionPtr(new CSettingDependencyCondition(SETTING_VIDEO_CMSGAMMAMODE
, std::to_string(CMS_TRC_BT1886
), SettingDependencyOperator::Equals
, true, GetSettingsManager())));
107 SettingDependencies depsCmsGamma
;
108 depsCmsGamma
.push_back(dependencyCmsEnabled
);
109 depsCmsGamma
.push_back(dependencyCmsIcc
);
110 depsCmsGamma
.push_back(dependencyCmsGamma
);
112 const std::shared_ptr
<CSettings
> settings
= CServiceBroker::GetSettingsComponent()->GetSettings();
114 // color management settings
115 AddToggle(groupColorManagement
, SETTING_VIDEO_CMSENABLE
, 36560, SettingLevel::Basic
, settings
->GetBool(SETTING_VIDEO_CMSENABLE
));
117 int currentMode
= settings
->GetInt(SETTING_VIDEO_CMSMODE
);
119 // entries.push_back(TranslatableIntegerSettingOption(16039, CMS_MODE_OFF)); // FIXME: get from CMS class
120 entries
.push_back(TranslatableIntegerSettingOption(36580, CMS_MODE_3DLUT
));
122 entries
.push_back(TranslatableIntegerSettingOption(36581, CMS_MODE_PROFILE
));
124 std::shared_ptr
<CSettingInt
> settingCmsMode
= AddSpinner(groupColorManagement
, SETTING_VIDEO_CMSMODE
, 36562, SettingLevel::Basic
, currentMode
, entries
);
125 settingCmsMode
->SetDependencies(depsCmsEnabled
);
127 std::string current3dLUT
= settings
->GetString(SETTING_VIDEO_CMS3DLUT
);
128 std::shared_ptr
<CSettingString
> settingCms3dlut
= AddList(groupColorManagement
, SETTING_VIDEO_CMS3DLUT
, 36564, SettingLevel::Basic
, current3dLUT
, Cms3dLutsFiller
, 36564);
129 settingCms3dlut
->SetDependencies(depsCms3dlut
);
132 int currentWhitepoint
= settings
->GetInt(SETTING_VIDEO_CMSWHITEPOINT
);
134 entries
.push_back(TranslatableIntegerSettingOption(36586, CMS_WHITEPOINT_D65
));
135 entries
.push_back(TranslatableIntegerSettingOption(36587, CMS_WHITEPOINT_D93
));
136 std::shared_ptr
<CSettingInt
> settingCmsWhitepoint
= AddSpinner(groupColorManagement
, SETTING_VIDEO_CMSWHITEPOINT
, 36568, SettingLevel::Basic
, currentWhitepoint
, entries
);
137 settingCmsWhitepoint
->SetDependencies(depsCmsIcc
);
139 int currentPrimaries
= settings
->GetInt(SETTING_VIDEO_CMSPRIMARIES
);
141 entries
.push_back(TranslatableIntegerSettingOption(36588, CMS_PRIMARIES_AUTO
));
142 entries
.push_back(TranslatableIntegerSettingOption(36589, CMS_PRIMARIES_BT709
));
143 entries
.push_back(TranslatableIntegerSettingOption(36579, CMS_PRIMARIES_BT2020
));
144 entries
.push_back(TranslatableIntegerSettingOption(36590, CMS_PRIMARIES_170M
));
145 entries
.push_back(TranslatableIntegerSettingOption(36591, CMS_PRIMARIES_BT470M
));
146 entries
.push_back(TranslatableIntegerSettingOption(36592, CMS_PRIMARIES_BT470BG
));
147 entries
.push_back(TranslatableIntegerSettingOption(36593, CMS_PRIMARIES_240M
));
148 std::shared_ptr
<CSettingInt
> settingCmsPrimaries
= AddSpinner(groupColorManagement
, SETTING_VIDEO_CMSPRIMARIES
, 36570, SettingLevel::Basic
, currentPrimaries
, entries
);
149 settingCmsPrimaries
->SetDependencies(depsCmsIcc
);
151 int currentGammaMode
= settings
->GetInt(SETTING_VIDEO_CMSGAMMAMODE
);
153 entries
.push_back(TranslatableIntegerSettingOption(36582, CMS_TRC_BT1886
));
154 entries
.push_back(TranslatableIntegerSettingOption(36583, CMS_TRC_INPUT_OFFSET
));
155 entries
.push_back(TranslatableIntegerSettingOption(36584, CMS_TRC_OUTPUT_OFFSET
));
156 entries
.push_back(TranslatableIntegerSettingOption(36585, CMS_TRC_ABSOLUTE
));
157 std::shared_ptr
<CSettingInt
> settingCmsGammaMode
= AddSpinner(groupColorManagement
, SETTING_VIDEO_CMSGAMMAMODE
, 36572, SettingLevel::Basic
, currentGammaMode
, entries
);
158 settingCmsGammaMode
->SetDependencies(depsCmsIcc
);
160 float currentGamma
= settings
->GetInt(SETTING_VIDEO_CMSGAMMA
)/100.0f
;
161 if (currentGamma
== 0.0f
)
162 currentGamma
= 2.20f
;
163 std::shared_ptr
<CSettingNumber
> settingCmsGamma
= AddSlider(groupColorManagement
, SETTING_VIDEO_CMSGAMMA
, 36574, SettingLevel::Basic
, currentGamma
, 36597, 1.6, 0.05, 2.8, 36574, usePopup
);
164 settingCmsGamma
->SetDependencies(depsCmsGamma
);
166 int currentLutSize
= settings
->GetInt(SETTING_VIDEO_CMSLUTSIZE
);
168 entries
.push_back(TranslatableIntegerSettingOption(36594, 4));
169 entries
.push_back(TranslatableIntegerSettingOption(36595, 6));
170 entries
.push_back(TranslatableIntegerSettingOption(36596, 8));
171 std::shared_ptr
<CSettingInt
> settingCmsLutSize
= AddSpinner(groupColorManagement
, SETTING_VIDEO_CMSLUTSIZE
, 36576, SettingLevel::Basic
, currentLutSize
, entries
);
172 settingCmsLutSize
->SetDependencies(depsCmsIcc
);
175 void CGUIDialogCMSSettings::OnSettingChanged(const std::shared_ptr
<const CSetting
>& setting
)
180 CGUIDialogSettingsManualBase::OnSettingChanged(setting
);
182 const std::string
&settingId
= setting
->GetId();
183 if (settingId
== SETTING_VIDEO_CMSENABLE
)
184 CServiceBroker::GetSettingsComponent()->GetSettings()->SetBool(SETTING_VIDEO_CMSENABLE
, (std::static_pointer_cast
<const CSettingBool
>(setting
)->GetValue()));
185 else if (settingId
== SETTING_VIDEO_CMSMODE
)
186 CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSMODE
, std::static_pointer_cast
<const CSettingInt
>(setting
)->GetValue());
187 else if (settingId
== SETTING_VIDEO_CMS3DLUT
)
188 CServiceBroker::GetSettingsComponent()->GetSettings()->SetString(SETTING_VIDEO_CMS3DLUT
, std::static_pointer_cast
<const CSettingString
>(setting
)->GetValue());
189 else if (settingId
== SETTING_VIDEO_CMSWHITEPOINT
)
190 CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSWHITEPOINT
, std::static_pointer_cast
<const CSettingInt
>(setting
)->GetValue());
191 else if (settingId
== SETTING_VIDEO_CMSPRIMARIES
)
192 CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSPRIMARIES
, std::static_pointer_cast
<const CSettingInt
>(setting
)->GetValue());
193 else if (settingId
== SETTING_VIDEO_CMSGAMMAMODE
)
194 CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSGAMMAMODE
, std::static_pointer_cast
<const CSettingInt
>(setting
)->GetValue());
195 else if (settingId
== SETTING_VIDEO_CMSGAMMA
)
196 CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSGAMMA
, static_cast<float>(std::static_pointer_cast
<const CSettingNumber
>(setting
)->GetValue())*100);
197 else if (settingId
== SETTING_VIDEO_CMSLUTSIZE
)
198 CServiceBroker::GetSettingsComponent()->GetSettings()->SetInt(SETTING_VIDEO_CMSLUTSIZE
, std::static_pointer_cast
<const CSettingInt
>(setting
)->GetValue());
201 bool CGUIDialogCMSSettings::OnBack(int actionID
)
204 return CGUIDialogSettingsBase::OnBack(actionID
);
207 bool CGUIDialogCMSSettings::Save()
209 CLog::Log(LOGINFO
, "CGUIDialogCMSSettings: Save() called");
210 CServiceBroker::GetSettingsComponent()->GetSettings()->Save();
215 void CGUIDialogCMSSettings::Cms3dLutsFiller(const SettingConstPtr
& setting
,
216 std::vector
<StringSettingOption
>& list
,
217 std::string
& current
,
220 // get 3dLut directory from settings
224 std::string current3dlut
= CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(SETTING_VIDEO_CMS3DLUT
);
225 if (!current3dlut
.empty())
226 current3dlut
= URIUtils::GetDirectory(current3dlut
);
227 XFILE::CDirectory::GetDirectory(current3dlut
, items
, ".3dlut", XFILE::DIR_FLAG_DEFAULTS
);
229 for (int i
= 0; i
< items
.Size(); i
++)
231 list
.emplace_back(items
[i
]->GetLabel(), items
[i
]->GetPath());