diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-12-05 15:34:04 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-12-05 16:11:21 +0300 |
commit | 6122e1d6c02c530b40114201b24b0fb3fcd0f44c (patch) | |
tree | 995cca02d4619ef999a8fbb4af0f2e3bd708171e /intern | |
parent | b927d196969bd0bb28ba300a31df3d294443df26 (diff) |
Color management: Fix/workaround broken getDefaultDisplay()
This is something what is caused by OCIO library. The patch
has been submitted there:
https://github.com/imageworks/OpenColorIO/pull/638
For until it is refined and checked we do workaround from
our side.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/opencolorio/ocio_impl.cc | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/intern/opencolorio/ocio_impl.cc b/intern/opencolorio/ocio_impl.cc index 82536a74159..4e159fb9ab4 100644 --- a/intern/opencolorio/ocio_impl.cc +++ b/intern/opencolorio/ocio_impl.cc @@ -55,6 +55,18 @@ using namespace OCIO_NAMESPACE; # define __func__ __FUNCTION__ #endif +/* NOTE: This is because OCIO 1.1.0 has a bug which makes default + * display to be the one which is first alphabetically. + * + * Fix has been submitted as a patch + * https://github.com/imageworks/OpenColorIO/pull/638 + * + * For until then we use first usable display instead. */ +#define DEFAULT_DISPLAY_WORKAROUND +#ifdef DEFAULT_DISPLAY_WORKAROUND +# include <mutex> +#endif + static void OCIO_reportError(const char *err) { std::cerr << "OpenColorIO Error: " << err << std::endl; @@ -197,6 +209,28 @@ int OCIOImpl::configGetIndexForColorSpace(OCIO_ConstConfigRcPtr *config, const c const char *OCIOImpl::configGetDefaultDisplay(OCIO_ConstConfigRcPtr *config) { +#ifdef DEFAULT_DISPLAY_WORKAROUND + if (getenv("OCIO_ACTIVE_DISPLAYS") == NULL) { + const char *active_displays = + (*(ConstConfigRcPtr *) config)->getActiveDisplays(); + const char *separator_pos = strchr(active_displays, ','); + if (separator_pos == NULL) { + return active_displays; + } + static std::string active_display; + /* NOTE: Configuration is shared and is never changed during runtime, + * so we only guarantee two threads don't initialize at the same. */ + static std::mutex mutex; + mutex.lock(); + if (active_display.empty()) { + active_display = active_displays; + active_display[separator_pos - active_displays] = '\0'; + } + mutex.unlock(); + return active_display.c_str(); + } +#endif + try { return (*(ConstConfigRcPtr *) config)->getDefaultDisplay(); } @@ -233,6 +267,29 @@ const char *OCIOImpl::configGetDisplay(OCIO_ConstConfigRcPtr *config, int index) const char *OCIOImpl::configGetDefaultView(OCIO_ConstConfigRcPtr *config, const char *display) { +#ifdef DEFAULT_DISPLAY_WORKAROUND + /* NOTE: We assume that first active view always exists for a default + * display. */ + if (getenv("OCIO_ACTIVE_VIEWS") == NULL) { + const char *active_views = + (*(ConstConfigRcPtr *) config)->getActiveViews(); + const char *separator_pos = strchr(active_views, ','); + if (separator_pos == NULL) { + return active_views; + } + static std::string active_view; + /* NOTE: Configuration is shared and is never changed during runtime, + * so we only guarantee two threads don't initialize at the same. */ + static std::mutex mutex; + mutex.lock(); + if (active_view.empty()) { + active_view = active_views; + active_view[separator_pos - active_views] = '\0'; + } + mutex.unlock(); + return active_view.c_str(); + } +#endif try { return (*(ConstConfigRcPtr *) config)->getDefaultView(display); } |