[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54746] trunk/blender/source/blender/imbuf /intern: Fix #34359: 2.66 crashes when using output node

Sergey Sharybin sergey.vfx at gmail.com
Fri Feb 22 10:20:23 CET 2013


Revision: 54746
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54746
Author:   nazgul
Date:     2013-02-22 09:20:22 +0000 (Fri, 22 Feb 2013)
Log Message:
-----------
Fix #34359: 2.66 crashes when using output node

16bit PNG and Jpeg2K exporters were not aware of the simple
fact that float buffer could have only 3 or 1 channels.

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

Modified: trunk/blender/source/blender/imbuf/intern/jp2.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/jp2.c	2013-02-22 07:37:17 UTC (rev 54745)
+++ trunk/blender/source/blender/imbuf/intern/jp2.c	2013-02-22 09:20:22 UTC (rev 54746)
@@ -108,6 +108,13 @@
 		     i++, _rect += 4)                                                 \
 		{                                                                     \
 
+#   define PIXEL_LOOPER_BEGIN_CHANNELS(_rect, _channels)                      \
+	for (y = h - 1; y != (unsigned int)(-1); y--) {                           \
+		for (i = y * w, i_next = (y + 1) * w;                                 \
+		     i < i_next;                                                      \
+		     i++, _rect += _channels)                                         \
+		{                                                                     \
+
 #   define PIXEL_LOOPER_END \
 	} \
 	} (void)0 \
@@ -663,76 +670,198 @@
 	}
 	
 	if (rect_float) {
+		int channels_in_float = ibuf->channels ? ibuf->channels : 4;
+
 		switch (prec) {
 			case 8: /* Convert blenders float color channels to 8, 12 or 16bit ints */
 				if (numcomps == 4) {
-					PIXEL_LOOPER_BEGIN(rect_float)
-					{
-						premul_to_straight_v4_v4(from_straight, rect_float);
-						r[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(from_straight[0]));
-						g[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(from_straight[1]));
-						b[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(from_straight[2]));
-						a[i] = DOWNSAMPLE_FLOAT_TO_8BIT(from_straight[3]);
+					if (channels_in_float == 4) {
+						PIXEL_LOOPER_BEGIN(rect_float)
+						{
+							premul_to_straight_v4_v4(from_straight, rect_float);
+							r[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(from_straight[0]));
+							g[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(from_straight[1]));
+							b[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(from_straight[2]));
+							a[i] = DOWNSAMPLE_FLOAT_TO_8BIT(from_straight[3]);
+						}
+						PIXEL_LOOPER_END;
 					}
-					PIXEL_LOOPER_END;
+					else if (channels_in_float == 3) {
+						PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 3)
+						{
+							r[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(rect_float[0]));
+							g[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(rect_float[1]));
+							b[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(rect_float[2]));
+							a[i] = 255;
+						}
+						PIXEL_LOOPER_END;
+					}
+					else {
+						PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 1)
+						{
+							r[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(rect_float[0]));
+							g[i] = b[i] = r[i];
+							a[i] = 255;
+						}
+						PIXEL_LOOPER_END;
+					}
 				}
 				else {
-					PIXEL_LOOPER_BEGIN(rect_float)
-					{
-						premul_to_straight_v4_v4(from_straight, rect_float);
-						r[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(from_straight[0]));
-						g[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(from_straight[1]));
-						b[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(from_straight[2]));
+					if (channels_in_float == 4) {
+						PIXEL_LOOPER_BEGIN(rect_float)
+						{
+							premul_to_straight_v4_v4(from_straight, rect_float);
+							r[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(from_straight[0]));
+							g[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(from_straight[1]));
+							b[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(from_straight[2]));
+						}
+						PIXEL_LOOPER_END;
 					}
-					PIXEL_LOOPER_END;
+					else if (channels_in_float == 3) {
+						PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 3)
+						{
+							r[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(rect_float[0]));
+							g[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(rect_float[1]));
+							b[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(rect_float[2]));
+						}
+						PIXEL_LOOPER_END;
+					}
+					else {
+						PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 1)
+						{
+							r[i] = DOWNSAMPLE_FLOAT_TO_8BIT(chanel_colormanage_cb(rect_float[0]));
+							g[i] = b[i] = r[i];
+						}
+						PIXEL_LOOPER_END;
+					}
 				}
 				break;
 			
 			case 12:
 				if (numcomps == 4) {
-					PIXEL_LOOPER_BEGIN(rect_float)
-					{
-						premul_to_straight_v4_v4(from_straight, rect_float);
-						r[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(from_straight[0]));
-						g[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(from_straight[1]));
-						b[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(from_straight[2]));
-						a[i] = DOWNSAMPLE_FLOAT_TO_12BIT(from_straight[3]);
+					if (channels_in_float == 4) {
+						PIXEL_LOOPER_BEGIN(rect_float)
+						{
+							premul_to_straight_v4_v4(from_straight, rect_float);
+							r[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(from_straight[0]));
+							g[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(from_straight[1]));
+							b[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(from_straight[2]));
+							a[i] = DOWNSAMPLE_FLOAT_TO_12BIT(from_straight[3]);
+						}
+						PIXEL_LOOPER_END;
 					}
-					PIXEL_LOOPER_END;
+					else if (channels_in_float == 3) {
+						PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 3)
+						{
+							r[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(rect_float[0]));
+							g[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(rect_float[1]));
+							b[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(rect_float[2]));
+							a[i] = 4095;
+						}
+						PIXEL_LOOPER_END;
+					}
+					else {
+						PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 1)
+						{
+							r[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(rect_float[0]));
+							g[i] = b[i] = r[i];
+							a[i] = 4095;
+						}
+						PIXEL_LOOPER_END;
+					}
 				}
 				else {
-					PIXEL_LOOPER_BEGIN(rect_float)
-					{
-						premul_to_straight_v4_v4(from_straight, rect_float);
-						r[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(from_straight[0]));
-						g[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(from_straight[1]));
-						b[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(from_straight[2]));
+					if (channels_in_float == 4) {
+						PIXEL_LOOPER_BEGIN(rect_float)
+						{
+							premul_to_straight_v4_v4(from_straight, rect_float);
+							r[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(from_straight[0]));
+							g[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(from_straight[1]));
+							b[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(from_straight[2]));
+						}
+						PIXEL_LOOPER_END;
 					}
-					PIXEL_LOOPER_END;
+					else if (channels_in_float == 3) {
+						PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 3)
+						{
+							r[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(rect_float[0]));
+							g[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(rect_float[1]));
+							b[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(rect_float[2]));
+						}
+						PIXEL_LOOPER_END;
+					}
+					else {
+						PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 1)
+						{
+							r[i] = DOWNSAMPLE_FLOAT_TO_12BIT(chanel_colormanage_cb(rect_float[0]));
+							g[i] = b[i] = r[i];
+						}
+						PIXEL_LOOPER_END;
+					}
 				}
 				break;
 
 			case 16:
 				if (numcomps == 4) {
-					PIXEL_LOOPER_BEGIN(rect_float)
-					{
-						premul_to_straight_v4_v4(from_straight, rect_float);
-						r[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(from_straight[0]));
-						g[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(from_straight[1]));
-						b[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(from_straight[2]));
-						a[i] = DOWNSAMPLE_FLOAT_TO_16BIT(from_straight[3]);
+					if (channels_in_float == 4){
+						PIXEL_LOOPER_BEGIN(rect_float)
+						{
+							premul_to_straight_v4_v4(from_straight, rect_float);
+							r[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(from_straight[0]));
+							g[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(from_straight[1]));
+							b[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(from_straight[2]));
+							a[i] = DOWNSAMPLE_FLOAT_TO_16BIT(from_straight[3]);
+						}
+						PIXEL_LOOPER_END;
 					}
-					PIXEL_LOOPER_END;
+					else if (channels_in_float == 3) {
+						PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 3)
+						{
+							r[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(rect_float[0]));
+							g[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(rect_float[1]));
+							b[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(rect_float[2]));
+							a[i] = 65535;
+						}
+						PIXEL_LOOPER_END;
+					}
+					else {
+						PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 1)
+						{
+							r[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(rect_float[0]));
+							g[i] = b[i] = r[i];
+							a[i] = 65535;
+						}
+						PIXEL_LOOPER_END;
+					}
 				}
 				else {
-					PIXEL_LOOPER_BEGIN(rect_float)
-					{
-						premul_to_straight_v4_v4(from_straight, rect_float);
-						r[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(from_straight[0]));
-						g[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(from_straight[1]));
-						b[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(from_straight[2]));
+					if (channels_in_float == 4) {
+						PIXEL_LOOPER_BEGIN(rect_float)
+						{
+							premul_to_straight_v4_v4(from_straight, rect_float);
+							r[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(from_straight[0]));
+							g[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(from_straight[1]));
+							b[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(from_straight[2]));
+						}
+						PIXEL_LOOPER_END;
 					}
-					PIXEL_LOOPER_END;
+					else if (channels_in_float == 3) {
+						PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 3)
+						{
+							r[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(rect_float[0]));
+							g[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(rect_float[1]));
+							b[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(rect_float[2]));
+						}
+						PIXEL_LOOPER_END;
+					}
+					else {
+						PIXEL_LOOPER_BEGIN_CHANNELS(rect_float, 1)
+						{
+							r[i] = DOWNSAMPLE_FLOAT_TO_16BIT(chanel_colormanage_cb(rect_float[0]));
+							g[i] = b[i] = r[i];
+						}
+						PIXEL_LOOPER_END;
+					}
 				}
 				break;
 		}

Modified: trunk/blender/source/blender/imbuf/intern/png.c
===================================================================

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list