Color management: Validate Look on View Transform changes

If the new view transform does not support the currently configured
look reset look to the default None, similar to the color management
verification on .blend file open.

Currently it is not a problem as all views support the same set of
looks. But with an upcoming addition of AgX it will no longer be
true.

Ref #110685

Pull Request: https://projects.blender.org/blender/blender/pulls/111185
This commit is contained in:
Sergey Sharybin 2023-08-17 14:38:07 +02:00 committed by Sergey Sharybin
parent 2b30d26ae9
commit 241fac09dd
3 changed files with 41 additions and 7 deletions

View File

@ -343,6 +343,9 @@ const char *IMB_colormanagement_view_get_indexed_name(int index);
int IMB_colormanagement_look_get_named_index(const char *name);
const char *IMB_colormanagement_look_get_indexed_name(int index);
const char *IMB_colormanagement_look_get_default_name(void);
const char *IMB_colormanagement_look_validate_for_view(const char *view_name,
const char *look_name);
/** \} */

View File

@ -1101,7 +1101,7 @@ static void colormanage_check_view_settings(ColorManagedDisplaySettings *display
{
ColorManagedDisplay *display;
ColorManagedView *default_view = nullptr;
ColorManagedLook *default_look = (ColorManagedLook *)global_looks.first;
const char *default_look_name = IMB_colormanagement_look_get_default_name();
if (view_settings->view_transform[0] == '\0') {
display = colormanage_display_get_named(display_settings->display_device);
@ -1136,7 +1136,7 @@ static void colormanage_check_view_settings(ColorManagedDisplaySettings *display
}
if (view_settings->look[0] == '\0') {
STRNCPY(view_settings->look, default_look->name);
STRNCPY(view_settings->look, default_look_name);
}
else {
ColorManagedLook *look = colormanage_look_get_named(view_settings->look);
@ -1144,9 +1144,9 @@ static void colormanage_check_view_settings(ColorManagedDisplaySettings *display
printf("Color management: %s look \"%s\" not found, setting default \"%s\".\n",
what,
view_settings->look,
default_look->name);
default_look_name);
STRNCPY(view_settings->look, default_look->name);
STRNCPY(view_settings->look, default_look_name);
}
}
@ -3314,6 +3314,31 @@ const char *IMB_colormanagement_look_get_indexed_name(int index)
return nullptr;
}
const char *IMB_colormanagement_look_get_default_name()
{
const ColorManagedLook *default_look = static_cast<const ColorManagedLook *>(global_looks.first);
if (!default_look) {
return "";
}
return default_look->name;
}
const char *IMB_colormanagement_look_validate_for_view(const char *view_name,
const char *look_name)
{
ColorManagedLook *look_descr = colormanage_look_get_named(look_name);
if (!look_descr) {
return look_name;
}
if (colormanage_compatible_look(look_descr, view_name)) {
return look_name;
}
return IMB_colormanagement_look_get_default_name();
}
/** \} */
/* -------------------------------------------------------------------- */

View File

@ -466,10 +466,16 @@ static void rna_ColorManagedViewSettings_view_transform_set(PointerRNA *ptr, int
{
ColorManagedViewSettings *view = (ColorManagedViewSettings *)ptr->data;
const char *name = IMB_colormanagement_view_get_indexed_name(value);
const char *view_name = IMB_colormanagement_view_get_indexed_name(value);
if (!view_name) {
return;
}
if (name) {
STRNCPY(view->view_transform, name);
STRNCPY(view->view_transform, view_name);
const char *look_name = IMB_colormanagement_look_validate_for_view(view_name, view->look);
if (look_name) {
STRNCPY(view->look, look_name);
}
}