Home | History | Annotate | Download | only in IlmImf
      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
     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 *
     84 header (ImfHeader *hdr)
     85 {
     86     return (Imf::Header *)(hdr);
     87 }
     88 
     89 
     90 inline const Imf::Header *
     91 header (const ImfHeader *hdr)
     92 {
     93     return (const Imf::Header *)(hdr);
     94 }
     95 
     96 
     97 inline Imf::RgbaOutputFile *
     98 outfile (ImfOutputFile *out)
     99 {
    100     return (Imf::RgbaOutputFile *) out;
    101 }
    102 
    103 
    104 inline const Imf::RgbaOutputFile *
    105 outfile (const ImfOutputFile *out)
    106 {
    107     return (const Imf::RgbaOutputFile *) out;
    108 }
    109 
    110 
    111 inline Imf::TiledRgbaOutputFile *
    112 outfile (ImfTiledOutputFile *out)
    113 {
    114     return (Imf::TiledRgbaOutputFile *) out;
    115 }
    116 
    117 
    118 inline const Imf::TiledRgbaOutputFile *
    119 outfile (const ImfTiledOutputFile *out)
    120 {
    121     return (const Imf::TiledRgbaOutputFile *) out;
    122 }
    123 
    124 
    125 inline Imf::RgbaInputFile *
    126 infile (ImfInputFile *in)
    127 {
    128     return (Imf::RgbaInputFile *) in;
    129 }
    130 
    131 
    132 inline const Imf::RgbaInputFile *
    133 infile (const ImfInputFile *in)
    134 {
    135     return (const Imf::RgbaInputFile *) in;
    136 }
    137 
    138 
    139 inline Imf::TiledRgbaInputFile *
    140 infile (ImfTiledInputFile *in)
    141 {
    142     return (Imf::TiledRgbaInputFile *) in;
    143 }
    144 
    145 
    146 inline const Imf::TiledRgbaInputFile *
    147 infile (const ImfTiledInputFile *in)
    148 {
    149     return (const Imf::TiledRgbaInputFile *) in;
    150 }
    151 
    152 
    153 } // namespace
    154 
    155 
    156 void
    157 ImfFloatToHalf (float f, ImfHalf *h)
    158 {
    159     *h = half(f).bits();
    160 }
    161 
    162 
    163 void
    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
    172 ImfHalfToFloat (ImfHalf h)
    173 {
    174     return float (*((half *)&h));
    175 }
    176 
    177 
    178 void
    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 *
    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
    202 ImfDeleteHeader (ImfHeader *hdr)
    203 {
    204     delete header (hdr);
    205 }
    206 
    207 
    208 ImfHeader *
    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
    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
    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
    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
    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
    268 ImfHeaderSetPixelAspectRatio (ImfHeader *hdr, float pixelAspectRatio)
    269 {
    270     header(hdr)->pixelAspectRatio() = pixelAspectRatio;
    271 }
    272 
    273 
    274 float
    275 ImfHeaderPixelAspectRatio (const ImfHeader *hdr)
    276 {
    277     return header(hdr)->pixelAspectRatio();
    278 }
    279 
    280 
    281 void
    282 ImfHeaderSetScreenWindowCenter (ImfHeader *hdr, float x, float y)
    283 {
    284     header(hdr)->screenWindowCenter() = V2f (x, y);
    285 }
    286 
    287 
    288 void
    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
    298 ImfHeaderSetScreenWindowWidth (ImfHeader *hdr, float width)
    299 {
    300     header(hdr)->screenWindowWidth() = width;
    301 }
    302 
    303 
    304 float
    305 ImfHeaderScreenWindowWidth (const ImfHeader *hdr)
    306 {
    307     return header(hdr)->screenWindowWidth();
    308 }
    309 
    310 
    311 void
    312 ImfHeaderSetLineOrder (ImfHeader *hdr, int lineOrder)
    313 {
    314     header(hdr)->lineOrder() = Imf::LineOrder (lineOrder);
    315 }
    316 
    317 
    318 int
    319 ImfHeaderLineOrder (const ImfHeader *hdr)
    320 {
    321     return header(hdr)->lineOrder();
    322 }
    323 
    324 
    325 void
    326 ImfHeaderSetCompression (ImfHeader *hdr, int compression)
    327 {
    328     header(hdr)->compression() = Imf::Compression (compression);
    329 }
    330 
    331 
    332 int
    333 ImfHeaderCompression (const ImfHeader *hdr)
    334 {
    335     return header(hdr)->compression();
    336 }
    337 
    338 
    339 int
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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 *
    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
    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
    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
    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
   1003 ImfOutputCurrentScanLine (const ImfOutputFile *out)
   1004 {
   1005     return outfile(out)->currentScanLine();
   1006 }
   1007 
   1008 
   1009 const ImfHeader *
   1010 ImfOutputHeader (const ImfOutputFile *out)
   1011 {
   1012     return (const ImfHeader *) &outfile(out)->header();
   1013 }
   1014 
   1015 
   1016 int
   1017 ImfOutputChannels (const ImfOutputFile *out)
   1018 {
   1019     return outfile(out)->channels();
   1020 }
   1021 
   1022 
   1023 ImfTiledOutputFile *
   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
   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
   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
   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
   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 *
   1120 ImfTiledOutputHeader (const ImfTiledOutputFile *out)
   1121 {
   1122     return (const ImfHeader *) &outfile(out)->header();
   1123 }
   1124 
   1125 
   1126 int
   1127 ImfTiledOutputChannels (const ImfTiledOutputFile *out)
   1128 {
   1129     return outfile(out)->channels();
   1130 }
   1131 
   1132 
   1133 int
   1134 ImfTiledOutputTileXSize (const ImfTiledOutputFile *out)
   1135 {
   1136     return outfile(out)->tileXSize();
   1137 }
   1138 
   1139 
   1140 int
   1141 ImfTiledOutputTileYSize (const ImfTiledOutputFile *out)
   1142 {
   1143     return outfile(out)->tileYSize();
   1144 }
   1145 
   1146 
   1147 int
   1148 ImfTiledOutputLevelMode (const ImfTiledOutputFile *out)
   1149 {
   1150     return outfile(out)->levelMode();
   1151 }
   1152 
   1153 
   1154 int
   1155 ImfTiledOutputLevelRoundingMode (const ImfTiledOutputFile *out)
   1156 {
   1157     return outfile(out)->levelRoundingMode();
   1158 }
   1159 
   1160 
   1161 ImfInputFile *
   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
   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
   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
   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 *
   1228 ImfInputHeader (const ImfInputFile *in)
   1229 {
   1230     return (const ImfHeader *) &infile(in)->header();
   1231 }
   1232 
   1233 
   1234 int
   1235 ImfInputChannels (const ImfInputFile *in)
   1236 {
   1237     return infile(in)->channels();
   1238 }
   1239 
   1240 
   1241 const char *
   1242 ImfInputFileName (const ImfInputFile *in)
   1243 {
   1244     return infile(in)->fileName();
   1245 }
   1246 
   1247 
   1248 ImfTiledInputFile *
   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
   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
   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
   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
   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 *
   1336 ImfTiledInputHeader (const ImfTiledInputFile *in)
   1337 {
   1338     return (const ImfHeader *) &infile(in)->header();
   1339 }
   1340 
   1341 
   1342 int
   1343 ImfTiledInputChannels (const ImfTiledInputFile *in)
   1344 {
   1345     return infile(in)->channels();
   1346 }
   1347 
   1348 
   1349 const char *
   1350 ImfTiledInputFileName (const ImfTiledInputFile *in)
   1351 {
   1352     return infile(in)->fileName();
   1353 }
   1354 
   1355 
   1356 int
   1357 ImfTiledInputTileXSize (const ImfTiledInputFile *in)
   1358 {
   1359     return infile(in)->tileXSize();
   1360 }
   1361 
   1362 
   1363 int
   1364 ImfTiledInputTileYSize (const ImfTiledInputFile *in)
   1365 {
   1366     return infile(in)->tileYSize();
   1367 }
   1368 
   1369 
   1370 int
   1371 ImfTiledInputLevelMode (const ImfTiledInputFile *in)
   1372 {
   1373     return infile(in)->levelMode();
   1374 }
   1375 
   1376 
   1377 int
   1378 ImfTiledInputLevelRoundingMode (const ImfTiledInputFile *in)
   1379 {
   1380     return infile(in)->levelRoundingMode();
   1381 }
   1382 
   1383 
   1384 ImfLut *
   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 *
   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
   1417 ImfDeleteLut (ImfLut *lut)
   1418 {
   1419     delete (Imf::RgbaLut *) lut;
   1420 }
   1421 
   1422 
   1423 void
   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 *
   1431 ImfErrorMessage ()
   1432 {
   1433     return errorMessage;
   1434 }
   1435