Blame IlmImf/ImfCompressor.h

Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
//
Packit Service 6754ca
// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
Packit Service 6754ca
// Digital Ltd. LLC
Packit Service 6754ca
// 
Packit Service 6754ca
// All rights reserved.
Packit Service 6754ca
// 
Packit Service 6754ca
// Redistribution and use in source and binary forms, with or without
Packit Service 6754ca
// modification, are permitted provided that the following conditions are
Packit Service 6754ca
// met:
Packit Service 6754ca
// *       Redistributions of source code must retain the above copyright
Packit Service 6754ca
// notice, this list of conditions and the following disclaimer.
Packit Service 6754ca
// *       Redistributions in binary form must reproduce the above
Packit Service 6754ca
// copyright notice, this list of conditions and the following disclaimer
Packit Service 6754ca
// in the documentation and/or other materials provided with the
Packit Service 6754ca
// distribution.
Packit Service 6754ca
// *       Neither the name of Industrial Light & Magic nor the names of
Packit Service 6754ca
// its contributors may be used to endorse or promote products derived
Packit Service 6754ca
// from this software without specific prior written permission. 
Packit Service 6754ca
// 
Packit Service 6754ca
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 6754ca
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 6754ca
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit Service 6754ca
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit Service 6754ca
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit Service 6754ca
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit Service 6754ca
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit Service 6754ca
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit Service 6754ca
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit Service 6754ca
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit Service 6754ca
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 6754ca
//
Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
#ifndef INCLUDED_IMF_COMPRESSOR_H
Packit Service 6754ca
#define INCLUDED_IMF_COMPRESSOR_H
Packit Service 6754ca
Packit Service 6754ca
//-----------------------------------------------------------------------------
Packit Service 6754ca
//
Packit Service 6754ca
//	class Compressor
Packit Service 6754ca
//
Packit Service 6754ca
//-----------------------------------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
#include "ImfCompression.h"
Packit Service 6754ca
#include "ImathBox.h"
Packit Service 6754ca
#include "ImfNamespace.h"
Packit Service 6754ca
#include "ImfExport.h"
Packit Service 6754ca
#include "ImfForward.h"
Packit Service 6754ca
Packit Service 6754ca
#include <stdlib.h>
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
class IMF_EXPORT Compressor
Packit Service 6754ca
{
Packit Service 6754ca
  public:
Packit Service 6754ca
Packit Service 6754ca
    //---------------------------------------------
Packit Service 6754ca
    // Constructor -- hdr is the header of the file
Packit Service 6754ca
    // that will be compressed or uncompressed
Packit Service 6754ca
    //---------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
    Compressor (const Header &hdr);
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    //-----------
Packit Service 6754ca
    // Destructor
Packit Service 6754ca
    //-----------
Packit Service 6754ca
Packit Service 6754ca
    virtual ~Compressor ();
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    //----------------------------------------------
Packit Service 6754ca
    // Maximum number of scan lines processed by
Packit Service 6754ca
    // a single call to compress() and uncompress().
Packit Service 6754ca
    //----------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
    virtual int		numScanLines () const = 0;
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    //--------------------------------------------
Packit Service 6754ca
    // Format of the pixel data read and written
Packit Service 6754ca
    // by the compress() and uncompress() methods.
Packit Service 6754ca
    // The default implementation of format()
Packit Service 6754ca
    // returns XDR.
Packit Service 6754ca
    //--------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
    enum Format
Packit Service 6754ca
    {
Packit Service 6754ca
	NATIVE,		// the machine's native format
Packit Service 6754ca
	XDR		// Xdr format
Packit Service 6754ca
    };
Packit Service 6754ca
Packit Service 6754ca
    virtual Format	format () const;
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    //----------------------------
Packit Service 6754ca
    // Access to the file's header
Packit Service 6754ca
    //----------------------------
Packit Service 6754ca
Packit Service 6754ca
    const Header &	header () const		{return _header;}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
    //-------------------------------------------------------------------------
Packit Service 6754ca
    // Compress an array of bytes that represents the contents of up to
Packit Service 6754ca
    // numScanLines() scan lines:
Packit Service 6754ca
    //
Packit Service 6754ca
    //	    inPtr		Input buffer (uncompressed data).
Packit Service 6754ca
    //
Packit Service 6754ca
    //	    inSize		Number of bytes in the input buffer
Packit Service 6754ca
    //
Packit Service 6754ca
    //	    minY		Minimum y coordinate of the scan lines to
Packit Service 6754ca
    //				be compressed
Packit Service 6754ca
    //
Packit Service 6754ca
    //	    outPtr		Pointer to output buffer
Packit Service 6754ca
    //
Packit Service 6754ca
    //	    return value	Size of compressed data in output buffer
Packit Service 6754ca
    //
Packit Service 6754ca
    // Arrangement of uncompressed pixel data in the input buffer:
Packit Service 6754ca
    //
Packit Service 6754ca
    //	Before calling
Packit Service 6754ca
    //
Packit Service 6754ca
    //	        compress (buf, size, minY, ...);
Packit Service 6754ca
    //
Packit Service 6754ca
    //	the InputFile::writePixels() method gathers pixel data from the
Packit Service 6754ca
    // 	frame buffer, fb, and places them in buffer buf, like this:
Packit Service 6754ca
    //
Packit Service 6754ca
    //  char *endOfBuf = buf;
Packit Service 6754ca
    //
Packit Service 6754ca
    //	for (int y = minY;
Packit Service 6754ca
    //	     y <= min (minY + numScanLines() - 1, header().dataWindow().max.y);
Packit Service 6754ca
    //	     ++y)
Packit Service 6754ca
    //	{
Packit Service 6754ca
    //	    for (ChannelList::ConstIterator c = header().channels().begin();
Packit Service 6754ca
    //		 c != header().channels().end();
Packit Service 6754ca
    //		 ++c)
Packit Service 6754ca
    //	    {
Packit Service 6754ca
    //		if (modp (y, c.channel().ySampling) != 0)
Packit Service 6754ca
    //		    continue;
Packit Service 6754ca
    //
Packit Service 6754ca
    //		for (int x = header().dataWindow().min.x;
Packit Service 6754ca
    //		     x <= header().dataWindow().max.x;
Packit Service 6754ca
    //		     ++x)
Packit Service 6754ca
    //		{
Packit Service 6754ca
    //		    if (modp (x, c.channel().xSampling) != 0)
Packit Service 6754ca
    //			continue;
Packit Service 6754ca
    //
Packit Service 6754ca
    //		    Xdr::write<CharPtrIO> (endOfBuf, fb.pixel (c, x, y));
Packit Service 6754ca
    //		}
Packit Service 6754ca
    //	    }
Packit Service 6754ca
    //	}
Packit Service 6754ca
    //
Packit Service 6754ca
    //	int size = endOfBuf - buf;
Packit Service 6754ca
    //
Packit Service 6754ca
    //-------------------------------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
    virtual int		compress (const char *inPtr,
Packit Service 6754ca
				  int inSize,
Packit Service 6754ca
				  int minY,
Packit Service 6754ca
				  const char *&outPtr) = 0;
Packit Service 6754ca
Packit Service 6754ca
    virtual int		compressTile (const char *inPtr,
Packit Service 6754ca
				      int inSize,
Packit Service 6754ca
				      IMATH_NAMESPACE::Box2i range,
Packit Service 6754ca
				      const char *&outPtr);
Packit Service 6754ca
Packit Service 6754ca
    //-------------------------------------------------------------------------
Packit Service 6754ca
    // Uncompress an array of bytes that has been compressed by compress():
Packit Service 6754ca
    //
Packit Service 6754ca
    //	    inPtr		Input buffer (compressed data).
Packit Service 6754ca
    //
Packit Service 6754ca
    //	    inSize		Number of bytes in the input buffer
Packit Service 6754ca
    //
Packit Service 6754ca
    //	    minY		Minimum y coordinate of the scan lines to
Packit Service 6754ca
    //				be uncompressed
Packit Service 6754ca
    //
Packit Service 6754ca
    //	    outPtr		Pointer to output buffer
Packit Service 6754ca
    //
Packit Service 6754ca
    //	    return value	Size of uncompressed data in output buffer
Packit Service 6754ca
    //
Packit Service 6754ca
    //-------------------------------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
    virtual int		uncompress (const char *inPtr,
Packit Service 6754ca
				    int inSize,
Packit Service 6754ca
				    int minY,
Packit Service 6754ca
				    const char *&outPtr) = 0;
Packit Service 6754ca
Packit Service 6754ca
    virtual int		uncompressTile (const char *inPtr,
Packit Service 6754ca
					int inSize,
Packit Service 6754ca
					IMATH_NAMESPACE::Box2i range,
Packit Service 6754ca
					const char *&outPtr);
Packit Service 6754ca
Packit Service 6754ca
  private:
Packit Service 6754ca
Packit Service 6754ca
    const Header &	_header;
Packit Service 6754ca
};
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
//--------------------------------------
Packit Service 6754ca
// Test if c is a valid compression type
Packit Service 6754ca
//--------------------------------------
Packit Service 6754ca
Packit Service 6754ca
IMF_EXPORT 
Packit Service 6754ca
bool isValidCompression (Compression c);
Packit Service 6754ca
Packit Service 6754ca
//--------------------------------------
Packit Service 6754ca
// Test if c is valid for deep data
Packit Service 6754ca
//--------------------------------------
Packit Service 6754ca
Packit Service 6754ca
IMF_EXPORT
Packit Service 6754ca
bool            isValidDeepCompression (Compression c);
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
//-----------------------------------------------------------------
Packit Service 6754ca
// Construct a Compressor for compression type c:
Packit Service 6754ca
//
Packit Service 6754ca
//  maxScanLineSize	Maximum number of bytes per uncompressed
Packit Service 6754ca
//			scan line.
Packit Service 6754ca
//
Packit Service 6754ca
//  header		Header of the input or output file whose
Packit Service 6754ca
//			pixels will be compressed or uncompressed.
Packit Service 6754ca
//			
Packit Service 6754ca
//  return value	A pointer to a new Compressor object (it
Packit Service 6754ca
//			is the caller's responsibility to delete
Packit Service 6754ca
//			the object), or 0 (if c is NO_COMPRESSION).
Packit Service 6754ca
//
Packit Service 6754ca
//-----------------------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
IMF_EXPORT 
Packit Service 6754ca
Compressor *	newCompressor (Compression c,
Packit Service 6754ca
			       size_t maxScanLineSize,
Packit Service 6754ca
			       const Header &hdr);
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
//-----------------------------------------------------------------
Packit Service 6754ca
// Construct a Compressor for compression type c for a tiled image:
Packit Service 6754ca
//
Packit Service 6754ca
//  tileLineSize	Maximum number of bytes per uncompressed
Packit Service 6754ca
//			line in a tile.
Packit Service 6754ca
//
Packit Service 6754ca
//  numTileLines	Maximum number of lines in a tile.
Packit Service 6754ca
//
Packit Service 6754ca
//  header		Header of the input or output file whose
Packit Service 6754ca
//			pixels will be compressed or uncompressed.
Packit Service 6754ca
//
Packit Service 6754ca
//  return value	A pointer to a new Compressor object (it
Packit Service 6754ca
//			is the caller's responsibility to delete
Packit Service 6754ca
//			the object), or 0 (if c is NO_COMPRESSION).
Packit Service 6754ca
//
Packit Service 6754ca
//-----------------------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
IMF_EXPORT 
Packit Service 6754ca
Compressor *    newTileCompressor (Compression c,
Packit Service 6754ca
				   size_t tileLineSize,
Packit Service 6754ca
				   size_t numTileLines,
Packit Service 6754ca
				   const Header &hdr);
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT
Packit Service 6754ca
Packit Service 6754ca
#endif