DYT/Tool/OpenSceneGraph-3.6.5/include/OpenEXR/ImfAcesFile.h

310 lines
9.6 KiB
C
Raw Normal View History

2024-12-24 23:49:36 +00:00
//
// SPDX-License-Identifier: BSD-3-Clause
// Copyright (c) Contributors to the OpenEXR Project.
//
#ifndef INCLUDED_IMF_ACES_FILE_H
#define INCLUDED_IMF_ACES_FILE_H
//-----------------------------------------------------------------------------
//
// ACES image file I/O.
//
// This header file declares two classes that directly support
// image file input and output according to the Academy Image
// Interchange Framework.
//
// The Academy Image Interchange file format is a subset of OpenEXR:
//
// - Images are stored as scanlines. Tiles are not allowed.
//
// - Images contain three color channels, either
// R, G, B (red, green, blue) or
// Y, RY, BY (luminance, sub-sampled chroma)
//
// - Images may optionally contain an alpha channel.
//
// - Only three compression types are allowed:
// - NO_COMPRESSION (file is not compressed)
// - PIZ_COMPRESSION (lossless)
// - B44A_COMPRESSION (lossy)
//
// - The "chromaticities" header attribute must specify
// the ACES RGB primaries and white point.
//
// class AcesOutputFile writes an OpenEXR file, enforcing the
// restrictions listed above. Pixel data supplied by application
// software must already be in the ACES RGB space.
//
// class AcesInputFile reads an OpenEXR file. Pixel data delivered
// to application software is guaranteed to be in the ACES RGB space.
// If the RGB space of the file is not the same as the ACES space,
// then the pixels are automatically converted: the pixels are
// converted to CIE XYZ, a color adaptation transform shifts the
// white point, and the result is converted to ACES RGB.
//
//-----------------------------------------------------------------------------
#include "ImathBox.h"
#include "ImathVec.h"
#include "ImfExport.h"
#include "ImfForward.h"
#include "ImfHeader.h"
#include "ImfNamespace.h"
#include "ImfRgba.h"
#include "ImfThreading.h"
#include <string>
OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER
//
// ACES red, green, blue and white-point chromaticities.
//
const Chromaticities& acesChromaticities ();
//
// ACES output file.
//
class IMF_EXPORT_TYPE AcesOutputFile
{
public:
//---------------------------------------------------
// Constructor -- header is constructed by the caller
//---------------------------------------------------
IMF_EXPORT
AcesOutputFile (
const std::string& name,
const Header& header,
RgbaChannels rgbaChannels = WRITE_RGBA,
int numThreads = globalThreadCount ());
//----------------------------------------------------
// Constructor -- header is constructed by the caller,
// file is opened by the caller, destructor will not
// automatically close the file.
//----------------------------------------------------
IMF_EXPORT
AcesOutputFile (
OPENEXR_IMF_INTERNAL_NAMESPACE::OStream& os,
const Header& header,
RgbaChannels rgbaChannels = WRITE_RGBA,
int numThreads = globalThreadCount ());
//----------------------------------------------------------------
// Constructor -- header data are explicitly specified as function
// call arguments (empty dataWindow means "same as displayWindow")
//----------------------------------------------------------------
IMF_EXPORT
AcesOutputFile (
const std::string& name,
const IMATH_NAMESPACE::Box2i& displayWindow,
const IMATH_NAMESPACE::Box2i& dataWindow = IMATH_NAMESPACE::Box2i (),
RgbaChannels rgbaChannels = WRITE_RGBA,
float pixelAspectRatio = 1,
const IMATH_NAMESPACE::V2f screenWindowCenter =
IMATH_NAMESPACE::V2f (0, 0),
float screenWindowWidth = 1,
LineOrder lineOrder = INCREASING_Y,
Compression compression = PIZ_COMPRESSION,
int numThreads = globalThreadCount ());
//-----------------------------------------------
// Constructor -- like the previous one, but both
// the display window and the data window are
// Box2i (V2i (0, 0), V2i (width - 1, height -1))
//-----------------------------------------------
IMF_EXPORT
AcesOutputFile (
const std::string& name,
int width,
int height,
RgbaChannels rgbaChannels = WRITE_RGBA,
float pixelAspectRatio = 1,
const IMATH_NAMESPACE::V2f screenWindowCenter =
IMATH_NAMESPACE::V2f (0, 0),
float screenWindowWidth = 1,
LineOrder lineOrder = INCREASING_Y,
Compression compression = PIZ_COMPRESSION,
int numThreads = globalThreadCount ());
//-----------
// Destructor
//-----------
IMF_EXPORT
virtual ~AcesOutputFile ();
//------------------------------------------------
// Define a frame buffer as the pixel data source:
// Pixel (x, y) is at address
//
// base + x * xStride + y * yStride
//
//------------------------------------------------
IMF_EXPORT
void setFrameBuffer (const Rgba* base, size_t xStride, size_t yStride);
//-------------------------------------------------
// Write pixel data (see class Imf::OutputFile)
// The pixels are assumed to contain ACES RGB data.
//-------------------------------------------------
IMF_EXPORT
void writePixels (int numScanLines = 1);
IMF_EXPORT
int currentScanLine () const;
//--------------------------
// Access to the file header
//--------------------------
IMF_EXPORT
const Header& header () const;
IMF_EXPORT
const IMATH_NAMESPACE::Box2i& displayWindow () const;
IMF_EXPORT
const IMATH_NAMESPACE::Box2i& dataWindow () const;
IMF_EXPORT
float pixelAspectRatio () const;
IMF_EXPORT
const IMATH_NAMESPACE::V2f screenWindowCenter () const;
IMF_EXPORT
float screenWindowWidth () const;
IMF_EXPORT
LineOrder lineOrder () const;
IMF_EXPORT
Compression compression () const;
IMF_EXPORT
RgbaChannels channels () const;
// --------------------------------------------------------------------
// Update the preview image (see Imf::OutputFile::updatePreviewImage())
// --------------------------------------------------------------------
IMF_EXPORT
void updatePreviewImage (const PreviewRgba[]);
private:
AcesOutputFile (const AcesOutputFile&) = delete;
AcesOutputFile& operator= (const AcesOutputFile&) = delete;
AcesOutputFile (AcesOutputFile&&) = delete;
AcesOutputFile& operator= (AcesOutputFile&&) = delete;
class IMF_HIDDEN Data;
Data* _data;
};
//
// ACES input file
//
class IMF_EXPORT_TYPE AcesInputFile
{
public:
//-------------------------------------------------------
// Constructor -- opens the file with the specified name,
// destructor will automatically close the file.
//-------------------------------------------------------
IMF_EXPORT
AcesInputFile (
const std::string& name, int numThreads = globalThreadCount ());
//-----------------------------------------------------------
// Constructor -- attaches the new AcesInputFile object to a
// file that has already been opened by the caller.
// Destroying the AcesInputFile object will not automatically
// close the file.
//-----------------------------------------------------------
IMF_EXPORT
AcesInputFile (
OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is,
int numThreads = globalThreadCount ());
//-----------
// Destructor
//-----------
IMF_EXPORT
virtual ~AcesInputFile ();
//-----------------------------------------------------
// Define a frame buffer as the pixel data destination:
// Pixel (x, y) is at address
//
// base + x * xStride + y * yStride
//
//-----------------------------------------------------
IMF_EXPORT
void setFrameBuffer (Rgba* base, size_t xStride, size_t yStride);
//--------------------------------------------
// Read pixel data (see class Imf::InputFile)
// Pixels returned will contain ACES RGB data.
//--------------------------------------------
IMF_EXPORT
void readPixels (int scanLine1, int scanLine2);
IMF_EXPORT
void readPixels (int scanLine);
//--------------------------
// Access to the file header
//--------------------------
IMF_EXPORT
const Header& header () const;
IMF_EXPORT
const IMATH_NAMESPACE::Box2i& displayWindow () const;
IMF_EXPORT
const IMATH_NAMESPACE::Box2i& dataWindow () const;
IMF_EXPORT
float pixelAspectRatio () const;
IMF_EXPORT
const IMATH_NAMESPACE::V2f screenWindowCenter () const;
IMF_EXPORT
float screenWindowWidth () const;
IMF_EXPORT
LineOrder lineOrder () const;
IMF_EXPORT
Compression compression () const;
IMF_EXPORT
RgbaChannels channels () const;
IMF_EXPORT
const char* fileName () const;
IMF_EXPORT
bool isComplete () const;
//----------------------------------
// Access to the file format version
//----------------------------------
IMF_EXPORT
int version () const;
private:
AcesInputFile (const AcesInputFile&) = delete;
AcesInputFile& operator= (const AcesInputFile&) = delete;
AcesInputFile (AcesInputFile&&) = delete;
AcesInputFile& operator= (AcesInputFile&&) = delete;
class IMF_HIDDEN Data;
Data* _data;
};
OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT
#endif