Skip to content

Commit

Permalink
Add hasAlias method to ColorSpace and NamedTransform classes (#2059)
Browse files Browse the repository at this point in the history
* 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>
  • Loading branch information
annieln authored Sep 27, 2024
1 parent 2f5ae2c commit 7fc59f8
Show file tree
Hide file tree
Showing 10 changed files with 82 additions and 1 deletion.
4 changes: 4 additions & 0 deletions include/OpenColorIO/OpenColorIO.h
Original file line number Diff line number Diff line change
Expand Up @@ -1879,6 +1879,8 @@ class OCIOEXPORT ColorSpace
size_t getNumAliases() const noexcept;
/// Return empty string if idx is out of range.
const char * getAlias(size_t idx) const noexcept;
/// Return true if alias exists.
bool hasAlias(const char * alias) const noexcept;
/**
* Add an alias for the color space name (the aliases may be used as a synonym for the
* name). Nothing will be added if the alias is already the color space name, one of its
Expand Down Expand Up @@ -2301,6 +2303,8 @@ class OCIOEXPORT NamedTransform
virtual size_t getNumAliases() const noexcept = 0;
/// Return empty string if idx is out of range.
virtual const char * getAlias(size_t idx) const noexcept = 0;
/// Return true if alias exists.
virtual bool hasAlias(const char* alias) const noexcept = 0;
/**
* Nothing is done if alias is NULL or empty, if it is already there, or if it is already
* the named transform name.
Expand Down
13 changes: 13 additions & 0 deletions src/OpenColorIO/ColorSpace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <OpenColorIO/OpenColorIO.h>

#include "TokensManager.h"
#include "Platform.h"
#include "PrivateTypes.h"
#include "utils/StringUtils.h"

Expand Down Expand Up @@ -147,6 +148,18 @@ const char * ColorSpace::getAlias(size_t idx) const noexcept
return "";
}

bool ColorSpace::hasAlias(const char * alias) const noexcept
{
for (size_t idx = 0; idx < getImpl()->m_aliases.size(); ++idx)
{
if (0 == Platform::Strcasecmp(getImpl()->m_aliases[idx].c_str(), alias))
{
return true;
}
}
return false;
}

void ColorSpace::addAlias(const char * alias) noexcept
{
if (alias && *alias)
Expand Down
13 changes: 13 additions & 0 deletions src/OpenColorIO/NamedTransform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <OpenColorIO/OpenColorIO.h>

#include "NamedTransform.h"
#include "Platform.h"

namespace OCIO_NAMESPACE
{
Expand Down Expand Up @@ -64,6 +65,18 @@ const char * NamedTransformImpl::getAlias(size_t idx) const noexcept
return "";
}

bool NamedTransformImpl::hasAlias(const char * alias) const noexcept
{
for (size_t idx = 0; idx < m_aliases.size(); ++idx)
{
if (0 == Platform::Strcasecmp(m_aliases[idx].c_str(), alias))
{
return true;
}
}
return false;
}

void NamedTransformImpl::addAlias(const char * alias) noexcept
{
if (alias && *alias)
Expand Down
1 change: 1 addition & 0 deletions src/OpenColorIO/NamedTransform.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class NamedTransformImpl : public NamedTransform

size_t getNumAliases() const noexcept override;
const char * getAlias(size_t idx) const noexcept override;
bool hasAlias(const char * alias) const noexcept override;
void addAlias(const char * alias) noexcept override;
void removeAlias(const char * alias) noexcept override;
void clearAliases() noexcept override;
Expand Down
2 changes: 2 additions & 0 deletions src/bindings/python/PyColorSpace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,8 @@ void bindPyColorSpace(py::module & m)
DOC(ColorSpace, setName))

// Aliases.
.def("hasAlias", &ColorSpace::hasAlias, "alias"_a,
DOC(ColorSpace, hasAlias))
.def("addAlias", &ColorSpace::addAlias, "alias"_a.none(false),
DOC(ColorSpace, addAlias))
.def("removeAlias", &ColorSpace::removeAlias, "alias"_a.none(false),
Expand Down
2 changes: 2 additions & 0 deletions src/bindings/python/PyNamedTransform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,8 @@ void bindPyNamedTransform(py::module & m)
DOC(NamedTransform, setName))

// Aliases.
.def("hasAlias", &NamedTransform::hasAlias, "alias"_a,
DOC(NamedTransform, hasAlias))
.def("addAlias", &NamedTransform::addAlias, "alias"_a.none(false),
DOC(NamedTransform, addAlias))
.def("removeAlias", &NamedTransform::removeAlias, "alias"_a.none(false),
Expand Down
14 changes: 14 additions & 0 deletions tests/cpu/ColorSpace_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,14 @@ OCIO_ADD_TEST(ColorSpace, alias)
constexpr char AliasB[]{ "aliasB" };
cs->addAlias(AliasA);
OCIO_CHECK_EQUAL(cs->getNumAliases(), 1);
OCIO_CHECK_ASSERT(cs->hasAlias(AliasA));
OCIO_CHECK_ASSERT(cs->hasAlias(AliasAAlt));
OCIO_CHECK_ASSERT(!cs->hasAlias(AliasB));
cs->addAlias(AliasB);
OCIO_CHECK_EQUAL(cs->getNumAliases(), 2);
OCIO_CHECK_EQUAL(std::string(cs->getAlias(0)), AliasA);
OCIO_CHECK_EQUAL(std::string(cs->getAlias(1)), AliasB);
OCIO_CHECK_ASSERT(cs->hasAlias(AliasB));

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

Expand All @@ -96,34 +100,44 @@ OCIO_ADD_TEST(ColorSpace, alias)
cs->removeAlias(AliasAAlt);
OCIO_CHECK_EQUAL(cs->getNumAliases(), 1);
OCIO_CHECK_EQUAL(std::string(cs->getAlias(0)), AliasB);
OCIO_CHECK_ASSERT(!cs->hasAlias(AliasA));
OCIO_CHECK_ASSERT(!cs->hasAlias(AliasAAlt));

// Add with new case.

cs->addAlias(AliasAAlt);
OCIO_CHECK_EQUAL(cs->getNumAliases(), 2);
OCIO_CHECK_EQUAL(std::string(cs->getAlias(0)), AliasB);
OCIO_CHECK_EQUAL(std::string(cs->getAlias(1)), AliasAAlt);
OCIO_CHECK_ASSERT(cs->hasAlias(AliasA));
OCIO_CHECK_ASSERT(cs->hasAlias(AliasAAlt));

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

cs->setName(AliasA);
OCIO_CHECK_EQUAL(std::string(cs->getName()), AliasA);
OCIO_CHECK_EQUAL(cs->getNumAliases(), 1);
OCIO_CHECK_EQUAL(std::string(cs->getAlias(0)), AliasB);
OCIO_CHECK_ASSERT(!cs->hasAlias(AliasA));
OCIO_CHECK_ASSERT(!cs->hasAlias(AliasAAlt));

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

cs->addAlias(AliasAAlt);
OCIO_CHECK_EQUAL(std::string(cs->getName()), AliasA);
OCIO_CHECK_EQUAL(cs->getNumAliases(), 1);
OCIO_CHECK_EQUAL(std::string(cs->getAlias(0)), AliasB);
OCIO_CHECK_ASSERT(!cs->hasAlias(AliasAAlt));

// Remove all aliases.

cs->addAlias("other");
OCIO_CHECK_EQUAL(cs->getNumAliases(), 2);
OCIO_CHECK_ASSERT(cs->hasAlias("other"));
cs->clearAliases();
OCIO_CHECK_EQUAL(cs->getNumAliases(), 0);
OCIO_CHECK_ASSERT(!cs->hasAlias(AliasB));
OCIO_CHECK_ASSERT(!cs->hasAlias("other"));
}

OCIO_ADD_TEST(ColorSpace, category)
Expand Down
14 changes: 14 additions & 0 deletions tests/cpu/NamedTransform_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,14 @@ OCIO_ADD_TEST(NamedTransform, alias)
constexpr char AliasB[]{ "aliasB" };
nt->addAlias(AliasA);
OCIO_CHECK_EQUAL(nt->getNumAliases(), 1);
OCIO_CHECK_ASSERT(nt->hasAlias(AliasA));
OCIO_CHECK_ASSERT(nt->hasAlias(AliasAAlt));
OCIO_CHECK_ASSERT(!nt->hasAlias(AliasB));
nt->addAlias(AliasB);
OCIO_CHECK_EQUAL(nt->getNumAliases(), 2);
OCIO_CHECK_EQUAL(std::string(nt->getAlias(0)), AliasA);
OCIO_CHECK_EQUAL(std::string(nt->getAlias(1)), AliasB);
OCIO_CHECK_ASSERT(nt->hasAlias(AliasB));

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

// Add with new case.
Expand All @@ -97,6 +103,8 @@ OCIO_ADD_TEST(NamedTransform, alias)
OCIO_CHECK_EQUAL(nt->getNumAliases(), 2);
OCIO_CHECK_EQUAL(std::string(nt->getAlias(0)), AliasB);
OCIO_CHECK_EQUAL(std::string(nt->getAlias(1)), AliasAAlt);
OCIO_CHECK_ASSERT(nt->hasAlias(AliasA));
OCIO_CHECK_ASSERT(nt->hasAlias(AliasAAlt));
}

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

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

// Remove all aliases.
{
nt->addAlias("other");
OCIO_CHECK_EQUAL(nt->getNumAliases(), 2);
OCIO_CHECK_ASSERT(nt->hasAlias("other"));
nt->clearAliases();
OCIO_CHECK_EQUAL(nt->getNumAliases(), 0);
OCIO_CHECK_ASSERT(!nt->hasAlias(AliasB));
OCIO_CHECK_ASSERT(!nt->hasAlias("other"));
}

//
Expand Down
11 changes: 10 additions & 1 deletion tests/python/ColorSpaceTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,7 @@ def test_transform(self):

def test_aliases(self):
"""
Test NamedTransform aliases.
Test ColorSpace aliases.
"""

cs = OCIO.ColorSpace()
Expand All @@ -368,12 +368,16 @@ def test_aliases(self):
aliases = cs.getAliases()
self.assertEqual(len(aliases), 1)
self.assertEqual(aliases[0], 'alias1')
self.assertTrue(cs.hasAlias('alias1'))
self.assertTrue(cs.hasAlias('aLiaS1'))
self.assertFalse(cs.hasAlias('alias2'))

cs.addAlias('alias2')
aliases = cs.getAliases()
self.assertEqual(len(aliases), 2)
self.assertEqual(aliases[0], 'alias1')
self.assertEqual(aliases[1], 'alias2')
self.assertTrue(cs.hasAlias('alias2'))

# Alias is already there, not added.

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

# Removing an alias.

cs.addAlias('to remove')
aliases = cs.getAliases()
self.assertEqual(len(aliases), 2)
self.assertTrue(cs.hasAlias('to remove'))
self.assertTrue(cs.hasAlias('to REMOVE'))

cs.removeAlias('not found')
aliases = cs.getAliases()
Expand All @@ -407,10 +414,12 @@ def test_aliases(self):
cs.removeAlias('to REMOVE')
aliases = cs.getAliases()
self.assertEqual(len(aliases), 1)
self.assertFalse(cs.hasAlias('to remove'))

cs.clearAliases()
aliases = cs.getAliases()
self.assertEqual(len(aliases), 0)
self.assertFalse(cs.hasAlias('alias1'))

def test_is_colorspace_linear(self):
"""
Expand Down
9 changes: 9 additions & 0 deletions tests/python/NamedTransformTest.py
Original file line number Diff line number Diff line change
Expand Up @@ -485,12 +485,16 @@ def test_aliases(self):
aliases = named_tr.getAliases()
self.assertEqual(len(aliases), 1)
self.assertEqual(aliases[0], 'alias1')
self.assertTrue(named_tr.hasAlias('alias1'))
self.assertTrue(named_tr.hasAlias('aLiAs1'))
self.assertFalse(named_tr.hasAlias('alias2'))

named_tr.addAlias('alias2')
aliases = named_tr.getAliases()
self.assertEqual(len(aliases), 2)
self.assertEqual(aliases[0], 'alias1')
self.assertEqual(aliases[1], 'alias2')
self.assertTrue(named_tr.hasAlias('alias2'))

# Alias is already there, not added.

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

# Removing an alias.

named_tr.addAlias('to remove')
aliases = named_tr.getAliases()
self.assertEqual(len(aliases), 2)
self.assertTrue(named_tr.hasAlias('to remove'))
self.assertTrue(named_tr.hasAlias('to REMOVE'))

named_tr.removeAlias('not found')
aliases = named_tr.getAliases()
Expand All @@ -524,7 +531,9 @@ def test_aliases(self):
named_tr.removeAlias('to REMOVE')
aliases = named_tr.getAliases()
self.assertEqual(len(aliases), 1)
self.assertFalse(named_tr.hasAlias('to remove'))

named_tr.clearAliases()
aliases = named_tr.getAliases()
self.assertEqual(len(aliases), 0)
self.assertFalse(named_tr.hasAlias('alias1'))

0 comments on commit 7fc59f8

Please sign in to comment.