Blender  V3.3
Classes | Macros | Typedefs | Functions | Variables
openexr_api.cpp File Reference
#include <algorithm>
#include <cctype>
#include <cerrno>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <fcntl.h>
#include <fstream>
#include <iostream>
#include <set>
#include <stdexcept>
#include <string>
#include <OpenEXR/OpenEXRConfig.h>
#include <OpenEXR/half.h>
#include <OpenEXR/Iex.h>
#include <OpenEXR/ImfArray.h>
#include <OpenEXR/ImfChannelList.h>
#include <OpenEXR/ImfCompression.h>
#include <OpenEXR/ImfCompressionAttribute.h>
#include <OpenEXR/ImfIO.h>
#include <OpenEXR/ImfInputFile.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_blenlib.h"
#include "BLI_fileops.h"
#include "BLI_math_color.h"
#include "BLI_mmap.h"
#include "BLI_string_utils.h"
#include "BLI_threads.h"
#include "BKE_idprop.h"
#include "BKE_image.h"
#include "IMB_allocimbuf.h"
#include "IMB_colormanagement.h"
#include "IMB_colormanagement_intern.h"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
#include "IMB_metadata.h"
#include "IMB_openexr.h"

Go to the source code of this file.

Classes

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

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 struct ExrPassimb_exr_get_pass (ListBase *lb, char *passname)
 
static bool exr_has_multiview (MultiPartInputFile &file)
 
static bool exr_has_multipart_file (MultiPartInputFile &file)
 
static bool exr_has_alpha (MultiPartInputFile &file)
 
static bool exr_has_zbuffer (MultiPartInputFile &file)
 
static void exr_printf (const char *__restrict fmt,...)
 
static void imb_exr_type_by_channels (ChannelList &channels, StringVector &views, bool *r_singlelayer, bool *r_multilayer, bool *r_multiview)
 
static half float_to_half_safe (const float value)
 
bool imb_is_a_openexr (const unsigned char *mem, const size_t size)
 
static void openexr_header_compression (Header *header, int compression)
 
static void openexr_header_metadata (Header *header, struct ImBuf *ibuf)
 
static void openexr_header_metadata_callback (void *data, const char *propname, char *prop, int UNUSED(len))
 
static bool imb_save_openexr_half (ImBuf *ibuf, const char *name, const int flags)
 
static bool imb_save_openexr_float (ImBuf *ibuf, const char *name, const int flags)
 
bool imb_save_openexr (struct ImBuf *ibuf, const char *name, int flags)
 
static bool imb_exr_multilayer_parse_channels_from_file (ExrHandle *data)
 
voidIMB_exr_get_handle (void)
 
voidIMB_exr_get_handle_name (const char *name)
 
void IMB_exr_add_view (void *handle, const char *name)
 
static int imb_exr_get_multiView_id (StringVector &views, const std::string &name)
 
static void imb_exr_get_views (MultiPartInputFile &file, StringVector &views)
 
static void imb_exr_insert_view_name (char *name_full, const char *passname, const char *viewname)
 
void IMB_exr_add_channel (void *handle, const char *layname, const char *passname, const char *viewname, int xstride, int ystride, float *rect, bool use_half_float)
 
bool IMB_exr_begin_write (void *handle, const char *filepath, int width, int height, int compress, const StampData *stamp)
 
void IMB_exrtile_begin_write (void *handle, const char *filepath, int mipmap, int width, int height, int tilex, int tiley)
 
bool IMB_exr_begin_read (void *handle, const char *filepath, int *width, int *height, const bool parse_channels)
 
void IMB_exr_set_channel (void *handle, const char *layname, const char *passname, int xstride, int ystride, float *rect)
 
floatIMB_exr_channel_rect (void *handle, const char *layname, const char *passname, const char *viewname)
 
void IMB_exr_clear_channels (void *handle)
 
void IMB_exr_write_channels (void *handle)
 
void IMB_exrtile_write_channels (void *handle, int partx, int party, int level, const char *viewname, bool empty)
 
void IMB_exr_read_channels (void *handle)
 
void IMB_exr_multilayer_convert (void *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 (void *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 int imb_exr_split_channel_name (ExrChannel *echan, char *layname, char *passname, bool has_xyz_channels)
 
static ExrLayerimb_exr_get_layer (ListBase *lb, char *layname)
 
static bool exr_has_xyz_channels (ExrHandle *exr_handle)
 
static std::vector< MultiViewChannelName > exr_channels_in_multi_part_file (const MultiPartInputFile &file)
 
static ExrHandleimb_exr_begin_read_mem (IStream &file_stream, MultiPartInputFile &file, int width, int height)
 
static void exr_printf (const char *fmt,...)
 
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 (void *handle)
 
struct ImBufimb_load_openexr (const unsigned char *mem, size_t size, int flags, char colorspace[IM_MAX_SPACE])
 
struct ImBufimb_load_filepath_thumbnail_openexr (const char *filepath, const int UNUSED(flags), const size_t max_thumb_size, char colorspace[], size_t *r_width, size_t *r_height)
 
void imb_initopenexr (void)
 
void imb_exitopenexr (void)
 

Variables

static ListBase exrhandles = {nullptr, nullptr}
 

Macro Definition Documentation

◆ COMBINED_OPENEXR_VERSION

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

Definition at line 25 of file openexr_api.cpp.

◆ exr_file_offset_t

#define exr_file_offset_t   Int64

Definition at line 36 of file openexr_api.cpp.

Typedef Documentation

◆ RGBAZ

using RGBAZ = _RGBAZ

Definition at line 390 of file openexr_api.cpp.

Function Documentation

◆ exr_channels_in_multi_part_file()

static std::vector<MultiViewChannelName> exr_channels_in_multi_part_file ( const MultiPartInputFile &  file)
static

Definition at line 1639 of file openexr_api.cpp.

References Freestyle::c, channels(), and file.

Referenced by imb_exr_multilayer_parse_channels_from_file().

◆ exr_has_alpha()

static bool exr_has_alpha ( MultiPartInputFile &  file)
static

Definition at line 1950 of file openexr_api.cpp.

References file.

Referenced by imb_load_openexr().

◆ exr_has_chroma()

static bool exr_has_chroma ( MultiPartInputFile &  file)
static

Definition at line 1937 of file openexr_api.cpp.

References file.

Referenced by imb_load_openexr().

◆ exr_has_luma()

static bool exr_has_luma ( MultiPartInputFile &  file)
static

Definition at line 1928 of file openexr_api.cpp.

References file.

Referenced by imb_load_openexr().

◆ exr_has_multipart_file()

static bool exr_has_multipart_file ( MultiPartInputFile &  file)
static

Definition at line 2058 of file openexr_api.cpp.

References file.

Referenced by imb_exr_get_views(), and imb_exr_is_multi().

◆ exr_has_multiview()

static bool exr_has_multiview ( MultiPartInputFile &  file)
static

Definition at line 2047 of file openexr_api.cpp.

References file.

Referenced by imb_exr_get_views(), and imb_exr_is_multi().

◆ exr_has_rgb()

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

Definition at line 1898 of file openexr_api.cpp.

References Freestyle::c, file, and transform().

Referenced by imb_load_openexr().

◆ exr_has_xyz()

static bool exr_has_xyz ( MultiPartInputFile &  file)
static

Definition at line 1956 of file openexr_api.cpp.

References file.

Referenced by imb_load_openexr().

◆ exr_has_xyz_channels()

static bool exr_has_xyz_channels ( ExrHandle exr_handle)
static

Definition at line 1617 of file openexr_api.cpp.

References ExrHandle::channels, and LISTBASE_FOREACH.

Referenced by imb_exr_multilayer_parse_channels_from_file().

◆ exr_has_zbuffer()

static bool exr_has_zbuffer ( MultiPartInputFile &  file)
static

Definition at line 1944 of file openexr_api.cpp.

References file.

Referenced by imb_load_openexr().

◆ exr_is_half_float()

static bool exr_is_half_float ( MultiPartInputFile &  file)
static

Definition at line 1967 of file openexr_api.cpp.

References channels(), file, and HALF.

Referenced by imb_load_openexr().

◆ exr_print_filecontents()

static void exr_print_filecontents ( MultiPartInputFile &  file)
static

Definition at line 1851 of file openexr_api.cpp.

References channels(), file, and view.

Referenced by imb_load_openexr().

◆ exr_printf() [1/2]

static void exr_printf ( const char *__restrict  fmt,
  ... 
)
static

◆ exr_printf() [2/2]

static void exr_printf ( const char *  fmt,
  ... 
)
static

Definition at line 1837 of file openexr_api.cpp.

References output, and void.

◆ exr_rgba_channelname()

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

Definition at line 1881 of file openexr_api.cpp.

References BLI_strcasecmp(), channels(), file, len, and str.

Referenced by imb_load_openexr().

◆ float_to_half_safe()

static half float_to_half_safe ( const float  value)
static

Definition at line 392 of file openexr_api.cpp.

References clamp_f().

Referenced by IMB_exr_write_channels(), and imb_save_openexr_half().

◆ imb_exitopenexr()

void imb_exitopenexr ( void  )

Definition at line 2404 of file openexr_api.cpp.

◆ IMB_exr_add_channel()

void IMB_exr_add_channel ( void handle,
const char *  layname,
const char *  passname,
const char *  view,
int  xstride,
int  ystride,
float rect,
bool  use_half_float 
)

Adds flattened ExrChannel's xstride, ystride and rect can be done in set_channel too, for tile writing.

Parameters
passnameDoes not include view.

Definition at line 849 of file openexr_api.cpp.

Referenced by IMB_exr_begin_read(), and imb_exr_multilayer_parse_channels_from_file().

◆ IMB_exr_add_view()

void IMB_exr_add_view ( void handle,
const char *  name 
)

Definition at line 778 of file openexr_api.cpp.

◆ IMB_exr_begin_read()

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

Read from file.

Definition at line 1025 of file openexr_api.cpp.

◆ imb_exr_begin_read_mem()

static 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 ( void handle,
const char *  filepath,
int  width,
int  height,
int  compress,
const StampData stamp 
)

◆ IMB_exr_channel_rect()

float* IMB_exr_channel_rect ( void handle,
const char *  layname,
const char *  passname,
const char *  viewname 
)

Definition at line 1115 of file openexr_api.cpp.

◆ IMB_exr_clear_channels()

void IMB_exr_clear_channels ( void handle)

Definition at line 1156 of file openexr_api.cpp.

◆ IMB_exr_close()

void IMB_exr_close ( void handle)

Definition at line 1405 of file openexr_api.cpp.

Referenced by imb_exr_begin_read_mem().

◆ IMB_exr_get_handle()

void* IMB_exr_get_handle ( void  )

Definition at line 753 of file openexr_api.cpp.

Referenced by imb_exr_begin_read_mem(), and IMB_exr_get_handle_name().

◆ IMB_exr_get_handle_name()

void* IMB_exr_get_handle_name ( const char *  name)

Definition at line 762 of file openexr_api.cpp.

◆ imb_exr_get_layer()

static ExrLayer* imb_exr_get_layer ( ListBase lb,
char *  layname 
)
static

◆ imb_exr_get_multiView_id()

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

◆ imb_exr_get_pass()

static ExrPass * imb_exr_get_pass ( ListBase lb,
char *  passname 
)
static

◆ imb_exr_get_views()

static void imb_exr_get_views ( MultiPartInputFile &  file,
StringVector &  views 
)
static

◆ IMB_exr_has_multilayer()

bool IMB_exr_has_multilayer ( void handle)

Definition at line 2083 of file openexr_api.cpp.

◆ imb_exr_insert_view_name()

static void imb_exr_insert_view_name ( char *  name_full,
const char *  passname,
const char *  viewname 
)
static

◆ imb_exr_is_multi()

static bool imb_exr_is_multi ( MultiPartInputFile &  file)
static

◆ imb_exr_is_multilayer_file()

static bool imb_exr_is_multilayer_file ( MultiPartInputFile &  file)
static

Definition at line 1979 of file openexr_api.cpp.

References channels(), and file.

Referenced by imb_exr_is_multi().

◆ IMB_exr_multilayer_convert()

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

◆ imb_exr_multilayer_parse_channels_from_file()

static bool imb_exr_multilayer_parse_channels_from_file ( ExrHandle data)
static

◆ imb_exr_pass_name_from_channel()

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

◆ IMB_exr_read_channels()

void IMB_exr_read_channels ( void handle)

Definition at line 1277 of file openexr_api.cpp.

Referenced by imb_load_openexr().

◆ IMB_exr_set_channel()

void IMB_exr_set_channel ( void handle,
const char *  layname,
const char *  passname,
int  xstride,
int  ystride,
float rect 
)

Still clumsy name handling, layers/channels can be ordered as list in list later.

Parameters
passnameHere is the raw channel name without the layer.

Definition at line 1085 of file openexr_api.cpp.

◆ imb_exr_split_channel_name()

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

◆ imb_exr_split_token()

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

Definition at line 1447 of file openexr_api.cpp.

References BLI_str_partition_ex(), and str.

Referenced by imb_exr_split_channel_name().

◆ imb_exr_type_by_channels()

static void imb_exr_type_by_channels ( ChannelList &  channels,
StringVector &  views,
bool r_singlelayer,
bool r_multilayer,
bool r_multiview 
)
static

Definition at line 1991 of file openexr_api.cpp.

References BLI_assert, channels(), imb_exr_get_multiView_id(), and pos.

Referenced by IMB_exr_begin_write().

◆ IMB_exr_write_channels()

void IMB_exr_write_channels ( void handle)

Definition at line 1168 of file openexr_api.cpp.

◆ IMB_exrtile_begin_write()

void IMB_exrtile_begin_write ( void handle,
const char *  filepath,
int  mipmap,
int  width,
int  height,
int  tilex,
int  tiley 
)

Only used for writing temp. render results (not image files) (FSA and Save Buffers).

Definition at line 960 of file openexr_api.cpp.

◆ IMB_exrtile_write_channels()

void IMB_exrtile_write_channels ( void handle,
int  partx,
int  party,
int  level,
const char *  viewname,
bool  empty 
)

Temporary function, used for FSA and Save Buffers. called once per tile * view.

Definition at line 1226 of file openexr_api.cpp.

◆ imb_initopenexr()

void imb_initopenexr ( void  )

Definition at line 2396 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 399 of file openexr_api.cpp.

References size().

Referenced by imb_load_openexr().

◆ imb_load_filepath_thumbnail_openexr()

struct ImBuf* imb_load_filepath_thumbnail_openexr ( const char *  filepath,
const int   UNUSEDflags,
const size_t  max_thumb_size,
char  colorspace[],
size_t *  r_width,
size_t *  r_height 
)

◆ imb_load_openexr()

struct ImBuf* imb_load_openexr ( const unsigned char *  mem,
size_t  size,
int  flags,
char  colorspace[IM_MAX_SPACE] 
)

◆ imb_save_openexr()

bool imb_save_openexr ( struct ImBuf ibuf,
const char *  name,
int  flags 
)

◆ imb_save_openexr_float()

static bool imb_save_openexr_float ( ImBuf ibuf,
const char *  name,
const int  flags 
)
static

◆ imb_save_openexr_half()

static bool imb_save_openexr_half ( ImBuf ibuf,
const char *  name,
const int  flags 
)
static

◆ openexr_header_compression()

static void openexr_header_compression ( Header header,
int  compression 
)
static

◆ openexr_header_metadata()

static void openexr_header_metadata ( Header header,
struct ImBuf ibuf 
)
static

◆ openexr_header_metadata_callback()

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

Definition at line 467 of file openexr_api.cpp.

References data.

Referenced by IMB_exr_begin_write().

Variable Documentation

◆ exrhandles

ListBase exrhandles = {nullptr, nullptr}
static

Definition at line 687 of file openexr_api.cpp.

Referenced by IMB_exr_close(), IMB_exr_get_handle(), and IMB_exr_get_handle_name().