Blame IlmImf/ImfAcesFile.cpp

Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
//
Packit Service 6754ca
// Copyright (c) 2007, 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
//	ACES image file I/O.
Packit Service 6754ca
//	
Packit Service 6754ca
//-----------------------------------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
#include <ImfAcesFile.h>
Packit Service 6754ca
#include <ImfRgbaFile.h>
Packit Service 6754ca
#include <ImfStandardAttributes.h>
Packit Service 6754ca
#include <Iex.h>
Packit Service 6754ca
#include <algorithm>
Packit Service 6754ca
Packit Service 6754ca
using namespace std;
Packit Service 6754ca
using namespace IMATH_NAMESPACE;
Packit Service 6754ca
using namespace IEX_NAMESPACE;
Packit Service 6754ca
#include "ImfNamespace.h"
Packit Service 6754ca
Packit Service 6754ca
OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
const Chromaticities &
Packit Service 6754ca
acesChromaticities ()
Packit Service 6754ca
{
Packit Service 6754ca
    static const Chromaticities acesChr 
Packit Service 6754ca
	    (V2f (0.73470,  0.26530),	// red
Packit Service 6754ca
	     V2f (0.00000,  1.00000),	// green
Packit Service 6754ca
	     V2f (0.00010, -0.07700),	// blue
Packit Service 6754ca
	     V2f (0.32168,  0.33767));	// white
Packit Service 6754ca
Packit Service 6754ca
    return acesChr;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
class AcesOutputFile::Data
Packit Service 6754ca
{
Packit Service 6754ca
  public:
Packit Service 6754ca
Packit Service 6754ca
     Data();
Packit Service 6754ca
    ~Data();
Packit Service 6754ca
Packit Service 6754ca
    RgbaOutputFile *	rgbaFile;
Packit Service 6754ca
};
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
AcesOutputFile::Data::Data ():
Packit Service 6754ca
    rgbaFile (0)
Packit Service 6754ca
{
Packit Service 6754ca
    // empty
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
AcesOutputFile::Data::~Data ()
Packit Service 6754ca
{
Packit Service 6754ca
    delete rgbaFile;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
namespace {
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
checkCompression (Compression compression)
Packit Service 6754ca
{
Packit Service 6754ca
    //
Packit Service 6754ca
    // Not all compression methods are allowed in ACES files.
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    switch (compression)
Packit Service 6754ca
    {
Packit Service 6754ca
      case NO_COMPRESSION:
Packit Service 6754ca
      case PIZ_COMPRESSION:
Packit Service 6754ca
      case B44A_COMPRESSION:
Packit Service 6754ca
	break;
Packit Service 6754ca
Packit Service 6754ca
      default:
Packit Service 6754ca
	throw ArgExc ("Invalid compression type for ACES file.");
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
} // namespace
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
AcesOutputFile::AcesOutputFile
Packit Service 6754ca
    (const std::string &name,
Packit Service 6754ca
     const Header &header,
Packit Service 6754ca
     RgbaChannels rgbaChannels,
Packit Service 6754ca
     int numThreads)
Packit Service 6754ca
:
Packit Service 6754ca
    _data (new Data)
Packit Service 6754ca
{
Packit Service 6754ca
    checkCompression (header.compression());
Packit Service 6754ca
Packit Service 6754ca
    Header newHeader = header;
Packit Service 6754ca
    addChromaticities (newHeader, acesChromaticities());
Packit Service 6754ca
    addAdoptedNeutral (newHeader, acesChromaticities().white);
Packit Service 6754ca
Packit Service 6754ca
    _data->rgbaFile = new RgbaOutputFile (name.c_str(),
Packit Service 6754ca
					  newHeader,
Packit Service 6754ca
					  rgbaChannels,
Packit Service 6754ca
					  numThreads);
Packit Service 6754ca
Packit Service 6754ca
    _data->rgbaFile->setYCRounding (7, 6);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
AcesOutputFile::AcesOutputFile
Packit Service 6754ca
    (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os,
Packit Service 6754ca
     const Header &header,
Packit Service 6754ca
     RgbaChannels rgbaChannels,
Packit Service 6754ca
     int numThreads)
Packit Service 6754ca
:
Packit Service 6754ca
    _data (new Data)
Packit Service 6754ca
{
Packit Service 6754ca
    checkCompression (header.compression());
Packit Service 6754ca
Packit Service 6754ca
    Header newHeader = header;
Packit Service 6754ca
    addChromaticities (newHeader, acesChromaticities());
Packit Service 6754ca
    addAdoptedNeutral (newHeader, acesChromaticities().white);
Packit Service 6754ca
Packit Service 6754ca
    _data->rgbaFile = new RgbaOutputFile (os,
Packit Service 6754ca
					  header,
Packit Service 6754ca
					  rgbaChannels,
Packit Service 6754ca
					  numThreads);
Packit Service 6754ca
Packit Service 6754ca
    _data->rgbaFile->setYCRounding (7, 6);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
AcesOutputFile::AcesOutputFile
Packit Service 6754ca
    (const std::string &name,
Packit Service 6754ca
     const IMATH_NAMESPACE::Box2i &displayWindow,
Packit Service 6754ca
     const IMATH_NAMESPACE::Box2i &dataWindow,
Packit Service 6754ca
     RgbaChannels rgbaChannels,
Packit Service 6754ca
     float pixelAspectRatio,
Packit Service 6754ca
     const IMATH_NAMESPACE::V2f screenWindowCenter,
Packit Service 6754ca
     float screenWindowWidth,
Packit Service 6754ca
     LineOrder lineOrder,
Packit Service 6754ca
     Compression compression,
Packit Service 6754ca
     int numThreads)
Packit Service 6754ca
:
Packit Service 6754ca
    _data (new Data)
Packit Service 6754ca
{
Packit Service 6754ca
    checkCompression (compression);
Packit Service 6754ca
Packit Service 6754ca
    Header newHeader (displayWindow,
Packit Service 6754ca
		      dataWindow.isEmpty()? displayWindow: dataWindow,
Packit Service 6754ca
		      pixelAspectRatio,
Packit Service 6754ca
		      screenWindowCenter,
Packit Service 6754ca
		      screenWindowWidth,
Packit Service 6754ca
		      lineOrder,
Packit Service 6754ca
		      compression);
Packit Service 6754ca
Packit Service 6754ca
    addChromaticities (newHeader, acesChromaticities());
Packit Service 6754ca
    addAdoptedNeutral (newHeader, acesChromaticities().white);
Packit Service 6754ca
Packit Service 6754ca
    _data->rgbaFile = new RgbaOutputFile (name.c_str(),
Packit Service 6754ca
					  newHeader,
Packit Service 6754ca
					  rgbaChannels,
Packit Service 6754ca
					  numThreads);
Packit Service 6754ca
Packit Service 6754ca
    _data->rgbaFile->setYCRounding (7, 6);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
AcesOutputFile::AcesOutputFile
Packit Service 6754ca
    (const std::string &name,
Packit Service 6754ca
     int width,
Packit Service 6754ca
     int height,
Packit Service 6754ca
     RgbaChannels rgbaChannels,
Packit Service 6754ca
     float pixelAspectRatio,
Packit Service 6754ca
     const IMATH_NAMESPACE::V2f screenWindowCenter,
Packit Service 6754ca
     float screenWindowWidth,
Packit Service 6754ca
     LineOrder lineOrder,
Packit Service 6754ca
     Compression compression,
Packit Service 6754ca
     int numThreads)
Packit Service 6754ca
:
Packit Service 6754ca
    _data (new Data)
Packit Service 6754ca
{
Packit Service 6754ca
    checkCompression (compression);
Packit Service 6754ca
Packit Service 6754ca
    Header newHeader (width,
Packit Service 6754ca
		      height,
Packit Service 6754ca
		      pixelAspectRatio,
Packit Service 6754ca
		      screenWindowCenter,
Packit Service 6754ca
		      screenWindowWidth,
Packit Service 6754ca
		      lineOrder,
Packit Service 6754ca
		      compression);
Packit Service 6754ca
Packit Service 6754ca
    addChromaticities (newHeader, acesChromaticities());
Packit Service 6754ca
    addAdoptedNeutral (newHeader, acesChromaticities().white);
Packit Service 6754ca
Packit Service 6754ca
    _data->rgbaFile = new RgbaOutputFile (name.c_str(),
Packit Service 6754ca
					  newHeader,
Packit Service 6754ca
					  rgbaChannels,
Packit Service 6754ca
					  numThreads);
Packit Service 6754ca
Packit Service 6754ca
    _data->rgbaFile->setYCRounding (7, 6);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
AcesOutputFile::~AcesOutputFile ()
Packit Service 6754ca
{
Packit Service 6754ca
    delete _data;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void		
Packit Service 6754ca
AcesOutputFile::setFrameBuffer
Packit Service 6754ca
    (const Rgba *base,
Packit Service 6754ca
     size_t xStride,
Packit Service 6754ca
     size_t yStride)
Packit Service 6754ca
{
Packit Service 6754ca
    _data->rgbaFile->setFrameBuffer (base, xStride, yStride);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void		
Packit Service 6754ca
AcesOutputFile::writePixels (int numScanLines)
Packit Service 6754ca
{
Packit Service 6754ca
    _data->rgbaFile->writePixels (numScanLines);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
int			
Packit Service 6754ca
AcesOutputFile::currentScanLine () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->currentScanLine();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
const Header &
Packit Service 6754ca
AcesOutputFile::header () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->header();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
const IMATH_NAMESPACE::Box2i &
Packit Service 6754ca
AcesOutputFile::displayWindow () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->displayWindow();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
const IMATH_NAMESPACE::Box2i &
Packit Service 6754ca
AcesOutputFile::dataWindow () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->dataWindow();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
float		
Packit Service 6754ca
AcesOutputFile::pixelAspectRatio () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->pixelAspectRatio();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
const IMATH_NAMESPACE::V2f
Packit Service 6754ca
AcesOutputFile::screenWindowCenter () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->screenWindowCenter();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
float		
Packit Service 6754ca
AcesOutputFile::screenWindowWidth () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->screenWindowWidth();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
LineOrder		
Packit Service 6754ca
AcesOutputFile::lineOrder () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->lineOrder();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
Compression		
Packit Service 6754ca
AcesOutputFile::compression () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->compression();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
RgbaChannels
Packit Service 6754ca
AcesOutputFile::channels () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->channels();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void		
Packit Service 6754ca
AcesOutputFile::updatePreviewImage (const PreviewRgba pixels[])
Packit Service 6754ca
{
Packit Service 6754ca
    _data->rgbaFile->updatePreviewImage (pixels);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
class AcesInputFile::Data
Packit Service 6754ca
{
Packit Service 6754ca
  public:
Packit Service 6754ca
Packit Service 6754ca
     Data();
Packit Service 6754ca
    ~Data();
Packit Service 6754ca
Packit Service 6754ca
    void		initColorConversion ();
Packit Service 6754ca
Packit Service 6754ca
    RgbaInputFile *	rgbaFile;
Packit Service 6754ca
Packit Service 6754ca
    Rgba *		fbBase;
Packit Service 6754ca
    size_t		fbXStride;
Packit Service 6754ca
    size_t		fbYStride;
Packit Service 6754ca
    int			minX;
Packit Service 6754ca
    int			maxX;
Packit Service 6754ca
Packit Service 6754ca
    bool		mustConvertColor;
Packit Service 6754ca
    M44f		fileToAces;
Packit Service 6754ca
};
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
AcesInputFile::Data::Data ():
Packit Service 6754ca
    rgbaFile (0),
Packit Service 6754ca
    fbBase (0),
Packit Service 6754ca
    fbXStride (0),
Packit Service 6754ca
    fbYStride (0),
Packit Service 6754ca
    minX (0),
Packit Service 6754ca
    maxX (0),
Packit Service 6754ca
    mustConvertColor (false)
Packit Service 6754ca
{
Packit Service 6754ca
    // empty
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
AcesInputFile::Data::~Data ()
Packit Service 6754ca
{
Packit Service 6754ca
    delete rgbaFile;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
AcesInputFile::Data::initColorConversion ()
Packit Service 6754ca
{
Packit Service 6754ca
    const Header &header = rgbaFile->header();
Packit Service 6754ca
Packit Service 6754ca
    Chromaticities fileChr;
Packit Service 6754ca
Packit Service 6754ca
    if (hasChromaticities (header))
Packit Service 6754ca
	fileChr = chromaticities (header);
Packit Service 6754ca
Packit Service 6754ca
    V2f fileNeutral = fileChr.white;
Packit Service 6754ca
Packit Service 6754ca
    if (hasAdoptedNeutral (header))
Packit Service 6754ca
	fileNeutral = adoptedNeutral (header);
Packit Service 6754ca
Packit Service 6754ca
    const Chromaticities acesChr = acesChromaticities();
Packit Service 6754ca
Packit Service 6754ca
    V2f acesNeutral = acesChr.white;
Packit Service 6754ca
Packit Service 6754ca
    if (fileChr.red == acesChr.red &&
Packit Service 6754ca
	fileChr.green == acesChr.green &&
Packit Service 6754ca
	fileChr.blue == acesChr.blue &&
Packit Service 6754ca
	fileChr.white == acesChr.white &&
Packit Service 6754ca
	fileNeutral == acesNeutral)
Packit Service 6754ca
    {
Packit Service 6754ca
	//
Packit Service 6754ca
	// The file already contains ACES data,
Packit Service 6754ca
	// color conversion is not necessary.
Packit Service 6754ca
Packit Service 6754ca
	return;
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    mustConvertColor = true;
Packit Service 6754ca
    minX = header.dataWindow().min.x;
Packit Service 6754ca
    maxX = header.dataWindow().max.x;
Packit Service 6754ca
Packit Service 6754ca
    //
Packit Service 6754ca
    // Create a matrix that transforms colors from the
Packit Service 6754ca
    // RGB space of the input file into the ACES space
Packit Service 6754ca
    // using a color adaptation transform to move the
Packit Service 6754ca
    // white point.
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    //
Packit Service 6754ca
    // We'll need the Bradford cone primary matrix and its inverse
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    static const M44f bradfordCPM
Packit Service 6754ca
	    (0.895100, -0.750200,  0.038900,  0.000000,
Packit Service 6754ca
	     0.266400,  1.713500, -0.068500,  0.000000,
Packit Service 6754ca
	    -0.161400,  0.036700,  1.029600,  0.000000,
Packit Service 6754ca
	     0.000000,  0.000000,  0.000000,  1.000000);
Packit Service 6754ca
Packit Service 6754ca
    const static M44f inverseBradfordCPM
Packit Service 6754ca
	    (0.986993,  0.432305, -0.008529,  0.000000,
Packit Service 6754ca
	    -0.147054,  0.518360,  0.040043,  0.000000,
Packit Service 6754ca
	     0.159963,  0.049291,  0.968487,  0.000000,
Packit Service 6754ca
	     0.000000,  0.000000,  0.000000,  1.000000);
Packit Service 6754ca
Packit Service 6754ca
    //
Packit Service 6754ca
    // Convert the white points of the two RGB spaces to XYZ
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    float fx = fileNeutral.x;
Packit Service 6754ca
    float fy = fileNeutral.y;
Packit Service 6754ca
    V3f fileNeutralXYZ (fx / fy, 1, (1 - fx - fy) / fy);
Packit Service 6754ca
Packit Service 6754ca
    float ax = acesNeutral.x;
Packit Service 6754ca
    float ay = acesNeutral.y;
Packit Service 6754ca
    V3f acesNeutralXYZ (ax / ay, 1, (1 - ax - ay) / ay);
Packit Service 6754ca
Packit Service 6754ca
    //
Packit Service 6754ca
    // Compute the Bradford transformation matrix
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    V3f ratio ((acesNeutralXYZ * bradfordCPM) /
Packit Service 6754ca
	       (fileNeutralXYZ * bradfordCPM));
Packit Service 6754ca
Packit Service 6754ca
    M44f ratioMat (ratio[0], 0,        0,        0,
Packit Service 6754ca
		   0,        ratio[1], 0,        0,
Packit Service 6754ca
		   0,        0,        ratio[2], 0,
Packit Service 6754ca
		   0,        0,        0,        1);
Packit Service 6754ca
Packit Service 6754ca
    M44f bradfordTrans = bradfordCPM *
Packit Service 6754ca
                         ratioMat *
Packit Service 6754ca
			 inverseBradfordCPM;
Packit Service 6754ca
Packit Service 6754ca
    //
Packit Service 6754ca
    // Build a combined file-RGB-to-ACES-RGB conversion matrix
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    fileToAces = RGBtoXYZ (fileChr, 1) * bradfordTrans * XYZtoRGB (acesChr, 1);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
AcesInputFile::AcesInputFile (const std::string &name, int numThreads):
Packit Service 6754ca
    _data (new Data)
Packit Service 6754ca
{
Packit Service 6754ca
    _data->rgbaFile = new RgbaInputFile (name.c_str(), numThreads);
Packit Service 6754ca
    _data->initColorConversion();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
AcesInputFile::AcesInputFile (IStream &is, int numThreads):
Packit Service 6754ca
    _data (new Data)
Packit Service 6754ca
{
Packit Service 6754ca
    _data->rgbaFile = new RgbaInputFile (is, numThreads);
Packit Service 6754ca
    _data->initColorConversion();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
AcesInputFile::~AcesInputFile ()
Packit Service 6754ca
{
Packit Service 6754ca
    delete _data;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void		
Packit Service 6754ca
AcesInputFile::setFrameBuffer (Rgba *base, size_t xStride, size_t yStride)
Packit Service 6754ca
{
Packit Service 6754ca
    _data->rgbaFile->setFrameBuffer (base, xStride, yStride);
Packit Service 6754ca
    _data->fbBase = base;
Packit Service 6754ca
    _data->fbXStride = xStride;
Packit Service 6754ca
    _data->fbYStride = yStride;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void		
Packit Service 6754ca
AcesInputFile::readPixels (int scanLine1, int scanLine2)
Packit Service 6754ca
{
Packit Service 6754ca
    //
Packit Service 6754ca
    // Copy the pixels from the RgbaInputFile into the frame buffer.
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    _data->rgbaFile->readPixels (scanLine1, scanLine2);
Packit Service 6754ca
Packit Service 6754ca
    //
Packit Service 6754ca
    // If the RGB space of the input file is not the same as the ACES
Packit Service 6754ca
    // RGB space, then the pixels in the frame buffer must be transformed
Packit Service 6754ca
    // into the ACES RGB space.
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    if (!_data->mustConvertColor)
Packit Service 6754ca
	return;
Packit Service 6754ca
Packit Service 6754ca
    int minY = min (scanLine1, scanLine2);
Packit Service 6754ca
    int maxY = max (scanLine1, scanLine2);
Packit Service 6754ca
Packit Service 6754ca
    for (int y = minY; y <= maxY; ++y)
Packit Service 6754ca
    {
Packit Service 6754ca
	Rgba *base = _data->fbBase +
Packit Service 6754ca
		     _data->fbXStride * _data->minX +
Packit Service 6754ca
		     _data->fbYStride * y;
Packit Service 6754ca
Packit Service 6754ca
	for (int x = _data->minX; x <= _data->maxX; ++x)
Packit Service 6754ca
	{
Packit Service 6754ca
	    V3f aces = V3f (base->r, base->g, base->b) * _data->fileToAces;
Packit Service 6754ca
Packit Service 6754ca
	    base->r = aces[0];
Packit Service 6754ca
	    base->g = aces[1];
Packit Service 6754ca
	    base->b = aces[2];
Packit Service 6754ca
Packit Service 6754ca
	    base += _data->fbXStride;
Packit Service 6754ca
	}
Packit Service 6754ca
    }
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void		
Packit Service 6754ca
AcesInputFile::readPixels (int scanLine)
Packit Service 6754ca
{
Packit Service 6754ca
    readPixels (scanLine, scanLine);
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
const Header &
Packit Service 6754ca
AcesInputFile::header () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->header();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
const IMATH_NAMESPACE::Box2i &
Packit Service 6754ca
AcesInputFile::displayWindow () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->displayWindow();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
const IMATH_NAMESPACE::Box2i &
Packit Service 6754ca
AcesInputFile::dataWindow () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->dataWindow();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
float
Packit Service 6754ca
AcesInputFile::pixelAspectRatio () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->pixelAspectRatio();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
const IMATH_NAMESPACE::V2f
Packit Service 6754ca
AcesInputFile::screenWindowCenter () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->screenWindowCenter();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
float
Packit Service 6754ca
AcesInputFile::screenWindowWidth () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->screenWindowWidth();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
LineOrder
Packit Service 6754ca
AcesInputFile::lineOrder () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->lineOrder();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
Compression
Packit Service 6754ca
AcesInputFile::compression () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->compression();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
RgbaChannels
Packit Service 6754ca
AcesInputFile::channels () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->channels();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
const char *  
Packit Service 6754ca
AcesInputFile::fileName () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->fileName();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
bool
Packit Service 6754ca
AcesInputFile::isComplete () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->isComplete();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
int
Packit Service 6754ca
AcesInputFile::version () const
Packit Service 6754ca
{
Packit Service 6754ca
    return _data->rgbaFile->version();
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT