/////////////////////////////////////////////////////////////////////////// // // 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