[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43378] trunk/blender/source/blender: add utility function to BLI_math_color - rgb_to_luma, rgb_to_luma_byte, also use rgb_to_grayscale in more places.
Campbell Barton
ideasman42 at gmail.com
Sat Jan 14 18:14:33 CET 2012
Revision: 43378
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43378
Author: campbellbarton
Date: 2012-01-14 17:14:23 +0000 (Sat, 14 Jan 2012)
Log Message:
-----------
add utility function to BLI_math_color - rgb_to_luma, rgb_to_luma_byte, also use rgb_to_grayscale in more places.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/intern/colortools.c
trunk/blender/source/blender/blenlib/BLI_math_color.h
trunk/blender/source/blender/blenlib/intern/math_color.c
trunk/blender/source/blender/editors/space_image/image_ops.c
trunk/blender/source/blender/editors/space_sequencer/sequencer_scopes.c
trunk/blender/source/blender/render/intern/source/shadeoutput.c
Modified: trunk/blender/source/blender/blenkernel/intern/colortools.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/colortools.c 2012-01-14 16:26:08 UTC (rev 43377)
+++ trunk/blender/source/blender/blenkernel/intern/colortools.c 2012-01-14 17:14:23 UTC (rev 43378)
@@ -1002,7 +1002,7 @@
}
/* we still need luma for histogram */
- luma = 0.299f * rgb[0] + 0.587f * rgb[1] + 0.114f * rgb[2];
+ luma = rgb_to_luma(rgb);
/* check for min max */
if(ycc_mode == -1 ) {
Modified: trunk/blender/source/blender/blenlib/BLI_math_color.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_math_color.h 2012-01-14 16:26:08 UTC (rev 43377)
+++ trunk/blender/source/blender/blenlib/BLI_math_color.h 2012-01-14 17:14:23 UTC (rev 43378)
@@ -69,8 +69,10 @@
unsigned int rgb_to_cpack(float r, float g, float b);
unsigned int hsv_to_cpack(float h, float s, float v);
-float rgb_to_grayscale(float rgb[3]);
-unsigned char rgb_to_grayscale_byte(unsigned char rgb[3]);
+float rgb_to_grayscale(const float rgb[3]);
+unsigned char rgb_to_grayscale_byte(const unsigned char rgb[3]);
+float rgb_to_luma(const float rgb[3]);
+unsigned char rgb_to_luma_byte(const unsigned char rgb[3]);
/**************** Profile Transformations *****************/
Modified: trunk/blender/source/blender/blenlib/intern/math_color.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/math_color.c 2012-01-14 16:26:08 UTC (rev 43377)
+++ trunk/blender/source/blender/blenlib/intern/math_color.c 2012-01-14 17:14:23 UTC (rev 43378)
@@ -434,16 +434,26 @@
return 0; /* Color within RGB gamut */
}
-float rgb_to_grayscale(float rgb[3])
+float rgb_to_grayscale(const float rgb[3])
{
return 0.3f*rgb[0] + 0.58f*rgb[1] + 0.12f*rgb[2];
}
-unsigned char rgb_to_grayscale_byte(unsigned char rgb[3])
+unsigned char rgb_to_grayscale_byte(const unsigned char rgb[3])
{
return (76*(unsigned short)rgb[0] + 148*(unsigned short)rgb[1] + 31*(unsigned short)rgb[2]) / 255;
}
+float rgb_to_luma(const float rgb[3])
+{
+ return 0.299f*rgb[0] + 0.587f*rgb[1] + 0.114f*rgb[2];
+}
+
+unsigned char rgb_to_luma_byte(const unsigned char rgb[3])
+{
+ return (76*(unsigned short)rgb[0] + 150*(unsigned short)rgb[1] + 29*(unsigned short)rgb[2]) / 255;
+}
+
/* ********************************* lift/gamma/gain / ASC-CDL conversion ********************************* */
void lift_gamma_gain_to_asc_cdl(float *lift, float *gamma, float *gain, float *offset, float *slope, float *power)
Modified: trunk/blender/source/blender/editors/space_image/image_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_image/image_ops.c 2012-01-14 16:26:08 UTC (rev 43377)
+++ trunk/blender/source/blender/editors/space_image/image_ops.c 2012-01-14 17:14:23 UTC (rev 43378)
@@ -2016,14 +2016,14 @@
hist->data_r[i] = rgb[0];
hist->data_g[i] = rgb[1];
hist->data_b[i] = rgb[2];
- hist->data_luma[i] = (0.299f*rgb[0] + 0.587f*rgb[1] + 0.114f*rgb[2]);
+ hist->data_luma[i] = rgb_to_luma(rgb);
}
else if (ibuf->rect) {
cp= (unsigned char *)(ibuf->rect + y*ibuf->x + x);
hist->data_r[i] = (float)cp[0]/255.0f;
hist->data_g[i] = (float)cp[1]/255.0f;
hist->data_b[i] = (float)cp[2]/255.0f;
- hist->data_luma[i] = (0.299f*cp[0] + 0.587f*cp[1] + 0.114f*cp[2])/255;
+ hist->data_luma[i] = (float)rgb_to_luma_byte(cp)/255.0f;
}
}
}
Modified: trunk/blender/source/blender/editors/space_sequencer/sequencer_scopes.c
===================================================================
--- trunk/blender/source/blender/editors/space_sequencer/sequencer_scopes.c 2012-01-14 16:26:08 UTC (rev 43377)
+++ trunk/blender/source/blender/editors/space_sequencer/sequencer_scopes.c 2012-01-14 17:14:23 UTC (rev 43378)
@@ -29,16 +29,17 @@
#include <math.h>
#include <string.h>
+#include "BLI_math_color.h"
#include "BLI_utildefines.h"
-
-
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
#include "sequencer_intern.h"
-static void rgb_to_yuv(float rgb[3], float yuv[3])
+/* XXX, why is this function better then BLI_math version?
+ * only difference is it does some normalize after, need to double check on this - campbell */
+static void rgb_to_yuv_normalized(const float rgb[3], float yuv[3])
{
yuv[0]= 0.299f*rgb[0] + 0.587f*rgb[1] + 0.114f*rgb[2];
yuv[1]= 0.492f*(rgb[2] - yuv[0]);
@@ -169,10 +170,7 @@
for (x = 0; x < ibuf->x; x++) {
unsigned char * rgb = src + 4 * (ibuf->x * y + x);
- float v = 1.0 *
- ( 0.299*rgb[0]
- + 0.587*rgb[1]
- + 0.114*rgb[2]) / 255.0;
+ float v = (float)rgb_to_luma_byte(rgb) / 255.0;
unsigned char * p = tgt;
p += 4 * (w * ((int) (v * (h - 3)) + 1) + x + 1);
@@ -215,10 +213,7 @@
for (x = 0; x < ibuf->x; x++) {
float * rgb = src + 4 * (ibuf->x * y + x);
- float v = 1.0f *
- ( 0.299f*rgb[0]
- + 0.587f*rgb[1]
- + 0.114f*rgb[2]);
+ float v = rgb_to_luma(rgb);
unsigned char * p = tgt;
CLAMP(v, 0.0f, 1.0f);
@@ -583,7 +578,7 @@
rgb[0]= (float)r/255.0f;
rgb[1]= (float)g/255.0f;
rgb[2]= (float)b/255.0f;
- rgb_to_yuv(rgb, yuv);
+ rgb_to_yuv_normalized(rgb, yuv);
p = tgt + 4 * (w * (int) ((yuv[2] * (h - 3) + 1))
+ (int) ((yuv[1] * (w - 3) + 1)));
@@ -634,7 +629,7 @@
rgb[0]= (float)src1[0]/255.0f;
rgb[1]= (float)src1[1]/255.0f;
rgb[2]= (float)src1[2]/255.0f;
- rgb_to_yuv(rgb, yuv);
+ rgb_to_yuv_normalized(rgb, yuv);
p = tgt + 4 * (w * (int) ((yuv[2] * (h - 3) + 1))
+ (int) ((yuv[1] * (w - 3) + 1)));
@@ -684,7 +679,7 @@
CLAMP(rgb[1], 0.0f, 1.0f);
CLAMP(rgb[2], 0.0f, 1.0f);
- rgb_to_yuv(rgb, yuv);
+ rgb_to_yuv_normalized(rgb, yuv);
p = tgt + 4 * (w * (int) ((yuv[2] * (h - 3) + 1))
+ (int) ((yuv[1] * (w - 3) + 1)));
Modified: trunk/blender/source/blender/render/intern/source/shadeoutput.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/shadeoutput.c 2012-01-14 16:26:08 UTC (rev 43377)
+++ trunk/blender/source/blender/render/intern/source/shadeoutput.c 2012-01-14 17:14:23 UTC (rev 43378)
@@ -900,7 +900,7 @@
if(ma->ramp_col) {
if(ma->rampin_col==MA_RAMP_IN_RESULT) {
- float fac= 0.3f*diff[0] + 0.58f*diff[1] + 0.12f*diff[2];
+ float fac = rgb_to_grayscale(diff);
do_colorband(ma->ramp_col, fac, col);
/* blending method */
@@ -932,6 +932,7 @@
/* input */
switch(ma->rampin_col) {
case MA_RAMP_IN_ENERGY:
+ /* should use 'rgb_to_grayscale' but we only have a vector version */
fac= 0.3f*r + 0.58f*g + 0.12f*b;
break;
case MA_RAMP_IN_SHADER:
@@ -974,7 +975,7 @@
if(ma->ramp_spec && (ma->rampin_spec==MA_RAMP_IN_RESULT)) {
float col[4];
- float fac= 0.3f*spec_col[0] + 0.58f*spec_col[1] + 0.12f*spec_col[2];
+ float fac = rgb_to_grayscale(spec_col);
do_colorband(ma->ramp_spec, fac, col);
More information about the Bf-blender-cvs
mailing list