diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h index ea63161..0312633 100644 --- a/source/blender/blenkernel/BKE_image.h +++ b/source/blender/blenkernel/BKE_image.h @@ -224,7 +224,7 @@ bool BKE_image_is_openexr(struct Image *ima); void BKE_image_backup_render(struct Scene *scene, struct Image *ima); /* for singlelayer openexr saving */ -bool BKE_image_save_openexr_multiview(struct Image *ima, struct ImBuf *ibuf, const char *filepath, const int flags); +bool BKE_image_save_openexr_multiview(struct Image *ima, struct Scene *scene, struct ImBuf *ibuf, const char *filepath, const int flags); /* goes over all textures that use images */ void BKE_image_free_all_textures(void); diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index ff30543..24f0e46 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -2956,37 +2956,55 @@ static const char *image_get_view_cb(void *base, const int view_id) } #endif /* WITH_OPENEXR */ +struct EXRData { + Image *ima; + Scene *scene; + ImBuf *ibuf; + void *lock; +}; + #ifdef WITH_OPENEXR static ImBuf *image_get_buffer_cb(void *base, const int view_id) { - Image *ima = base; + struct EXRData *data = base; + Image *ima = data->ima; + Scene *scene = data->scene; + void *lock = data->lock; + ImBuf *ibuf; + ImageUser iuser = {0}; iuser.view = view_id; iuser.ok = 1; + iuser.scene = scene; BKE_image_multiview_index(ima, &iuser); + ibuf = BKE_image_acquire_ibuf(ima, &iuser, &lock); - return image_acquire_ibuf(ima, &iuser, NULL); + data->ibuf = ibuf; + return ibuf; } #endif /* WITH_OPENEXR */ -bool BKE_image_save_openexr_multiview(Image *ima, ImBuf *ibuf, const char *filepath, const int flags) +bool BKE_image_save_openexr_multiview(Image *ima, Scene *scene, ImBuf *ibuf, const char *filepath, const int flags) { #ifdef WITH_OPENEXR char name[FILE_MAX]; bool ok; + struct EXRData data = {ima, scene}; BLI_strncpy(name, filepath, sizeof(name)); BLI_path_abs(name, G.main->name); - ibuf->userdata = ima; + ibuf->userdata = &data; ok = IMB_exr_multiview_save(ibuf, name, flags, BLI_listbase_count(&ima->views), image_get_view_cb, image_get_buffer_cb); + + BKE_image_release_ibuf(ima, data.ibuf, &data.lock); ibuf->userdata = NULL; return ok; #else - UNUSED_VARS(ima, ibuf, filepath, flags); + UNUSED_VARS(ima, scene, ibuf, filepath, flags); return false; #endif } diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index ab062eb..308bb2f 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -1739,7 +1739,7 @@ static bool save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI else if ((imf->imtype == R_IMF_IMTYPE_OPENEXR) && (imf->views_format == R_IMF_VIEWS_MULTIVIEW)) { /* treat special Openexr case separetely (this is the singlelayer multiview OpenEXR */ BKE_imbuf_write_prepare(ibuf, imf); - ok = BKE_image_save_openexr_multiview(ima, ibuf, simopts->filepath, (IB_rect | IB_zbuf | IB_zbuffloat | IB_multiview)); + ok = BKE_image_save_openexr_multiview(ima, scene, ibuf, simopts->filepath, (IB_rect | IB_zbuf | IB_zbuffloat | IB_multiview)); ED_space_image_release_buffer(sima, ibuf, lock); } /* regular mono pipeline */