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