From 6122e1d6c02c530b40114201b24b0fb3fcd0f44c Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 5 Dec 2018 13:34:04 +0100 Subject: 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. --- intern/opencolorio/ocio_impl.cc | 57 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'intern/opencolorio') 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 +#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); } -- cgit v1.2.3