/src/3rdparty/openexr-1.7.0/ImfCompressor.h
https://bitbucket.org/melbyruarus/pbrt · C Header · 252 lines · 49 code · 45 blank · 158 comment · 0 complexity · ffb469f4fb498a88e52d37977a6bb498 MD5 · raw file
- ///////////////////////////////////////////////////////////////////////////
- //
- // 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_COMPRESSOR_H
- #define INCLUDED_IMF_COMPRESSOR_H
- //-----------------------------------------------------------------------------
- //
- // class Compressor
- //
- //-----------------------------------------------------------------------------
- #include <ImfCompression.h>
- #include "ImathBox.h"
- #include <stdlib.h>
- namespace Imf {
- class Header;
- class Compressor
- {
- public:
- //---------------------------------------------
- // Constructor -- hdr is the header of the file
- // that will be compressed or uncompressed
- //---------------------------------------------
- Compressor (const Header &hdr);
- //-----------
- // Destructor
- //-----------
- virtual ~Compressor ();
- //----------------------------------------------
- // Maximum number of scan lines processed by
- // a single call to compress() and uncompress().
- //----------------------------------------------
- virtual int numScanLines () const = 0;
- //--------------------------------------------
- // Format of the pixel data read and written
- // by the compress() and uncompress() methods.
- // The default implementation of format()
- // returns XDR.
- //--------------------------------------------
- enum Format
- {
- NATIVE, // the machine's native format
- XDR // Xdr format
- };
- virtual Format format () const;
- //----------------------------
- // Access to the file's header
- //----------------------------
- const Header & header () const {return _header;}
- //-------------------------------------------------------------------------
- // Compress an array of bytes that represents the contents of up to
- // numScanLines() scan lines:
- //
- // inPtr Input buffer (uncompressed data).
- //
- // inSize Number of bytes in the input buffer
- //
- // minY Minimum y coordinate of the scan lines to
- // be compressed
- //
- // outPtr Pointer to output buffer
- //
- // return value Size of compressed data in output buffer
- //
- // Arrangement of uncompressed pixel data in the input buffer:
- //
- // Before calling
- //
- // compress (buf, size, minY, ...);
- //
- // the InputFile::writePixels() method gathers pixel data from the
- // frame buffer, fb, and places them in buffer buf, like this:
- //
- // char *endOfBuf = buf;
- //
- // for (int y = minY;
- // y <= min (minY + numScanLines() - 1, header().dataWindow().max.y);
- // ++y)
- // {
- // for (ChannelList::ConstIterator c = header().channels().begin();
- // c != header().channels().end();
- // ++c)
- // {
- // if (modp (y, c.channel().ySampling) != 0)
- // continue;
- //
- // for (int x = header().dataWindow().min.x;
- // x <= header().dataWindow().max.x;
- // ++x)
- // {
- // if (modp (x, c.channel().xSampling) != 0)
- // continue;
- //
- // Xdr::write<CharPtrIO> (endOfBuf, fb.pixel (c, x, y));
- // }
- // }
- // }
- //
- // int size = endOfBuf - buf;
- //
- //-------------------------------------------------------------------------
- virtual int compress (const char *inPtr,
- int inSize,
- int minY,
- const char *&outPtr) = 0;
- virtual int compressTile (const char *inPtr,
- int inSize,
- Imath::Box2i range,
- const char *&outPtr);
- //-------------------------------------------------------------------------
- // Uncompress an array of bytes that has been compressed by compress():
- //
- // inPtr Input buffer (compressed data).
- //
- // inSize Number of bytes in the input buffer
- //
- // minY Minimum y coordinate of the scan lines to
- // be uncompressed
- //
- // outPtr Pointer to output buffer
- //
- // return value Size of uncompressed data in output buffer
- //
- //-------------------------------------------------------------------------
- virtual int uncompress (const char *inPtr,
- int inSize,
- int minY,
- const char *&outPtr) = 0;
- virtual int uncompressTile (const char *inPtr,
- int inSize,
- Imath::Box2i range,
- const char *&outPtr);
- private:
- const Header & _header;
- };
- //--------------------------------------
- // Test if c is a valid compression type
- //--------------------------------------
- bool isValidCompression (Compression c);
- //-----------------------------------------------------------------
- // Construct a Compressor for compression type c:
- //
- // maxScanLineSize Maximum number of bytes per uncompressed
- // scan line.
- //
- // header Header of the input or output file whose
- // pixels will be compressed or uncompressed.
- //
- // return value A pointer to a new Compressor object (it
- // is the caller's responsibility to delete
- // the object), or 0 (if c is NO_COMPRESSION).
- //
- //-----------------------------------------------------------------
- Compressor * newCompressor (Compression c,
- size_t maxScanLineSize,
- const Header &hdr);
- //-----------------------------------------------------------------
- // Construct a Compressor for compression type c for a tiled image:
- //
- // tileLineSize Maximum number of bytes per uncompressed
- // line in a tile.
- //
- // numTileLines Maximum number of lines in a tile.
- //
- // header Header of the input or output file whose
- // pixels will be compressed or uncompressed.
- //
- // return value A pointer to a new Compressor object (it
- // is the caller's responsibility to delete
- // the object), or 0 (if c is NO_COMPRESSION).
- //
- //-----------------------------------------------------------------
- Compressor * newTileCompressor (Compression c,
- size_t tileLineSize,
- size_t numTileLines,
- const Header &hdr);
- } // namespace Imf
- #endif