Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2018-12-05 15:34:04 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2018-12-05 16:11:21 +0300
commit6122e1d6c02c530b40114201b24b0fb3fcd0f44c (patch)
tree995cca02d4619ef999a8fbb4af0f2e3bd708171e /intern/opencolorio
parentb927d196969bd0bb28ba300a31df3d294443df26 (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/opencolorio')
-rw-r--r--intern/opencolorio/ocio_impl.cc57
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);
}