[Bf-blender-cvs] [42937493d82] blender-v3.3-release: Fix T100886: error saving side-by-side stereo EXR image of depth pass

Brecht Van Lommel noreply at git.blender.org
Wed Sep 21 14:27:10 CEST 2022


Commit: 42937493d8253a295a97092315288f961e8c6dba
Author: Brecht Van Lommel
Date:   Mon Sep 12 19:39:24 2022 +0200
Branches: blender-v3.3-release
https://developer.blender.org/rB42937493d8253a295a97092315288f961e8c6dba

Fix T100886: error saving side-by-side stereo EXR image of depth pass

The stereo saving code that combines two image buffers into one did not work
correctly when the number of channels is not equal to 4.

===================================================================

M	source/blender/compositor/operations/COM_ViewerOperation.cc
M	source/blender/editors/space_image/image_undo.cc
M	source/blender/imbuf/IMB_imbuf.h
M	source/blender/imbuf/intern/allocimbuf.c
M	source/blender/imbuf/intern/openexr/openexr_api.cpp
M	source/blender/imbuf/intern/png.c
M	source/blender/imbuf/intern/stereoimbuf.c
M	source/blender/sequencer/intern/modifier.c
M	source/blender/sequencer/intern/render.c

===================================================================

diff --git a/source/blender/compositor/operations/COM_ViewerOperation.cc b/source/blender/compositor/operations/COM_ViewerOperation.cc
index aeadf8f255d..3bd5fa4ad14 100644
--- a/source/blender/compositor/operations/COM_ViewerOperation.cc
+++ b/source/blender/compositor/operations/COM_ViewerOperation.cc
@@ -156,7 +156,7 @@ void ViewerOperation::init_image()
     ibuf->y = display_height_;
     /* zero size can happen if no image buffers exist to define a sensible resolution */
     if (ibuf->x > 0 && ibuf->y > 0) {
-      imb_addrectfloatImBuf(ibuf);
+      imb_addrectfloatImBuf(ibuf, 4);
     }
 
     ibuf->userflags |= IB_DISPLAY_BUFFER_INVALID;
diff --git a/source/blender/editors/space_image/image_undo.cc b/source/blender/editors/space_image/image_undo.cc
index 0fe0414c177..45511343185 100644
--- a/source/blender/editors/space_image/image_undo.cc
+++ b/source/blender/editors/space_image/image_undo.cc
@@ -525,7 +525,7 @@ static void ubuf_ensure_compat_ibuf(const UndoImageBuf *ubuf, ImBuf *ibuf)
   IMB_rect_size_set(ibuf, ubuf->image_dims);
 
   if (ubuf->image_state.use_float) {
-    imb_addrectfloatImBuf(ibuf);
+    imb_addrectfloatImBuf(ibuf, 4);
   }
   else {
     imb_addrectImBuf(ibuf);
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index 20c414bb1ad..99d931e7035 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -856,7 +856,7 @@ bool imb_addrectImBuf(struct ImBuf *ibuf);
  */
 void imb_freerectImBuf(struct ImBuf *ibuf);
 
-bool imb_addrectfloatImBuf(struct ImBuf *ibuf);
+bool imb_addrectfloatImBuf(struct ImBuf *ibuf, const unsigned int channels);
 /**
  * Any free `ibuf->rect` frees mipmaps to be sure, creation is in render on first request.
  */
diff --git a/source/blender/imbuf/intern/allocimbuf.c b/source/blender/imbuf/intern/allocimbuf.c
index 8b9ad94de0c..868040dc17a 100644
--- a/source/blender/imbuf/intern/allocimbuf.c
+++ b/source/blender/imbuf/intern/allocimbuf.c
@@ -364,7 +364,7 @@ void *imb_alloc_pixels(
   return MEM_callocN(size, name);
 }
 
-bool imb_addrectfloatImBuf(ImBuf *ibuf)
+bool imb_addrectfloatImBuf(ImBuf *ibuf, const unsigned int channels)
 {
   if (ibuf == NULL) {
     return false;
@@ -374,8 +374,8 @@ bool imb_addrectfloatImBuf(ImBuf *ibuf)
     imb_freerectfloatImBuf(ibuf); /* frees mipmap too, hrm */
   }
 
-  ibuf->channels = 4;
-  if ((ibuf->rect_float = imb_alloc_pixels(ibuf->x, ibuf->y, 4, sizeof(float), __func__))) {
+  ibuf->channels = channels;
+  if ((ibuf->rect_float = imb_alloc_pixels(ibuf->x, ibuf->y, channels, sizeof(float), __func__))) {
     ibuf->mall |= IB_rectfloat;
     ibuf->flags |= IB_rectfloat;
     return true;
@@ -536,7 +536,7 @@ bool IMB_initImBuf(
   }
 
   if (flags & IB_rectfloat) {
-    if (imb_addrectfloatImBuf(ibuf) == false) {
+    if (imb_addrectfloatImBuf(ibuf, ibuf->channels) == false) {
       return false;
     }
   }
diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp
index 0414fa1268d..451e07141ac 100644
--- a/source/blender/imbuf/intern/openexr/openexr_api.cpp
+++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp
@@ -2058,7 +2058,7 @@ struct ImBuf *imb_load_openexr(const unsigned char *mem,
           size_t xstride = sizeof(float[4]);
           size_t ystride = -xstride * width;
 
-          imb_addrectfloatImBuf(ibuf);
+          imb_addrectfloatImBuf(ibuf, 4);
 
           /* Inverse correct first pixel for data-window
            * coordinates (- dw.min.y because of y flip). */
diff --git a/source/blender/imbuf/intern/png.c b/source/blender/imbuf/intern/png.c
index 4d6dfac0ba0..e27d649ccbe 100644
--- a/source/blender/imbuf/intern/png.c
+++ b/source/blender/imbuf/intern/png.c
@@ -646,7 +646,7 @@ ImBuf *imb_loadpng(const unsigned char *mem, size_t size, int flags, char colors
 
   if (ibuf && ((flags & IB_test) == 0)) {
     if (bit_depth == 16) {
-      imb_addrectfloatImBuf(ibuf);
+      imb_addrectfloatImBuf(ibuf, 4);
       png_set_swap(png_ptr);
 
       pixels16 = imb_alloc_pixels(ibuf->x, ibuf->y, channels, sizeof(png_uint_16), "pixels");
diff --git a/source/blender/imbuf/intern/stereoimbuf.c b/source/blender/imbuf/intern/stereoimbuf.c
index 2a0baaf6172..ba1840a5fcd 100644
--- a/source/blender/imbuf/intern/stereoimbuf.c
+++ b/source/blender/imbuf/intern/stereoimbuf.c
@@ -761,11 +761,14 @@ ImBuf *IMB_stereo3d_ImBuf(const ImageFormatData *im_format, ImBuf *ibuf_left, Im
 
   IMB_stereo3d_write_dimensions(
       im_format->stereo3d_format.display_mode, false, ibuf_left->x, ibuf_left->y, &width, &height);
-  ibuf_stereo = IMB_allocImBuf(
-      width, height, ibuf_left->planes, (is_float ? IB_rectfloat : IB_rect));
+  ibuf_stereo = IMB_allocImBuf(width, height, ibuf_left->planes, 0);
 
-  ibuf_stereo->rect_colorspace = ibuf_left->rect_colorspace;
-  ibuf_stereo->float_colorspace = ibuf_left->float_colorspace;
+  if (is_float) {
+    imb_addrectfloatImBuf(ibuf_stereo, ibuf_left->channels);
+  }
+  else {
+    imb_addrectImBuf(ibuf_stereo);
+  }
 
   ibuf_stereo->flags = ibuf_left->flags;
 
@@ -773,7 +776,7 @@ ImBuf *IMB_stereo3d_ImBuf(const ImageFormatData *im_format, ImBuf *ibuf_left, Im
                          is_float,
                          ibuf_left->x,
                          ibuf_left->y,
-                         4,
+                         ibuf_left->channels,
                          (int *)ibuf_left->rect,
                          (int *)ibuf_right->rect,
                          (int *)ibuf_stereo->rect,
@@ -1286,10 +1289,17 @@ void IMB_ImBufFromStereo3d(const Stereo3dFormat *s3d,
                                &width,
                                &height);
 
-  ibuf_left = IMB_allocImBuf(
-      width, height, ibuf_stereo3d->planes, (is_float ? IB_rectfloat : IB_rect));
-  ibuf_right = IMB_allocImBuf(
-      width, height, ibuf_stereo3d->planes, (is_float ? IB_rectfloat : IB_rect));
+  ibuf_left = IMB_allocImBuf(width, height, ibuf_stereo3d->planes, 0);
+  ibuf_right = IMB_allocImBuf(width, height, ibuf_stereo3d->planes, 0);
+
+  if (is_float) {
+    imb_addrectfloatImBuf(ibuf_left, ibuf_stereo3d->channels);
+    imb_addrectfloatImBuf(ibuf_right, ibuf_stereo3d->channels);
+  }
+  else {
+    imb_addrectImBuf(ibuf_left);
+    imb_addrectImBuf(ibuf_right);
+  }
 
   ibuf_left->flags = ibuf_stereo3d->flags;
   ibuf_right->flags = ibuf_stereo3d->flags;
@@ -1307,7 +1317,7 @@ void IMB_ImBufFromStereo3d(const Stereo3dFormat *s3d,
                          is_float,
                          ibuf_left->x,
                          ibuf_left->y,
-                         4,
+                         ibuf_left->channels,
                          (int *)ibuf_left->rect,
                          (int *)ibuf_right->rect,
                          (int *)ibuf_stereo3d->rect,
diff --git a/source/blender/sequencer/intern/modifier.c b/source/blender/sequencer/intern/modifier.c
index b0f2f53396b..b17db8f762e 100644
--- a/source/blender/sequencer/intern/modifier.c
+++ b/source/blender/sequencer/intern/modifier.c
@@ -598,7 +598,7 @@ static void modifier_color_balance_apply(
   ColorBalanceInitData init_data;
 
   if (!ibuf->rect_float && make_float) {
-    imb_addrectfloatImBuf(ibuf);
+    imb_addrectfloatImBuf(ibuf, 4);
   }
 
   init_data.cb = cb;
diff --git a/source/blender/sequencer/intern/render.c b/source/blender/sequencer/intern/render.c
index b7dc0e7035d..fd3b6103b94 100644
--- a/source/blender/sequencer/intern/render.c
+++ b/source/blender/sequencer/intern/render.c
@@ -134,7 +134,7 @@ void seq_imbuf_to_sequencer_space(Scene *scene, ImBuf *ibuf, bool make_float)
       /* We perform conversion to a float buffer so we don't worry about
        * precision loss.
        */
-      imb_addrectfloatImBuf(ibuf);
+      imb_addrectfloatImBuf(ibuf, 4);
       IMB_colormanagement_transform_from_byte_threaded(ibuf->rect_float,
                                                        (unsigned char *)ibuf->rect,
                                                        ibuf->x,



More information about the Bf-blender-cvs mailing list