⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imfframebuffer.h

📁 image converter source code
💻 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 + -