[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50774] trunk/blender/source/blender: Fix #32603: Multi-Layer EXR files can't be color managed

Sergey Sharybin sergey.vfx at gmail.com
Thu Sep 20 12:07:49 CEST 2012


Revision: 50774
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50774
Author:   nazgul
Date:     2012-09-20 10:07:49 +0000 (Thu, 20 Sep 2012)
Log Message:
-----------
Fix #32603: Multi-Layer EXR files can't be color managed

Issue was caused by completely different way how multi-layer EXRs are loading,
they're bypassing general image buffer loading functions.

Solved by running color space transformation on render result construction
from multi-layer EXR image.

Also fixed issue with wrong display buffer computing for buffers with less
than 4 channels. Issues were:

- Display buffer is always expected to be RGBA
- OpenColorIO can not apply color space transformations on non-{RGB, RGBA}
  pixels.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/image.c
    trunk/blender/source/blender/imbuf/intern/colormanagement.c
    trunk/blender/source/blender/render/extern/include/RE_pipeline.h
    trunk/blender/source/blender/render/intern/include/render_result.h
    trunk/blender/source/blender/render/intern/source/pipeline.c
    trunk/blender/source/blender/render/intern/source/render_result.c

Modified: trunk/blender/source/blender/blenkernel/intern/image.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/image.c	2012-09-20 09:19:49 UTC (rev 50773)
+++ trunk/blender/source/blender/blenkernel/intern/image.c	2012-09-20 10:07:49 UTC (rev 50774)
@@ -2213,8 +2213,10 @@
 /* in that case we have to build a render-result */
 static void image_create_multilayer(Image *ima, ImBuf *ibuf, int framenr)
 {
+	const char *colorspace = ima->colorspace_settings.name;
+	int predivide = ima->flag & IMA_CM_PREDIVIDE;
 
-	ima->rr = RE_MultilayerConvert(ibuf->userdata, ibuf->x, ibuf->y);
+	ima->rr = RE_MultilayerConvert(ibuf->userdata, colorspace, predivide, ibuf->x, ibuf->y);
 
 #ifdef WITH_OPENEXR
 	IMB_exr_close(ibuf->userdata);

Modified: trunk/blender/source/blender/imbuf/intern/colormanagement.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/colormanagement.c	2012-09-20 09:19:49 UTC (rev 50773)
+++ trunk/blender/source/blender/imbuf/intern/colormanagement.c	2012-09-20 10:07:49 UTC (rev 50774)
@@ -68,7 +68,8 @@
 
 /*********************** Global declarations *************************/
 
-#define MAX_COLORSPACE_NAME 64
+#define MAX_COLORSPACE_NAME     64
+#define DISPLAY_BUFFER_CHANNELS 4
 
 /* ** list of all supported color spaces, displays and views */
 static char global_role_scene_linear[MAX_COLORSPACE_NAME];
@@ -329,8 +330,7 @@
 		ColormnaageCacheData *cache_data;
 
 		BLI_assert(cache_ibuf->x == ibuf->x &&
-		           cache_ibuf->y == ibuf->y &&
-		           cache_ibuf->channels == ibuf->channels);
+		           cache_ibuf->y == ibuf->y);
 
 		/* only buffers with different color space conversions are being stored
 		 * in cache separately. buffer which were used only different exposure/gamma
@@ -1089,6 +1089,7 @@
 	int is_data = ibuf->colormanage_flag & IMB_COLORMANAGE_IS_DATA;
 
 	int offset = channels * start_line * ibuf->x;
+	int display_buffer_byte_offset = DISPLAY_BUFFER_CHANNELS * start_line * ibuf->x;
 
 	memset(handle, 0, sizeof(DisplayBufferThread));
 
@@ -1104,7 +1105,7 @@
 		handle->display_buffer = init_data->display_buffer + offset;
 
 	if (init_data->display_buffer_byte)
-		handle->display_buffer_byte = init_data->display_buffer_byte + offset;
+		handle->display_buffer_byte = init_data->display_buffer_byte + display_buffer_byte_offset;
 
 	handle->width = ibuf->x;
 
@@ -1655,7 +1656,7 @@
 			return display_buffer;
 		}
 
-		buffer_size = ibuf->channels * ibuf->x * ibuf->y * sizeof(float);
+		buffer_size = DISPLAY_BUFFER_CHANNELS * ibuf->x * ibuf->y * sizeof(float);
 		display_buffer = MEM_callocN(buffer_size, "imbuf display buffer");
 
 		colormanage_display_buffer_process(ibuf, display_buffer, applied_view_settings, display_settings);
@@ -1700,7 +1701,7 @@
                                         const ColorManagedDisplaySettings *display_settings, int predivide)
 {
 	if (global_tot_display == 0 || global_tot_view == 0) {
-		IMB_buffer_byte_from_float(display_buffer, linear_buffer, 4, 0.0f, IB_PROFILE_SRGB, IB_PROFILE_LINEAR_RGB, FALSE,
+		IMB_buffer_byte_from_float(display_buffer, linear_buffer, channels, 0.0f, IB_PROFILE_SRGB, IB_PROFILE_LINEAR_RGB, FALSE,
 		                           width, height, width, width);
 	}
 	else {
@@ -2351,7 +2352,7 @@
 		}
 	}
 
-	if (cm_processor->processor) {
+	if (cm_processor->processor && channels >= 3) {
 		PackedImageDesc *img;
 
 		/* apply OCIO processor */

Modified: trunk/blender/source/blender/render/extern/include/RE_pipeline.h
===================================================================
--- trunk/blender/source/blender/render/extern/include/RE_pipeline.h	2012-09-20 09:19:49 UTC (rev 50773)
+++ trunk/blender/source/blender/render/extern/include/RE_pipeline.h	2012-09-20 10:07:49 UTC (rev 50774)
@@ -225,7 +225,7 @@
 
 int RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
 int RE_WriteRenderResult(struct ReportList *reports, RenderResult *rr, const char *filename, int compress);
-struct RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty);
+struct RenderResult *RE_MultilayerConvert(void *exrhandle, const char *colorspace, int predivide, int rectx, int recty);
 
 extern const float default_envmap_layout[];
 int RE_WriteEnvmapResult(struct ReportList *reports, struct Scene *scene, struct EnvMap *env, const char *relpath, const char imtype, float layout[12]);

Modified: trunk/blender/source/blender/render/intern/include/render_result.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/render_result.h	2012-09-20 09:19:49 UTC (rev 50773)
+++ trunk/blender/source/blender/render/intern/include/render_result.h	2012-09-20 10:07:49 UTC (rev 50774)
@@ -57,7 +57,7 @@
 struct RenderResult *render_result_new_full_sample(struct Render *re,
 	struct ListBase *lb, struct rcti *partrct, int crop, int savebuffers);
 
-struct RenderResult *render_result_new_from_exr(void *exrhandle, int rectx, int recty);
+struct RenderResult *render_result_new_from_exr(void *exrhandle, const char *colorspace, int predivide, int rectx, int recty);
 
 /* Merge */
 

Modified: trunk/blender/source/blender/render/intern/source/pipeline.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/pipeline.c	2012-09-20 09:19:49 UTC (rev 50773)
+++ trunk/blender/source/blender/render/intern/source/pipeline.c	2012-09-20 10:07:49 UTC (rev 50774)
@@ -203,9 +203,9 @@
 	}
 }
 
-RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty)
+RenderResult *RE_MultilayerConvert(void *exrhandle, const char *colorspace, int predivide, int rectx, int recty)
 {
-	return render_result_new_from_exr(exrhandle, rectx, recty);
+	return render_result_new_from_exr(exrhandle, colorspace, predivide, rectx, recty);
 }
 
 RenderLayer *render_get_active_layer(Render *re, RenderResult *rr)

Modified: trunk/blender/source/blender/render/intern/source/render_result.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/render_result.c	2012-09-20 09:19:49 UTC (rev 50773)
+++ trunk/blender/source/blender/render/intern/source/render_result.c	2012-09-20 10:07:49 UTC (rev 50774)
@@ -627,12 +627,13 @@
 }
 
 /* from imbuf, if a handle was returned we convert this to render result */
-RenderResult *render_result_new_from_exr(void *exrhandle, int rectx, int recty)
+RenderResult *render_result_new_from_exr(void *exrhandle, const char *colorspace, int predivide, int rectx, int recty)
 {
 	RenderResult *rr = MEM_callocN(sizeof(RenderResult), __func__);
 	RenderLayer *rl;
 	RenderPass *rpass;
-	
+	const char *to_colorspace = IMB_colormanagement_role_colorspace_name_get(COLOR_ROLE_SCENE_LINEAR);
+
 	rr->rectx = rectx;
 	rr->recty = recty;
 	
@@ -645,6 +646,11 @@
 		for (rpass = rl->passes.first; rpass; rpass = rpass->next) {
 			rpass->rectx = rectx;
 			rpass->recty = recty;
+
+			if (rpass->channels >= 3) {
+				IMB_colormanagement_transform(rpass->rect, rpass->rectx, rpass->recty, rpass->channels,
+				                              colorspace, to_colorspace, predivide);
+			}
 		}
 	}
 	




More information about the Bf-blender-cvs mailing list