Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntony Riakiotakis <kalast@gmail.com>2015-05-26 15:56:36 +0300
committerAntony Riakiotakis <kalast@gmail.com>2015-05-26 15:56:36 +0300
commit322380999ed91179ebce511c7b14e470b48bf993 (patch)
treec13a97f18bf388f0f4a2ad3f423764742b3f5bb9 /source/blender/imbuf/intern
parent650fdcd74fecc14cdfdc0b2e17317f31807b6a40 (diff)
parenta23fbc71a1886e9f83fd1d6782050d5a8c356d13 (diff)
Merge branch 'master' into gooseberry
Conflicts: source/blender/editors/object/object_ops.c
Diffstat (limited to 'source/blender/imbuf/intern')
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_api.cpp43
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_multi.h4
2 files changed, 29 insertions, 18 deletions
diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp
index b4f81ebeb57..1950fd81cb6 100644
--- a/source/blender/imbuf/intern/openexr/openexr_api.cpp
+++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp
@@ -63,6 +63,7 @@ _CRTIMP void __cdecl _invalid_parameter_noinfo(void)
#include "BLI_threads.h"
#include "BKE_idprop.h"
+#include "BKE_image.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -363,6 +364,13 @@ static void openexr_header_metadata(Header *header, struct ImBuf *ibuf)
addXDensity(*header, ibuf->ppm[0] / 39.3700787); /* 1 meter = 39.3700787 inches */
}
+static void openexr_header_metadata_callback(void *data, const char *propname, const char *prop)
+{
+ Header *header = (Header *)data;
+ header->insert(propname, StringAttribute(prop));
+}
+
+
static bool imb_save_openexr_half(ImBuf *ibuf, const char *name, const int flags, const size_t totviews,
const char * (*getview)(void *base, size_t view_id),
ImBuf * (*getbuffer)(void *base, const size_t view_id))
@@ -821,7 +829,7 @@ void IMB_exr_add_channel(void *handle, const char *layname, const char *passname
}
/* used for output files (from RenderResult) (single and multilayer, single and multiview) */
-int IMB_exr_begin_write(void *handle, const char *filename, int width, int height, int compress)
+int IMB_exr_begin_write(void *handle, const char *filename, int width, int height, int compress, struct StampData *stamp)
{
ExrHandle *data = (ExrHandle *)handle;
Header header(width, height);
@@ -836,7 +844,7 @@ int IMB_exr_begin_write(void *handle, const char *filename, int width, int heigh
header.channels().insert(echan->name, Channel(Imf::FLOAT));
openexr_header_compression(&header, compress);
- // openexr_header_metadata(&header, ibuf); // no imbuf. cant write
+ BKE_stamp_info_callback(&header, stamp, openexr_header_metadata_callback);
/* header.lineOrder() = DECREASING_Y; this crashes in windows for file read! */
imb_exr_type_by_channels(header.channels(), *data->multiView, &is_singlelayer, &is_multilayer, &is_multiview);
@@ -1888,6 +1896,22 @@ struct ImBuf *imb_load_openexr(unsigned char *mem, size_t size, int flags, char
ibuf->ftype = OPENEXR;
if (!(flags & IB_test)) {
+
+ if (flags & IB_metadata) {
+ const Header & header = file->header(0);
+ Header::ConstIterator iter;
+
+ for (iter = header.begin(); iter != header.end(); iter++) {
+ const StringAttribute *attrib = file->header(0).findTypedAttribute <StringAttribute> (iter.name());
+
+ /* not all attributes are string attributes so we might get some NULLs here */
+ if (attrib) {
+ IMB_metadata_add_field(ibuf, iter.name(), attrib->value().c_str());
+ ibuf->flags |= IB_metadata;
+ }
+ }
+ }
+
if (is_multi && ((flags & IB_thumbnail) == 0)) { /* only enters with IB_multilayer flag set */
/* constructs channels for reading, allocates memory in channels */
ExrHandle *handle = imb_exr_begin_read_mem(*file, width, height);
@@ -1973,21 +1997,6 @@ struct ImBuf *imb_load_openexr(unsigned char *mem, size_t size, int flags, char
}
}
- if (flags & IB_metadata) {
- const Header & header = file->header(0);
- Header::ConstIterator iter;
-
- for (iter = header.begin(); iter != header.end(); iter++) {
- const StringAttribute *attrib = file->header(0).findTypedAttribute <StringAttribute> (iter.name());
-
- /* not all attributes are string attributes so we might get some NULLs here */
- if (attrib) {
- IMB_metadata_add_field(ibuf, iter.name(), attrib->value().c_str());
- ibuf->flags |= IB_metadata;
- }
- }
- }
-
/* file is no longer needed */
delete file;
}
diff --git a/source/blender/imbuf/intern/openexr/openexr_multi.h b/source/blender/imbuf/intern/openexr/openexr_multi.h
index 45ab0ed37c7..dbef24cbeb8 100644
--- a/source/blender/imbuf/intern/openexr/openexr_multi.h
+++ b/source/blender/imbuf/intern/openexr/openexr_multi.h
@@ -48,12 +48,14 @@
extern "C" {
#endif
+struct StampData;
+
void *IMB_exr_get_handle(void);
void *IMB_exr_get_handle_name(const char *name);
void IMB_exr_add_channel(void *handle, const char *layname, const char *passname, const char *view, int xstride, int ystride, float *rect);
int IMB_exr_begin_read(void *handle, const char *filename, int *width, int *height);
-int IMB_exr_begin_write(void *handle, const char *filename, int width, int height, int compress);
+int IMB_exr_begin_write(void *handle, const char *filename, int width, int height, int compress, struct StampData *stamp);
void IMB_exrtile_begin_write(void *handle, const char *filename, int mipmap, int width, int height, int tilex, int tiley);
void IMB_exr_set_channel(void *handle, const char *layname, const char *passname, int xstride, int ystride, float *rect);