📄 imfframebuffer.h
字号:
/////////////////////////////////////////////////////////////////////////////// Copyright (c) 2002, 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./////////////////////////////////////////////////////////////////////////////#ifndef INCLUDED_IMF_FRAME_BUFFER_H#define INCLUDED_IMF_FRAME_BUFFER_H//-----------------------------------------------------------------------------//// class Slice// class FrameBuffer////-----------------------------------------------------------------------------#include <ImfName.h>#include <ImfPixelType.h>#include <map>namespace Imf {//-------------------------------------------------------// Description of a single slice of the frame buffer://// Note -- terminology: as part of a file, a component of// an image (e.g. red, green, blue, depth etc.) is called// a "channel". As part of a frame buffer, an image// component is called a "slice".//-------------------------------------------------------struct Slice{ //------------------------------ // Data type; see ImfPixelType.h //------------------------------ PixelType type; //--------------------------------------------------------------------- // Memory layout: The address of pixel (x, y) is // // base + (xp / xSampling) * xStride + (yp / ySampling) * yStride // // where xp and yp are computed as follows: // // * If we are reading or writing a scanline-based file: // // xp = x // yp = y // // * If we are reading a tile whose upper left coorner is at (xt, yt): // // if xTileCoords is true then xp = x - xt, else xp = x // if yTileCoords is true then yp = y - yt, else yp = y // //--------------------------------------------------------------------- char * base; size_t xStride; size_t yStride; //-------------------------------------------- // Subsampling: pixel (x, y) is present in the // slice only if // // x % xSampling == 0 && y % ySampling == 0 // //-------------------------------------------- int xSampling; int ySampling; //---------------------------------------------------------- // Default value, used to fill the slice when a file without // a channel that corresponds to this slice is read. //---------------------------------------------------------- double fillValue; //------------------------------------------------------- // For tiled files, the xTileCoords and yTileCoords flags // determine whether pixel addressing is performed using // absolute coordinates or coordinates relative to a // tile's upper left corner. (See the comment on base, // xStride and yStride, above.) // // For scanline-based files these flags have no effect; // pixel addressing is always done using absolute // coordinates. //------------------------------------------------------- bool xTileCoords; bool yTileCoords; //------------ // Constructor //------------ Slice (PixelType type = HALF, char * base = 0, size_t xStride = 0, size_t yStride = 0, int xSampling = 1, int ySampling = 1, double fillValue = 0.0, bool xTileCoords = false, bool yTileCoords = false);};class FrameBuffer{ public: //------------ // Add a slice //------------ void insert (const char name[], const Slice &slice); //---------------------------------------------------------------- // Access to existing slices: // // [n] Returns a reference to the slice with name n. // If no slice with name n exists, an Iex::ArgExc // is thrown. // // findSlice(n) Returns a pointer to the slice with name n, // or 0 if no slice with name n exists. // //---------------------------------------------------------------- Slice & operator [] (const char name[]); const Slice & operator [] (const char name[]) const; Slice * findSlice (const char name[]); const Slice * findSlice (const char name[]) const; //----------------------------------------- // Iterator-style access to existing slices //----------------------------------------- typedef std::map <Name, Slice> SliceMap; class Iterator; class ConstIterator; Iterator begin (); ConstIterator begin () const; Iterator end (); ConstIterator end () const; Iterator find (const char name[]); ConstIterator find (const char name[]) const; private: SliceMap _map;};//----------// Iterators//----------class FrameBuffer::Iterator{ public: Iterator (); Iterator (const FrameBuffer::SliceMap::iterator &i); Iterator & operator ++ (); Iterator operator ++ (int); const char * name () const; Slice & slice () const; private: friend class FrameBuffer::ConstIterator; FrameBuffer::SliceMap::iterator _i;};class FrameBuffer::ConstIterator{ public: ConstIterator (); ConstIterator (const FrameBuffer::SliceMap::const_iterator &i); ConstIterator (const FrameBuffer::Iterator &other); ConstIterator & operator ++ (); ConstIterator operator ++ (int); const char * name () const; const Slice & slice () const; private: friend bool operator == (const ConstIterator &, const ConstIterator &); friend bool operator != (const ConstIterator &, const ConstIterator &); FrameBuffer::SliceMap::const_iterator _i;};//-----------------// Inline Functions//-----------------inlineFrameBuffer::Iterator::Iterator (): _i(){ // empty}inlineFrameBuffer::Iterator::Iterator (const FrameBuffer::SliceMap::iterator &i): _i (i){ // empty}inline FrameBuffer::Iterator & FrameBuffer::Iterator::operator ++ (){ ++_i; return *this;}inline FrameBuffer::Iterator FrameBuffer::Iterator::operator ++ (int){ Iterator tmp = *this; ++_i; return tmp;}inline const char *FrameBuffer::Iterator::name () const{ return *_i->first;}inline Slice & FrameBuffer::Iterator::slice () const{ return _i->second;}inlineFrameBuffer::ConstIterator::ConstIterator (): _i(){ // empty}inlineFrameBuffer::ConstIterator::ConstIterator (const FrameBuffer::SliceMap::const_iterator &i): _i (i){ // empty}inlineFrameBuffer::ConstIterator::ConstIterator (const FrameBuffer::Iterator &other): _i (other._i){ // empty}inline FrameBuffer::ConstIterator &FrameBuffer::ConstIterator::operator ++ (){ ++_i; return *this;}inline FrameBuffer::ConstIterator FrameBuffer::ConstIterator::operator ++ (int){ ConstIterator tmp = *this; ++_i; return tmp;}inline const char *FrameBuffer::ConstIterator::name () const{ return *_i->first;}inline const Slice & FrameBuffer::ConstIterator::slice () const{ return _i->second;}inline booloperator == (const FrameBuffer::ConstIterator &x, const FrameBuffer::ConstIterator &y){ return x._i == y._i;}inline booloperator != (const FrameBuffer::ConstIterator &x, const FrameBuffer::ConstIterator &y){ return !(x == y);}} // namespace Imf#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -