From b5d8bbe3238f9ecc950782731404d7b2e14fce90 Mon Sep 17 00:00:00 2001 From: annie Date: Fri, 27 Sep 2024 22:11:50 -0400 Subject: [PATCH 01/17] Add view helper functions to Config class Signed-off-by: annie --- include/OpenColorIO/OpenColorIO.h | 19 +++++ src/OpenColorIO/Config.cpp | 132 ++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) diff --git a/include/OpenColorIO/OpenColorIO.h b/include/OpenColorIO/OpenColorIO.h index b7183ce77f..66c62ec445 100644 --- a/include/OpenColorIO/OpenColorIO.h +++ b/include/OpenColorIO/OpenColorIO.h @@ -852,6 +852,9 @@ class OCIOEXPORT Config * \ref Config::validate will throw if the config does not contain * the matching display color space. */ + + bool viewIsShared(const char * dispName, const char * viewName) const; + /// Will throw if view or colorSpaceName are null or empty. void addSharedView(const char * view, const char * viewTransformName, const char * colorSpaceName, const char * looks, @@ -859,6 +862,8 @@ class OCIOEXPORT Config /// Remove a shared view. Will throw if the view does not exist. void removeSharedView(const char * view); + void clearSharedViews(); + const char * getDefaultDisplay() const; int getNumDisplays() const; /// Will return "" if the index is invalid. @@ -883,6 +888,11 @@ class OCIOEXPORT Config int getNumViews(const char * display, const char * colorspaceName) const; const char * getView(const char * display, const char * colorspaceName, int index) const; + static bool viewsAreEqual(const ConstConfigRcPtr & first, + const ConstConfigRcPtr & second, + const char * dispName, + const char * viewName); + /** * Returns the view_transform attribute of the (display, view) pair. View can * be a shared view of the display. If display is null or empty, config shared views are used. @@ -900,6 +910,8 @@ class OCIOEXPORT Config /// Returns the description attribute of a (display, view) pair. const char * getDisplayViewDescription(const char * display, const char * view) const noexcept; + bool displayHasView(const char * dispName, const char * viewName) const; + /** * For the (display, view) pair, specify which color space and look to use. * If a look is not desired, then just pass a null or empty string. @@ -963,6 +975,9 @@ class OCIOEXPORT Config * */ + bool hasVirtualView(const char * viewName) const; + bool virtualViewIsShared(const char * viewName) const; + void addVirtualDisplayView(const char * view, const char * viewTransformName, const char * colorSpaceName, @@ -977,6 +992,10 @@ class OCIOEXPORT Config /// Get the view name at a specific index. const char * getVirtualDisplayView(ViewType type, int index) const noexcept; + static bool virtualViewsAreEqual(const ConstConfigRcPtr & first, + const ConstConfigRcPtr & second, + const char * viewName); + const char * getVirtualDisplayViewTransformName(const char * view) const noexcept; const char * getVirtualDisplayViewColorSpaceName(const char * view) const noexcept; const char * getVirtualDisplayViewLooks(const char * view) const noexcept; diff --git a/src/OpenColorIO/Config.cpp b/src/OpenColorIO/Config.cpp index a4cf7c5fe4..d29debce85 100644 --- a/src/OpenColorIO/Config.cpp +++ b/src/OpenColorIO/Config.cpp @@ -3305,6 +3305,23 @@ void Config::setViewingRules(ConstViewingRulesRcPtr viewingRules) getImpl()->resetCacheIDs(); } +bool Config::viewIsShared(const char * dispName, const char * viewName) const +{ + // Check if a view within a given display is a display-defined view or is referencing + // one of the config's shared views. + + for (int v = 0; v < getNumViews(VIEW_SHARED, dispName); v++) + { + const char * sharedViewName = getView(VIEW_SHARED, dispName, v); + if (sharedViewName && *sharedViewName && Platform::Strcasecmp(sharedViewName, viewName) == 0) + { + return true; + } + } + + return false; +} + void Config::addSharedView(const char * view, const char * viewTransform, const char * colorSpace, const char * looks, const char * rule, const char * description) @@ -3358,6 +3375,19 @@ void Config::removeSharedView(const char * view) } } +void Config::clearSharedViews() +{ + int numViews = getNumViews(VIEW_SHARED, nullptr); + for (int v = numViews - 1; v >= 0; v--) + { + const char * sharedViewName = getView(VIEW_SHARED, nullptr, v); + if (sharedViewName && *sharedViewName) + { + removeSharedView(sharedViewName); + } + } +} + const char * Config::getDefaultDisplay() const { return getDisplay(0); @@ -3487,6 +3517,43 @@ const char * Config::getView(const char * display, const char * colorspace, int return ""; } + +bool Config::viewsAreEqual(const ConstConfigRcPtr & first, + const ConstConfigRcPtr & second, + const char * dispName, // may be empty or nullptr for shared views + const char * viewName) +{ + // It's ok to call this even for displays/views that don't exist, it will simply return false. + + // Note that this will return true even if the view is display-defined in one config and a reference + // to a shared view in the other config (both within the same display), as long as the contents match. + + // These calls return null if either the display or view doesn't exist (regardless if it's active). + const char * cs1 = first->getDisplayViewColorSpaceName(dispName, viewName); + const char * cs2 = second->getDisplayViewColorSpaceName(dispName, viewName); + + // If the color space is not null, the display and view exist. + if (cs1 && *cs1 && cs2 && *cs2) + { + // Both configs have a display and view by this name, now check the contents. + if (Platform::Strcasecmp(cs1, cs2) == 0) + { + // Note the remaining strings may be empty in a valid view. + // Intentionally not checking the description since it is not a functional difference. + if ( (Platform::Strcasecmp(first->getDisplayViewLooks(dispName, viewName), + second->getDisplayViewLooks(dispName, viewName)) == 0) && + (Platform::Strcasecmp(first->getDisplayViewTransformName(dispName, viewName), + second->getDisplayViewTransformName(dispName, viewName)) == 0) && + (Platform::Strcasecmp(first->getDisplayViewRule(dispName, viewName), + second->getDisplayViewRule(dispName, viewName)) == 0) ) + { + return true; + } + } + } + return false; +} + const char * Config::getDisplayViewTransformName(const char * display, const char * view) const { const View * viewPtr = getImpl()->getView(display, view); @@ -3525,6 +3592,21 @@ const char * Config::getDisplayViewDescription(const char * display, const char return viewPtr ? viewPtr->m_description.c_str() : ""; } +bool Config::displayHasView(const char * dispName, const char * viewName) const +{ + // This returns null if either the display or view doesn't exist. + // It works regardless of whether the display or view are active, + // and it works regardless of whether the view is display-defined + // or if the display has this as a shared view. + // + // It will only check config level shared views if dispName is null. + // It will not check config level shared views if dispName is not null. + const char * cs = getDisplayViewColorSpaceName(dispName, viewName); + + // All views must have a color space, so if it's not empty, the view exists. + return (cs && *cs); +} + void Config::addDisplaySharedView(const char * display, const char * sharedView) { if (!display || !*display) @@ -3695,6 +3777,28 @@ void Config::clearDisplays() getImpl()->resetCacheIDs(); } +bool Config::hasVirtualView(const char * viewName) const +{ + const char * cs = getVirtualDisplayViewColorSpaceName(viewName); + + // All views must have a color space, so if it's not empty, the view exists. + return (cs && *cs); +} + +bool Config::virtualViewIsShared(const char * viewName) const +{ + for (int v = 0; v < getVirtualDisplayNumViews(VIEW_SHARED); v++) + { + const char * sharedViewName = getVirtualDisplayView(VIEW_SHARED, v); + if (sharedViewName && *sharedViewName && Platform::Strcasecmp(sharedViewName, viewName) == 0) + { + return true; + } + } + + return false; +} + void Config::addVirtualDisplayView(const char * view, const char * viewTransform, const char * colorSpace, @@ -3795,6 +3899,34 @@ const char * Config::getVirtualDisplayView(ViewType type, int index) const noexc return ""; } +bool Config::virtualViewsAreEqual(const ConstConfigRcPtr & first, + const ConstConfigRcPtr & second, + const char * viewName) +{ + const char * cs1 = first->getVirtualDisplayViewColorSpaceName(viewName); + const char * cs2 = second->getVirtualDisplayViewColorSpaceName(viewName); + + // If the color space is not null, the display and view exist. + if (cs1 && *cs1 && cs2 && *cs2) + { + if (Platform::Strcasecmp(cs1, cs2) == 0) + { + // Note the remaining strings may be empty in a valid view. + // Intentionally not checking the description since it is not a functional difference. + if ( (Platform::Strcasecmp(first->getVirtualDisplayViewLooks(viewName), + second->getVirtualDisplayViewLooks(viewName)) == 0) && + (Platform::Strcasecmp(first->getVirtualDisplayViewTransformName(viewName), + second->getVirtualDisplayViewTransformName(viewName)) == 0) && + (Platform::Strcasecmp(first->getVirtualDisplayViewRule(viewName), + second->getVirtualDisplayViewRule(viewName)) == 0) ) + { + return true; + } + } + } + return false; +} + const char * Config::getVirtualDisplayViewTransformName(const char * view) const noexcept { if (!view) return ""; From 143aa90bce287074b3623a9a42a2d74044f73f7f Mon Sep 17 00:00:00 2001 From: annie Date: Thu, 17 Oct 2024 11:32:46 -0700 Subject: [PATCH 02/17] add view helper functions to Config class and unit tests Signed-off-by: annie --- src/OpenColorIO/Config.cpp | 7 ++++++ tests/cpu/Config_tests.cpp | 49 +++++++++++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/OpenColorIO/Config.cpp b/src/OpenColorIO/Config.cpp index d29debce85..2681c7b218 100644 --- a/src/OpenColorIO/Config.cpp +++ b/src/OpenColorIO/Config.cpp @@ -3944,6 +3944,13 @@ const char * Config::getVirtualDisplayViewColorSpaceName(const char * view) cons { if (!view) return ""; + // TODO: Remove the following work-around once bug for shared views is fixed. + // Get the colorspace name for the case where a virtual view is shared. + if (virtualViewIsShared(view)) + { + return getDisplayViewColorSpaceName(nullptr, view); + } + ViewVec::const_iterator iter = FindView(getImpl()->m_virtualDisplay.m_views, view); if (iter != getImpl()->m_virtualDisplay.m_views.end()) { diff --git a/tests/cpu/Config_tests.cpp b/tests/cpu/Config_tests.cpp index 518b97275b..8e261e5b50 100644 --- a/tests/cpu/Config_tests.cpp +++ b/tests/cpu/Config_tests.cpp @@ -6902,17 +6902,28 @@ OCIO_ADD_TEST(Config, display_view) // Add a simple view. const std::string display{ "display" }; + + OCIO_CHECK_ASSERT(!config->displayHasView(display.c_str(), "view1")); + OCIO_CHECK_NO_THROW(config->addDisplayView(display.c_str(), "view1", "scs", "")); + OCIO_CHECK_ASSERT(config->displayHasView(display.c_str(), "view1")); + OCIO_CHECK_NO_THROW(config->validate()); + OCIO_CHECK_ASSERT(!config->displayHasView(display.c_str(), "view2")); + OCIO_CHECK_NO_THROW(config->addDisplayView(display.c_str(), "view2", "view_transform", "scs", "", "", "")); OCIO_CHECK_THROW_WHAT(config->validate(), OCIO::Exception, "color space, 'scs', that is not a display-referred"); + OCIO_CHECK_ASSERT(config->displayHasView(display.c_str(), "view2")); + OCIO_CHECK_NO_THROW(config->addDisplayView(display.c_str(), "view2", "view_transform", "dcs", "", "", "")); + OCIO_CHECK_ASSERT(config->displayHasView(display.c_str(), "view2")); + OCIO_CHECK_NO_THROW(config->validate()); // Validate how the config is serialized. @@ -7338,7 +7349,10 @@ OCIO_ADD_TEST(Config, add_remove_display) // Add a (display, view) pair. + // todo (annie): just a note here that this config will have two (display, view) pairs): sRGB and disp1 + OCIO_CHECK_NO_THROW(config->addDisplayView("disp1", "view1", "raw", nullptr)); + OCIO_CHECK_ASSERT(config->displayHasView("disp1", "view1")); OCIO_REQUIRE_EQUAL(config->getNumDisplays(), 2); OCIO_CHECK_EQUAL(std::string(config->getDisplay(0)), std::string("sRGB")); OCIO_CHECK_EQUAL(std::string(config->getDisplay(1)), std::string("disp1")); @@ -7347,6 +7361,7 @@ OCIO_ADD_TEST(Config, add_remove_display) // Remove a (display, view) pair. OCIO_CHECK_NO_THROW(config->removeDisplayView("disp1", "view1")); + OCIO_CHECK_ASSERT(!config->displayHasView("disp1", "view1")); OCIO_REQUIRE_EQUAL(config->getNumDisplays(), 1); OCIO_CHECK_EQUAL(std::string(config->getDisplay(0)), std::string("sRGB")); } @@ -8489,15 +8504,28 @@ active_views: [] OCIO_CHECK_EQUAL(2, config->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "sRGB")); OCIO_CHECK_EQUAL(1, config->getNumViews(OCIO::VIEW_SHARED, "sRGB")); + OCIO_CHECK_EQUAL(std::string("sview1"), config->getView(OCIO::VIEW_SHARED, "sRGB", 0)); + OCIO_CHECK_ASSERT(config->displayHasView("sRGB", "sview1")); + OCIO_CHECK_ASSERT(config->viewIsShared("sRGB", "sview1")); + + OCIO_CHECK_EQUAL(std::string("raw"), config->getDisplayViewColorSpaceName("sRGB", "sview1")); + OCIO_CHECK_EQUAL(std::string("raw"), config->getVirtualDisplayViewColorSpaceName("sview2")); + // Step 3 - Validate the virtual display information. { OCIO::ConfigRcPtr cfg = config->createEditableCopy(); + OCIO_CHECK_ASSERT(OCIO::Config::viewsAreEqual(config, cfg, "sRGB", "sview1")); + OCIO_CHECK_ASSERT(OCIO::Config::viewsAreEqual(config, cfg, "sRGB", "Raw")); + OCIO_CHECK_ASSERT(OCIO::Config::viewsAreEqual(config, cfg, "sRGB", "view")); + OCIO_REQUIRE_EQUAL(2, cfg->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); const char * viewName = cfg->getVirtualDisplayView(OCIO::VIEW_DISPLAY_DEFINED, 0); + OCIO_CHECK_ASSERT(cfg->hasVirtualView(viewName)); + OCIO_CHECK_EQUAL(std::string("Raw"), viewName); OCIO_CHECK_EQUAL(std::string(""), cfg->getVirtualDisplayViewTransformName(viewName)); OCIO_CHECK_EQUAL(std::string("raw"), cfg->getVirtualDisplayViewColorSpaceName(viewName)); @@ -8505,22 +8533,36 @@ active_views: [] OCIO_CHECK_EQUAL(std::string(""), cfg->getVirtualDisplayViewRule(viewName)); OCIO_CHECK_EQUAL(std::string(""), cfg->getVirtualDisplayViewDescription(viewName)); + OCIO_CHECK_ASSERT(OCIO::Config::virtualViewsAreEqual(config, cfg, viewName)); + viewName = cfg->getVirtualDisplayView(OCIO::VIEW_DISPLAY_DEFINED, 1); - OCIO_CHECK_EQUAL(std::string("Film"), cfg->getVirtualDisplayView(OCIO::VIEW_DISPLAY_DEFINED, 1)); + OCIO_CHECK_ASSERT(cfg->hasVirtualView(viewName)); + + OCIO_CHECK_EQUAL(std::string("Film"), viewName); OCIO_CHECK_EQUAL(std::string("display_vt"), cfg->getVirtualDisplayViewTransformName(viewName)); OCIO_CHECK_EQUAL(std::string(""), cfg->getVirtualDisplayViewColorSpaceName(viewName)); OCIO_CHECK_EQUAL(std::string(""), cfg->getVirtualDisplayViewLooks(viewName)); OCIO_CHECK_EQUAL(std::string(""), cfg->getVirtualDisplayViewRule(viewName)); OCIO_CHECK_EQUAL(std::string(""), cfg->getVirtualDisplayViewDescription(viewName)); + OCIO_CHECK_ASSERT(OCIO::Config::virtualViewsAreEqual(config, cfg, viewName)); + OCIO_REQUIRE_EQUAL(1, cfg->getVirtualDisplayNumViews(OCIO::VIEW_SHARED)); OCIO_CHECK_EQUAL(std::string("sview2"), cfg->getVirtualDisplayView(OCIO::VIEW_SHARED, 0)); + OCIO_CHECK_EQUAL(std::string("raw"), cfg->getVirtualDisplayViewColorSpaceName("sview2")); + + OCIO_CHECK_ASSERT(cfg->hasVirtualView("sview2")); + OCIO_CHECK_ASSERT(cfg->virtualViewIsShared("sview2")); + OCIO_CHECK_ASSERT(OCIO::Config::virtualViewsAreEqual(config, cfg, "sview2")); // Remove a view from the Virtual Display. cfg->removeVirtualDisplayView("Raw"); + OCIO_CHECK_ASSERT(!OCIO::Config::virtualViewsAreEqual(config, cfg, "Raw")); + OCIO_CHECK_ASSERT(!cfg->hasVirtualView("Raw")); + OCIO_REQUIRE_EQUAL(1, cfg->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); OCIO_CHECK_EQUAL(std::string("Film"), cfg->getVirtualDisplayView(OCIO::VIEW_DISPLAY_DEFINED, 0)); @@ -8532,6 +8574,9 @@ active_views: [] cfg->removeVirtualDisplayView("sview2"); OCIO_REQUIRE_EQUAL(1, cfg->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); OCIO_REQUIRE_EQUAL(0, cfg->getVirtualDisplayNumViews(OCIO::VIEW_SHARED)); + OCIO_CHECK_ASSERT(!cfg->hasVirtualView("sview2")); + OCIO_CHECK_ASSERT(!cfg->virtualViewIsShared("sview2")); + OCIO_CHECK_ASSERT(!OCIO::Config::virtualViewsAreEqual(config, cfg, "sview2")); { // Extra serialize & deserialize validation. @@ -8552,12 +8597,14 @@ active_views: [] cfg->addVirtualDisplaySharedView("sview2"); OCIO_REQUIRE_EQUAL(1, cfg->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); OCIO_REQUIRE_EQUAL(1, cfg->getVirtualDisplayNumViews(OCIO::VIEW_SHARED)); + OCIO_CHECK_ASSERT(cfg->virtualViewIsShared("sview2")); // Remove the Virtual Display. cfg->clearVirtualDisplay(); OCIO_REQUIRE_EQUAL(0, cfg->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); OCIO_REQUIRE_EQUAL(0, cfg->getVirtualDisplayNumViews(OCIO::VIEW_SHARED)); + OCIO_CHECK_ASSERT(!cfg->virtualViewIsShared("sview2")); { // Extra serialize & deserialize validation. From 6b3e4b6191aa7254288673d984cfd3bc11da2cca Mon Sep 17 00:00:00 2001 From: annie Date: Thu, 17 Oct 2024 11:56:40 -0700 Subject: [PATCH 03/17] add view helper functions as python bindings Signed-off-by: annie --- src/bindings/python/PyConfig.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/bindings/python/PyConfig.cpp b/src/bindings/python/PyConfig.cpp index 9534ddc358..17aff0c0b9 100644 --- a/src/bindings/python/PyConfig.cpp +++ b/src/bindings/python/PyConfig.cpp @@ -404,6 +404,8 @@ void bindPyConfig(py::module & m) DOC(Config, addSharedView)) .def("removeSharedView", &Config::removeSharedView, "view"_a, DOC(Config, removeSharedView)) + .def("clearSharedViews", &Config::clearSharedViews, + DOC(Config, clearSharedViews)) .def("getSharedViews", [](ConfigRcPtr & self) { return SharedViewIterator(self); @@ -456,6 +458,9 @@ void bindPyConfig(py::module & m) .def("getDisplayViewDescription", &Config::getDisplayViewDescription, "display"_a, "view"_a, DOC(Config, getDisplayViewDescription)) + .def("displayHasView", &Config::displayHasView, + "display"_a, "view"_a, + DOC(Config, displayHasView)) .def("addDisplayView", (void (Config::*)(const char *, const char *, const char *, const char *)) &Config::addDisplayView, @@ -475,20 +480,35 @@ void bindPyConfig(py::module & m) "ruleName"_a = "", "description"_a = "", DOC(Config, addDisplayView)) + .def("viewIsShared", &Config::viewIsShared, "display"_a, "view"_a, + DOC(Config, viewIsShared)) .def("addDisplaySharedView", &Config::addDisplaySharedView, "display"_a, "view"_a, DOC(Config, addDisplaySharedView)) .def("removeDisplayView", &Config::removeDisplayView, "display"_a, "view"_a, DOC(Config, removeDisplayView)) .def("clearDisplays", &Config::clearDisplays, DOC(Config, clearDisplays)) + .def_static("viewsAreEqual", [](const ConstConfigRcPtr & first, + const ConstConfigRcPtr & second, + const char * dispName, + const char * viewName) + { + return Config::viewsAreEqual(first, second, dispName, viewName); + }, + "first"_a, "second"_a, "dispName"_a, "viewName"_a, + DOC(Config, viewsAreEqual)) // Virtual Display + .def("hasVirtualView", &Config::hasVirtualView, "view"_a, + DOC(Config, hasVirtualView)) .def("addVirtualDisplayView", &Config::addVirtualDisplayView, "view"_a, "viewTransformName"_a, "colorSpaceName"_a, "looks"_a = "", "ruleName"_a = "", "description"_a = "", DOC(Config, addVirtualDisplayView)) + .def("virtualViewIsShared", &Config::virtualViewIsShared, "view"_a, + DOC(Config, virtualViewIsShared)) .def("addVirtualDisplaySharedView", &Config::addVirtualDisplaySharedView, "sharedView"_a, DOC(Config, addVirtualDisplaySharedView)) .def("getVirtualDisplayViews", [](ConfigRcPtr & self, ViewType type) @@ -532,6 +552,14 @@ void bindPyConfig(py::module & m) return false; }, "display"_a) + .def_static("virtualViewsAreEqual", [](const ConstConfigRcPtr & first, + const ConstConfigRcPtr & second, + const char * viewName) + { + return Config::virtualViewsAreEqual(first, second, viewName); + }, + "first"_a, "second"_a, "viewName"_a, + DOC(Config, virtualViewsAreEqual)) // Active Displays and Views .def("setActiveDisplays", &Config::setActiveDisplays, "displays"_a, From 6959ebc86e9a3b24f364c7a5b139d75dd35f2e0c Mon Sep 17 00:00:00 2001 From: annie Date: Thu, 17 Oct 2024 13:12:49 -0700 Subject: [PATCH 04/17] add unit tests for view helper py bindings Signed-off-by: annie --- tests/python/ConfigTest.py | 39 ++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/tests/python/ConfigTest.py b/tests/python/ConfigTest.py index 5130ebbf88..1537cd0fc2 100644 --- a/tests/python/ConfigTest.py +++ b/tests/python/ConfigTest.py @@ -288,7 +288,7 @@ def test_copy(self): self.assertEqual(other.getFileRules().getNumEntries(), cfg.getFileRules().getNumEntries() - 1) def test_shared_views(self): - # Test these Config functions: addSharedView, getSharedViews, removeSharedView. + # Test these Config functions: addSharedView, getSharedViews, removeSharedView, clearSharedViews. cfg = OCIO.Config.CreateRaw() views = cfg.getSharedViews() @@ -413,11 +413,12 @@ def test_shared_views(self): cfg.removeSharedView('view3') views = cfg.getSharedViews() self.assertEqual(5, len(views)) - cfg.removeSharedView('view4') - cfg.removeSharedView('view5') - cfg.removeSharedView('view6') - cfg.removeSharedView('view1') - cfg.removeSharedView('view2') + cfg.clearSharedViews() + # cfg.removeSharedView('view4') + # cfg.removeSharedView('view5') + # cfg.removeSharedView('view6') + # cfg.removeSharedView('view1') + # cfg.removeSharedView('view2') views = cfg.getSharedViews() self.assertEqual(0, len(views)) @@ -842,12 +843,22 @@ def test_virtual_display(self): "sRGB"))) self.assertEqual(1, len(cfg.getViews(OCIO.VIEW_SHARED, "sRGB"))) + self.assertTrue(cfg.displayHasView("sRGB", "sview1")) + self.assertTrue(cfg.viewIsShared("sRGB", "sview1")) + + other = copy.deepcopy(cfg) + + self.assertTrue(OCIO.Config.viewsAreEqual(cfg, other, "sRGB", "sview1")) + self.assertTrue(OCIO.Config.viewsAreEqual(cfg, other, "sRGB", "Raw")) + self.assertTrue(OCIO.Config.viewsAreEqual(cfg, other, "sRGB", "view")) + # Validate the virtual display information self.assertEqual( 2, len(cfg.getVirtualDisplayViews(OCIO.VIEW_DISPLAY_DEFINED))) view_name = cfg.getVirtualDisplayViews(OCIO.VIEW_DISPLAY_DEFINED)[0] + self.assertTrue(cfg.hasVirtualView(view_name)) self.assertEqual("Raw", view_name) self.assertEqual("", cfg.getVirtualDisplayViewTransformName(view_name)) self.assertEqual("raw", @@ -856,7 +867,10 @@ def test_virtual_display(self): self.assertEqual("", cfg.getVirtualDisplayViewRule(view_name)) self.assertEqual("", cfg.getVirtualDisplayViewDescription(view_name)) + self.assertTrue(OCIO.Config.virtualViewsAreEqual(cfg, other, view_name)) + view_name = cfg.getVirtualDisplayViews(OCIO.VIEW_DISPLAY_DEFINED)[1] + self.assertTrue(cfg.hasVirtualView(view_name)) self.assertEqual("Film", view_name) self.assertEqual("display_vt", cfg.getVirtualDisplayViewTransformName(view_name)) @@ -866,13 +880,22 @@ def test_virtual_display(self): self.assertEqual("", cfg.getVirtualDisplayViewRule(view_name)) self.assertEqual("", cfg.getVirtualDisplayViewDescription(view_name)) + self.assertTrue(OCIO.Config.virtualViewsAreEqual(cfg, other, view_name)) + self.assertEqual(1, len(cfg.getVirtualDisplayViews(OCIO.VIEW_SHARED))) self.assertEqual("sview2", cfg.getVirtualDisplayViews(OCIO.VIEW_SHARED)[0]) + + self.assertTrue(cfg.hasVirtualView("sview2")) + self.assertTrue(cfg.virtualViewIsShared("sview2")) + self.assertTrue(OCIO.Config.virtualViewsAreEqual(cfg, other, "sview2")) # Remove a view from the virtual display cfg.removeVirtualDisplayView("Raw") + self.assertFalse(OCIO.Config.virtualViewsAreEqual(cfg, other, "Raw")) + self.assertFalse(cfg.hasVirtualView("Raw")) + self.assertEqual( 1, len(cfg.getVirtualDisplayViews(OCIO.VIEW_DISPLAY_DEFINED))) @@ -891,6 +914,10 @@ def test_virtual_display(self): len(cfg.getVirtualDisplayViews(OCIO.VIEW_DISPLAY_DEFINED))) self.assertEqual(0, len(cfg.getVirtualDisplayViews(OCIO.VIEW_SHARED))) + self.assertFalse(cfg.hasVirtualView("sview2")) + self.assertFalse(cfg.virtualViewIsShared("sview2")) + self.assertFalse(OCIO.Config.virtualViewsAreEqual(cfg, other, "sview2")) + cfg.addVirtualDisplaySharedView("sview2") self.assertEqual( 1, From a1f2168a5f1e04bc55bbc7aa2b70c36e2533666a Mon Sep 17 00:00:00 2001 From: annie Date: Fri, 18 Oct 2024 10:30:55 -0700 Subject: [PATCH 05/17] update with style changes and comments Signed-off-by: annie --- include/OpenColorIO/OpenColorIO.h | 40 +++++++++++++++++++++++++++++-- src/OpenColorIO/Config.cpp | 7 ++---- src/bindings/python/PyConfig.cpp | 12 +++++----- tests/cpu/Config_tests.cpp | 18 +++++++------- tests/python/ConfigTest.py | 21 +++++++--------- 5 files changed, 62 insertions(+), 36 deletions(-) diff --git a/include/OpenColorIO/OpenColorIO.h b/include/OpenColorIO/OpenColorIO.h index 66c62ec445..d719fbacad 100644 --- a/include/OpenColorIO/OpenColorIO.h +++ b/include/OpenColorIO/OpenColorIO.h @@ -853,6 +853,7 @@ class OCIOEXPORT Config * the matching display color space. */ + /// Check if a view within a given display is referencing one of the config's shared views. bool viewIsShared(const char * dispName, const char * viewName) const; /// Will throw if view or colorSpaceName are null or empty. @@ -862,6 +863,7 @@ class OCIOEXPORT Config /// Remove a shared view. Will throw if the view does not exist. void removeSharedView(const char * view); + /// Clear all shared views. This will throw if any displays are still using the shared views. void clearSharedViews(); const char * getDefaultDisplay() const; @@ -888,7 +890,15 @@ class OCIOEXPORT Config int getNumViews(const char * display, const char * colorspaceName) const; const char * getView(const char * display, const char * colorspaceName, int index) const; - static bool viewsAreEqual(const ConstConfigRcPtr & first, + /** + * \brief Compare views in a pair of configs. + * + * Will return false if either of the views does not exist. This will return true even + * if the view is display-defined in one config and a reference to a shared view in the + * other config (both within the same display), as long as the contents match. The + * description text (if any) is ignored, since it is not a functional difference. + */ + static bool ViewsAreEqual(const ConstConfigRcPtr & first, const ConstConfigRcPtr & second, const char * dispName, const char * viewName); @@ -910,6 +920,15 @@ class OCIOEXPORT Config /// Returns the description attribute of a (display, view) pair. const char * getDisplayViewDescription(const char * display, const char * view) const noexcept; + /** + * \brief Determine if a display and view exist. + * + * This returns false if either the display or view doesn't exist. It works regardless + * of whether the display or view are active, and it works regardless of whether the + * view is display-defined or if the display has this as a shared view. It will only + * check config-level shared views if dispName is null. It will not check config level + * shared views if dispName is not null. + */ bool displayHasView(const char * dispName, const char * viewName) const; /** @@ -975,7 +994,16 @@ class OCIOEXPORT Config * */ + /** + * \brief Determine if a virtual view exists. + * + * This returns false if the virtual view doesn't exist. It works regardless of + * whether the virtual view is active, and it works regardless of whether the virtual + * view is display-defined or if the display has this as a shared virtual view. + */ bool hasVirtualView(const char * viewName) const; + + /// Check if a given virtual view is referencing one of the config's shared views. bool virtualViewIsShared(const char * viewName) const; void addVirtualDisplayView(const char * view, @@ -992,7 +1020,15 @@ class OCIOEXPORT Config /// Get the view name at a specific index. const char * getVirtualDisplayView(ViewType type, int index) const noexcept; - static bool virtualViewsAreEqual(const ConstConfigRcPtr & first, + /** + * \brief Compare virtual views in a pair of configs. + * + * Will return false if either of the virtual views does not exist. This will return true + * even if the virtual view is display-defined in one config and a reference to a shared + * virtual view in the other config (both within the same display), as long as the contents + * match. The description text (if any) is ignored, since it is not a functional difference. + */ + static bool VirtualViewsAreEqual(const ConstConfigRcPtr & first, const ConstConfigRcPtr & second, const char * viewName); diff --git a/src/OpenColorIO/Config.cpp b/src/OpenColorIO/Config.cpp index 2681c7b218..6050b382ad 100644 --- a/src/OpenColorIO/Config.cpp +++ b/src/OpenColorIO/Config.cpp @@ -3307,8 +3307,6 @@ void Config::setViewingRules(ConstViewingRulesRcPtr viewingRules) bool Config::viewIsShared(const char * dispName, const char * viewName) const { - // Check if a view within a given display is a display-defined view or is referencing - // one of the config's shared views. for (int v = 0; v < getNumViews(VIEW_SHARED, dispName); v++) { @@ -3518,7 +3516,7 @@ const char * Config::getView(const char * display, const char * colorspace, int } -bool Config::viewsAreEqual(const ConstConfigRcPtr & first, +bool Config::ViewsAreEqual(const ConstConfigRcPtr & first, const ConstConfigRcPtr & second, const char * dispName, // may be empty or nullptr for shared views const char * viewName) @@ -3899,7 +3897,7 @@ const char * Config::getVirtualDisplayView(ViewType type, int index) const noexc return ""; } -bool Config::virtualViewsAreEqual(const ConstConfigRcPtr & first, +bool Config::VirtualViewsAreEqual(const ConstConfigRcPtr & first, const ConstConfigRcPtr & second, const char * viewName) { @@ -3944,7 +3942,6 @@ const char * Config::getVirtualDisplayViewColorSpaceName(const char * view) cons { if (!view) return ""; - // TODO: Remove the following work-around once bug for shared views is fixed. // Get the colorspace name for the case where a virtual view is shared. if (virtualViewIsShared(view)) { diff --git a/src/bindings/python/PyConfig.cpp b/src/bindings/python/PyConfig.cpp index 17aff0c0b9..1d24cd9dc7 100644 --- a/src/bindings/python/PyConfig.cpp +++ b/src/bindings/python/PyConfig.cpp @@ -488,15 +488,15 @@ void bindPyConfig(py::module & m) DOC(Config, removeDisplayView)) .def("clearDisplays", &Config::clearDisplays, DOC(Config, clearDisplays)) - .def_static("viewsAreEqual", [](const ConstConfigRcPtr & first, + .def_static("ViewsAreEqual", [](const ConstConfigRcPtr & first, const ConstConfigRcPtr & second, const char * dispName, const char * viewName) { - return Config::viewsAreEqual(first, second, dispName, viewName); + return Config::ViewsAreEqual(first, second, dispName, viewName); }, "first"_a, "second"_a, "dispName"_a, "viewName"_a, - DOC(Config, viewsAreEqual)) + DOC(Config, ViewsAreEqual)) // Virtual Display .def("hasVirtualView", &Config::hasVirtualView, "view"_a, @@ -552,14 +552,14 @@ void bindPyConfig(py::module & m) return false; }, "display"_a) - .def_static("virtualViewsAreEqual", [](const ConstConfigRcPtr & first, + .def_static("VirtualViewsAreEqual", [](const ConstConfigRcPtr & first, const ConstConfigRcPtr & second, const char * viewName) { - return Config::virtualViewsAreEqual(first, second, viewName); + return Config::VirtualViewsAreEqual(first, second, viewName); }, "first"_a, "second"_a, "viewName"_a, - DOC(Config, virtualViewsAreEqual)) + DOC(Config, VirtualViewsAreEqual)) // Active Displays and Views .def("setActiveDisplays", &Config::setActiveDisplays, "displays"_a, diff --git a/tests/cpu/Config_tests.cpp b/tests/cpu/Config_tests.cpp index 8e261e5b50..9f9f0aa9db 100644 --- a/tests/cpu/Config_tests.cpp +++ b/tests/cpu/Config_tests.cpp @@ -7349,8 +7349,6 @@ OCIO_ADD_TEST(Config, add_remove_display) // Add a (display, view) pair. - // todo (annie): just a note here that this config will have two (display, view) pairs): sRGB and disp1 - OCIO_CHECK_NO_THROW(config->addDisplayView("disp1", "view1", "raw", nullptr)); OCIO_CHECK_ASSERT(config->displayHasView("disp1", "view1")); OCIO_REQUIRE_EQUAL(config->getNumDisplays(), 2); @@ -8516,9 +8514,9 @@ active_views: [] { OCIO::ConfigRcPtr cfg = config->createEditableCopy(); - OCIO_CHECK_ASSERT(OCIO::Config::viewsAreEqual(config, cfg, "sRGB", "sview1")); - OCIO_CHECK_ASSERT(OCIO::Config::viewsAreEqual(config, cfg, "sRGB", "Raw")); - OCIO_CHECK_ASSERT(OCIO::Config::viewsAreEqual(config, cfg, "sRGB", "view")); + OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config, cfg, "sRGB", "sview1")); + OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config, cfg, "sRGB", "Raw")); + OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config, cfg, "sRGB", "view")); OCIO_REQUIRE_EQUAL(2, cfg->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); @@ -8533,7 +8531,7 @@ active_views: [] OCIO_CHECK_EQUAL(std::string(""), cfg->getVirtualDisplayViewRule(viewName)); OCIO_CHECK_EQUAL(std::string(""), cfg->getVirtualDisplayViewDescription(viewName)); - OCIO_CHECK_ASSERT(OCIO::Config::virtualViewsAreEqual(config, cfg, viewName)); + OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config, cfg, viewName)); viewName = cfg->getVirtualDisplayView(OCIO::VIEW_DISPLAY_DEFINED, 1); @@ -8546,7 +8544,7 @@ active_views: [] OCIO_CHECK_EQUAL(std::string(""), cfg->getVirtualDisplayViewRule(viewName)); OCIO_CHECK_EQUAL(std::string(""), cfg->getVirtualDisplayViewDescription(viewName)); - OCIO_CHECK_ASSERT(OCIO::Config::virtualViewsAreEqual(config, cfg, viewName)); + OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config, cfg, viewName)); OCIO_REQUIRE_EQUAL(1, cfg->getVirtualDisplayNumViews(OCIO::VIEW_SHARED)); OCIO_CHECK_EQUAL(std::string("sview2"), cfg->getVirtualDisplayView(OCIO::VIEW_SHARED, 0)); @@ -8554,13 +8552,13 @@ active_views: [] OCIO_CHECK_ASSERT(cfg->hasVirtualView("sview2")); OCIO_CHECK_ASSERT(cfg->virtualViewIsShared("sview2")); - OCIO_CHECK_ASSERT(OCIO::Config::virtualViewsAreEqual(config, cfg, "sview2")); + OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config, cfg, "sview2")); // Remove a view from the Virtual Display. cfg->removeVirtualDisplayView("Raw"); - OCIO_CHECK_ASSERT(!OCIO::Config::virtualViewsAreEqual(config, cfg, "Raw")); + OCIO_CHECK_ASSERT(!OCIO::Config::VirtualViewsAreEqual(config, cfg, "Raw")); OCIO_CHECK_ASSERT(!cfg->hasVirtualView("Raw")); OCIO_REQUIRE_EQUAL(1, cfg->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); @@ -8576,7 +8574,7 @@ active_views: [] OCIO_REQUIRE_EQUAL(0, cfg->getVirtualDisplayNumViews(OCIO::VIEW_SHARED)); OCIO_CHECK_ASSERT(!cfg->hasVirtualView("sview2")); OCIO_CHECK_ASSERT(!cfg->virtualViewIsShared("sview2")); - OCIO_CHECK_ASSERT(!OCIO::Config::virtualViewsAreEqual(config, cfg, "sview2")); + OCIO_CHECK_ASSERT(!OCIO::Config::VirtualViewsAreEqual(config, cfg, "sview2")); { // Extra serialize & deserialize validation. diff --git a/tests/python/ConfigTest.py b/tests/python/ConfigTest.py index 1537cd0fc2..a50c5d544a 100644 --- a/tests/python/ConfigTest.py +++ b/tests/python/ConfigTest.py @@ -414,11 +414,6 @@ def test_shared_views(self): views = cfg.getSharedViews() self.assertEqual(5, len(views)) cfg.clearSharedViews() - # cfg.removeSharedView('view4') - # cfg.removeSharedView('view5') - # cfg.removeSharedView('view6') - # cfg.removeSharedView('view1') - # cfg.removeSharedView('view2') views = cfg.getSharedViews() self.assertEqual(0, len(views)) @@ -848,9 +843,9 @@ def test_virtual_display(self): other = copy.deepcopy(cfg) - self.assertTrue(OCIO.Config.viewsAreEqual(cfg, other, "sRGB", "sview1")) - self.assertTrue(OCIO.Config.viewsAreEqual(cfg, other, "sRGB", "Raw")) - self.assertTrue(OCIO.Config.viewsAreEqual(cfg, other, "sRGB", "view")) + self.assertTrue(OCIO.Config.ViewsAreEqual(cfg, other, "sRGB", "sview1")) + self.assertTrue(OCIO.Config.ViewsAreEqual(cfg, other, "sRGB", "Raw")) + self.assertTrue(OCIO.Config.ViewsAreEqual(cfg, other, "sRGB", "view")) # Validate the virtual display information self.assertEqual( @@ -867,7 +862,7 @@ def test_virtual_display(self): self.assertEqual("", cfg.getVirtualDisplayViewRule(view_name)) self.assertEqual("", cfg.getVirtualDisplayViewDescription(view_name)) - self.assertTrue(OCIO.Config.virtualViewsAreEqual(cfg, other, view_name)) + self.assertTrue(OCIO.Config.VirtualViewsAreEqual(cfg, other, view_name)) view_name = cfg.getVirtualDisplayViews(OCIO.VIEW_DISPLAY_DEFINED)[1] self.assertTrue(cfg.hasVirtualView(view_name)) @@ -880,7 +875,7 @@ def test_virtual_display(self): self.assertEqual("", cfg.getVirtualDisplayViewRule(view_name)) self.assertEqual("", cfg.getVirtualDisplayViewDescription(view_name)) - self.assertTrue(OCIO.Config.virtualViewsAreEqual(cfg, other, view_name)) + self.assertTrue(OCIO.Config.VirtualViewsAreEqual(cfg, other, view_name)) self.assertEqual(1, len(cfg.getVirtualDisplayViews(OCIO.VIEW_SHARED))) self.assertEqual("sview2", @@ -888,12 +883,12 @@ def test_virtual_display(self): self.assertTrue(cfg.hasVirtualView("sview2")) self.assertTrue(cfg.virtualViewIsShared("sview2")) - self.assertTrue(OCIO.Config.virtualViewsAreEqual(cfg, other, "sview2")) + self.assertTrue(OCIO.Config.VirtualViewsAreEqual(cfg, other, "sview2")) # Remove a view from the virtual display cfg.removeVirtualDisplayView("Raw") - self.assertFalse(OCIO.Config.virtualViewsAreEqual(cfg, other, "Raw")) + self.assertFalse(OCIO.Config.VirtualViewsAreEqual(cfg, other, "Raw")) self.assertFalse(cfg.hasVirtualView("Raw")) self.assertEqual( @@ -916,7 +911,7 @@ def test_virtual_display(self): self.assertFalse(cfg.hasVirtualView("sview2")) self.assertFalse(cfg.virtualViewIsShared("sview2")) - self.assertFalse(OCIO.Config.virtualViewsAreEqual(cfg, other, "sview2")) + self.assertFalse(OCIO.Config.VirtualViewsAreEqual(cfg, other, "sview2")) cfg.addVirtualDisplaySharedView("sview2") self.assertEqual( From d76c9cb84ffa494871df262cc51f50f04447b0dd Mon Sep 17 00:00:00 2001 From: annie Date: Fri, 31 Jan 2025 23:30:32 -0500 Subject: [PATCH 06/17] comprehensive unit tests for ViewsAreEqual and displayHasView Signed-off-by: annie --- tests/cpu/Config_tests.cpp | 345 +++++++++++++++++++++++++++++++++++++ 1 file changed, 345 insertions(+) diff --git a/tests/cpu/Config_tests.cpp b/tests/cpu/Config_tests.cpp index 9f9f0aa9db..3b706e18e4 100644 --- a/tests/cpu/Config_tests.cpp +++ b/tests/cpu/Config_tests.cpp @@ -3749,6 +3749,342 @@ OCIO_ADD_TEST(Config, display_view_order) OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_B", 1)), "View_1"); } +OCIO_ADD_TEST(Config, compare_displays) { + static constexpr char CONFIG1[]{ R"(ocio_profile_version: 2 + +roles: + default: raw + +file_rules: + - ! {name: Default, colorspace: default} + +shared_views: + - ! {name: sview1, colorspace: raw} + +displays: + Raw: + - ! {name: Raw, colorspace: raw} + sRGB: + - ! {name: Raw, colorspace: raw} + - ! {name: view, view_transform: display_vt, display_colorspace: display_cs} + - ! [sview1] + +active_displays: [sRGB] +active_views: [view] + +view_transforms: + - ! + name: default_vt + to_scene_reference: ! {sat: 1.5} + + - ! + name: display_vt + to_display_reference: ! {sat: 1.5} + +display_colorspaces: + - ! + name: display_cs + to_display_reference: ! {sat: 1.5} + +colorspaces: + - ! + name: raw +)" }; + + static constexpr char CONFIG2[]{ R"(ocio_profile_version: 2 + +roles: + default: raw + +file_rules: + - ! {name: Default, colorspace: default} + +shared_views: + - ! {name: view, view_transform: display_vt, display_colorspace: display_cs} + - ! {name: sview1, colorspace: raw} + +displays: + Raw: + - ! {name: Raw, colorspace: raw} + sRGB: + - ! {name: Raw, colorspace: raw} + - ! [view, sview1] + +active_displays: [Raw] +active_views: [Raw] + +view_transforms: + - ! + name: default_vt + to_scene_reference: ! {sat: 1.5} + + - ! + name: display_vt + to_display_reference: ! {sat: 1.5} + +display_colorspaces: + - ! + name: display_cs + to_display_reference: ! {sat: 1.5} + +colorspaces: + - ! + name: raw +)" }; + + std::istringstream is; + is.str(CONFIG1); + OCIO::ConstConfigRcPtr config1, config2; + OCIO_CHECK_NO_THROW(config1 = OCIO::Config::CreateFromStream(is)); + is.clear(); + is.str(CONFIG2); + OCIO_CHECK_NO_THROW(config2 = OCIO::Config::CreateFromStream(is)); + OCIO_CHECK_NO_THROW(config1->validate()); + OCIO_CHECK_NO_THROW(config2->validate()); + + // Validate that two views belonging to the same display within a pair of configs are equal + // regardless of if a view is display-defined in one config and shared in the other. + // TODO: Shorten this by getting rid of unecessary checks. + + { + // Config 1 + // Only the 'sRGB' display is active. + OCIO_REQUIRE_EQUAL(1, config1->getNumDisplays()); + OCIO_REQUIRE_EQUAL(std::string("sRGB"), config1->getDefaultDisplay()); + OCIO_REQUIRE_EQUAL(std::string("sRGB"), config1->getDisplay(0)); + OCIO_CHECK_EQUAL(std::string("sRGB"), config1->getActiveDisplays()); + + // There are two display-defined views: 'Raw' and 'view'. + OCIO_CHECK_EQUAL(2, config1->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "sRGB")); + OCIO_CHECK_EQUAL(std::string("Raw"), config1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 0)); + OCIO_CHECK_EQUAL(std::string("view"), config1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 1)); + + // Only the 'view' view is active. + OCIO_CHECK_EQUAL(1, config1->getNumViews("sRGB")); + OCIO_CHECK_EQUAL(std::string("view"), config1->getActiveViews()); + + // Check for the (display, view) pair. + OCIO_CHECK_ASSERT(config1->displayHasView("sRGB", "view")); + + // Config 2 + // Only the 'Raw' display is active + OCIO_CHECK_EQUAL(std::string("Raw"), config2->getActiveDisplays()); + // Only the 'Raw' view is active + OCIO_CHECK_EQUAL(std::string("Raw"), config2->getActiveViews()); + + // There are two shared views: view and sview1 + OCIO_CHECK_EQUAL(2, config2->getNumViews(OCIO::VIEW_SHARED, "sRGB")); + OCIO_CHECK_EQUAL(std::string("view"), config2->getView(OCIO::VIEW_SHARED, "sRGB", 0)); + OCIO_CHECK_EQUAL(std::string("sview1"), config2->getView(OCIO::VIEW_SHARED, "sRGB", 1)); + OCIO_REQUIRE_EQUAL(config2->getNumDisplaysAll(), 2); + + // Check for the (display, view) pair. + OCIO_CHECK_EQUAL(config2->getDisplayAll(1), std::string("sRGB")); + OCIO_CHECK_ASSERT(config2->displayHasView("sRGB", "view")); + OCIO_CHECK_ASSERT(config2->viewIsShared("sRGB", "view")); + + // Verify the views are equal. + OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config1, config2, "sRGB", "view")); + + } + + // TODO: Verify Config::ViewsAreEqual returns true if view is display-defined in both configs (Raw, Raw) for both + { + // Inactive in config 1 but active in config 2 + // 1. Confirm that 'Raw' is a display in config 1 (even if inactive) + + // Config 1 + // 'Raw' is an inactive display + OCIO_CHECK_EQUAL(config1->getDisplayAll(0), std::string("Raw")); + // 2. Confirm 'Raw' is display-defined view in config 1 + OCIO_CHECK_EQUAL(1, config1->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "Raw")); + OCIO_CHECK_EQUAL(std::string("Raw"), config1->getView(OCIO::VIEW_DISPLAY_DEFINED, "Raw", 0)); + + // 3. Check or the (display, view) pair with displayHasView + OCIO_CHECK_ASSERT(config1->displayHasView("Raw", "Raw")); + + // 4. Confirm 'Raw' display is active, 'Raw' view is active and display-defined + + // Config 2 + OCIO_CHECK_EQUAL(1, config2->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "Raw")); + OCIO_CHECK_EQUAL(std::string("Raw"), config2->getView(OCIO::VIEW_DISPLAY_DEFINED, "Raw", 0)); + OCIO_CHECK_ASSERT(config2->displayHasView("Raw", "Raw")); + + // Check for the (display, view) pair + // Verify the views are equal. + OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config1, config2, "Raw", "Raw")); + } + + // TODO: Verify Config::ViewsAreEqual returns true if view is shared in both configs (add a shared view for both?) -- TBD. + { + // Config 1 + // 'sRGB' has one shared view: 'sview1' + OCIO_CHECK_EQUAL(1, config1->getNumViews(OCIO::VIEW_SHARED, "sRGB")); + OCIO_CHECK_EQUAL(std::string("sview1"), config1->getView(OCIO::VIEW_SHARED, "sRGB", 0)); + OCIO_CHECK_ASSERT(config1->displayHasView("sRGB", "sview1")); + + // Config 2 + // 'sRGB' has 'sview1' as shared view (Already checked this) + // displayHasView + OCIO_CHECK_ASSERT(config2->displayHasView("sRGB", "sview1")); + + + // Verify views are equal. + OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config1, config2, "sRGB", "sview1")); + } + + // Verify that Config::displayHasView works regardless of whether the display or view are active + // and regardless of whether the view is display-defined or if the display has this as a shared view. + + { + OCIO::ConfigRcPtr cfg1 = config1->createEditableCopy(); + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "Raw" )); // Active display has inactive view (display-defined). + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "view")); // Active display has active view (display-defined). + OCIO_CHECK_ASSERT(cfg1->displayHasView("Raw" , "Raw" )); // Inactive display has inactive view (display-defined). + // OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "sview1")); // Active display has inactive view (shared). + + OCIO::ConfigRcPtr cfg2 = config2->createEditableCopy(); + OCIO_CHECK_ASSERT(cfg2->displayHasView("sRGB", "Raw" )); // Inactive display has active view (display-defined). + OCIO_CHECK_ASSERT(cfg2->displayHasView("sRGB", "view")); // Inactive display has inactive view (shared). + + OCIO_CHECK_NO_THROW(cfg2->setActiveDisplays("Raw, sRGB")); + OCIO_CHECK_EQUAL(std::string("Raw, sRGB"), cfg2->getActiveDisplays()); + OCIO_CHECK_ASSERT(cfg2->displayHasView("sRGB", "view")); // Active display has inactive view (shared). + + OCIO_CHECK_NO_THROW(cfg2->setActiveViews("Raw, view")); + OCIO_CHECK_EQUAL(std::string("Raw, view"), cfg2->getActiveViews()); + OCIO_CHECK_ASSERT(cfg2->displayHasView("sRGB", "view")); // Active display has active view (shared). + + OCIO_CHECK_NO_THROW(cfg2->setActiveDisplays("Raw")); + OCIO_CHECK_EQUAL(std::string("Raw"), cfg2->getActiveDisplays()); + OCIO_CHECK_ASSERT(cfg2->displayHasView("sRGB", "view")); // Inactive display has active view (shared). TOUPDATE! + + } + + // TODO: Verify Config::ViewsAreEqual and displayHasView returns false if display exists, view doesn't. + { + /** + * Case: inactive display, nonexistent view. [Config 1 - sRGB, Raw] + * 1. Verify 'sRGB' is a display. + * 2. Verify that Raw is a view of sRGB + * 3. Delete Raw + * 4. Verify sRGB exists + * 5. Verify the views of sRGB + * 7. Verify no active views. Also: view doesnt exist (if additional check). getNumViews should go down to 2. + * 8. Verify that displayHasView is false. + * 9. Verify that viewsareequal is false. + */ + OCIO::ConfigRcPtr cfg1 = config1->createEditableCopy(); + OCIO_CHECK_EQUAL(std::string("sRGB"), cfg1->getActiveDisplays()); + + // There are two display-defined views: 'Raw' and 'view'. + OCIO_CHECK_EQUAL(2, cfg1->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "sRGB")); + OCIO_CHECK_EQUAL(std::string("Raw"), cfg1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 0)); + OCIO_CHECK_EQUAL(std::string("view"), cfg1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 1)); + + // Delete 'Raw'. + OCIO_CHECK_NO_THROW(cfg1->removeDisplayView("sRGB", "Raw")); + + OCIO_CHECK_EQUAL(1, cfg1->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "sRGB")); + OCIO_CHECK_EQUAL(std::string("view"), cfg1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 0)); + + // Verify displayHasView returns false + OCIO_CHECK_ASSERT(!cfg1->displayHasView("sRGB", "Raw")); + OCIO_CHECK_EQUAL(false, cfg1->displayHasView("sRGB", "Raw")); + + // Verify ViewsAreEqual returns false + OCIO_CHECK_ASSERT(!OCIO::Config::ViewsAreEqual(config1, cfg1, "sRGB", "Raw")); + OCIO_CHECK_EQUAL(false, OCIO::Config::ViewsAreEqual(cfg1, cfg1, "sRGB", "Raw")); + + } + + // done: Verify Config::ViewsAreEqual and displayHasView returns false if view exists, display doesn't + { + /** + * Case: nonexistent display, active view. [Config 2 - Raw, Raw] + * 1. Verify 'Raw' is an active display. Should be the only active display. + * 1b. Get number of displays. + * 2. Verify 'Raw' has one view. + * 3. 'Raw' has one view, 'Raw'. + * 4. Verify 'Raw' is an active view. + * + * 5. Delete the display 'Raw'. + * 6. Verify active display is empty. + * 7. Verify that 'Raw' has no views. [because it doesnt exist] + * 8. Get number of displays (should have gone down by one) + * 9. Check that 'Raw' is still an active view. + * displayHasView, viewsareequal is false. + */ + + OCIO::ConfigRcPtr cfg2 = config2->createEditableCopy(); + + // Get total number of displays. + OCIO_REQUIRE_EQUAL(2, cfg2->getNumDisplaysAll()); + + // 1. Verify 'Raw' is an active display. Should be the only active display. + OCIO_CHECK_EQUAL(std::string("Raw"), cfg2->getActiveDisplays()); + + // Verify 'Raw' has one view, 'Raw'. + OCIO_REQUIRE_EQUAL(1, cfg2->getNumViews("Raw")); + OCIO_REQUIRE_EQUAL(std::string("Raw"), cfg2->getView("Raw", 0)); + + // 'Raw' view is active. + OCIO_CHECK_EQUAL(std::string("Raw"), cfg2->getActiveViews()); + + // Delete the display 'Raw'. + OCIO_CHECK_NO_THROW(cfg2->removeDisplayView("Raw", "Raw")); + OCIO_CHECK_ASSERT(!cfg2->displayHasView("Raw", "Raw")); + + // Get number of displays (should have gone down by one) + OCIO_REQUIRE_EQUAL(1, cfg2->getNumDisplaysAll()); + + // 'Raw' is still an active view + OCIO_REQUIRE_EQUAL(std::string("Raw"), cfg2->getActiveViews()); // plz work + + // Verify displayHasView returns false + OCIO_CHECK_ASSERT(!cfg2->displayHasView("Raw", "Raw")); + OCIO_CHECK_ASSERT(!OCIO::Config::ViewsAreEqual(config2, cfg2, "Raw", "Raw")); + + } + + // TODO: displayHasView will only check config level shared views if dispName is null. + // TODO: displayHasView will not check config level shared views if dispName is not null. - idk what this means + { + /** + * With config 1: + * 1. show srgb has one shared views + * 2. do display has view for srgb and for nullptr. both should be true + * 3. remove display view + * 4. show that shared view remains in config + * 5. do display has view for srgb and for nullptr. should be false, then true. + */ + OCIO::ConfigRcPtr cfg1 = config1->createEditableCopy(); + // 'sRGB' has one shared view: 'sview1' + OCIO_CHECK_EQUAL(1, cfg1->getNumViews(OCIO::VIEW_SHARED, "sRGB")); + OCIO_CHECK_EQUAL(std::string("sview1"), cfg1->getView(OCIO::VIEW_SHARED, "sRGB", 0)); + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "sview1")); + OCIO_CHECK_ASSERT(cfg1->displayHasView(nullptr, "sview1")); + + OCIO_CHECK_NO_THROW(cfg1->removeDisplayView("sRGB", "sview1")); + + // 'sRGB' is still a display + OCIO_REQUIRE_EQUAL(std::string("sRGB"), config1->getDefaultDisplay()); + + // 'sRGB' has no shared views + OCIO_CHECK_EQUAL(0, cfg1->getNumViews(OCIO::VIEW_SHARED, "sRGB")); + + // Show that sview1 still exists in the config + OCIO_CHECK_EQUAL(1, cfg1->getNumViews(OCIO::VIEW_SHARED, nullptr)); + OCIO_CHECK_EQUAL(std::string("sview1"), cfg1->getView(OCIO::VIEW_SHARED, nullptr, 0)); + + OCIO_CHECK_ASSERT(!cfg1->displayHasView("sRGB", "sview1")); + OCIO_CHECK_ASSERT(cfg1->displayHasView(nullptr, "sview1")); + + } + + +} + OCIO_ADD_TEST(Config, log_serialization) { { @@ -8978,6 +9314,15 @@ OCIO_ADD_TEST(Config, virtual_display_exceptions) " which is not defined."); } +OCIO_ADD_TEST(Config, compare_virtual_displays) { + /** + * TODO: Test hasVirtualView and VirtualViewsAreEqual + * Define a config file with a set of virtual views. Validate with hasVirtualView. + * Define a second file with a set of virtual views. Validate with hasVirtualView. + * Compare the two configs using Virtualviewsareequal testing all possible aspects. + */ +} + OCIO_ADD_TEST(Config, description_and_name) { auto cfg = OCIO::Config::CreateRaw()->createEditableCopy(); From d338c9474064f06d79b7305908d345b0acb37b51 Mon Sep 17 00:00:00 2001 From: annie Date: Sat, 1 Feb 2025 01:52:48 -0500 Subject: [PATCH 07/17] improved in-line comments for unit tests Signed-off-by: annie --- tests/cpu/Config_tests.cpp | 229 +++++++++++++------------------------ 1 file changed, 79 insertions(+), 150 deletions(-) diff --git a/tests/cpu/Config_tests.cpp b/tests/cpu/Config_tests.cpp index 3b706e18e4..0f6a7b4571 100644 --- a/tests/cpu/Config_tests.cpp +++ b/tests/cpu/Config_tests.cpp @@ -3770,7 +3770,7 @@ OCIO_ADD_TEST(Config, compare_displays) { - ! [sview1] active_displays: [sRGB] -active_views: [view] +active_views: [view, sview1] view_transforms: - ! @@ -3842,247 +3842,176 @@ active_views: [Raw] OCIO_CHECK_NO_THROW(config1->validate()); OCIO_CHECK_NO_THROW(config2->validate()); - // Validate that two views belonging to the same display within a pair of configs are equal - // regardless of if a view is display-defined in one config and shared in the other. - // TODO: Shorten this by getting rid of unecessary checks. - { - // Config 1 - // Only the 'sRGB' display is active. + // Test that Config::ViewsAreEqual works for a matching (display, view) pair across separate configs. + // Works regardless of if the view is display-defined in one config and shared in the other. + // Works regardless of if the (display, view) pair is active in one config and inactive in another. + + // Active (display, view) pair where the view is display-defined. OCIO_REQUIRE_EQUAL(1, config1->getNumDisplays()); OCIO_REQUIRE_EQUAL(std::string("sRGB"), config1->getDefaultDisplay()); - OCIO_REQUIRE_EQUAL(std::string("sRGB"), config1->getDisplay(0)); - OCIO_CHECK_EQUAL(std::string("sRGB"), config1->getActiveDisplays()); - // There are two display-defined views: 'Raw' and 'view'. OCIO_CHECK_EQUAL(2, config1->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "sRGB")); OCIO_CHECK_EQUAL(std::string("Raw"), config1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 0)); OCIO_CHECK_EQUAL(std::string("view"), config1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 1)); - // Only the 'view' view is active. - OCIO_CHECK_EQUAL(1, config1->getNumViews("sRGB")); - OCIO_CHECK_EQUAL(std::string("view"), config1->getActiveViews()); + OCIO_CHECK_EQUAL(2, config1->getNumViews("sRGB")); + OCIO_CHECK_EQUAL(std::string("view"), config1->getView("sRGB", 0)); - // Check for the (display, view) pair. - OCIO_CHECK_ASSERT(config1->displayHasView("sRGB", "view")); + // Inactive (display, view) pair where the view is a reference to a shared view. + OCIO_REQUIRE_EQUAL(1, config2->getNumDisplays()); + OCIO_CHECK_EQUAL(std::string("Raw"), config2->getDefaultDisplay()); + OCIO_CHECK_EQUAL(1, config2->getNumViews("Raw")); + OCIO_CHECK_EQUAL(std::string("Raw"), config2->getDefaultView("Raw")); - // Config 2 - // Only the 'Raw' display is active - OCIO_CHECK_EQUAL(std::string("Raw"), config2->getActiveDisplays()); - // Only the 'Raw' view is active - OCIO_CHECK_EQUAL(std::string("Raw"), config2->getActiveViews()); + OCIO_REQUIRE_EQUAL(config2->getNumDisplaysAll(), 2); + OCIO_CHECK_EQUAL(config2->getDisplayAll(1), std::string("sRGB")); - // There are two shared views: view and sview1 OCIO_CHECK_EQUAL(2, config2->getNumViews(OCIO::VIEW_SHARED, "sRGB")); OCIO_CHECK_EQUAL(std::string("view"), config2->getView(OCIO::VIEW_SHARED, "sRGB", 0)); OCIO_CHECK_EQUAL(std::string("sview1"), config2->getView(OCIO::VIEW_SHARED, "sRGB", 1)); - OCIO_REQUIRE_EQUAL(config2->getNumDisplaysAll(), 2); - // Check for the (display, view) pair. - OCIO_CHECK_EQUAL(config2->getDisplayAll(1), std::string("sRGB")); - OCIO_CHECK_ASSERT(config2->displayHasView("sRGB", "view")); - OCIO_CHECK_ASSERT(config2->viewIsShared("sRGB", "view")); - - // Verify the views are equal. OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config1, config2, "sRGB", "view")); } - // TODO: Verify Config::ViewsAreEqual returns true if view is display-defined in both configs (Raw, Raw) for both { - // Inactive in config 1 but active in config 2 - // 1. Confirm that 'Raw' is a display in config 1 (even if inactive) - - // Config 1 - // 'Raw' is an inactive display + // Test that Config::ViewsAreEqual works for a matching (display, view) pair across separate configs, + // even if the pair is active in one config and inactive in another. Both views are display-defined. + + // Inactive (display, view) pair where the view is display-defined. + OCIO_REQUIRE_EQUAL(1, config1->getNumDisplays()); + OCIO_CHECK_EQUAL(std::string("sRGB"), config1->getDefaultDisplay()); OCIO_CHECK_EQUAL(config1->getDisplayAll(0), std::string("Raw")); - // 2. Confirm 'Raw' is display-defined view in config 1 OCIO_CHECK_EQUAL(1, config1->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "Raw")); OCIO_CHECK_EQUAL(std::string("Raw"), config1->getView(OCIO::VIEW_DISPLAY_DEFINED, "Raw", 0)); - // 3. Check or the (display, view) pair with displayHasView - OCIO_CHECK_ASSERT(config1->displayHasView("Raw", "Raw")); - - // 4. Confirm 'Raw' display is active, 'Raw' view is active and display-defined - - // Config 2 + // Active (display, view) pair where the view is display-defined. + OCIO_REQUIRE_EQUAL(1, config2->getNumDisplays()); + OCIO_CHECK_EQUAL(std::string("Raw"), config2->getDefaultDisplay()); OCIO_CHECK_EQUAL(1, config2->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "Raw")); OCIO_CHECK_EQUAL(std::string("Raw"), config2->getView(OCIO::VIEW_DISPLAY_DEFINED, "Raw", 0)); - OCIO_CHECK_ASSERT(config2->displayHasView("Raw", "Raw")); - // Check for the (display, view) pair - // Verify the views are equal. OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config1, config2, "Raw", "Raw")); } - // TODO: Verify Config::ViewsAreEqual returns true if view is shared in both configs (add a shared view for both?) -- TBD. { - // Config 1 - // 'sRGB' has one shared view: 'sview1' + // Test that Config::ViewsAreEqual works for a matching (display, view) pair across separate configs, even + // if the pair is active in one config and inactive in another. Both views are reference to a shared view. + + // Active (display, view) pair where the view is a reference to a shared view. OCIO_CHECK_EQUAL(1, config1->getNumViews(OCIO::VIEW_SHARED, "sRGB")); OCIO_CHECK_EQUAL(std::string("sview1"), config1->getView(OCIO::VIEW_SHARED, "sRGB", 0)); - OCIO_CHECK_ASSERT(config1->displayHasView("sRGB", "sview1")); - - // Config 2 - // 'sRGB' has 'sview1' as shared view (Already checked this) - // displayHasView - OCIO_CHECK_ASSERT(config2->displayHasView("sRGB", "sview1")); + // Inactive (display, view) pair where the view is a reference to a shared view. + OCIO_CHECK_EQUAL(2, config2->getNumViews(OCIO::VIEW_SHARED, "sRGB")); + OCIO_CHECK_EQUAL(std::string("view"), config2->getView(OCIO::VIEW_SHARED, "sRGB", 0)); + OCIO_CHECK_EQUAL(std::string("sview1"), config2->getView(OCIO::VIEW_SHARED, "sRGB", 1)); - // Verify views are equal. OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config1, config2, "sRGB", "sview1")); } - // Verify that Config::displayHasView works regardless of whether the display or view are active - // and regardless of whether the view is display-defined or if the display has this as a shared view. - { + // Check that displayHasView method works if (display, view) pair exists regardless of whether the display or view + // are active and regardless of whether the view is display-defined or if the view is a reference to a shared view. + OCIO::ConfigRcPtr cfg1 = config1->createEditableCopy(); - OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "Raw" )); // Active display has inactive view (display-defined). - OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "view")); // Active display has active view (display-defined). - OCIO_CHECK_ASSERT(cfg1->displayHasView("Raw" , "Raw" )); // Inactive display has inactive view (display-defined). - // OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "sview1")); // Active display has inactive view (shared). + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "Raw" )); // Active display has inactive view (display-defined). + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "view" )); // Active display has active view (display-defined). + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "sview1")); // Active display has active view (shared). + OCIO_CHECK_ASSERT(cfg1->displayHasView("Raw" , "Raw" )); // Inactive display has inactive view (display-defined). - OCIO::ConfigRcPtr cfg2 = config2->createEditableCopy(); - OCIO_CHECK_ASSERT(cfg2->displayHasView("sRGB", "Raw" )); // Inactive display has active view (display-defined). - OCIO_CHECK_ASSERT(cfg2->displayHasView("sRGB", "view")); // Inactive display has inactive view (shared). + OCIO_CHECK_NO_THROW(cfg1->setActiveDisplays("Raw")); + OCIO_CHECK_EQUAL(1, cfg1->getNumDisplays()); + OCIO_CHECK_EQUAL(std::string("Raw"), cfg1->getDefaultDisplay()); - OCIO_CHECK_NO_THROW(cfg2->setActiveDisplays("Raw, sRGB")); - OCIO_CHECK_EQUAL(std::string("Raw, sRGB"), cfg2->getActiveDisplays()); - OCIO_CHECK_ASSERT(cfg2->displayHasView("sRGB", "view")); // Active display has inactive view (shared). + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "sview1")); // Inactive display has active view (shared). - OCIO_CHECK_NO_THROW(cfg2->setActiveViews("Raw, view")); - OCIO_CHECK_EQUAL(std::string("Raw, view"), cfg2->getActiveViews()); - OCIO_CHECK_ASSERT(cfg2->displayHasView("sRGB", "view")); // Active display has active view (shared). + OCIO_CHECK_NO_THROW(cfg1->setActiveViews("Raw")); + OCIO_REQUIRE_EQUAL(cfg1->getNumViews("sRGB"), 1); + OCIO_CHECK_EQUAL(cfg1->getView("sRGB", 0), std::string("Raw")); - OCIO_CHECK_NO_THROW(cfg2->setActiveDisplays("Raw")); - OCIO_CHECK_EQUAL(std::string("Raw"), cfg2->getActiveDisplays()); - OCIO_CHECK_ASSERT(cfg2->displayHasView("sRGB", "view")); // Inactive display has active view (shared). TOUPDATE! - + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB" , "Raw" )); // Inactive display has active view (display-defined). + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "sview1")); // Inactive display has inactive view (shared). + + OCIO_CHECK_NO_THROW(cfg1->setActiveDisplays("sRGB")); + OCIO_CHECK_EQUAL(1, cfg1->getNumDisplays()); + OCIO_CHECK_EQUAL(std::string("sRGB"), cfg1->getDefaultDisplay()); + + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "sview1")); // Active display has inactive view (shared). } - // TODO: Verify Config::ViewsAreEqual and displayHasView returns false if display exists, view doesn't. { - /** - * Case: inactive display, nonexistent view. [Config 1 - sRGB, Raw] - * 1. Verify 'sRGB' is a display. - * 2. Verify that Raw is a view of sRGB - * 3. Delete Raw - * 4. Verify sRGB exists - * 5. Verify the views of sRGB - * 7. Verify no active views. Also: view doesnt exist (if additional check). getNumViews should go down to 2. - * 8. Verify that displayHasView is false. - * 9. Verify that viewsareequal is false. - */ + // Test when a display exists, but a view doesn't exist. + OCIO::ConfigRcPtr cfg1 = config1->createEditableCopy(); - OCIO_CHECK_EQUAL(std::string("sRGB"), cfg1->getActiveDisplays()); - // There are two display-defined views: 'Raw' and 'view'. + OCIO_CHECK_EQUAL(std::string("sRGB"), cfg1->getDefaultDisplay()); OCIO_CHECK_EQUAL(2, cfg1->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "sRGB")); OCIO_CHECK_EQUAL(std::string("Raw"), cfg1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 0)); OCIO_CHECK_EQUAL(std::string("view"), cfg1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 1)); - // Delete 'Raw'. - OCIO_CHECK_NO_THROW(cfg1->removeDisplayView("sRGB", "Raw")); + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "Raw")); + OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config1, cfg1, "sRGB", "Raw")); + // Remove the view from the display. + OCIO_CHECK_NO_THROW(cfg1->removeDisplayView("sRGB", "Raw")); OCIO_CHECK_EQUAL(1, cfg1->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "sRGB")); OCIO_CHECK_EQUAL(std::string("view"), cfg1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 0)); - // Verify displayHasView returns false OCIO_CHECK_ASSERT(!cfg1->displayHasView("sRGB", "Raw")); - OCIO_CHECK_EQUAL(false, cfg1->displayHasView("sRGB", "Raw")); - - // Verify ViewsAreEqual returns false OCIO_CHECK_ASSERT(!OCIO::Config::ViewsAreEqual(config1, cfg1, "sRGB", "Raw")); - OCIO_CHECK_EQUAL(false, OCIO::Config::ViewsAreEqual(cfg1, cfg1, "sRGB", "Raw")); - } - // done: Verify Config::ViewsAreEqual and displayHasView returns false if view exists, display doesn't { - /** - * Case: nonexistent display, active view. [Config 2 - Raw, Raw] - * 1. Verify 'Raw' is an active display. Should be the only active display. - * 1b. Get number of displays. - * 2. Verify 'Raw' has one view. - * 3. 'Raw' has one view, 'Raw'. - * 4. Verify 'Raw' is an active view. - * - * 5. Delete the display 'Raw'. - * 6. Verify active display is empty. - * 7. Verify that 'Raw' has no views. [because it doesnt exist] - * 8. Get number of displays (should have gone down by one) - * 9. Check that 'Raw' is still an active view. - * displayHasView, viewsareequal is false. - */ - + // Test when a view exists, but a display doesn't exist. + OCIO::ConfigRcPtr cfg2 = config2->createEditableCopy(); - // Get total number of displays. - OCIO_REQUIRE_EQUAL(2, cfg2->getNumDisplaysAll()); - - // 1. Verify 'Raw' is an active display. Should be the only active display. - OCIO_CHECK_EQUAL(std::string("Raw"), cfg2->getActiveDisplays()); - - // Verify 'Raw' has one view, 'Raw'. + OCIO_CHECK_EQUAL(std::string("Raw"), cfg2->getDefaultDisplay()); OCIO_REQUIRE_EQUAL(1, cfg2->getNumViews("Raw")); OCIO_REQUIRE_EQUAL(std::string("Raw"), cfg2->getView("Raw", 0)); - - // 'Raw' view is active. OCIO_CHECK_EQUAL(std::string("Raw"), cfg2->getActiveViews()); - // Delete the display 'Raw'. - OCIO_CHECK_NO_THROW(cfg2->removeDisplayView("Raw", "Raw")); - OCIO_CHECK_ASSERT(!cfg2->displayHasView("Raw", "Raw")); + OCIO_CHECK_ASSERT(cfg2->displayHasView("Raw", "Raw")); + OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config2, cfg2, "Raw", "Raw")); - // Get number of displays (should have gone down by one) + // Remove the view from the display and the display itself since it only has no more views. + OCIO_REQUIRE_EQUAL(2, cfg2->getNumDisplaysAll()); + OCIO_CHECK_NO_THROW(cfg2->removeDisplayView("Raw", "Raw")); OCIO_REQUIRE_EQUAL(1, cfg2->getNumDisplaysAll()); - // 'Raw' is still an active view - OCIO_REQUIRE_EQUAL(std::string("Raw"), cfg2->getActiveViews()); // plz work + // The view is still active. + OCIO_REQUIRE_EQUAL(std::string("Raw"), cfg2->getActiveViews()); - // Verify displayHasView returns false OCIO_CHECK_ASSERT(!cfg2->displayHasView("Raw", "Raw")); OCIO_CHECK_ASSERT(!OCIO::Config::ViewsAreEqual(config2, cfg2, "Raw", "Raw")); - } - // TODO: displayHasView will only check config level shared views if dispName is null. - // TODO: displayHasView will not check config level shared views if dispName is not null. - idk what this means { - /** - * With config 1: - * 1. show srgb has one shared views - * 2. do display has view for srgb and for nullptr. both should be true - * 3. remove display view - * 4. show that shared view remains in config - * 5. do display has view for srgb and for nullptr. should be false, then true. - */ + // Test access of config-level shared views for displayHasView method. + OCIO::ConfigRcPtr cfg1 = config1->createEditableCopy(); - // 'sRGB' has one shared view: 'sview1' + OCIO_CHECK_EQUAL(1, cfg1->getNumViews(OCIO::VIEW_SHARED, "sRGB")); OCIO_CHECK_EQUAL(std::string("sview1"), cfg1->getView(OCIO::VIEW_SHARED, "sRGB", 0)); + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "sview1")); - OCIO_CHECK_ASSERT(cfg1->displayHasView(nullptr, "sview1")); + // Remove the shared view from the display. OCIO_CHECK_NO_THROW(cfg1->removeDisplayView("sRGB", "sview1")); - - // 'sRGB' is still a display OCIO_REQUIRE_EQUAL(std::string("sRGB"), config1->getDefaultDisplay()); - - // 'sRGB' has no shared views OCIO_CHECK_EQUAL(0, cfg1->getNumViews(OCIO::VIEW_SHARED, "sRGB")); - // Show that sview1 still exists in the config + // Shared view still exists in the config. OCIO_CHECK_EQUAL(1, cfg1->getNumViews(OCIO::VIEW_SHARED, nullptr)); OCIO_CHECK_EQUAL(std::string("sview1"), cfg1->getView(OCIO::VIEW_SHARED, nullptr, 0)); OCIO_CHECK_ASSERT(!cfg1->displayHasView("sRGB", "sview1")); - OCIO_CHECK_ASSERT(cfg1->displayHasView(nullptr, "sview1")); + // When display name is null, displayHasView will only check config level shared views. + OCIO_CHECK_ASSERT(cfg1->displayHasView(nullptr, "sview1")); } - - } OCIO_ADD_TEST(Config, log_serialization) From 41805a28ec4fdf1353c5a50b50bdfdd0a84e3365 Mon Sep 17 00:00:00 2001 From: annie Date: Mon, 17 Feb 2025 18:07:09 -0500 Subject: [PATCH 08/17] test suite for comparing virtual displays, fix to getVirtualDisplayViewTransformName when shared Signed-off-by: annie --- include/OpenColorIO/OpenColorIO.h | 5 +- src/OpenColorIO/Config.cpp | 6 + tests/cpu/Config_tests.cpp | 235 +++++++++++++++++++++++++++++- 3 files changed, 238 insertions(+), 8 deletions(-) diff --git a/include/OpenColorIO/OpenColorIO.h b/include/OpenColorIO/OpenColorIO.h index d719fbacad..0b2a6ffe4c 100644 --- a/include/OpenColorIO/OpenColorIO.h +++ b/include/OpenColorIO/OpenColorIO.h @@ -1025,8 +1025,9 @@ class OCIOEXPORT Config * * Will return false if either of the virtual views does not exist. This will return true * even if the virtual view is display-defined in one config and a reference to a shared - * virtual view in the other config (both within the same display), as long as the contents - * match. The description text (if any) is ignored, since it is not a functional difference. + * virtual view in the other config, as long as the contents match. + * + * The description text (if any) is ignored, since it is not a functional difference. */ static bool VirtualViewsAreEqual(const ConstConfigRcPtr & first, const ConstConfigRcPtr & second, diff --git a/src/OpenColorIO/Config.cpp b/src/OpenColorIO/Config.cpp index 6050b382ad..2526483eca 100644 --- a/src/OpenColorIO/Config.cpp +++ b/src/OpenColorIO/Config.cpp @@ -3929,6 +3929,12 @@ const char * Config::getVirtualDisplayViewTransformName(const char * view) const { if (!view) return ""; + // Get the view transform name for the case where a virtual view is shared. + if (virtualViewIsShared(view)) + { + return getDisplayViewTransformName(nullptr, view); + } + ViewVec::const_iterator iter = FindView(getImpl()->m_virtualDisplay.m_views, view); if (iter != getImpl()->m_virtualDisplay.m_views.end()) { diff --git a/tests/cpu/Config_tests.cpp b/tests/cpu/Config_tests.cpp index 0f6a7b4571..970fb0cda5 100644 --- a/tests/cpu/Config_tests.cpp +++ b/tests/cpu/Config_tests.cpp @@ -9244,12 +9244,235 @@ OCIO_ADD_TEST(Config, virtual_display_exceptions) } OCIO_ADD_TEST(Config, compare_virtual_displays) { - /** - * TODO: Test hasVirtualView and VirtualViewsAreEqual - * Define a config file with a set of virtual views. Validate with hasVirtualView. - * Define a second file with a set of virtual views. Validate with hasVirtualView. - * Compare the two configs using Virtualviewsareequal testing all possible aspects. - */ + static constexpr char CONFIG1[]{ R"(ocio_profile_version: 2 + +roles: + default: raw + +file_rules: + - ! {name: Default, colorspace: default} + +shared_views: + - ! {name: Film, view_transform: display_vt, display_colorspace: } + - ! {name: view, view_transform: display_vt, display_colorspace: display_cs} + +displays: + Raw: + - ! {name: Raw, colorspace: raw} + sRGB: + - ! {name: Raw, colorspace: raw} + +virtual_display: + - ! {name: Raw, colorspace: raw} + - ! [Film, view] + +view_transforms: + - ! + name: default_vt + to_scene_reference: ! {sat: 1.5} + + - ! + name: display_vt + to_display_reference: ! {sat: 1.5} + +display_colorspaces: + - ! + name: display_cs + to_display_reference: ! {sat: 1.5} + +colorspaces: + - ! + name: raw +)" }; + + static constexpr char CONFIG2[]{ R"(ocio_profile_version: 2 + +roles: + default: raw + +file_rules: + - ! {name: Default, colorspace: default} + +shared_views: + - ! {name: view, view_transform: display_vt, display_colorspace: display_cs} + +displays: + Raw: + - ! {name: Raw, colorspace: raw} + sRGB: + - ! {name: Raw, colorspace: raw} + - ! [view] + +virtual_display: + - ! {name: Raw, colorspace: raw} + - ! {name: Film, view_transform: display_vt, display_colorspace: } + - ! [view] + +view_transforms: + - ! + name: default_vt + to_scene_reference: ! {sat: 1.5} + + - ! + name: display_vt + to_display_reference: ! {sat: 1.5} + +display_colorspaces: + - ! + name: display_cs + to_display_reference: ! {sat: 1.5} + +colorspaces: + - ! + name: raw +)" }; + + std::istringstream is; + is.str(CONFIG1); + OCIO::ConstConfigRcPtr config1, config2; + OCIO_CHECK_NO_THROW(config1 = OCIO::Config::CreateFromStream(is)); + is.clear(); + is.str(CONFIG2); + OCIO_CHECK_NO_THROW(config2 = OCIO::Config::CreateFromStream(is)); + OCIO_CHECK_NO_THROW(config1->validate()); + OCIO_CHECK_NO_THROW(config2->validate()); + + { + // Test that Config::VirtualViewsAreEqual works for a matching virtual view pair across separate configs. + // Works regardless of if the virtual view is display-defined in one config and shared in the other. + + // Virtual view is a reference to a shared view. + OCIO_REQUIRE_EQUAL(2, config1->getVirtualDisplayNumViews(OCIO::VIEW_SHARED)); + + const char * viewName1 = config1->getVirtualDisplayView(OCIO::VIEW_SHARED, 0); + + OCIO_CHECK_EQUAL(std::string("Film"), viewName1); + OCIO_CHECK_EQUAL(std::string("display_vt"), config1->getVirtualDisplayViewTransformName(viewName1)); + OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewColorSpaceName(viewName1)); + OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewLooks(viewName1)); + OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewRule(viewName1)); + OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewDescription(viewName1)); + + // Virtual view is a reference to a display-defined view. + OCIO_REQUIRE_EQUAL(2, config2->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); + + const char * viewName2 = config2->getVirtualDisplayView(OCIO::VIEW_DISPLAY_DEFINED, 1); + + OCIO_CHECK_EQUAL(std::string("Film"), viewName2); + OCIO_CHECK_EQUAL(std::string("display_vt"), config2->getVirtualDisplayViewTransformName(viewName2)); + OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewColorSpaceName(viewName2)); + OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewLooks(viewName2)); + OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewRule(viewName2)); + OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewDescription(viewName2)); + + OCIO_CHECK_EQUAL(std::string(viewName1), std::string(viewName2)); + OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config1, config2, viewName1)); + } + { + // Virtual views are both display-defined. + OCIO_REQUIRE_EQUAL(1, config1->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); + + const char * viewName1 = config1->getVirtualDisplayView(OCIO::VIEW_DISPLAY_DEFINED, 0); + + OCIO_CHECK_EQUAL(std::string("Raw"), viewName1); + OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewTransformName(viewName1)); + OCIO_CHECK_EQUAL(std::string("raw"), config1->getVirtualDisplayViewColorSpaceName(viewName1)); + OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewLooks(viewName1)); + OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewRule(viewName1)); + OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewDescription(viewName1)); + + const char * viewName2 = config2->getVirtualDisplayView(OCIO::VIEW_DISPLAY_DEFINED, 0); + + OCIO_CHECK_EQUAL(std::string("Raw"), viewName2); + OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewTransformName(viewName2)); + OCIO_CHECK_EQUAL(std::string("raw"), config2->getVirtualDisplayViewColorSpaceName(viewName2)); + OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewLooks(viewName2)); + OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewRule(viewName2)); + OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewDescription(viewName2)); + + OCIO_CHECK_EQUAL(std::string(viewName1), std::string(viewName2)); + OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config1, config2, viewName1)); + } + { + // Virtual views are both shared. + const char * viewName1 = config1->getVirtualDisplayView(OCIO::VIEW_SHARED, 1); + + OCIO_CHECK_EQUAL(std::string("view"), viewName1); + OCIO_CHECK_EQUAL(std::string("display_vt"), config1->getVirtualDisplayViewTransformName(viewName1)); + OCIO_CHECK_EQUAL(std::string("display_cs"), config1->getVirtualDisplayViewColorSpaceName(viewName1)); + OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewLooks(viewName1)); + OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewRule(viewName1)); + OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewDescription(viewName1)); + + OCIO_REQUIRE_EQUAL(1, config2->getVirtualDisplayNumViews(OCIO::VIEW_SHARED)); + + const char * viewName2 = config2->getVirtualDisplayView(OCIO::VIEW_SHARED, 0); + + OCIO_CHECK_EQUAL(std::string("view"), viewName2); + OCIO_CHECK_EQUAL(std::string("display_vt"), config2->getVirtualDisplayViewTransformName(viewName2)); + OCIO_CHECK_EQUAL(std::string("display_cs"), config2->getVirtualDisplayViewColorSpaceName(viewName2)); + OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewLooks(viewName2)); + OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewRule(viewName2)); + OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewDescription(viewName2)); + + OCIO_CHECK_EQUAL(std::string(viewName1), std::string(viewName2)); + OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config1, config2, viewName1)); + + OCIO_CHECK_EQUAL(std::string(viewName1), std::string(viewName2)); + OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config1, config2, viewName1)); + } + { + // Test when a shared virtual view exists in one config but not the other. + OCIO::ConfigRcPtr cfg = config1->createEditableCopy(); + + OCIO_CHECK_ASSERT(config1->hasVirtualView("Film")); + OCIO_CHECK_ASSERT(config1->virtualViewIsShared("Film")); + + OCIO_REQUIRE_EQUAL(2, cfg->getVirtualDisplayNumViews(OCIO::VIEW_SHARED)); + OCIO_CHECK_ASSERT(cfg->hasVirtualView("Film")); + OCIO_CHECK_ASSERT(cfg->virtualViewIsShared("Film")); + + OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config1, cfg, "Film")); + + // Check against another config where the virtual view is display-defined. + OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config2, cfg, "Film")); + + // Remove a shared view from the virtual display. + cfg->removeVirtualDisplayView("Film"); + + OCIO_REQUIRE_EQUAL(1, cfg->getVirtualDisplayNumViews(OCIO::VIEW_SHARED)); + OCIO_CHECK_ASSERT(!cfg->hasVirtualView("Film")); + OCIO_CHECK_ASSERT(!cfg->virtualViewIsShared("Film")); + + OCIO_CHECK_ASSERT(!OCIO::Config::VirtualViewsAreEqual(config1, cfg, "Film")); + OCIO_CHECK_ASSERT(!OCIO::Config::VirtualViewsAreEqual(config2, cfg, "Film")); + } + { + // Test when a display-defined virtual view exists in one config but not the other. + OCIO::ConfigRcPtr cfg = config2->createEditableCopy(); + + // Remove a display-defined view from the virtual display. + OCIO_CHECK_ASSERT(config2->hasVirtualView("Film")); + OCIO_CHECK_ASSERT(!config2->virtualViewIsShared("Film")); // Confirm display-defined + + OCIO_REQUIRE_EQUAL(2, cfg->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); + OCIO_CHECK_ASSERT(cfg->hasVirtualView("Film")); + OCIO_CHECK_ASSERT(!cfg->virtualViewIsShared("Film")); // Confirm display-defined + + OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config2, cfg, "Film")); + + // Check against another config where the virtual view is a reference to a shared view. + OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config1, cfg, "Film")); + + // Remove a display-defined view from the virtual display. + cfg->removeVirtualDisplayView("Film"); + + OCIO_REQUIRE_EQUAL(1, cfg->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); + OCIO_CHECK_ASSERT(!cfg->hasVirtualView("Film")); + + OCIO_CHECK_ASSERT(!OCIO::Config::VirtualViewsAreEqual(config2, cfg, "Film")); + OCIO_CHECK_ASSERT(!OCIO::Config::VirtualViewsAreEqual(config1, cfg, "Film")); + } } OCIO_ADD_TEST(Config, description_and_name) From 1681a8e8c875df18f875b005270b3b5ea6854d78 Mon Sep 17 00:00:00 2001 From: annie Date: Fri, 16 May 2025 15:46:18 +0300 Subject: [PATCH 09/17] update briefs for ViewsAreEqual + VirtualViewsAreEqual, remove redunant lines in tests, add virtualViewIsShared checks to getVirtualView-related functions Signed-off-by: annie --- include/OpenColorIO/OpenColorIO.h | 8 ++++++++ src/OpenColorIO/Config.cpp | 18 ++++++++++++++++++ tests/cpu/Config_tests.cpp | 4 ---- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/include/OpenColorIO/OpenColorIO.h b/include/OpenColorIO/OpenColorIO.h index 0b2a6ffe4c..42a710a97a 100644 --- a/include/OpenColorIO/OpenColorIO.h +++ b/include/OpenColorIO/OpenColorIO.h @@ -897,6 +897,10 @@ class OCIOEXPORT Config * if the view is display-defined in one config and a reference to a shared view in the * other config (both within the same display), as long as the contents match. The * description text (if any) is ignored, since it is not a functional difference. + * + * Note that the comparison is only on the strings contained in the view definition, + * the function does not attempt to compare that the color spaces or view transforms + * being referenced are identical (only that they have the same name). */ static bool ViewsAreEqual(const ConstConfigRcPtr & first, const ConstConfigRcPtr & second, @@ -1028,6 +1032,10 @@ class OCIOEXPORT Config * virtual view in the other config, as long as the contents match. * * The description text (if any) is ignored, since it is not a functional difference. + * + * Note that the comparison is only on the strings contained in the view definition, + * the function does not attempt to compare that the color spaces or view transforms + * being referenced are identical (only that they have the same name). */ static bool VirtualViewsAreEqual(const ConstConfigRcPtr & first, const ConstConfigRcPtr & second, diff --git a/src/OpenColorIO/Config.cpp b/src/OpenColorIO/Config.cpp index 2526483eca..dde0cc68a8 100644 --- a/src/OpenColorIO/Config.cpp +++ b/src/OpenColorIO/Config.cpp @@ -3967,6 +3967,12 @@ const char * Config::getVirtualDisplayViewLooks(const char * view) const noexcep { if (!view) return ""; + // Get the view looks for the case where a virtual view is shared + if (virtualViewIsShared(view)) + { + return getDisplayViewLooks(nullptr, view); + } + ViewVec::const_iterator iter = FindView(getImpl()->m_virtualDisplay.m_views, view); if (iter != getImpl()->m_virtualDisplay.m_views.end()) { @@ -3980,6 +3986,12 @@ const char * Config::getVirtualDisplayViewRule(const char * view) const noexcept { if (!view) return ""; + // Get the view rule for the case where a virtual view is shared + if (virtualViewIsShared(view)) + { + return getDisplayViewRule(nullptr, view); + } + ViewVec::const_iterator iter = FindView(getImpl()->m_virtualDisplay.m_views, view); if (iter != getImpl()->m_virtualDisplay.m_views.end()) { @@ -3993,6 +4005,12 @@ const char * Config::getVirtualDisplayViewDescription(const char * view) const n { if (!view) return ""; + // Get the view description for the case where a virtual view is shared + if (virtualViewIsShared(view)) + { + return getDisplayViewDescription(nullptr, view); + } + ViewVec::const_iterator iter = FindView(getImpl()->m_virtualDisplay.m_views, view); if (iter != getImpl()->m_virtualDisplay.m_views.end()) { diff --git a/tests/cpu/Config_tests.cpp b/tests/cpu/Config_tests.cpp index 970fb0cda5..d1b598f5cf 100644 --- a/tests/cpu/Config_tests.cpp +++ b/tests/cpu/Config_tests.cpp @@ -8800,8 +8800,6 @@ active_views: [] viewName = cfg->getVirtualDisplayView(OCIO::VIEW_DISPLAY_DEFINED, 1); - OCIO_CHECK_ASSERT(cfg->hasVirtualView(viewName)); - OCIO_CHECK_EQUAL(std::string("Film"), viewName); OCIO_CHECK_EQUAL(std::string("display_vt"), cfg->getVirtualDisplayViewTransformName(viewName)); OCIO_CHECK_EQUAL(std::string(""), cfg->getVirtualDisplayViewColorSpaceName(viewName)); @@ -8809,8 +8807,6 @@ active_views: [] OCIO_CHECK_EQUAL(std::string(""), cfg->getVirtualDisplayViewRule(viewName)); OCIO_CHECK_EQUAL(std::string(""), cfg->getVirtualDisplayViewDescription(viewName)); - OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config, cfg, viewName)); - OCIO_REQUIRE_EQUAL(1, cfg->getVirtualDisplayNumViews(OCIO::VIEW_SHARED)); OCIO_CHECK_EQUAL(std::string("sview2"), cfg->getVirtualDisplayView(OCIO::VIEW_SHARED, 0)); OCIO_CHECK_EQUAL(std::string("raw"), cfg->getVirtualDisplayViewColorSpaceName("sview2")); From a15e9de8dd5901546624f36f6bc4244d22edf83b Mon Sep 17 00:00:00 2001 From: annie Date: Fri, 16 May 2025 15:55:42 +0300 Subject: [PATCH 10/17] move virtual_display_exceptions test from tests/cpu/Config_tests.cpp to tests/cpu/Display_tests.cpp Signed-off-by: annie --- tests/cpu/Config_tests.cpp | 88 ------------------------------------- tests/cpu/Display_tests.cpp | 88 +++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 88 deletions(-) diff --git a/tests/cpu/Config_tests.cpp b/tests/cpu/Config_tests.cpp index d1b598f5cf..7f57c6ac6a 100644 --- a/tests/cpu/Config_tests.cpp +++ b/tests/cpu/Config_tests.cpp @@ -9151,94 +9151,6 @@ OCIO_ADD_TEST(Config, virtual_display_v2_only) "Only version 2 (or higher) can have a virtual display."); } -OCIO_ADD_TEST(Config, virtual_display_exceptions) -{ - // Test the validations around the virtual display definition. - - static constexpr char CONFIG[]{ R"(ocio_profile_version: 2 - -roles: - default: raw - -file_rules: - - ! {name: Default, colorspace: default} - -shared_views: - - ! {name: sview1, colorspace: raw} - -displays: - Raw: - - ! {name: Raw, colorspace: raw} - -virtual_display: - - ! {name: Raw, colorspace: raw} - - ! [sview1] - -view_transforms: - - ! - name: default_vt - to_scene_reference: ! {sat: 1.5} - - - ! - name: display_vt - to_display_reference: ! {sat: 1.5} - -display_colorspaces: - - ! - name: display_cs - to_display_reference: ! {sat: 1.5} - -colorspaces: - - ! - name: raw -)" }; - - std::istringstream iss; - iss.str(CONFIG); - - OCIO::ConfigRcPtr cfg; - OCIO_CHECK_NO_THROW(cfg = OCIO::Config::CreateFromStream(iss)->createEditableCopy()); - OCIO_CHECK_NO_THROW(cfg->validate()); - - // Test failures for shared views. - - OCIO_CHECK_THROW_WHAT(cfg->addVirtualDisplaySharedView("sview1"), - OCIO::Exception, - "Shared view could not be added to virtual_display: There is already a" - " shared view named 'sview1'."); - - OCIO_CHECK_NO_THROW(cfg->addVirtualDisplaySharedView("sview2")); - OCIO_CHECK_THROW_WHAT(cfg->validate(), - OCIO::Exception, - "The display 'virtual_display' contains a shared view 'sview2' that is" - " not defined."); - - cfg->removeVirtualDisplayView("sview2"); - OCIO_CHECK_NO_THROW(cfg->validate()); - - // Test failures for views. - - OCIO_CHECK_THROW_WHAT(cfg->addVirtualDisplayView("Raw", nullptr, "raw", nullptr, nullptr, nullptr), - OCIO::Exception, - "View could not be added to virtual_display in config: View 'Raw' already" - " exists."); - - OCIO_CHECK_NO_THROW(cfg->addVirtualDisplayView("Raw1", nullptr, "raw1", nullptr, nullptr, nullptr)); - OCIO_CHECK_THROW_WHAT(cfg->validate(), - OCIO::Exception, - "Display 'virtual_display' has a view 'Raw1' that refers to a color space" - " or a named transform, 'raw1', which is not defined."); - - cfg->removeVirtualDisplayView("Raw1"); - OCIO_CHECK_NO_THROW(cfg->validate()); - - OCIO_CHECK_NO_THROW(cfg->addVirtualDisplayView("Raw1", nullptr, "raw", "look", nullptr, nullptr)); - OCIO_CHECK_THROW_WHAT(cfg->validate(), - OCIO::Exception, - "Display 'virtual_display' has a view 'Raw1' refers to a look, 'look'," - " which is not defined."); -} - OCIO_ADD_TEST(Config, compare_virtual_displays) { static constexpr char CONFIG1[]{ R"(ocio_profile_version: 2 diff --git a/tests/cpu/Display_tests.cpp b/tests/cpu/Display_tests.cpp index c9562aa0a2..50967d6671 100644 --- a/tests/cpu/Display_tests.cpp +++ b/tests/cpu/Display_tests.cpp @@ -233,3 +233,91 @@ OCIO_ADD_TEST(SharedViews, basic) OCIO_CHECK_EQUAL(std::string(OCIO::OCIO_VIEW_USE_DISPLAY_NAME), configBack->getDisplayViewColorSpaceName(nullptr, "shared3")); } + +OCIO_ADD_TEST(Config, virtual_display_exceptions) +{ + // Test the validations around the virtual display definition. + + static constexpr char CONFIG[]{ R"(ocio_profile_version: 2 + +roles: + default: raw + +file_rules: + - ! {name: Default, colorspace: default} + +shared_views: + - ! {name: sview1, colorspace: raw} + +displays: + Raw: + - ! {name: Raw, colorspace: raw} + +virtual_display: + - ! {name: Raw, colorspace: raw} + - ! [sview1] + +view_transforms: + - ! + name: default_vt + to_scene_reference: ! {sat: 1.5} + + - ! + name: display_vt + to_display_reference: ! {sat: 1.5} + +display_colorspaces: + - ! + name: display_cs + to_display_reference: ! {sat: 1.5} + +colorspaces: + - ! + name: raw +)" }; + + std::istringstream iss; + iss.str(CONFIG); + + OCIO::ConfigRcPtr cfg; + OCIO_CHECK_NO_THROW(cfg = OCIO::Config::CreateFromStream(iss)->createEditableCopy()); + OCIO_CHECK_NO_THROW(cfg->validate()); + + // Test failures for shared views. + + OCIO_CHECK_THROW_WHAT(cfg->addVirtualDisplaySharedView("sview1"), + OCIO::Exception, + "Shared view could not be added to virtual_display: There is already a" + " shared view named 'sview1'."); + + OCIO_CHECK_NO_THROW(cfg->addVirtualDisplaySharedView("sview2")); + OCIO_CHECK_THROW_WHAT(cfg->validate(), + OCIO::Exception, + "The display 'virtual_display' contains a shared view 'sview2' that is" + " not defined."); + + cfg->removeVirtualDisplayView("sview2"); + OCIO_CHECK_NO_THROW(cfg->validate()); + + // Test failures for views. + + OCIO_CHECK_THROW_WHAT(cfg->addVirtualDisplayView("Raw", nullptr, "raw", nullptr, nullptr, nullptr), + OCIO::Exception, + "View could not be added to virtual_display in config: View 'Raw' already" + " exists."); + + OCIO_CHECK_NO_THROW(cfg->addVirtualDisplayView("Raw1", nullptr, "raw1", nullptr, nullptr, nullptr)); + OCIO_CHECK_THROW_WHAT(cfg->validate(), + OCIO::Exception, + "Display 'virtual_display' has a view 'Raw1' that refers to a color space" + " or a named transform, 'raw1', which is not defined."); + + cfg->removeVirtualDisplayView("Raw1"); + OCIO_CHECK_NO_THROW(cfg->validate()); + + OCIO_CHECK_NO_THROW(cfg->addVirtualDisplayView("Raw1", nullptr, "raw", "look", nullptr, nullptr)); + OCIO_CHECK_THROW_WHAT(cfg->validate(), + OCIO::Exception, + "Display 'virtual_display' has a view 'Raw1' refers to a look, 'look'," + " which is not defined."); +} \ No newline at end of file From 9e83598b4d61df6ce4f4ba58efcfe3d243df71cb Mon Sep 17 00:00:00 2001 From: annie Date: Fri, 16 May 2025 16:09:44 +0300 Subject: [PATCH 11/17] move display_view_order test from tests/cpu/Config_tests.cpp to tests/cpu/Display_tests.cpp Signed-off-by: annie --- tests/cpu/Config_tests.cpp | 60 ------------------------------------- tests/cpu/Display_tests.cpp | 60 +++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 60 deletions(-) diff --git a/tests/cpu/Config_tests.cpp b/tests/cpu/Config_tests.cpp index 7f57c6ac6a..a86c5a7177 100644 --- a/tests/cpu/Config_tests.cpp +++ b/tests/cpu/Config_tests.cpp @@ -3689,66 +3689,6 @@ OCIO_ADD_TEST(Config, view) } } -OCIO_ADD_TEST(Config, display_view_order) -{ - constexpr char SIMPLE_CONFIG[] { R"( - ocio_profile_version: 2 - - environment: - {} - - displays: - sRGB_B: - - ! {name: View_2, colorspace: raw} - - ! {name: View_1, colorspace: raw} - sRGB_D: - - ! {name: View_2, colorspace: raw} - - ! {name: View_3, colorspace: raw} - sRGB_A: - - ! {name: View_3, colorspace: raw} - - ! {name: View_1, colorspace: raw} - sRGB_C: - - ! {name: View_4, colorspace: raw} - - ! {name: View_1, colorspace: raw} - - colorspaces: - - ! - name: raw - allocation: uniform - - - ! - name: lnh - allocation: uniform - - file_rules: - - ! {name: Default, colorspace: raw} - )" }; - - std::istringstream is(SIMPLE_CONFIG); - OCIO::ConstConfigRcPtr config; - OCIO_CHECK_NO_THROW(config = OCIO::Config::CreateFromStream(is)); - OCIO_CHECK_NO_THROW(config->validate()); - - OCIO_REQUIRE_EQUAL(config->getNumDisplays(), 4); - - // When active_displays is not defined, the displays are returned in config order. - - OCIO_CHECK_EQUAL(std::string(config->getDefaultDisplay()), "sRGB_B"); - - OCIO_CHECK_EQUAL(std::string(config->getDisplay(0)), "sRGB_B"); - OCIO_CHECK_EQUAL(std::string(config->getDisplay(1)), "sRGB_D"); - OCIO_CHECK_EQUAL(std::string(config->getDisplay(2)), "sRGB_A"); - OCIO_CHECK_EQUAL(std::string(config->getDisplay(3)), "sRGB_C"); - - // When active_views is not defined, the views are returned in config order. - - OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_B")), "View_2"); - - OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_B"), 2); - OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_B", 0)), "View_2"); - OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_B", 1)), "View_1"); -} - OCIO_ADD_TEST(Config, compare_displays) { static constexpr char CONFIG1[]{ R"(ocio_profile_version: 2 diff --git a/tests/cpu/Display_tests.cpp b/tests/cpu/Display_tests.cpp index 50967d6671..f723dee401 100644 --- a/tests/cpu/Display_tests.cpp +++ b/tests/cpu/Display_tests.cpp @@ -234,6 +234,66 @@ OCIO_ADD_TEST(SharedViews, basic) configBack->getDisplayViewColorSpaceName(nullptr, "shared3")); } +OCIO_ADD_TEST(Config, display_view_order) +{ + constexpr char SIMPLE_CONFIG[] { R"( + ocio_profile_version: 2 + + environment: + {} + + displays: + sRGB_B: + - ! {name: View_2, colorspace: raw} + - ! {name: View_1, colorspace: raw} + sRGB_D: + - ! {name: View_2, colorspace: raw} + - ! {name: View_3, colorspace: raw} + sRGB_A: + - ! {name: View_3, colorspace: raw} + - ! {name: View_1, colorspace: raw} + sRGB_C: + - ! {name: View_4, colorspace: raw} + - ! {name: View_1, colorspace: raw} + + colorspaces: + - ! + name: raw + allocation: uniform + + - ! + name: lnh + allocation: uniform + + file_rules: + - ! {name: Default, colorspace: raw} + )" }; + + std::istringstream is(SIMPLE_CONFIG); + OCIO::ConstConfigRcPtr config; + OCIO_CHECK_NO_THROW(config = OCIO::Config::CreateFromStream(is)); + OCIO_CHECK_NO_THROW(config->validate()); + + OCIO_REQUIRE_EQUAL(config->getNumDisplays(), 4); + + // When active_displays is not defined, the displays are returned in config order. + + OCIO_CHECK_EQUAL(std::string(config->getDefaultDisplay()), "sRGB_B"); + + OCIO_CHECK_EQUAL(std::string(config->getDisplay(0)), "sRGB_B"); + OCIO_CHECK_EQUAL(std::string(config->getDisplay(1)), "sRGB_D"); + OCIO_CHECK_EQUAL(std::string(config->getDisplay(2)), "sRGB_A"); + OCIO_CHECK_EQUAL(std::string(config->getDisplay(3)), "sRGB_C"); + + // When active_views is not defined, the views are returned in config order. + + OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_B")), "View_2"); + + OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_B"), 2); + OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_B", 0)), "View_2"); + OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_B", 1)), "View_1"); +} + OCIO_ADD_TEST(Config, virtual_display_exceptions) { // Test the validations around the virtual display definition. From 0918ff4260cb787c03fa3a07f2fc75dc0b2d0877 Mon Sep 17 00:00:00 2001 From: annie Date: Fri, 16 May 2025 16:10:58 +0300 Subject: [PATCH 12/17] add usage of viewIsShared to compare_displays test Signed-off-by: annie --- tests/cpu/Config_tests.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/cpu/Config_tests.cpp b/tests/cpu/Config_tests.cpp index a86c5a7177..8869284927 100644 --- a/tests/cpu/Config_tests.cpp +++ b/tests/cpu/Config_tests.cpp @@ -3795,6 +3795,8 @@ active_views: [Raw] OCIO_CHECK_EQUAL(std::string("Raw"), config1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 0)); OCIO_CHECK_EQUAL(std::string("view"), config1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 1)); + OCIO_CHECK_ASSERT(!config1->viewIsShared("sRGB", "view")); + OCIO_CHECK_EQUAL(2, config1->getNumViews("sRGB")); OCIO_CHECK_EQUAL(std::string("view"), config1->getView("sRGB", 0)); @@ -3811,6 +3813,8 @@ active_views: [Raw] OCIO_CHECK_EQUAL(std::string("view"), config2->getView(OCIO::VIEW_SHARED, "sRGB", 0)); OCIO_CHECK_EQUAL(std::string("sview1"), config2->getView(OCIO::VIEW_SHARED, "sRGB", 1)); + OCIO_CHECK_ASSERT(config2->viewIsShared("sRGB", "view")); + OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config1, config2, "sRGB", "view")); } @@ -3825,12 +3829,14 @@ active_views: [Raw] OCIO_CHECK_EQUAL(config1->getDisplayAll(0), std::string("Raw")); OCIO_CHECK_EQUAL(1, config1->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "Raw")); OCIO_CHECK_EQUAL(std::string("Raw"), config1->getView(OCIO::VIEW_DISPLAY_DEFINED, "Raw", 0)); + OCIO_CHECK_ASSERT(!config1->viewIsShared("Raw", "Raw")); // Active (display, view) pair where the view is display-defined. OCIO_REQUIRE_EQUAL(1, config2->getNumDisplays()); OCIO_CHECK_EQUAL(std::string("Raw"), config2->getDefaultDisplay()); OCIO_CHECK_EQUAL(1, config2->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "Raw")); OCIO_CHECK_EQUAL(std::string("Raw"), config2->getView(OCIO::VIEW_DISPLAY_DEFINED, "Raw", 0)); + OCIO_CHECK_ASSERT(!config2->viewIsShared("Raw", "Raw")); OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config1, config2, "Raw", "Raw")); } @@ -3842,11 +3848,13 @@ active_views: [Raw] // Active (display, view) pair where the view is a reference to a shared view. OCIO_CHECK_EQUAL(1, config1->getNumViews(OCIO::VIEW_SHARED, "sRGB")); OCIO_CHECK_EQUAL(std::string("sview1"), config1->getView(OCIO::VIEW_SHARED, "sRGB", 0)); + OCIO_CHECK_ASSERT(config1->viewIsShared("sRGB", "sview1")); // Inactive (display, view) pair where the view is a reference to a shared view. OCIO_CHECK_EQUAL(2, config2->getNumViews(OCIO::VIEW_SHARED, "sRGB")); OCIO_CHECK_EQUAL(std::string("view"), config2->getView(OCIO::VIEW_SHARED, "sRGB", 0)); OCIO_CHECK_EQUAL(std::string("sview1"), config2->getView(OCIO::VIEW_SHARED, "sRGB", 1)); + OCIO_CHECK_ASSERT(config2->viewIsShared("sRGB", "sview1")); OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config1, config2, "sRGB", "sview1")); } @@ -3935,6 +3943,7 @@ active_views: [Raw] OCIO_CHECK_EQUAL(1, cfg1->getNumViews(OCIO::VIEW_SHARED, "sRGB")); OCIO_CHECK_EQUAL(std::string("sview1"), cfg1->getView(OCIO::VIEW_SHARED, "sRGB", 0)); + OCIO_CHECK_ASSERT(cfg1->viewIsShared("sRGB", "sview1")); OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "sview1")); @@ -3946,6 +3955,7 @@ active_views: [Raw] // Shared view still exists in the config. OCIO_CHECK_EQUAL(1, cfg1->getNumViews(OCIO::VIEW_SHARED, nullptr)); OCIO_CHECK_EQUAL(std::string("sview1"), cfg1->getView(OCIO::VIEW_SHARED, nullptr, 0)); + OCIO_CHECK_ASSERT(cfg1->viewIsShared(nullptr, "sview1")); OCIO_CHECK_ASSERT(!cfg1->displayHasView("sRGB", "sview1")); From 9f2ab620b0adf97419f4932357702547ffab33fc Mon Sep 17 00:00:00 2001 From: annie Date: Fri, 16 May 2025 16:28:08 +0300 Subject: [PATCH 13/17] add test of clearSharedViews to basic test module in tests/cpu/Display_tests.cpp Signed-off-by: annie --- tests/cpu/Display_tests.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/cpu/Display_tests.cpp b/tests/cpu/Display_tests.cpp index f723dee401..f44242c98c 100644 --- a/tests/cpu/Display_tests.cpp +++ b/tests/cpu/Display_tests.cpp @@ -232,6 +232,11 @@ OCIO_ADD_TEST(SharedViews, basic) OCIO_CHECK_EQUAL(std::string(OCIO::OCIO_VIEW_USE_DISPLAY_NAME), configBack->getDisplayViewColorSpaceName(nullptr, "shared3")); + + // Remove all shared views + OCIO_REQUIRE_EQUAL(4, config->getNumViews(OCIO::VIEW_SHARED, nullptr)); + OCIO_CHECK_NO_THROW(config->clearSharedViews()); + OCIO_REQUIRE_EQUAL(0, config->getNumViews(OCIO::VIEW_SHARED, nullptr)); } OCIO_ADD_TEST(Config, display_view_order) From 990fd734e7ebea4c5ad261ca3d5cb9988651ff38 Mon Sep 17 00:00:00 2001 From: annie Date: Fri, 16 May 2025 16:49:52 +0300 Subject: [PATCH 14/17] change configs for compare_virtual_displays in tests/cpu/Config_tests.cpp to use looks, rules, and description Signed-off-by: annie --- tests/cpu/Config_tests.cpp | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/tests/cpu/Config_tests.cpp b/tests/cpu/Config_tests.cpp index 8869284927..516fc29bb7 100644 --- a/tests/cpu/Config_tests.cpp +++ b/tests/cpu/Config_tests.cpp @@ -9110,8 +9110,11 @@ OCIO_ADD_TEST(Config, compare_virtual_displays) { file_rules: - ! {name: Default, colorspace: default} +viewing_rules: + - ! {name: Linear, colorspaces: default} + shared_views: - - ! {name: Film, view_transform: display_vt, display_colorspace: } + - ! {name: Film, view_transform: display_vt, display_colorspace: , looks: look1, rule: Linear, description: Test view} - ! {name: view, view_transform: display_vt, display_colorspace: display_cs} displays: @@ -9124,6 +9127,11 @@ OCIO_ADD_TEST(Config, compare_virtual_displays) { - ! {name: Raw, colorspace: raw} - ! [Film, view] +looks: + - ! + name: look1 + process_space: default + view_transforms: - ! name: default_vt @@ -9151,6 +9159,9 @@ OCIO_ADD_TEST(Config, compare_virtual_displays) { file_rules: - ! {name: Default, colorspace: default} +viewing_rules: + - ! {name: Linear, colorspaces: default} + shared_views: - ! {name: view, view_transform: display_vt, display_colorspace: display_cs} @@ -9163,9 +9174,14 @@ OCIO_ADD_TEST(Config, compare_virtual_displays) { virtual_display: - ! {name: Raw, colorspace: raw} - - ! {name: Film, view_transform: display_vt, display_colorspace: } + - ! {name: Film, view_transform: display_vt, display_colorspace: , looks: look1, rule: Linear, description: Test view} - ! [view] +looks: + - ! + name: look1 + process_space: default + view_transforms: - ! name: default_vt @@ -9207,9 +9223,9 @@ OCIO_ADD_TEST(Config, compare_virtual_displays) { OCIO_CHECK_EQUAL(std::string("Film"), viewName1); OCIO_CHECK_EQUAL(std::string("display_vt"), config1->getVirtualDisplayViewTransformName(viewName1)); OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewColorSpaceName(viewName1)); - OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewLooks(viewName1)); - OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewRule(viewName1)); - OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewDescription(viewName1)); + OCIO_CHECK_EQUAL(std::string("look1"), config1->getVirtualDisplayViewLooks(viewName1)); + OCIO_CHECK_EQUAL(std::string("Linear"), config1->getVirtualDisplayViewRule(viewName1)); + OCIO_CHECK_EQUAL(std::string("Test view"), config1->getVirtualDisplayViewDescription(viewName1)); // Virtual view is a reference to a display-defined view. OCIO_REQUIRE_EQUAL(2, config2->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); @@ -9219,9 +9235,9 @@ OCIO_ADD_TEST(Config, compare_virtual_displays) { OCIO_CHECK_EQUAL(std::string("Film"), viewName2); OCIO_CHECK_EQUAL(std::string("display_vt"), config2->getVirtualDisplayViewTransformName(viewName2)); OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewColorSpaceName(viewName2)); - OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewLooks(viewName2)); - OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewRule(viewName2)); - OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewDescription(viewName2)); + OCIO_CHECK_EQUAL(std::string("look1"), config2->getVirtualDisplayViewLooks(viewName2)); + OCIO_CHECK_EQUAL(std::string("Linear"), config2->getVirtualDisplayViewRule(viewName2)); + OCIO_CHECK_EQUAL(std::string("Test view"), config2->getVirtualDisplayViewDescription(viewName2)); OCIO_CHECK_EQUAL(std::string(viewName1), std::string(viewName2)); OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config1, config2, viewName1)); From ecc732346384988709ec391881a9a5978995ed81 Mon Sep 17 00:00:00 2001 From: annie Date: Fri, 16 May 2025 17:18:43 +0300 Subject: [PATCH 15/17] improve test cases for python config tests Signed-off-by: annie --- tests/python/ConfigTest.py | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/tests/python/ConfigTest.py b/tests/python/ConfigTest.py index a50c5d544a..f63ad15af6 100644 --- a/tests/python/ConfigTest.py +++ b/tests/python/ConfigTest.py @@ -839,7 +839,12 @@ def test_virtual_display(self): self.assertEqual(1, len(cfg.getViews(OCIO.VIEW_SHARED, "sRGB"))) self.assertTrue(cfg.displayHasView("sRGB", "sview1")) + self.assertFalse(cfg.displayHasView("sRGB", "sview2")) + self.assertFalse(cfg.displayHasView("sRGB", " ")) + self.assertTrue(cfg.viewIsShared("sRGB", "sview1")) + self.assertFalse(cfg.viewIsShared("sRGB", "Raw")) + self.assertFalse(cfg.viewIsShared("sRGB", " ")) other = copy.deepcopy(cfg) @@ -847,6 +852,14 @@ def test_virtual_display(self): self.assertTrue(OCIO.Config.ViewsAreEqual(cfg, other, "sRGB", "Raw")) self.assertTrue(OCIO.Config.ViewsAreEqual(cfg, other, "sRGB", "view")) + cfg.removeDisplayView("sRGB", "sview1") + cfg.removeDisplayView("sRGB", "Raw") + cfg.removeDisplayView("sRGB", "view") + + self.assertFalse(OCIO.Config.ViewsAreEqual(cfg, other, "sRGB", "sview1")) + self.assertFalse(OCIO.Config.ViewsAreEqual(cfg, other, "sRGB", "Raw")) + self.assertFalse(OCIO.Config.ViewsAreEqual(cfg, other, "sRGB", "view")) + # Validate the virtual display information self.assertEqual( 2, @@ -885,11 +898,28 @@ def test_virtual_display(self): self.assertTrue(cfg.virtualViewIsShared("sview2")) self.assertTrue(OCIO.Config.VirtualViewsAreEqual(cfg, other, "sview2")) + other.addVirtualDisplayView("sview3", "", "raw") + + self.assertFalse(cfg.hasVirtualView("sview3")) + self.assertTrue(other.hasVirtualView("sview3")) + self.assertFalse(OCIO.Config.VirtualViewsAreEqual(cfg, other, "sview3")) + + # Test a virtual view that doesn't exist in either + self.assertFalse(cfg.hasVirtualView(" ")) + self.assertFalse(other.hasVirtualView(" ")) + self.assertFalse(OCIO.Config.VirtualViewsAreEqual(cfg, other, " ")) + + self.assertFalse(cfg.hasVirtualView("nonexistent")) + self.assertFalse(other.hasVirtualView("nonexistent")) + self.assertFalse(OCIO.Config.VirtualViewsAreEqual(cfg, other, "nonexistent")) + # Remove a view from the virtual display cfg.removeVirtualDisplayView("Raw") - self.assertFalse(OCIO.Config.VirtualViewsAreEqual(cfg, other, "Raw")) self.assertFalse(cfg.hasVirtualView("Raw")) + self.assertTrue(other.hasVirtualView("Raw")) + + self.assertFalse(OCIO.Config.VirtualViewsAreEqual(cfg, other, "Raw")) self.assertEqual( 1, @@ -911,6 +941,10 @@ def test_virtual_display(self): self.assertFalse(cfg.hasVirtualView("sview2")) self.assertFalse(cfg.virtualViewIsShared("sview2")) + + self.assertTrue(other.hasVirtualView("sview2")) + self.assertTrue(other.virtualViewIsShared("sview2")) + self.assertFalse(OCIO.Config.VirtualViewsAreEqual(cfg, other, "sview2")) cfg.addVirtualDisplaySharedView("sview2") From 99d973eaeacb00d268fbb3cc229289006c5323d8 Mon Sep 17 00:00:00 2001 From: annie Date: Sat, 17 May 2025 13:24:49 +0300 Subject: [PATCH 16/17] restore old tests to Config_tests.cpp and move new tests compare_displays, compare_virtual_displays to Display_tests.cpp Signed-off-by: annie --- tests/cpu/Config_tests.cpp | 557 ++++++----------------------------- tests/cpu/Display_tests.cpp | 559 ++++++++++++++++++++++++++++++------ 2 files changed, 558 insertions(+), 558 deletions(-) diff --git a/tests/cpu/Config_tests.cpp b/tests/cpu/Config_tests.cpp index 516fc29bb7..a5c3092995 100644 --- a/tests/cpu/Config_tests.cpp +++ b/tests/cpu/Config_tests.cpp @@ -3689,279 +3689,64 @@ OCIO_ADD_TEST(Config, view) } } -OCIO_ADD_TEST(Config, compare_displays) { - static constexpr char CONFIG1[]{ R"(ocio_profile_version: 2 - -roles: - default: raw - -file_rules: - - ! {name: Default, colorspace: default} - -shared_views: - - ! {name: sview1, colorspace: raw} - -displays: - Raw: - - ! {name: Raw, colorspace: raw} - sRGB: - - ! {name: Raw, colorspace: raw} - - ! {name: view, view_transform: display_vt, display_colorspace: display_cs} - - ! [sview1] - -active_displays: [sRGB] -active_views: [view, sview1] - -view_transforms: - - ! - name: default_vt - to_scene_reference: ! {sat: 1.5} - - - ! - name: display_vt - to_display_reference: ! {sat: 1.5} - -display_colorspaces: - - ! - name: display_cs - to_display_reference: ! {sat: 1.5} - -colorspaces: - - ! - name: raw -)" }; - - static constexpr char CONFIG2[]{ R"(ocio_profile_version: 2 - -roles: - default: raw - -file_rules: - - ! {name: Default, colorspace: default} - -shared_views: - - ! {name: view, view_transform: display_vt, display_colorspace: display_cs} - - ! {name: sview1, colorspace: raw} - -displays: - Raw: - - ! {name: Raw, colorspace: raw} - sRGB: - - ! {name: Raw, colorspace: raw} - - ! [view, sview1] - -active_displays: [Raw] -active_views: [Raw] - -view_transforms: - - ! - name: default_vt - to_scene_reference: ! {sat: 1.5} - - - ! - name: display_vt - to_display_reference: ! {sat: 1.5} - -display_colorspaces: - - ! - name: display_cs - to_display_reference: ! {sat: 1.5} - -colorspaces: - - ! - name: raw -)" }; - - std::istringstream is; - is.str(CONFIG1); - OCIO::ConstConfigRcPtr config1, config2; - OCIO_CHECK_NO_THROW(config1 = OCIO::Config::CreateFromStream(is)); - is.clear(); - is.str(CONFIG2); - OCIO_CHECK_NO_THROW(config2 = OCIO::Config::CreateFromStream(is)); - OCIO_CHECK_NO_THROW(config1->validate()); - OCIO_CHECK_NO_THROW(config2->validate()); - - { - // Test that Config::ViewsAreEqual works for a matching (display, view) pair across separate configs. - // Works regardless of if the view is display-defined in one config and shared in the other. - // Works regardless of if the (display, view) pair is active in one config and inactive in another. - - // Active (display, view) pair where the view is display-defined. - OCIO_REQUIRE_EQUAL(1, config1->getNumDisplays()); - OCIO_REQUIRE_EQUAL(std::string("sRGB"), config1->getDefaultDisplay()); - - OCIO_CHECK_EQUAL(2, config1->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "sRGB")); - OCIO_CHECK_EQUAL(std::string("Raw"), config1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 0)); - OCIO_CHECK_EQUAL(std::string("view"), config1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 1)); - - OCIO_CHECK_ASSERT(!config1->viewIsShared("sRGB", "view")); - - OCIO_CHECK_EQUAL(2, config1->getNumViews("sRGB")); - OCIO_CHECK_EQUAL(std::string("view"), config1->getView("sRGB", 0)); - - // Inactive (display, view) pair where the view is a reference to a shared view. - OCIO_REQUIRE_EQUAL(1, config2->getNumDisplays()); - OCIO_CHECK_EQUAL(std::string("Raw"), config2->getDefaultDisplay()); - OCIO_CHECK_EQUAL(1, config2->getNumViews("Raw")); - OCIO_CHECK_EQUAL(std::string("Raw"), config2->getDefaultView("Raw")); - - OCIO_REQUIRE_EQUAL(config2->getNumDisplaysAll(), 2); - OCIO_CHECK_EQUAL(config2->getDisplayAll(1), std::string("sRGB")); - - OCIO_CHECK_EQUAL(2, config2->getNumViews(OCIO::VIEW_SHARED, "sRGB")); - OCIO_CHECK_EQUAL(std::string("view"), config2->getView(OCIO::VIEW_SHARED, "sRGB", 0)); - OCIO_CHECK_EQUAL(std::string("sview1"), config2->getView(OCIO::VIEW_SHARED, "sRGB", 1)); - - OCIO_CHECK_ASSERT(config2->viewIsShared("sRGB", "view")); - - OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config1, config2, "sRGB", "view")); - - } - - { - // Test that Config::ViewsAreEqual works for a matching (display, view) pair across separate configs, - // even if the pair is active in one config and inactive in another. Both views are display-defined. - - // Inactive (display, view) pair where the view is display-defined. - OCIO_REQUIRE_EQUAL(1, config1->getNumDisplays()); - OCIO_CHECK_EQUAL(std::string("sRGB"), config1->getDefaultDisplay()); - OCIO_CHECK_EQUAL(config1->getDisplayAll(0), std::string("Raw")); - OCIO_CHECK_EQUAL(1, config1->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "Raw")); - OCIO_CHECK_EQUAL(std::string("Raw"), config1->getView(OCIO::VIEW_DISPLAY_DEFINED, "Raw", 0)); - OCIO_CHECK_ASSERT(!config1->viewIsShared("Raw", "Raw")); - - // Active (display, view) pair where the view is display-defined. - OCIO_REQUIRE_EQUAL(1, config2->getNumDisplays()); - OCIO_CHECK_EQUAL(std::string("Raw"), config2->getDefaultDisplay()); - OCIO_CHECK_EQUAL(1, config2->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "Raw")); - OCIO_CHECK_EQUAL(std::string("Raw"), config2->getView(OCIO::VIEW_DISPLAY_DEFINED, "Raw", 0)); - OCIO_CHECK_ASSERT(!config2->viewIsShared("Raw", "Raw")); - - OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config1, config2, "Raw", "Raw")); - } - - { - // Test that Config::ViewsAreEqual works for a matching (display, view) pair across separate configs, even - // if the pair is active in one config and inactive in another. Both views are reference to a shared view. - - // Active (display, view) pair where the view is a reference to a shared view. - OCIO_CHECK_EQUAL(1, config1->getNumViews(OCIO::VIEW_SHARED, "sRGB")); - OCIO_CHECK_EQUAL(std::string("sview1"), config1->getView(OCIO::VIEW_SHARED, "sRGB", 0)); - OCIO_CHECK_ASSERT(config1->viewIsShared("sRGB", "sview1")); - - // Inactive (display, view) pair where the view is a reference to a shared view. - OCIO_CHECK_EQUAL(2, config2->getNumViews(OCIO::VIEW_SHARED, "sRGB")); - OCIO_CHECK_EQUAL(std::string("view"), config2->getView(OCIO::VIEW_SHARED, "sRGB", 0)); - OCIO_CHECK_EQUAL(std::string("sview1"), config2->getView(OCIO::VIEW_SHARED, "sRGB", 1)); - OCIO_CHECK_ASSERT(config2->viewIsShared("sRGB", "sview1")); - - OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config1, config2, "sRGB", "sview1")); - } - - { - // Check that displayHasView method works if (display, view) pair exists regardless of whether the display or view - // are active and regardless of whether the view is display-defined or if the view is a reference to a shared view. - - OCIO::ConfigRcPtr cfg1 = config1->createEditableCopy(); - OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "Raw" )); // Active display has inactive view (display-defined). - OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "view" )); // Active display has active view (display-defined). - OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "sview1")); // Active display has active view (shared). - OCIO_CHECK_ASSERT(cfg1->displayHasView("Raw" , "Raw" )); // Inactive display has inactive view (display-defined). - - OCIO_CHECK_NO_THROW(cfg1->setActiveDisplays("Raw")); - OCIO_CHECK_EQUAL(1, cfg1->getNumDisplays()); - OCIO_CHECK_EQUAL(std::string("Raw"), cfg1->getDefaultDisplay()); - - OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "sview1")); // Inactive display has active view (shared). - - OCIO_CHECK_NO_THROW(cfg1->setActiveViews("Raw")); - OCIO_REQUIRE_EQUAL(cfg1->getNumViews("sRGB"), 1); - OCIO_CHECK_EQUAL(cfg1->getView("sRGB", 0), std::string("Raw")); - - OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB" , "Raw" )); // Inactive display has active view (display-defined). - OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "sview1")); // Inactive display has inactive view (shared). - - OCIO_CHECK_NO_THROW(cfg1->setActiveDisplays("sRGB")); - OCIO_CHECK_EQUAL(1, cfg1->getNumDisplays()); - OCIO_CHECK_EQUAL(std::string("sRGB"), cfg1->getDefaultDisplay()); - - OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "sview1")); // Active display has inactive view (shared). - } - - { - // Test when a display exists, but a view doesn't exist. - - OCIO::ConfigRcPtr cfg1 = config1->createEditableCopy(); - - OCIO_CHECK_EQUAL(std::string("sRGB"), cfg1->getDefaultDisplay()); - OCIO_CHECK_EQUAL(2, cfg1->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "sRGB")); - OCIO_CHECK_EQUAL(std::string("Raw"), cfg1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 0)); - OCIO_CHECK_EQUAL(std::string("view"), cfg1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 1)); - - OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "Raw")); - OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config1, cfg1, "sRGB", "Raw")); - - // Remove the view from the display. - OCIO_CHECK_NO_THROW(cfg1->removeDisplayView("sRGB", "Raw")); - OCIO_CHECK_EQUAL(1, cfg1->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "sRGB")); - OCIO_CHECK_EQUAL(std::string("view"), cfg1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 0)); - - OCIO_CHECK_ASSERT(!cfg1->displayHasView("sRGB", "Raw")); - OCIO_CHECK_ASSERT(!OCIO::Config::ViewsAreEqual(config1, cfg1, "sRGB", "Raw")); - } - - { - // Test when a view exists, but a display doesn't exist. - - OCIO::ConfigRcPtr cfg2 = config2->createEditableCopy(); - - OCIO_CHECK_EQUAL(std::string("Raw"), cfg2->getDefaultDisplay()); - OCIO_REQUIRE_EQUAL(1, cfg2->getNumViews("Raw")); - OCIO_REQUIRE_EQUAL(std::string("Raw"), cfg2->getView("Raw", 0)); - OCIO_CHECK_EQUAL(std::string("Raw"), cfg2->getActiveViews()); - - OCIO_CHECK_ASSERT(cfg2->displayHasView("Raw", "Raw")); - OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config2, cfg2, "Raw", "Raw")); - - // Remove the view from the display and the display itself since it only has no more views. - OCIO_REQUIRE_EQUAL(2, cfg2->getNumDisplaysAll()); - OCIO_CHECK_NO_THROW(cfg2->removeDisplayView("Raw", "Raw")); - OCIO_REQUIRE_EQUAL(1, cfg2->getNumDisplaysAll()); - - // The view is still active. - OCIO_REQUIRE_EQUAL(std::string("Raw"), cfg2->getActiveViews()); - - OCIO_CHECK_ASSERT(!cfg2->displayHasView("Raw", "Raw")); - OCIO_CHECK_ASSERT(!OCIO::Config::ViewsAreEqual(config2, cfg2, "Raw", "Raw")); - } - - { - // Test access of config-level shared views for displayHasView method. +OCIO_ADD_TEST(Config, display_view_order) +{ + constexpr char SIMPLE_CONFIG[] { R"( + ocio_profile_version: 2 + + environment: + {} + + displays: + sRGB_B: + - ! {name: View_2, colorspace: raw} + - ! {name: View_1, colorspace: raw} + sRGB_D: + - ! {name: View_2, colorspace: raw} + - ! {name: View_3, colorspace: raw} + sRGB_A: + - ! {name: View_3, colorspace: raw} + - ! {name: View_1, colorspace: raw} + sRGB_C: + - ! {name: View_4, colorspace: raw} + - ! {name: View_1, colorspace: raw} + + colorspaces: + - ! + name: raw + allocation: uniform + + - ! + name: lnh + allocation: uniform + + file_rules: + - ! {name: Default, colorspace: raw} + )" }; + + std::istringstream is(SIMPLE_CONFIG); + OCIO::ConstConfigRcPtr config; + OCIO_CHECK_NO_THROW(config = OCIO::Config::CreateFromStream(is)); + OCIO_CHECK_NO_THROW(config->validate()); - OCIO::ConfigRcPtr cfg1 = config1->createEditableCopy(); + OCIO_REQUIRE_EQUAL(config->getNumDisplays(), 4); - OCIO_CHECK_EQUAL(1, cfg1->getNumViews(OCIO::VIEW_SHARED, "sRGB")); - OCIO_CHECK_EQUAL(std::string("sview1"), cfg1->getView(OCIO::VIEW_SHARED, "sRGB", 0)); - OCIO_CHECK_ASSERT(cfg1->viewIsShared("sRGB", "sview1")); + // When active_displays is not defined, the displays are returned in config order. - OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "sview1")); + OCIO_CHECK_EQUAL(std::string(config->getDefaultDisplay()), "sRGB_B"); - // Remove the shared view from the display. - OCIO_CHECK_NO_THROW(cfg1->removeDisplayView("sRGB", "sview1")); - OCIO_REQUIRE_EQUAL(std::string("sRGB"), config1->getDefaultDisplay()); - OCIO_CHECK_EQUAL(0, cfg1->getNumViews(OCIO::VIEW_SHARED, "sRGB")); + OCIO_CHECK_EQUAL(std::string(config->getDisplay(0)), "sRGB_B"); + OCIO_CHECK_EQUAL(std::string(config->getDisplay(1)), "sRGB_D"); + OCIO_CHECK_EQUAL(std::string(config->getDisplay(2)), "sRGB_A"); + OCIO_CHECK_EQUAL(std::string(config->getDisplay(3)), "sRGB_C"); - // Shared view still exists in the config. - OCIO_CHECK_EQUAL(1, cfg1->getNumViews(OCIO::VIEW_SHARED, nullptr)); - OCIO_CHECK_EQUAL(std::string("sview1"), cfg1->getView(OCIO::VIEW_SHARED, nullptr, 0)); - OCIO_CHECK_ASSERT(cfg1->viewIsShared(nullptr, "sview1")); + // When active_views is not defined, the views are returned in config order. - OCIO_CHECK_ASSERT(!cfg1->displayHasView("sRGB", "sview1")); + OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_B")), "View_2"); - // When display name is null, displayHasView will only check config level shared views. - OCIO_CHECK_ASSERT(cfg1->displayHasView(nullptr, "sview1")); - } + OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_B"), 2); + OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_B", 0)), "View_2"); + OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_B", 1)), "View_1"); } OCIO_ADD_TEST(Config, log_serialization) @@ -9101,57 +8886,11 @@ OCIO_ADD_TEST(Config, virtual_display_v2_only) "Only version 2 (or higher) can have a virtual display."); } -OCIO_ADD_TEST(Config, compare_virtual_displays) { - static constexpr char CONFIG1[]{ R"(ocio_profile_version: 2 - -roles: - default: raw - -file_rules: - - ! {name: Default, colorspace: default} - -viewing_rules: - - ! {name: Linear, colorspaces: default} - -shared_views: - - ! {name: Film, view_transform: display_vt, display_colorspace: , looks: look1, rule: Linear, description: Test view} - - ! {name: view, view_transform: display_vt, display_colorspace: display_cs} - -displays: - Raw: - - ! {name: Raw, colorspace: raw} - sRGB: - - ! {name: Raw, colorspace: raw} - -virtual_display: - - ! {name: Raw, colorspace: raw} - - ! [Film, view] - -looks: - - ! - name: look1 - process_space: default - -view_transforms: - - ! - name: default_vt - to_scene_reference: ! {sat: 1.5} - - - ! - name: display_vt - to_display_reference: ! {sat: 1.5} - -display_colorspaces: - - ! - name: display_cs - to_display_reference: ! {sat: 1.5} - -colorspaces: - - ! - name: raw -)" }; +OCIO_ADD_TEST(Config, virtual_display_exceptions) +{ + // Test the validations around the virtual display definition. - static constexpr char CONFIG2[]{ R"(ocio_profile_version: 2 + static constexpr char CONFIG[]{ R"(ocio_profile_version: 2 roles: default: raw @@ -9159,28 +8898,16 @@ OCIO_ADD_TEST(Config, compare_virtual_displays) { file_rules: - ! {name: Default, colorspace: default} -viewing_rules: - - ! {name: Linear, colorspaces: default} - shared_views: - - ! {name: view, view_transform: display_vt, display_colorspace: display_cs} + - ! {name: sview1, colorspace: raw} displays: Raw: - ! {name: Raw, colorspace: raw} - sRGB: - - ! {name: Raw, colorspace: raw} - - ! [view] virtual_display: - ! {name: Raw, colorspace: raw} - - ! {name: Film, view_transform: display_vt, display_colorspace: , looks: look1, rule: Linear, description: Test view} - - ! [view] - -looks: - - ! - name: look1 - process_space: default + - ! [sview1] view_transforms: - ! @@ -9201,152 +8928,50 @@ OCIO_ADD_TEST(Config, compare_virtual_displays) { name: raw )" }; - std::istringstream is; - is.str(CONFIG1); - OCIO::ConstConfigRcPtr config1, config2; - OCIO_CHECK_NO_THROW(config1 = OCIO::Config::CreateFromStream(is)); - is.clear(); - is.str(CONFIG2); - OCIO_CHECK_NO_THROW(config2 = OCIO::Config::CreateFromStream(is)); - OCIO_CHECK_NO_THROW(config1->validate()); - OCIO_CHECK_NO_THROW(config2->validate()); - - { - // Test that Config::VirtualViewsAreEqual works for a matching virtual view pair across separate configs. - // Works regardless of if the virtual view is display-defined in one config and shared in the other. - - // Virtual view is a reference to a shared view. - OCIO_REQUIRE_EQUAL(2, config1->getVirtualDisplayNumViews(OCIO::VIEW_SHARED)); - - const char * viewName1 = config1->getVirtualDisplayView(OCIO::VIEW_SHARED, 0); - - OCIO_CHECK_EQUAL(std::string("Film"), viewName1); - OCIO_CHECK_EQUAL(std::string("display_vt"), config1->getVirtualDisplayViewTransformName(viewName1)); - OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewColorSpaceName(viewName1)); - OCIO_CHECK_EQUAL(std::string("look1"), config1->getVirtualDisplayViewLooks(viewName1)); - OCIO_CHECK_EQUAL(std::string("Linear"), config1->getVirtualDisplayViewRule(viewName1)); - OCIO_CHECK_EQUAL(std::string("Test view"), config1->getVirtualDisplayViewDescription(viewName1)); - - // Virtual view is a reference to a display-defined view. - OCIO_REQUIRE_EQUAL(2, config2->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); - - const char * viewName2 = config2->getVirtualDisplayView(OCIO::VIEW_DISPLAY_DEFINED, 1); - - OCIO_CHECK_EQUAL(std::string("Film"), viewName2); - OCIO_CHECK_EQUAL(std::string("display_vt"), config2->getVirtualDisplayViewTransformName(viewName2)); - OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewColorSpaceName(viewName2)); - OCIO_CHECK_EQUAL(std::string("look1"), config2->getVirtualDisplayViewLooks(viewName2)); - OCIO_CHECK_EQUAL(std::string("Linear"), config2->getVirtualDisplayViewRule(viewName2)); - OCIO_CHECK_EQUAL(std::string("Test view"), config2->getVirtualDisplayViewDescription(viewName2)); - - OCIO_CHECK_EQUAL(std::string(viewName1), std::string(viewName2)); - OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config1, config2, viewName1)); - } - { - // Virtual views are both display-defined. - OCIO_REQUIRE_EQUAL(1, config1->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); - - const char * viewName1 = config1->getVirtualDisplayView(OCIO::VIEW_DISPLAY_DEFINED, 0); - - OCIO_CHECK_EQUAL(std::string("Raw"), viewName1); - OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewTransformName(viewName1)); - OCIO_CHECK_EQUAL(std::string("raw"), config1->getVirtualDisplayViewColorSpaceName(viewName1)); - OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewLooks(viewName1)); - OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewRule(viewName1)); - OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewDescription(viewName1)); - - const char * viewName2 = config2->getVirtualDisplayView(OCIO::VIEW_DISPLAY_DEFINED, 0); - - OCIO_CHECK_EQUAL(std::string("Raw"), viewName2); - OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewTransformName(viewName2)); - OCIO_CHECK_EQUAL(std::string("raw"), config2->getVirtualDisplayViewColorSpaceName(viewName2)); - OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewLooks(viewName2)); - OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewRule(viewName2)); - OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewDescription(viewName2)); - - OCIO_CHECK_EQUAL(std::string(viewName1), std::string(viewName2)); - OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config1, config2, viewName1)); - } - { - // Virtual views are both shared. - const char * viewName1 = config1->getVirtualDisplayView(OCIO::VIEW_SHARED, 1); - - OCIO_CHECK_EQUAL(std::string("view"), viewName1); - OCIO_CHECK_EQUAL(std::string("display_vt"), config1->getVirtualDisplayViewTransformName(viewName1)); - OCIO_CHECK_EQUAL(std::string("display_cs"), config1->getVirtualDisplayViewColorSpaceName(viewName1)); - OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewLooks(viewName1)); - OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewRule(viewName1)); - OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewDescription(viewName1)); - - OCIO_REQUIRE_EQUAL(1, config2->getVirtualDisplayNumViews(OCIO::VIEW_SHARED)); - - const char * viewName2 = config2->getVirtualDisplayView(OCIO::VIEW_SHARED, 0); - - OCIO_CHECK_EQUAL(std::string("view"), viewName2); - OCIO_CHECK_EQUAL(std::string("display_vt"), config2->getVirtualDisplayViewTransformName(viewName2)); - OCIO_CHECK_EQUAL(std::string("display_cs"), config2->getVirtualDisplayViewColorSpaceName(viewName2)); - OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewLooks(viewName2)); - OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewRule(viewName2)); - OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewDescription(viewName2)); - - OCIO_CHECK_EQUAL(std::string(viewName1), std::string(viewName2)); - OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config1, config2, viewName1)); - - OCIO_CHECK_EQUAL(std::string(viewName1), std::string(viewName2)); - OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config1, config2, viewName1)); - } - { - // Test when a shared virtual view exists in one config but not the other. - OCIO::ConfigRcPtr cfg = config1->createEditableCopy(); - - OCIO_CHECK_ASSERT(config1->hasVirtualView("Film")); - OCIO_CHECK_ASSERT(config1->virtualViewIsShared("Film")); - - OCIO_REQUIRE_EQUAL(2, cfg->getVirtualDisplayNumViews(OCIO::VIEW_SHARED)); - OCIO_CHECK_ASSERT(cfg->hasVirtualView("Film")); - OCIO_CHECK_ASSERT(cfg->virtualViewIsShared("Film")); - - OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config1, cfg, "Film")); + std::istringstream iss; + iss.str(CONFIG); - // Check against another config where the virtual view is display-defined. - OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config2, cfg, "Film")); + OCIO::ConfigRcPtr cfg; + OCIO_CHECK_NO_THROW(cfg = OCIO::Config::CreateFromStream(iss)->createEditableCopy()); + OCIO_CHECK_NO_THROW(cfg->validate()); - // Remove a shared view from the virtual display. - cfg->removeVirtualDisplayView("Film"); + // Test failures for shared views. - OCIO_REQUIRE_EQUAL(1, cfg->getVirtualDisplayNumViews(OCIO::VIEW_SHARED)); - OCIO_CHECK_ASSERT(!cfg->hasVirtualView("Film")); - OCIO_CHECK_ASSERT(!cfg->virtualViewIsShared("Film")); + OCIO_CHECK_THROW_WHAT(cfg->addVirtualDisplaySharedView("sview1"), + OCIO::Exception, + "Shared view could not be added to virtual_display: There is already a" + " shared view named 'sview1'."); - OCIO_CHECK_ASSERT(!OCIO::Config::VirtualViewsAreEqual(config1, cfg, "Film")); - OCIO_CHECK_ASSERT(!OCIO::Config::VirtualViewsAreEqual(config2, cfg, "Film")); - } - { - // Test when a display-defined virtual view exists in one config but not the other. - OCIO::ConfigRcPtr cfg = config2->createEditableCopy(); + OCIO_CHECK_NO_THROW(cfg->addVirtualDisplaySharedView("sview2")); + OCIO_CHECK_THROW_WHAT(cfg->validate(), + OCIO::Exception, + "The display 'virtual_display' contains a shared view 'sview2' that is" + " not defined."); - // Remove a display-defined view from the virtual display. - OCIO_CHECK_ASSERT(config2->hasVirtualView("Film")); - OCIO_CHECK_ASSERT(!config2->virtualViewIsShared("Film")); // Confirm display-defined + cfg->removeVirtualDisplayView("sview2"); + OCIO_CHECK_NO_THROW(cfg->validate()); - OCIO_REQUIRE_EQUAL(2, cfg->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); - OCIO_CHECK_ASSERT(cfg->hasVirtualView("Film")); - OCIO_CHECK_ASSERT(!cfg->virtualViewIsShared("Film")); // Confirm display-defined + // Test failures for views. - OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config2, cfg, "Film")); + OCIO_CHECK_THROW_WHAT(cfg->addVirtualDisplayView("Raw", nullptr, "raw", nullptr, nullptr, nullptr), + OCIO::Exception, + "View could not be added to virtual_display in config: View 'Raw' already" + " exists."); - // Check against another config where the virtual view is a reference to a shared view. - OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config1, cfg, "Film")); + OCIO_CHECK_NO_THROW(cfg->addVirtualDisplayView("Raw1", nullptr, "raw1", nullptr, nullptr, nullptr)); + OCIO_CHECK_THROW_WHAT(cfg->validate(), + OCIO::Exception, + "Display 'virtual_display' has a view 'Raw1' that refers to a color space" + " or a named transform, 'raw1', which is not defined."); - // Remove a display-defined view from the virtual display. - cfg->removeVirtualDisplayView("Film"); + cfg->removeVirtualDisplayView("Raw1"); + OCIO_CHECK_NO_THROW(cfg->validate()); - OCIO_REQUIRE_EQUAL(1, cfg->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); - OCIO_CHECK_ASSERT(!cfg->hasVirtualView("Film")); - - OCIO_CHECK_ASSERT(!OCIO::Config::VirtualViewsAreEqual(config2, cfg, "Film")); - OCIO_CHECK_ASSERT(!OCIO::Config::VirtualViewsAreEqual(config1, cfg, "Film")); - } + OCIO_CHECK_NO_THROW(cfg->addVirtualDisplayView("Raw1", nullptr, "raw", "look", nullptr, nullptr)); + OCIO_CHECK_THROW_WHAT(cfg->validate(), + OCIO::Exception, + "Display 'virtual_display' has a view 'Raw1' refers to a look, 'look'," + " which is not defined."); } OCIO_ADD_TEST(Config, description_and_name) diff --git a/tests/cpu/Display_tests.cpp b/tests/cpu/Display_tests.cpp index f44242c98c..03ef992ba8 100644 --- a/tests/cpu/Display_tests.cpp +++ b/tests/cpu/Display_tests.cpp @@ -239,71 +239,49 @@ OCIO_ADD_TEST(SharedViews, basic) OCIO_REQUIRE_EQUAL(0, config->getNumViews(OCIO::VIEW_SHARED, nullptr)); } -OCIO_ADD_TEST(Config, display_view_order) -{ - constexpr char SIMPLE_CONFIG[] { R"( - ocio_profile_version: 2 - - environment: - {} - - displays: - sRGB_B: - - ! {name: View_2, colorspace: raw} - - ! {name: View_1, colorspace: raw} - sRGB_D: - - ! {name: View_2, colorspace: raw} - - ! {name: View_3, colorspace: raw} - sRGB_A: - - ! {name: View_3, colorspace: raw} - - ! {name: View_1, colorspace: raw} - sRGB_C: - - ! {name: View_4, colorspace: raw} - - ! {name: View_1, colorspace: raw} - - colorspaces: - - ! - name: raw - allocation: uniform - - - ! - name: lnh - allocation: uniform - - file_rules: - - ! {name: Default, colorspace: raw} - )" }; - - std::istringstream is(SIMPLE_CONFIG); - OCIO::ConstConfigRcPtr config; - OCIO_CHECK_NO_THROW(config = OCIO::Config::CreateFromStream(is)); - OCIO_CHECK_NO_THROW(config->validate()); +OCIO_ADD_TEST(Config, compare_displays) { + static constexpr char CONFIG1[]{ R"(ocio_profile_version: 2 - OCIO_REQUIRE_EQUAL(config->getNumDisplays(), 4); +roles: + default: raw - // When active_displays is not defined, the displays are returned in config order. +file_rules: + - ! {name: Default, colorspace: default} - OCIO_CHECK_EQUAL(std::string(config->getDefaultDisplay()), "sRGB_B"); +shared_views: + - ! {name: sview1, colorspace: raw} - OCIO_CHECK_EQUAL(std::string(config->getDisplay(0)), "sRGB_B"); - OCIO_CHECK_EQUAL(std::string(config->getDisplay(1)), "sRGB_D"); - OCIO_CHECK_EQUAL(std::string(config->getDisplay(2)), "sRGB_A"); - OCIO_CHECK_EQUAL(std::string(config->getDisplay(3)), "sRGB_C"); +displays: + Raw: + - ! {name: Raw, colorspace: raw} + sRGB: + - ! {name: Raw, colorspace: raw} + - ! {name: view, view_transform: display_vt, display_colorspace: display_cs} + - ! [sview1] - // When active_views is not defined, the views are returned in config order. +active_displays: [sRGB] +active_views: [view, sview1] - OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_B")), "View_2"); +view_transforms: + - ! + name: default_vt + to_scene_reference: ! {sat: 1.5} - OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_B"), 2); - OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_B", 0)), "View_2"); - OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_B", 1)), "View_1"); -} + - ! + name: display_vt + to_display_reference: ! {sat: 1.5} -OCIO_ADD_TEST(Config, virtual_display_exceptions) -{ - // Test the validations around the virtual display definition. +display_colorspaces: + - ! + name: display_cs + to_display_reference: ! {sat: 1.5} - static constexpr char CONFIG[]{ R"(ocio_profile_version: 2 +colorspaces: + - ! + name: raw +)" }; + + static constexpr char CONFIG2[]{ R"(ocio_profile_version: 2 roles: default: raw @@ -312,15 +290,260 @@ OCIO_ADD_TEST(Config, virtual_display_exceptions) - ! {name: Default, colorspace: default} shared_views: + - ! {name: view, view_transform: display_vt, display_colorspace: display_cs} - ! {name: sview1, colorspace: raw} displays: Raw: - ! {name: Raw, colorspace: raw} + sRGB: + - ! {name: Raw, colorspace: raw} + - ! [view, sview1] + +active_displays: [Raw] +active_views: [Raw] + +view_transforms: + - ! + name: default_vt + to_scene_reference: ! {sat: 1.5} + + - ! + name: display_vt + to_display_reference: ! {sat: 1.5} + +display_colorspaces: + - ! + name: display_cs + to_display_reference: ! {sat: 1.5} + +colorspaces: + - ! + name: raw +)" }; + + std::istringstream is; + is.str(CONFIG1); + OCIO::ConstConfigRcPtr config1, config2; + OCIO_CHECK_NO_THROW(config1 = OCIO::Config::CreateFromStream(is)); + is.clear(); + is.str(CONFIG2); + OCIO_CHECK_NO_THROW(config2 = OCIO::Config::CreateFromStream(is)); + OCIO_CHECK_NO_THROW(config1->validate()); + OCIO_CHECK_NO_THROW(config2->validate()); + + { + // Test that Config::ViewsAreEqual works for a matching (display, view) pair across separate configs. + // Works regardless of if the view is display-defined in one config and shared in the other. + // Works regardless of if the (display, view) pair is active in one config and inactive in another. + + // Active (display, view) pair where the view is display-defined. + OCIO_REQUIRE_EQUAL(1, config1->getNumDisplays()); + OCIO_REQUIRE_EQUAL(std::string("sRGB"), config1->getDefaultDisplay()); + + OCIO_CHECK_EQUAL(2, config1->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "sRGB")); + OCIO_CHECK_EQUAL(std::string("Raw"), config1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 0)); + OCIO_CHECK_EQUAL(std::string("view"), config1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 1)); + + OCIO_CHECK_ASSERT(!config1->viewIsShared("sRGB", "view")); + + OCIO_CHECK_EQUAL(2, config1->getNumViews("sRGB")); + OCIO_CHECK_EQUAL(std::string("view"), config1->getView("sRGB", 0)); + + // Inactive (display, view) pair where the view is a reference to a shared view. + OCIO_REQUIRE_EQUAL(1, config2->getNumDisplays()); + OCIO_CHECK_EQUAL(std::string("Raw"), config2->getDefaultDisplay()); + OCIO_CHECK_EQUAL(1, config2->getNumViews("Raw")); + OCIO_CHECK_EQUAL(std::string("Raw"), config2->getDefaultView("Raw")); + + OCIO_REQUIRE_EQUAL(config2->getNumDisplaysAll(), 2); + OCIO_CHECK_EQUAL(config2->getDisplayAll(1), std::string("sRGB")); + + OCIO_CHECK_EQUAL(2, config2->getNumViews(OCIO::VIEW_SHARED, "sRGB")); + OCIO_CHECK_EQUAL(std::string("view"), config2->getView(OCIO::VIEW_SHARED, "sRGB", 0)); + OCIO_CHECK_EQUAL(std::string("sview1"), config2->getView(OCIO::VIEW_SHARED, "sRGB", 1)); + + OCIO_CHECK_ASSERT(config2->viewIsShared("sRGB", "view")); + + OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config1, config2, "sRGB", "view")); + + } + + { + // Test that Config::ViewsAreEqual works for a matching (display, view) pair across separate configs, + // even if the pair is active in one config and inactive in another. Both views are display-defined. + + // Inactive (display, view) pair where the view is display-defined. + OCIO_REQUIRE_EQUAL(1, config1->getNumDisplays()); + OCIO_CHECK_EQUAL(std::string("sRGB"), config1->getDefaultDisplay()); + OCIO_CHECK_EQUAL(config1->getDisplayAll(0), std::string("Raw")); + OCIO_CHECK_EQUAL(1, config1->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "Raw")); + OCIO_CHECK_EQUAL(std::string("Raw"), config1->getView(OCIO::VIEW_DISPLAY_DEFINED, "Raw", 0)); + OCIO_CHECK_ASSERT(!config1->viewIsShared("Raw", "Raw")); + + // Active (display, view) pair where the view is display-defined. + OCIO_REQUIRE_EQUAL(1, config2->getNumDisplays()); + OCIO_CHECK_EQUAL(std::string("Raw"), config2->getDefaultDisplay()); + OCIO_CHECK_EQUAL(1, config2->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "Raw")); + OCIO_CHECK_EQUAL(std::string("Raw"), config2->getView(OCIO::VIEW_DISPLAY_DEFINED, "Raw", 0)); + OCIO_CHECK_ASSERT(!config2->viewIsShared("Raw", "Raw")); + + OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config1, config2, "Raw", "Raw")); + } + + { + // Test that Config::ViewsAreEqual works for a matching (display, view) pair across separate configs, even + // if the pair is active in one config and inactive in another. Both views are reference to a shared view. + + // Active (display, view) pair where the view is a reference to a shared view. + OCIO_CHECK_EQUAL(1, config1->getNumViews(OCIO::VIEW_SHARED, "sRGB")); + OCIO_CHECK_EQUAL(std::string("sview1"), config1->getView(OCIO::VIEW_SHARED, "sRGB", 0)); + OCIO_CHECK_ASSERT(config1->viewIsShared("sRGB", "sview1")); + + // Inactive (display, view) pair where the view is a reference to a shared view. + OCIO_CHECK_EQUAL(2, config2->getNumViews(OCIO::VIEW_SHARED, "sRGB")); + OCIO_CHECK_EQUAL(std::string("view"), config2->getView(OCIO::VIEW_SHARED, "sRGB", 0)); + OCIO_CHECK_EQUAL(std::string("sview1"), config2->getView(OCIO::VIEW_SHARED, "sRGB", 1)); + OCIO_CHECK_ASSERT(config2->viewIsShared("sRGB", "sview1")); + + OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config1, config2, "sRGB", "sview1")); + } + + { + // Check that displayHasView method works if (display, view) pair exists regardless of whether the display or view + // are active and regardless of whether the view is display-defined or if the view is a reference to a shared view. + + OCIO::ConfigRcPtr cfg1 = config1->createEditableCopy(); + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "Raw" )); // Active display has inactive view (display-defined). + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "view" )); // Active display has active view (display-defined). + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "sview1")); // Active display has active view (shared). + OCIO_CHECK_ASSERT(cfg1->displayHasView("Raw" , "Raw" )); // Inactive display has inactive view (display-defined). + + OCIO_CHECK_NO_THROW(cfg1->setActiveDisplays("Raw")); + OCIO_CHECK_EQUAL(1, cfg1->getNumDisplays()); + OCIO_CHECK_EQUAL(std::string("Raw"), cfg1->getDefaultDisplay()); + + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "sview1")); // Inactive display has active view (shared). + + OCIO_CHECK_NO_THROW(cfg1->setActiveViews("Raw")); + OCIO_REQUIRE_EQUAL(cfg1->getNumViews("sRGB"), 1); + OCIO_CHECK_EQUAL(cfg1->getView("sRGB", 0), std::string("Raw")); + + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB" , "Raw" )); // Inactive display has active view (display-defined). + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "sview1")); // Inactive display has inactive view (shared). + + OCIO_CHECK_NO_THROW(cfg1->setActiveDisplays("sRGB")); + OCIO_CHECK_EQUAL(1, cfg1->getNumDisplays()); + OCIO_CHECK_EQUAL(std::string("sRGB"), cfg1->getDefaultDisplay()); + + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "sview1")); // Active display has inactive view (shared). + } + + { + // Test when a display exists, but a view doesn't exist. + + OCIO::ConfigRcPtr cfg1 = config1->createEditableCopy(); + + OCIO_CHECK_EQUAL(std::string("sRGB"), cfg1->getDefaultDisplay()); + OCIO_CHECK_EQUAL(2, cfg1->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "sRGB")); + OCIO_CHECK_EQUAL(std::string("Raw"), cfg1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 0)); + OCIO_CHECK_EQUAL(std::string("view"), cfg1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 1)); + + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "Raw")); + OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config1, cfg1, "sRGB", "Raw")); + + // Remove the view from the display. + OCIO_CHECK_NO_THROW(cfg1->removeDisplayView("sRGB", "Raw")); + OCIO_CHECK_EQUAL(1, cfg1->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "sRGB")); + OCIO_CHECK_EQUAL(std::string("view"), cfg1->getView(OCIO::VIEW_DISPLAY_DEFINED, "sRGB", 0)); + + OCIO_CHECK_ASSERT(!cfg1->displayHasView("sRGB", "Raw")); + OCIO_CHECK_ASSERT(!OCIO::Config::ViewsAreEqual(config1, cfg1, "sRGB", "Raw")); + } + + { + // Test when a view exists, but a display doesn't exist. + + OCIO::ConfigRcPtr cfg2 = config2->createEditableCopy(); + + OCIO_CHECK_EQUAL(std::string("Raw"), cfg2->getDefaultDisplay()); + OCIO_REQUIRE_EQUAL(1, cfg2->getNumViews("Raw")); + OCIO_REQUIRE_EQUAL(std::string("Raw"), cfg2->getView("Raw", 0)); + OCIO_CHECK_EQUAL(std::string("Raw"), cfg2->getActiveViews()); + + OCIO_CHECK_ASSERT(cfg2->displayHasView("Raw", "Raw")); + OCIO_CHECK_ASSERT(OCIO::Config::ViewsAreEqual(config2, cfg2, "Raw", "Raw")); + + // Remove the view from the display and the display itself since it only has no more views. + OCIO_REQUIRE_EQUAL(2, cfg2->getNumDisplaysAll()); + OCIO_CHECK_NO_THROW(cfg2->removeDisplayView("Raw", "Raw")); + OCIO_REQUIRE_EQUAL(1, cfg2->getNumDisplaysAll()); + + // The view is still active. + OCIO_REQUIRE_EQUAL(std::string("Raw"), cfg2->getActiveViews()); + + OCIO_CHECK_ASSERT(!cfg2->displayHasView("Raw", "Raw")); + OCIO_CHECK_ASSERT(!OCIO::Config::ViewsAreEqual(config2, cfg2, "Raw", "Raw")); + } + + { + // Test access of config-level shared views for displayHasView method. + + OCIO::ConfigRcPtr cfg1 = config1->createEditableCopy(); + + OCIO_CHECK_EQUAL(1, cfg1->getNumViews(OCIO::VIEW_SHARED, "sRGB")); + OCIO_CHECK_EQUAL(std::string("sview1"), cfg1->getView(OCIO::VIEW_SHARED, "sRGB", 0)); + OCIO_CHECK_ASSERT(cfg1->viewIsShared("sRGB", "sview1")); + + OCIO_CHECK_ASSERT(cfg1->displayHasView("sRGB", "sview1")); + + // Remove the shared view from the display. + OCIO_CHECK_NO_THROW(cfg1->removeDisplayView("sRGB", "sview1")); + OCIO_REQUIRE_EQUAL(std::string("sRGB"), config1->getDefaultDisplay()); + OCIO_CHECK_EQUAL(0, cfg1->getNumViews(OCIO::VIEW_SHARED, "sRGB")); + + // Shared view still exists in the config. + OCIO_CHECK_EQUAL(1, cfg1->getNumViews(OCIO::VIEW_SHARED, nullptr)); + OCIO_CHECK_EQUAL(std::string("sview1"), cfg1->getView(OCIO::VIEW_SHARED, nullptr, 0)); + OCIO_CHECK_ASSERT(cfg1->viewIsShared(nullptr, "sview1")); + + OCIO_CHECK_ASSERT(!cfg1->displayHasView("sRGB", "sview1")); + + // When display name is null, displayHasView will only check config level shared views. + OCIO_CHECK_ASSERT(cfg1->displayHasView(nullptr, "sview1")); + } +} + +OCIO_ADD_TEST(Config, compare_virtual_displays) { + static constexpr char CONFIG1[]{ R"(ocio_profile_version: 2 + +roles: + default: raw + +file_rules: + - ! {name: Default, colorspace: default} + +viewing_rules: + - ! {name: Linear, colorspaces: default} + +shared_views: + - ! {name: Film, view_transform: display_vt, display_colorspace: , looks: look1, rule: Linear, description: Test view} + - ! {name: view, view_transform: display_vt, display_colorspace: display_cs} + +displays: + Raw: + - ! {name: Raw, colorspace: raw} + sRGB: + - ! {name: Raw, colorspace: raw} virtual_display: - ! {name: Raw, colorspace: raw} - - ! [sview1] + - ! [Film, view] + +looks: + - ! + name: look1 + process_space: default view_transforms: - ! @@ -341,48 +564,200 @@ OCIO_ADD_TEST(Config, virtual_display_exceptions) name: raw )" }; - std::istringstream iss; - iss.str(CONFIG); + static constexpr char CONFIG2[]{ R"(ocio_profile_version: 2 + +roles: + default: raw - OCIO::ConfigRcPtr cfg; - OCIO_CHECK_NO_THROW(cfg = OCIO::Config::CreateFromStream(iss)->createEditableCopy()); - OCIO_CHECK_NO_THROW(cfg->validate()); +file_rules: + - ! {name: Default, colorspace: default} - // Test failures for shared views. +viewing_rules: + - ! {name: Linear, colorspaces: default} - OCIO_CHECK_THROW_WHAT(cfg->addVirtualDisplaySharedView("sview1"), - OCIO::Exception, - "Shared view could not be added to virtual_display: There is already a" - " shared view named 'sview1'."); +shared_views: + - ! {name: view, view_transform: display_vt, display_colorspace: display_cs} + +displays: + Raw: + - ! {name: Raw, colorspace: raw} + sRGB: + - ! {name: Raw, colorspace: raw} + - ! [view] - OCIO_CHECK_NO_THROW(cfg->addVirtualDisplaySharedView("sview2")); - OCIO_CHECK_THROW_WHAT(cfg->validate(), - OCIO::Exception, - "The display 'virtual_display' contains a shared view 'sview2' that is" - " not defined."); +virtual_display: + - ! {name: Raw, colorspace: raw} + - ! {name: Film, view_transform: display_vt, display_colorspace: , looks: look1, rule: Linear, description: Test view} + - ! [view] - cfg->removeVirtualDisplayView("sview2"); - OCIO_CHECK_NO_THROW(cfg->validate()); +looks: + - ! + name: look1 + process_space: default - // Test failures for views. +view_transforms: + - ! + name: default_vt + to_scene_reference: ! {sat: 1.5} - OCIO_CHECK_THROW_WHAT(cfg->addVirtualDisplayView("Raw", nullptr, "raw", nullptr, nullptr, nullptr), - OCIO::Exception, - "View could not be added to virtual_display in config: View 'Raw' already" - " exists."); + - ! + name: display_vt + to_display_reference: ! {sat: 1.5} - OCIO_CHECK_NO_THROW(cfg->addVirtualDisplayView("Raw1", nullptr, "raw1", nullptr, nullptr, nullptr)); - OCIO_CHECK_THROW_WHAT(cfg->validate(), - OCIO::Exception, - "Display 'virtual_display' has a view 'Raw1' that refers to a color space" - " or a named transform, 'raw1', which is not defined."); +display_colorspaces: + - ! + name: display_cs + to_display_reference: ! {sat: 1.5} - cfg->removeVirtualDisplayView("Raw1"); - OCIO_CHECK_NO_THROW(cfg->validate()); +colorspaces: + - ! + name: raw +)" }; - OCIO_CHECK_NO_THROW(cfg->addVirtualDisplayView("Raw1", nullptr, "raw", "look", nullptr, nullptr)); - OCIO_CHECK_THROW_WHAT(cfg->validate(), - OCIO::Exception, - "Display 'virtual_display' has a view 'Raw1' refers to a look, 'look'," - " which is not defined."); -} \ No newline at end of file + std::istringstream is; + is.str(CONFIG1); + OCIO::ConstConfigRcPtr config1, config2; + OCIO_CHECK_NO_THROW(config1 = OCIO::Config::CreateFromStream(is)); + is.clear(); + is.str(CONFIG2); + OCIO_CHECK_NO_THROW(config2 = OCIO::Config::CreateFromStream(is)); + OCIO_CHECK_NO_THROW(config1->validate()); + OCIO_CHECK_NO_THROW(config2->validate()); + + { + // Test that Config::VirtualViewsAreEqual works for a matching virtual view pair across separate configs. + // Works regardless of if the virtual view is display-defined in one config and shared in the other. + + // Virtual view is a reference to a shared view. + OCIO_REQUIRE_EQUAL(2, config1->getVirtualDisplayNumViews(OCIO::VIEW_SHARED)); + + const char * viewName1 = config1->getVirtualDisplayView(OCIO::VIEW_SHARED, 0); + + OCIO_CHECK_EQUAL(std::string("Film"), viewName1); + OCIO_CHECK_EQUAL(std::string("display_vt"), config1->getVirtualDisplayViewTransformName(viewName1)); + OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewColorSpaceName(viewName1)); + OCIO_CHECK_EQUAL(std::string("look1"), config1->getVirtualDisplayViewLooks(viewName1)); + OCIO_CHECK_EQUAL(std::string("Linear"), config1->getVirtualDisplayViewRule(viewName1)); + OCIO_CHECK_EQUAL(std::string("Test view"), config1->getVirtualDisplayViewDescription(viewName1)); + + // Virtual view is a reference to a display-defined view. + OCIO_REQUIRE_EQUAL(2, config2->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); + + const char * viewName2 = config2->getVirtualDisplayView(OCIO::VIEW_DISPLAY_DEFINED, 1); + + OCIO_CHECK_EQUAL(std::string("Film"), viewName2); + OCIO_CHECK_EQUAL(std::string("display_vt"), config2->getVirtualDisplayViewTransformName(viewName2)); + OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewColorSpaceName(viewName2)); + OCIO_CHECK_EQUAL(std::string("look1"), config2->getVirtualDisplayViewLooks(viewName2)); + OCIO_CHECK_EQUAL(std::string("Linear"), config2->getVirtualDisplayViewRule(viewName2)); + OCIO_CHECK_EQUAL(std::string("Test view"), config2->getVirtualDisplayViewDescription(viewName2)); + + OCIO_CHECK_EQUAL(std::string(viewName1), std::string(viewName2)); + OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config1, config2, viewName1)); + } + { + // Virtual views are both display-defined. + OCIO_REQUIRE_EQUAL(1, config1->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); + + const char * viewName1 = config1->getVirtualDisplayView(OCIO::VIEW_DISPLAY_DEFINED, 0); + + OCIO_CHECK_EQUAL(std::string("Raw"), viewName1); + OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewTransformName(viewName1)); + OCIO_CHECK_EQUAL(std::string("raw"), config1->getVirtualDisplayViewColorSpaceName(viewName1)); + OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewLooks(viewName1)); + OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewRule(viewName1)); + OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewDescription(viewName1)); + + const char * viewName2 = config2->getVirtualDisplayView(OCIO::VIEW_DISPLAY_DEFINED, 0); + + OCIO_CHECK_EQUAL(std::string("Raw"), viewName2); + OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewTransformName(viewName2)); + OCIO_CHECK_EQUAL(std::string("raw"), config2->getVirtualDisplayViewColorSpaceName(viewName2)); + OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewLooks(viewName2)); + OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewRule(viewName2)); + OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewDescription(viewName2)); + + OCIO_CHECK_EQUAL(std::string(viewName1), std::string(viewName2)); + OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config1, config2, viewName1)); + } + { + // Virtual views are both shared. + const char * viewName1 = config1->getVirtualDisplayView(OCIO::VIEW_SHARED, 1); + + OCIO_CHECK_EQUAL(std::string("view"), viewName1); + OCIO_CHECK_EQUAL(std::string("display_vt"), config1->getVirtualDisplayViewTransformName(viewName1)); + OCIO_CHECK_EQUAL(std::string("display_cs"), config1->getVirtualDisplayViewColorSpaceName(viewName1)); + OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewLooks(viewName1)); + OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewRule(viewName1)); + OCIO_CHECK_EQUAL(std::string(""), config1->getVirtualDisplayViewDescription(viewName1)); + + OCIO_REQUIRE_EQUAL(1, config2->getVirtualDisplayNumViews(OCIO::VIEW_SHARED)); + + const char * viewName2 = config2->getVirtualDisplayView(OCIO::VIEW_SHARED, 0); + + OCIO_CHECK_EQUAL(std::string("view"), viewName2); + OCIO_CHECK_EQUAL(std::string("display_vt"), config2->getVirtualDisplayViewTransformName(viewName2)); + OCIO_CHECK_EQUAL(std::string("display_cs"), config2->getVirtualDisplayViewColorSpaceName(viewName2)); + OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewLooks(viewName2)); + OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewRule(viewName2)); + OCIO_CHECK_EQUAL(std::string(""), config2->getVirtualDisplayViewDescription(viewName2)); + + OCIO_CHECK_EQUAL(std::string(viewName1), std::string(viewName2)); + OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config1, config2, viewName1)); + + OCIO_CHECK_EQUAL(std::string(viewName1), std::string(viewName2)); + OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config1, config2, viewName1)); + } + { + // Test when a shared virtual view exists in one config but not the other. + OCIO::ConfigRcPtr cfg = config1->createEditableCopy(); + + OCIO_CHECK_ASSERT(config1->hasVirtualView("Film")); + OCIO_CHECK_ASSERT(config1->virtualViewIsShared("Film")); + + OCIO_REQUIRE_EQUAL(2, cfg->getVirtualDisplayNumViews(OCIO::VIEW_SHARED)); + OCIO_CHECK_ASSERT(cfg->hasVirtualView("Film")); + OCIO_CHECK_ASSERT(cfg->virtualViewIsShared("Film")); + + OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config1, cfg, "Film")); + + // Check against another config where the virtual view is display-defined. + OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config2, cfg, "Film")); + + // Remove a shared view from the virtual display. + cfg->removeVirtualDisplayView("Film"); + + OCIO_REQUIRE_EQUAL(1, cfg->getVirtualDisplayNumViews(OCIO::VIEW_SHARED)); + OCIO_CHECK_ASSERT(!cfg->hasVirtualView("Film")); + OCIO_CHECK_ASSERT(!cfg->virtualViewIsShared("Film")); + + OCIO_CHECK_ASSERT(!OCIO::Config::VirtualViewsAreEqual(config1, cfg, "Film")); + OCIO_CHECK_ASSERT(!OCIO::Config::VirtualViewsAreEqual(config2, cfg, "Film")); + } + { + // Test when a display-defined virtual view exists in one config but not the other. + OCIO::ConfigRcPtr cfg = config2->createEditableCopy(); + + // Remove a display-defined view from the virtual display. + OCIO_CHECK_ASSERT(config2->hasVirtualView("Film")); + OCIO_CHECK_ASSERT(!config2->virtualViewIsShared("Film")); // Confirm display-defined + + OCIO_REQUIRE_EQUAL(2, cfg->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); + OCIO_CHECK_ASSERT(cfg->hasVirtualView("Film")); + OCIO_CHECK_ASSERT(!cfg->virtualViewIsShared("Film")); // Confirm display-defined + + OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config2, cfg, "Film")); + + // Check against another config where the virtual view is a reference to a shared view. + OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config1, cfg, "Film")); + + // Remove a display-defined view from the virtual display. + cfg->removeVirtualDisplayView("Film"); + + OCIO_REQUIRE_EQUAL(1, cfg->getVirtualDisplayNumViews(OCIO::VIEW_DISPLAY_DEFINED)); + OCIO_CHECK_ASSERT(!cfg->hasVirtualView("Film")); + + OCIO_CHECK_ASSERT(!OCIO::Config::VirtualViewsAreEqual(config2, cfg, "Film")); + OCIO_CHECK_ASSERT(!OCIO::Config::VirtualViewsAreEqual(config1, cfg, "Film")); + } +} From 75ae64ae819a962ab5b0e528469ee5309670b58a Mon Sep 17 00:00:00 2001 From: annie Date: Sat, 24 May 2025 13:04:02 +0300 Subject: [PATCH 17/17] add null/empty view name handling to viewIsShared and virtualViewIsShared Signed-off-by: annie --- src/OpenColorIO/Config.cpp | 3 +++ tests/cpu/Config_tests.cpp | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/src/OpenColorIO/Config.cpp b/src/OpenColorIO/Config.cpp index dde0cc68a8..c44b2fdc34 100644 --- a/src/OpenColorIO/Config.cpp +++ b/src/OpenColorIO/Config.cpp @@ -3307,6 +3307,7 @@ void Config::setViewingRules(ConstViewingRulesRcPtr viewingRules) bool Config::viewIsShared(const char * dispName, const char * viewName) const { + if (!viewName || !*viewName) return false; for (int v = 0; v < getNumViews(VIEW_SHARED, dispName); v++) { @@ -3785,6 +3786,8 @@ bool Config::hasVirtualView(const char * viewName) const bool Config::virtualViewIsShared(const char * viewName) const { + if (!viewName || !*viewName) return false; + for (int v = 0; v < getVirtualDisplayNumViews(VIEW_SHARED); v++) { const char * sharedViewName = getVirtualDisplayView(VIEW_SHARED, v); diff --git a/tests/cpu/Config_tests.cpp b/tests/cpu/Config_tests.cpp index a5c3092995..45145f9de0 100644 --- a/tests/cpu/Config_tests.cpp +++ b/tests/cpu/Config_tests.cpp @@ -8505,6 +8505,8 @@ active_views: [] OCIO_CHECK_EQUAL(std::string("sview1"), config->getView(OCIO::VIEW_SHARED, "sRGB", 0)); OCIO_CHECK_ASSERT(config->displayHasView("sRGB", "sview1")); OCIO_CHECK_ASSERT(config->viewIsShared("sRGB", "sview1")); + OCIO_CHECK_ASSERT(!config->viewIsShared("sRGB", "")); + OCIO_CHECK_ASSERT(!config->viewIsShared("sRGB", nullptr)); OCIO_CHECK_EQUAL(std::string("raw"), config->getDisplayViewColorSpaceName("sRGB", "sview1")); OCIO_CHECK_EQUAL(std::string("raw"), config->getVirtualDisplayViewColorSpaceName("sview2")); @@ -8550,6 +8552,9 @@ active_views: [] OCIO_CHECK_ASSERT(cfg->virtualViewIsShared("sview2")); OCIO_CHECK_ASSERT(OCIO::Config::VirtualViewsAreEqual(config, cfg, "sview2")); + OCIO_CHECK_ASSERT(!cfg->virtualViewIsShared("")); + OCIO_CHECK_ASSERT(!cfg->virtualViewIsShared(nullptr)); + // Remove a view from the Virtual Display. cfg->removeVirtualDisplayView("Raw");