diff options
Diffstat (limited to 'src/core/FileFormatIridasLook.cpp')
-rw-r--r-- | src/core/FileFormatIridasLook.cpp | 1356 |
1 files changed, 1356 insertions, 0 deletions
diff --git a/src/core/FileFormatIridasLook.cpp b/src/core/FileFormatIridasLook.cpp new file mode 100644 index 0000000..d53c641 --- /dev/null +++ b/src/core/FileFormatIridasLook.cpp @@ -0,0 +1,1356 @@ +/* +Copyright (c) 2003-2010 Sony Pictures Imageworks Inc., et al. +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 Sony Pictures Imageworks 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. +*/ + +#include <cstdio> +#include <cstring> +#include <iterator> + +#include <tinyxml.h> + +#include <OpenColorIO/OpenColorIO.h> + +#include "FileTransform.h" +#include "Lut1DOp.h" +#include "Lut3DOp.h" +#include "ParseUtils.h" +#include "pystring/pystring.h" + +/* + +Iridas .look format + +An XML format containing <shaders>, a series of layers describing the +operations and their parameters (irrelevant to us in this context). + +This series of shaders is baked into the <LUT> section. + +<?xml version="1.0" ?> +<look> + <shaders> + # anything in here is useless to us + </shaders> + <LUT> + <size>"8"</size> # Size of 3D LUT + <data>" + 0000008000000080000000802CF52E3D2DF52E3D2DF52E3D2CF5AE3D2DF5AE3D + # ...cut... + 5A216A3F5A216A3FAD10753FAD10753FAD10753F0000803F0000803F0000803F" + </data> + </LUT> +</look> + +The LUT data contains a 3D LUT, as a hex-encoded series of 32-bit +floats, with little-endian bit-ordering. LUT value ordering is +LUT3DORDER_FAST_RED (red index incrementing fastest, then green, then +blue) + +The LUT data is parsed by removing all whitespace and quotes. Taking 8 +characters at a time and intepreting as little-endian float, as follows: + +Given the string "0000003F0000803FAD10753F": + + >>> import binascii, struct + >>> struct.unpack("<f", binascii.unhexlify("0000003F"))[0] + 0.5 + >>> struct.unpack("<f", binascii.unhexlify("0000803F"))[0] + 1.0 + >>> struct.unpack("<f", binascii.unhexlify("AD10753F"))[0] + 0.9572857022285461 + + */ + + +OCIO_NAMESPACE_ENTER +{ + namespace + { + // convert hex ascii to int + // return true on success, false on failure + bool hexasciitoint(char& ival, char character) + { + if(character>=48 && character<=57) // [0-9] + { + ival = static_cast<char>(character-48); + return true; + } + else if(character>=65 && character<=70) // [A-F] + { + ival = static_cast<char>(10+character-65); + return true; + } + else if(character>=97 && character<=102) // [a-f] + { + ival = static_cast<char>(10+character-97); + return true; + } + + ival = 0; + return false; + } + + // convert array of 8 hex ascii to f32 + // The input hexascii is required to be a little-endian representation + // as used in the iridas file format + // "AD10753F" -> 0.9572857022285461f on ALL architectures + + bool hexasciitofloat(float& fval, const char * ascii) + { + // Convert all ASCII numbers to their numerical representations + char asciinums[8]; + for(unsigned int i=0; i<8; ++i) + { + if(!hexasciitoint(asciinums[i], ascii[i])) + { + return false; + } + } + + unsigned char * fvalbytes = reinterpret_cast<unsigned char *>(&fval); + +#if OCIO_LITTLE_ENDIAN + // Since incoming values are little endian, and we're on little endian + // preserve the byte order + fvalbytes[0] = (unsigned char) (asciinums[1] | (asciinums[0] << 4)); + fvalbytes[1] = (unsigned char) (asciinums[3] | (asciinums[2] << 4)); + fvalbytes[2] = (unsigned char) (asciinums[5] | (asciinums[4] << 4)); + fvalbytes[3] = (unsigned char) (asciinums[7] | (asciinums[6] << 4)); +#else + // Since incoming values are little endian, and we're on big endian + // flip the byte order + fvalbytes[3] = (unsigned char) (asciinums[1] | (asciinums[0] << 4)); + fvalbytes[2] = (unsigned char) (asciinums[3] | (asciinums[2] << 4)); + fvalbytes[1] = (unsigned char) (asciinums[5] | (asciinums[4] << 4)); + fvalbytes[0] = (unsigned char) (asciinums[7] | (asciinums[6] << 4)); +#endif + return true; + } + } + + namespace + { + class LocalCachedFile : public CachedFile + { + public: + LocalCachedFile () + { + lut3D = Lut3D::Create(); + }; + ~LocalCachedFile() {}; + + Lut3DRcPtr lut3D; + }; + + typedef OCIO_SHARED_PTR<LocalCachedFile> LocalCachedFileRcPtr; + typedef OCIO_SHARED_PTR<TiXmlDocument> TiXmlDocumentRcPtr; + + + class LocalFileFormat : public FileFormat + { + public: + + ~LocalFileFormat() {}; + + virtual void GetFormatInfo(FormatInfoVec & formatInfoVec) const; + + virtual CachedFileRcPtr Read(std::istream & istream) const; + + virtual void BuildFileOps(OpRcPtrVec & ops, + const Config& config, + const ConstContextRcPtr & context, + CachedFileRcPtr untypedCachedFile, + const FileTransform& fileTransform, + TransformDirection dir) const; + }; + + void LocalFileFormat::GetFormatInfo(FormatInfoVec & formatInfoVec) const + { + FormatInfo info; + info.name = "iridas_look"; + info.extension = "look"; + info.capabilities = FORMAT_CAPABILITY_READ; + formatInfoVec.push_back(info); + } + + CachedFileRcPtr + LocalFileFormat::Read(std::istream & istream) const + { + + // Get root element from XML file + TiXmlDocumentRcPtr doc; + TiXmlElement* rootElement; + + { + std::ostringstream rawdata; + rawdata << istream.rdbuf(); + + doc = TiXmlDocumentRcPtr(new TiXmlDocument()); + doc->Parse(rawdata.str().c_str()); + + if(doc->Error()) + { + std::ostringstream os; + os << "XML Parse Error. "; + os << doc->ErrorDesc() << " (line "; + os << doc->ErrorRow() << ", character "; + os << doc->ErrorCol() << ")"; + throw Exception(os.str().c_str()); + } + + // Check for blank file + rootElement = doc->RootElement(); + if(!rootElement) + { + std::ostringstream os; + os << "Error loading xml. Null root element."; + throw Exception(os.str().c_str()); + } + } + + // Check root element is <look> + if(std::string(rootElement->Value()) != "look") + { + std::ostringstream os; + os << "Error loading .look LUT. "; + os << "Root element is type '" << rootElement->Value() << "', "; + os << "expected 'look'."; + throw Exception(os.str().c_str()); + } + + // Fail to load file if it contains a <mask> section + if(rootElement->FirstChild("mask") && rootElement->FirstChild("mask")->FirstChild()) + { + // If root element contains "mask" child, and it is + // not empty, throw exception + std::ostringstream os; + os << "Cannot load .look LUT containing mask"; + throw Exception(os.str().c_str()); + } + + // Get <LUT> section + + // TODO: There is a LUT1D section in some .look files, + // which we could use if available. Need to check + // assumption that it is only written for 1D transforms, + // and it matches the desired output + TiXmlNode* lutsection = rootElement->FirstChild("LUT"); + + if(!lutsection) + { + std::ostringstream os; + os << "Error loading .look LUT. "; + os << "Could not find required 'LUT' section."; + throw Exception(os.str().c_str()); + } + + // Get 3D LUT size + int size_3d = -1; + + { + // Get size from <look><LUT><size>'123'</size></LUT></look> + TiXmlNode* elemsize = lutsection->FirstChild("size"); + if(!elemsize) + { + std::ostringstream os; + os << "Error loading .look LUT. "; + os << "LUT section did not contain 'size'."; + throw Exception(os.str().c_str()); + } + + std::string size_raw = std::string(elemsize->ToElement()->GetText()); + std::string size_clean = pystring::strip(size_raw, "'\" "); // strip quotes and space + + char* endptr = 0; + size_3d = static_cast<int>(strtol(size_clean.c_str(), &endptr, 10)); + + if(*endptr) + { + // strtol didn't consume entire string, there was + // remaining data, thus did not contain a single interger + std::ostringstream os; + os << "Invalid LUT size value: '" << size_raw; + os << "'. Expected quoted integer."; + throw Exception(os.str().c_str()); + } + } + + // Grab raw 3D data + std::vector<float> raw; + { + TiXmlNode* dataelem = lutsection->FirstChild("data"); + if(!dataelem) + { + std::ostringstream os; + os << "Error loading .look LUT. "; + os << "LUT section did not contain 'data'."; + throw Exception(os.str().c_str()); + } + + raw.reserve(3*(size_3d*size_3d*size_3d)); + + std::string what = dataelem->ToElement()->GetText(); + + // Remove spaces, quotes and newlines + what = pystring::replace(what, " ", ""); + what = pystring::replace(what, "\"", ""); + what = pystring::replace(what, "'", ""); + what = pystring::replace(what, "\n", ""); + + if(what.size() % 8 != 0) + { + std::ostringstream os; + os << "Error loading .look LUT. "; + os << "Number of characters in 'data' must be multiple of 8. "; + os << what.size() << " elements found."; + throw Exception(os.str().c_str()); + } + + const char * ascii = what.c_str(); + float fval = 0.0f; + for(unsigned int i=0; i<what.size()/8; ++i) + { + if(!hexasciitofloat(fval, &ascii[8*i])) + { + std::ostringstream os; + os << "Error loading .look LUT. "; + os << "Non-hex characters found in 'data' block "; + os << "at index '" << (8*i) << "'."; + throw Exception(os.str().c_str()); + } + raw.push_back(fval); + } + } + + + // Validate LUT sizes, and create cached file object + LocalCachedFileRcPtr cachedFile = LocalCachedFileRcPtr(new LocalCachedFile()); + + if((size_3d*size_3d*size_3d)*3 != static_cast<int>(raw.size())) + { + std::ostringstream os; + os << "Parse error in Iridas .look lut. "; + os << "Incorrect number of lut3d entries. "; + os << "Found " << raw.size() << " values, expected " << (size_3d*size_3d*size_3d)*3 << "."; + throw Exception(os.str().c_str()); + } + + // Reformat 3D data + cachedFile->lut3D->size[0] = size_3d; + cachedFile->lut3D->size[1] = size_3d; + cachedFile->lut3D->size[2] = size_3d; + cachedFile->lut3D->lut = raw; + + return cachedFile; + } + + + void + LocalFileFormat::BuildFileOps(OpRcPtrVec & ops, + const Config& /*config*/, + const ConstContextRcPtr & /*context*/, + CachedFileRcPtr untypedCachedFile, + const FileTransform& fileTransform, + TransformDirection dir) const + { + LocalCachedFileRcPtr cachedFile = DynamicPtrCast<LocalCachedFile>(untypedCachedFile); + + // This should never happen. + if(!cachedFile) + { + std::ostringstream os; + os << "Cannot build Iridas .look Op. Invalid cache type."; + throw Exception(os.str().c_str()); + } + + TransformDirection newDir = CombineTransformDirections(dir, + fileTransform.getDirection()); + if(newDir == TRANSFORM_DIR_UNKNOWN) + { + std::ostringstream os; + os << "Cannot build file format transform,"; + os << " unspecified transform direction."; + throw Exception(os.str().c_str()); + } + + CreateLut3DOp(ops, cachedFile->lut3D, + fileTransform.getInterpolation(), newDir); + } + } + + FileFormat * CreateFileFormatIridasLook() + { + return new LocalFileFormat(); + } +} +OCIO_NAMESPACE_EXIT + + +/////////////////////////////////////////////////////////////////////////////// + +#ifdef OCIO_UNIT_TEST + +#include "UnitTest.h" + +OCIO_NAMESPACE_USING + + + +OIIO_ADD_TEST(FileFormatIridasLook, hexasciitoint) +{ + { + char ival = 0; + bool success = hexasciitoint(ival, 'a'); + OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(ival, 10); + } + + { + char ival = 0; + bool success = hexasciitoint(ival, 'A'); + OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(ival, 10); + } + + { + char ival = 0; + bool success = hexasciitoint(ival, 'f'); + OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(ival, 15); + } + + { + char ival = 0; + bool success = hexasciitoint(ival, 'F'); + OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(ival, 15); + } + + { + char ival = 0; + bool success = hexasciitoint(ival, '0'); + OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(ival, 0); + } + + { + char ival = 0; + bool success = hexasciitoint(ival, '0'); + OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(ival, 0); + } + + { + char ival = 0; + bool success = hexasciitoint(ival, '9'); + OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(ival, 9); + } + + { + char ival = 0; + bool success = hexasciitoint(ival, '\n'); + OIIO_CHECK_EQUAL(success, false); + } + + { + char ival = 0; + bool success = hexasciitoint(ival, 'j'); + OIIO_CHECK_EQUAL(success, false); + } + + { + char ival = 0; + bool success = hexasciitoint(ival, 'x'); + OIIO_CHECK_EQUAL(success, false); + } +} + + +OIIO_ADD_TEST(FileFormatIridasLook, hexasciitofloat) +{ + //>>> import binascii, struct + //>> struct.unpack("<f", binascii.unhexlify("AD10753F"))[0] + //0.9572857022285461 + + { + float fval = 0.0f; + bool success = hexasciitofloat(fval, "0000003F"); + OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(fval, 0.5f); + } + + { + float fval = 0.0f; + bool success = hexasciitofloat(fval, "0000803F"); + OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(fval, 1.0f); + } + + { + float fval = 0.0f; + bool success = hexasciitofloat(fval, "AD10753F"); + OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(fval, 0.9572857022285461f); + } + + { + float fval = 0.0f; + bool success = hexasciitofloat(fval, "AD10X53F"); + OIIO_CHECK_EQUAL(success, false); + } +} + + +OIIO_ADD_TEST(FileFormatIridasLook, simple3d) +{ + std::ostringstream strebuf; + strebuf << "<?xml version=\"1.0\" ?>" << "\n"; + strebuf << "<look>" << "\n"; + strebuf << " <shaders>" << "\n"; + strebuf << " <base>" << "\n"; + strebuf << " <visible>\"1\"</visible>" << "\n"; + strebuf << " <sublayer0>" << "\n"; + strebuf << " <opacity>\"1\"</opacity>" << "\n"; + strebuf << " <parameters>" << "\n"; + strebuf << " <Secondary1>\"1\"</Secondary1>" << "\n"; + strebuf << " <Secondary5>\"0\"</Secondary5>" << "\n"; + strebuf << " <Secondary4>\"0\"</Secondary4>" << "\n"; + strebuf << " <Secondary2>\"0\"</Secondary2>" << "\n"; + strebuf << " <Secondary6>\"0\"</Secondary6>" << "\n"; + strebuf << " <Secondary3>\"0\"</Secondary3>" << "\n"; + strebuf << " <Blur>\"0\"</Blur>" << "\n"; + strebuf << " <saturation>\"0\"</saturation>" << "\n"; + strebuf << " </parameters>" << "\n"; + strebuf << " </sublayer0>" << "\n"; + strebuf << " </base>" << "\n"; + strebuf << " </shaders>" << "\n"; + strebuf << " <LUT>" << "\n"; + strebuf << " <size>\"8\"</size>" << "\n"; + strebuf << " <data>\"" << "\n"; + strebuf << " 0000008000000080000000802CF52E3D2DF52E3D2DF52E3D2CF5AE3D2DF5AE3D" << "\n"; + strebuf << " 2DF5AE3DE237033EE237033EE237033E2CF52E3E2DF52E3E2DF52E3E78B25A3E" << "\n"; + strebuf << " 78B25A3E78B25A3EE037833EE137833EE137833E8616993E8716993E8716993E" << "\n"; + strebuf << " 4BBDAB3D4BBDAB3D4BBDAB3DF09B013EF09B013EF09B013E3C592D3E3C592D3E" << "\n"; + strebuf << " 3C592D3E8716593E8716593E8716593EE969823EE969823EE969823E8E48983E" << "\n"; + strebuf << " 8E48983E8E48983E3227AE3E3327AE3E3327AE3ED805C43ED905C43ED905C43E" << "\n"; + strebuf << " 4BBD2B3E4BBD2B3E4BBD2B3E967A573E967A573E967A573EF09B813EF09B813E" << "\n"; + strebuf << " F09B813E967A973E967A973E967A973E3C59AD3E3C59AD3E3C59AD3EE137C33E" << "\n"; + strebuf << " E137C33EE137C33E8616D93E8616D93E8616D93E2CF5EE3E2CF5EE3E2CF5EE3E" << "\n"; + strebuf << " F9CD803EF9CD803EF9CD803E9EAC963E9EAC963E9EAC963E448BAC3E448BAC3E" << "\n"; + strebuf << " 448BAC3EEA69C23EEA69C23EEA69C23E8F48D83E8F48D83E8F48D83E3527EE3E" << "\n"; + strebuf << " 3527EE3E3527EE3EED02023FED02023FED02023F40F20C3F40F20C3F40F20C3F" << "\n"; + strebuf << " 4BBDAB3E4BBDAB3E4BBDAB3EF09BC13EF09BC13EF09BC13E967AD73E967AD73E" << "\n"; + strebuf << " 967AD73E3C59ED3E3C59ED3E3C59ED3EF09B013FF09B013FF09B013F438B0C3F" << "\n"; + strebuf << " 438B0C3F438B0C3F967A173F967A173F967A173FE969223FE969223FE969223F" << "\n"; + strebuf << " 9EACD63E9EACD63E9EACD63E428BEC3E438BEC3E438BEC3EF434013FF434013F" << "\n"; + strebuf << " F434013F47240C3F47240C3F47240C3F9A13173F9A13173F9A13173FED02223F" << "\n"; + strebuf << " ED02223FED02223F3FF22C3F3FF22C3F3FF22C3F92E1373F92E1373F92E1373F" << "\n"; + strebuf << " F8CD003FF8CD003FF8CD003F49BD0B3F4ABD0B3F4ABD0B3F9DAC163F9DAC163F" << "\n"; + strebuf << " 9DAC163FF09B213FF09B213FF09B213F438B2C3F438B2C3F438B2C3F967A373F" << "\n"; + strebuf << " 967A373F967A373FE869423FE869423FE869423F3B594D3F3B594D3F3B594D3F" << "\n"; + strebuf << " A245163FA245163FA245163FF334213FF434213FF434213F47242C3F47242C3F" << "\n"; + strebuf << " 47242C3F9A13373F9A13373F9A13373FED02423FED02423FED02423F40F24C3F" << "\n"; + strebuf << " 40F24C3F40F24C3F92E1573F92E1573F92E1573FE5D0623FE5D0623FE5D0623F" << "\n"; + strebuf << " 9E69853C9E69853C9869853CFCA9713DFCA9713DFCA9713D944FD03D944FD03D" << "\n"; + strebuf << " 944FD03D14E5133E15E5133E15E5133E60A23F3E60A23F3E60A23F3EAA5F6B3E" << "\n"; + strebuf << " AB5F6B3EAB5F6B3E7A8E8B3E7A8E8B3E7A8E8B3E206DA13E206DA13E206DA13E" << "\n"; + strebuf << " B217CD3DB217CD3DB217CD3D2449123E2449123E2449123E6F063E3E6F063E3E" << "\n"; + strebuf << " 6F063E3EBAC3693EBAC3693EBAC3693E82C08A3E82C08A3E82C08A3E289FA03E" << "\n"; + strebuf << " 289FA03E289FA03ECC7DB63ECC7DB63ECC7DB63E725CCC3E715CCC3E715CCC3E" << "\n"; + strebuf << " 7E6A3C3E7E6A3C3E7E6A3C3ECA27683ECA27683ECA27683E8AF2893E8AF2893E" << "\n"; + strebuf << " 8AF2893E30D19F3E30D19F3E30D19F3ED5AFB53ED5AFB53ED5AFB53E7B8ECB3E" << "\n"; + strebuf << " 7B8ECB3E7A8ECB3E1F6DE13E1F6DE13E1E6DE13EC44BF73EC54BF73EC44BF73E" << "\n"; + strebuf << " 9224893E9224893E9224893E38039F3E38039F3E38039F3EDEE1B43EDEE1B43E" << "\n"; + strebuf << " DEE1B43E83C0CA3E83C0CA3E82C0CA3E299FE03E299FE03E289FE03ECE7DF63E" << "\n"; + strebuf << " CE7DF63ECD7DF63E392E063F392E063F382E063F8C1D113F8C1D113F8B1D113F" << "\n"; + strebuf << " E413B43EE413B43EE413B43E89F2C93E8AF2C93E89F2C93E30D1DF3E30D1DF3E" << "\n"; + strebuf << " 2FD1DF3ED5AFF53ED5AFF53ED4AFF53E3DC7053F3DC7053F3CC7053F90B6103F" << "\n"; + strebuf << " 90B6103F8FB6103FE2A51B3FE2A51B3FE1A51B3F3595263F3595263F3495263F" << "\n"; + strebuf << " 3703DF3E3703DF3E3603DF3EDCE1F43EDDE1F43EDCE1F43E4160053F4160053F" << "\n"; + strebuf << " 4060053F944F103F944F103F934F103FE73E1B3FE73E1B3FE63E1B3F392E263F" << "\n"; + strebuf << " 392E263F382E263F8C1D313F8C1D313F8B1D313FDF0C3C3FDF0C3C3FDE0C3C3F" << "\n"; + strebuf << " 44F9043F44F9043F43F9043F96E80F3F97E80F3F96E80F3FEAD71A3FEAD71A3F" << "\n"; + strebuf << " E9D71A3F3DC7253F3DC7253F3CC7253F90B6303F90B6303F8FB6303FE2A53B3F" << "\n"; + strebuf << " E2A53B3FE1A53B3F3595463F3595463F3495463F8884513F8884513F8784513F" << "\n"; + strebuf << " EE701A3FEE701A3FED701A3F4060253F4160253F4060253F944F303F944F303F" << "\n"; + strebuf << " 934F303FE73E3B3FE73E3B3FE63E3B3F3A2E463F3A2E463F392E463F8C1D513F" << "\n"; + strebuf << " 8C1D513F8B1D513FDF0C5C3FDF0C5C3FDE0C5C3F32FC663F32FC663F31FC663F" << "\n"; + strebuf << " 9E69053D9E69053D9869053D652F9A3D652F9A3D642F9A3DFCA9F13DFCA9F13D" << "\n"; + strebuf << " FCA9F13D4892243E4992243E4992243E944F503E944F503E944F503EDE0C7C3E" << "\n"; + strebuf << " DF0C7C3EDF0C7C3E14E5933E14E5933E14E5933EBAC3A93EBAC3A93EBAC3A93E" << "\n"; + strebuf << " 1A72EE3D1A72EE3D1A72EE3D58F6223E58F6223E58F6223EA3B34E3EA3B34E3E" << "\n"; + strebuf << " A3B34E3EEE707A3EEE707A3EEE707A3E1C17933E1C17933E1C17933EC2F5A83E" << "\n"; + strebuf << " C2F5A83EC2F5A83E66D4BE3E66D4BE3E66D4BE3E0CB3D43E0BB3D43E0CB3D43E" << "\n"; + strebuf << " B2174D3EB2174D3EB2174D3EFDD4783EFDD4783EFDD4783E2449923E2449923E" << "\n"; + strebuf << " 2449923ECA27A83ECA27A83ECA27A83E6F06BE3E6F06BE3E6F06BE3E15E5D33E" << "\n"; + strebuf << " 15E5D33E15E5D33EB9C3E93EB9C3E93EB9C3E93E5EA2FF3E5FA2FF3E5FA2FF3E" << "\n"; + strebuf << " 2C7B913E2C7B913E2C7B913ED259A73ED259A73ED259A73E7838BD3E7838BD3E" << "\n"; + strebuf << " 7838BD3E1D17D33E1D17D33E1D17D33EC3F5E83EC3F5E83EC3F5E83E68D4FE3E" << "\n"; + strebuf << " 68D4FE3E68D4FE3E86590A3F86590A3F86590A3FD948153FD948153FD948153F" << "\n"; + strebuf << " 7E6ABC3E7E6ABC3E7E6ABC3E2349D23E2449D23E2449D23ECA27E83ECA27E83E" << "\n"; + strebuf << " CA27E83E6F06FE3E6F06FE3E6F06FE3E8AF2093F8AF2093F8AF2093FDDE1143F" << "\n"; + strebuf << " DDE1143FDDE1143F2FD11F3F2FD11F3F2FD11F3F82C02A3F82C02A3F82C02A3F" << "\n"; + strebuf << " D159E73ED159E73ED159E73E7638FD3E7738FD3E7738FD3E8E8B093F8E8B093F" << "\n"; + strebuf << " 8E8B093FE17A143FE17A143FE17A143F346A1F3F346A1F3F346A1F3F86592A3F" << "\n"; + strebuf << " 86592A3F86592A3FD948353FD948353FD948353F2C38403F2C38403F2C38403F" << "\n"; + strebuf << " 9124093F9124093F9124093FE313143FE413143FE413143F37031F3F37031F3F" << "\n"; + strebuf << " 37031F3F8AF2293F8AF2293F8AF2293FDDE1343FDDE1343FDDE1343F2FD13F3F" << "\n"; + strebuf << " 2FD13F3F2FD13F3F82C04A3F82C04A3F81C04A3FD5AF553FD5AF553FD4AF553F" << "\n"; + strebuf << " 3B9C1E3F3B9C1E3F3B9C1E3F8D8B293F8E8B293F8E8B293FE17A343FE17A343F" << "\n"; + strebuf << " E17A343F346A3F3F346A3F3F346A3F3F87594A3F87594A3F86594A3FD948553F" << "\n"; + strebuf << " D948553FD848553F2C38603F2C38603F2B38603F7F276B3F7F276B3F7E276B3F" << "\n"; + strebuf << " 6E1E483D6E1E483D681E483DCD89BB3DCD89BB3DCC89BB3D3282093E3282093E" << "\n"; + strebuf << " 3282093E7C3F353E7D3F353E7C3F353EC8FC603EC8FC603EC8FC603E095D863E" << "\n"; + strebuf << " 095D863E095D863EAE3B9C3EAE3B9C3EAE3B9C3E541AB23E541AB23E541AB23E" << "\n"; + strebuf << " 41E6073E41E6073E40E6073E8CA3333E8CA3333E8CA3333ED7605F3ED7605F3E" << "\n"; + strebuf << " D7605F3E118F853E118F853E118F853EB66D9B3EB66D9B3EB66D9B3E5B4CB13E" << "\n"; + strebuf << " 5B4CB13E5B4CB13E002BC73E002BC73E002BC73EA609DD3EA509DD3EA609DD3E" << "\n"; + strebuf << " E6C45D3EE6C45D3EE6C45D3E18C1843E18C1843E18C1843EBE9F9A3EBE9F9A3E" << "\n"; + strebuf << " BE9F9A3E647EB03E647EB03E647EB03E095DC63E095DC63E095DC63EAE3BDC3E" << "\n"; + strebuf << " AE3BDC3EAE3BDC3E531AF23E531AF23E531AF23E7CFC033F7CFC033F7CFC033F" << "\n"; + strebuf << " C6D1993EC6D1993EC6D1993E6CB0AF3E6CB0AF3E6CB0AF3E128FC53E128FC53E" << "\n"; + strebuf << " 128FC53EB76DDB3EB76DDB3EB76DDB3E5D4CF13E5D4CF13E5D4CF13E8195033F" << "\n"; + strebuf << " 8195033F8195033FD3840E3FD3840E3FD3840E3F2674193F2674193F2674193F" << "\n"; + strebuf << " 18C1C43E18C1C43E18C1C43EBD9FDA3EBE9FDA3EBE9FDA3E647EF03E647EF03E" << "\n"; + strebuf << " 647EF03E842E033F842E033F842E033FD71D0E3FD71D0E3FD71D0E3F2A0D193F" << "\n"; + strebuf << " 2A0D193F2A0D193F7CFC233F7CFC233F7CFC233FCFEB2E3FCFEB2E3FCFEB2E3F" << "\n"; + strebuf << " 6BB0EF3E6BB0EF3E6BB0EF3E87C7023F88C7023F88C7023FDBB60D3FDBB60D3F" << "\n"; + strebuf << " DBB60D3F2EA6183F2EA6183F2EA6183F8195233F8195233F8195233FD3842E3F" << "\n"; + strebuf << " D3842E3FD3842E3F2674393F2674393F2674393F7963443F7963443F7963443F" << "\n"; + strebuf << " DE4F0D3FDE4F0D3FDE4F0D3F303F183F313F183F313F183F842E233F842E233F" << "\n"; + strebuf << " 842E233FD71D2E3FD71D2E3FD71D2E3F2A0D393F2A0D393F2A0D393F7CFC433F" << "\n"; + strebuf << " 7CFC433F7CFC433FCFEB4E3FCFEB4E3FCFEB4E3F22DB593F22DB593F22DB593F" << "\n"; + strebuf << " 88C7223F88C7223F88C7223FDAB62D3FDBB62D3FDBB62D3F2EA6383F2EA6383F" << "\n"; + strebuf << " 2EA6383F8195433F8195433F8195433FD4844E3FD4844E3FD4844E3F2674593F" << "\n"; + strebuf << " 2674593F2674593F7963643F7963643F7963643FCC526F3FCC526F3FCC526F3F" << "\n"; + strebuf << " 9E69853D9E69853D9869853D34E4DC3D34E4DC3D34E4DC3D652F1A3E652F1A3E" << "\n"; + strebuf << " 642F1A3EB1EC453EB1EC453EB0EC453EFCA9713EFCA9713EFCA9713EA3B38E3E" << "\n"; + strebuf << " A3B38E3EA3B38E3E4892A43E4892A43E4892A43EEE70BA3EEE70BA3EEE70BA3E" << "\n"; + strebuf << " 7493183E7493183E7493183EBF50443EBF50443EBE50443E0A0E703E0A0E703E" << "\n"; + strebuf << " 0A0E703EABE58D3EABE58D3EABE58D3E50C4A33E50C4A33E50C4A33EF5A2B93E" << "\n"; + strebuf << " F5A2B93EF5A2B93E9A81CF3E9981CF3E9A81CF3E4060E53E3F60E53E4060E53E" << "\n"; + strebuf << " 1A726E3E1A726E3E1A726E3EB2178D3EB2178D3EB2178D3E58F6A23E58F6A23E" << "\n"; + strebuf << " 58F6A23EFED4B83EFED4B83EFED4B83EA3B3CE3EA3B3CE3EA3B3CE3E4892E43E" << "\n"; + strebuf << " 4892E43E4892E43EED70FA3EED70FA3EED70FA3EC927083FC927083FC927083F" << "\n"; + strebuf << " 6028A23E6028A23E6028A23E0607B83E0607B83E0607B83EABE5CD3EABE5CD3E" << "\n"; + strebuf << " ABE5CD3E51C4E33E51C4E33E51C4E33EF7A2F93EF7A2F93EF7A2F93ECEC0073F" << "\n"; + strebuf << " CEC0073FCEC0073F20B0123F20B0123F20B0123F739F1D3F739F1D3F739F1D3F" << "\n"; + strebuf << " B217CD3EB217CD3EB217CD3E57F6E23E58F6E23E58F6E23EFDD4F83EFDD4F83E" << "\n"; + strebuf << " FDD4F83ED159073FD159073FD159073F2449123F2449123F2449123F77381D3F" << "\n"; + strebuf << " 77381D3F77381D3FC927283FC927283FC927283F1C17333F1C17333F1C17333F" << "\n"; + strebuf << " 0507F83E0507F83E0507F83ED4F2063FD5F2063FD5F2063F28E2113F28E2113F" << "\n"; + strebuf << " 28E2113F7BD11C3F7BD11C3F7BD11C3FCEC0273FCEC0273FCEC0273F20B0323F" << "\n"; + strebuf << " 20B0323F20B0323F739F3D3F739F3D3F739F3D3FC68E483FC68E483FC68E483F" << "\n"; + strebuf << " 2B7B113F2B7B113F2B7B113F7D6A1C3F7E6A1C3F7E6A1C3FD159273FD159273F" << "\n"; + strebuf << " D159273F2449323F2449323F2449323F77383D3F77383D3F77383D3FC927483F" << "\n"; + strebuf << " C927483FC927483F1C17533F1C17533F1C17533F6F065E3F6F065E3F6F065E3F" << "\n"; + strebuf << " D5F2263FD5F2263FD5F2263F27E2313F28E2313F28E2313F7BD13C3F7BD13C3F" << "\n"; + strebuf << " 7BD13C3FCEC0473FCEC0473FCEC0473F21B0523F21B0523F21B0523F739F5D3F" << "\n"; + strebuf << " 739F5D3F739F5D3FC68E683FC68E683FC68E683F197E733F197E733F197E733F" << "\n"; + strebuf << " 06C4A63D06C4A63D00C4A63D9C3EFE3D9C3EFE3D983EFE3D99DC2A3E99DC2A3E" << "\n"; + strebuf << " 98DC2A3EE599563EE599563EE499563E982B813E982B813E982B813E3D0A973E" << "\n"; + strebuf << " 3D0A973E3D0A973EE2E8AC3EE2E8AC3EE2E8AC3E88C7C23E88C7C23E88C7C23E" << "\n"; + strebuf << " A840293EA840293EA840293EF3FD543EF3FD543EF0FD543E9F5D803E9F5D803E" << "\n"; + strebuf << " 9F5D803E453C963E453C963E453C963EEA1AAC3EEA1AAC3EEA1AAC3E8FF9C13E" << "\n"; + strebuf << " 8FF9C13E8FF9C13E34D8D73E33D8D73E34D8D73EDAB6ED3ED9B6ED3EDAB6ED3E" << "\n"; + strebuf << " 4E1F7F3E4E1F7F3E4E1F7F3E4C6E953E4C6E953E4C6E953EF24CAB3EF24CAB3E" << "\n"; + strebuf << " F24CAB3E982BC13E982BC13E982BC13E3D0AD73E3D0AD73E3D0AD73EE2E8EC3E" << "\n"; + strebuf << " E2E8EC3EE2E8EC3EC363013FC363013FC363013F16530C3F16530C3F16530C3F" << "\n"; + strebuf << " FA7EAA3EFA7EAA3EFA7EAA3EA05DC03EA05DC03EA05DC03E453CD63E453CD63E" << "\n"; + strebuf << " 453CD63EEB1AEC3EEB1AEC3EEB1AEC3EC8FC003FC8FC003FC8FC003F1BEC0B3F" << "\n"; + strebuf << " 1BEC0B3F1BEC0B3F6DDB163F6DDB163F6DDB163FC0CA213FC0CA213FC0CA213F" << "\n"; + strebuf << " 4C6ED53E4C6ED53E4C6ED53EF14CEB3EF24CEB3EF24CEB3ECB95003FCB95003F" << "\n"; + strebuf << " CB95003F1E850B3F1E850B3F1E850B3F7174163F7174163F7174163FC463213F" << "\n"; + strebuf << " C463213FC463213F16532C3F16532C3F16532C3F6942373F6942373F6942373F" << "\n"; + strebuf << " CF2E003FCF2E003FCF2E003F211E0B3F221E0B3F221E0B3F750D163F750D163F" << "\n"; + strebuf << " 750D163FC8FC203FC8FC203FC8FC203F1BEC2B3F1BEC2B3F1BEC2B3F6DDB363F" << "\n"; + strebuf << " 6DDB363F6DDB363FC0CA413FC0CA413FC0CA413F13BA4C3F13BA4C3F13BA4C3F" << "\n"; + strebuf << " 78A6153F78A6153F78A6153FCA95203FCB95203FCB95203F1E852B3F1E852B3F" << "\n"; + strebuf << " 1E852B3F7174363F7174363F7174363FC463413FC463413FC463413F16534C3F" << "\n"; + strebuf << " 16534C3F16534C3F6942573F6942573F6942573FBC31623FBC31623FBC31623F" << "\n"; + strebuf << " 221E2B3F221E2B3F221E2B3F740D363F750D363F750D363FC8FC403FC8FC403F" << "\n"; + strebuf << " C8FC403F1BEC4B3F1BEC4B3F1BEC4B3F6EDB563F6EDB563F6EDB563FC0CA613F" << "\n"; + strebuf << " C0CA613FC0CA613F13BA6C3F13BA6C3F13BA6C3F66A9773F66A9773F66A9773F" << "\n"; + strebuf << " 6D1EC83D6D1EC83D681EC83D81CC0F3E81CC0F3E80CC0F3ECD893B3ECD893B3E" << "\n"; + strebuf << " CC893B3E1847673E1847673E1847673E3182893E3182893E3082893ED7609F3E" << "\n"; + strebuf << " D7609F3ED6609F3E7C3FB53E7C3FB53E7C3FB53E221ECB3E221ECB3E221ECB3E" << "\n"; + strebuf << " DCED393EDCED393EDCED393E26AB653E26AB653E24AB653E39B4883E39B4883E" << "\n"; + strebuf << " 38B4883EDE929E3EDE929E3EDE929E3E8371B43E8371B43E8271B43E2950CA3E" << "\n"; + strebuf << " 2850CA3E2950CA3ECE2EE03ECD2EE03ECE2EE03E740DF63E730DF63E740DF63E" << "\n"; + strebuf << " 40E6873E40E6873E40E6873EE6C49D3EE6C49D3EE6C49D3E8CA3B33E8CA3B33E" << "\n"; + strebuf << " 8CA3B33E3182C93E3182C93E3182C93ED660DF3ED660DF3ED660DF3E7C3FF53E" << "\n"; + strebuf << " 7C3FF53E7C3FF53E108F053F108F053F108F053F637E103F637E103F637E103F" << "\n"; + strebuf << " 94D5B23E94D5B23E94D5B23E39B4C83E39B4C83E39B4C83EDF92DE3EDF92DE3E" << "\n"; + strebuf << " DF92DE3E8571F43E8571F43E8571F43E1528053F1528053F1528053F6817103F" << "\n"; + strebuf << " 6817103F6817103FBA061B3FBA061B3FBA061B3F0DF6253F0DF6253F0DF6253F" << "\n"; + strebuf << " E6C4DD3EE6C4DD3EE6C4DD3E8AA3F33E8BA3F33E8BA3F33E18C1043F18C1043F" << "\n"; + strebuf << " 18C1043F6BB00F3F6BB00F3F6BB00F3FBE9F1A3FBE9F1A3FBE9F1A3F118F253F" << "\n"; + strebuf << " 118F253F118F253F637E303F637E303F637E303FB66D3B3FB66D3B3FB66D3B3F" << "\n"; + strebuf << " 1C5A043F1C5A043F1C5A043F6E490F3F6F490F3F6F490F3FC2381A3FC2381A3F" << "\n"; + strebuf << " C2381A3F1528253F1528253F1528253F6717303F6717303F6717303FBA063B3F" << "\n"; + strebuf << " BA063B3FBA063B3F0DF6453F0DF6453F0DF6453F60E5503F60E5503F60E5503F" << "\n"; + strebuf << " C5D1193FC5D1193FC5D1193F17C1243F18C1243F18C1243F6BB02F3F6BB02F3F" << "\n"; + strebuf << " 6BB02F3FBE9F3A3FBE9F3A3FBE9F3A3F108F453F108F453F108F453F637E503F" << "\n"; + strebuf << " 637E503F637E503FB66D5B3FB66D5B3FB66D5B3F095D663F095D663F095D663F" << "\n"; + strebuf << " 6F492F3F6F492F3F6F492F3FC1383A3FC2383A3FC2383A3F1528453F1528453F" << "\n"; + strebuf << " 1528453F6817503F6817503F6817503FBA065B3FBA065B3FBA065B3F0DF6653F" << "\n"; + strebuf << " 0DF6653F0DF6653F60E5703F60E5703F60E5703FB3D47B3FB3D47B3FB3D47B3F" << "\n"; + strebuf << " D578E93DD578E93DD078E93DB579203EB579203EB479203E01374C3E01374C3E" << "\n"; + strebuf << " 00374C3E4CF4773E4CF4773E4CF4773ECBD8913ECBD8913ECAD8913E71B7A73E" << "\n"; + strebuf << " 71B7A73E70B7A73E1696BD3E1696BD3E1696BD3EBC74D33EBC74D33EBC74D33E" << "\n"; + strebuf << " 109B4A3E109B4A3E109B4A3E5A58763E5A58763E5858763ED30A913ED30A913E" << "\n"; + strebuf << " D20A913E78E9A63E78E9A63E78E9A63E1DC8BC3E1DC8BC3E1CC8BC3EC3A6D23E" << "\n"; + strebuf << " C2A6D23EC2A6D23E6885E83E6785E83E6885E83E0E64FE3E0D64FE3E0E64FE3E" << "\n"; + strebuf << " DA3C903EDA3C903EDA3C903E801BA63E801BA63E801BA63E26FABB3E26FABB3E" << "\n"; + strebuf << " 26FABB3ECBD8D13ECBD8D13ECAD8D13E70B7E73E70B7E73E70B7E73E1696FD3E" << "\n"; + strebuf << " 1696FD3E1696FD3E5DBA093F5DBA093F5DBA093FB0A9143FB0A9143FB0A9143F" << "\n"; + strebuf << " 2E2CBB3E2E2CBB3E2E2CBB3ED20AD13ED30AD13ED20AD13E79E9E63E79E9E63E" << "\n"; + strebuf << " 78E9E63E1FC8FC3E1FC8FC3E1EC8FC3E6253093F6253093F6253093FB542143F" << "\n"; + strebuf << " B542143FB542143F07321F3F07321F3F07321F3F5A212A3F5A212A3F5A212A3F" << "\n"; + strebuf << " 801BE63E801BE63E801BE63E24FAFB3E25FAFB3E24FAFB3E65EC083F65EC083F" << "\n"; + strebuf << " 65EC083FB8DB133FB8DB133FB8DB133F0BCB1E3F0BCB1E3F0BCB1E3F5EBA293F" << "\n"; + strebuf << " 5EBA293F5EBA293FB0A9343FB0A9343FB0A9343F03993F3F03993F3F03993F3F" << "\n"; + strebuf << " 6985083F6985083F6985083FBB74133FBC74133FBC74133F0F641E3F0F641E3F" << "\n"; + strebuf << " 0F641E3F6253293F6253293F6253293FB442343FB442343FB442343F07323F3F" << "\n"; + strebuf << " 07323F3F07323F3F5A214A3F5A214A3F5A214A3FAD10553FAD10553FAD10553F" << "\n"; + strebuf << " 12FD1D3F12FD1D3F12FD1D3F64EC283F65EC283F65EC283FB8DB333FB8DB333F" << "\n"; + strebuf << " B8DB333F0BCB3E3F0BCB3E3F0BCB3E3F5DBA493F5DBA493F5DBA493FB0A9543F" << "\n"; + strebuf << " B0A9543FB0A9543F03995F3F03995F3F03995F3F56886A3F56886A3F56886A3F" << "\n"; + strebuf << " BC74333FBC74333FBC74333F0E643E3F0F643E3F0F643E3F6153493F6253493F" << "\n"; + strebuf << " 6253493FB542543FB542543FB542543F07325F3F07325F3F07325F3F5A216A3F" << "\n"; + strebuf << " 5A216A3F5A216A3FAD10753FAD10753FAD10753F0000803F0000803F0000803F\"" << "\n"; + strebuf << " </data>" << "\n"; + strebuf << " </LUT>" << "\n"; + strebuf << "</look>" << "\n"; + + std::istringstream simple1D; + simple1D.str(strebuf.str()); + + // Read file + LocalFileFormat tester; + CachedFileRcPtr cachedFile = tester.Read(simple1D); + LocalCachedFileRcPtr looklut = DynamicPtrCast<LocalCachedFile>(cachedFile); + + // Check LUT size is correct + OIIO_CHECK_EQUAL(looklut->lut3D->size[0], 8); + OIIO_CHECK_EQUAL(looklut->lut3D->size[1], 8); + OIIO_CHECK_EQUAL(looklut->lut3D->size[2], 8); + + // Check LUT values + OIIO_CHECK_EQUAL(looklut->lut3D->lut.size(), 8*8*8*3); + + double cube[8 * 8 * 8 * 3] = { + -0.00000, -0.00000, -0.00000, + 0.04271, 0.04271, 0.04271, + 0.08543, 0.08543, 0.08543, + 0.12814, 0.12814, 0.12814, + 0.17086, 0.17086, 0.17086, + 0.21357, 0.21357, 0.21357, + 0.25629, 0.25629, 0.25629, + 0.29900, 0.29900, 0.29900, + 0.08386, 0.08386, 0.08386, + 0.12657, 0.12657, 0.12657, + 0.16929, 0.16929, 0.16929, + 0.21200, 0.21200, 0.21200, + 0.25471, 0.25471, 0.25471, + 0.29743, 0.29743, 0.29743, + 0.34014, 0.34014, 0.34014, + 0.38286, 0.38286, 0.38286, + 0.16771, 0.16771, 0.16771, + 0.21043, 0.21043, 0.21043, + 0.25314, 0.25314, 0.25314, + 0.29586, 0.29586, 0.29586, + 0.33857, 0.33857, 0.33857, + 0.38129, 0.38129, 0.38129, + 0.42400, 0.42400, 0.42400, + 0.46671, 0.46671, 0.46671, + 0.25157, 0.25157, 0.25157, + 0.29429, 0.29429, 0.29429, + 0.33700, 0.33700, 0.33700, + 0.37971, 0.37971, 0.37971, + 0.42243, 0.42243, 0.42243, + 0.46514, 0.46514, 0.46514, + 0.50786, 0.50786, 0.50786, + 0.55057, 0.55057, 0.55057, + 0.33543, 0.33543, 0.33543, + 0.37814, 0.37814, 0.37814, + 0.42086, 0.42086, 0.42086, + 0.46357, 0.46357, 0.46357, + 0.50629, 0.50629, 0.50629, + 0.54900, 0.54900, 0.54900, + 0.59171, 0.59171, 0.59171, + 0.63443, 0.63443, 0.63443, + 0.41929, 0.41929, 0.41929, + 0.46200, 0.46200, 0.46200, + 0.50471, 0.50471, 0.50471, + 0.54743, 0.54743, 0.54743, + 0.59014, 0.59014, 0.59014, + 0.63286, 0.63286, 0.63286, + 0.67557, 0.67557, 0.67557, + 0.71829, 0.71829, 0.71829, + 0.50314, 0.50314, 0.50314, + 0.54586, 0.54586, 0.54586, + 0.58857, 0.58857, 0.58857, + 0.63129, 0.63129, 0.63129, + 0.67400, 0.67400, 0.67400, + 0.71671, 0.71671, 0.71671, + 0.75943, 0.75943, 0.75943, + 0.80214, 0.80214, 0.80214, + 0.58700, 0.58700, 0.58700, + 0.62971, 0.62971, 0.62971, + 0.67243, 0.67243, 0.67243, + 0.71514, 0.71514, 0.71514, + 0.75786, 0.75786, 0.75786, + 0.80057, 0.80057, 0.80057, + 0.84329, 0.84329, 0.84329, + 0.88600, 0.88600, 0.88600, + 0.01629, 0.01629, 0.01629, + 0.05900, 0.05900, 0.05900, + 0.10171, 0.10171, 0.10171, + 0.14443, 0.14443, 0.14443, + 0.18714, 0.18714, 0.18714, + 0.22986, 0.22986, 0.22986, + 0.27257, 0.27257, 0.27257, + 0.31529, 0.31529, 0.31529, + 0.10014, 0.10014, 0.10014, + 0.14286, 0.14286, 0.14286, + 0.18557, 0.18557, 0.18557, + 0.22829, 0.22829, 0.22829, + 0.27100, 0.27100, 0.27100, + 0.31371, 0.31371, 0.31371, + 0.35643, 0.35643, 0.35643, + 0.39914, 0.39914, 0.39914, + 0.18400, 0.18400, 0.18400, + 0.22671, 0.22671, 0.22671, + 0.26943, 0.26943, 0.26943, + 0.31214, 0.31214, 0.31214, + 0.35486, 0.35486, 0.35486, + 0.39757, 0.39757, 0.39757, + 0.44029, 0.44029, 0.44029, + 0.48300, 0.48300, 0.48300, + 0.26786, 0.26786, 0.26786, + 0.31057, 0.31057, 0.31057, + 0.35329, 0.35329, 0.35329, + 0.39600, 0.39600, 0.39600, + 0.43871, 0.43871, 0.43871, + 0.48143, 0.48143, 0.48143, + 0.52414, 0.52414, 0.52414, + 0.56686, 0.56686, 0.56686, + 0.35171, 0.35171, 0.35171, + 0.39443, 0.39443, 0.39443, + 0.43714, 0.43714, 0.43714, + 0.47986, 0.47986, 0.47986, + 0.52257, 0.52257, 0.52257, + 0.56529, 0.56529, 0.56529, + 0.60800, 0.60800, 0.60800, + 0.65071, 0.65071, 0.65071, + 0.43557, 0.43557, 0.43557, + 0.47829, 0.47829, 0.47829, + 0.52100, 0.52100, 0.52100, + 0.56371, 0.56371, 0.56371, + 0.60643, 0.60643, 0.60643, + 0.64914, 0.64914, 0.64914, + 0.69186, 0.69186, 0.69186, + 0.73457, 0.73457, 0.73457, + 0.51943, 0.51943, 0.51943, + 0.56214, 0.56214, 0.56214, + 0.60486, 0.60486, 0.60486, + 0.64757, 0.64757, 0.64757, + 0.69029, 0.69029, 0.69029, + 0.73300, 0.73300, 0.73300, + 0.77571, 0.77571, 0.77571, + 0.81843, 0.81843, 0.81843, + 0.60329, 0.60329, 0.60329, + 0.64600, 0.64600, 0.64600, + 0.68871, 0.68871, 0.68871, + 0.73143, 0.73143, 0.73143, + 0.77414, 0.77414, 0.77414, + 0.81686, 0.81686, 0.81686, + 0.85957, 0.85957, 0.85957, + 0.90229, 0.90229, 0.90229, + 0.03257, 0.03257, 0.03257, + 0.07529, 0.07529, 0.07529, + 0.11800, 0.11800, 0.11800, + 0.16071, 0.16071, 0.16071, + 0.20343, 0.20343, 0.20343, + 0.24614, 0.24614, 0.24614, + 0.28886, 0.28886, 0.28886, + 0.33157, 0.33157, 0.33157, + 0.11643, 0.11643, 0.11643, + 0.15914, 0.15914, 0.15914, + 0.20186, 0.20186, 0.20186, + 0.24457, 0.24457, 0.24457, + 0.28729, 0.28729, 0.28729, + 0.33000, 0.33000, 0.33000, + 0.37271, 0.37271, 0.37271, + 0.41543, 0.41543, 0.41543, + 0.20029, 0.20029, 0.20029, + 0.24300, 0.24300, 0.24300, + 0.28571, 0.28571, 0.28571, + 0.32843, 0.32843, 0.32843, + 0.37114, 0.37114, 0.37114, + 0.41386, 0.41386, 0.41386, + 0.45657, 0.45657, 0.45657, + 0.49929, 0.49929, 0.49929, + 0.28414, 0.28414, 0.28414, + 0.32686, 0.32686, 0.32686, + 0.36957, 0.36957, 0.36957, + 0.41229, 0.41229, 0.41229, + 0.45500, 0.45500, 0.45500, + 0.49771, 0.49771, 0.49771, + 0.54043, 0.54043, 0.54043, + 0.58314, 0.58314, 0.58314, + 0.36800, 0.36800, 0.36800, + 0.41071, 0.41071, 0.41071, + 0.45343, 0.45343, 0.45343, + 0.49614, 0.49614, 0.49614, + 0.53886, 0.53886, 0.53886, + 0.58157, 0.58157, 0.58157, + 0.62429, 0.62429, 0.62429, + 0.66700, 0.66700, 0.66700, + 0.45186, 0.45186, 0.45186, + 0.49457, 0.49457, 0.49457, + 0.53729, 0.53729, 0.53729, + 0.58000, 0.58000, 0.58000, + 0.62271, 0.62271, 0.62271, + 0.66543, 0.66543, 0.66543, + 0.70814, 0.70814, 0.70814, + 0.75086, 0.75086, 0.75086, + 0.53571, 0.53571, 0.53571, + 0.57843, 0.57843, 0.57843, + 0.62114, 0.62114, 0.62114, + 0.66386, 0.66386, 0.66386, + 0.70657, 0.70657, 0.70657, + 0.74929, 0.74929, 0.74929, + 0.79200, 0.79200, 0.79200, + 0.83471, 0.83471, 0.83471, + 0.61957, 0.61957, 0.61957, + 0.66229, 0.66229, 0.66229, + 0.70500, 0.70500, 0.70500, + 0.74771, 0.74771, 0.74771, + 0.79043, 0.79043, 0.79043, + 0.83314, 0.83314, 0.83314, + 0.87586, 0.87586, 0.87586, + 0.91857, 0.91857, 0.91857, + 0.04886, 0.04886, 0.04886, + 0.09157, 0.09157, 0.09157, + 0.13429, 0.13429, 0.13429, + 0.17700, 0.17700, 0.17700, + 0.21971, 0.21971, 0.21971, + 0.26243, 0.26243, 0.26243, + 0.30514, 0.30514, 0.30514, + 0.34786, 0.34786, 0.34786, + 0.13271, 0.13271, 0.13271, + 0.17543, 0.17543, 0.17543, + 0.21814, 0.21814, 0.21814, + 0.26086, 0.26086, 0.26086, + 0.30357, 0.30357, 0.30357, + 0.34629, 0.34629, 0.34629, + 0.38900, 0.38900, 0.38900, + 0.43171, 0.43171, 0.43171, + 0.21657, 0.21657, 0.21657, + 0.25929, 0.25929, 0.25929, + 0.30200, 0.30200, 0.30200, + 0.34471, 0.34471, 0.34471, + 0.38743, 0.38743, 0.38743, + 0.43014, 0.43014, 0.43014, + 0.47286, 0.47286, 0.47286, + 0.51557, 0.51557, 0.51557, + 0.30043, 0.30043, 0.30043, + 0.34314, 0.34314, 0.34314, + 0.38586, 0.38586, 0.38586, + 0.42857, 0.42857, 0.42857, + 0.47129, 0.47129, 0.47129, + 0.51400, 0.51400, 0.51400, + 0.55671, 0.55671, 0.55671, + 0.59943, 0.59943, 0.59943, + 0.38429, 0.38429, 0.38429, + 0.42700, 0.42700, 0.42700, + 0.46971, 0.46971, 0.46971, + 0.51243, 0.51243, 0.51243, + 0.55514, 0.55514, 0.55514, + 0.59786, 0.59786, 0.59786, + 0.64057, 0.64057, 0.64057, + 0.68329, 0.68329, 0.68329, + 0.46814, 0.46814, 0.46814, + 0.51086, 0.51086, 0.51086, + 0.55357, 0.55357, 0.55357, + 0.59629, 0.59629, 0.59629, + 0.63900, 0.63900, 0.63900, + 0.68171, 0.68171, 0.68171, + 0.72443, 0.72443, 0.72443, + 0.76714, 0.76714, 0.76714, + 0.55200, 0.55200, 0.55200, + 0.59471, 0.59471, 0.59471, + 0.63743, 0.63743, 0.63743, + 0.68014, 0.68014, 0.68014, + 0.72286, 0.72286, 0.72286, + 0.76557, 0.76557, 0.76557, + 0.80829, 0.80829, 0.80829, + 0.85100, 0.85100, 0.85100, + 0.63586, 0.63586, 0.63586, + 0.67857, 0.67857, 0.67857, + 0.72129, 0.72129, 0.72129, + 0.76400, 0.76400, 0.76400, + 0.80671, 0.80671, 0.80671, + 0.84943, 0.84943, 0.84943, + 0.89214, 0.89214, 0.89214, + 0.93486, 0.93486, 0.93486, + 0.06514, 0.06514, 0.06514, + 0.10786, 0.10786, 0.10786, + 0.15057, 0.15057, 0.15057, + 0.19329, 0.19329, 0.19329, + 0.23600, 0.23600, 0.23600, + 0.27871, 0.27871, 0.27871, + 0.32143, 0.32143, 0.32143, + 0.36414, 0.36414, 0.36414, + 0.14900, 0.14900, 0.14900, + 0.19171, 0.19171, 0.19171, + 0.23443, 0.23443, 0.23443, + 0.27714, 0.27714, 0.27714, + 0.31986, 0.31986, 0.31986, + 0.36257, 0.36257, 0.36257, + 0.40529, 0.40529, 0.40529, + 0.44800, 0.44800, 0.44800, + 0.23286, 0.23286, 0.23286, + 0.27557, 0.27557, 0.27557, + 0.31829, 0.31829, 0.31829, + 0.36100, 0.36100, 0.36100, + 0.40371, 0.40371, 0.40371, + 0.44643, 0.44643, 0.44643, + 0.48914, 0.48914, 0.48914, + 0.53186, 0.53186, 0.53186, + 0.31671, 0.31671, 0.31671, + 0.35943, 0.35943, 0.35943, + 0.40214, 0.40214, 0.40214, + 0.44486, 0.44486, 0.44486, + 0.48757, 0.48757, 0.48757, + 0.53029, 0.53029, 0.53029, + 0.57300, 0.57300, 0.57300, + 0.61571, 0.61571, 0.61571, + 0.40057, 0.40057, 0.40057, + 0.44329, 0.44329, 0.44329, + 0.48600, 0.48600, 0.48600, + 0.52871, 0.52871, 0.52871, + 0.57143, 0.57143, 0.57143, + 0.61414, 0.61414, 0.61414, + 0.65686, 0.65686, 0.65686, + 0.69957, 0.69957, 0.69957, + 0.48443, 0.48443, 0.48443, + 0.52714, 0.52714, 0.52714, + 0.56986, 0.56986, 0.56986, + 0.61257, 0.61257, 0.61257, + 0.65529, 0.65529, 0.65529, + 0.69800, 0.69800, 0.69800, + 0.74071, 0.74071, 0.74071, + 0.78343, 0.78343, 0.78343, + 0.56829, 0.56829, 0.56829, + 0.61100, 0.61100, 0.61100, + 0.65371, 0.65371, 0.65371, + 0.69643, 0.69643, 0.69643, + 0.73914, 0.73914, 0.73914, + 0.78186, 0.78186, 0.78186, + 0.82457, 0.82457, 0.82457, + 0.86729, 0.86729, 0.86729, + 0.65214, 0.65214, 0.65214, + 0.69486, 0.69486, 0.69486, + 0.73757, 0.73757, 0.73757, + 0.78029, 0.78029, 0.78029, + 0.82300, 0.82300, 0.82300, + 0.86571, 0.86571, 0.86571, + 0.90843, 0.90843, 0.90843, + 0.95114, 0.95114, 0.95114, + 0.08143, 0.08143, 0.08143, + 0.12414, 0.12414, 0.12414, + 0.16686, 0.16686, 0.16686, + 0.20957, 0.20957, 0.20957, + 0.25229, 0.25229, 0.25229, + 0.29500, 0.29500, 0.29500, + 0.33771, 0.33771, 0.33771, + 0.38043, 0.38043, 0.38043, + 0.16529, 0.16529, 0.16529, + 0.20800, 0.20800, 0.20800, + 0.25071, 0.25071, 0.25071, + 0.29343, 0.29343, 0.29343, + 0.33614, 0.33614, 0.33614, + 0.37886, 0.37886, 0.37886, + 0.42157, 0.42157, 0.42157, + 0.46429, 0.46429, 0.46429, + 0.24914, 0.24914, 0.24914, + 0.29186, 0.29186, 0.29186, + 0.33457, 0.33457, 0.33457, + 0.37729, 0.37729, 0.37729, + 0.42000, 0.42000, 0.42000, + 0.46271, 0.46271, 0.46271, + 0.50543, 0.50543, 0.50543, + 0.54814, 0.54814, 0.54814, + 0.33300, 0.33300, 0.33300, + 0.37571, 0.37571, 0.37571, + 0.41843, 0.41843, 0.41843, + 0.46114, 0.46114, 0.46114, + 0.50386, 0.50386, 0.50386, + 0.54657, 0.54657, 0.54657, + 0.58929, 0.58929, 0.58929, + 0.63200, 0.63200, 0.63200, + 0.41686, 0.41686, 0.41686, + 0.45957, 0.45957, 0.45957, + 0.50229, 0.50229, 0.50229, + 0.54500, 0.54500, 0.54500, + 0.58771, 0.58771, 0.58771, + 0.63043, 0.63043, 0.63043, + 0.67314, 0.67314, 0.67314, + 0.71586, 0.71586, 0.71586, + 0.50071, 0.50071, 0.50071, + 0.54343, 0.54343, 0.54343, + 0.58614, 0.58614, 0.58614, + 0.62886, 0.62886, 0.62886, + 0.67157, 0.67157, 0.67157, + 0.71429, 0.71429, 0.71429, + 0.75700, 0.75700, 0.75700, + 0.79971, 0.79971, 0.79971, + 0.58457, 0.58457, 0.58457, + 0.62729, 0.62729, 0.62729, + 0.67000, 0.67000, 0.67000, + 0.71271, 0.71271, 0.71271, + 0.75543, 0.75543, 0.75543, + 0.79814, 0.79814, 0.79814, + 0.84086, 0.84086, 0.84086, + 0.88357, 0.88357, 0.88357, + 0.66843, 0.66843, 0.66843, + 0.71114, 0.71114, 0.71114, + 0.75386, 0.75386, 0.75386, + 0.79657, 0.79657, 0.79657, + 0.83929, 0.83929, 0.83929, + 0.88200, 0.88200, 0.88200, + 0.92471, 0.92471, 0.92471, + 0.96743, 0.96743, 0.96743, + 0.09771, 0.09771, 0.09771, + 0.14043, 0.14043, 0.14043, + 0.18314, 0.18314, 0.18314, + 0.22586, 0.22586, 0.22586, + 0.26857, 0.26857, 0.26857, + 0.31129, 0.31129, 0.31129, + 0.35400, 0.35400, 0.35400, + 0.39671, 0.39671, 0.39671, + 0.18157, 0.18157, 0.18157, + 0.22429, 0.22429, 0.22429, + 0.26700, 0.26700, 0.26700, + 0.30971, 0.30971, 0.30971, + 0.35243, 0.35243, 0.35243, + 0.39514, 0.39514, 0.39514, + 0.43786, 0.43786, 0.43786, + 0.48057, 0.48057, 0.48057, + 0.26543, 0.26543, 0.26543, + 0.30814, 0.30814, 0.30814, + 0.35086, 0.35086, 0.35086, + 0.39357, 0.39357, 0.39357, + 0.43629, 0.43629, 0.43629, + 0.47900, 0.47900, 0.47900, + 0.52171, 0.52171, 0.52171, + 0.56443, 0.56443, 0.56443, + 0.34929, 0.34929, 0.34929, + 0.39200, 0.39200, 0.39200, + 0.43471, 0.43471, 0.43471, + 0.47743, 0.47743, 0.47743, + 0.52014, 0.52014, 0.52014, + 0.56286, 0.56286, 0.56286, + 0.60557, 0.60557, 0.60557, + 0.64829, 0.64829, 0.64829, + 0.43314, 0.43314, 0.43314, + 0.47586, 0.47586, 0.47586, + 0.51857, 0.51857, 0.51857, + 0.56129, 0.56129, 0.56129, + 0.60400, 0.60400, 0.60400, + 0.64671, 0.64671, 0.64671, + 0.68943, 0.68943, 0.68943, + 0.73214, 0.73214, 0.73214, + 0.51700, 0.51700, 0.51700, + 0.55971, 0.55971, 0.55971, + 0.60243, 0.60243, 0.60243, + 0.64514, 0.64514, 0.64514, + 0.68786, 0.68786, 0.68786, + 0.73057, 0.73057, 0.73057, + 0.77329, 0.77329, 0.77329, + 0.81600, 0.81600, 0.81600, + 0.60086, 0.60086, 0.60086, + 0.64357, 0.64357, 0.64357, + 0.68629, 0.68629, 0.68629, + 0.72900, 0.72900, 0.72900, + 0.77171, 0.77171, 0.77171, + 0.81443, 0.81443, 0.81443, + 0.85714, 0.85714, 0.85714, + 0.89986, 0.89986, 0.89986, + 0.68471, 0.68471, 0.68471, + 0.72743, 0.72743, 0.72743, + 0.77014, 0.77014, 0.77014, + 0.81286, 0.81286, 0.81286, + 0.85557, 0.85557, 0.85557, + 0.89829, 0.89829, 0.89829, + 0.94100, 0.94100, 0.94100, + 0.98371, 0.98371, 0.98371, + 0.11400, 0.11400, 0.11400, + 0.15671, 0.15671, 0.15671, + 0.19943, 0.19943, 0.19943, + 0.24214, 0.24214, 0.24214, + 0.28486, 0.28486, 0.28486, + 0.32757, 0.32757, 0.32757, + 0.37029, 0.37029, 0.37029, + 0.41300, 0.41300, 0.41300, + 0.19786, 0.19786, 0.19786, + 0.24057, 0.24057, 0.24057, + 0.28329, 0.28329, 0.28329, + 0.32600, 0.32600, 0.32600, + 0.36871, 0.36871, 0.36871, + 0.41143, 0.41143, 0.41143, + 0.45414, 0.45414, 0.45414, + 0.49686, 0.49686, 0.49686, + 0.28171, 0.28171, 0.28171, + 0.32443, 0.32443, 0.32443, + 0.36714, 0.36714, 0.36714, + 0.40986, 0.40986, 0.40986, + 0.45257, 0.45257, 0.45257, + 0.49529, 0.49529, 0.49529, + 0.53800, 0.53800, 0.53800, + 0.58071, 0.58071, 0.58071, + 0.36557, 0.36557, 0.36557, + 0.40829, 0.40829, 0.40829, + 0.45100, 0.45100, 0.45100, + 0.49371, 0.49371, 0.49371, + 0.53643, 0.53643, 0.53643, + 0.57914, 0.57914, 0.57914, + 0.62186, 0.62186, 0.62186, + 0.66457, 0.66457, 0.66457, + 0.44943, 0.44943, 0.44943, + 0.49214, 0.49214, 0.49214, + 0.53486, 0.53486, 0.53486, + 0.57757, 0.57757, 0.57757, + 0.62029, 0.62029, 0.62029, + 0.66300, 0.66300, 0.66300, + 0.70571, 0.70571, 0.70571, + 0.74843, 0.74843, 0.74843, + 0.53329, 0.53329, 0.53329, + 0.57600, 0.57600, 0.57600, + 0.61871, 0.61871, 0.61871, + 0.66143, 0.66143, 0.66143, + 0.70414, 0.70414, 0.70414, + 0.74686, 0.74686, 0.74686, + 0.78957, 0.78957, 0.78957, + 0.83229, 0.83229, 0.83229, + 0.61714, 0.61714, 0.61714, + 0.65986, 0.65986, 0.65986, + 0.70257, 0.70257, 0.70257, + 0.74529, 0.74529, 0.74529, + 0.78800, 0.78800, 0.78800, + 0.83071, 0.83071, 0.83071, + 0.87343, 0.87343, 0.87343, + 0.91614, 0.91614, 0.91614, + 0.70100, 0.70100, 0.70100, + 0.74371, 0.74371, 0.74371, + 0.78643, 0.78643, 0.78643, + 0.82914, 0.82914, 0.82914, + 0.87186, 0.87186, 0.87186, + 0.91457, 0.91457, 0.91457, + 0.95729, 0.95729, 0.95729, + 1.00000, 1.00000, 1.00000 + }; + + // check cube data + for(unsigned int i = 0; i < looklut->lut3D->lut.size(); ++i) { + OIIO_CHECK_CLOSE(cube[i], looklut->lut3D->lut[i], 1e-4); + } +} + + +OIIO_ADD_TEST(FileFormatIridasLook, fail_on_mask) +{ + std::ostringstream strebuf; + strebuf << "<?xml version=\"1.0\" ?>" << "\n"; + strebuf << "<look>" << "\n"; + strebuf << " <shaders>" << "\n"; + strebuf << " <base>" << "\n"; + strebuf << " <rangeversion>\"2\"</rangeversion>" << "\n"; + strebuf << " <visible>\"1\"</visible>" << "\n"; + strebuf << " <sublayer0>" << "\n"; + strebuf << " <opacity>\"1\"</opacity>" << "\n"; + strebuf << " <parameters>" << "\n"; + strebuf << " <LogPrinterLights>\"N1\"</LogPrinterLights>" << "\n"; + strebuf << " </parameters>" << "\n"; + strebuf << " </sublayer0>" << "\n"; + strebuf << " <sublayer3>" << "\n"; + strebuf << " <opacity>\"1\"</opacity>" << "\n"; + strebuf << " <parameters>" << "\n"; + strebuf << " <gamma.Z>\"0.49967\"</gamma.Z>" << "\n"; + strebuf << " <gain.Z>\"0.28739\"</gain.Z>" << "\n"; + strebuf << " <gamma.Y>\"0.49179\"</gamma.Y>" << "\n"; + strebuf << " <gain.Y>\"0.22243\"</gain.Y>" << "\n"; + strebuf << " <gain.X>\"0.34531\"</gain.X>" << "\n"; + strebuf << " <gamma.X>\"0.39388\"</gamma.X>" << "\n"; + strebuf << " </parameters>" << "\n"; + strebuf << " </sublayer3>" << "\n"; + strebuf << " </base>" << "\n"; + strebuf << " </shaders>" << "\n"; + strebuf << " <mask>" << "\n"; + strebuf << " <name>\"Untitled00_00_00_00\"</name>" << "\n"; + strebuf << " <activecontour>\"0\"</activecontour>" << "\n"; + strebuf << " <width>\"1024\"</width>" << "\n"; + strebuf << " <height>\"778\"</height>" << "\n"; + strebuf << " <contour>" << "\n"; + strebuf << " <positive>\"1\"</positive>" << "\n"; + strebuf << " <point>" << "\n"; + strebuf << " <inner>\"catmull-rom,value:317.5,583.5@0\"</inner>" << "\n"; + strebuf << " <innerprevtangent>\"catmull-rom,value:0,0@0\"</innerprevtangent>" << "\n"; + strebuf << " <innernexttangent>\"catmull-rom,value:0,0@0\"</innernexttangent>" << "\n"; + strebuf << " <falloffexponent>\"catmull-rom,value:1@0\"</falloffexponent>" << "\n"; + strebuf << " <falloffweight>\"catmull-rom,value:0.5@0\"</falloffweight>" << "\n"; + strebuf << " <detached>linear,value:0@0</detached>" << "\n"; + strebuf << " <outer>\"catmull-rom,value:317.5,583.5@0\"</outer>" << "\n"; + strebuf << " <outerprevtangent>\"catmull-rom,value:0,0@0\"</outerprevtangent>" << "\n"; + strebuf << " <outernexttangent>\"catmull-rom,value:0,0@0\"</outernexttangent>" << "\n"; + strebuf << " <spline>\"linear,value:0@0\"</spline>" << "\n"; + strebuf << " <smooth>\"linear,value:0@0\"</smooth>" << "\n"; + strebuf << " </point>" << "\n"; + strebuf << " </contour>" << "\n"; + strebuf << " </mask>" << "\n"; + strebuf << " <LUT>" << "\n"; + strebuf << " <size>\"8\"</size>" << "\n"; + strebuf << " <data>\"" << "\n"; + strebuf << " 000000000000000000000000878B933D000000000000000057BC563E00000000" << "\n"; + strebuf << " ...truncated, should never be parsed due to mask section\"" << "\n"; + strebuf << " </data>" << "\n"; + strebuf << " </LUT>" << "\n"; + strebuf << "</look>" << "\n"; + + std::istringstream infile; + infile.str(strebuf.str()); + + // Read file + LocalFileFormat tester; + try + { + CachedFileRcPtr cachedFile = tester.Read(infile); + OIIO_CHECK_ASSERT(false); // Fail test if previous line doesn't throw Exception + } + catch(Exception& e) + { + // Check exception message is correct error (not something + // like "cannot parse LUT data") + std::string expected_error = "Cannot load .look LUT containing mask"; + OIIO_CHECK_EQUAL(e.what(), expected_error); + } + +} +#endif // OCIO_UNIT_TEST |