Skip to content

Commit 7fc59f8

Browse files
authored
Add hasAlias method to ColorSpace and NamedTransform classes (#2059)
* Add hasAlias method to ColorSpace and NamedTransform classes Signed-off-by: annie <annieyhlin09@gmail.com> * minor style changes Signed-off-by: annie <annieyhlin09@gmail.com> * Update Python binding to include hasAlias method with unit tests Signed-off-by: annie <annieyhlin09@gmail.com> --------- Signed-off-by: annie <annieyhlin09@gmail.com>
1 parent 2f5ae2c commit 7fc59f8

File tree

10 files changed

+82
-1
lines changed

10 files changed

+82
-1
lines changed

include/OpenColorIO/OpenColorIO.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1879,6 +1879,8 @@ class OCIOEXPORT ColorSpace
18791879
size_t getNumAliases() const noexcept;
18801880
/// Return empty string if idx is out of range.
18811881
const char * getAlias(size_t idx) const noexcept;
1882+
/// Return true if alias exists.
1883+
bool hasAlias(const char * alias) const noexcept;
18821884
/**
18831885
* Add an alias for the color space name (the aliases may be used as a synonym for the
18841886
* name). Nothing will be added if the alias is already the color space name, one of its
@@ -2301,6 +2303,8 @@ class OCIOEXPORT NamedTransform
23012303
virtual size_t getNumAliases() const noexcept = 0;
23022304
/// Return empty string if idx is out of range.
23032305
virtual const char * getAlias(size_t idx) const noexcept = 0;
2306+
/// Return true if alias exists.
2307+
virtual bool hasAlias(const char* alias) const noexcept = 0;
23042308
/**
23052309
* Nothing is done if alias is NULL or empty, if it is already there, or if it is already
23062310
* the named transform name.

src/OpenColorIO/ColorSpace.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <OpenColorIO/OpenColorIO.h>
99

1010
#include "TokensManager.h"
11+
#include "Platform.h"
1112
#include "PrivateTypes.h"
1213
#include "utils/StringUtils.h"
1314

@@ -147,6 +148,18 @@ const char * ColorSpace::getAlias(size_t idx) const noexcept
147148
return "";
148149
}
149150

151+
bool ColorSpace::hasAlias(const char * alias) const noexcept
152+
{
153+
for (size_t idx = 0; idx < getImpl()->m_aliases.size(); ++idx)
154+
{
155+
if (0 == Platform::Strcasecmp(getImpl()->m_aliases[idx].c_str(), alias))
156+
{
157+
return true;
158+
}
159+
}
160+
return false;
161+
}
162+
150163
void ColorSpace::addAlias(const char * alias) noexcept
151164
{
152165
if (alias && *alias)

src/OpenColorIO/NamedTransform.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <OpenColorIO/OpenColorIO.h>
66

77
#include "NamedTransform.h"
8+
#include "Platform.h"
89

910
namespace OCIO_NAMESPACE
1011
{
@@ -64,6 +65,18 @@ const char * NamedTransformImpl::getAlias(size_t idx) const noexcept
6465
return "";
6566
}
6667

68+
bool NamedTransformImpl::hasAlias(const char * alias) const noexcept
69+
{
70+
for (size_t idx = 0; idx < m_aliases.size(); ++idx)
71+
{
72+
if (0 == Platform::Strcasecmp(m_aliases[idx].c_str(), alias))
73+
{
74+
return true;
75+
}
76+
}
77+
return false;
78+
}
79+
6780
void NamedTransformImpl::addAlias(const char * alias) noexcept
6881
{
6982
if (alias && *alias)

src/OpenColorIO/NamedTransform.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class NamedTransformImpl : public NamedTransform
2727

2828
size_t getNumAliases() const noexcept override;
2929
const char * getAlias(size_t idx) const noexcept override;
30+
bool hasAlias(const char * alias) const noexcept override;
3031
void addAlias(const char * alias) noexcept override;
3132
void removeAlias(const char * alias) noexcept override;
3233
void clearAliases() noexcept override;

src/bindings/python/PyColorSpace.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ void bindPyColorSpace(py::module & m)
164164
DOC(ColorSpace, setName))
165165

166166
// Aliases.
167+
.def("hasAlias", &ColorSpace::hasAlias, "alias"_a,
168+
DOC(ColorSpace, hasAlias))
167169
.def("addAlias", &ColorSpace::addAlias, "alias"_a.none(false),
168170
DOC(ColorSpace, addAlias))
169171
.def("removeAlias", &ColorSpace::removeAlias, "alias"_a.none(false),

src/bindings/python/PyNamedTransform.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ void bindPyNamedTransform(py::module & m)
130130
DOC(NamedTransform, setName))
131131

132132
// Aliases.
133+
.def("hasAlias", &NamedTransform::hasAlias, "alias"_a,
134+
DOC(NamedTransform, hasAlias))
133135
.def("addAlias", &NamedTransform::addAlias, "alias"_a.none(false),
134136
DOC(NamedTransform, addAlias))
135137
.def("removeAlias", &NamedTransform::removeAlias, "alias"_a.none(false),

tests/cpu/ColorSpace_tests.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,14 @@ OCIO_ADD_TEST(ColorSpace, alias)
7979
constexpr char AliasB[]{ "aliasB" };
8080
cs->addAlias(AliasA);
8181
OCIO_CHECK_EQUAL(cs->getNumAliases(), 1);
82+
OCIO_CHECK_ASSERT(cs->hasAlias(AliasA));
83+
OCIO_CHECK_ASSERT(cs->hasAlias(AliasAAlt));
84+
OCIO_CHECK_ASSERT(!cs->hasAlias(AliasB));
8285
cs->addAlias(AliasB);
8386
OCIO_CHECK_EQUAL(cs->getNumAliases(), 2);
8487
OCIO_CHECK_EQUAL(std::string(cs->getAlias(0)), AliasA);
8588
OCIO_CHECK_EQUAL(std::string(cs->getAlias(1)), AliasB);
89+
OCIO_CHECK_ASSERT(cs->hasAlias(AliasB));
8690

8791
// Alias with same name (different case) already exists, do nothing.
8892

@@ -96,34 +100,44 @@ OCIO_ADD_TEST(ColorSpace, alias)
96100
cs->removeAlias(AliasAAlt);
97101
OCIO_CHECK_EQUAL(cs->getNumAliases(), 1);
98102
OCIO_CHECK_EQUAL(std::string(cs->getAlias(0)), AliasB);
103+
OCIO_CHECK_ASSERT(!cs->hasAlias(AliasA));
104+
OCIO_CHECK_ASSERT(!cs->hasAlias(AliasAAlt));
99105

100106
// Add with new case.
101107

102108
cs->addAlias(AliasAAlt);
103109
OCIO_CHECK_EQUAL(cs->getNumAliases(), 2);
104110
OCIO_CHECK_EQUAL(std::string(cs->getAlias(0)), AliasB);
105111
OCIO_CHECK_EQUAL(std::string(cs->getAlias(1)), AliasAAlt);
112+
OCIO_CHECK_ASSERT(cs->hasAlias(AliasA));
113+
OCIO_CHECK_ASSERT(cs->hasAlias(AliasAAlt));
106114

107115
// Setting the name of the color space to one of its aliases removes the alias.
108116

109117
cs->setName(AliasA);
110118
OCIO_CHECK_EQUAL(std::string(cs->getName()), AliasA);
111119
OCIO_CHECK_EQUAL(cs->getNumAliases(), 1);
112120
OCIO_CHECK_EQUAL(std::string(cs->getAlias(0)), AliasB);
121+
OCIO_CHECK_ASSERT(!cs->hasAlias(AliasA));
122+
OCIO_CHECK_ASSERT(!cs->hasAlias(AliasAAlt));
113123

114124
// Alias is not added if it is already the color space name.
115125

116126
cs->addAlias(AliasAAlt);
117127
OCIO_CHECK_EQUAL(std::string(cs->getName()), AliasA);
118128
OCIO_CHECK_EQUAL(cs->getNumAliases(), 1);
119129
OCIO_CHECK_EQUAL(std::string(cs->getAlias(0)), AliasB);
130+
OCIO_CHECK_ASSERT(!cs->hasAlias(AliasAAlt));
120131

121132
// Remove all aliases.
122133

123134
cs->addAlias("other");
124135
OCIO_CHECK_EQUAL(cs->getNumAliases(), 2);
136+
OCIO_CHECK_ASSERT(cs->hasAlias("other"));
125137
cs->clearAliases();
126138
OCIO_CHECK_EQUAL(cs->getNumAliases(), 0);
139+
OCIO_CHECK_ASSERT(!cs->hasAlias(AliasB));
140+
OCIO_CHECK_ASSERT(!cs->hasAlias("other"));
127141
}
128142

129143
OCIO_ADD_TEST(ColorSpace, category)

tests/cpu/NamedTransform_tests.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,14 @@ OCIO_ADD_TEST(NamedTransform, alias)
7171
constexpr char AliasB[]{ "aliasB" };
7272
nt->addAlias(AliasA);
7373
OCIO_CHECK_EQUAL(nt->getNumAliases(), 1);
74+
OCIO_CHECK_ASSERT(nt->hasAlias(AliasA));
75+
OCIO_CHECK_ASSERT(nt->hasAlias(AliasAAlt));
76+
OCIO_CHECK_ASSERT(!nt->hasAlias(AliasB));
7477
nt->addAlias(AliasB);
7578
OCIO_CHECK_EQUAL(nt->getNumAliases(), 2);
7679
OCIO_CHECK_EQUAL(std::string(nt->getAlias(0)), AliasA);
7780
OCIO_CHECK_EQUAL(std::string(nt->getAlias(1)), AliasB);
81+
OCIO_CHECK_ASSERT(nt->hasAlias(AliasB));
7882

7983
// Alias with same name (different case) already exists, do nothing.
8084
{
@@ -89,6 +93,8 @@ OCIO_ADD_TEST(NamedTransform, alias)
8993
nt->removeAlias(AliasAAlt);
9094
OCIO_CHECK_EQUAL(nt->getNumAliases(), 1);
9195
OCIO_CHECK_EQUAL(std::string(nt->getAlias(0)), AliasB);
96+
OCIO_CHECK_ASSERT(!nt->hasAlias(AliasA));
97+
OCIO_CHECK_ASSERT(!nt->hasAlias(AliasAAlt));
9298
}
9399

94100
// Add with new case.
@@ -97,6 +103,8 @@ OCIO_ADD_TEST(NamedTransform, alias)
97103
OCIO_CHECK_EQUAL(nt->getNumAliases(), 2);
98104
OCIO_CHECK_EQUAL(std::string(nt->getAlias(0)), AliasB);
99105
OCIO_CHECK_EQUAL(std::string(nt->getAlias(1)), AliasAAlt);
106+
OCIO_CHECK_ASSERT(nt->hasAlias(AliasA));
107+
OCIO_CHECK_ASSERT(nt->hasAlias(AliasAAlt));
100108
}
101109

102110
// Setting the name of the named transform to one of its aliases removes the alias.
@@ -105,6 +113,8 @@ OCIO_ADD_TEST(NamedTransform, alias)
105113
OCIO_CHECK_EQUAL(std::string(nt->getName()), AliasA);
106114
OCIO_CHECK_EQUAL(nt->getNumAliases(), 1);
107115
OCIO_CHECK_EQUAL(std::string(nt->getAlias(0)), AliasB);
116+
OCIO_CHECK_ASSERT(!nt->hasAlias(AliasA));
117+
OCIO_CHECK_ASSERT(!nt->hasAlias(AliasAAlt));
108118
}
109119

110120
// Alias is not added if it is already the named transform name.
@@ -113,14 +123,18 @@ OCIO_ADD_TEST(NamedTransform, alias)
113123
OCIO_CHECK_EQUAL(std::string(nt->getName()), AliasA);
114124
OCIO_CHECK_EQUAL(nt->getNumAliases(), 1);
115125
OCIO_CHECK_EQUAL(std::string(nt->getAlias(0)), AliasB);
126+
OCIO_CHECK_ASSERT(!nt->hasAlias(AliasAAlt));
116127
}
117128

118129
// Remove all aliases.
119130
{
120131
nt->addAlias("other");
121132
OCIO_CHECK_EQUAL(nt->getNumAliases(), 2);
133+
OCIO_CHECK_ASSERT(nt->hasAlias("other"));
122134
nt->clearAliases();
123135
OCIO_CHECK_EQUAL(nt->getNumAliases(), 0);
136+
OCIO_CHECK_ASSERT(!nt->hasAlias(AliasB));
137+
OCIO_CHECK_ASSERT(!nt->hasAlias("other"));
124138
}
125139

126140
//

tests/python/ColorSpaceTest.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ def test_transform(self):
356356

357357
def test_aliases(self):
358358
"""
359-
Test NamedTransform aliases.
359+
Test ColorSpace aliases.
360360
"""
361361

362362
cs = OCIO.ColorSpace()
@@ -368,12 +368,16 @@ def test_aliases(self):
368368
aliases = cs.getAliases()
369369
self.assertEqual(len(aliases), 1)
370370
self.assertEqual(aliases[0], 'alias1')
371+
self.assertTrue(cs.hasAlias('alias1'))
372+
self.assertTrue(cs.hasAlias('aLiaS1'))
373+
self.assertFalse(cs.hasAlias('alias2'))
371374

372375
cs.addAlias('alias2')
373376
aliases = cs.getAliases()
374377
self.assertEqual(len(aliases), 2)
375378
self.assertEqual(aliases[0], 'alias1')
376379
self.assertEqual(aliases[1], 'alias2')
380+
self.assertTrue(cs.hasAlias('alias2'))
377381

378382
# Alias is already there, not added.
379383

@@ -393,12 +397,15 @@ def test_aliases(self):
393397
aliases = cs.getAliases()
394398
self.assertEqual(len(aliases), 1)
395399
self.assertEqual(aliases[0], 'alias1')
400+
self.assertFalse(cs.hasAlias('alias2'))
396401

397402
# Removing an alias.
398403

399404
cs.addAlias('to remove')
400405
aliases = cs.getAliases()
401406
self.assertEqual(len(aliases), 2)
407+
self.assertTrue(cs.hasAlias('to remove'))
408+
self.assertTrue(cs.hasAlias('to REMOVE'))
402409

403410
cs.removeAlias('not found')
404411
aliases = cs.getAliases()
@@ -407,10 +414,12 @@ def test_aliases(self):
407414
cs.removeAlias('to REMOVE')
408415
aliases = cs.getAliases()
409416
self.assertEqual(len(aliases), 1)
417+
self.assertFalse(cs.hasAlias('to remove'))
410418

411419
cs.clearAliases()
412420
aliases = cs.getAliases()
413421
self.assertEqual(len(aliases), 0)
422+
self.assertFalse(cs.hasAlias('alias1'))
414423

415424
def test_is_colorspace_linear(self):
416425
"""

tests/python/NamedTransformTest.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,12 +485,16 @@ def test_aliases(self):
485485
aliases = named_tr.getAliases()
486486
self.assertEqual(len(aliases), 1)
487487
self.assertEqual(aliases[0], 'alias1')
488+
self.assertTrue(named_tr.hasAlias('alias1'))
489+
self.assertTrue(named_tr.hasAlias('aLiAs1'))
490+
self.assertFalse(named_tr.hasAlias('alias2'))
488491

489492
named_tr.addAlias('alias2')
490493
aliases = named_tr.getAliases()
491494
self.assertEqual(len(aliases), 2)
492495
self.assertEqual(aliases[0], 'alias1')
493496
self.assertEqual(aliases[1], 'alias2')
497+
self.assertTrue(named_tr.hasAlias('alias2'))
494498

495499
# Alias is already there, not added.
496500

@@ -510,12 +514,15 @@ def test_aliases(self):
510514
aliases = named_tr.getAliases()
511515
self.assertEqual(len(aliases), 1)
512516
self.assertEqual(aliases[0], 'alias1')
517+
self.assertFalse(named_tr.hasAlias('alias2'))
513518

514519
# Removing an alias.
515520

516521
named_tr.addAlias('to remove')
517522
aliases = named_tr.getAliases()
518523
self.assertEqual(len(aliases), 2)
524+
self.assertTrue(named_tr.hasAlias('to remove'))
525+
self.assertTrue(named_tr.hasAlias('to REMOVE'))
519526

520527
named_tr.removeAlias('not found')
521528
aliases = named_tr.getAliases()
@@ -524,7 +531,9 @@ def test_aliases(self):
524531
named_tr.removeAlias('to REMOVE')
525532
aliases = named_tr.getAliases()
526533
self.assertEqual(len(aliases), 1)
534+
self.assertFalse(named_tr.hasAlias('to remove'))
527535

528536
named_tr.clearAliases()
529537
aliases = named_tr.getAliases()
530538
self.assertEqual(len(aliases), 0)
539+
self.assertFalse(named_tr.hasAlias('alias1'))

0 commit comments

Comments
 (0)