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:
authorBastien Montagne <montagne29@wanadoo.fr>2015-06-27 10:46:38 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2015-06-29 16:46:33 +0300
commita08f1d00ae190d1d8568482c3869018713b23122 (patch)
treecfb0ce2aff3378d28f758447ebe1c54bf83789a1
parent86d172d846a9fe6a333641911066d4b2e0dd46da (diff)
Fix crasher when loading multiview OpenEXR image.
With multiview/multilayer OpenEXR file, `load_image_single()` will return NULL ibuf, since it has already populated ima (with `image_create_multiview()` or `image_create_multilayer()` calls). Also, added some more checks before doing `IMB_ImBufFromStereo3d()`, to be sure we do have enough slots in ibuf_arr, and we do not overwrite second ibuf either.
-rw-r--r--source/blender/blenkernel/intern/image.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 09934c872f7..31d2f8834cb 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -3501,16 +3501,20 @@ static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra)
const size_t totviews = BLI_listbase_count(&ima->views);
BLI_assert(totviews > 0);
- ibuf_arr = MEM_mallocN(sizeof(ImBuf *) * totviews, "Image Views Imbufs");
+ ibuf_arr = MEM_callocN(sizeof(ImBuf *) * totviews, "Image Views Imbufs");
for (i = 0; i < totfiles; i++)
ibuf_arr[i] = load_image_single(ima, iuser, cfra, i, has_packed, &assign);
- if ((ima->flag & IMA_IS_STEREO) && ima->views_format == R_IMF_VIEWS_STEREO_3D)
+ /* multi-views/multi-layers OpenEXR files directly populate ima, and return NULL ibuf... */
+ if ((ima->flag & IMA_IS_STEREO) && ima->views_format == R_IMF_VIEWS_STEREO_3D &&
+ ibuf_arr[0] && totfiles == 1 && totviews >= 2)
+ {
IMB_ImBufFromStereo3d(ima->stereo3d_format, ibuf_arr[0], &ibuf_arr[0], &ibuf_arr[1]);
+ }
/* return the original requested ImBuf */
- i = iuser && iuser->multi_index < totviews ? iuser->multi_index : 0;
+ i = (iuser && iuser->multi_index < totviews) ? iuser->multi_index : 0;
ibuf = ibuf_arr[i];
if (assign) {