From 241fac09dd1b4bb89d3b5a99b999fa9e529bc439 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 17 Aug 2023 14:38:07 +0200 Subject: [PATCH] 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 --- source/blender/imbuf/IMB_colormanagement.h | 3 ++ .../blender/imbuf/intern/colormanagement.cc | 33 ++++++++++++++++--- source/blender/makesrna/intern/rna_color.cc | 12 +++++-- 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/source/blender/imbuf/IMB_colormanagement.h b/source/blender/imbuf/IMB_colormanagement.h index beba0aa496a..545b10a9e6e 100644 --- a/source/blender/imbuf/IMB_colormanagement.h +++ b/source/blender/imbuf/IMB_colormanagement.h @@ -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); /** \} */ diff --git a/source/blender/imbuf/intern/colormanagement.cc b/source/blender/imbuf/intern/colormanagement.cc index 6cca523d493..3b32add80fa 100644 --- a/source/blender/imbuf/intern/colormanagement.cc +++ b/source/blender/imbuf/intern/colormanagement.cc @@ -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(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(); +} + /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/makesrna/intern/rna_color.cc b/source/blender/makesrna/intern/rna_color.cc index 698160c3f2b..451b48f1c24 100644 --- a/source/blender/makesrna/intern/rna_color.cc +++ b/source/blender/makesrna/intern/rna_color.cc @@ -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); } }