Blender V5.0
openexr_api.cpp File Reference
#include "IMB_filetype.hh"
#include <algorithm>
#include <cctype>
#include <cerrno>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <fcntl.h>
#include <fstream>
#include <iostream>
#include <set>
#include <string>
#include <OpenEXR/OpenEXRConfig.h>
#include <OpenEXR/half.h>
#include <OpenEXR/Iex.h>
#include <OpenEXR/ImfArray.h>
#include <OpenEXR/ImfAttribute.h>
#include <OpenEXR/ImfChannelList.h>
#include <OpenEXR/ImfChromaticities.h>
#include <OpenEXR/ImfCompression.h>
#include <OpenEXR/ImfCompressionAttribute.h>
#include <OpenEXR/ImfIO.h>
#include <OpenEXR/ImfInputFile.h>
#include <OpenEXR/ImfIntAttribute.h>
#include <OpenEXR/ImfOutputFile.h>
#include <OpenEXR/ImfPixelType.h>
#include <OpenEXR/ImfPreviewImage.h>
#include <OpenEXR/ImfRgbaFile.h>
#include <OpenEXR/ImfStandardAttributes.h>
#include <OpenEXR/ImfStringAttribute.h>
#include <OpenEXR/ImfVersion.h>
#include <OpenEXR/ImfInputPart.h>
#include <OpenEXR/ImfMultiPartInputFile.h>
#include <OpenEXR/ImfMultiPartOutputFile.h>
#include <OpenEXR/ImfMultiView.h>
#include <OpenEXR/ImfOutputPart.h>
#include <OpenEXR/ImfPartHelper.h>
#include <OpenEXR/ImfPartType.h>
#include <OpenEXR/ImfTiledOutputPart.h>
#include "DNA_scene_types.h"
#include <openexr_api.h>
#include <unistd.h>
#include "MEM_guardedalloc.h"
#include "BLI_fileops.h"
#include "BLI_listbase.h"
#include "BLI_math_base.hh"
#include "BLI_math_color.h"
#include "BLI_mmap.h"
#include "BLI_string.h"
#include "BLI_string_ref.hh"
#include "BLI_string_utf8.h"
#include "BLI_threads.h"
#include "BKE_blender_version.h"
#include "BKE_idprop.hh"
#include "BKE_image.hh"
#include "CLG_log.h"
#include "IMB_allocimbuf.hh"
#include "IMB_colormanagement.hh"
#include "IMB_imbuf.hh"
#include "IMB_imbuf_types.hh"
#include "IMB_metadata.hh"
#include "IMB_openexr.hh"

Go to the source code of this file.

Classes

class  IMemStream
class  IMMapStream
class  IFileStream
class  OMemStream
class  OFileStream
struct  _RGBAZ
struct  ExrChannel
struct  ExrPass
struct  ExrLayer
struct  ExrHandle

Macros

#define COMBINED_OPENEXR_VERSION   ((10000 * OPENEXR_VERSION_MAJOR) + (100 * OPENEXR_VERSION_MINOR) + OPENEXR_VERSION_PATCH)
#define exr_file_offset_t   Int64

Typedefs

using RGBAZ = _RGBAZ

Functions

static bool exr_has_multiview (MultiPartInputFile &file)
static bool exr_has_multipart_file (MultiPartInputFile &file)
static bool exr_has_alpha (MultiPartInputFile &file)
static const ColorSpaceimb_exr_part_colorspace (const Header &header)
static half float_to_half_safe (const float value)
bool imb_is_a_openexr (const uchar *mem, const size_t size)
static int openexr_jpg_like_quality_to_dwa_quality (int q)
static void openexr_header_compression (Header *header, int compression, int quality)
static int openexr_header_get_compression (const Header &header)
static void openexr_header_metadata_global (Header *header, IDProperty *metadata, const double ppm[2])
static void openexr_header_metadata_colorspace (Header *header, const ColorSpace *colorspace)
static void openexr_header_metadata_colorspace (Header *header, ImBuf *ibuf)
static void openexr_header_metadata_callback (void *data, const char *propname, char *prop, int)
static bool imb_save_openexr_half (ImBuf *ibuf, const char *filepath, const int flags)
static bool imb_save_openexr_float (ImBuf *ibuf, const char *filepath, const int flags)
bool imb_save_openexr (ImBuf *ibuf, const char *filepath, int flags)
static bool imb_exr_multilayer_parse_channels_from_file (ExrHandle *handle)
static blender::Vector< ExrChannelexr_channels_in_multi_part_file (const MultiPartInputFile &file, const bool parse_layers)
ExrHandleIMB_exr_get_handle (const bool write_multipart)
void IMB_exr_add_view (ExrHandle *handle, const char *name)
static int imb_exr_get_multiView_id (StringVector &views, const std::string &name)
static StringVector imb_exr_get_views (MultiPartInputFile &file)
void IMB_exr_add_channels (ExrHandle *handle, blender::StringRefNull layerpassname, blender::StringRefNull channelnames, blender::StringRefNull viewname, blender::StringRefNull colorspace, size_t xstride, size_t ystride, float *rect, bool use_half_float)
static void openexr_header_metadata_multi (ExrHandle *handle, Header &header, const double ppm[2], const StampData *stamp)
bool IMB_exr_begin_write (ExrHandle *handle, const char *filepath, int width, int height, const double ppm[2], int compress, int quality, const StampData *stamp)
bool IMB_exr_begin_read (ExrHandle *handle, const char *filepath, int *width, int *height, const bool parse_channels)
bool IMB_exr_set_channel (ExrHandle *handle, blender::StringRefNull full_name, int xstride, int ystride, float *rect)
void IMB_exr_write_channels (ExrHandle *handle)
void IMB_exr_read_channels (ExrHandle *handle)
void IMB_exr_multilayer_convert (ExrHandle *handle, void *base, void *(*addview)(void *base, const char *str), void *(*addlayer)(void *base, const char *str), void(*addpass)(void *base, void *lay, const char *str, float *rect, int totchan, const char *chan_id, const char *view))
void IMB_exr_close (ExrHandle *handle)
static int imb_exr_split_token (const char *str, const char *end, const char **token)
static void imb_exr_pass_name_from_channel (char *passname, const ExrChannel &echan, const char *channelname, const bool has_xyz_channels)
static void imb_exr_pass_name_from_channel_name (char *passname, const ExrChannel &, const char *channelname, const bool)
static int imb_exr_split_channel_name (ExrChannel &echan, char *layname, char *passname, bool has_xyz_channels)
static ExrLayerimb_exr_get_layer (ExrHandle *handle, const char *layname)
static ExrPassimb_exr_get_pass (ExrLayer &lay, const char *passname)
static bool exr_has_xyz_channels (ExrHandle *exr_handle)
static ExrHandleimb_exr_begin_read_mem (IStream &file_stream, MultiPartInputFile &file, int width, int height)
static void exr_print_filecontents (MultiPartInputFile &file)
static const char * exr_rgba_channelname (MultiPartInputFile &file, const char *chan)
static int exr_has_rgb (MultiPartInputFile &file, const char *rgb_channels[3])
static bool exr_has_luma (MultiPartInputFile &file)
static bool exr_has_chroma (MultiPartInputFile &file)
static bool exr_has_xyz (MultiPartInputFile &file)
static bool exr_is_half_float (MultiPartInputFile &file)
static bool imb_exr_is_multilayer_file (MultiPartInputFile &file)
static bool imb_exr_is_multi (MultiPartInputFile &file)
bool IMB_exr_has_multilayer (ExrHandle *handle)
static bool imb_check_chromaticity_val (float test_v, float ref_v)
static bool imb_check_chromaticity_matches (const Imf::Chromaticities &a, const Imf::Chromaticities &b)
static void imb_exr_set_known_colorspace (const Header &header, ImFileColorSpace &r_colorspace)
static bool exr_get_ppm (MultiPartInputFile &file, double ppm[2])
bool IMB_exr_get_ppm (ExrHandle *handle, double ppm[2])
ImBufimb_load_openexr (const uchar *mem, size_t size, int flags, ImFileColorSpace &r_colorspace)
ImBufimb_load_filepath_thumbnail_openexr (const char *filepath, const int, const size_t max_thumb_size, ImFileColorSpace &r_colorspace, size_t *r_width, size_t *r_height)
void imb_initopenexr ()
void imb_exitopenexr ()

Variables

static CLG_LogRef LOG = {"image.openexr"}
static Imf::Chromaticities CHROMATICITIES_XYZ_E
static Imf::Chromaticities CHROMATICITIES_ACES_2065_1

Macro Definition Documentation

◆ COMBINED_OPENEXR_VERSION

#define COMBINED_OPENEXR_VERSION   ((10000 * OPENEXR_VERSION_MAJOR) + (100 * OPENEXR_VERSION_MINOR) + OPENEXR_VERSION_PATCH)

Definition at line 27 of file openexr_api.cpp.

◆ exr_file_offset_t

Typedef Documentation

◆ RGBAZ

using RGBAZ = _RGBAZ

Definition at line 397 of file openexr_api.cpp.

Function Documentation

◆ exr_channels_in_multi_part_file()

◆ exr_get_ppm()

bool exr_get_ppm ( MultiPartInputFile & file,
double ppm[2] )
static

Definition at line 2035 of file openexr_api.cpp.

Referenced by IMB_exr_get_ppm(), and imb_load_openexr().

◆ exr_has_alpha()

bool exr_has_alpha ( MultiPartInputFile & file)
static

Definition at line 1881 of file openexr_api.cpp.

Referenced by imb_load_openexr().

◆ exr_has_chroma()

bool exr_has_chroma ( MultiPartInputFile & file)
static

Definition at line 1874 of file openexr_api.cpp.

Referenced by imb_load_openexr().

◆ exr_has_luma()

bool exr_has_luma ( MultiPartInputFile & file)
static

Definition at line 1865 of file openexr_api.cpp.

Referenced by imb_load_openexr().

◆ exr_has_multipart_file()

bool exr_has_multipart_file ( MultiPartInputFile & file)
static

Definition at line 1933 of file openexr_api.cpp.

Referenced by imb_exr_is_multi().

◆ exr_has_multiview()

bool exr_has_multiview ( MultiPartInputFile & file)
static

Definition at line 1922 of file openexr_api.cpp.

Referenced by imb_exr_is_multi().

◆ exr_has_rgb()

int exr_has_rgb ( MultiPartInputFile & file,
const char * rgb_channels[3] )
static

Definition at line 1834 of file openexr_api.cpp.

References i.

Referenced by imb_load_openexr().

◆ exr_has_xyz()

bool exr_has_xyz ( MultiPartInputFile & file)
static

Definition at line 1887 of file openexr_api.cpp.

Referenced by imb_load_openexr().

◆ exr_has_xyz_channels()

bool exr_has_xyz_channels ( ExrHandle * exr_handle)
static

◆ exr_is_half_float()

bool exr_is_half_float ( MultiPartInputFile & file)
static

Definition at line 1898 of file openexr_api.cpp.

References HALF, and i.

Referenced by imb_load_openexr().

◆ exr_print_filecontents()

void exr_print_filecontents ( MultiPartInputFile & file)
static

Definition at line 1787 of file openexr_api.cpp.

References CLOG_DEBUG, i, LOG, and view.

Referenced by imb_load_openexr().

◆ exr_rgba_channelname()

const char * exr_rgba_channelname ( MultiPartInputFile & file,
const char * chan )
static

Definition at line 1817 of file openexr_api.cpp.

References BLI_strcasecmp(), ExrHandle::channels, i, len, and str.

Referenced by imb_load_openexr().

◆ float_to_half_safe()

half float_to_half_safe ( const float value)
static

Definition at line 399 of file openexr_api.cpp.

References clamp_f().

Referenced by IMB_exr_write_channels(), and imb_save_openexr_half().

◆ imb_check_chromaticity_matches()

bool imb_check_chromaticity_matches ( const Imf::Chromaticities & a,
const Imf::Chromaticities & b )
static

Definition at line 1970 of file openexr_api.cpp.

References b, and imb_check_chromaticity_val().

Referenced by imb_exr_set_known_colorspace().

◆ imb_check_chromaticity_val()

bool imb_check_chromaticity_val ( float test_v,
float ref_v )
static

Definition at line 1963 of file openexr_api.cpp.

Referenced by imb_check_chromaticity_matches().

◆ imb_exitopenexr()

void imb_exitopenexr ( )

Definition at line 2377 of file openexr_api.cpp.

◆ IMB_exr_add_channels()

void IMB_exr_add_channels ( ExrHandle * handle,
blender::StringRefNull layerpassname,
blender::StringRefNull channelnames,
blender::StringRefNull viewname,
blender::StringRefNull colorspace,
size_t xstride,
size_t ystride,
float * rect,
bool use_half_float )

Add multiple channels to EXR file. The number of channels is determined by channelnames.size() with each character a channel name. Layer and pass name, view name and colorspace are all optional.

Definition at line 907 of file openexr_api.cpp.

◆ IMB_exr_add_view()

void IMB_exr_add_view ( ExrHandle * handle,
const char * name )

Definition at line 860 of file openexr_api.cpp.

◆ IMB_exr_begin_read()

bool IMB_exr_begin_read ( ExrHandle * handle,
const char * filepath,
int * width,
int * height,
bool parse_channels )

Read from file.

Definition at line 1101 of file openexr_api.cpp.

◆ imb_exr_begin_read_mem()

ExrHandle * imb_exr_begin_read_mem ( IStream & file_stream,
MultiPartInputFile & file,
int width,
int height )
static

◆ IMB_exr_begin_write()

bool IMB_exr_begin_write ( ExrHandle * handle,
const char * filepath,
int width,
int height,
const double ppm[2],
int compress,
int quality,
const StampData * stamp )

Used for output files (from RenderResult) (single and multi-layer, single and multi-view).

Definition at line 988 of file openexr_api.cpp.

◆ IMB_exr_close()

void IMB_exr_close ( ExrHandle * handle)

Definition at line 1360 of file openexr_api.cpp.

Referenced by imb_exr_begin_read_mem().

◆ IMB_exr_get_handle()

ExrHandle * IMB_exr_get_handle ( const bool write_multipart)

Definition at line 851 of file openexr_api.cpp.

Referenced by imb_exr_begin_read_mem().

◆ imb_exr_get_layer()

◆ imb_exr_get_multiView_id()

int imb_exr_get_multiView_id ( StringVector & views,
const std::string & name )
static

Definition at line 865 of file openexr_api.cpp.

References count, i, and name.

Referenced by imb_exr_get_views().

◆ imb_exr_get_pass()

◆ IMB_exr_get_ppm()

bool IMB_exr_get_ppm ( ExrHandle * handle,
double ppm[2] )

Definition at line 2046 of file openexr_api.cpp.

◆ imb_exr_get_views()

StringVector imb_exr_get_views ( MultiPartInputFile & file)
static

◆ IMB_exr_has_multilayer()

bool IMB_exr_has_multilayer ( ExrHandle * handle)

Definition at line 1958 of file openexr_api.cpp.

◆ imb_exr_is_multi()

bool imb_exr_is_multi ( MultiPartInputFile & file)
static

◆ imb_exr_is_multilayer_file()

bool imb_exr_is_multilayer_file ( MultiPartInputFile & file)
static

Definition at line 1910 of file openexr_api.cpp.

Referenced by imb_exr_is_multi().

◆ IMB_exr_multilayer_convert()

void IMB_exr_multilayer_convert ( ExrHandle * handle,
void * base,
void *(* addview )(void *base, const char *str),
void *(* addlayer )(void *base, const char *str),
void(* addpass )(void *base, void *lay, const char *str, float *rect, int totchan, const char *chan_id, const char *view) )

◆ imb_exr_multilayer_parse_channels_from_file()

◆ imb_exr_part_colorspace()

const ColorSpace * imb_exr_part_colorspace ( const Header & header)
static

◆ imb_exr_pass_name_from_channel()

void imb_exr_pass_name_from_channel ( char * passname,
const ExrChannel & echan,
const char * channelname,
const bool has_xyz_channels )
static

◆ imb_exr_pass_name_from_channel_name()

void imb_exr_pass_name_from_channel_name ( char * passname,
const ExrChannel & ,
const char * channelname,
const bool  )
static

Definition at line 1409 of file openexr_api.cpp.

References BLI_strncpy(), and EXR_TOT_MAXNAME.

Referenced by imb_exr_split_channel_name().

◆ IMB_exr_read_channels()

void IMB_exr_read_channels ( ExrHandle * handle)

Definition at line 1237 of file openexr_api.cpp.

Referenced by imb_load_openexr().

◆ IMB_exr_set_channel()

bool IMB_exr_set_channel ( ExrHandle * handle,
blender::StringRefNull full_name,
int xstride,
int ystride,
float * rect )

For reading, set the rect buffer to write into.

Parameters
passnameFull channel name including layer, pass, view and channel.

Definition at line 1145 of file openexr_api.cpp.

◆ imb_exr_set_known_colorspace()

◆ imb_exr_split_channel_name()

int imb_exr_split_channel_name ( ExrChannel & echan,
char * layname,
char * passname,
bool has_xyz_channels )
static

◆ imb_exr_split_token()

int imb_exr_split_token ( const char * str,
const char * end,
const char ** token )
static

Get a sub-string from the end of the name, separated by '.'.

Definition at line 1374 of file openexr_api.cpp.

References BLI_str_partition_ex(), and str.

Referenced by imb_exr_split_channel_name().

◆ IMB_exr_write_channels()

void IMB_exr_write_channels ( ExrHandle * handle)

Definition at line 1160 of file openexr_api.cpp.

◆ imb_initopenexr()

void imb_initopenexr ( )

Definition at line 2369 of file openexr_api.cpp.

References BLI_system_thread_count().

◆ imb_is_a_openexr()

bool imb_is_a_openexr ( const unsigned char * mem,
size_t size )

Test presence of OpenEXR file.

Parameters
mempointer to loaded OpenEXR bit-stream.

Definition at line 404 of file openexr_api.cpp.

References size().

Referenced by imb_load_openexr().

◆ imb_load_filepath_thumbnail_openexr()

ImBuf * imb_load_filepath_thumbnail_openexr ( const char * filepath,
const int flags,
const size_t max_thumb_size,
ImFileColorSpace & r_colorspace,
size_t * r_width,
size_t * r_height )

◆ imb_load_openexr()

◆ imb_save_openexr()

◆ imb_save_openexr_float()

◆ imb_save_openexr_half()

◆ openexr_header_compression()

◆ openexr_header_get_compression()

◆ openexr_header_metadata_callback()

void openexr_header_metadata_callback ( void * data,
const char * propname,
char * prop,
int  )
static

Definition at line 564 of file openexr_api.cpp.

References data.

Referenced by openexr_header_metadata_multi().

◆ openexr_header_metadata_colorspace() [1/2]

◆ openexr_header_metadata_colorspace() [2/2]

◆ openexr_header_metadata_global()

void openexr_header_metadata_global ( Header * header,
IDProperty * metadata,
const double ppm[2] )
static

◆ openexr_header_metadata_multi()

void openexr_header_metadata_multi ( ExrHandle * handle,
Header & header,
const double ppm[2],
const StampData * stamp )
static

◆ openexr_jpg_like_quality_to_dwa_quality()

int openexr_jpg_like_quality_to_dwa_quality ( int q)
static

Definition at line 413 of file openexr_api.cpp.

References blender::math::clamp().

Referenced by openexr_header_compression().

Variable Documentation

◆ CHROMATICITIES_ACES_2065_1

Imf::Chromaticities CHROMATICITIES_ACES_2065_1
static
Initial value:
{
{0.7347f, 0.2653f}, {0.0f, 1.0f}, {0.0001f, -0.077f}, {0.32168f, 0.33767f}}

Definition at line 120 of file openexr_api.cpp.

Referenced by imb_exr_set_known_colorspace(), and openexr_header_metadata_colorspace().

◆ CHROMATICITIES_XYZ_E

Imf::Chromaticities CHROMATICITIES_XYZ_E
static
Initial value:
{
{1.0f, 0.0f}, {0.0f, 1.0f}, {0.0f, 0.0f}, {1.0f / 3.0f, 1.0f / 3.0f}}

Definition at line 117 of file openexr_api.cpp.

Referenced by imb_exr_set_known_colorspace().

◆ LOG

CLG_LogRef LOG = {"image.openexr"}
static

Definition at line 105 of file openexr_api.cpp.