PageRenderTime 25ms CodeModel.GetById 12ms app.highlight 10ms RepoModel.GetById 1ms app.codeStats 0ms

/src/FreeImage/Source/OpenEXR/IlmImf/ImfChannelListAttribute.cpp

https://bitbucket.org/cabalistic/ogredeps/
C++ | 145 lines | 64 code | 28 blank | 53 comment | 8 complexity | 3e34445297de1d765d574de5bf4e0817 MD5 | raw file
  1///////////////////////////////////////////////////////////////////////////
  2//
  3// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
  4// Digital Ltd. LLC
  5// 
  6// All rights reserved.
  7// 
  8// Redistribution and use in source and binary forms, with or without
  9// modification, are permitted provided that the following conditions are
 10// met:
 11// *       Redistributions of source code must retain the above copyright
 12// notice, this list of conditions and the following disclaimer.
 13// *       Redistributions in binary form must reproduce the above
 14// copyright notice, this list of conditions and the following disclaimer
 15// in the documentation and/or other materials provided with the
 16// distribution.
 17// *       Neither the name of Industrial Light & Magic nor the names of
 18// its contributors may be used to endorse or promote products derived
 19// from this software without specific prior written permission. 
 20// 
 21// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 22// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 23// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 24// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 25// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 26// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 27// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 28// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 29// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 30// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 31// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 32//
 33///////////////////////////////////////////////////////////////////////////
 34
 35
 36
 37//-----------------------------------------------------------------------------
 38//
 39//	class ChannelListAttribute
 40//
 41//-----------------------------------------------------------------------------
 42
 43#include <ImfChannelListAttribute.h>
 44
 45
 46namespace Imf {
 47
 48namespace {
 49
 50template <size_t N>
 51void checkIsNullTerminated (const char (&str)[N], const char *what)
 52{
 53    for (int i = 0; i < N; ++i) {
 54        if (str[i] == '\0')
 55            return;
 56   }
 57    std::stringstream s;
 58    s << "Invalid " << what << ": it is more than " << (N - 1) 
 59      << " characters long.";
 60    throw Iex::InputExc(s);
 61}
 62
 63} // namespace
 64
 65template <>
 66const char *
 67ChannelListAttribute::staticTypeName ()
 68{
 69    return "chlist";
 70}
 71
 72
 73template <>
 74void
 75ChannelListAttribute::writeValueTo (OStream &os, int version) const
 76{
 77    for (ChannelList::ConstIterator i = _value.begin();
 78	 i != _value.end();
 79	 ++i)
 80    {
 81	//
 82	// Write name
 83	//
 84
 85	Xdr::write <StreamIO> (os, i.name());
 86
 87	//
 88	// Write Channel struct
 89	//
 90
 91	Xdr::write <StreamIO> (os, int (i.channel().type));
 92	Xdr::write <StreamIO> (os, i.channel().pLinear);
 93	Xdr::pad   <StreamIO> (os, 3);
 94	Xdr::write <StreamIO> (os, i.channel().xSampling);
 95	Xdr::write <StreamIO> (os, i.channel().ySampling);
 96    }
 97
 98    //
 99    // Write end of list marker
100    //
101
102    Xdr::write <StreamIO> (os, "");
103}
104
105
106template <>
107void
108ChannelListAttribute::readValueFrom (IStream &is, int size, int version)
109{
110    while (true)
111    {
112	//
113	// Read name; zero length name means end of channel list
114	//
115
116	char name[Name::SIZE];
117	Xdr::read <StreamIO> (is, Name::MAX_LENGTH, name);
118
119	if (name[0] == 0)
120	    break;
121
122	checkIsNullTerminated (name, "channel name");
123
124	//
125	// Read Channel struct
126	//
127
128	int type;
129	bool pLinear;
130	int xSampling;
131	int ySampling;
132
133	Xdr::read <StreamIO> (is, type);
134	Xdr::read <StreamIO> (is, pLinear);
135	Xdr::skip <StreamIO> (is, 3);
136	Xdr::read <StreamIO> (is, xSampling);
137	Xdr::read <StreamIO> (is, ySampling);
138
139	_value.insert
140	    (name, Channel (PixelType (type), xSampling, ySampling, pLinear));
141    }
142}
143
144
145} // namespace Imf