[Bf-blender-cvs] [6889305] bake-cycles: IMB buffer functions to take a mask as input

Dalai Felinto noreply at git.blender.org
Sat Apr 26 02:45:57 CEST 2014


Commit: 68893054fb1017e40fb85e6b1136c717a865a4fb
Author: Dalai Felinto
Date:   Fri Apr 25 21:34:00 2014 -0300
https://developer.blender.org/rB68893054fb1017e40fb85e6b1136c717a865a4fb

IMB buffer functions to take a mask as input

IMB_buffer_byte_from_float_mask and IMB_buffer_float_from_float_mask
The mask make sure the conversion only happens in a few areas of the
buffer.

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

M	source/blender/imbuf/IMB_imbuf.h
M	source/blender/imbuf/intern/divers.c

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

diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index 47f1864..f446f25 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -388,12 +388,18 @@ void IMB_saturation(struct ImBuf *ibuf, float sat);
 void IMB_buffer_byte_from_float(unsigned char *rect_to, const float *rect_from,
 	int channels_from, float dither, int profile_to, int profile_from, bool predivide,
 	int width, int height, int stride_to, int stride_from);
+void IMB_buffer_byte_from_float_mask(unsigned char *rect_to, const float *rect_from,
+	int channels_from, float dither, int profile_to, int profile_from, bool predivide,
+	int width, int height, int stride_to, int stride_from, char *mask);
 void IMB_buffer_float_from_byte(float *rect_to, const unsigned char *rect_from,
 	int profile_to, int profile_from, bool predivide,
 	int width, int height, int stride_to, int stride_from);
 void IMB_buffer_float_from_float(float *rect_to, const float *rect_from,
 	int channels_from, int profile_to, int profile_from, bool predivide,
 	int width, int height, int stride_to, int stride_from);
+void IMB_buffer_float_from_float_mask(float *rect_to, const float *rect_from,
+	int channels_from, int profile_to, int profile_from, bool predivide,
+	int width, int height, int stride_to, int stride_from, char *mask);
 void IMB_buffer_byte_from_byte(unsigned char *rect_to, const unsigned char *rect_from,
 	int profile_to, int profile_from, bool predivide,
 	int width, int height, int stride_to, int stride_from);
diff --git a/source/blender/imbuf/intern/divers.c b/source/blender/imbuf/intern/divers.c
index 0bd5c5c..565d068 100644
--- a/source/blender/imbuf/intern/divers.c
+++ b/source/blender/imbuf/intern/divers.c
@@ -327,6 +327,191 @@ void IMB_buffer_byte_from_float(uchar *rect_to, const float *rect_from,
 		clear_dither_context(di);
 }
 
+
+/* float to byte pixels, output 4-channel RGBA */
+void IMB_buffer_byte_from_float_mask(uchar *rect_to, const float *rect_from,
+                                int channels_from, float dither, int profile_to, int profile_from, bool predivide,
+                                int width, int height, int stride_to, int stride_from, char *mask)
+{
+	float tmp[4];
+	int x, y;
+	DitherContext *di = NULL;
+	float inv_width = 1.0f / width,
+	inv_height = 1.0f / height;
+
+	/* we need valid profiles */
+	BLI_assert(profile_to != IB_PROFILE_NONE);
+	BLI_assert(profile_from != IB_PROFILE_NONE);
+
+	if (dither)
+		di = create_dither_context(dither);
+
+	for (y = 0; y < height; y++) {
+		printf("\n");
+		float t = y * inv_height;
+
+		if (channels_from == 1) {
+			/* single channel input */
+			const float *from = rect_from + stride_from * y;
+			uchar *to = rect_to + stride_to * y * 4;
+
+			for (x = 0; x < width; x++, from++, to += 4)
+				if (*mask++ == FILTER_MASK_USED)
+					to[0] = to[1] = to[2] = to[3] = FTOCHAR(from[0]);
+		}
+		else if (channels_from == 3) {
+			/* RGB input */
+			const float *from = rect_from + stride_from * y * 3;
+			uchar *to = rect_to + stride_to * y * 4;
+
+			if (profile_to == profile_from) {
+				/* no color space conversion */
+				for (x = 0; x < width; x++, from += 3, to += 4) {
+					if (*mask++ == FILTER_MASK_USED) {
+						rgb_float_to_uchar(to, from);
+						to[3] = 255;
+					}
+				}
+			}
+			else if (profile_to == IB_PROFILE_SRGB) {
+				/* convert from linear to sRGB */
+				for (x = 0; x < width; x++, from += 3, to += 4) {
+					if (*mask++ == FILTER_MASK_USED) {
+						linearrgb_to_srgb_v3_v3(tmp, from);
+						rgb_float_to_uchar(to, tmp);
+						to[3] = 255;
+					}
+				}
+			}
+			else if (profile_to == IB_PROFILE_LINEAR_RGB) {
+				/* convert from sRGB to linear */
+				for (x = 0; x < width; x++, from += 3, to += 4) {
+					if (*mask++ == FILTER_MASK_USED) {
+						srgb_to_linearrgb_v3_v3(tmp, from);
+						rgb_float_to_uchar(to, tmp);
+						to[3] = 255;
+					}
+				}
+			}
+		}
+		else if (channels_from == 4) {
+			/* RGBA input */
+			const float *from = rect_from + stride_from * y * 4;
+			uchar *to = rect_to + stride_to * y * 4;
+
+			if (profile_to == profile_from) {
+				float straight[4];
+
+				/* no color space conversion */
+				if (dither && predivide) {
+					for (x = 0; x < width; x++, from += 4, to += 4) {
+						if (*mask++ == FILTER_MASK_USED) {
+							premul_to_straight_v4_v4(straight, from);
+							float_to_byte_dither_v4(to, straight, di, (float) x * inv_width, t);
+						}
+					}
+				}
+				else if (dither) {
+					for (x = 0; x < width; x++, from += 4, to += 4)
+						if (*mask++ == FILTER_MASK_USED)
+							float_to_byte_dither_v4(to, from, di, (float) x * inv_width, t);
+				}
+				else if (predivide) {
+					for (x = 0; x < width; x++, from += 4, to += 4) {
+						if (*mask++ == FILTER_MASK_USED) {
+							premul_to_straight_v4_v4(straight, from);
+							rgba_float_to_uchar(to, straight);
+						}
+					}
+				}
+				else {
+					for (x = 0; x < width; x++, from += 4, to += 4)
+						if (*mask++ == FILTER_MASK_USED)
+							rgba_float_to_uchar(to, from);
+				}
+			}
+			else if (profile_to == IB_PROFILE_SRGB) {
+				/* convert from linear to sRGB */
+				unsigned short us[4];
+				float straight[4];
+
+				if (dither && predivide) {
+					for (x = 0; x < width; x++, from += 4, to += 4) {
+						if (*mask++ == FILTER_MASK_USED) {
+							premul_to_straight_v4_v4(straight, from);
+							linearrgb_to_srgb_ushort4(us, from);
+							ushort_to_byte_dither_v4(to, us, di, (float) x * inv_width, t);
+						}
+					}
+				}
+				else if (dither) {
+					for (x = 0; x < width; x++, from += 4, to += 4) {
+						if (*mask++ == FILTER_MASK_USED) {
+							linearrgb_to_srgb_ushort4(us, from);
+							ushort_to_byte_dither_v4(to, us, di, (float) x * inv_width, t);
+						}
+					}
+				}
+				else if (predivide) {
+					for (x = 0; x < width; x++, from += 4, to += 4) {
+						if (*mask++ == FILTER_MASK_USED) {
+							premul_to_straight_v4_v4(straight, from);
+							linearrgb_to_srgb_ushort4(us, from);
+							ushort_to_byte_v4(to, us);
+						}
+					}
+				}
+				else {
+					for (x = 0; x < width; x++, from += 4, to += 4) {
+						if (*mask++ == FILTER_MASK_USED) {
+							linearrgb_to_srgb_ushort4(us, from);
+							ushort_to_byte_v4(to, us);
+						}
+					}
+				}
+			}
+			else if (profile_to == IB_PROFILE_LINEAR_RGB) {
+				/* convert from sRGB to linear */
+				if (dither && predivide) {
+					for (x = 0; x < width; x++, from += 4, to += 4) {
+						if (*mask++ == FILTER_MASK_USED) {
+							srgb_to_linearrgb_predivide_v4(tmp, from);
+							float_to_byte_dither_v4(to, tmp, di, (float) x * inv_width, t);
+						}
+					}
+				}
+				else if (dither) {
+					for (x = 0; x < width; x++, from += 4, to += 4) {
+						if (*mask++ == FILTER_MASK_USED) {
+							srgb_to_linearrgb_v4(tmp, from);
+							float_to_byte_dither_v4(to, tmp, di, (float) x * inv_width, t);
+						}
+					}
+				}
+				else if (predivide) {
+					for (x = 0; x < width; x++, from += 4, to += 4) {
+						if (*mask++ == FILTER_MASK_USED) {
+							srgb_to_linearrgb_predivide_v4(tmp, from);
+							rgba_float_to_uchar(to, tmp);
+						}
+					}
+				}
+				else {
+					for (x = 0; x < width; x++, from += 4, to += 4) {
+						if (*mask++ == FILTER_MASK_USED) {
+							srgb_to_linearrgb_v4(tmp, from);
+							rgba_float_to_uchar(to, tmp);
+						}
+					}
+				}
+			}
+		}
+	}
+
+	if (dither)
+		clear_dither_context(di);
+}
+
 /* byte to float pixels, input and output 4-channel RGBA  */
 void IMB_buffer_float_from_byte(float *rect_to, const uchar *rect_from,
                                 int profile_to, int profile_from, bool predivide,
@@ -466,6 +651,105 @@ void IMB_buffer_float_from_float(float *rect_to, const float *rect_from,
 	}
 }
 
+/* float to float pixels, output 4-channel RGBA */
+void IMB_buffer_float_from_float_mask(float *rect_to, const float *rect_from,
+                                 int channels_from, int profile_to, int profile_from, bool predivide,
+                                 int width, int height, int stride_to, int stride_from, char *mask)
+{
+	int x, y;
+
+	/* we need valid profiles */
+	BLI_assert(profile_to != IB_PROFILE_NONE);
+	BLI_assert(profile_from != IB_PROFILE_NONE);
+
+	if (channels_from == 1) {
+		/* single channel input */
+		for (y = 0; y < height; y++) {
+			const float *from = rect_from + stride_from * y;
+			float *to = rect_to + stride_to * y * 4;
+
+			for (x = 0; x < width; x++, from++, to += 4)
+				if (*mask++ == FILTER_MASK_USED)
+					to[0] = to[1] = to[2] = to[3] = from[0];
+		}
+	}
+	else if (channels_from == 3) {
+		/* RGB input */
+		for (y = 0; y < height; y++) {
+			const float *from = rect_from + stride_from * y * 3;
+			float *to = rect_to + stride_to * y * 4;
+
+			if (profile_to == profile_from) {
+				/* no color space conversion */
+				for (x = 0; x < width; x++, from += 3, to += 4) {
+					if (*mask++ == FILTER_MASK_USED) {
+						copy_v3_v3(to, from);
+						to[3] = 1.0f;
+					}
+				}
+			}
+			else if (profile_to == IB_PROFILE_LINEAR_RGB) {
+				/* convert from sRGB to linear */
+				for (x = 0; x < width; x++, from += 3, to += 4) {
+					if (*mask++ == FILTER_MASK_USED) {
+						srgb_to_linearrgb_v3_v3(to, from);
+						to[3] = 1.0f;
+					}
+				}
+			}
+			else if (profile_to == IB_PROFILE_SRGB) {
+				/* convert from linear to sRGB */
+				for (x = 0; x < width; x++, from += 3, to += 4) {
+					if (*mask++ == FILTER_MASK_USED) {
+						linearrgb_to_srgb_v3_v3(to, from);
+						to[3] = 1.0f;
+					}
+				}
+			}
+		}
+	}
+	else if (channels_from == 4) {
+		/* RGBA input */
+		for (y = 0; y < height; y++) {
+			const float *from = rect_from + stride_from * y * 4;
+			float *to = rect_to + stride_to * y * 4;
+
+			if (profile_to == profile_from) {
+				/* same profile, copy */
+				for (x = 0; x < width; x++, from += 4, to += 4)
+					if (*mask++ == FILTER_MASK_USED)
+						copy_v4_v4(to, from);
+			}
+			else if (profile_to == IB_PROFILE_LINEAR_RGB) {
+				/* convert to sRGB to linear */
+				if (predivide) {
+					for (x = 0; x < width; x++, from += 4, to += 4)
+						if (*mask++ == FILTER_MASK_USED)
+							srgb_to_linearrgb_predivide_v4(to, from);
+				}
+				else {
+					for (x = 0; x < width; x++

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list