[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56065] trunk/blender/source/blender/imbuf /intern/colormanagement.c: Fix #34967: Display transform makes byte image with alpha=0 black

Sergey Sharybin sergey.vfx at gmail.com
Mon Apr 15 17:41:53 CEST 2013


Revision: 56065
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56065
Author:   nazgul
Date:     2013-04-15 15:41:53 +0000 (Mon, 15 Apr 2013)
Log Message:
-----------
Fix #34967: Display transform makes byte image with alpha=0 black

Skip premultiplication/de-premultiplication when acquiring display
buffer for a byte image. Will make conversion a bit faster also :)

Modified Paths:
--------------
    trunk/blender/source/blender/imbuf/intern/colormanagement.c

Modified: trunk/blender/source/blender/imbuf/intern/colormanagement.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/colormanagement.c	2013-04-15 15:16:11 UTC (rev 56064)
+++ trunk/blender/source/blender/imbuf/intern/colormanagement.c	2013-04-15 15:41:53 UTC (rev 56065)
@@ -1213,7 +1213,7 @@
 	handle->float_colorspace = init_data->float_colorspace;
 }
 
-static void *display_buffer_apply_get_linear_buffer(DisplayBufferThread *handle)
+static float *display_buffer_apply_get_linear_buffer(DisplayBufferThread *handle, bool *is_straight_alpha)
 {
 	float *linear_buffer = NULL;
 
@@ -1248,7 +1248,6 @@
 			}
 			else if (channels == 4) {
 				rgba_uchar_to_float(fp, cp);
-				straight_to_premul_v4(fp);
 			}
 			else {
 				BLI_assert(!"Buffers of 3 or 4 channels are only supported here");
@@ -1258,8 +1257,10 @@
 		if (!is_data && !is_data_display) {
 			/* convert float buffer to scene linear space */
 			IMB_colormanagement_transform(linear_buffer, width, height, channels,
-			                              from_colorspace, to_colorspace, TRUE);
+			                              from_colorspace, to_colorspace, FALSE);
 		}
+
+		*is_straight_alpha = true;
 	}
 	else if (handle->float_colorspace) {
 		/* currently float is non-linear only in sequencer, which is working
@@ -1275,6 +1276,8 @@
 
 		IMB_colormanagement_transform(linear_buffer, width, height, channels,
 		                              from_colorspace, to_colorspace, TRUE);
+
+		*is_straight_alpha = false;
 	}
 	else {
 		/* some processors would want to modify float original buffer
@@ -1287,6 +1290,8 @@
 		 */
 
 		memcpy(linear_buffer, handle->buffer, buffer_size * sizeof(float));
+
+		*is_straight_alpha = false;
 	}
 
 	return linear_buffer;
@@ -1316,7 +1321,9 @@
 		}
 	}
 	else {
-		float *linear_buffer = display_buffer_apply_get_linear_buffer(handle);
+		bool is_straight_alpha;
+		float *linear_buffer = display_buffer_apply_get_linear_buffer(handle, &is_straight_alpha);
+		bool predivide = is_straight_alpha == false;
 
 		if (is_data) {
 			/* special case for data buffers - no color space conversions,
@@ -1325,7 +1332,8 @@
 		}
 		else {
 			/* apply processor */
-			IMB_colormanagement_processor_apply(cm_processor, linear_buffer, width, height, channels, TRUE);
+			IMB_colormanagement_processor_apply(cm_processor, linear_buffer, width, height, channels,
+			                                    predivide);
 		}
 
 		/* copy result to output buffers */
@@ -1333,12 +1341,25 @@
 			/* do conversion */
 			IMB_buffer_byte_from_float(display_buffer_byte, linear_buffer,
 			                           channels, dither, IB_PROFILE_SRGB, IB_PROFILE_SRGB,
-			                           TRUE, width, height, width, width);
+			                           predivide, width, height, width, width);
 		}
 
-		if (display_buffer)
+		if (display_buffer) {
 			memcpy(display_buffer, linear_buffer, width * height * channels * sizeof(float));
 
+			if (is_straight_alpha && channels == 4) {
+				int i;
+				float *fp;
+
+				for (i = 0, fp = display_buffer;
+				     i < width * height;
+				     i++, fp += channels)
+				{
+					straight_to_premul_v4(fp);
+				}
+			}
+		}
+
 		MEM_freeN(linear_buffer);
 	}
 




More information about the Bf-blender-cvs mailing list