Blender
V3.3
|
#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 ExrPass * | imb_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) |
void * | IMB_exr_get_handle (void) |
void * | IMB_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) |
float * | IMB_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 ExrLayer * | imb_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 ExrHandle * | imb_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 ImBuf * | imb_load_openexr (const unsigned char *mem, size_t size, int flags, char colorspace[IM_MAX_SPACE]) |
struct ImBuf * | imb_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} |
#define COMBINED_OPENEXR_VERSION ((10000 * OPENEXR_VERSION_MAJOR) + (100 * OPENEXR_VERSION_MINOR) + OPENEXR_VERSION_PATCH) |
Definition at line 25 of file openexr_api.cpp.
#define exr_file_offset_t Int64 |
Definition at line 36 of file openexr_api.cpp.
Definition at line 390 of file openexr_api.cpp.
|
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().
|
static |
|
static |
|
static |
|
static |
Definition at line 2058 of file openexr_api.cpp.
References file.
Referenced by imb_exr_get_views(), and imb_exr_is_multi().
|
static |
Definition at line 2047 of file openexr_api.cpp.
References file.
Referenced by imb_exr_get_views(), and imb_exr_is_multi().
|
static |
Definition at line 1898 of file openexr_api.cpp.
References Freestyle::c, file, and transform().
Referenced by imb_load_openexr().
|
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().
|
static |
|
static |
Definition at line 1967 of file openexr_api.cpp.
References channels(), file, and HALF.
Referenced by imb_load_openexr().
|
static |
Definition at line 1851 of file openexr_api.cpp.
References channels(), file, and view.
Referenced by imb_load_openexr().
|
static |
|
static |
Definition at line 1837 of file openexr_api.cpp.
|
static |
Definition at line 1881 of file openexr_api.cpp.
References BLI_strcasecmp(), channels(), file, len, and str.
Referenced by imb_load_openexr().
Definition at line 392 of file openexr_api.cpp.
References clamp_f().
Referenced by IMB_exr_write_channels(), and imb_save_openexr_half().
Definition at line 2404 of file openexr_api.cpp.
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.
passname | Does 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().
Definition at line 778 of file openexr_api.cpp.
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.
|
static |
Definition at line 1813 of file openexr_api.cpp.
References data, file, height, IMB_exr_close(), IMB_exr_get_handle(), imb_exr_multilayer_parse_channels_from_file(), and width.
Referenced by imb_load_openexr().
bool IMB_exr_begin_write | ( | void * | handle, |
const char * | filepath, | ||
int | width, | ||
int | height, | ||
int | compress, | ||
const StampData * | stamp | ||
) |
Definition at line 905 of file openexr_api.cpp.
References BKE_stamp_info_callback(), data, FLOAT, HALF, height, imb_exr_type_by_channels(), ExrChannel::name, ExrChannel::next, openexr_header_compression(), openexr_header_metadata_callback(), ExrChannel::use_half_float, and width.
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.
Definition at line 1156 of file openexr_api.cpp.
Definition at line 1405 of file openexr_api.cpp.
Referenced by imb_exr_begin_read_mem().
Definition at line 753 of file openexr_api.cpp.
Referenced by imb_exr_begin_read_mem(), and IMB_exr_get_handle_name().
void* IMB_exr_get_handle_name | ( | const char * | name | ) |
Definition at line 762 of file openexr_api.cpp.
Definition at line 1584 of file openexr_api.cpp.
References BLI_addtail(), BLI_findstring(), BLI_strncpy(), EXR_LAY_MAXNAME, and ExrLayer::name.
Referenced by imb_exr_multilayer_parse_channels_from_file().
|
static |
Definition at line 784 of file openexr_api.cpp.
References count, and ExrLayer::name.
Referenced by IMB_exr_add_channel(), IMB_exr_channel_rect(), imb_exr_get_views(), imb_exr_type_by_channels(), and IMB_exrtile_write_channels().
Definition at line 1597 of file openexr_api.cpp.
References BLI_addhead(), BLI_addtail(), BLI_findstring(), BLI_strncpy(), EXR_LAY_MAXNAME, ExrLayer::name, ExrPass::name, and STREQ.
Referenced by imb_exr_multilayer_parse_channels_from_file().
|
static |
Definition at line 799 of file openexr_api.cpp.
References exr_has_multipart_file(), exr_has_multiview(), file, imb_exr_get_multiView_id(), and view.
Referenced by IMB_exr_begin_read(), and imb_exr_multilayer_parse_channels_from_file().
Definition at line 2083 of file openexr_api.cpp.
|
static |
Definition at line 825 of file openexr_api.cpp.
References BLI_assert, BLI_snprintf(), BLI_str_rpartition(), BLI_strncpy(), ELEM, EXR_PASS_MAXNAME, len, and ExrLayer::name.
Referenced by IMB_exr_add_channel(), and IMB_exr_channel_rect().
|
static |
Definition at line 2064 of file openexr_api.cpp.
References exr_has_multipart_file(), exr_has_multiview(), file, and imb_exr_is_multilayer_file().
Referenced by IMB_exr_has_multilayer(), and imb_load_openexr().
|
static |
Definition at line 1979 of file openexr_api.cpp.
References channels(), and file.
Referenced by imb_exr_is_multi().
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 | ||
) |
Definition at line 1356 of file openexr_api.cpp.
References BLI_listbase_is_empty(), ExrPass::chan_id, data, ExrPass::internal_name, ExrPass::next, ExrPass::rect, ExrPass::totchan, and ExrPass::view.
Referenced by BKE_movieclip_convert_multilayer_ibuf(), render_result_new_from_exr(), and studiolight_load_equirect_image().
Definition at line 1693 of file openexr_api.cpp.
References Freestyle::a, BLI_snprintf(), BLI_strncpy(), ExrPass::chan, ExrChannel::chan_id, channels(), data, ELEM, exr_channels_in_multi_part_file(), exr_has_xyz_channels(), EXR_PASS_MAXCHAN, EXR_PASS_MAXNAME, EXR_TOT_MAXNAME, IMB_exr_add_channel(), imb_exr_get_layer(), imb_exr_get_pass(), imb_exr_get_views(), imb_exr_split_channel_name(), ExrPass::internal_name, blender::bke::attribute_accessor_functions::lookup(), ExrChannel::m, MEM_callocN, ExrChannel::next, ExrPass::next, ExrLayer::passes, ExrChannel::rect, ExrPass::totchan, view, ExrPass::view, ExrChannel::view_id, ExrPass::view_id, ExrChannel::xstride, and ExrChannel::ystride.
Referenced by IMB_exr_begin_read(), and imb_exr_begin_read_mem().
|
static |
Definition at line 1461 of file openexr_api.cpp.
References BLI_strcaseeq(), BLI_strncpy(), ExrChannel::chan_id, ELEM, and EXR_TOT_MAXNAME.
Referenced by imb_exr_split_channel_name().
Definition at line 1277 of file openexr_api.cpp.
Referenced by imb_load_openexr().
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.
passname | Here is the raw channel name without the layer. |
Definition at line 1085 of file openexr_api.cpp.
|
static |
Definition at line 1482 of file openexr_api.cpp.
References BLI_strcaseeq(), BLI_strncpy(), BLI_toupper_ascii(), ExrChannel::chan_id, ELEM, EXR_TOT_MAXNAME, imb_exr_pass_name_from_channel(), imb_exr_split_token(), len, ExrChannel::m, min, and ExrLayer::name.
Referenced by imb_exr_multilayer_parse_channels_from_file().
|
static |
Definition at line 1447 of file openexr_api.cpp.
References BLI_str_partition_ex(), and str.
Referenced by imb_exr_split_channel_name().
|
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().
Definition at line 1168 of file openexr_api.cpp.
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.
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.
Definition at line 2396 of file openexr_api.cpp.
References BLI_system_thread_count().
bool imb_is_a_openexr | ( | const unsigned char * | mem, |
size_t | size | ||
) |
Test presence of OpenEXR file.
mem | pointer to loaded OpenEXR bit-stream. |
Definition at line 399 of file openexr_api.cpp.
References size().
Referenced by imb_load_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 | ||
) |
Definition at line 2292 of file openexr_api.cpp.
References BLI_file_size(), COLOR_ROLE_DEFAULT_FLOAT, colorspace_set_default_role(), file, IB_rectfloat, IM_MAX_SPACE, IMB_allocFromBuffer(), IMB_allocImBuf(), IMB_flipy(), MIN2, usdtokens::preview(), ImBuf::rect_float, and w().
struct ImBuf* imb_load_openexr | ( | const unsigned char * | mem, |
size_t | size, | ||
int | flags, | ||
char | colorspace[IM_MAX_SPACE] | ||
) |
Definition at line 2089 of file openexr_api.cpp.
References Freestyle::a, addzbuffloatImBuf(), BLI_YCC_ITU_BT709, color, COLOR_ROLE_DEFAULT_FLOAT, colorspace_set_default_role(), double(), exr_has_alpha(), exr_has_chroma(), exr_has_luma(), exr_has_rgb(), exr_has_xyz(), exr_has_zbuffer(), exr_is_half_float(), exr_print_filecontents(), exr_rgba_channelname(), file, ImBuf::flags, FLOAT, float(), ImBuf::ftype, height, IB_alphamode_detect, IB_alphamode_premul, IB_halffloat, IB_metadata, IB_multilayer, IB_test, IB_thumbnail, IM_MAX_SPACE, imb_addrectfloatImBuf(), IMB_allocImBuf(), imb_exr_begin_read_mem(), imb_exr_is_multi(), IMB_exr_read_channels(), IMB_freeImBuf(), IMB_FTYPE_OPENEXR, imb_is_a_openexr(), IMB_metadata_ensure(), IMB_metadata_set_field(), IMB_rect_from_float(), ImBuf::metadata, IDProperty::name, ImBuf::ppm, ImBuf::rect_float, size(), ImBuf::userdata, width, ImBuf::x, ImBuf::y, ycc_to_rgb(), and ImBuf::zbuf_float.
Definition at line 659 of file openexr_api.cpp.
References ImBuf::encodedsize, ImbFormatOptions::flag, ImBuf::foptions, IB_mem, imb_addencodedbufferImBuf(), imb_save_openexr_float(), imb_save_openexr_half(), OPENEXR_HALF, and ImBuf::rect_float.
Definition at line 583 of file openexr_api.cpp.
References ImBuf::channels, channels(), file, ImbFormatOptions::flag, FLOAT, float(), ImBuf::foptions, height, IB_mem, IB_zbuffloat, OPENEXR_COMPRESS, openexr_header_compression(), openexr_header_metadata(), ImBuf::planes, ImBuf::rect_float, width, ImBuf::x, ImBuf::y, and ImBuf::zbuf_float.
Referenced by imb_save_openexr().
Definition at line 476 of file openexr_api.cpp.
References _RGBAZ::a, _RGBAZ::b, ImBuf::channels, channels(), exr_printf(), file, ImbFormatOptions::flag, FLOAT, float(), float_to_half_safe(), ImBuf::foptions, from, _RGBAZ::g, HALF, height, IB_mem, IB_zbuffloat, OPENEXR_COMPRESS, openexr_header_compression(), openexr_header_metadata(), ImBuf::planes, _RGBAZ::r, ImBuf::rect, ImBuf::rect_float, srgb_to_linearrgb(), width, ImBuf::x, ImBuf::y, and ImBuf::zbuf_float.
Referenced by imb_save_openexr().
Definition at line 408 of file openexr_api.cpp.
References R_IMF_EXR_CODEC_B44, R_IMF_EXR_CODEC_B44A, R_IMF_EXR_CODEC_DWAA, R_IMF_EXR_CODEC_DWAB, R_IMF_EXR_CODEC_NONE, R_IMF_EXR_CODEC_PIZ, R_IMF_EXR_CODEC_PXR24, R_IMF_EXR_CODEC_RLE, R_IMF_EXR_CODEC_ZIP, and R_IMF_EXR_CODEC_ZIPS.
Referenced by IMB_exr_begin_write(), imb_save_openexr_float(), and imb_save_openexr_half().
Definition at line 449 of file openexr_api.cpp.
References IDProperty::data, ListBase::first, IDPropertyData::group, IDP_String, IDP_STRING, ImBuf::metadata, IDProperty::name, IDProperty::next, ImBuf::ppm, and IDProperty::type.
Referenced by imb_save_openexr_float(), and imb_save_openexr_half().
|
static |
Definition at line 467 of file openexr_api.cpp.
References data.
Referenced by IMB_exr_begin_write().
|
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().