summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2009-03-09 20:51:21 -0600
committerBrian Paul <brianp@vmware.com>2009-03-09 20:51:21 -0600
commit731183b3847511cf83ac1f56f3ae153cf39155f1 (patch)
tree994436d365830878fbc5682645d40b946a4fbf3a
parent846dbb532ba4c945a91c5698c96b60c892789504 (diff)
mesa: simplify ycbcr->rgb conversion code
-rw-r--r--src/mesa/main/texformat_tmp.h46
1 files changed, 14 insertions, 32 deletions
diff --git a/src/mesa/main/texformat_tmp.h b/src/mesa/main/texformat_tmp.h
index 2aaa4990225..8ea7be66812 100644
--- a/src/mesa/main/texformat_tmp.h
+++ b/src/mesa/main/texformat_tmp.h
@@ -1279,9 +1279,9 @@ static void store_texel_sla8(struct gl_texture_image *texImage,
/* MESA_FORMAT_YCBCR *********************************************************/
-/* Fetch texel from 1D, 2D or 3D ycbcr texture, return 4 GLchans */
-/* We convert YCbCr to RGB here */
-/* XXX this may break if GLchan != GLubyte */
+/* Fetch texel from 1D, 2D or 3D ycbcr texture, return 4 GLfloats.
+ * We convert YCbCr to RGB here.
+ */
static void FETCH(f_ycbcr)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel )
{
@@ -1291,19 +1291,10 @@ static void FETCH(f_ycbcr)( const struct gl_texture_image *texImage,
const GLubyte cb = *src0 & 0xff; /* chroma U */
const GLubyte y1 = (*src1 >> 8) & 0xff; /* luminance */
const GLubyte cr = *src1 & 0xff; /* chroma V */
- GLfloat r, g, b;
- if (i & 1) {
- /* odd pixel: use y1,cr,cb */
- r = 1.164 * (y1-16) + 1.596 * (cr-128);
- g = 1.164 * (y1-16) - 0.813 * (cr-128) - 0.391 * (cb-128);
- b = 1.164 * (y1-16) + 2.018 * (cb-128);
- }
- else {
- /* even pixel: use y0,cr,cb */
- r = 1.164 * (y0-16) + 1.596 * (cr-128);
- g = 1.164 * (y0-16) - 0.813 * (cr-128) - 0.391 * (cb-128);
- b = 1.164 * (y0-16) + 2.018 * (cb-128);
- }
+ const GLfloat y = (i & 1) ? y1 : y0; /* choose even/odd luminance */
+ GLfloat r = 1.164 * (y - 16) + 1.596 * (cr - 128);
+ GLfloat g = 1.164 * (y - 16) - 0.813 * (cr - 128) - 0.391 * (cb - 128);
+ GLfloat b = 1.164 * (y - 16) + 2.018 * (cb - 128);
r *= (1.0 / 255.0F);
g *= (1.0 / 255.0F);
b *= (1.0 / 255.0F);
@@ -1329,9 +1320,9 @@ static void store_texel_ycbcr(struct gl_texture_image *texImage,
/* MESA_FORMAT_YCBCR_REV *****************************************************/
-/* Fetch texel from 1D, 2D or 3D ycbcr_rev texture, return 4 GLchans */
-/* We convert YCbCr to RGB here */
-/* XXX this may break if GLchan != GLubyte */
+/* Fetch texel from 1D, 2D or 3D ycbcr_rev texture, return 4 GLfloats.
+ * We convert YCbCr to RGB here.
+ */
static void FETCH(f_ycbcr_rev)( const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel )
{
@@ -1341,19 +1332,10 @@ static void FETCH(f_ycbcr_rev)( const struct gl_texture_image *texImage,
const GLubyte cr = (*src0 >> 8) & 0xff; /* chroma V */
const GLubyte y1 = *src1 & 0xff; /* luminance */
const GLubyte cb = (*src1 >> 8) & 0xff; /* chroma U */
- GLfloat r, g, b;
- if (i & 1) {
- /* odd pixel: use y1,cr,cb */
- r = 1.164 * (y1-16) + 1.596 * (cr-128);
- g = 1.164 * (y1-16) - 0.813 * (cr-128) - 0.391 * (cb-128);
- b = 1.164 * (y1-16) + 2.018 * (cb-128);
- }
- else {
- /* even pixel: use y0,cr,cb */
- r = 1.164 * (y0-16) + 1.596 * (cr-128);
- g = 1.164 * (y0-16) - 0.813 * (cr-128) - 0.391 * (cb-128);
- b = 1.164 * (y0-16) + 2.018 * (cb-128);
- }
+ const GLfloat y = (i & 1) ? y1 : y0; /* choose even/odd luminance */
+ GLfloat r = 1.164 * (y - 16) + 1.596 * (cr - 128);
+ GLfloat g = 1.164 * (y - 16) - 0.813 * (cr - 128) - 0.391 * (cb - 128);
+ GLfloat b = 1.164 * (y - 16) + 2.018 * (cb - 128);
r *= (1.0 / 255.0F);
g *= (1.0 / 255.0F);
b *= (1.0 / 255.0F);