Skip to content

Commit f30f2c8

Browse files
authored
Adsk Contrib - Include color spaces with no categories in menuHelper results by default (#2189)
* Jasmin - Treat No Category As Any Signed-off-by: Doug Walker <[email protected]> (cherry picked from commit 146e90b) Signed-off-by: Doug Walker <[email protected]> * Fix python tests Signed-off-by: Doug Walker <[email protected]> (cherry picked from commit fbcd4d4) Signed-off-by: Doug Walker <[email protected]> * Add treat no category as any Signed-off-by: Doug Walker <[email protected]> * Add ability to run a single Python test suite Signed-off-by: Doug Walker <[email protected]> * Clean up minor issues Signed-off-by: Doug Walker <[email protected]> * Respond to review Signed-off-by: Doug Walker <[email protected]> * Fix GPU Action Signed-off-by: Doug Walker <[email protected]> --------- Signed-off-by: Doug Walker <[email protected]>
1 parent 97c3738 commit f30f2c8

File tree

13 files changed

+489
-163
lines changed

13 files changed

+489
-163
lines changed

.github/workflows/gpu_workflow.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,4 @@ jobs:
4343
with:
4444
project-name: OpenColorIO
4545
buildspec-override: buildspec.yml
46+
image-override: aswf/ci-ocio:2025

include/OpenColorIO/OpenColorAppHelpers.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ namespace OCIO_NAMESPACE
5656
* - UserCategories: A list of strings specified by the end-user of the application. OCIO
5757
* will check for these strings in an environment variable, or they may be passed in from
5858
* the application.
59+
* - TreatNoCategoryAsAny: By default, color spaces (or named transforms) that have no
60+
* categories are handled as if they had any of the categories. Config authors that want to
61+
* hide color spaces without categories should either put them in the inactiveColorSpaces
62+
* list or add a category that will never be searched for (e.g., "invisible" or "hidden").
63+
* App developers may set this option to false to hide items without any categories.
5964
*
6065
* Basically the intent is for the filtering to return the intersection of the app categories,
6166
* encoding, and user categories. However, some fall-backs are in place to ensure that the
@@ -130,6 +135,13 @@ class OCIOEXPORT ColorSpaceMenuParameters
130135
virtual void setIncludeNamedTransforms(bool include) noexcept = 0;
131136
virtual bool getIncludeNamedTransforms() const noexcept = 0;
132137

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

134146
/**
135147
* App categories is a comma separated list of categories. If appCategories is not NULL and

src/OpenColorIO/apphelpers/CategoryHelpers.cpp

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ bool HasEncoding(const T & elt, const std::string & encoding)
4949

5050
ColorSpaceVec GetColorSpaces(ConstConfigRcPtr config,
5151
bool includeColorSpaces,
52+
bool treatNoCategoryAsAny,
5253
SearchReferenceSpaceType colorSpaceType,
5354
const Categories & categories,
5455
const Encodings & encodings)
@@ -62,11 +63,13 @@ ColorSpaceVec GetColorSpaces(ConstConfigRcPtr config,
6263
auto cs = config->getColorSpace(config->getColorSpaceNameByIndex(colorSpaceType,
6364
COLORSPACE_ACTIVE,
6465
idx));
66+
67+
const bool ignoreCategory = treatNoCategoryAsAny && cs->getNumCategories() == 0;
6568
for (const auto & cat : categories)
6669
{
6770
for (const auto & enc : encodings)
6871
{
69-
if (HasCategory(cs, cat) && HasEncoding(cs, enc))
72+
if ((ignoreCategory || HasCategory(cs, cat)) && HasEncoding(cs, enc))
7073
{
7174
AddElement(css, cs.get());
7275
}
@@ -79,6 +82,7 @@ ColorSpaceVec GetColorSpaces(ConstConfigRcPtr config,
7982

8083
ColorSpaceVec GetColorSpaces(ConstConfigRcPtr config,
8184
bool includeColorSpaces,
85+
bool treatNoCategoryAsAny,
8286
SearchReferenceSpaceType colorSpaceType,
8387
const Categories & categories)
8488
{
@@ -91,9 +95,11 @@ ColorSpaceVec GetColorSpaces(ConstConfigRcPtr config,
9195
auto cs = config->getColorSpace(config->getColorSpaceNameByIndex(colorSpaceType,
9296
COLORSPACE_ACTIVE,
9397
idx));
98+
99+
const bool ignoreCategory = treatNoCategoryAsAny && cs->getNumCategories() == 0;
94100
for (const auto & cat : categories)
95101
{
96-
if (HasCategory(cs, cat))
102+
if (ignoreCategory || HasCategory(cs, cat))
97103
{
98104
AddElement(css, cs.get());
99105
}
@@ -133,6 +139,7 @@ typedef std::vector<const NamedTransform *> NamedTransformVec;
133139

134140
NamedTransformVec GetNamedTransforms(ConstConfigRcPtr config,
135141
bool includeNamedTransforms,
142+
bool treatNoCategoryAsAny,
136143
const Categories & categories,
137144
const Encodings & encodings)
138145
{
@@ -142,11 +149,13 @@ NamedTransformVec GetNamedTransforms(ConstConfigRcPtr config,
142149
for (int idx = 0; idx < config->getNumNamedTransforms(); ++idx)
143150
{
144151
auto nt = config->getNamedTransform(config->getNamedTransformNameByIndex(idx));
152+
153+
const bool ignoreCategory = treatNoCategoryAsAny && nt->getNumCategories() == 0;
145154
for (const auto & cat : categories)
146155
{
147156
for (const auto & enc : encodings)
148157
{
149-
if (HasCategory(nt, cat) && HasEncoding(nt, enc))
158+
if ((ignoreCategory || HasCategory(nt, cat)) && HasEncoding(nt, enc))
150159
{
151160
AddElement(nts, nt.get());
152161
}
@@ -159,6 +168,7 @@ NamedTransformVec GetNamedTransforms(ConstConfigRcPtr config,
159168

160169
NamedTransformVec GetNamedTransforms(ConstConfigRcPtr config,
161170
bool includeNamedTransforms,
171+
bool treatNoCategoryAsAny,
162172
const Categories & categories)
163173
{
164174
NamedTransformVec nts;
@@ -167,9 +177,11 @@ NamedTransformVec GetNamedTransforms(ConstConfigRcPtr config,
167177
for (int idx = 0; idx < config->getNumNamedTransforms(); ++idx)
168178
{
169179
auto nt = config->getNamedTransform(config->getNamedTransformNameByIndex(idx));
180+
181+
const bool ignoreCategory = treatNoCategoryAsAny && nt->getNumCategories() == 0;
170182
for (const auto & cat : categories)
171183
{
172-
if (HasCategory(nt, cat))
184+
if (ignoreCategory || HasCategory(nt, cat))
173185
{
174186
AddElement(nts, nt.get());
175187
}
@@ -267,7 +279,7 @@ StringUtils::StringVec ExtractItems(const char * strings)
267279

268280
ColorSpaceNames FindColorSpaceNames(ConstConfigRcPtr config, const Categories & categories)
269281
{
270-
ColorSpaceVec allCS = GetColorSpaces(config, true, SEARCH_REFERENCE_SPACE_ALL, categories);
282+
ColorSpaceVec allCS = GetColorSpaces(config, true, false, SEARCH_REFERENCE_SPACE_ALL, categories);
271283
return GetNames(allCS);
272284
}
273285

@@ -338,6 +350,7 @@ Infos FindColorSpaceInfos(ConstConfigRcPtr config,
338350
const Categories & userCategories,
339351
bool includeColorSpaces,
340352
bool includeNamedTransforms,
353+
bool treatNoCategoryAsAny,
341354
const Encodings & encodings,
342355
SearchReferenceSpaceType colorSpaceType)
343356
{
@@ -369,10 +382,10 @@ Infos FindColorSpaceInfos(ConstConfigRcPtr config,
369382

370383
if (!encsIgnored)
371384
{
372-
appCS = GetColorSpaces(config, includeColorSpaces, colorSpaceType,
385+
appCS = GetColorSpaces(config, includeColorSpaces, treatNoCategoryAsAny, colorSpaceType,
373386
appCategories, encodings);
374-
appNT = GetNamedTransforms(config, includeNamedTransforms, appCategories,
375-
encodings);
387+
appNT = GetNamedTransforms(config, includeNamedTransforms, treatNoCategoryAsAny,
388+
appCategories, encodings);
376389
appSize = appCS.size() + appNT.size();
377390
}
378391

@@ -381,8 +394,11 @@ Infos FindColorSpaceInfos(ConstConfigRcPtr config,
381394
{
382395
encsIgnored = true;
383396
log.m_ignoreEncodings = !encodings.empty();
384-
appCS = GetColorSpaces(config, includeColorSpaces, colorSpaceType, appCategories);
385-
appNT = GetNamedTransforms(config, includeNamedTransforms, appCategories);
397+
appCS = GetColorSpaces(config, includeColorSpaces, treatNoCategoryAsAny, colorSpaceType,
398+
appCategories);
399+
400+
appNT = GetNamedTransforms(config, includeNamedTransforms, treatNoCategoryAsAny,
401+
appCategories);
386402
appSize = appCS.size() + appNT.size();
387403

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

427-
userCS = GetColorSpaces(config, includeColorSpaces, colorSpaceType, userCategories);
428-
userNT = GetNamedTransforms(config, includeNamedTransforms, userCategories);
443+
userCS = GetColorSpaces(config, includeColorSpaces, treatNoCategoryAsAny, colorSpaceType,
444+
userCategories);
445+
userNT = GetNamedTransforms(config, includeNamedTransforms, treatNoCategoryAsAny,
446+
userCategories);
429447
userSize = userCS.size() + userNT.size();
430448
if (userSize == 0)
431449
{
@@ -464,10 +482,10 @@ Infos FindColorSpaceInfos(ConstConfigRcPtr config,
464482
{
465483
// If not already computed, compute list with app categories and no
466484
// encodings.
467-
appCSNoEncodings = GetColorSpaces(config, includeColorSpaces,
485+
appCSNoEncodings = GetColorSpaces(config, includeColorSpaces, treatNoCategoryAsAny,
468486
colorSpaceType, appCategories);
469487
appNTNoEncodings = GetNamedTransforms(config, includeNamedTransforms,
470-
appCategories);
488+
treatNoCategoryAsAny, appCategories);
471489
}
472490
appCSTest = &appCSNoEncodings;
473491
appNTTest = &appNTNoEncodings;

src/OpenColorIO/apphelpers/CategoryHelpers.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ Infos FindColorSpaceInfos(ConstConfigRcPtr config,
3737
const Categories & userCategories,
3838
bool includeColorSpaces,
3939
bool includeNamedTransforms,
40+
bool treatNoCategoryAsAny,
4041
const Encodings & encodings,
4142
SearchReferenceSpaceType colorSpaceType);
4243

src/OpenColorIO/apphelpers/ColorSpaceHelpers.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ void ColorSpaceMenuParametersImpl::setParameters(ConstColorSpaceMenuParametersRc
184184
m_includeColorSpaces = impl.m_includeColorSpaces;
185185
m_includeRoles = impl.m_includeRoles;
186186
m_includeNamedTransforms = impl.m_includeNamedTransforms;
187+
m_treatNoCategoryAsAny = impl.m_treatNoCategoryAsAny;
187188
m_colorSpaceType = impl.m_colorSpaceType;
188189
m_additionalColorSpaces = impl.m_additionalColorSpaces;
189190
}
@@ -268,6 +269,16 @@ bool ColorSpaceMenuParametersImpl::getIncludeNamedTransforms() const noexcept
268269
return m_includeNamedTransforms;
269270
}
270271

272+
void ColorSpaceMenuParametersImpl::setTreatNoCategoryAsAny(bool value) noexcept
273+
{
274+
m_treatNoCategoryAsAny = value;
275+
}
276+
277+
bool ColorSpaceMenuParametersImpl::getTreatNoCategoryAsAny() const noexcept
278+
{
279+
return m_treatNoCategoryAsAny;
280+
}
281+
271282
void ColorSpaceMenuParametersImpl::addColorSpace(const char * name) noexcept
272283
{
273284
if (name && *name && !StringUtils::Contain(m_additionalColorSpaces, name))
@@ -334,6 +345,7 @@ std::ostream & operator<<(std::ostream & os, const ColorSpaceMenuParameters & p)
334345
os << ", includeColorSpaces: " << (p.getIncludeColorSpaces() ? "true" : "false");
335346
os << ", includeRoles: " << (p.getIncludeRoles() ? "true" : "false");
336347
os << ", includeNamedTransforms: " << (p.getIncludeNamedTransforms() ? "true" : "false");
348+
os << ", treatNoCategoryAsAny: " << (p.getTreatNoCategoryAsAny() ? "true" : "false");
337349
if (impl.m_colorSpaceType == SEARCH_REFERENCE_SPACE_SCENE)
338350
{
339351
os << ", colorSpaceType: scene";
@@ -481,6 +493,7 @@ void ColorSpaceMenuHelperImpl::refresh()
481493
allAppCategories, allUserCategories,
482494
m_parameters.m_includeColorSpaces,
483495
m_parameters.m_includeNamedTransforms,
496+
m_parameters.m_treatNoCategoryAsAny,
484497
allEncodings, m_parameters.m_colorSpaceType);
485498
}
486499

src/OpenColorIO/apphelpers/ColorSpaceHelpers.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ class ColorSpaceMenuParametersImpl : public ColorSpaceMenuParameters
105105
bool getIncludeRoles() const noexcept override;
106106
void setIncludeNamedTransforms(bool include) noexcept override;
107107
bool getIncludeNamedTransforms() const noexcept override;
108+
void setTreatNoCategoryAsAny(bool value) noexcept override;
109+
bool getTreatNoCategoryAsAny() const noexcept override;
110+
108111
SearchReferenceSpaceType getSearchReferenceSpaceType() const noexcept override;
109112
void setSearchReferenceSpaceType(SearchReferenceSpaceType colorspaceType) noexcept override;
110113

@@ -127,6 +130,7 @@ class ColorSpaceMenuParametersImpl : public ColorSpaceMenuParameters
127130
bool m_includeColorSpaces = true;
128131
bool m_includeRoles = false;
129132
bool m_includeNamedTransforms = false;
133+
bool m_treatNoCategoryAsAny = true;
130134
SearchReferenceSpaceType m_colorSpaceType = SEARCH_REFERENCE_SPACE_ALL;
131135

132136
StringUtils::StringVec m_additionalColorSpaces;

src/bindings/python/apphelpers/PyColorSpaceHelpers.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ void bindPyColorSpaceMenuHelpers(py::module & m)
6464
bool includeColorSpaces,
6565
SearchReferenceSpaceType searchReferenceSpaceType,
6666
bool includeNamedTransforms,
67+
bool treatNoCategoryAsAny,
6768
const std::string & appCategories,
6869
const std::string & encodings,
6970
const std::string & userCategories,
@@ -90,13 +91,15 @@ void bindPyColorSpaceMenuHelpers(py::module & m)
9091
p->setIncludeColorSpaces(includeColorSpaces);
9192
p->setIncludeRoles(includeRoles);
9293
p->setIncludeNamedTransforms(includeNamedTransforms);
94+
p->setTreatNoCategoryAsAny(treatNoCategoryAsAny);
9395
return p;
9496
}),
9597
"config"_a.none(false),
9698
"role"_a.none(false) = "",
9799
"includeColorSpaces"_a = true,
98100
"searchReferenceSpaceType"_a = SEARCH_REFERENCE_SPACE_ALL,
99101
"includeNamedTransforms"_a = false,
102+
"treatNoCategoryAsAny"_a = true,
100103
"appCategories"_a.none(false) = "",
101104
"encodings"_a.none(false) = "",
102105
"userCategories"_a.none(false) = "",
@@ -126,6 +129,11 @@ void bindPyColorSpaceMenuHelpers(py::module & m)
126129
.def("setIncludeNamedTransforms", &ColorSpaceMenuParameters::setIncludeNamedTransforms,
127130
"includeNamedTransforms"_a = true,
128131
DOC(ColorSpaceMenuParameters, setIncludeNamedTransforms))
132+
.def("getTreatNoCategoryAsAny", &ColorSpaceMenuParameters::getTreatNoCategoryAsAny,
133+
DOC(ColorSpaceMenuParameters, getTreatNoCategoryAsAny))
134+
.def("setTreatNoCategoryAsAny", &ColorSpaceMenuParameters::setTreatNoCategoryAsAny,
135+
"treatNoCategoryAsAny"_a = true,
136+
DOC(ColorSpaceMenuParameters, setTreatNoCategoryAsAny))
129137
.def("getEncodings", &ColorSpaceMenuParameters::getEncodings,
130138
DOC(ColorSpaceMenuParameters, getEncodings))
131139
.def("setEncodings", &ColorSpaceMenuParameters::setEncodings, "encodings"_a.none(false),

0 commit comments

Comments
 (0)