From 6ff551acf382ac257cecba717a7ea1613e4281f3 Mon Sep 17 00:00:00 2001 From: Elijah Nicol Date: Thu, 17 Sep 2026 17:07:54 -0700 Subject: [PATCH] Add methods to get all views, ignoring active views list Signed-off-by: Elijah Nicol --- include/OpenColorIO/OpenColorIO.h | 8 +++++ src/OpenColorIO/Config.cpp | 29 +++++++++++++++ tests/cpu/Config_tests.cpp | 59 ++++++++++++++++++++++++++++++- 3 files changed, 95 insertions(+), 1 deletion(-) diff --git a/include/OpenColorIO/OpenColorIO.h b/include/OpenColorIO/OpenColorIO.h index ad294fc805..24d4270469 100644 --- a/include/OpenColorIO/OpenColorIO.h +++ b/include/OpenColorIO/OpenColorIO.h @@ -886,6 +886,14 @@ class OCIOEXPORT Config int getNumViews(const char * display) const; const char * getView(const char * display, int index) const; + /** + * Return the number of views, ignoring the active_views list, attached to the + * display including the number of shared views if any. Return 0 if display + * does not exist. + */ + int getNumViewsAll(const char * display) const; + const char * getViewAll(const char * display, int index) const; + /** * If the config has ViewingRules, get the number of active Views for this * colorspace. (If there are no rules, it returns all of them.) diff --git a/src/OpenColorIO/Config.cpp b/src/OpenColorIO/Config.cpp index ea9ac00298..5bd996a895 100644 --- a/src/OpenColorIO/Config.cpp +++ b/src/OpenColorIO/Config.cpp @@ -3509,6 +3509,35 @@ const char * Config::getView(const char * display, int index) const return ""; } +int Config::getNumViewsAll(const char * display) const +{ + if (!display || !*display) return 0; + + DisplayMap::const_iterator iter = FindDisplay(getImpl()->m_displays, display); + if(iter == getImpl()->m_displays.end()) return 0; + + const ViewPtrVec views = getImpl()->getViews(iter->second); + + return static_cast(views.size()); +} + +const char * Config::getViewAll(const char * display, int index) const +{ + if (!display || !*display || index < 0) return ""; + + DisplayMap::const_iterator iter = FindDisplay(getImpl()->m_displays, display); + if(iter == getImpl()->m_displays.end()) return ""; + + const ViewPtrVec views = getImpl()->getViews(iter->second); + + if(static_cast(index) < views.size()) + { + return views[index]->m_name.c_str(); + } + + return ""; +} + int Config::getNumViews(const char * display, const char * colorspace) const { if (!display || !*display || !colorspace || !*colorspace) return 0; diff --git a/tests/cpu/Config_tests.cpp b/tests/cpu/Config_tests.cpp index 5fc9300564..bb62bf4ab5 100644 --- a/tests/cpu/Config_tests.cpp +++ b/tests/cpu/Config_tests.cpp @@ -3538,19 +3538,30 @@ OCIO_ADD_TEST(Config, view) OCIO_CHECK_NO_THROW(config = OCIO::Config::CreateFromStream(is)); OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_1")), "View_1"); OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_1"), 2); + OCIO_REQUIRE_EQUAL(config->getNumViewsAll("sRGB_1"), 2); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_1", 0)), "View_1"); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_1", 1)), "View_2"); - // Invalid index. + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_1", 0)), "View_1"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_1", 1)), "View_2"); + // Invalid indexes. OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_1", 42)), ""); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_1", -1)), ""); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_1", 42)), ""); OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_2")), "View_2"); OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_2"), 2); + OCIO_REQUIRE_EQUAL(config->getNumViewsAll("sRGB_2"), 2); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_2", 0)), "View_2"); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_2", 1)), "View_3"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_2", 0)), "View_2"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_2", 1)), "View_3"); OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_3")), "View_3"); OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_3"), 2); + OCIO_REQUIRE_EQUAL(config->getNumViewsAll("sRGB_3"), 2); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_3", 0)), "View_3"); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_3", 1)), "View_1"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_3", 0)), "View_3"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_3", 1)), "View_1"); std::stringstream ss; ss << *config.get(); @@ -3571,14 +3582,23 @@ OCIO_ADD_TEST(Config, view) OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_1")), "View_1"); // The active views list is ignored, for a display, if it would remove all views. OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_1"), 2); + OCIO_REQUIRE_EQUAL(config->getNumViewsAll("sRGB_1"), 2); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_1", 0)), "View_1"); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_1", 1)), "View_2"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_1", 0)), "View_1"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_1", 1)), "View_2"); OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_2")), "View_3"); OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_2"), 1); + OCIO_REQUIRE_EQUAL(config->getNumViewsAll("sRGB_2"), 2); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_2", 0)), "View_3"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_2", 0)), "View_2"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_2", 1)), "View_3"); OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_3")), "View_3"); OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_3"), 1); + OCIO_REQUIRE_EQUAL(config->getNumViewsAll("sRGB_3"), 2); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_3", 0)), "View_3"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_3", 0)), "View_3"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_3", 1)), "View_1"); OCIO_REQUIRE_EQUAL(config->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "sRGB_1"), 2); OCIO_REQUIRE_EQUAL(config->getNumViews(OCIO::VIEW_DISPLAY_DEFINED, "sRGB_2"), 2); @@ -3603,16 +3623,26 @@ OCIO_ADD_TEST(Config, view) OCIO_CHECK_NO_THROW(config = OCIO::Config::CreateFromStream(is)); OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_1")), "View_2"); OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_1"), 2); + OCIO_REQUIRE_EQUAL(config->getNumViewsAll("sRGB_1"), 2); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_1", 0)), "View_2"); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_1", 1)), "View_1"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_1", 0)), "View_1"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_1", 1)), "View_2"); OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_2")), "View_3"); OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_2"), 2); + OCIO_REQUIRE_EQUAL(config->getNumViewsAll("sRGB_2"), 2); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_2", 0)), "View_3"); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_2", 1)), "View_2"); + // Ignore view ordering from active views list. + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_2", 0)), "View_2"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_2", 1)), "View_3"); OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_3")), "View_3"); OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_3"), 2); + OCIO_REQUIRE_EQUAL(config->getNumViewsAll("sRGB_3"), 2); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_3", 0)), "View_3"); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_3", 1)), "View_1"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_3", 0)), "View_3"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_3", 1)), "View_1"); } { @@ -3630,14 +3660,23 @@ OCIO_ADD_TEST(Config, view) OCIO_CHECK_NO_THROW(config = OCIO::Config::CreateFromStream(is)); OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_1")), "View_2"); OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_1"), 1); + OCIO_REQUIRE_EQUAL(config->getNumViewsAll("sRGB_1"), 2); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_1", 0)), "View_2"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_1", 0)), "View_1"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_1", 1)), "View_2"); OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_2")), "View_3"); OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_2"), 2); + OCIO_REQUIRE_EQUAL(config->getNumViewsAll("sRGB_2"), 2); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_2", 0)), "View_3"); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_2", 1)), "View_2"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_2", 0)), "View_2"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_2", 1)), "View_3"); OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_3")), "View_3"); OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_3"), 1); + OCIO_REQUIRE_EQUAL(config->getNumViewsAll("sRGB_3"), 2); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_3", 0)), "View_3"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_3", 0)), "View_3"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_3", 1)), "View_1"); } { @@ -3656,16 +3695,25 @@ OCIO_ADD_TEST(Config, view) OCIO_CHECK_NO_THROW(config = OCIO::Config::CreateFromStream(is)); OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_1")), "View_1"); OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_1"), 2); + OCIO_REQUIRE_EQUAL(config->getNumViewsAll("sRGB_1"), 2); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_1", 0)), "View_1"); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_1", 1)), "View_2"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_1", 0)), "View_1"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_1", 1)), "View_2"); OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_2")), "View_2"); OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_2"), 2); + OCIO_REQUIRE_EQUAL(config->getNumViewsAll("sRGB_2"), 2); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_2", 0)), "View_2"); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_2", 1)), "View_3"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_2", 0)), "View_2"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_2", 1)), "View_3"); OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_3")), "View_3"); OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_3"), 2); + OCIO_REQUIRE_EQUAL(config->getNumViewsAll("sRGB_3"), 2); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_3", 0)), "View_3"); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_3", 1)), "View_1"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_3", 0)), "View_3"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_3", 1)), "View_1"); } { @@ -3684,16 +3732,25 @@ OCIO_ADD_TEST(Config, view) OCIO_CHECK_NO_THROW(config = OCIO::Config::CreateFromStream(is)); OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_1")), "View_1"); OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_1"), 2); + OCIO_REQUIRE_EQUAL(config->getNumViewsAll("sRGB_1"), 2); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_1", 0)), "View_1"); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_1", 1)), "View_2"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_1", 0)), "View_1"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_1", 1)), "View_2"); OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_2")), "View_2"); OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_2"), 2); + OCIO_REQUIRE_EQUAL(config->getNumViewsAll("sRGB_2"), 2); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_2", 0)), "View_2"); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_2", 1)), "View_3"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_2", 0)), "View_2"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_2", 1)), "View_3"); OCIO_CHECK_EQUAL(std::string(config->getDefaultView("sRGB_3")), "View_3"); OCIO_REQUIRE_EQUAL(config->getNumViews("sRGB_3"), 2); + OCIO_REQUIRE_EQUAL(config->getNumViewsAll("sRGB_3"), 2); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_3", 0)), "View_3"); OCIO_CHECK_EQUAL(std::string(config->getView("sRGB_3", 1)), "View_1"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_3", 0)), "View_3"); + OCIO_CHECK_EQUAL(std::string(config->getViewAll("sRGB_3", 1)), "View_1"); } }