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