Blame IlmImf/ImfAcesFile.cpp

Packit 0d464f
///////////////////////////////////////////////////////////////////////////
Packit 0d464f
//
Packit 0d464f
// Copyright (c) 2007, Industrial Light & Magic, a division of Lucas
Packit 0d464f
// Digital Ltd. LLC
Packit 0d464f
// 
Packit 0d464f
// All rights reserved.
Packit 0d464f
// 
Packit 0d464f
// Redistribution and use in source and binary forms, with or without
Packit 0d464f
// modification, are permitted provided that the following conditions are
Packit 0d464f
// met:
Packit 0d464f
// *       Redistributions of source code must retain the above copyright
Packit 0d464f
// notice, this list of conditions and the following disclaimer.
Packit 0d464f
// *       Redistributions in binary form must reproduce the above
Packit 0d464f
// copyright notice, this list of conditions and the following disclaimer
Packit 0d464f
// in the documentation and/or other materials provided with the
Packit 0d464f
// distribution.
Packit 0d464f
// *       Neither the name of Industrial Light & Magic nor the names of
Packit 0d464f
// its contributors may be used to endorse or promote products derived
Packit 0d464f
// from this software without specific prior written permission. 
Packit 0d464f
// 
Packit 0d464f
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit 0d464f
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit 0d464f
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit 0d464f
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit 0d464f
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit 0d464f
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit 0d464f
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit 0d464f
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit 0d464f
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit 0d464f
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit 0d464f
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 0d464f
//
Packit 0d464f
///////////////////////////////////////////////////////////////////////////
Packit 0d464f
Packit 0d464f
//-----------------------------------------------------------------------------
Packit 0d464f
//
Packit 0d464f
//	ACES image file I/O.
Packit 0d464f
//	
Packit 0d464f
//-----------------------------------------------------------------------------
Packit 0d464f
Packit 0d464f
#include <ImfAcesFile.h>
Packit 0d464f
#include <ImfRgbaFile.h>
Packit 0d464f
#include <ImfStandardAttributes.h>
Packit 0d464f
#include <Iex.h>
Packit 0d464f
#include <algorithm>
Packit 0d464f
Packit 0d464f
using namespace std;
Packit 0d464f
using namespace IMATH_NAMESPACE;
Packit 0d464f
using namespace IEX_NAMESPACE;
Packit 0d464f
#include "ImfNamespace.h"
Packit 0d464f
Packit 0d464f
OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER
Packit 0d464f
Packit 0d464f
Packit 0d464f
const Chromaticities &
Packit 0d464f
acesChromaticities ()
Packit 0d464f
{
Packit 0d464f
    static const Chromaticities acesChr 
Packit 0d464f
	    (V2f (0.73470,  0.26530),	// red
Packit 0d464f
	     V2f (0.00000,  1.00000),	// green
Packit 0d464f
	     V2f (0.00010, -0.07700),	// blue
Packit 0d464f
	     V2f (0.32168,  0.33767));	// white
Packit 0d464f
Packit 0d464f
    return acesChr;
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
class AcesOutputFile::Data
Packit 0d464f
{
Packit 0d464f
  public:
Packit 0d464f
Packit 0d464f
     Data();
Packit 0d464f
    ~Data();
Packit 0d464f
Packit 0d464f
    RgbaOutputFile *	rgbaFile;
Packit 0d464f
};
Packit 0d464f
Packit 0d464f
Packit 0d464f
AcesOutputFile::Data::Data ():
Packit 0d464f
    rgbaFile (0)
Packit 0d464f
{
Packit 0d464f
    // empty
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
AcesOutputFile::Data::~Data ()
Packit 0d464f
{
Packit 0d464f
    delete rgbaFile;
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
namespace {
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
checkCompression (Compression compression)
Packit 0d464f
{
Packit 0d464f
    //
Packit 0d464f
    // Not all compression methods are allowed in ACES files.
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    switch (compression)
Packit 0d464f
    {
Packit 0d464f
      case NO_COMPRESSION:
Packit 0d464f
      case PIZ_COMPRESSION:
Packit 0d464f
      case B44A_COMPRESSION:
Packit 0d464f
	break;
Packit 0d464f
Packit 0d464f
      default:
Packit 0d464f
	throw ArgExc ("Invalid compression type for ACES file.");
Packit 0d464f
    }
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
} // namespace
Packit 0d464f
Packit 0d464f
Packit 0d464f
AcesOutputFile::AcesOutputFile
Packit 0d464f
    (const std::string &name,
Packit 0d464f
     const Header &header,
Packit 0d464f
     RgbaChannels rgbaChannels,
Packit 0d464f
     int numThreads)
Packit 0d464f
:
Packit 0d464f
    _data (new Data)
Packit 0d464f
{
Packit 0d464f
    checkCompression (header.compression());
Packit 0d464f
Packit 0d464f
    Header newHeader = header;
Packit 0d464f
    addChromaticities (newHeader, acesChromaticities());
Packit 0d464f
    addAdoptedNeutral (newHeader, acesChromaticities().white);
Packit 0d464f
Packit 0d464f
    _data->rgbaFile = new RgbaOutputFile (name.c_str(),
Packit 0d464f
					  newHeader,
Packit 0d464f
					  rgbaChannels,
Packit 0d464f
					  numThreads);
Packit 0d464f
Packit 0d464f
    _data->rgbaFile->setYCRounding (7, 6);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
AcesOutputFile::AcesOutputFile
Packit 0d464f
    (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os,
Packit 0d464f
     const Header &header,
Packit 0d464f
     RgbaChannels rgbaChannels,
Packit 0d464f
     int numThreads)
Packit 0d464f
:
Packit 0d464f
    _data (new Data)
Packit 0d464f
{
Packit 0d464f
    checkCompression (header.compression());
Packit 0d464f
Packit 0d464f
    Header newHeader = header;
Packit 0d464f
    addChromaticities (newHeader, acesChromaticities());
Packit 0d464f
    addAdoptedNeutral (newHeader, acesChromaticities().white);
Packit 0d464f
Packit 0d464f
    _data->rgbaFile = new RgbaOutputFile (os,
Packit 0d464f
					  header,
Packit 0d464f
					  rgbaChannels,
Packit 0d464f
					  numThreads);
Packit 0d464f
Packit 0d464f
    _data->rgbaFile->setYCRounding (7, 6);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
AcesOutputFile::AcesOutputFile
Packit 0d464f
    (const std::string &name,
Packit 0d464f
     const IMATH_NAMESPACE::Box2i &displayWindow,
Packit 0d464f
     const IMATH_NAMESPACE::Box2i &dataWindow,
Packit 0d464f
     RgbaChannels rgbaChannels,
Packit 0d464f
     float pixelAspectRatio,
Packit 0d464f
     const IMATH_NAMESPACE::V2f screenWindowCenter,
Packit 0d464f
     float screenWindowWidth,
Packit 0d464f
     LineOrder lineOrder,
Packit 0d464f
     Compression compression,
Packit 0d464f
     int numThreads)
Packit 0d464f
:
Packit 0d464f
    _data (new Data)
Packit 0d464f
{
Packit 0d464f
    checkCompression (compression);
Packit 0d464f
Packit 0d464f
    Header newHeader (displayWindow,
Packit 0d464f
		      dataWindow.isEmpty()? displayWindow: dataWindow,
Packit 0d464f
		      pixelAspectRatio,
Packit 0d464f
		      screenWindowCenter,
Packit 0d464f
		      screenWindowWidth,
Packit 0d464f
		      lineOrder,
Packit 0d464f
		      compression);
Packit 0d464f
Packit 0d464f
    addChromaticities (newHeader, acesChromaticities());
Packit 0d464f
    addAdoptedNeutral (newHeader, acesChromaticities().white);
Packit 0d464f
Packit 0d464f
    _data->rgbaFile = new RgbaOutputFile (name.c_str(),
Packit 0d464f
					  newHeader,
Packit 0d464f
					  rgbaChannels,
Packit 0d464f
					  numThreads);
Packit 0d464f
Packit 0d464f
    _data->rgbaFile->setYCRounding (7, 6);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
AcesOutputFile::AcesOutputFile
Packit 0d464f
    (const std::string &name,
Packit 0d464f
     int width,
Packit 0d464f
     int height,
Packit 0d464f
     RgbaChannels rgbaChannels,
Packit 0d464f
     float pixelAspectRatio,
Packit 0d464f
     const IMATH_NAMESPACE::V2f screenWindowCenter,
Packit 0d464f
     float screenWindowWidth,
Packit 0d464f
     LineOrder lineOrder,
Packit 0d464f
     Compression compression,
Packit 0d464f
     int numThreads)
Packit 0d464f
:
Packit 0d464f
    _data (new Data)
Packit 0d464f
{
Packit 0d464f
    checkCompression (compression);
Packit 0d464f
Packit 0d464f
    Header newHeader (width,
Packit 0d464f
		      height,
Packit 0d464f
		      pixelAspectRatio,
Packit 0d464f
		      screenWindowCenter,
Packit 0d464f
		      screenWindowWidth,
Packit 0d464f
		      lineOrder,
Packit 0d464f
		      compression);
Packit 0d464f
Packit 0d464f
    addChromaticities (newHeader, acesChromaticities());
Packit 0d464f
    addAdoptedNeutral (newHeader, acesChromaticities().white);
Packit 0d464f
Packit 0d464f
    _data->rgbaFile = new RgbaOutputFile (name.c_str(),
Packit 0d464f
					  newHeader,
Packit 0d464f
					  rgbaChannels,
Packit 0d464f
					  numThreads);
Packit 0d464f
Packit 0d464f
    _data->rgbaFile->setYCRounding (7, 6);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
AcesOutputFile::~AcesOutputFile ()
Packit 0d464f
{
Packit 0d464f
    delete _data;
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void		
Packit 0d464f
AcesOutputFile::setFrameBuffer
Packit 0d464f
    (const Rgba *base,
Packit 0d464f
     size_t xStride,
Packit 0d464f
     size_t yStride)
Packit 0d464f
{
Packit 0d464f
    _data->rgbaFile->setFrameBuffer (base, xStride, yStride);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void		
Packit 0d464f
AcesOutputFile::writePixels (int numScanLines)
Packit 0d464f
{
Packit 0d464f
    _data->rgbaFile->writePixels (numScanLines);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
int			
Packit 0d464f
AcesOutputFile::currentScanLine () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->currentScanLine();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const Header &
Packit 0d464f
AcesOutputFile::header () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->header();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const IMATH_NAMESPACE::Box2i &
Packit 0d464f
AcesOutputFile::displayWindow () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->displayWindow();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const IMATH_NAMESPACE::Box2i &
Packit 0d464f
AcesOutputFile::dataWindow () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->dataWindow();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
float		
Packit 0d464f
AcesOutputFile::pixelAspectRatio () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->pixelAspectRatio();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const IMATH_NAMESPACE::V2f
Packit 0d464f
AcesOutputFile::screenWindowCenter () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->screenWindowCenter();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
float		
Packit 0d464f
AcesOutputFile::screenWindowWidth () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->screenWindowWidth();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
LineOrder		
Packit 0d464f
AcesOutputFile::lineOrder () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->lineOrder();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
Compression		
Packit 0d464f
AcesOutputFile::compression () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->compression();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
RgbaChannels
Packit 0d464f
AcesOutputFile::channels () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->channels();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void		
Packit 0d464f
AcesOutputFile::updatePreviewImage (const PreviewRgba pixels[])
Packit 0d464f
{
Packit 0d464f
    _data->rgbaFile->updatePreviewImage (pixels);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
class AcesInputFile::Data
Packit 0d464f
{
Packit 0d464f
  public:
Packit 0d464f
Packit 0d464f
     Data();
Packit 0d464f
    ~Data();
Packit 0d464f
Packit 0d464f
    void		initColorConversion ();
Packit 0d464f
Packit 0d464f
    RgbaInputFile *	rgbaFile;
Packit 0d464f
Packit 0d464f
    Rgba *		fbBase;
Packit 0d464f
    size_t		fbXStride;
Packit 0d464f
    size_t		fbYStride;
Packit 0d464f
    int			minX;
Packit 0d464f
    int			maxX;
Packit 0d464f
Packit 0d464f
    bool		mustConvertColor;
Packit 0d464f
    M44f		fileToAces;
Packit 0d464f
};
Packit 0d464f
Packit 0d464f
Packit 0d464f
AcesInputFile::Data::Data ():
Packit 0d464f
    rgbaFile (0),
Packit 0d464f
    fbBase (0),
Packit 0d464f
    fbXStride (0),
Packit 0d464f
    fbYStride (0),
Packit 0d464f
    minX (0),
Packit 0d464f
    maxX (0),
Packit 0d464f
    mustConvertColor (false)
Packit 0d464f
{
Packit 0d464f
    // empty
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
AcesInputFile::Data::~Data ()
Packit 0d464f
{
Packit 0d464f
    delete rgbaFile;
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
AcesInputFile::Data::initColorConversion ()
Packit 0d464f
{
Packit 0d464f
    const Header &header = rgbaFile->header();
Packit 0d464f
Packit 0d464f
    Chromaticities fileChr;
Packit 0d464f
Packit 0d464f
    if (hasChromaticities (header))
Packit 0d464f
	fileChr = chromaticities (header);
Packit 0d464f
Packit 0d464f
    V2f fileNeutral = fileChr.white;
Packit 0d464f
Packit 0d464f
    if (hasAdoptedNeutral (header))
Packit 0d464f
	fileNeutral = adoptedNeutral (header);
Packit 0d464f
Packit 0d464f
    const Chromaticities acesChr = acesChromaticities();
Packit 0d464f
Packit 0d464f
    V2f acesNeutral = acesChr.white;
Packit 0d464f
Packit 0d464f
    if (fileChr.red == acesChr.red &&
Packit 0d464f
	fileChr.green == acesChr.green &&
Packit 0d464f
	fileChr.blue == acesChr.blue &&
Packit 0d464f
	fileChr.white == acesChr.white &&
Packit 0d464f
	fileNeutral == acesNeutral)
Packit 0d464f
    {
Packit 0d464f
	//
Packit 0d464f
	// The file already contains ACES data,
Packit 0d464f
	// color conversion is not necessary.
Packit 0d464f
Packit 0d464f
	return;
Packit 0d464f
    }
Packit 0d464f
Packit 0d464f
    mustConvertColor = true;
Packit 0d464f
    minX = header.dataWindow().min.x;
Packit 0d464f
    maxX = header.dataWindow().max.x;
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // Create a matrix that transforms colors from the
Packit 0d464f
    // RGB space of the input file into the ACES space
Packit 0d464f
    // using a color adaptation transform to move the
Packit 0d464f
    // white point.
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // We'll need the Bradford cone primary matrix and its inverse
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    static const M44f bradfordCPM
Packit 0d464f
	    (0.895100, -0.750200,  0.038900,  0.000000,
Packit 0d464f
	     0.266400,  1.713500, -0.068500,  0.000000,
Packit 0d464f
	    -0.161400,  0.036700,  1.029600,  0.000000,
Packit 0d464f
	     0.000000,  0.000000,  0.000000,  1.000000);
Packit 0d464f
Packit 0d464f
    const static M44f inverseBradfordCPM
Packit 0d464f
	    (0.986993,  0.432305, -0.008529,  0.000000,
Packit 0d464f
	    -0.147054,  0.518360,  0.040043,  0.000000,
Packit 0d464f
	     0.159963,  0.049291,  0.968487,  0.000000,
Packit 0d464f
	     0.000000,  0.000000,  0.000000,  1.000000);
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // Convert the white points of the two RGB spaces to XYZ
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    float fx = fileNeutral.x;
Packit 0d464f
    float fy = fileNeutral.y;
Packit 0d464f
    V3f fileNeutralXYZ (fx / fy, 1, (1 - fx - fy) / fy);
Packit 0d464f
Packit 0d464f
    float ax = acesNeutral.x;
Packit 0d464f
    float ay = acesNeutral.y;
Packit 0d464f
    V3f acesNeutralXYZ (ax / ay, 1, (1 - ax - ay) / ay);
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // Compute the Bradford transformation matrix
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    V3f ratio ((acesNeutralXYZ * bradfordCPM) /
Packit 0d464f
	       (fileNeutralXYZ * bradfordCPM));
Packit 0d464f
Packit 0d464f
    M44f ratioMat (ratio[0], 0,        0,        0,
Packit 0d464f
		   0,        ratio[1], 0,        0,
Packit 0d464f
		   0,        0,        ratio[2], 0,
Packit 0d464f
		   0,        0,        0,        1);
Packit 0d464f
Packit 0d464f
    M44f bradfordTrans = bradfordCPM *
Packit 0d464f
                         ratioMat *
Packit 0d464f
			 inverseBradfordCPM;
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // Build a combined file-RGB-to-ACES-RGB conversion matrix
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    fileToAces = RGBtoXYZ (fileChr, 1) * bradfordTrans * XYZtoRGB (acesChr, 1);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
AcesInputFile::AcesInputFile (const std::string &name, int numThreads):
Packit 0d464f
    _data (new Data)
Packit 0d464f
{
Packit 0d464f
    _data->rgbaFile = new RgbaInputFile (name.c_str(), numThreads);
Packit 0d464f
    _data->initColorConversion();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
AcesInputFile::AcesInputFile (IStream &is, int numThreads):
Packit 0d464f
    _data (new Data)
Packit 0d464f
{
Packit 0d464f
    _data->rgbaFile = new RgbaInputFile (is, numThreads);
Packit 0d464f
    _data->initColorConversion();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
AcesInputFile::~AcesInputFile ()
Packit 0d464f
{
Packit 0d464f
    delete _data;
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void		
Packit 0d464f
AcesInputFile::setFrameBuffer (Rgba *base, size_t xStride, size_t yStride)
Packit 0d464f
{
Packit 0d464f
    _data->rgbaFile->setFrameBuffer (base, xStride, yStride);
Packit 0d464f
    _data->fbBase = base;
Packit 0d464f
    _data->fbXStride = xStride;
Packit 0d464f
    _data->fbYStride = yStride;
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void		
Packit 0d464f
AcesInputFile::readPixels (int scanLine1, int scanLine2)
Packit 0d464f
{
Packit 0d464f
    //
Packit 0d464f
    // Copy the pixels from the RgbaInputFile into the frame buffer.
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    _data->rgbaFile->readPixels (scanLine1, scanLine2);
Packit 0d464f
Packit 0d464f
    //
Packit 0d464f
    // If the RGB space of the input file is not the same as the ACES
Packit 0d464f
    // RGB space, then the pixels in the frame buffer must be transformed
Packit 0d464f
    // into the ACES RGB space.
Packit 0d464f
    //
Packit 0d464f
Packit 0d464f
    if (!_data->mustConvertColor)
Packit 0d464f
	return;
Packit 0d464f
Packit 0d464f
    int minY = min (scanLine1, scanLine2);
Packit 0d464f
    int maxY = max (scanLine1, scanLine2);
Packit 0d464f
Packit 0d464f
    for (int y = minY; y <= maxY; ++y)
Packit 0d464f
    {
Packit 0d464f
	Rgba *base = _data->fbBase +
Packit 0d464f
		     _data->fbXStride * _data->minX +
Packit 0d464f
		     _data->fbYStride * y;
Packit 0d464f
Packit 0d464f
	for (int x = _data->minX; x <= _data->maxX; ++x)
Packit 0d464f
	{
Packit 0d464f
	    V3f aces = V3f (base->r, base->g, base->b) * _data->fileToAces;
Packit 0d464f
Packit 0d464f
	    base->r = aces[0];
Packit 0d464f
	    base->g = aces[1];
Packit 0d464f
	    base->b = aces[2];
Packit 0d464f
Packit 0d464f
	    base += _data->fbXStride;
Packit 0d464f
	}
Packit 0d464f
    }
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void		
Packit 0d464f
AcesInputFile::readPixels (int scanLine)
Packit 0d464f
{
Packit 0d464f
    readPixels (scanLine, scanLine);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const Header &
Packit 0d464f
AcesInputFile::header () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->header();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const IMATH_NAMESPACE::Box2i &
Packit 0d464f
AcesInputFile::displayWindow () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->displayWindow();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const IMATH_NAMESPACE::Box2i &
Packit 0d464f
AcesInputFile::dataWindow () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->dataWindow();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
float
Packit 0d464f
AcesInputFile::pixelAspectRatio () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->pixelAspectRatio();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const IMATH_NAMESPACE::V2f
Packit 0d464f
AcesInputFile::screenWindowCenter () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->screenWindowCenter();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
float
Packit 0d464f
AcesInputFile::screenWindowWidth () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->screenWindowWidth();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
LineOrder
Packit 0d464f
AcesInputFile::lineOrder () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->lineOrder();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
Compression
Packit 0d464f
AcesInputFile::compression () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->compression();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
RgbaChannels
Packit 0d464f
AcesInputFile::channels () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->channels();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
const char *  
Packit 0d464f
AcesInputFile::fileName () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->fileName();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
bool
Packit 0d464f
AcesInputFile::isComplete () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->isComplete();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
int
Packit 0d464f
AcesInputFile::version () const
Packit 0d464f
{
Packit 0d464f
    return _data->rgbaFile->version();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT