Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/gpu_workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,4 @@ jobs:
with:
project-name: OpenColorIO
buildspec-override: buildspec.yml
image-override: aswf/ci-ocio:2025
12 changes: 12 additions & 0 deletions include/OpenColorIO/OpenColorAppHelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,11 @@ namespace OCIO_NAMESPACE
* - UserCategories: A list of strings specified by the end-user of the application. OCIO
* will check for these strings in an environment variable, or they may be passed in from
* the application.
* - TreatNoCategoryAsAny: By default, color spaces (or named transforms) that have no
* categories are handled as if they had any of the categories. Config authors that want to
* hide color spaces without categories should either put them in the inactiveColorSpaces
* list or add a category that will never be searched for (e.g., "invisible" or "hidden").
* App developers may set this option to false to hide items without any categories.
*
* Basically the intent is for the filtering to return the intersection of the app categories,
* encoding, and user categories. However, some fall-backs are in place to ensure that the
Expand Down Expand Up @@ -130,6 +135,13 @@ class OCIOEXPORT ColorSpaceMenuParameters
virtual void setIncludeNamedTransforms(bool include) noexcept = 0;
virtual bool getIncludeNamedTransforms() const noexcept = 0;

/**
* When searching for color spaces using app or user categories, treat color spaces or
* named transforms that have no categories as if they had any of the categories.
* Default is true.
*/
virtual void setTreatNoCategoryAsAny(bool value) noexcept = 0;
virtual bool getTreatNoCategoryAsAny() const noexcept = 0;

/**
* App categories is a comma separated list of categories. If appCategories is not NULL and
Expand Down
46 changes: 32 additions & 14 deletions src/OpenColorIO/apphelpers/CategoryHelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ bool HasEncoding(const T & elt, const std::string & encoding)

ColorSpaceVec GetColorSpaces(ConstConfigRcPtr config,
bool includeColorSpaces,
bool treatNoCategoryAsAny,
SearchReferenceSpaceType colorSpaceType,
const Categories & categories,
const Encodings & encodings)
Expand All @@ -62,11 +63,13 @@ ColorSpaceVec GetColorSpaces(ConstConfigRcPtr config,
auto cs = config->getColorSpace(config->getColorSpaceNameByIndex(colorSpaceType,
COLORSPACE_ACTIVE,
idx));

const bool ignoreCategory = treatNoCategoryAsAny && cs->getNumCategories() == 0;
for (const auto & cat : categories)
{
for (const auto & enc : encodings)
{
if (HasCategory(cs, cat) && HasEncoding(cs, enc))
if ((ignoreCategory || HasCategory(cs, cat)) && HasEncoding(cs, enc))
{
AddElement(css, cs.get());
}
Expand All @@ -79,6 +82,7 @@ ColorSpaceVec GetColorSpaces(ConstConfigRcPtr config,

ColorSpaceVec GetColorSpaces(ConstConfigRcPtr config,
bool includeColorSpaces,
bool treatNoCategoryAsAny,
SearchReferenceSpaceType colorSpaceType,
const Categories & categories)
{
Expand All @@ -91,9 +95,11 @@ ColorSpaceVec GetColorSpaces(ConstConfigRcPtr config,
auto cs = config->getColorSpace(config->getColorSpaceNameByIndex(colorSpaceType,
COLORSPACE_ACTIVE,
idx));

const bool ignoreCategory = treatNoCategoryAsAny && cs->getNumCategories() == 0;
for (const auto & cat : categories)
{
if (HasCategory(cs, cat))
if (ignoreCategory || HasCategory(cs, cat))
{
AddElement(css, cs.get());
}
Expand Down Expand Up @@ -133,6 +139,7 @@ typedef std::vector<const NamedTransform *> NamedTransformVec;

NamedTransformVec GetNamedTransforms(ConstConfigRcPtr config,
bool includeNamedTransforms,
bool treatNoCategoryAsAny,
const Categories & categories,
const Encodings & encodings)
{
Expand All @@ -142,11 +149,13 @@ NamedTransformVec GetNamedTransforms(ConstConfigRcPtr config,
for (int idx = 0; idx < config->getNumNamedTransforms(); ++idx)
{
auto nt = config->getNamedTransform(config->getNamedTransformNameByIndex(idx));

const bool ignoreCategory = treatNoCategoryAsAny && nt->getNumCategories() == 0;
for (const auto & cat : categories)
{
for (const auto & enc : encodings)
{
if (HasCategory(nt, cat) && HasEncoding(nt, enc))
if ((ignoreCategory || HasCategory(nt, cat)) && HasEncoding(nt, enc))
{
AddElement(nts, nt.get());
}
Expand All @@ -159,6 +168,7 @@ NamedTransformVec GetNamedTransforms(ConstConfigRcPtr config,

NamedTransformVec GetNamedTransforms(ConstConfigRcPtr config,
bool includeNamedTransforms,
bool treatNoCategoryAsAny,
const Categories & categories)
{
NamedTransformVec nts;
Expand All @@ -167,9 +177,11 @@ NamedTransformVec GetNamedTransforms(ConstConfigRcPtr config,
for (int idx = 0; idx < config->getNumNamedTransforms(); ++idx)
{
auto nt = config->getNamedTransform(config->getNamedTransformNameByIndex(idx));

const bool ignoreCategory = treatNoCategoryAsAny && nt->getNumCategories() == 0;
for (const auto & cat : categories)
{
if (HasCategory(nt, cat))
if (ignoreCategory || HasCategory(nt, cat))
{
AddElement(nts, nt.get());
}
Expand Down Expand Up @@ -267,7 +279,7 @@ StringUtils::StringVec ExtractItems(const char * strings)

ColorSpaceNames FindColorSpaceNames(ConstConfigRcPtr config, const Categories & categories)
{
ColorSpaceVec allCS = GetColorSpaces(config, true, SEARCH_REFERENCE_SPACE_ALL, categories);
ColorSpaceVec allCS = GetColorSpaces(config, true, false, SEARCH_REFERENCE_SPACE_ALL, categories);
return GetNames(allCS);
}

Expand Down Expand Up @@ -338,6 +350,7 @@ Infos FindColorSpaceInfos(ConstConfigRcPtr config,
const Categories & userCategories,
bool includeColorSpaces,
bool includeNamedTransforms,
bool treatNoCategoryAsAny,
const Encodings & encodings,
SearchReferenceSpaceType colorSpaceType)
{
Expand Down Expand Up @@ -369,10 +382,10 @@ Infos FindColorSpaceInfos(ConstConfigRcPtr config,

if (!encsIgnored)
{
appCS = GetColorSpaces(config, includeColorSpaces, colorSpaceType,
appCS = GetColorSpaces(config, includeColorSpaces, treatNoCategoryAsAny, colorSpaceType,
appCategories, encodings);
appNT = GetNamedTransforms(config, includeNamedTransforms, appCategories,
encodings);
appNT = GetNamedTransforms(config, includeNamedTransforms, treatNoCategoryAsAny,
appCategories, encodings);
appSize = appCS.size() + appNT.size();
}

Expand All @@ -381,8 +394,11 @@ Infos FindColorSpaceInfos(ConstConfigRcPtr config,
{
encsIgnored = true;
log.m_ignoreEncodings = !encodings.empty();
appCS = GetColorSpaces(config, includeColorSpaces, colorSpaceType, appCategories);
appNT = GetNamedTransforms(config, includeNamedTransforms, appCategories);
appCS = GetColorSpaces(config, includeColorSpaces, treatNoCategoryAsAny, colorSpaceType,
appCategories);

appNT = GetNamedTransforms(config, includeNamedTransforms, treatNoCategoryAsAny,
appCategories);
appSize = appCS.size() + appNT.size();

// Keep these results in case we need them later.
Expand Down Expand Up @@ -424,8 +440,10 @@ Infos FindColorSpaceInfos(ConstConfigRcPtr config,
{
// 3b) Items using user categories.

userCS = GetColorSpaces(config, includeColorSpaces, colorSpaceType, userCategories);
userNT = GetNamedTransforms(config, includeNamedTransforms, userCategories);
userCS = GetColorSpaces(config, includeColorSpaces, treatNoCategoryAsAny, colorSpaceType,
userCategories);
userNT = GetNamedTransforms(config, includeNamedTransforms, treatNoCategoryAsAny,
userCategories);
userSize = userCS.size() + userNT.size();
if (userSize == 0)
{
Expand Down Expand Up @@ -464,10 +482,10 @@ Infos FindColorSpaceInfos(ConstConfigRcPtr config,
{
// If not already computed, compute list with app categories and no
// encodings.
appCSNoEncodings = GetColorSpaces(config, includeColorSpaces,
appCSNoEncodings = GetColorSpaces(config, includeColorSpaces, treatNoCategoryAsAny,
colorSpaceType, appCategories);
appNTNoEncodings = GetNamedTransforms(config, includeNamedTransforms,
appCategories);
treatNoCategoryAsAny, appCategories);
}
appCSTest = &appCSNoEncodings;
appNTTest = &appNTNoEncodings;
Expand Down
1 change: 1 addition & 0 deletions src/OpenColorIO/apphelpers/CategoryHelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ Infos FindColorSpaceInfos(ConstConfigRcPtr config,
const Categories & userCategories,
bool includeColorSpaces,
bool includeNamedTransforms,
bool treatNoCategoryAsAny,
const Encodings & encodings,
SearchReferenceSpaceType colorSpaceType);

Expand Down
13 changes: 13 additions & 0 deletions src/OpenColorIO/apphelpers/ColorSpaceHelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,7 @@ void ColorSpaceMenuParametersImpl::setParameters(ConstColorSpaceMenuParametersRc
m_includeColorSpaces = impl.m_includeColorSpaces;
m_includeRoles = impl.m_includeRoles;
m_includeNamedTransforms = impl.m_includeNamedTransforms;
m_treatNoCategoryAsAny = impl.m_treatNoCategoryAsAny;
m_colorSpaceType = impl.m_colorSpaceType;
m_additionalColorSpaces = impl.m_additionalColorSpaces;
}
Expand Down Expand Up @@ -268,6 +269,16 @@ bool ColorSpaceMenuParametersImpl::getIncludeNamedTransforms() const noexcept
return m_includeNamedTransforms;
}

void ColorSpaceMenuParametersImpl::setTreatNoCategoryAsAny(bool value) noexcept
{
m_treatNoCategoryAsAny = value;
}

bool ColorSpaceMenuParametersImpl::getTreatNoCategoryAsAny() const noexcept
{
return m_treatNoCategoryAsAny;
}

void ColorSpaceMenuParametersImpl::addColorSpace(const char * name) noexcept
{
if (name && *name && !StringUtils::Contain(m_additionalColorSpaces, name))
Expand Down Expand Up @@ -334,6 +345,7 @@ std::ostream & operator<<(std::ostream & os, const ColorSpaceMenuParameters & p)
os << ", includeColorSpaces: " << (p.getIncludeColorSpaces() ? "true" : "false");
os << ", includeRoles: " << (p.getIncludeRoles() ? "true" : "false");
os << ", includeNamedTransforms: " << (p.getIncludeNamedTransforms() ? "true" : "false");
os << ", treatNoCategoryAsAny: " << (p.getTreatNoCategoryAsAny() ? "true" : "false");
if (impl.m_colorSpaceType == SEARCH_REFERENCE_SPACE_SCENE)
{
os << ", colorSpaceType: scene";
Expand Down Expand Up @@ -481,6 +493,7 @@ void ColorSpaceMenuHelperImpl::refresh()
allAppCategories, allUserCategories,
m_parameters.m_includeColorSpaces,
m_parameters.m_includeNamedTransforms,
m_parameters.m_treatNoCategoryAsAny,
allEncodings, m_parameters.m_colorSpaceType);
}

Expand Down
4 changes: 4 additions & 0 deletions src/OpenColorIO/apphelpers/ColorSpaceHelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,9 @@ class ColorSpaceMenuParametersImpl : public ColorSpaceMenuParameters
bool getIncludeRoles() const noexcept override;
void setIncludeNamedTransforms(bool include) noexcept override;
bool getIncludeNamedTransforms() const noexcept override;
void setTreatNoCategoryAsAny(bool value) noexcept override;
bool getTreatNoCategoryAsAny() const noexcept override;

SearchReferenceSpaceType getSearchReferenceSpaceType() const noexcept override;
void setSearchReferenceSpaceType(SearchReferenceSpaceType colorspaceType) noexcept override;

Expand All @@ -127,6 +130,7 @@ class ColorSpaceMenuParametersImpl : public ColorSpaceMenuParameters
bool m_includeColorSpaces = true;
bool m_includeRoles = false;
bool m_includeNamedTransforms = false;
bool m_treatNoCategoryAsAny = true;
SearchReferenceSpaceType m_colorSpaceType = SEARCH_REFERENCE_SPACE_ALL;

StringUtils::StringVec m_additionalColorSpaces;
Expand Down
8 changes: 8 additions & 0 deletions src/bindings/python/apphelpers/PyColorSpaceHelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ void bindPyColorSpaceMenuHelpers(py::module & m)
bool includeColorSpaces,
SearchReferenceSpaceType searchReferenceSpaceType,
bool includeNamedTransforms,
bool treatNoCategoryAsAny,
const std::string & appCategories,
const std::string & encodings,
const std::string & userCategories,
Expand All @@ -90,13 +91,15 @@ void bindPyColorSpaceMenuHelpers(py::module & m)
p->setIncludeColorSpaces(includeColorSpaces);
p->setIncludeRoles(includeRoles);
p->setIncludeNamedTransforms(includeNamedTransforms);
p->setTreatNoCategoryAsAny(treatNoCategoryAsAny);
return p;
}),
"config"_a.none(false),
"role"_a.none(false) = "",
"includeColorSpaces"_a = true,
"searchReferenceSpaceType"_a = SEARCH_REFERENCE_SPACE_ALL,
"includeNamedTransforms"_a = false,
"treatNoCategoryAsAny"_a = true,
"appCategories"_a.none(false) = "",
"encodings"_a.none(false) = "",
"userCategories"_a.none(false) = "",
Expand Down Expand Up @@ -126,6 +129,11 @@ void bindPyColorSpaceMenuHelpers(py::module & m)
.def("setIncludeNamedTransforms", &ColorSpaceMenuParameters::setIncludeNamedTransforms,
"includeNamedTransforms"_a = true,
DOC(ColorSpaceMenuParameters, setIncludeNamedTransforms))
.def("getTreatNoCategoryAsAny", &ColorSpaceMenuParameters::getTreatNoCategoryAsAny,
DOC(ColorSpaceMenuParameters, getTreatNoCategoryAsAny))
.def("setTreatNoCategoryAsAny", &ColorSpaceMenuParameters::setTreatNoCategoryAsAny,
"treatNoCategoryAsAny"_a = true,
DOC(ColorSpaceMenuParameters, setTreatNoCategoryAsAny))
.def("getEncodings", &ColorSpaceMenuParameters::getEncodings,
DOC(ColorSpaceMenuParameters, getEncodings))
.def("setEncodings", &ColorSpaceMenuParameters::setEncodings, "encodings"_a.none(false),
Expand Down
Loading