1 /*
2 Copyright (c) 2003-2010 Sony Pictures Imageworks Inc., et al.
3 All Rights Reserved.
4 
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are
7 met:
8 * Redistributions of source code must retain the above copyright
9   notice, this list of conditions and the following disclaimer.
10 * Redistributions in binary form must reproduce the above copyright
11   notice, this list of conditions and the following disclaimer in the
12   documentation and/or other materials provided with the distribution.
13 * Neither the name of Sony Pictures Imageworks nor the names of its
14   contributors may be used to endorse or promote products derived from
15   this software without specific prior written permission.
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28 
29 #include <cstdio>
30 #include <cstring>
31 #include <iterator>
32 
33 #include <tinyxml.h>
34 
35 #include <OpenColorIO/OpenColorIO.h>
36 
37 #include "FileTransform.h"
38 #include "Lut1DOp.h"
39 #include "Lut3DOp.h"
40 #include "ParseUtils.h"
41 #include "pystring/pystring.h"
42 
43 /*
44 
45 Iridas .look format
46 
47 An XML format containing <shaders>, a series of layers describing the
48 operations and their parameters (irrelevant to us in this context).
49 
50 This series of shaders is baked into the <LUT> section.
51 
52 <?xml version="1.0" ?>
53 <look>
54   <shaders>
55     # anything in here is useless to us
56   </shaders>
57   <LUT>
58     <size>"8"</size> # Size of 3D LUT
59     <data>"
60       0000008000000080000000802CF52E3D2DF52E3D2DF52E3D2CF5AE3D2DF5AE3D
61       # ...cut...
62       5A216A3F5A216A3FAD10753FAD10753FAD10753F0000803F0000803F0000803F"
63     </data>
64   </LUT>
65 </look>
66 
67 The LUT data contains a 3D LUT, as a hex-encoded series of 32-bit
68 floats, with little-endian bit-ordering. LUT value ordering is
69 LUT3DORDER_FAST_RED (red index incrementing fastest, then green, then
70 blue)
71 
72 The LUT data is parsed by removing all whitespace and quotes. Taking 8
73 characters at a time and intepreting as little-endian float, as follows:
74 
75 Given the string "0000003F0000803FAD10753F":
76 
77     >>> import binascii, struct
78     >>> struct.unpack("<f", binascii.unhexlify("0000003F"))[0]
79     0.5
80     >>> struct.unpack("<f", binascii.unhexlify("0000803F"))[0]
81     1.0
82     >>> struct.unpack("<f", binascii.unhexlify("AD10753F"))[0]
83     0.9572857022285461
84 
85  */
86 
87 
88 OCIO_NAMESPACE_ENTER
89 {
90     namespace
91     {
92         // convert hex ascii to int
93         // return true on success, false on failure
94         bool hexasciitoint(char& ival, char character)
95         {
96             if(character>=48 && character<=57) // [0-9]
97             {
98                 ival = static_cast<char>(character-48);
99                 return true;
100             }
101             else if(character>=65 && character<=70) // [A-F]
102             {
103                 ival = static_cast<char>(10+character-65);
104                 return true;
105             }
106             else if(character>=97 && character<=102) // [a-f]
107             {
108                 ival = static_cast<char>(10+character-97);
109                 return true;
110             }
111 
112             ival = 0;
113             return false;
114         }
115 
116         // convert array of 8 hex ascii to f32
117         // The input hexascii is required to be a little-endian representation
118         // as used in the iridas file format
119         // "AD10753F" -> 0.9572857022285461f on ALL architectures
120 
121         bool hexasciitofloat(float& fval, const char * ascii)
122         {
123             // Convert all ASCII numbers to their numerical representations
124             char asciinums[8];
125             for(unsigned int i=0; i<8; ++i)
126             {
127                 if(!hexasciitoint(asciinums[i], ascii[i]))
128                 {
129                     return false;
130                 }
131             }
132 
133             unsigned char * fvalbytes = reinterpret_cast<unsigned char *>(&fval);
134 
135 #if OCIO_LITTLE_ENDIAN
136             // Since incoming values are little endian, and we're on little endian
137             // preserve the byte order
138             fvalbytes[0] = (unsigned char) (asciinums[1] | (asciinums[0] << 4));
139             fvalbytes[1] = (unsigned char) (asciinums[3] | (asciinums[2] << 4));
140             fvalbytes[2] = (unsigned char) (asciinums[5] | (asciinums[4] << 4));
141             fvalbytes[3] = (unsigned char) (asciinums[7] | (asciinums[6] << 4));
142 #else
143             // Since incoming values are little endian, and we're on big endian
144             // flip the byte order
145             fvalbytes[3] = (unsigned char) (asciinums[1] | (asciinums[0] << 4));
146             fvalbytes[2] = (unsigned char) (asciinums[3] | (asciinums[2] << 4));
147             fvalbytes[1] = (unsigned char) (asciinums[5] | (asciinums[4] << 4));
148             fvalbytes[0] = (unsigned char) (asciinums[7] | (asciinums[6] << 4));
149 #endif
150             return true;
151         }
152     }
153 
154     namespace
155     {
156         class LocalCachedFile : public CachedFile
157         {
158         public:
159             LocalCachedFile ()
160             {
161                 lut3D = Lut3D::Create();
162             };
163             ~LocalCachedFile() {};
164 
165             Lut3DRcPtr lut3D;
166         };
167 
168         typedef OCIO_SHARED_PTR<LocalCachedFile> LocalCachedFileRcPtr;
169         typedef OCIO_SHARED_PTR<TiXmlDocument> TiXmlDocumentRcPtr;
170 
171 
172         class LocalFileFormat : public FileFormat
173         {
174         public:
175 
176             ~LocalFileFormat() {};
177 
178             virtual void GetFormatInfo(FormatInfoVec & formatInfoVec) const;
179 
180             virtual CachedFileRcPtr Read(std::istream & istream) const;
181 
182             virtual void BuildFileOps(OpRcPtrVec & ops,
183                          const Config& config,
184                          const ConstContextRcPtr & context,
185                          CachedFileRcPtr untypedCachedFile,
186                          const FileTransform& fileTransform,
187                          TransformDirection dir) const;
188         };
189 
190         void LocalFileFormat::GetFormatInfo(FormatInfoVec & formatInfoVec) const
191         {
192             FormatInfo info;
193             info.name = "iridas_look";
194             info.extension = "look";
195             info.capabilities = FORMAT_CAPABILITY_READ;
196             formatInfoVec.push_back(info);
197         }
198 
199         CachedFileRcPtr
200         LocalFileFormat::Read(std::istream & istream) const
201         {
202 
203             // Get root element from XML file
204             TiXmlDocumentRcPtr doc;
205             TiXmlElement* rootElement;
206 
207             {
208                 std::ostringstream rawdata;
209                 rawdata << istream.rdbuf();
210 
211                 doc = TiXmlDocumentRcPtr(new TiXmlDocument());
212                 doc->Parse(rawdata.str().c_str());
213 
214                 if(doc->Error())
215                 {
216                     std::ostringstream os;
217                     os << "XML Parse Error. ";
218                     os << doc->ErrorDesc() << " (line ";
219                     os << doc->ErrorRow() << ", character ";
220                     os << doc->ErrorCol() << ")";
221                     throw Exception(os.str().c_str());
222                 }
223 
224                 // Check for blank file
225                 rootElement = doc->RootElement();
226                 if(!rootElement)
227                 {
228                     std::ostringstream os;
229                     os << "Error loading xml. Null root element.";
230                     throw Exception(os.str().c_str());
231                 }
232             }
233 
234             // Check root element is <look>
235             if(std::string(rootElement->Value()) != "look")
236             {
237                 std::ostringstream os;
238                 os << "Error loading .look LUT. ";
239                 os << "Root element is type '" << rootElement->Value() << "', ";
240                 os << "expected 'look'.";
241                 throw Exception(os.str().c_str());
242             }
243 
244             // Fail to load file if it contains a <mask> section
245             if(rootElement->FirstChild("mask") && rootElement->FirstChild("mask")->FirstChild())
246             {
247                 // If root element contains "mask" child, and it is
248                 // not empty, throw exception
249                 std::ostringstream os;
250                 os << "Cannot load .look LUT containing mask";
251                 throw Exception(os.str().c_str());
252             }
253 
254             // Get <LUT> section
255 
256             // TODO: There is a LUT1D section in some .look files,
257             // which we could use if available. Need to check
258             // assumption that it is only written for 1D transforms,
259             // and it matches the desired output
260             TiXmlNode* lutsection = rootElement->FirstChild("LUT");
261 
262             if(!lutsection)
263             {
264                 std::ostringstream os;
265                 os << "Error loading .look LUT. ";
266                 os << "Could not find required 'LUT' section.";
267                 throw Exception(os.str().c_str());
268             }
269 
270             // Get 3D LUT size
271             int size_3d = -1;
272 
273             {
274                 // Get size from <look><LUT><size>'123'</size></LUT></look>
275                 TiXmlNode* elemsize = lutsection->FirstChild("size");
276                 if(!elemsize)
277                 {
278                     std::ostringstream os;
279                     os << "Error loading .look LUT. ";
280                     os << "LUT section did not contain 'size'.";
281                     throw Exception(os.str().c_str());
282                 }
283 
284                 std::string size_raw = std::string(elemsize->ToElement()->GetText());
285                 std::string size_clean = pystring::strip(size_raw, "'\" "); // strip quotes and space
286 
287                 char* endptr = 0;
288                 size_3d = static_cast<int>(strtol(size_clean.c_str(), &endptr, 10));
289 
290                 if(*endptr)
291                 {
292                     // strtol didn't consume entire string, there was
293                     // remaining data, thus did not contain a single interger
294                     std::ostringstream os;
295                     os << "Invalid LUT size value: '" << size_raw;
296                     os << "'. Expected quoted integer.";
297                     throw Exception(os.str().c_str());
298                 }
299             }
300 
301             // Grab raw 3D data
302             std::vector<float> raw;
303             {
304                 TiXmlNode* dataelem = lutsection->FirstChild("data");
305                 if(!dataelem)
306                 {
307                     std::ostringstream os;
308                     os << "Error loading .look LUT. ";
309                     os << "LUT section did not contain 'data'.";
310                     throw Exception(os.str().c_str());
311                 }
312 
313                 raw.reserve(3*(size_3d*size_3d*size_3d));
314 
315                 std::string what = dataelem->ToElement()->GetText();
316 
317                 // Remove spaces, quotes and newlines
318                 what = pystring::replace(what, " ", "");
319                 what = pystring::replace(what, "\"", "");
320                 what = pystring::replace(what, "'", "");
321                 what = pystring::replace(what, "\n", "");
322 
323                 if(what.size() % 8 != 0)
324                 {
325                     std::ostringstream os;
326                     os << "Error loading .look LUT. ";
327                     os << "Number of characters in 'data' must be multiple of 8. ";
328                     os << what.size() << " elements found.";
329                     throw Exception(os.str().c_str());
330                 }
331 
332                 const char * ascii = what.c_str();
333                 float fval = 0.0f;
334                 for(unsigned int i=0; i<what.size()/8; ++i)
335                 {
336                     if(!hexasciitofloat(fval, &ascii[8*i]))
337                     {
338                         std::ostringstream os;
339                         os << "Error loading .look LUT. ";
340                         os << "Non-hex characters found in 'data' block ";
341                         os << "at index '" << (8*i) << "'.";
342                         throw Exception(os.str().c_str());
343                     }
344                     raw.push_back(fval);
345                 }
346             }
347 
348 
349             // Validate LUT sizes, and create cached file object
350             LocalCachedFileRcPtr cachedFile = LocalCachedFileRcPtr(new LocalCachedFile());
351 
352             if((size_3d*size_3d*size_3d)*3 != static_cast<int>(raw.size()))
353             {
354                 std::ostringstream os;
355                 os << "Parse error in Iridas .look lut. ";
356                 os << "Incorrect number of lut3d entries. ";
357                 os << "Found " << raw.size() << " values, expected " << (size_3d*size_3d*size_3d)*3 << ".";
358                 throw Exception(os.str().c_str());
359             }
360 
361             // Reformat 3D data
362             cachedFile->lut3D->size[0] = size_3d;
363             cachedFile->lut3D->size[1] = size_3d;
364             cachedFile->lut3D->size[2] = size_3d;
365             cachedFile->lut3D->lut = raw;
366 
367             return cachedFile;
368         }
369 
370 
371         void
372         LocalFileFormat::BuildFileOps(OpRcPtrVec & ops,
373                                       const Config& /*config*/,
374                                       const ConstContextRcPtr & /*context*/,
375                                       CachedFileRcPtr untypedCachedFile,
376                                       const FileTransform& fileTransform,
377                                       TransformDirection dir) const
378         {
379             LocalCachedFileRcPtr cachedFile = DynamicPtrCast<LocalCachedFile>(untypedCachedFile);
380 
381             // This should never happen.
382             if(!cachedFile)
383             {
384                 std::ostringstream os;
385                 os << "Cannot build Iridas .look Op. Invalid cache type.";
386                 throw Exception(os.str().c_str());
387             }
388 
389             TransformDirection newDir = CombineTransformDirections(dir,
390                 fileTransform.getDirection());
391             if(newDir == TRANSFORM_DIR_UNKNOWN)
392             {
393                 std::ostringstream os;
394                 os << "Cannot build file format transform,";
395                 os << " unspecified transform direction.";
396                 throw Exception(os.str().c_str());
397             }
398 
399             CreateLut3DOp(ops, cachedFile->lut3D,
400                           fileTransform.getInterpolation(), newDir);
401         }
402     }
403 
404     FileFormat * CreateFileFormatIridasLook()
405     {
406         return new LocalFileFormat();
407     }
408 }
409 OCIO_NAMESPACE_EXIT
410 
411 
412 ///////////////////////////////////////////////////////////////////////////////
413 
414 #ifdef OCIO_UNIT_TEST
415 
416 #include "UnitTest.h"
417 
418 OCIO_NAMESPACE_USING
419 
420 
421 
422 OIIO_ADD_TEST(FileFormatIridasLook, hexasciitoint)
423 {
424     {
425     char ival = 0;
426     bool success = hexasciitoint(ival, 'a');
427     OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(ival, 10);
428     }
429 
430     {
431     char ival = 0;
432     bool success = hexasciitoint(ival, 'A');
433     OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(ival, 10);
434     }
435 
436     {
437     char ival = 0;
438     bool success = hexasciitoint(ival, 'f');
439     OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(ival, 15);
440     }
441 
442     {
443     char ival = 0;
444     bool success = hexasciitoint(ival, 'F');
445     OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(ival, 15);
446     }
447 
448     {
449     char ival = 0;
450     bool success = hexasciitoint(ival, '0');
451     OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(ival, 0);
452     }
453 
454     {
455     char ival = 0;
456     bool success = hexasciitoint(ival, '0');
457     OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(ival, 0);
458     }
459 
460     {
461     char ival = 0;
462     bool success = hexasciitoint(ival, '9');
463     OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(ival, 9);
464     }
465 
466     {
467     char ival = 0;
468     bool success = hexasciitoint(ival, '\n');
469     OIIO_CHECK_EQUAL(success, false);
470     }
471 
472     {
473     char ival = 0;
474     bool success = hexasciitoint(ival, 'j');
475     OIIO_CHECK_EQUAL(success, false);
476     }
477 
478     {
479     char ival = 0;
480     bool success = hexasciitoint(ival, 'x');
481     OIIO_CHECK_EQUAL(success, false);
482     }
483 }
484 
485 
OIIO_ADD_TEST(FileFormatIridasLook,hexasciitofloat)486 OIIO_ADD_TEST(FileFormatIridasLook, hexasciitofloat)
487 {
488     //>>> import binascii, struct
489     //>> struct.unpack("<f", binascii.unhexlify("AD10753F"))[0]
490     //0.9572857022285461
491 
492     {
493     float fval = 0.0f;
494     bool success = hexasciitofloat(fval, "0000003F");
495     OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(fval, 0.5f);
496     }
497 
498     {
499     float fval = 0.0f;
500     bool success = hexasciitofloat(fval, "0000803F");
501     OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(fval, 1.0f);
502     }
503 
504     {
505     float fval = 0.0f;
506     bool success = hexasciitofloat(fval, "AD10753F");
507     OIIO_CHECK_EQUAL(success, true); OIIO_CHECK_EQUAL(fval, 0.9572857022285461f);
508     }
509 
510     {
511     float fval = 0.0f;
512     bool success = hexasciitofloat(fval, "AD10X53F");
513     OIIO_CHECK_EQUAL(success, false);
514     }
515 }
516 
517 
OIIO_ADD_TEST(FileFormatIridasLook,simple3d)518 OIIO_ADD_TEST(FileFormatIridasLook, simple3d)
519 {
520     std::ostringstream strebuf;
521     strebuf << "<?xml version=\"1.0\" ?>" << "\n";
522     strebuf << "<look>" << "\n";
523     strebuf << "  <shaders>" << "\n";
524     strebuf << "    <base>" << "\n";
525     strebuf << "      <visible>\"1\"</visible>" << "\n";
526     strebuf << "      <sublayer0>" << "\n";
527     strebuf << "        <opacity>\"1\"</opacity>" << "\n";
528     strebuf << "        <parameters>" << "\n";
529     strebuf << "          <Secondary1>\"1\"</Secondary1>" << "\n";
530     strebuf << "          <Secondary5>\"0\"</Secondary5>" << "\n";
531     strebuf << "          <Secondary4>\"0\"</Secondary4>" << "\n";
532     strebuf << "          <Secondary2>\"0\"</Secondary2>" << "\n";
533     strebuf << "          <Secondary6>\"0\"</Secondary6>" << "\n";
534     strebuf << "          <Secondary3>\"0\"</Secondary3>" << "\n";
535     strebuf << "          <Blur>\"0\"</Blur>" << "\n";
536     strebuf << "          <saturation>\"0\"</saturation>" << "\n";
537     strebuf << "        </parameters>" << "\n";
538     strebuf << "      </sublayer0>" << "\n";
539     strebuf << "    </base>" << "\n";
540     strebuf << "  </shaders>" << "\n";
541     strebuf << "  <LUT>" << "\n";
542     strebuf << "    <size>\"8\"</size>" << "\n";
543     strebuf << "    <data>\"" << "\n";
544     strebuf << "      0000008000000080000000802CF52E3D2DF52E3D2DF52E3D2CF5AE3D2DF5AE3D" << "\n";
545     strebuf << "      2DF5AE3DE237033EE237033EE237033E2CF52E3E2DF52E3E2DF52E3E78B25A3E" << "\n";
546     strebuf << "      78B25A3E78B25A3EE037833EE137833EE137833E8616993E8716993E8716993E" << "\n";
547     strebuf << "      4BBDAB3D4BBDAB3D4BBDAB3DF09B013EF09B013EF09B013E3C592D3E3C592D3E" << "\n";
548     strebuf << "      3C592D3E8716593E8716593E8716593EE969823EE969823EE969823E8E48983E" << "\n";
549     strebuf << "      8E48983E8E48983E3227AE3E3327AE3E3327AE3ED805C43ED905C43ED905C43E" << "\n";
550     strebuf << "      4BBD2B3E4BBD2B3E4BBD2B3E967A573E967A573E967A573EF09B813EF09B813E" << "\n";
551     strebuf << "      F09B813E967A973E967A973E967A973E3C59AD3E3C59AD3E3C59AD3EE137C33E" << "\n";
552     strebuf << "      E137C33EE137C33E8616D93E8616D93E8616D93E2CF5EE3E2CF5EE3E2CF5EE3E" << "\n";
553     strebuf << "      F9CD803EF9CD803EF9CD803E9EAC963E9EAC963E9EAC963E448BAC3E448BAC3E" << "\n";
554     strebuf << "      448BAC3EEA69C23EEA69C23EEA69C23E8F48D83E8F48D83E8F48D83E3527EE3E" << "\n";
555     strebuf << "      3527EE3E3527EE3EED02023FED02023FED02023F40F20C3F40F20C3F40F20C3F" << "\n";
556     strebuf << "      4BBDAB3E4BBDAB3E4BBDAB3EF09BC13EF09BC13EF09BC13E967AD73E967AD73E" << "\n";
557     strebuf << "      967AD73E3C59ED3E3C59ED3E3C59ED3EF09B013FF09B013FF09B013F438B0C3F" << "\n";
558     strebuf << "      438B0C3F438B0C3F967A173F967A173F967A173FE969223FE969223FE969223F" << "\n";
559     strebuf << "      9EACD63E9EACD63E9EACD63E428BEC3E438BEC3E438BEC3EF434013FF434013F" << "\n";
560     strebuf << "      F434013F47240C3F47240C3F47240C3F9A13173F9A13173F9A13173FED02223F" << "\n";
561     strebuf << "      ED02223FED02223F3FF22C3F3FF22C3F3FF22C3F92E1373F92E1373F92E1373F" << "\n";
562     strebuf << "      F8CD003FF8CD003FF8CD003F49BD0B3F4ABD0B3F4ABD0B3F9DAC163F9DAC163F" << "\n";
563     strebuf << "      9DAC163FF09B213FF09B213FF09B213F438B2C3F438B2C3F438B2C3F967A373F" << "\n";
564     strebuf << "      967A373F967A373FE869423FE869423FE869423F3B594D3F3B594D3F3B594D3F" << "\n";
565     strebuf << "      A245163FA245163FA245163FF334213FF434213FF434213F47242C3F47242C3F" << "\n";
566     strebuf << "      47242C3F9A13373F9A13373F9A13373FED02423FED02423FED02423F40F24C3F" << "\n";
567     strebuf << "      40F24C3F40F24C3F92E1573F92E1573F92E1573FE5D0623FE5D0623FE5D0623F" << "\n";
568     strebuf << "      9E69853C9E69853C9869853CFCA9713DFCA9713DFCA9713D944FD03D944FD03D" << "\n";
569     strebuf << "      944FD03D14E5133E15E5133E15E5133E60A23F3E60A23F3E60A23F3EAA5F6B3E" << "\n";
570     strebuf << "      AB5F6B3EAB5F6B3E7A8E8B3E7A8E8B3E7A8E8B3E206DA13E206DA13E206DA13E" << "\n";
571     strebuf << "      B217CD3DB217CD3DB217CD3D2449123E2449123E2449123E6F063E3E6F063E3E" << "\n";
572     strebuf << "      6F063E3EBAC3693EBAC3693EBAC3693E82C08A3E82C08A3E82C08A3E289FA03E" << "\n";
573     strebuf << "      289FA03E289FA03ECC7DB63ECC7DB63ECC7DB63E725CCC3E715CCC3E715CCC3E" << "\n";
574     strebuf << "      7E6A3C3E7E6A3C3E7E6A3C3ECA27683ECA27683ECA27683E8AF2893E8AF2893E" << "\n";
575     strebuf << "      8AF2893E30D19F3E30D19F3E30D19F3ED5AFB53ED5AFB53ED5AFB53E7B8ECB3E" << "\n";
576     strebuf << "      7B8ECB3E7A8ECB3E1F6DE13E1F6DE13E1E6DE13EC44BF73EC54BF73EC44BF73E" << "\n";
577     strebuf << "      9224893E9224893E9224893E38039F3E38039F3E38039F3EDEE1B43EDEE1B43E" << "\n";
578     strebuf << "      DEE1B43E83C0CA3E83C0CA3E82C0CA3E299FE03E299FE03E289FE03ECE7DF63E" << "\n";
579     strebuf << "      CE7DF63ECD7DF63E392E063F392E063F382E063F8C1D113F8C1D113F8B1D113F" << "\n";
580     strebuf << "      E413B43EE413B43EE413B43E89F2C93E8AF2C93E89F2C93E30D1DF3E30D1DF3E" << "\n";
581     strebuf << "      2FD1DF3ED5AFF53ED5AFF53ED4AFF53E3DC7053F3DC7053F3CC7053F90B6103F" << "\n";
582     strebuf << "      90B6103F8FB6103FE2A51B3FE2A51B3FE1A51B3F3595263F3595263F3495263F" << "\n";
583     strebuf << "      3703DF3E3703DF3E3603DF3EDCE1F43EDDE1F43EDCE1F43E4160053F4160053F" << "\n";
584     strebuf << "      4060053F944F103F944F103F934F103FE73E1B3FE73E1B3FE63E1B3F392E263F" << "\n";
585     strebuf << "      392E263F382E263F8C1D313F8C1D313F8B1D313FDF0C3C3FDF0C3C3FDE0C3C3F" << "\n";
586     strebuf << "      44F9043F44F9043F43F9043F96E80F3F97E80F3F96E80F3FEAD71A3FEAD71A3F" << "\n";
587     strebuf << "      E9D71A3F3DC7253F3DC7253F3CC7253F90B6303F90B6303F8FB6303FE2A53B3F" << "\n";
588     strebuf << "      E2A53B3FE1A53B3F3595463F3595463F3495463F8884513F8884513F8784513F" << "\n";
589     strebuf << "      EE701A3FEE701A3FED701A3F4060253F4160253F4060253F944F303F944F303F" << "\n";
590     strebuf << "      934F303FE73E3B3FE73E3B3FE63E3B3F3A2E463F3A2E463F392E463F8C1D513F" << "\n";
591     strebuf << "      8C1D513F8B1D513FDF0C5C3FDF0C5C3FDE0C5C3F32FC663F32FC663F31FC663F" << "\n";
592     strebuf << "      9E69053D9E69053D9869053D652F9A3D652F9A3D642F9A3DFCA9F13DFCA9F13D" << "\n";
593     strebuf << "      FCA9F13D4892243E4992243E4992243E944F503E944F503E944F503EDE0C7C3E" << "\n";
594     strebuf << "      DF0C7C3EDF0C7C3E14E5933E14E5933E14E5933EBAC3A93EBAC3A93EBAC3A93E" << "\n";
595     strebuf << "      1A72EE3D1A72EE3D1A72EE3D58F6223E58F6223E58F6223EA3B34E3EA3B34E3E" << "\n";
596     strebuf << "      A3B34E3EEE707A3EEE707A3EEE707A3E1C17933E1C17933E1C17933EC2F5A83E" << "\n";
597     strebuf << "      C2F5A83EC2F5A83E66D4BE3E66D4BE3E66D4BE3E0CB3D43E0BB3D43E0CB3D43E" << "\n";
598     strebuf << "      B2174D3EB2174D3EB2174D3EFDD4783EFDD4783EFDD4783E2449923E2449923E" << "\n";
599     strebuf << "      2449923ECA27A83ECA27A83ECA27A83E6F06BE3E6F06BE3E6F06BE3E15E5D33E" << "\n";
600     strebuf << "      15E5D33E15E5D33EB9C3E93EB9C3E93EB9C3E93E5EA2FF3E5FA2FF3E5FA2FF3E" << "\n";
601     strebuf << "      2C7B913E2C7B913E2C7B913ED259A73ED259A73ED259A73E7838BD3E7838BD3E" << "\n";
602     strebuf << "      7838BD3E1D17D33E1D17D33E1D17D33EC3F5E83EC3F5E83EC3F5E83E68D4FE3E" << "\n";
603     strebuf << "      68D4FE3E68D4FE3E86590A3F86590A3F86590A3FD948153FD948153FD948153F" << "\n";
604     strebuf << "      7E6ABC3E7E6ABC3E7E6ABC3E2349D23E2449D23E2449D23ECA27E83ECA27E83E" << "\n";
605     strebuf << "      CA27E83E6F06FE3E6F06FE3E6F06FE3E8AF2093F8AF2093F8AF2093FDDE1143F" << "\n";
606     strebuf << "      DDE1143FDDE1143F2FD11F3F2FD11F3F2FD11F3F82C02A3F82C02A3F82C02A3F" << "\n";
607     strebuf << "      D159E73ED159E73ED159E73E7638FD3E7738FD3E7738FD3E8E8B093F8E8B093F" << "\n";
608     strebuf << "      8E8B093FE17A143FE17A143FE17A143F346A1F3F346A1F3F346A1F3F86592A3F" << "\n";
609     strebuf << "      86592A3F86592A3FD948353FD948353FD948353F2C38403F2C38403F2C38403F" << "\n";
610     strebuf << "      9124093F9124093F9124093FE313143FE413143FE413143F37031F3F37031F3F" << "\n";
611     strebuf << "      37031F3F8AF2293F8AF2293F8AF2293FDDE1343FDDE1343FDDE1343F2FD13F3F" << "\n";
612     strebuf << "      2FD13F3F2FD13F3F82C04A3F82C04A3F81C04A3FD5AF553FD5AF553FD4AF553F" << "\n";
613     strebuf << "      3B9C1E3F3B9C1E3F3B9C1E3F8D8B293F8E8B293F8E8B293FE17A343FE17A343F" << "\n";
614     strebuf << "      E17A343F346A3F3F346A3F3F346A3F3F87594A3F87594A3F86594A3FD948553F" << "\n";
615     strebuf << "      D948553FD848553F2C38603F2C38603F2B38603F7F276B3F7F276B3F7E276B3F" << "\n";
616     strebuf << "      6E1E483D6E1E483D681E483DCD89BB3DCD89BB3DCC89BB3D3282093E3282093E" << "\n";
617     strebuf << "      3282093E7C3F353E7D3F353E7C3F353EC8FC603EC8FC603EC8FC603E095D863E" << "\n";
618     strebuf << "      095D863E095D863EAE3B9C3EAE3B9C3EAE3B9C3E541AB23E541AB23E541AB23E" << "\n";
619     strebuf << "      41E6073E41E6073E40E6073E8CA3333E8CA3333E8CA3333ED7605F3ED7605F3E" << "\n";
620     strebuf << "      D7605F3E118F853E118F853E118F853EB66D9B3EB66D9B3EB66D9B3E5B4CB13E" << "\n";
621     strebuf << "      5B4CB13E5B4CB13E002BC73E002BC73E002BC73EA609DD3EA509DD3EA609DD3E" << "\n";
622     strebuf << "      E6C45D3EE6C45D3EE6C45D3E18C1843E18C1843E18C1843EBE9F9A3EBE9F9A3E" << "\n";
623     strebuf << "      BE9F9A3E647EB03E647EB03E647EB03E095DC63E095DC63E095DC63EAE3BDC3E" << "\n";
624     strebuf << "      AE3BDC3EAE3BDC3E531AF23E531AF23E531AF23E7CFC033F7CFC033F7CFC033F" << "\n";
625     strebuf << "      C6D1993EC6D1993EC6D1993E6CB0AF3E6CB0AF3E6CB0AF3E128FC53E128FC53E" << "\n";
626     strebuf << "      128FC53EB76DDB3EB76DDB3EB76DDB3E5D4CF13E5D4CF13E5D4CF13E8195033F" << "\n";
627     strebuf << "      8195033F8195033FD3840E3FD3840E3FD3840E3F2674193F2674193F2674193F" << "\n";
628     strebuf << "      18C1C43E18C1C43E18C1C43EBD9FDA3EBE9FDA3EBE9FDA3E647EF03E647EF03E" << "\n";
629     strebuf << "      647EF03E842E033F842E033F842E033FD71D0E3FD71D0E3FD71D0E3F2A0D193F" << "\n";
630     strebuf << "      2A0D193F2A0D193F7CFC233F7CFC233F7CFC233FCFEB2E3FCFEB2E3FCFEB2E3F" << "\n";
631     strebuf << "      6BB0EF3E6BB0EF3E6BB0EF3E87C7023F88C7023F88C7023FDBB60D3FDBB60D3F" << "\n";
632     strebuf << "      DBB60D3F2EA6183F2EA6183F2EA6183F8195233F8195233F8195233FD3842E3F" << "\n";
633     strebuf << "      D3842E3FD3842E3F2674393F2674393F2674393F7963443F7963443F7963443F" << "\n";
634     strebuf << "      DE4F0D3FDE4F0D3FDE4F0D3F303F183F313F183F313F183F842E233F842E233F" << "\n";
635     strebuf << "      842E233FD71D2E3FD71D2E3FD71D2E3F2A0D393F2A0D393F2A0D393F7CFC433F" << "\n";
636     strebuf << "      7CFC433F7CFC433FCFEB4E3FCFEB4E3FCFEB4E3F22DB593F22DB593F22DB593F" << "\n";
637     strebuf << "      88C7223F88C7223F88C7223FDAB62D3FDBB62D3FDBB62D3F2EA6383F2EA6383F" << "\n";
638     strebuf << "      2EA6383F8195433F8195433F8195433FD4844E3FD4844E3FD4844E3F2674593F" << "\n";
639     strebuf << "      2674593F2674593F7963643F7963643F7963643FCC526F3FCC526F3FCC526F3F" << "\n";
640     strebuf << "      9E69853D9E69853D9869853D34E4DC3D34E4DC3D34E4DC3D652F1A3E652F1A3E" << "\n";
641     strebuf << "      642F1A3EB1EC453EB1EC453EB0EC453EFCA9713EFCA9713EFCA9713EA3B38E3E" << "\n";
642     strebuf << "      A3B38E3EA3B38E3E4892A43E4892A43E4892A43EEE70BA3EEE70BA3EEE70BA3E" << "\n";
643     strebuf << "      7493183E7493183E7493183EBF50443EBF50443EBE50443E0A0E703E0A0E703E" << "\n";
644     strebuf << "      0A0E703EABE58D3EABE58D3EABE58D3E50C4A33E50C4A33E50C4A33EF5A2B93E" << "\n";
645     strebuf << "      F5A2B93EF5A2B93E9A81CF3E9981CF3E9A81CF3E4060E53E3F60E53E4060E53E" << "\n";
646     strebuf << "      1A726E3E1A726E3E1A726E3EB2178D3EB2178D3EB2178D3E58F6A23E58F6A23E" << "\n";
647     strebuf << "      58F6A23EFED4B83EFED4B83EFED4B83EA3B3CE3EA3B3CE3EA3B3CE3E4892E43E" << "\n";
648     strebuf << "      4892E43E4892E43EED70FA3EED70FA3EED70FA3EC927083FC927083FC927083F" << "\n";
649     strebuf << "      6028A23E6028A23E6028A23E0607B83E0607B83E0607B83EABE5CD3EABE5CD3E" << "\n";
650     strebuf << "      ABE5CD3E51C4E33E51C4E33E51C4E33EF7A2F93EF7A2F93EF7A2F93ECEC0073F" << "\n";
651     strebuf << "      CEC0073FCEC0073F20B0123F20B0123F20B0123F739F1D3F739F1D3F739F1D3F" << "\n";
652     strebuf << "      B217CD3EB217CD3EB217CD3E57F6E23E58F6E23E58F6E23EFDD4F83EFDD4F83E" << "\n";
653     strebuf << "      FDD4F83ED159073FD159073FD159073F2449123F2449123F2449123F77381D3F" << "\n";
654     strebuf << "      77381D3F77381D3FC927283FC927283FC927283F1C17333F1C17333F1C17333F" << "\n";
655     strebuf << "      0507F83E0507F83E0507F83ED4F2063FD5F2063FD5F2063F28E2113F28E2113F" << "\n";
656     strebuf << "      28E2113F7BD11C3F7BD11C3F7BD11C3FCEC0273FCEC0273FCEC0273F20B0323F" << "\n";
657     strebuf << "      20B0323F20B0323F739F3D3F739F3D3F739F3D3FC68E483FC68E483FC68E483F" << "\n";
658     strebuf << "      2B7B113F2B7B113F2B7B113F7D6A1C3F7E6A1C3F7E6A1C3FD159273FD159273F" << "\n";
659     strebuf << "      D159273F2449323F2449323F2449323F77383D3F77383D3F77383D3FC927483F" << "\n";
660     strebuf << "      C927483FC927483F1C17533F1C17533F1C17533F6F065E3F6F065E3F6F065E3F" << "\n";
661     strebuf << "      D5F2263FD5F2263FD5F2263F27E2313F28E2313F28E2313F7BD13C3F7BD13C3F" << "\n";
662     strebuf << "      7BD13C3FCEC0473FCEC0473FCEC0473F21B0523F21B0523F21B0523F739F5D3F" << "\n";
663     strebuf << "      739F5D3F739F5D3FC68E683FC68E683FC68E683F197E733F197E733F197E733F" << "\n";
664     strebuf << "      06C4A63D06C4A63D00C4A63D9C3EFE3D9C3EFE3D983EFE3D99DC2A3E99DC2A3E" << "\n";
665     strebuf << "      98DC2A3EE599563EE599563EE499563E982B813E982B813E982B813E3D0A973E" << "\n";
666     strebuf << "      3D0A973E3D0A973EE2E8AC3EE2E8AC3EE2E8AC3E88C7C23E88C7C23E88C7C23E" << "\n";
667     strebuf << "      A840293EA840293EA840293EF3FD543EF3FD543EF0FD543E9F5D803E9F5D803E" << "\n";
668     strebuf << "      9F5D803E453C963E453C963E453C963EEA1AAC3EEA1AAC3EEA1AAC3E8FF9C13E" << "\n";
669     strebuf << "      8FF9C13E8FF9C13E34D8D73E33D8D73E34D8D73EDAB6ED3ED9B6ED3EDAB6ED3E" << "\n";
670     strebuf << "      4E1F7F3E4E1F7F3E4E1F7F3E4C6E953E4C6E953E4C6E953EF24CAB3EF24CAB3E" << "\n";
671     strebuf << "      F24CAB3E982BC13E982BC13E982BC13E3D0AD73E3D0AD73E3D0AD73EE2E8EC3E" << "\n";
672     strebuf << "      E2E8EC3EE2E8EC3EC363013FC363013FC363013F16530C3F16530C3F16530C3F" << "\n";
673     strebuf << "      FA7EAA3EFA7EAA3EFA7EAA3EA05DC03EA05DC03EA05DC03E453CD63E453CD63E" << "\n";
674     strebuf << "      453CD63EEB1AEC3EEB1AEC3EEB1AEC3EC8FC003FC8FC003FC8FC003F1BEC0B3F" << "\n";
675     strebuf << "      1BEC0B3F1BEC0B3F6DDB163F6DDB163F6DDB163FC0CA213FC0CA213FC0CA213F" << "\n";
676     strebuf << "      4C6ED53E4C6ED53E4C6ED53EF14CEB3EF24CEB3EF24CEB3ECB95003FCB95003F" << "\n";
677     strebuf << "      CB95003F1E850B3F1E850B3F1E850B3F7174163F7174163F7174163FC463213F" << "\n";
678     strebuf << "      C463213FC463213F16532C3F16532C3F16532C3F6942373F6942373F6942373F" << "\n";
679     strebuf << "      CF2E003FCF2E003FCF2E003F211E0B3F221E0B3F221E0B3F750D163F750D163F" << "\n";
680     strebuf << "      750D163FC8FC203FC8FC203FC8FC203F1BEC2B3F1BEC2B3F1BEC2B3F6DDB363F" << "\n";
681     strebuf << "      6DDB363F6DDB363FC0CA413FC0CA413FC0CA413F13BA4C3F13BA4C3F13BA4C3F" << "\n";
682     strebuf << "      78A6153F78A6153F78A6153FCA95203FCB95203FCB95203F1E852B3F1E852B3F" << "\n";
683     strebuf << "      1E852B3F7174363F7174363F7174363FC463413FC463413FC463413F16534C3F" << "\n";
684     strebuf << "      16534C3F16534C3F6942573F6942573F6942573FBC31623FBC31623FBC31623F" << "\n";
685     strebuf << "      221E2B3F221E2B3F221E2B3F740D363F750D363F750D363FC8FC403FC8FC403F" << "\n";
686     strebuf << "      C8FC403F1BEC4B3F1BEC4B3F1BEC4B3F6EDB563F6EDB563F6EDB563FC0CA613F" << "\n";
687     strebuf << "      C0CA613FC0CA613F13BA6C3F13BA6C3F13BA6C3F66A9773F66A9773F66A9773F" << "\n";
688     strebuf << "      6D1EC83D6D1EC83D681EC83D81CC0F3E81CC0F3E80CC0F3ECD893B3ECD893B3E" << "\n";
689     strebuf << "      CC893B3E1847673E1847673E1847673E3182893E3182893E3082893ED7609F3E" << "\n";
690     strebuf << "      D7609F3ED6609F3E7C3FB53E7C3FB53E7C3FB53E221ECB3E221ECB3E221ECB3E" << "\n";
691     strebuf << "      DCED393EDCED393EDCED393E26AB653E26AB653E24AB653E39B4883E39B4883E" << "\n";
692     strebuf << "      38B4883EDE929E3EDE929E3EDE929E3E8371B43E8371B43E8271B43E2950CA3E" << "\n";
693     strebuf << "      2850CA3E2950CA3ECE2EE03ECD2EE03ECE2EE03E740DF63E730DF63E740DF63E" << "\n";
694     strebuf << "      40E6873E40E6873E40E6873EE6C49D3EE6C49D3EE6C49D3E8CA3B33E8CA3B33E" << "\n";
695     strebuf << "      8CA3B33E3182C93E3182C93E3182C93ED660DF3ED660DF3ED660DF3E7C3FF53E" << "\n";
696     strebuf << "      7C3FF53E7C3FF53E108F053F108F053F108F053F637E103F637E103F637E103F" << "\n";
697     strebuf << "      94D5B23E94D5B23E94D5B23E39B4C83E39B4C83E39B4C83EDF92DE3EDF92DE3E" << "\n";
698     strebuf << "      DF92DE3E8571F43E8571F43E8571F43E1528053F1528053F1528053F6817103F" << "\n";
699     strebuf << "      6817103F6817103FBA061B3FBA061B3FBA061B3F0DF6253F0DF6253F0DF6253F" << "\n";
700     strebuf << "      E6C4DD3EE6C4DD3EE6C4DD3E8AA3F33E8BA3F33E8BA3F33E18C1043F18C1043F" << "\n";
701     strebuf << "      18C1043F6BB00F3F6BB00F3F6BB00F3FBE9F1A3FBE9F1A3FBE9F1A3F118F253F" << "\n";
702     strebuf << "      118F253F118F253F637E303F637E303F637E303FB66D3B3FB66D3B3FB66D3B3F" << "\n";
703     strebuf << "      1C5A043F1C5A043F1C5A043F6E490F3F6F490F3F6F490F3FC2381A3FC2381A3F" << "\n";
704     strebuf << "      C2381A3F1528253F1528253F1528253F6717303F6717303F6717303FBA063B3F" << "\n";
705     strebuf << "      BA063B3FBA063B3F0DF6453F0DF6453F0DF6453F60E5503F60E5503F60E5503F" << "\n";
706     strebuf << "      C5D1193FC5D1193FC5D1193F17C1243F18C1243F18C1243F6BB02F3F6BB02F3F" << "\n";
707     strebuf << "      6BB02F3FBE9F3A3FBE9F3A3FBE9F3A3F108F453F108F453F108F453F637E503F" << "\n";
708     strebuf << "      637E503F637E503FB66D5B3FB66D5B3FB66D5B3F095D663F095D663F095D663F" << "\n";
709     strebuf << "      6F492F3F6F492F3F6F492F3FC1383A3FC2383A3FC2383A3F1528453F1528453F" << "\n";
710     strebuf << "      1528453F6817503F6817503F6817503FBA065B3FBA065B3FBA065B3F0DF6653F" << "\n";
711     strebuf << "      0DF6653F0DF6653F60E5703F60E5703F60E5703FB3D47B3FB3D47B3FB3D47B3F" << "\n";
712     strebuf << "      D578E93DD578E93DD078E93DB579203EB579203EB479203E01374C3E01374C3E" << "\n";
713     strebuf << "      00374C3E4CF4773E4CF4773E4CF4773ECBD8913ECBD8913ECAD8913E71B7A73E" << "\n";
714     strebuf << "      71B7A73E70B7A73E1696BD3E1696BD3E1696BD3EBC74D33EBC74D33EBC74D33E" << "\n";
715     strebuf << "      109B4A3E109B4A3E109B4A3E5A58763E5A58763E5858763ED30A913ED30A913E" << "\n";
716     strebuf << "      D20A913E78E9A63E78E9A63E78E9A63E1DC8BC3E1DC8BC3E1CC8BC3EC3A6D23E" << "\n";
717     strebuf << "      C2A6D23EC2A6D23E6885E83E6785E83E6885E83E0E64FE3E0D64FE3E0E64FE3E" << "\n";
718     strebuf << "      DA3C903EDA3C903EDA3C903E801BA63E801BA63E801BA63E26FABB3E26FABB3E" << "\n";
719     strebuf << "      26FABB3ECBD8D13ECBD8D13ECAD8D13E70B7E73E70B7E73E70B7E73E1696FD3E" << "\n";
720     strebuf << "      1696FD3E1696FD3E5DBA093F5DBA093F5DBA093FB0A9143FB0A9143FB0A9143F" << "\n";
721     strebuf << "      2E2CBB3E2E2CBB3E2E2CBB3ED20AD13ED30AD13ED20AD13E79E9E63E79E9E63E" << "\n";
722     strebuf << "      78E9E63E1FC8FC3E1FC8FC3E1EC8FC3E6253093F6253093F6253093FB542143F" << "\n";
723     strebuf << "      B542143FB542143F07321F3F07321F3F07321F3F5A212A3F5A212A3F5A212A3F" << "\n";
724     strebuf << "      801BE63E801BE63E801BE63E24FAFB3E25FAFB3E24FAFB3E65EC083F65EC083F" << "\n";
725     strebuf << "      65EC083FB8DB133FB8DB133FB8DB133F0BCB1E3F0BCB1E3F0BCB1E3F5EBA293F" << "\n";
726     strebuf << "      5EBA293F5EBA293FB0A9343FB0A9343FB0A9343F03993F3F03993F3F03993F3F" << "\n";
727     strebuf << "      6985083F6985083F6985083FBB74133FBC74133FBC74133F0F641E3F0F641E3F" << "\n";
728     strebuf << "      0F641E3F6253293F6253293F6253293FB442343FB442343FB442343F07323F3F" << "\n";
729     strebuf << "      07323F3F07323F3F5A214A3F5A214A3F5A214A3FAD10553FAD10553FAD10553F" << "\n";
730     strebuf << "      12FD1D3F12FD1D3F12FD1D3F64EC283F65EC283F65EC283FB8DB333FB8DB333F" << "\n";
731     strebuf << "      B8DB333F0BCB3E3F0BCB3E3F0BCB3E3F5DBA493F5DBA493F5DBA493FB0A9543F" << "\n";
732     strebuf << "      B0A9543FB0A9543F03995F3F03995F3F03995F3F56886A3F56886A3F56886A3F" << "\n";
733     strebuf << "      BC74333FBC74333FBC74333F0E643E3F0F643E3F0F643E3F6153493F6253493F" << "\n";
734     strebuf << "      6253493FB542543FB542543FB542543F07325F3F07325F3F07325F3F5A216A3F" << "\n";
735     strebuf << "      5A216A3F5A216A3FAD10753FAD10753FAD10753F0000803F0000803F0000803F\"" << "\n";
736     strebuf << "    </data>" << "\n";
737     strebuf << "  </LUT>" << "\n";
738     strebuf << "</look>" << "\n";
739 
740     std::istringstream simple1D;
741     simple1D.str(strebuf.str());
742 
743     // Read file
744     LocalFileFormat tester;
745     CachedFileRcPtr cachedFile = tester.Read(simple1D);
746     LocalCachedFileRcPtr looklut = DynamicPtrCast<LocalCachedFile>(cachedFile);
747 
748     // Check LUT size is correct
749     OIIO_CHECK_EQUAL(looklut->lut3D->size[0], 8);
750     OIIO_CHECK_EQUAL(looklut->lut3D->size[1], 8);
751     OIIO_CHECK_EQUAL(looklut->lut3D->size[2], 8);
752 
753     // Check LUT values
754     OIIO_CHECK_EQUAL(looklut->lut3D->lut.size(), 8*8*8*3);
755 
756     double cube[8 * 8 * 8 * 3] = {
757         -0.00000, -0.00000, -0.00000,
758         0.04271, 0.04271, 0.04271,
759         0.08543, 0.08543, 0.08543,
760         0.12814, 0.12814, 0.12814,
761         0.17086, 0.17086, 0.17086,
762         0.21357, 0.21357, 0.21357,
763         0.25629, 0.25629, 0.25629,
764         0.29900, 0.29900, 0.29900,
765         0.08386, 0.08386, 0.08386,
766         0.12657, 0.12657, 0.12657,
767         0.16929, 0.16929, 0.16929,
768         0.21200, 0.21200, 0.21200,
769         0.25471, 0.25471, 0.25471,
770         0.29743, 0.29743, 0.29743,
771         0.34014, 0.34014, 0.34014,
772         0.38286, 0.38286, 0.38286,
773         0.16771, 0.16771, 0.16771,
774         0.21043, 0.21043, 0.21043,
775         0.25314, 0.25314, 0.25314,
776         0.29586, 0.29586, 0.29586,
777         0.33857, 0.33857, 0.33857,
778         0.38129, 0.38129, 0.38129,
779         0.42400, 0.42400, 0.42400,
780         0.46671, 0.46671, 0.46671,
781         0.25157, 0.25157, 0.25157,
782         0.29429, 0.29429, 0.29429,
783         0.33700, 0.33700, 0.33700,
784         0.37971, 0.37971, 0.37971,
785         0.42243, 0.42243, 0.42243,
786         0.46514, 0.46514, 0.46514,
787         0.50786, 0.50786, 0.50786,
788         0.55057, 0.55057, 0.55057,
789         0.33543, 0.33543, 0.33543,
790         0.37814, 0.37814, 0.37814,
791         0.42086, 0.42086, 0.42086,
792         0.46357, 0.46357, 0.46357,
793         0.50629, 0.50629, 0.50629,
794         0.54900, 0.54900, 0.54900,
795         0.59171, 0.59171, 0.59171,
796         0.63443, 0.63443, 0.63443,
797         0.41929, 0.41929, 0.41929,
798         0.46200, 0.46200, 0.46200,
799         0.50471, 0.50471, 0.50471,
800         0.54743, 0.54743, 0.54743,
801         0.59014, 0.59014, 0.59014,
802         0.63286, 0.63286, 0.63286,
803         0.67557, 0.67557, 0.67557,
804         0.71829, 0.71829, 0.71829,
805         0.50314, 0.50314, 0.50314,
806         0.54586, 0.54586, 0.54586,
807         0.58857, 0.58857, 0.58857,
808         0.63129, 0.63129, 0.63129,
809         0.67400, 0.67400, 0.67400,
810         0.71671, 0.71671, 0.71671,
811         0.75943, 0.75943, 0.75943,
812         0.80214, 0.80214, 0.80214,
813         0.58700, 0.58700, 0.58700,
814         0.62971, 0.62971, 0.62971,
815         0.67243, 0.67243, 0.67243,
816         0.71514, 0.71514, 0.71514,
817         0.75786, 0.75786, 0.75786,
818         0.80057, 0.80057, 0.80057,
819         0.84329, 0.84329, 0.84329,
820         0.88600, 0.88600, 0.88600,
821         0.01629, 0.01629, 0.01629,
822         0.05900, 0.05900, 0.05900,
823         0.10171, 0.10171, 0.10171,
824         0.14443, 0.14443, 0.14443,
825         0.18714, 0.18714, 0.18714,
826         0.22986, 0.22986, 0.22986,
827         0.27257, 0.27257, 0.27257,
828         0.31529, 0.31529, 0.31529,
829         0.10014, 0.10014, 0.10014,
830         0.14286, 0.14286, 0.14286,
831         0.18557, 0.18557, 0.18557,
832         0.22829, 0.22829, 0.22829,
833         0.27100, 0.27100, 0.27100,
834         0.31371, 0.31371, 0.31371,
835         0.35643, 0.35643, 0.35643,
836         0.39914, 0.39914, 0.39914,
837         0.18400, 0.18400, 0.18400,
838         0.22671, 0.22671, 0.22671,
839         0.26943, 0.26943, 0.26943,
840         0.31214, 0.31214, 0.31214,
841         0.35486, 0.35486, 0.35486,
842         0.39757, 0.39757, 0.39757,
843         0.44029, 0.44029, 0.44029,
844         0.48300, 0.48300, 0.48300,
845         0.26786, 0.26786, 0.26786,
846         0.31057, 0.31057, 0.31057,
847         0.35329, 0.35329, 0.35329,
848         0.39600, 0.39600, 0.39600,
849         0.43871, 0.43871, 0.43871,
850         0.48143, 0.48143, 0.48143,
851         0.52414, 0.52414, 0.52414,
852         0.56686, 0.56686, 0.56686,
853         0.35171, 0.35171, 0.35171,
854         0.39443, 0.39443, 0.39443,
855         0.43714, 0.43714, 0.43714,
856         0.47986, 0.47986, 0.47986,
857         0.52257, 0.52257, 0.52257,
858         0.56529, 0.56529, 0.56529,
859         0.60800, 0.60800, 0.60800,
860         0.65071, 0.65071, 0.65071,
861         0.43557, 0.43557, 0.43557,
862         0.47829, 0.47829, 0.47829,
863         0.52100, 0.52100, 0.52100,
864         0.56371, 0.56371, 0.56371,
865         0.60643, 0.60643, 0.60643,
866         0.64914, 0.64914, 0.64914,
867         0.69186, 0.69186, 0.69186,
868         0.73457, 0.73457, 0.73457,
869         0.51943, 0.51943, 0.51943,
870         0.56214, 0.56214, 0.56214,
871         0.60486, 0.60486, 0.60486,
872         0.64757, 0.64757, 0.64757,
873         0.69029, 0.69029, 0.69029,
874         0.73300, 0.73300, 0.73300,
875         0.77571, 0.77571, 0.77571,
876         0.81843, 0.81843, 0.81843,
877         0.60329, 0.60329, 0.60329,
878         0.64600, 0.64600, 0.64600,
879         0.68871, 0.68871, 0.68871,
880         0.73143, 0.73143, 0.73143,
881         0.77414, 0.77414, 0.77414,
882         0.81686, 0.81686, 0.81686,
883         0.85957, 0.85957, 0.85957,
884         0.90229, 0.90229, 0.90229,
885         0.03257, 0.03257, 0.03257,
886         0.07529, 0.07529, 0.07529,
887         0.11800, 0.11800, 0.11800,
888         0.16071, 0.16071, 0.16071,
889         0.20343, 0.20343, 0.20343,
890         0.24614, 0.24614, 0.24614,
891         0.28886, 0.28886, 0.28886,
892         0.33157, 0.33157, 0.33157,
893         0.11643, 0.11643, 0.11643,
894         0.15914, 0.15914, 0.15914,
895         0.20186, 0.20186, 0.20186,
896         0.24457, 0.24457, 0.24457,
897         0.28729, 0.28729, 0.28729,
898         0.33000, 0.33000, 0.33000,
899         0.37271, 0.37271, 0.37271,
900         0.41543, 0.41543, 0.41543,
901         0.20029, 0.20029, 0.20029,
902         0.24300, 0.24300, 0.24300,
903         0.28571, 0.28571, 0.28571,
904         0.32843, 0.32843, 0.32843,
905         0.37114, 0.37114, 0.37114,
906         0.41386, 0.41386, 0.41386,
907         0.45657, 0.45657, 0.45657,
908         0.49929, 0.49929, 0.49929,
909         0.28414, 0.28414, 0.28414,
910         0.32686, 0.32686, 0.32686,
911         0.36957, 0.36957, 0.36957,
912         0.41229, 0.41229, 0.41229,
913         0.45500, 0.45500, 0.45500,
914         0.49771, 0.49771, 0.49771,
915         0.54043, 0.54043, 0.54043,
916         0.58314, 0.58314, 0.58314,
917         0.36800, 0.36800, 0.36800,
918         0.41071, 0.41071, 0.41071,
919         0.45343, 0.45343, 0.45343,
920         0.49614, 0.49614, 0.49614,
921         0.53886, 0.53886, 0.53886,
922         0.58157, 0.58157, 0.58157,
923         0.62429, 0.62429, 0.62429,
924         0.66700, 0.66700, 0.66700,
925         0.45186, 0.45186, 0.45186,
926         0.49457, 0.49457, 0.49457,
927         0.53729, 0.53729, 0.53729,
928         0.58000, 0.58000, 0.58000,
929         0.62271, 0.62271, 0.62271,
930         0.66543, 0.66543, 0.66543,
931         0.70814, 0.70814, 0.70814,
932         0.75086, 0.75086, 0.75086,
933         0.53571, 0.53571, 0.53571,
934         0.57843, 0.57843, 0.57843,
935         0.62114, 0.62114, 0.62114,
936         0.66386, 0.66386, 0.66386,
937         0.70657, 0.70657, 0.70657,
938         0.74929, 0.74929, 0.74929,
939         0.79200, 0.79200, 0.79200,
940         0.83471, 0.83471, 0.83471,
941         0.61957, 0.61957, 0.61957,
942         0.66229, 0.66229, 0.66229,
943         0.70500, 0.70500, 0.70500,
944         0.74771, 0.74771, 0.74771,
945         0.79043, 0.79043, 0.79043,
946         0.83314, 0.83314, 0.83314,
947         0.87586, 0.87586, 0.87586,
948         0.91857, 0.91857, 0.91857,
949         0.04886, 0.04886, 0.04886,
950         0.09157, 0.09157, 0.09157,
951         0.13429, 0.13429, 0.13429,
952         0.17700, 0.17700, 0.17700,
953         0.21971, 0.21971, 0.21971,
954         0.26243, 0.26243, 0.26243,
955         0.30514, 0.30514, 0.30514,
956         0.34786, 0.34786, 0.34786,
957         0.13271, 0.13271, 0.13271,
958         0.17543, 0.17543, 0.17543,
959         0.21814, 0.21814, 0.21814,
960         0.26086, 0.26086, 0.26086,
961         0.30357, 0.30357, 0.30357,
962         0.34629, 0.34629, 0.34629,
963         0.38900, 0.38900, 0.38900,
964         0.43171, 0.43171, 0.43171,
965         0.21657, 0.21657, 0.21657,
966         0.25929, 0.25929, 0.25929,
967         0.30200, 0.30200, 0.30200,
968         0.34471, 0.34471, 0.34471,
969         0.38743, 0.38743, 0.38743,
970         0.43014, 0.43014, 0.43014,
971         0.47286, 0.47286, 0.47286,
972         0.51557, 0.51557, 0.51557,
973         0.30043, 0.30043, 0.30043,
974         0.34314, 0.34314, 0.34314,
975         0.38586, 0.38586, 0.38586,
976         0.42857, 0.42857, 0.42857,
977         0.47129, 0.47129, 0.47129,
978         0.51400, 0.51400, 0.51400,
979         0.55671, 0.55671, 0.55671,
980         0.59943, 0.59943, 0.59943,
981         0.38429, 0.38429, 0.38429,
982         0.42700, 0.42700, 0.42700,
983         0.46971, 0.46971, 0.46971,
984         0.51243, 0.51243, 0.51243,
985         0.55514, 0.55514, 0.55514,
986         0.59786, 0.59786, 0.59786,
987         0.64057, 0.64057, 0.64057,
988         0.68329, 0.68329, 0.68329,
989         0.46814, 0.46814, 0.46814,
990         0.51086, 0.51086, 0.51086,
991         0.55357, 0.55357, 0.55357,
992         0.59629, 0.59629, 0.59629,
993         0.63900, 0.63900, 0.63900,
994         0.68171, 0.68171, 0.68171,
995         0.72443, 0.72443, 0.72443,
996         0.76714, 0.76714, 0.76714,
997         0.55200, 0.55200, 0.55200,
998         0.59471, 0.59471, 0.59471,
999         0.63743, 0.63743, 0.63743,
1000         0.68014, 0.68014, 0.68014,
1001         0.72286, 0.72286, 0.72286,
1002         0.76557, 0.76557, 0.76557,
1003         0.80829, 0.80829, 0.80829,
1004         0.85100, 0.85100, 0.85100,
1005         0.63586, 0.63586, 0.63586,
1006         0.67857, 0.67857, 0.67857,
1007         0.72129, 0.72129, 0.72129,
1008         0.76400, 0.76400, 0.76400,
1009         0.80671, 0.80671, 0.80671,
1010         0.84943, 0.84943, 0.84943,
1011         0.89214, 0.89214, 0.89214,
1012         0.93486, 0.93486, 0.93486,
1013         0.06514, 0.06514, 0.06514,
1014         0.10786, 0.10786, 0.10786,
1015         0.15057, 0.15057, 0.15057,
1016         0.19329, 0.19329, 0.19329,
1017         0.23600, 0.23600, 0.23600,
1018         0.27871, 0.27871, 0.27871,
1019         0.32143, 0.32143, 0.32143,
1020         0.36414, 0.36414, 0.36414,
1021         0.14900, 0.14900, 0.14900,
1022         0.19171, 0.19171, 0.19171,
1023         0.23443, 0.23443, 0.23443,
1024         0.27714, 0.27714, 0.27714,
1025         0.31986, 0.31986, 0.31986,
1026         0.36257, 0.36257, 0.36257,
1027         0.40529, 0.40529, 0.40529,
1028         0.44800, 0.44800, 0.44800,
1029         0.23286, 0.23286, 0.23286,
1030         0.27557, 0.27557, 0.27557,
1031         0.31829, 0.31829, 0.31829,
1032         0.36100, 0.36100, 0.36100,
1033         0.40371, 0.40371, 0.40371,
1034         0.44643, 0.44643, 0.44643,
1035         0.48914, 0.48914, 0.48914,
1036         0.53186, 0.53186, 0.53186,
1037         0.31671, 0.31671, 0.31671,
1038         0.35943, 0.35943, 0.35943,
1039         0.40214, 0.40214, 0.40214,
1040         0.44486, 0.44486, 0.44486,
1041         0.48757, 0.48757, 0.48757,
1042         0.53029, 0.53029, 0.53029,
1043         0.57300, 0.57300, 0.57300,
1044         0.61571, 0.61571, 0.61571,
1045         0.40057, 0.40057, 0.40057,
1046         0.44329, 0.44329, 0.44329,
1047         0.48600, 0.48600, 0.48600,
1048         0.52871, 0.52871, 0.52871,
1049         0.57143, 0.57143, 0.57143,
1050         0.61414, 0.61414, 0.61414,
1051         0.65686, 0.65686, 0.65686,
1052         0.69957, 0.69957, 0.69957,
1053         0.48443, 0.48443, 0.48443,
1054         0.52714, 0.52714, 0.52714,
1055         0.56986, 0.56986, 0.56986,
1056         0.61257, 0.61257, 0.61257,
1057         0.65529, 0.65529, 0.65529,
1058         0.69800, 0.69800, 0.69800,
1059         0.74071, 0.74071, 0.74071,
1060         0.78343, 0.78343, 0.78343,
1061         0.56829, 0.56829, 0.56829,
1062         0.61100, 0.61100, 0.61100,
1063         0.65371, 0.65371, 0.65371,
1064         0.69643, 0.69643, 0.69643,
1065         0.73914, 0.73914, 0.73914,
1066         0.78186, 0.78186, 0.78186,
1067         0.82457, 0.82457, 0.82457,
1068         0.86729, 0.86729, 0.86729,
1069         0.65214, 0.65214, 0.65214,
1070         0.69486, 0.69486, 0.69486,
1071         0.73757, 0.73757, 0.73757,
1072         0.78029, 0.78029, 0.78029,
1073         0.82300, 0.82300, 0.82300,
1074         0.86571, 0.86571, 0.86571,
1075         0.90843, 0.90843, 0.90843,
1076         0.95114, 0.95114, 0.95114,
1077         0.08143, 0.08143, 0.08143,
1078         0.12414, 0.12414, 0.12414,
1079         0.16686, 0.16686, 0.16686,
1080         0.20957, 0.20957, 0.20957,
1081         0.25229, 0.25229, 0.25229,
1082         0.29500, 0.29500, 0.29500,
1083         0.33771, 0.33771, 0.33771,
1084         0.38043, 0.38043, 0.38043,
1085         0.16529, 0.16529, 0.16529,
1086         0.20800, 0.20800, 0.20800,
1087         0.25071, 0.25071, 0.25071,
1088         0.29343, 0.29343, 0.29343,
1089         0.33614, 0.33614, 0.33614,
1090         0.37886, 0.37886, 0.37886,
1091         0.42157, 0.42157, 0.42157,
1092         0.46429, 0.46429, 0.46429,
1093         0.24914, 0.24914, 0.24914,
1094         0.29186, 0.29186, 0.29186,
1095         0.33457, 0.33457, 0.33457,
1096         0.37729, 0.37729, 0.37729,
1097         0.42000, 0.42000, 0.42000,
1098         0.46271, 0.46271, 0.46271,
1099         0.50543, 0.50543, 0.50543,
1100         0.54814, 0.54814, 0.54814,
1101         0.33300, 0.33300, 0.33300,
1102         0.37571, 0.37571, 0.37571,
1103         0.41843, 0.41843, 0.41843,
1104         0.46114, 0.46114, 0.46114,
1105         0.50386, 0.50386, 0.50386,
1106         0.54657, 0.54657, 0.54657,
1107         0.58929, 0.58929, 0.58929,
1108         0.63200, 0.63200, 0.63200,
1109         0.41686, 0.41686, 0.41686,
1110         0.45957, 0.45957, 0.45957,
1111         0.50229, 0.50229, 0.50229,
1112         0.54500, 0.54500, 0.54500,
1113         0.58771, 0.58771, 0.58771,
1114         0.63043, 0.63043, 0.63043,
1115         0.67314, 0.67314, 0.67314,
1116         0.71586, 0.71586, 0.71586,
1117         0.50071, 0.50071, 0.50071,
1118         0.54343, 0.54343, 0.54343,
1119         0.58614, 0.58614, 0.58614,
1120         0.62886, 0.62886, 0.62886,
1121         0.67157, 0.67157, 0.67157,
1122         0.71429, 0.71429, 0.71429,
1123         0.75700, 0.75700, 0.75700,
1124         0.79971, 0.79971, 0.79971,
1125         0.58457, 0.58457, 0.58457,
1126         0.62729, 0.62729, 0.62729,
1127         0.67000, 0.67000, 0.67000,
1128         0.71271, 0.71271, 0.71271,
1129         0.75543, 0.75543, 0.75543,
1130         0.79814, 0.79814, 0.79814,
1131         0.84086, 0.84086, 0.84086,
1132         0.88357, 0.88357, 0.88357,
1133         0.66843, 0.66843, 0.66843,
1134         0.71114, 0.71114, 0.71114,
1135         0.75386, 0.75386, 0.75386,
1136         0.79657, 0.79657, 0.79657,
1137         0.83929, 0.83929, 0.83929,
1138         0.88200, 0.88200, 0.88200,
1139         0.92471, 0.92471, 0.92471,
1140         0.96743, 0.96743, 0.96743,
1141         0.09771, 0.09771, 0.09771,
1142         0.14043, 0.14043, 0.14043,
1143         0.18314, 0.18314, 0.18314,
1144         0.22586, 0.22586, 0.22586,
1145         0.26857, 0.26857, 0.26857,
1146         0.31129, 0.31129, 0.31129,
1147         0.35400, 0.35400, 0.35400,
1148         0.39671, 0.39671, 0.39671,
1149         0.18157, 0.18157, 0.18157,
1150         0.22429, 0.22429, 0.22429,
1151         0.26700, 0.26700, 0.26700,
1152         0.30971, 0.30971, 0.30971,
1153         0.35243, 0.35243, 0.35243,
1154         0.39514, 0.39514, 0.39514,
1155         0.43786, 0.43786, 0.43786,
1156         0.48057, 0.48057, 0.48057,
1157         0.26543, 0.26543, 0.26543,
1158         0.30814, 0.30814, 0.30814,
1159         0.35086, 0.35086, 0.35086,
1160         0.39357, 0.39357, 0.39357,
1161         0.43629, 0.43629, 0.43629,
1162         0.47900, 0.47900, 0.47900,
1163         0.52171, 0.52171, 0.52171,
1164         0.56443, 0.56443, 0.56443,
1165         0.34929, 0.34929, 0.34929,
1166         0.39200, 0.39200, 0.39200,
1167         0.43471, 0.43471, 0.43471,
1168         0.47743, 0.47743, 0.47743,
1169         0.52014, 0.52014, 0.52014,
1170         0.56286, 0.56286, 0.56286,
1171         0.60557, 0.60557, 0.60557,
1172         0.64829, 0.64829, 0.64829,
1173         0.43314, 0.43314, 0.43314,
1174         0.47586, 0.47586, 0.47586,
1175         0.51857, 0.51857, 0.51857,
1176         0.56129, 0.56129, 0.56129,
1177         0.60400, 0.60400, 0.60400,
1178         0.64671, 0.64671, 0.64671,
1179         0.68943, 0.68943, 0.68943,
1180         0.73214, 0.73214, 0.73214,
1181         0.51700, 0.51700, 0.51700,
1182         0.55971, 0.55971, 0.55971,
1183         0.60243, 0.60243, 0.60243,
1184         0.64514, 0.64514, 0.64514,
1185         0.68786, 0.68786, 0.68786,
1186         0.73057, 0.73057, 0.73057,
1187         0.77329, 0.77329, 0.77329,
1188         0.81600, 0.81600, 0.81600,
1189         0.60086, 0.60086, 0.60086,
1190         0.64357, 0.64357, 0.64357,
1191         0.68629, 0.68629, 0.68629,
1192         0.72900, 0.72900, 0.72900,
1193         0.77171, 0.77171, 0.77171,
1194         0.81443, 0.81443, 0.81443,
1195         0.85714, 0.85714, 0.85714,
1196         0.89986, 0.89986, 0.89986,
1197         0.68471, 0.68471, 0.68471,
1198         0.72743, 0.72743, 0.72743,
1199         0.77014, 0.77014, 0.77014,
1200         0.81286, 0.81286, 0.81286,
1201         0.85557, 0.85557, 0.85557,
1202         0.89829, 0.89829, 0.89829,
1203         0.94100, 0.94100, 0.94100,
1204         0.98371, 0.98371, 0.98371,
1205         0.11400, 0.11400, 0.11400,
1206         0.15671, 0.15671, 0.15671,
1207         0.19943, 0.19943, 0.19943,
1208         0.24214, 0.24214, 0.24214,
1209         0.28486, 0.28486, 0.28486,
1210         0.32757, 0.32757, 0.32757,
1211         0.37029, 0.37029, 0.37029,
1212         0.41300, 0.41300, 0.41300,
1213         0.19786, 0.19786, 0.19786,
1214         0.24057, 0.24057, 0.24057,
1215         0.28329, 0.28329, 0.28329,
1216         0.32600, 0.32600, 0.32600,
1217         0.36871, 0.36871, 0.36871,
1218         0.41143, 0.41143, 0.41143,
1219         0.45414, 0.45414, 0.45414,
1220         0.49686, 0.49686, 0.49686,
1221         0.28171, 0.28171, 0.28171,
1222         0.32443, 0.32443, 0.32443,
1223         0.36714, 0.36714, 0.36714,
1224         0.40986, 0.40986, 0.40986,
1225         0.45257, 0.45257, 0.45257,
1226         0.49529, 0.49529, 0.49529,
1227         0.53800, 0.53800, 0.53800,
1228         0.58071, 0.58071, 0.58071,
1229         0.36557, 0.36557, 0.36557,
1230         0.40829, 0.40829, 0.40829,
1231         0.45100, 0.45100, 0.45100,
1232         0.49371, 0.49371, 0.49371,
1233         0.53643, 0.53643, 0.53643,
1234         0.57914, 0.57914, 0.57914,
1235         0.62186, 0.62186, 0.62186,
1236         0.66457, 0.66457, 0.66457,
1237         0.44943, 0.44943, 0.44943,
1238         0.49214, 0.49214, 0.49214,
1239         0.53486, 0.53486, 0.53486,
1240         0.57757, 0.57757, 0.57757,
1241         0.62029, 0.62029, 0.62029,
1242         0.66300, 0.66300, 0.66300,
1243         0.70571, 0.70571, 0.70571,
1244         0.74843, 0.74843, 0.74843,
1245         0.53329, 0.53329, 0.53329,
1246         0.57600, 0.57600, 0.57600,
1247         0.61871, 0.61871, 0.61871,
1248         0.66143, 0.66143, 0.66143,
1249         0.70414, 0.70414, 0.70414,
1250         0.74686, 0.74686, 0.74686,
1251         0.78957, 0.78957, 0.78957,
1252         0.83229, 0.83229, 0.83229,
1253         0.61714, 0.61714, 0.61714,
1254         0.65986, 0.65986, 0.65986,
1255         0.70257, 0.70257, 0.70257,
1256         0.74529, 0.74529, 0.74529,
1257         0.78800, 0.78800, 0.78800,
1258         0.83071, 0.83071, 0.83071,
1259         0.87343, 0.87343, 0.87343,
1260         0.91614, 0.91614, 0.91614,
1261         0.70100, 0.70100, 0.70100,
1262         0.74371, 0.74371, 0.74371,
1263         0.78643, 0.78643, 0.78643,
1264         0.82914, 0.82914, 0.82914,
1265         0.87186, 0.87186, 0.87186,
1266         0.91457, 0.91457, 0.91457,
1267         0.95729, 0.95729, 0.95729,
1268         1.00000, 1.00000, 1.00000
1269     };
1270 
1271     // check cube data
1272     for(unsigned int i = 0; i < looklut->lut3D->lut.size(); ++i) {
1273         OIIO_CHECK_CLOSE(cube[i], looklut->lut3D->lut[i], 1e-4);
1274     }
1275 }
1276 
1277 
OIIO_ADD_TEST(FileFormatIridasLook,fail_on_mask)1278 OIIO_ADD_TEST(FileFormatIridasLook, fail_on_mask)
1279 {
1280     std::ostringstream strebuf;
1281     strebuf << "<?xml version=\"1.0\" ?>" << "\n";
1282     strebuf << "<look>" << "\n";
1283     strebuf << "  <shaders>" << "\n";
1284     strebuf << "    <base>" << "\n";
1285     strebuf << "      <rangeversion>\"2\"</rangeversion>" << "\n";
1286     strebuf << "      <visible>\"1\"</visible>" << "\n";
1287     strebuf << "      <sublayer0>" << "\n";
1288     strebuf << "        <opacity>\"1\"</opacity>" << "\n";
1289     strebuf << "        <parameters>" << "\n";
1290     strebuf << "          <LogPrinterLights>\"N1\"</LogPrinterLights>" << "\n";
1291     strebuf << "        </parameters>" << "\n";
1292     strebuf << "      </sublayer0>" << "\n";
1293     strebuf << "      <sublayer3>" << "\n";
1294     strebuf << "        <opacity>\"1\"</opacity>" << "\n";
1295     strebuf << "        <parameters>" << "\n";
1296     strebuf << "          <gamma.Z>\"0.49967\"</gamma.Z>" << "\n";
1297     strebuf << "          <gain.Z>\"0.28739\"</gain.Z>" << "\n";
1298     strebuf << "          <gamma.Y>\"0.49179\"</gamma.Y>" << "\n";
1299     strebuf << "          <gain.Y>\"0.22243\"</gain.Y>" << "\n";
1300     strebuf << "          <gain.X>\"0.34531\"</gain.X>" << "\n";
1301     strebuf << "          <gamma.X>\"0.39388\"</gamma.X>" << "\n";
1302     strebuf << "        </parameters>" << "\n";
1303     strebuf << "      </sublayer3>" << "\n";
1304     strebuf << "    </base>" << "\n";
1305     strebuf << "  </shaders>" << "\n";
1306     strebuf << "  <mask>" << "\n";
1307     strebuf << "    <name>\"Untitled00_00_00_00\"</name>" << "\n";
1308     strebuf << "    <activecontour>\"0\"</activecontour>" << "\n";
1309     strebuf << "    <width>\"1024\"</width>" << "\n";
1310     strebuf << "    <height>\"778\"</height>" << "\n";
1311     strebuf << "    <contour>" << "\n";
1312     strebuf << "      <positive>\"1\"</positive>" << "\n";
1313     strebuf << "      <point>" << "\n";
1314     strebuf << "        <inner>\"catmull-rom,value:317.5,583.5@0\"</inner>" << "\n";
1315     strebuf << "        <innerprevtangent>\"catmull-rom,value:0,0@0\"</innerprevtangent>" << "\n";
1316     strebuf << "        <innernexttangent>\"catmull-rom,value:0,0@0\"</innernexttangent>" << "\n";
1317     strebuf << "        <falloffexponent>\"catmull-rom,value:1@0\"</falloffexponent>" << "\n";
1318     strebuf << "        <falloffweight>\"catmull-rom,value:0.5@0\"</falloffweight>" << "\n";
1319     strebuf << "        <detached>linear,value:0@0</detached>" << "\n";
1320     strebuf << "        <outer>\"catmull-rom,value:317.5,583.5@0\"</outer>" << "\n";
1321     strebuf << "        <outerprevtangent>\"catmull-rom,value:0,0@0\"</outerprevtangent>" << "\n";
1322     strebuf << "        <outernexttangent>\"catmull-rom,value:0,0@0\"</outernexttangent>" << "\n";
1323     strebuf << "        <spline>\"linear,value:0@0\"</spline>" << "\n";
1324     strebuf << "        <smooth>\"linear,value:0@0\"</smooth>" << "\n";
1325     strebuf << "      </point>" << "\n";
1326     strebuf << "    </contour>" << "\n";
1327     strebuf << "  </mask>" << "\n";
1328     strebuf << "  <LUT>" << "\n";
1329     strebuf << "    <size>\"8\"</size>" << "\n";
1330     strebuf << "    <data>\"" << "\n";
1331     strebuf << "      000000000000000000000000878B933D000000000000000057BC563E00000000" << "\n";
1332     strebuf << "      ...truncated, should never be parsed due to mask section\"" << "\n";
1333     strebuf << "    </data>" << "\n";
1334     strebuf << "  </LUT>" << "\n";
1335     strebuf << "</look>" << "\n";
1336 
1337     std::istringstream infile;
1338     infile.str(strebuf.str());
1339 
1340     // Read file
1341     LocalFileFormat tester;
1342     try
1343     {
1344         CachedFileRcPtr cachedFile = tester.Read(infile);
1345         OIIO_CHECK_ASSERT(false); // Fail test if previous line doesn't throw Exception
1346     }
1347     catch(Exception& e)
1348     {
1349         // Check exception message is correct error (not something
1350         // like "cannot parse LUT data")
1351         std::string expected_error = "Cannot load .look LUT containing mask";
1352         OIIO_CHECK_EQUAL(e.what(), expected_error);
1353     }
1354 
1355 }
1356 #endif // OCIO_UNIT_TEST
1357