1 ///////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas
4 // Digital Ltd. LLC
5 //
6 // All rights reserved.
7 //
8 // Redistribution and use in source and binary forms, with or without
9 // modification, are permitted provided that the following conditions are
10 // met:
11 // * Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 // * Redistributions in binary form must reproduce the above
14 // copyright notice, this list of conditions and the following disclaimer
15 // in the documentation and/or other materials provided with the
16 // distribution.
17 // * Neither the name of Industrial Light & Magic nor the names of
18 // its contributors may be used to endorse or promote products derived
19 // from this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 //
33 ///////////////////////////////////////////////////////////////////////////
34
35
36 //-----------------------------------------------------------------------------
37 //
38 // C interface to C++ classes Imf::RgbaOutputFile and Imf::RgbaInputFile
39 //
40 //-----------------------------------------------------------------------------
41
42
43 #include <ImfCRgbaFile.h>
44 #include <ImfRgbaFile.h>
45 #include <ImfTiledRgbaFile.h>
46 #include <ImfIntAttribute.h>
47 #include <ImfFloatAttribute.h>
48 #include <ImfDoubleAttribute.h>
49 #include <ImfStringAttribute.h>
50 #include <ImfBoxAttribute.h>
51 #include <ImfVecAttribute.h>
52 #include <ImfMatrixAttribute.h>
53 #include <ImfChannelList.h>
54 #include <ImfLut.h>
55 #include "half.h"
56 #include <string.h>
57
58 using Imath::Box2i;
59 using Imath::Box2f;
60 using Imath::V2i;
61 using Imath::V2f;
62 using Imath::V3i;
63 using Imath::V3f;
64 using Imath::M33f;
65 using Imath::M44f;
66
67
68 namespace {
69
70
71 const int MAX_ERR_LENGTH = 1024;
72 char errorMessage[MAX_ERR_LENGTH];
73
74
75 void
setErrorMessage(const std::exception & e)76 setErrorMessage (const std::exception &e)
77 {
78 strncpy (errorMessage, e.what(), MAX_ERR_LENGTH - 1);
79 errorMessage[MAX_ERR_LENGTH - 1] = 0;
80 }
81
82
83 inline Imf::Header *
header(ImfHeader * hdr)84 header (ImfHeader *hdr)
85 {
86 return (Imf::Header *)(hdr);
87 }
88
89
90 inline const Imf::Header *
header(const ImfHeader * hdr)91 header (const ImfHeader *hdr)
92 {
93 return (const Imf::Header *)(hdr);
94 }
95
96
97 inline Imf::RgbaOutputFile *
outfile(ImfOutputFile * out)98 outfile (ImfOutputFile *out)
99 {
100 return (Imf::RgbaOutputFile *) out;
101 }
102
103
104 inline const Imf::RgbaOutputFile *
outfile(const ImfOutputFile * out)105 outfile (const ImfOutputFile *out)
106 {
107 return (const Imf::RgbaOutputFile *) out;
108 }
109
110
111 inline Imf::TiledRgbaOutputFile *
outfile(ImfTiledOutputFile * out)112 outfile (ImfTiledOutputFile *out)
113 {
114 return (Imf::TiledRgbaOutputFile *) out;
115 }
116
117
118 inline const Imf::TiledRgbaOutputFile *
outfile(const ImfTiledOutputFile * out)119 outfile (const ImfTiledOutputFile *out)
120 {
121 return (const Imf::TiledRgbaOutputFile *) out;
122 }
123
124
125 inline Imf::RgbaInputFile *
infile(ImfInputFile * in)126 infile (ImfInputFile *in)
127 {
128 return (Imf::RgbaInputFile *) in;
129 }
130
131
132 inline const Imf::RgbaInputFile *
infile(const ImfInputFile * in)133 infile (const ImfInputFile *in)
134 {
135 return (const Imf::RgbaInputFile *) in;
136 }
137
138
139 inline Imf::TiledRgbaInputFile *
infile(ImfTiledInputFile * in)140 infile (ImfTiledInputFile *in)
141 {
142 return (Imf::TiledRgbaInputFile *) in;
143 }
144
145
146 inline const Imf::TiledRgbaInputFile *
infile(const ImfTiledInputFile * in)147 infile (const ImfTiledInputFile *in)
148 {
149 return (const Imf::TiledRgbaInputFile *) in;
150 }
151
152
153 } // namespace
154
155
156 void
ImfFloatToHalf(float f,ImfHalf * h)157 ImfFloatToHalf (float f, ImfHalf *h)
158 {
159 *h = half(f).bits();
160 }
161
162
163 void
ImfFloatToHalfArray(int n,const float f[],ImfHalf h[])164 ImfFloatToHalfArray (int n, const float f[/*n*/], ImfHalf h[/*n*/])
165 {
166 for (int i = 0; i < n; ++i)
167 h[i] = half(f[i]).bits();
168 }
169
170
171 float
ImfHalfToFloat(ImfHalf h)172 ImfHalfToFloat (ImfHalf h)
173 {
174 return float (*((half *)&h));
175 }
176
177
178 void
ImfHalfToFloatArray(int n,const ImfHalf h[],float f[])179 ImfHalfToFloatArray (int n, const ImfHalf h[/*n*/], float f[/*n*/])
180 {
181 for (int i = 0; i < n; ++i)
182 f[i] = float (*((half *)(h + i)));
183 }
184
185
186 ImfHeader *
ImfNewHeader(void)187 ImfNewHeader (void)
188 {
189 try
190 {
191 return (ImfHeader *) new Imf::Header;
192 }
193 catch (const std::exception &e)
194 {
195 setErrorMessage (e);
196 return 0;
197 }
198 }
199
200
201 void
ImfDeleteHeader(ImfHeader * hdr)202 ImfDeleteHeader (ImfHeader *hdr)
203 {
204 delete header (hdr);
205 }
206
207
208 ImfHeader *
ImfCopyHeader(const ImfHeader * hdr)209 ImfCopyHeader (const ImfHeader *hdr)
210 {
211 try
212 {
213 return (ImfHeader *) new Imf::Header (*header (hdr));
214 }
215 catch (const std::exception &e)
216 {
217 setErrorMessage (e);
218 return 0;
219 }
220 }
221
222
223 void
ImfHeaderSetDisplayWindow(ImfHeader * hdr,int xMin,int yMin,int xMax,int yMax)224 ImfHeaderSetDisplayWindow (ImfHeader *hdr,
225 int xMin, int yMin,
226 int xMax, int yMax)
227 {
228 header(hdr)->displayWindow() = Box2i (V2i (xMin, yMin), V2i (xMax, yMax));
229 }
230
231
232 void
ImfHeaderDisplayWindow(const ImfHeader * hdr,int * xMin,int * yMin,int * xMax,int * yMax)233 ImfHeaderDisplayWindow (const ImfHeader *hdr,
234 int *xMin, int *yMin,
235 int *xMax, int *yMax)
236 {
237 const Box2i dw = header(hdr)->displayWindow();
238 *xMin = dw.min.x;
239 *yMin = dw.min.y;
240 *xMax = dw.max.x;
241 *yMax = dw.max.y;
242 }
243
244
245 void
ImfHeaderSetDataWindow(ImfHeader * hdr,int xMin,int yMin,int xMax,int yMax)246 ImfHeaderSetDataWindow (ImfHeader *hdr,
247 int xMin, int yMin,
248 int xMax, int yMax)
249 {
250 header(hdr)->dataWindow() = Box2i (V2i (xMin, yMin), V2i (xMax, yMax));
251 }
252
253
254 void
ImfHeaderDataWindow(const ImfHeader * hdr,int * xMin,int * yMin,int * xMax,int * yMax)255 ImfHeaderDataWindow (const ImfHeader *hdr,
256 int *xMin, int *yMin,
257 int *xMax, int *yMax)
258 {
259 const Box2i dw = header(hdr)->dataWindow();
260 *xMin = dw.min.x;
261 *yMin = dw.min.y;
262 *xMax = dw.max.x;
263 *yMax = dw.max.y;
264 }
265
266
267 void
ImfHeaderSetPixelAspectRatio(ImfHeader * hdr,float pixelAspectRatio)268 ImfHeaderSetPixelAspectRatio (ImfHeader *hdr, float pixelAspectRatio)
269 {
270 header(hdr)->pixelAspectRatio() = pixelAspectRatio;
271 }
272
273
274 float
ImfHeaderPixelAspectRatio(const ImfHeader * hdr)275 ImfHeaderPixelAspectRatio (const ImfHeader *hdr)
276 {
277 return header(hdr)->pixelAspectRatio();
278 }
279
280
281 void
ImfHeaderSetScreenWindowCenter(ImfHeader * hdr,float x,float y)282 ImfHeaderSetScreenWindowCenter (ImfHeader *hdr, float x, float y)
283 {
284 header(hdr)->screenWindowCenter() = V2f (x, y);
285 }
286
287
288 void
ImfHeaderScreenWindowCenter(const ImfHeader * hdr,float * x,float * y)289 ImfHeaderScreenWindowCenter (const ImfHeader *hdr, float *x, float *y)
290 {
291 const V2i &swc = header(hdr)->screenWindowCenter();
292 *x = swc.x;
293 *y = swc.y;
294 }
295
296
297 void
ImfHeaderSetScreenWindowWidth(ImfHeader * hdr,float width)298 ImfHeaderSetScreenWindowWidth (ImfHeader *hdr, float width)
299 {
300 header(hdr)->screenWindowWidth() = width;
301 }
302
303
304 float
ImfHeaderScreenWindowWidth(const ImfHeader * hdr)305 ImfHeaderScreenWindowWidth (const ImfHeader *hdr)
306 {
307 return header(hdr)->screenWindowWidth();
308 }
309
310
311 void
ImfHeaderSetLineOrder(ImfHeader * hdr,int lineOrder)312 ImfHeaderSetLineOrder (ImfHeader *hdr, int lineOrder)
313 {
314 header(hdr)->lineOrder() = Imf::LineOrder (lineOrder);
315 }
316
317
318 int
ImfHeaderLineOrder(const ImfHeader * hdr)319 ImfHeaderLineOrder (const ImfHeader *hdr)
320 {
321 return header(hdr)->lineOrder();
322 }
323
324
325 void
ImfHeaderSetCompression(ImfHeader * hdr,int compression)326 ImfHeaderSetCompression (ImfHeader *hdr, int compression)
327 {
328 header(hdr)->compression() = Imf::Compression (compression);
329 }
330
331
332 int
ImfHeaderCompression(const ImfHeader * hdr)333 ImfHeaderCompression (const ImfHeader *hdr)
334 {
335 return header(hdr)->compression();
336 }
337
338
339 int
ImfHeaderSetIntAttribute(ImfHeader * hdr,const char name[],int value)340 ImfHeaderSetIntAttribute (ImfHeader *hdr, const char name[], int value)
341 {
342 try
343 {
344 if (header(hdr)->find(name) == header(hdr)->end())
345 {
346 header(hdr)->insert (name, Imf::IntAttribute (value));
347 }
348 else
349 {
350 header(hdr)->typedAttribute<Imf::IntAttribute>(name).value() =
351 value;
352 }
353
354 return 1;
355 }
356 catch (const std::exception &e)
357 {
358 setErrorMessage (e);
359 return 0;
360 }
361 }
362
363
364 int
ImfHeaderIntAttribute(const ImfHeader * hdr,const char name[],int * value)365 ImfHeaderIntAttribute (const ImfHeader *hdr, const char name[], int *value)
366 {
367 try
368 {
369 *value = header(hdr)->typedAttribute<Imf::IntAttribute>(name).value();
370 return 1;
371 }
372 catch (const std::exception &e)
373 {
374 setErrorMessage (e);
375 return 0;
376 }
377 }
378
379
380 int
ImfHeaderSetFloatAttribute(ImfHeader * hdr,const char name[],float value)381 ImfHeaderSetFloatAttribute (ImfHeader *hdr, const char name[], float value)
382 {
383 try
384 {
385 if (header(hdr)->find(name) == header(hdr)->end())
386 {
387 header(hdr)->insert (name, Imf::FloatAttribute (value));
388 }
389 else
390 {
391 header(hdr)->typedAttribute<Imf::FloatAttribute>(name).value() =
392 value;
393 }
394
395 return 1;
396 }
397 catch (const std::exception &e)
398 {
399 setErrorMessage (e);
400 return 0;
401 }
402 }
403
404
405 int
ImfHeaderSetDoubleAttribute(ImfHeader * hdr,const char name[],double value)406 ImfHeaderSetDoubleAttribute (ImfHeader *hdr, const char name[], double value)
407 {
408 try
409 {
410 if (header(hdr)->find(name) == header(hdr)->end())
411 {
412 header(hdr)->insert (name, Imf::DoubleAttribute (value));
413 }
414 else
415 {
416 header(hdr)->typedAttribute<Imf::DoubleAttribute>(name).value() =
417 value;
418 }
419
420 return 1;
421 }
422 catch (const std::exception &e)
423 {
424 setErrorMessage (e);
425 return 0;
426 }
427 }
428
429
430 int
ImfHeaderFloatAttribute(const ImfHeader * hdr,const char name[],float * value)431 ImfHeaderFloatAttribute (const ImfHeader *hdr, const char name[], float *value)
432 {
433 try
434 {
435 *value = header(hdr)->typedAttribute<Imf::FloatAttribute>(name).value();
436 return 1;
437 }
438 catch (const std::exception &e)
439 {
440 setErrorMessage (e);
441 return 0;
442 }
443 }
444
445
446 int
ImfHeaderDoubleAttribute(const ImfHeader * hdr,const char name[],double * value)447 ImfHeaderDoubleAttribute (const ImfHeader *hdr,
448 const char name[],
449 double *value)
450 {
451 try
452 {
453 *value = header(hdr)->
454 typedAttribute<Imf::DoubleAttribute>(name).value();
455
456 return 1;
457 }
458 catch (const std::exception &e)
459 {
460 setErrorMessage (e);
461 return 0;
462 }
463 }
464
465
466 int
ImfHeaderSetStringAttribute(ImfHeader * hdr,const char name[],const char value[])467 ImfHeaderSetStringAttribute (ImfHeader *hdr,
468 const char name[],
469 const char value[])
470 {
471 try
472 {
473 if (header(hdr)->find(name) == header(hdr)->end())
474 {
475 header(hdr)->insert (name, Imf::StringAttribute (value));
476 }
477 else
478 {
479 header(hdr)->typedAttribute<Imf::StringAttribute>(name).value() =
480 value;
481 }
482
483 return 1;
484 }
485 catch (const std::exception &e)
486 {
487 setErrorMessage (e);
488 return 0;
489 }
490 }
491
492
493 int
ImfHeaderStringAttribute(const ImfHeader * hdr,const char name[],const char ** value)494 ImfHeaderStringAttribute (const ImfHeader *hdr,
495 const char name[],
496 const char **value)
497 {
498 try
499 {
500 *value = header(hdr)->
501 typedAttribute<Imf::StringAttribute>(name).value().c_str();
502
503 return 1;
504 }
505 catch (const std::exception &e)
506 {
507 setErrorMessage (e);
508 return 0;
509 }
510 }
511
512
513 int
ImfHeaderSetBox2iAttribute(ImfHeader * hdr,const char name[],int xMin,int yMin,int xMax,int yMax)514 ImfHeaderSetBox2iAttribute (ImfHeader *hdr,
515 const char name[],
516 int xMin, int yMin,
517 int xMax, int yMax)
518 {
519 try
520 {
521 Box2i box (V2i (xMin, yMin), V2i (xMax, yMax));
522
523 if (header(hdr)->find(name) == header(hdr)->end())
524 {
525 header(hdr)->insert (name, Imf::Box2iAttribute (box));
526 }
527 else
528 {
529 header(hdr)->typedAttribute<Imf::Box2iAttribute>(name).value() =
530 box;
531 }
532
533 return 1;
534 }
535 catch (const std::exception &e)
536 {
537 setErrorMessage (e);
538 return 0;
539 }
540 }
541
542
543 int
ImfHeaderBox2iAttribute(const ImfHeader * hdr,const char name[],int * xMin,int * yMin,int * xMax,int * yMax)544 ImfHeaderBox2iAttribute (const ImfHeader *hdr,
545 const char name[],
546 int *xMin, int *yMin,
547 int *xMax, int *yMax)
548 {
549 try
550 {
551 const Box2i &box =
552 header(hdr)->typedAttribute<Imf::Box2iAttribute>(name).value();
553
554 *xMin = box.min.x;
555 *yMin = box.min.y;
556 *xMax = box.max.x;
557 *yMax = box.max.y;
558
559 return 1;
560 }
561 catch (const std::exception &e)
562 {
563 setErrorMessage (e);
564 return 0;
565 }
566 }
567
568
569 int
ImfHeaderSetBox2fAttribute(ImfHeader * hdr,const char name[],float xMin,float yMin,float xMax,float yMax)570 ImfHeaderSetBox2fAttribute (ImfHeader *hdr,
571 const char name[],
572 float xMin, float yMin,
573 float xMax, float yMax)
574 {
575 try
576 {
577 Box2f box (V2f (xMin, yMin), V2f (xMax, yMax));
578
579 if (header(hdr)->find(name) == header(hdr)->end())
580 {
581 header(hdr)->insert (name, Imf::Box2fAttribute (box));
582 }
583 else
584 {
585 header(hdr)->typedAttribute<Imf::Box2fAttribute>(name).value() =
586 box;
587 }
588
589 return 1;
590 }
591 catch (const std::exception &e)
592 {
593 setErrorMessage (e);
594 return 0;
595 }
596 }
597
598
599 int
ImfHeaderBox2fAttribute(const ImfHeader * hdr,const char name[],float * xMin,float * yMin,float * xMax,float * yMax)600 ImfHeaderBox2fAttribute (const ImfHeader *hdr,
601 const char name[],
602 float *xMin, float *yMin,
603 float *xMax, float *yMax)
604 {
605 try
606 {
607 const Box2f &box =
608 header(hdr)->typedAttribute<Imf::Box2fAttribute>(name).value();
609
610 *xMin = box.min.x;
611 *yMin = box.min.y;
612 *xMax = box.max.x;
613 *yMax = box.max.y;
614
615 return 1;
616 }
617 catch (const std::exception &e)
618 {
619 setErrorMessage (e);
620 return 0;
621 }
622 }
623
624
625 int
ImfHeaderSetV2iAttribute(ImfHeader * hdr,const char name[],int x,int y)626 ImfHeaderSetV2iAttribute (ImfHeader *hdr,
627 const char name[],
628 int x, int y)
629 {
630 try
631 {
632 V2i v (x, y);
633
634 if (header(hdr)->find(name) == header(hdr)->end())
635 header(hdr)->insert (name, Imf::V2iAttribute (v));
636 else
637 header(hdr)->typedAttribute<Imf::V2iAttribute>(name).value() = v;
638
639 return 1;
640 }
641 catch (const std::exception &e)
642 {
643 setErrorMessage (e);
644 return 0;
645 }
646 }
647
648
649 int
ImfHeaderV2iAttribute(const ImfHeader * hdr,const char name[],int * x,int * y)650 ImfHeaderV2iAttribute (const ImfHeader *hdr,
651 const char name[],
652 int *x, int *y)
653 {
654 try
655 {
656 const V2i &v =
657 header(hdr)->typedAttribute<Imf::V2iAttribute>(name).value();
658
659 *x = v.x;
660 *y = v.y;
661
662 return 1;
663 }
664 catch (const std::exception &e)
665 {
666 setErrorMessage (e);
667 return 0;
668 }
669 }
670
671
672 int
ImfHeaderSetV2fAttribute(ImfHeader * hdr,const char name[],float x,float y)673 ImfHeaderSetV2fAttribute (ImfHeader *hdr,
674 const char name[],
675 float x, float y)
676 {
677 try
678 {
679 V2f v (x, y);
680
681 if (header(hdr)->find(name) == header(hdr)->end())
682 header(hdr)->insert (name, Imf::V2fAttribute (v));
683 else
684 header(hdr)->typedAttribute<Imf::V2fAttribute>(name).value() = v;
685
686 return 1;
687 }
688 catch (const std::exception &e)
689 {
690 setErrorMessage (e);
691 return 0;
692 }
693 }
694
695
696 int
ImfHeaderV2fAttribute(const ImfHeader * hdr,const char name[],float * x,float * y)697 ImfHeaderV2fAttribute (const ImfHeader *hdr,
698 const char name[],
699 float *x, float *y)
700 {
701 try
702 {
703 const V2f &v =
704 header(hdr)->typedAttribute<Imf::V2fAttribute>(name).value();
705
706 *x = v.x;
707 *y = v.y;
708
709 return 1;
710 }
711 catch (const std::exception &e)
712 {
713 setErrorMessage (e);
714 return 0;
715 }
716 }
717
718
719 int
ImfHeaderSetV3iAttribute(ImfHeader * hdr,const char name[],int x,int y,int z)720 ImfHeaderSetV3iAttribute (ImfHeader *hdr,
721 const char name[],
722 int x, int y, int z)
723 {
724 try
725 {
726 V3i v (x, y, z);
727
728 if (header(hdr)->find(name) == header(hdr)->end())
729 header(hdr)->insert (name, Imf::V3iAttribute (v));
730 else
731 header(hdr)->typedAttribute<Imf::V3iAttribute>(name).value() = v;
732
733 return 1;
734 }
735 catch (const std::exception &e)
736 {
737 setErrorMessage (e);
738 return 0;
739 }
740 }
741
742
743 int
ImfHeaderV3iAttribute(const ImfHeader * hdr,const char name[],int * x,int * y,int * z)744 ImfHeaderV3iAttribute (const ImfHeader *hdr,
745 const char name[],
746 int *x, int *y, int *z)
747 {
748 try
749 {
750 const V3i &v =
751 header(hdr)->typedAttribute<Imf::V3iAttribute>(name).value();
752
753 *x = v.x;
754 *y = v.y;
755 *z = v.z;
756
757 return 1;
758 }
759 catch (const std::exception &e)
760 {
761 setErrorMessage (e);
762 return 0;
763 }
764 }
765
766
767 int
ImfHeaderSetV3fAttribute(ImfHeader * hdr,const char name[],float x,float y,float z)768 ImfHeaderSetV3fAttribute (ImfHeader *hdr,
769 const char name[],
770 float x, float y, float z)
771 {
772 try
773 {
774 V3f v (x, y, z);
775
776 if (header(hdr)->find(name) == header(hdr)->end())
777 header(hdr)->insert (name, Imf::V3fAttribute (v));
778 else
779 header(hdr)->typedAttribute<Imf::V3fAttribute>(name).value() = v;
780
781 return 1;
782 }
783 catch (const std::exception &e)
784 {
785 setErrorMessage (e);
786 return 0;
787 }
788 }
789
790
791 int
ImfHeaderV3fAttribute(const ImfHeader * hdr,const char name[],float * x,float * y,float * z)792 ImfHeaderV3fAttribute (const ImfHeader *hdr,
793 const char name[],
794 float *x, float *y, float *z)
795 {
796 try
797 {
798 const V3f &v =
799 header(hdr)->typedAttribute<Imf::V3fAttribute>(name).value();
800
801 *x = v.x;
802 *y = v.y;
803 *z = v.z;
804
805 return 1;
806 }
807 catch (const std::exception &e)
808 {
809 setErrorMessage (e);
810 return 0;
811 }
812 }
813
814
815 int
ImfHeaderSetM33fAttribute(ImfHeader * hdr,const char name[],const float m[3][3])816 ImfHeaderSetM33fAttribute (ImfHeader *hdr,
817 const char name[],
818 const float m[3][3])
819 {
820 try
821 {
822 M33f m3 (m);
823
824 if (header(hdr)->find(name) == header(hdr)->end())
825 header(hdr)->insert (name, Imf::M33fAttribute (m3));
826 else
827 header(hdr)->typedAttribute<Imf::M33fAttribute>(name).value() = m3;
828
829 return 1;
830 }
831 catch (const std::exception &e)
832 {
833 setErrorMessage (e);
834 return 0;
835 }
836 }
837
838
839 int
ImfHeaderM33fAttribute(const ImfHeader * hdr,const char name[],float m[3][3])840 ImfHeaderM33fAttribute (const ImfHeader *hdr,
841 const char name[],
842 float m[3][3])
843 {
844 try
845 {
846 const M33f &m3 =
847 header(hdr)->typedAttribute<Imf::M33fAttribute>(name).value();
848
849 m[0][0] = m3[0][0];
850 m[0][1] = m3[0][1];
851 m[0][2] = m3[0][2];
852
853 m[1][0] = m3[1][0];
854 m[1][1] = m3[1][1];
855 m[1][2] = m3[1][2];
856
857 m[2][0] = m3[2][0];
858 m[2][1] = m3[2][1];
859 m[2][2] = m3[2][2];
860
861 return 1;
862 }
863 catch (const std::exception &e)
864 {
865 setErrorMessage (e);
866 return 0;
867 }
868 }
869
870
871 int
ImfHeaderSetM44fAttribute(ImfHeader * hdr,const char name[],const float m[4][4])872 ImfHeaderSetM44fAttribute (ImfHeader *hdr,
873 const char name[],
874 const float m[4][4])
875 {
876 try
877 {
878 M44f m4 (m);
879
880 if (header(hdr)->find(name) == header(hdr)->end())
881 header(hdr)->insert (name, Imf::M44fAttribute (m4));
882 else
883 header(hdr)->typedAttribute<Imf::M44fAttribute>(name).value() = m4;
884
885 return 1;
886 }
887 catch (const std::exception &e)
888 {
889 setErrorMessage (e);
890 return 0;
891 }
892 }
893
894
895 int
ImfHeaderM44fAttribute(const ImfHeader * hdr,const char name[],float m[4][4])896 ImfHeaderM44fAttribute (const ImfHeader *hdr,
897 const char name[],
898 float m[4][4])
899 {
900 try
901 {
902 const M44f &m4 =
903 header(hdr)->typedAttribute<Imf::M44fAttribute>(name).value();
904
905 m[0][0] = m4[0][0];
906 m[0][1] = m4[0][1];
907 m[0][2] = m4[0][2];
908 m[0][3] = m4[0][3];
909
910 m[1][0] = m4[1][0];
911 m[1][1] = m4[1][1];
912 m[1][2] = m4[1][2];
913 m[1][3] = m4[1][3];
914
915 m[2][0] = m4[2][0];
916 m[2][1] = m4[2][1];
917 m[2][2] = m4[2][2];
918 m[2][3] = m4[2][3];
919
920 m[3][0] = m4[3][0];
921 m[3][1] = m4[3][1];
922 m[3][2] = m4[3][2];
923 m[3][3] = m4[3][3];
924
925 return 1;
926 }
927 catch (const std::exception &e)
928 {
929 setErrorMessage (e);
930 return 0;
931 }
932 }
933
934
935 ImfOutputFile *
ImfOpenOutputFile(const char name[],const ImfHeader * hdr,int channels)936 ImfOpenOutputFile (const char name[], const ImfHeader *hdr, int channels)
937 {
938 try
939 {
940 return (ImfOutputFile *) new Imf::RgbaOutputFile
941 (name, *header(hdr), Imf::RgbaChannels (channels));
942 }
943 catch (const std::exception &e)
944 {
945 setErrorMessage (e);
946 return 0;
947 }
948 }
949
950
951 int
ImfCloseOutputFile(ImfOutputFile * out)952 ImfCloseOutputFile (ImfOutputFile *out)
953 {
954 try
955 {
956 delete outfile (out);
957 return 1;
958 }
959 catch (const std::exception &e)
960 {
961 setErrorMessage (e);
962 return 0;
963 }
964 }
965
966
967 int
ImfOutputSetFrameBuffer(ImfOutputFile * out,const ImfRgba * base,size_t xStride,size_t yStride)968 ImfOutputSetFrameBuffer (ImfOutputFile *out,
969 const ImfRgba *base,
970 size_t xStride,
971 size_t yStride)
972 {
973 try
974 {
975 outfile(out)->setFrameBuffer ((Imf::Rgba *)base, xStride, yStride);
976 return 1;
977 }
978 catch (const std::exception &e)
979 {
980 setErrorMessage (e);
981 return 0;
982 }
983 }
984
985
986 int
ImfOutputWritePixels(ImfOutputFile * out,int numScanLines)987 ImfOutputWritePixels (ImfOutputFile *out, int numScanLines)
988 {
989 try
990 {
991 outfile(out)->writePixels (numScanLines);
992 return 1;
993 }
994 catch (const std::exception &e)
995 {
996 setErrorMessage (e);
997 return 0;
998 }
999 }
1000
1001
1002 int
ImfOutputCurrentScanLine(const ImfOutputFile * out)1003 ImfOutputCurrentScanLine (const ImfOutputFile *out)
1004 {
1005 return outfile(out)->currentScanLine();
1006 }
1007
1008
1009 const ImfHeader *
ImfOutputHeader(const ImfOutputFile * out)1010 ImfOutputHeader (const ImfOutputFile *out)
1011 {
1012 return (const ImfHeader *) &outfile(out)->header();
1013 }
1014
1015
1016 int
ImfOutputChannels(const ImfOutputFile * out)1017 ImfOutputChannels (const ImfOutputFile *out)
1018 {
1019 return outfile(out)->channels();
1020 }
1021
1022
1023 ImfTiledOutputFile *
ImfOpenTiledOutputFile(const char name[],const ImfHeader * hdr,int channels,int xSize,int ySize,int mode,int rmode)1024 ImfOpenTiledOutputFile (const char name[],
1025 const ImfHeader *hdr,
1026 int channels,
1027 int xSize, int ySize,
1028 int mode, int rmode)
1029 {
1030 try
1031 {
1032 return (ImfTiledOutputFile *) new Imf::TiledRgbaOutputFile
1033 (name, *header(hdr),
1034 Imf::RgbaChannels (channels),
1035 xSize, ySize,
1036 Imf::LevelMode (mode),
1037 Imf::LevelRoundingMode (rmode));
1038 }
1039 catch (const std::exception &e)
1040 {
1041 setErrorMessage (e);
1042 return 0;
1043 }
1044 }
1045
1046
1047 int
ImfCloseTiledOutputFile(ImfTiledOutputFile * out)1048 ImfCloseTiledOutputFile (ImfTiledOutputFile *out)
1049 {
1050 try
1051 {
1052 delete outfile (out);
1053 return 1;
1054 }
1055 catch (const std::exception &e)
1056 {
1057 setErrorMessage (e);
1058 return 0;
1059 }
1060 }
1061
1062
1063 int
ImfTiledOutputSetFrameBuffer(ImfTiledOutputFile * out,const ImfRgba * base,size_t xStride,size_t yStride)1064 ImfTiledOutputSetFrameBuffer (ImfTiledOutputFile *out,
1065 const ImfRgba *base,
1066 size_t xStride,
1067 size_t yStride)
1068 {
1069 try
1070 {
1071 outfile(out)->setFrameBuffer ((Imf::Rgba *)base, xStride, yStride);
1072 return 1;
1073 }
1074 catch (const std::exception &e)
1075 {
1076 setErrorMessage (e);
1077 return 0;
1078 }
1079 }
1080
1081
1082 int
ImfTiledOutputWriteTile(ImfTiledOutputFile * out,int dx,int dy,int lx,int ly)1083 ImfTiledOutputWriteTile (ImfTiledOutputFile *out,
1084 int dx, int dy,
1085 int lx, int ly)
1086 {
1087 try
1088 {
1089 outfile(out)->writeTile (dx, dy, lx, ly);
1090 return 1;
1091 }
1092 catch (const std::exception &e)
1093 {
1094 setErrorMessage (e);
1095 return 0;
1096 }
1097 }
1098
1099
1100 int
ImfTiledOutputWriteTiles(ImfTiledOutputFile * out,int dxMin,int dxMax,int dyMin,int dyMax,int lx,int ly)1101 ImfTiledOutputWriteTiles (ImfTiledOutputFile *out,
1102 int dxMin, int dxMax,
1103 int dyMin, int dyMax,
1104 int lx, int ly)
1105 {
1106 try
1107 {
1108 outfile(out)->writeTiles (dxMin, dxMax, dyMin, dyMax, lx, ly);
1109 return 1;
1110 }
1111 catch (const std::exception &e)
1112 {
1113 setErrorMessage (e);
1114 return 0;
1115 }
1116 }
1117
1118
1119 const ImfHeader *
ImfTiledOutputHeader(const ImfTiledOutputFile * out)1120 ImfTiledOutputHeader (const ImfTiledOutputFile *out)
1121 {
1122 return (const ImfHeader *) &outfile(out)->header();
1123 }
1124
1125
1126 int
ImfTiledOutputChannels(const ImfTiledOutputFile * out)1127 ImfTiledOutputChannels (const ImfTiledOutputFile *out)
1128 {
1129 return outfile(out)->channels();
1130 }
1131
1132
1133 int
ImfTiledOutputTileXSize(const ImfTiledOutputFile * out)1134 ImfTiledOutputTileXSize (const ImfTiledOutputFile *out)
1135 {
1136 return outfile(out)->tileXSize();
1137 }
1138
1139
1140 int
ImfTiledOutputTileYSize(const ImfTiledOutputFile * out)1141 ImfTiledOutputTileYSize (const ImfTiledOutputFile *out)
1142 {
1143 return outfile(out)->tileYSize();
1144 }
1145
1146
1147 int
ImfTiledOutputLevelMode(const ImfTiledOutputFile * out)1148 ImfTiledOutputLevelMode (const ImfTiledOutputFile *out)
1149 {
1150 return outfile(out)->levelMode();
1151 }
1152
1153
1154 int
ImfTiledOutputLevelRoundingMode(const ImfTiledOutputFile * out)1155 ImfTiledOutputLevelRoundingMode (const ImfTiledOutputFile *out)
1156 {
1157 return outfile(out)->levelRoundingMode();
1158 }
1159
1160
1161 ImfInputFile *
ImfOpenInputFile(const char name[])1162 ImfOpenInputFile (const char name[])
1163 {
1164 try
1165 {
1166 return (ImfInputFile *) new Imf::RgbaInputFile (name);
1167 }
1168 catch (const std::exception &e)
1169 {
1170 setErrorMessage (e);
1171 return 0;
1172 }
1173 }
1174
1175
1176 int
ImfCloseInputFile(ImfInputFile * in)1177 ImfCloseInputFile (ImfInputFile *in)
1178 {
1179 try
1180 {
1181 delete infile (in);
1182 return 1;
1183 }
1184 catch (const std::exception &e)
1185 {
1186 setErrorMessage (e);
1187 return 0;
1188 }
1189 }
1190
1191
1192 int
ImfInputSetFrameBuffer(ImfInputFile * in,ImfRgba * base,size_t xStride,size_t yStride)1193 ImfInputSetFrameBuffer (ImfInputFile *in,
1194 ImfRgba *base,
1195 size_t xStride,
1196 size_t yStride)
1197 {
1198 try
1199 {
1200 infile(in)->setFrameBuffer ((Imf::Rgba *) base, xStride, yStride);
1201 return 1;
1202 }
1203 catch (const std::exception &e)
1204 {
1205 setErrorMessage (e);
1206 return 0;
1207 }
1208 }
1209
1210
1211 int
ImfInputReadPixels(ImfInputFile * in,int scanLine1,int scanLine2)1212 ImfInputReadPixels (ImfInputFile *in, int scanLine1, int scanLine2)
1213 {
1214 try
1215 {
1216 infile(in)->readPixels (scanLine1, scanLine2);
1217 return 1;
1218 }
1219 catch (const std::exception &e)
1220 {
1221 setErrorMessage (e);
1222 return 0;
1223 }
1224 }
1225
1226
1227 const ImfHeader *
ImfInputHeader(const ImfInputFile * in)1228 ImfInputHeader (const ImfInputFile *in)
1229 {
1230 return (const ImfHeader *) &infile(in)->header();
1231 }
1232
1233
1234 int
ImfInputChannels(const ImfInputFile * in)1235 ImfInputChannels (const ImfInputFile *in)
1236 {
1237 return infile(in)->channels();
1238 }
1239
1240
1241 const char *
ImfInputFileName(const ImfInputFile * in)1242 ImfInputFileName (const ImfInputFile *in)
1243 {
1244 return infile(in)->fileName();
1245 }
1246
1247
1248 ImfTiledInputFile *
ImfOpenTiledInputFile(const char name[])1249 ImfOpenTiledInputFile (const char name[])
1250 {
1251 try
1252 {
1253 return (ImfTiledInputFile *) new Imf::TiledRgbaInputFile (name);
1254 }
1255 catch (const std::exception &e)
1256 {
1257 setErrorMessage (e);
1258 return 0;
1259 }
1260 }
1261
1262
1263 int
ImfCloseTiledInputFile(ImfTiledInputFile * in)1264 ImfCloseTiledInputFile (ImfTiledInputFile *in)
1265 {
1266 try
1267 {
1268 delete infile (in);
1269 return 1;
1270 }
1271 catch (const std::exception &e)
1272 {
1273 setErrorMessage (e);
1274 return 0;
1275 }
1276 }
1277
1278
1279 int
ImfTiledInputSetFrameBuffer(ImfTiledInputFile * in,ImfRgba * base,size_t xStride,size_t yStride)1280 ImfTiledInputSetFrameBuffer (ImfTiledInputFile *in,
1281 ImfRgba *base,
1282 size_t xStride,
1283 size_t yStride)
1284 {
1285 try
1286 {
1287 infile(in)->setFrameBuffer ((Imf::Rgba *) base, xStride, yStride);
1288 return 1;
1289 }
1290 catch (const std::exception &e)
1291 {
1292 setErrorMessage (e);
1293 return 0;
1294 }
1295 }
1296
1297
1298 int
ImfTiledInputReadTile(ImfTiledInputFile * in,int dx,int dy,int lx,int ly)1299 ImfTiledInputReadTile (ImfTiledInputFile *in,
1300 int dx, int dy,
1301 int lx, int ly)
1302 {
1303 try
1304 {
1305 infile(in)->readTile (dx, dy, lx, ly);
1306 return 1;
1307 }
1308 catch (const std::exception &e)
1309 {
1310 setErrorMessage (e);
1311 return 0;
1312 }
1313 }
1314
1315
1316 int
ImfTiledInputReadTiles(ImfTiledInputFile * in,int dxMin,int dxMax,int dyMin,int dyMax,int lx,int ly)1317 ImfTiledInputReadTiles (ImfTiledInputFile *in,
1318 int dxMin, int dxMax,
1319 int dyMin, int dyMax,
1320 int lx, int ly)
1321 {
1322 try
1323 {
1324 infile(in)->readTiles (dxMin, dxMax, dyMin, dyMax, lx, ly);
1325 return 1;
1326 }
1327 catch (const std::exception &e)
1328 {
1329 setErrorMessage (e);
1330 return 0;
1331 }
1332 }
1333
1334
1335 const ImfHeader *
ImfTiledInputHeader(const ImfTiledInputFile * in)1336 ImfTiledInputHeader (const ImfTiledInputFile *in)
1337 {
1338 return (const ImfHeader *) &infile(in)->header();
1339 }
1340
1341
1342 int
ImfTiledInputChannels(const ImfTiledInputFile * in)1343 ImfTiledInputChannels (const ImfTiledInputFile *in)
1344 {
1345 return infile(in)->channels();
1346 }
1347
1348
1349 const char *
ImfTiledInputFileName(const ImfTiledInputFile * in)1350 ImfTiledInputFileName (const ImfTiledInputFile *in)
1351 {
1352 return infile(in)->fileName();
1353 }
1354
1355
1356 int
ImfTiledInputTileXSize(const ImfTiledInputFile * in)1357 ImfTiledInputTileXSize (const ImfTiledInputFile *in)
1358 {
1359 return infile(in)->tileXSize();
1360 }
1361
1362
1363 int
ImfTiledInputTileYSize(const ImfTiledInputFile * in)1364 ImfTiledInputTileYSize (const ImfTiledInputFile *in)
1365 {
1366 return infile(in)->tileYSize();
1367 }
1368
1369
1370 int
ImfTiledInputLevelMode(const ImfTiledInputFile * in)1371 ImfTiledInputLevelMode (const ImfTiledInputFile *in)
1372 {
1373 return infile(in)->levelMode();
1374 }
1375
1376
1377 int
ImfTiledInputLevelRoundingMode(const ImfTiledInputFile * in)1378 ImfTiledInputLevelRoundingMode (const ImfTiledInputFile *in)
1379 {
1380 return infile(in)->levelRoundingMode();
1381 }
1382
1383
1384 ImfLut *
ImfNewRound12logLut(int channels)1385 ImfNewRound12logLut (int channels)
1386 {
1387 try
1388 {
1389 return (ImfLut *) new Imf::RgbaLut
1390 (Imf::round12log, Imf::RgbaChannels (channels));
1391 }
1392 catch (const std::exception &e)
1393 {
1394 setErrorMessage (e);
1395 return 0;
1396 }
1397 }
1398
1399
1400 ImfLut *
ImfNewRoundNBitLut(unsigned int n,int channels)1401 ImfNewRoundNBitLut (unsigned int n, int channels)
1402 {
1403 try
1404 {
1405 return (ImfLut *) new Imf::RgbaLut
1406 (Imf::roundNBit (n), Imf::RgbaChannels (channels));
1407 }
1408 catch (const std::exception &e)
1409 {
1410 setErrorMessage (e);
1411 return 0;
1412 }
1413 }
1414
1415
1416 void
ImfDeleteLut(ImfLut * lut)1417 ImfDeleteLut (ImfLut *lut)
1418 {
1419 delete (Imf::RgbaLut *) lut;
1420 }
1421
1422
1423 void
ImfApplyLut(ImfLut * lut,ImfRgba * data,int nData,int stride)1424 ImfApplyLut (ImfLut *lut, ImfRgba *data, int nData, int stride)
1425 {
1426 ((Imf::RgbaLut *)lut)->apply ((Imf::Rgba *)data, nData, stride);
1427 }
1428
1429
1430 const char *
ImfErrorMessage()1431 ImfErrorMessage ()
1432 {
1433 return errorMessage;
1434 }
1435