123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- ///////////////////////////////////////////////////////////////////////////
- //
- // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
- // Digital Ltd. LLC
- //
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are
- // met:
- // * Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following disclaimer
- // in the documentation and/or other materials provided with the
- // distribution.
- // * Neither the name of Industrial Light & Magic nor the names of
- // its contributors may be used to endorse or promote products derived
- // from this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- //
- ///////////////////////////////////////////////////////////////////////////
- //-----------------------------------------------------------------------------
- //
- // class Channel
- // class ChannelList
- //
- //-----------------------------------------------------------------------------
- #include <ImfChannelList.h>
- #include <Iex.h>
- using std::string;
- using std::set;
- #include "ImfNamespace.h"
- OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER
- Channel::Channel (PixelType t, int xs, int ys, bool pl):
- type (t),
- xSampling (xs),
- ySampling (ys),
- pLinear (pl)
- {
- // empty
- }
- bool
- Channel::operator == (const Channel &other) const
- {
- return type == other.type &&
- xSampling == other.xSampling &&
- ySampling == other.ySampling &&
- pLinear == other.pLinear;
- }
- void
- ChannelList::insert (const char name[], const Channel &channel)
- {
- if (name[0] == 0)
- THROW (IEX_NAMESPACE::ArgExc, "Image channel name cannot be an empty string.");
- _map[name] = channel;
- }
- void
- ChannelList::insert (const string &name, const Channel &channel)
- {
- insert (name.c_str(), channel);
- }
- Channel &
- ChannelList::operator [] (const char name[])
- {
- ChannelMap::iterator i = _map.find (name);
- if (i == _map.end())
- THROW (IEX_NAMESPACE::ArgExc, "Cannot find image channel \"" << name << "\".");
- return i->second;
- }
- const Channel &
- ChannelList::operator [] (const char name[]) const
- {
- ChannelMap::const_iterator i = _map.find (name);
- if (i == _map.end())
- THROW (IEX_NAMESPACE::ArgExc, "Cannot find image channel \"" << name << "\".");
- return i->second;
- }
- Channel &
- ChannelList::operator [] (const string &name)
- {
- return this->operator[] (name.c_str());
- }
- const Channel &
- ChannelList::operator [] (const string &name) const
- {
- return this->operator[] (name.c_str());
- }
- Channel *
- ChannelList::findChannel (const char name[])
- {
- ChannelMap::iterator i = _map.find (name);
- return (i == _map.end())? 0: &i->second;
- }
- const Channel *
- ChannelList::findChannel (const char name[]) const
- {
- ChannelMap::const_iterator i = _map.find (name);
- return (i == _map.end())? 0: &i->second;
- }
- Channel *
- ChannelList::findChannel (const string &name)
- {
- return findChannel (name.c_str());
- }
- const Channel *
- ChannelList::findChannel (const string &name) const
- {
- return findChannel (name.c_str());
- }
- ChannelList::Iterator
- ChannelList::begin ()
- {
- return _map.begin();
- }
- ChannelList::ConstIterator
- ChannelList::begin () const
- {
- return _map.begin();
- }
- ChannelList::Iterator
- ChannelList::end ()
- {
- return _map.end();
- }
- ChannelList::ConstIterator
- ChannelList::end () const
- {
- return _map.end();
- }
- ChannelList::Iterator
- ChannelList::find (const char name[])
- {
- return _map.find (name);
- }
- ChannelList::ConstIterator
- ChannelList::find (const char name[]) const
- {
- return _map.find (name);
- }
- ChannelList::Iterator
- ChannelList::find (const string &name)
- {
- return find (name.c_str());
- }
- ChannelList::ConstIterator
- ChannelList::find (const string &name) const
- {
- return find (name.c_str());
- }
- void
- ChannelList::layers (set <string> &layerNames) const
- {
- layerNames.clear();
- for (ConstIterator i = begin(); i != end(); ++i)
- {
- string layerName = i.name();
- size_t pos = layerName.rfind ('.');
- if (pos != string::npos && pos != 0 && pos + 1 < layerName.size())
- {
- layerName.erase (pos);
- layerNames.insert (layerName);
- }
- }
- }
- void
- ChannelList::channelsInLayer (const string &layerName,
- Iterator &first,
- Iterator &last)
- {
- channelsWithPrefix (layerName + '.', first, last);
- }
- void
- ChannelList::channelsInLayer (const string &layerName,
- ConstIterator &first,
- ConstIterator &last) const
- {
- channelsWithPrefix (layerName + '.', first, last);
- }
- void
- ChannelList::channelsWithPrefix (const char prefix[],
- Iterator &first,
- Iterator &last)
- {
- first = last = _map.lower_bound (prefix);
- size_t n = int(strlen (prefix));
- while (last != Iterator (_map.end()) &&
- strncmp (last.name(), prefix, n) <= 0)
- {
- ++last;
- }
- }
- void
- ChannelList::channelsWithPrefix (const char prefix[],
- ConstIterator &first,
- ConstIterator &last) const
- {
- first = last = _map.lower_bound (prefix);
- size_t n = strlen (prefix);
- while (last != ConstIterator (_map.end()) &&
- strncmp (last.name(), prefix, n) <= 0)
- {
- ++last;
- }
- }
- void
- ChannelList::channelsWithPrefix (const string &prefix,
- Iterator &first,
- Iterator &last)
- {
- return channelsWithPrefix (prefix.c_str(), first, last);
- }
- void
- ChannelList::channelsWithPrefix (const string &prefix,
- ConstIterator &first,
- ConstIterator &last) const
- {
- return channelsWithPrefix (prefix.c_str(), first, last);
- }
- bool
- ChannelList::operator == (const ChannelList &other) const
- {
- ConstIterator i = begin();
- ConstIterator j = other.begin();
- while (i != end() && j != other.end())
- {
- if (!(i.channel() == j.channel()))
- return false;
- ++i;
- ++j;
- }
- return i == end() && j == other.end();
- }
- OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT
|