📄 imfcrgbafile.cpp
字号:
/////////////////////////////////////////////////////////////////////////////// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas// Digital Ltd. LLC// // All rights reserved.// // Redistribution and use in source and binary forms, with or without// modification, are permitted provided that the following conditions are// met:// * Redistributions of source code must retain the above copyright// notice, this list of conditions and the following disclaimer.// * Redistributions in binary form must reproduce the above// copyright notice, this list of conditions and the following disclaimer// in the documentation and/or other materials provided with the// distribution.// * Neither the name of Industrial Light & Magic nor the names of// its contributors may be used to endorse or promote products derived// from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.///////////////////////////////////////////////////////////////////////////////-----------------------------------------------------------------------------//// C interface to C++ classes Imf::RgbaOutputFile and Imf::RgbaInputFile////-----------------------------------------------------------------------------#include <ImfCRgbaFile.h>#include <ImfRgbaFile.h>#include <ImfTiledRgbaFile.h>#include <ImfIntAttribute.h>#include <ImfFloatAttribute.h>#include <ImfDoubleAttribute.h>#include <ImfStringAttribute.h>#include <ImfBoxAttribute.h>#include <ImfVecAttribute.h>#include <ImfMatrixAttribute.h>#include <ImfChannelList.h>#include <ImfLut.h>#include "half.h"#include <string.h>using Imath::Box2i;using Imath::Box2f;using Imath::V2i;using Imath::V2f;using Imath::V3i;using Imath::V3f;using Imath::M33f;using Imath::M44f;namespace {const int MAX_ERR_LENGTH = 1024;char errorMessage[MAX_ERR_LENGTH];voidsetErrorMessage (const std::exception &e){ strncpy (errorMessage, e.what(), MAX_ERR_LENGTH - 1); errorMessage[MAX_ERR_LENGTH - 1] = 0;}inline Imf::Header *header (ImfHeader *hdr){ return (Imf::Header *)(hdr);}inline const Imf::Header *header (const ImfHeader *hdr){ return (const Imf::Header *)(hdr);}inline Imf::RgbaOutputFile *outfile (ImfOutputFile *out){ return (Imf::RgbaOutputFile *) out;}inline const Imf::RgbaOutputFile *outfile (const ImfOutputFile *out){ return (const Imf::RgbaOutputFile *) out;}inline Imf::TiledRgbaOutputFile *outfile (ImfTiledOutputFile *out){ return (Imf::TiledRgbaOutputFile *) out;}inline const Imf::TiledRgbaOutputFile *outfile (const ImfTiledOutputFile *out){ return (const Imf::TiledRgbaOutputFile *) out;}inline Imf::RgbaInputFile *infile (ImfInputFile *in){ return (Imf::RgbaInputFile *) in;}inline const Imf::RgbaInputFile *infile (const ImfInputFile *in){ return (const Imf::RgbaInputFile *) in;}inline Imf::TiledRgbaInputFile *infile (ImfTiledInputFile *in){ return (Imf::TiledRgbaInputFile *) in;}inline const Imf::TiledRgbaInputFile *infile (const ImfTiledInputFile *in){ return (const Imf::TiledRgbaInputFile *) in;}} // namespacevoid ImfFloatToHalf (float f, ImfHalf *h){ *h = half(f).bits();}void ImfFloatToHalfArray (int n, const float f[/*n*/], ImfHalf h[/*n*/]){ for (int i = 0; i < n; ++i) h[i] = half(f[i]).bits();}float ImfHalfToFloat (ImfHalf h){ return float (*((half *)&h));}voidImfHalfToFloatArray (int n, const ImfHalf h[/*n*/], float f[/*n*/]){ for (int i = 0; i < n; ++i) f[i] = float (*((half *)(h + i)));}ImfHeader *ImfNewHeader (void){ try { return (ImfHeader *) new Imf::Header; } catch (const std::exception &e) { setErrorMessage (e); return 0; }}void ImfDeleteHeader (ImfHeader *hdr){ delete header (hdr);}ImfHeader *ImfCopyHeader (const ImfHeader *hdr){ try { return (ImfHeader *) new Imf::Header (*header (hdr)); } catch (const std::exception &e) { setErrorMessage (e); return 0; }}void ImfHeaderSetDisplayWindow (ImfHeader *hdr, int xMin, int yMin, int xMax, int yMax){ header(hdr)->displayWindow() = Box2i (V2i (xMin, yMin), V2i (xMax, yMax));}void ImfHeaderDisplayWindow (const ImfHeader *hdr, int *xMin, int *yMin, int *xMax, int *yMax){ const Box2i dw = header(hdr)->displayWindow(); *xMin = dw.min.x; *yMin = dw.min.y; *xMax = dw.max.x; *yMax = dw.max.y;}voidImfHeaderSetDataWindow (ImfHeader *hdr, int xMin, int yMin, int xMax, int yMax){ header(hdr)->dataWindow() = Box2i (V2i (xMin, yMin), V2i (xMax, yMax));}void ImfHeaderDataWindow (const ImfHeader *hdr, int *xMin, int *yMin, int *xMax, int *yMax){ const Box2i dw = header(hdr)->dataWindow(); *xMin = dw.min.x; *yMin = dw.min.y; *xMax = dw.max.x; *yMax = dw.max.y;}void ImfHeaderSetPixelAspectRatio (ImfHeader *hdr, float pixelAspectRatio){ header(hdr)->pixelAspectRatio() = pixelAspectRatio;}float ImfHeaderPixelAspectRatio (const ImfHeader *hdr){ return header(hdr)->pixelAspectRatio();}void ImfHeaderSetScreenWindowCenter (ImfHeader *hdr, float x, float y){ header(hdr)->screenWindowCenter() = V2f (x, y);}void ImfHeaderScreenWindowCenter (const ImfHeader *hdr, float *x, float *y){ const V2i &swc = header(hdr)->screenWindowCenter(); *x = swc.x; *y = swc.y;}void ImfHeaderSetScreenWindowWidth (ImfHeader *hdr, float width){ header(hdr)->screenWindowWidth() = width;}float ImfHeaderScreenWindowWidth (const ImfHeader *hdr){ return header(hdr)->screenWindowWidth();}void ImfHeaderSetLineOrder (ImfHeader *hdr, int lineOrder){ header(hdr)->lineOrder() = Imf::LineOrder (lineOrder);}int ImfHeaderLineOrder (const ImfHeader *hdr){ return header(hdr)->lineOrder();} void ImfHeaderSetCompression (ImfHeader *hdr, int compression){ header(hdr)->compression() = Imf::Compression (compression);}int ImfHeaderCompression (const ImfHeader *hdr){ return header(hdr)->compression();}int ImfHeaderSetIntAttribute (ImfHeader *hdr, const char name[], int value){ try { if (header(hdr)->find(name) == header(hdr)->end()) { header(hdr)->insert (name, Imf::IntAttribute (value)); } else { header(hdr)->typedAttribute<Imf::IntAttribute>(name).value() = value; } return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; }}int ImfHeaderIntAttribute (const ImfHeader *hdr, const char name[], int *value){ try { *value = header(hdr)->typedAttribute<Imf::IntAttribute>(name).value(); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; }}int ImfHeaderSetFloatAttribute (ImfHeader *hdr, const char name[], float value){ try { if (header(hdr)->find(name) == header(hdr)->end()) { header(hdr)->insert (name, Imf::FloatAttribute (value)); } else { header(hdr)->typedAttribute<Imf::FloatAttribute>(name).value() = value; } return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; }}int ImfHeaderSetDoubleAttribute (ImfHeader *hdr, const char name[], double value){ try { if (header(hdr)->find(name) == header(hdr)->end()) { header(hdr)->insert (name, Imf::DoubleAttribute (value)); } else { header(hdr)->typedAttribute<Imf::DoubleAttribute>(name).value() = value; } return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; }}intImfHeaderFloatAttribute (const ImfHeader *hdr, const char name[], float *value){ try { *value = header(hdr)->typedAttribute<Imf::FloatAttribute>(name).value(); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; }}intImfHeaderDoubleAttribute (const ImfHeader *hdr, const char name[], double *value){ try { *value = header(hdr)-> typedAttribute<Imf::DoubleAttribute>(name).value(); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; }}intImfHeaderSetStringAttribute (ImfHeader *hdr, const char name[], const char value[]){ try { if (header(hdr)->find(name) == header(hdr)->end()) { header(hdr)->insert (name, Imf::StringAttribute (value)); } else { header(hdr)->typedAttribute<Imf::StringAttribute>(name).value() = value; } return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; }}intImfHeaderStringAttribute (const ImfHeader *hdr, const char name[], const char **value){ try { *value = header(hdr)-> typedAttribute<Imf::StringAttribute>(name).value().c_str(); return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; }}intImfHeaderSetBox2iAttribute (ImfHeader *hdr, const char name[], int xMin, int yMin, int xMax, int yMax){ try { Box2i box (V2i (xMin, yMin), V2i (xMax, yMax)); if (header(hdr)->find(name) == header(hdr)->end()) { header(hdr)->insert (name, Imf::Box2iAttribute (box)); } else { header(hdr)->typedAttribute<Imf::Box2iAttribute>(name).value() = box; } return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; }}intImfHeaderBox2iAttribute (const ImfHeader *hdr, const char name[], int *xMin, int *yMin, int *xMax, int *yMax){ try { const Box2i &box = header(hdr)->typedAttribute<Imf::Box2iAttribute>(name).value(); *xMin = box.min.x; *yMin = box.min.y; *xMax = box.max.x; *yMax = box.max.y; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; }}intImfHeaderSetBox2fAttribute (ImfHeader *hdr, const char name[], float xMin, float yMin, float xMax, float yMax){ try { Box2f box (V2f (xMin, yMin), V2f (xMax, yMax)); if (header(hdr)->find(name) == header(hdr)->end()) { header(hdr)->insert (name, Imf::Box2fAttribute (box)); } else { header(hdr)->typedAttribute<Imf::Box2fAttribute>(name).value() = box; } return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; }}intImfHeaderBox2fAttribute (const ImfHeader *hdr, const char name[], float *xMin, float *yMin, float *xMax, float *yMax){ try { const Box2f &box = header(hdr)->typedAttribute<Imf::Box2fAttribute>(name).value(); *xMin = box.min.x; *yMin = box.min.y; *xMax = box.max.x; *yMax = box.max.y; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; }}intImfHeaderSetV2iAttribute (ImfHeader *hdr, const char name[], int x, int y){ try { V2i v (x, y); if (header(hdr)->find(name) == header(hdr)->end()) header(hdr)->insert (name, Imf::V2iAttribute (v)); else header(hdr)->typedAttribute<Imf::V2iAttribute>(name).value() = v; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; }}intImfHeaderV2iAttribute (const ImfHeader *hdr, const char name[], int *x, int *y){ try { const V2i &v = header(hdr)->typedAttribute<Imf::V2iAttribute>(name).value(); *x = v.x; *y = v.y; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; }}int ImfHeaderSetV2fAttribute (ImfHeader *hdr, const char name[], float x, float y){ try { V2f v (x, y); if (header(hdr)->find(name) == header(hdr)->end()) header(hdr)->insert (name, Imf::V2fAttribute (v)); else header(hdr)->typedAttribute<Imf::V2fAttribute>(name).value() = v; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; }}intImfHeaderV2fAttribute (const ImfHeader *hdr, const char name[], float *x, float *y){ try { const V2f &v = header(hdr)->typedAttribute<Imf::V2fAttribute>(name).value(); *x = v.x; *y = v.y; return 1; } catch (const std::exception &e) { setErrorMessage (e); return 0; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -