From 27358a24a0113a62492923abe35e8660ed7335ef Mon Sep 17 00:00:00 2001 From: Keith Whitwell Date: Tue, 20 May 2003 09:54:58 +0000 Subject: [PATCH] move LoadYUVImage into readtex.c --- progs/tests/Makefile | 4 +- progs/tests/texrect.c | 4 +- progs/tests/yuvrect.c | 43 +--------------- progs/tests/yuvsquare.c | 107 +--------------------------------------- progs/util/readtex.c | 85 +++++++++++++++++++++++++++++++ progs/util/readtex.h | 2 + 6 files changed, 94 insertions(+), 151 deletions(-) diff --git a/progs/tests/Makefile b/progs/tests/Makefile index eb087813e02..1ab2df91c87 100644 --- a/progs/tests/Makefile +++ b/progs/tests/Makefile @@ -28,7 +28,9 @@ PROGS = antialias \ vptest2 \ vptest3 \ vptorus \ - vpwarpmesh + vpwarpmesh \ + yuvrect \ + yuvsquare ##### RULES ##### diff --git a/progs/tests/texrect.c b/progs/tests/texrect.c index 685dd863ea0..c20251801c7 100644 --- a/progs/tests/texrect.c +++ b/progs/tests/texrect.c @@ -1,4 +1,4 @@ -/* $Id: texrect.c,v 1.2 2002/10/15 14:43:55 brianp Exp $ */ +/* $Id: texrect.c,v 1.3 2003/05/20 09:54:58 keithw Exp $ */ /* GL_NV_texture_rectangle test * @@ -14,8 +14,6 @@ #include #include -#include "readtex.c" /* I know, this is a hack. */ - #define TEXTURE_0_FILE "../images/girl.rgb" #define TEXTURE_1_FILE "../images/reflect.rgb" diff --git a/progs/tests/yuvrect.c b/progs/tests/yuvrect.c index 22ee91cae97..509c0433b91 100644 --- a/progs/tests/yuvrect.c +++ b/progs/tests/yuvrect.c @@ -19,7 +19,6 @@ static GLfloat Xrot = 0, Yrot = 0, Zrot = 0; static GLint ImgWidth, ImgHeight; static GLenum ImgFormat; -static GLubyte *Image = NULL; static GLushort *ImageYUV = NULL; @@ -107,42 +106,6 @@ static void SpecialKey( int key, int x, int y ) } -#define CLAMP( X, MIN, MAX ) ( (X)<(MIN) ? (MIN) : ((X)>(MAX) ? (MAX) : (X)) ) - -static void ConvertRGBtoYUV(GLint w, GLint h, const GLubyte *src, - GLushort *dest) -{ - GLint i, j; - - for (i = 0; i < h; i++) { - for (j = 0; j < w; j++) { - const GLfloat r = (*src++) / 255.0; - const GLfloat g = (*src++) / 255.0; - const GLfloat b = (*src++) / 255.0; - GLfloat y, cr, cb; - GLint iy, icr, icb; - - y = r * 65.481 + g * 128.553 + b * 24.966 + 16; - cb = r * -37.797 + g * -74.203 + b * 112.0 + 128; - cr = r * 112.0 + g * -93.786 + b * -18.214 + 128; - /*printf("%f %f %f -> %f %f %f\n", r, g, b, y, cb, cr);*/ - iy = (GLint) CLAMP(y, 0, 254); - icb = (GLint) CLAMP(cb, 0, 254); - icr = (GLint) CLAMP(cr, 0, 254); - - if (j & 1) { - /* odd */ - *dest = (iy << 8) | icr; - } - else { - /* even */ - *dest = (iy << 8) | icb; - } - dest++; - } - } -} - static void Init( int argc, char *argv[] ) { @@ -176,16 +139,14 @@ static void Init( int argc, char *argv[] ) else file = TEXTURE_FILE; - Image = LoadRGBImage(file, &ImgWidth, &ImgHeight, &ImgFormat); - if (!Image) { + ImageYUV = LoadYUVImage(file, &ImgWidth, &ImgHeight); + if (!ImageYUV) { printf("Couldn't read %s\n", TEXTURE_FILE); exit(0); } printf("Image: %dx%d\n", ImgWidth, ImgHeight); - ImageYUV = (GLushort *) malloc(ImgWidth * ImgHeight * sizeof(GLushort)); - ConvertRGBtoYUV(ImgWidth, ImgHeight, Image, ImageYUV); glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_YCBCR_MESA, ImgWidth, ImgHeight, 0, GL_YCBCR_MESA, GL_UNSIGNED_SHORT_8_8_MESA, ImageYUV); diff --git a/progs/tests/yuvsquare.c b/progs/tests/yuvsquare.c index 1d2ce135fe9..eab255b4275 100644 --- a/progs/tests/yuvsquare.c +++ b/progs/tests/yuvsquare.c @@ -18,7 +18,6 @@ static GLfloat Xrot = 0, Yrot = 0, Zrot = 0; static GLint ImgWidth, ImgHeight; -static GLenum ImgFormat; static GLushort *ImageYUV = NULL; @@ -108,94 +107,6 @@ static void SpecialKey( int key, int x, int y ) #define CLAMP( X, MIN, MAX ) ( (X)<(MIN) ? (MIN) : ((X)>(MAX) ? (MAX) : (X)) ) -static void ConvertRGBtoYUV(GLint w, GLint h, GLint texel_bytes, - const GLubyte *src, - GLushort *dest) -{ - GLint i, j; - - for (i = 0; i < h; i++) { - for (j = 0; j < w; j++) { - const GLfloat r = (src[0]) / 255.0; - const GLfloat g = (src[1]) / 255.0; - const GLfloat b = (src[2]) / 255.0; - GLfloat y, cr, cb; - GLint iy, icr, icb; - - y = r * 65.481 + g * 128.553 + b * 24.966 + 16; - cb = r * -37.797 + g * -74.203 + b * 112.0 + 128; - cr = r * 112.0 + g * -93.786 + b * -18.214 + 128; - /*printf("%f %f %f -> %f %f %f\n", r, g, b, y, cb, cr);*/ - iy = (GLint) CLAMP(y, 0, 254); - icb = (GLint) CLAMP(cb, 0, 254); - icr = (GLint) CLAMP(cr, 0, 254); - - if (j & 1) { - /* odd */ - *dest = (iy << 8) | icr; - } - else { - /* even */ - *dest = (iy << 8) | icb; - } - dest++; - src += texel_bytes; - } - } -} - - -/* - * Load an SGI .rgb file and return a pointer to the image data. - * Input: imageFile - name of .rgb to read - * Output: width - width of image - * height - height of image - * format - format of image (GL_RGB or GL_RGBA) - * Return: pointer to image data or NULL if error - */ -GLushort *LoadYUVImage( const char *imageFile, GLint *width, GLint *height, - GLenum *format ) -{ - TK_RGBImageRec *image; - GLint bytes; - GLushort *buffer; - - image = tkRGBImageLoad( imageFile ); - if (!image) { - return NULL; - } - - if (image->components==3) { - *format = GL_RGB; - } - else if (image->components==4) { - *format = GL_RGBA; - } - else { - /* not implemented */ - fprintf(stderr, - "Error in LoadYUVImage %d-component images not implemented\n", - image->components ); - return NULL; - } - - *width = image->sizeX; - *height = image->sizeY; - - buffer = (GLushort *) malloc( image->sizeX * image->sizeY * 2 ); - - if (buffer) - ConvertRGBtoYUV( image->sizeX, - image->sizeY, - image->components, - image->data, - buffer ); - - - FreeImage(image); - return buffer; -} - /* #define LINEAR_FILTER */ @@ -222,7 +133,7 @@ static void Init( int argc, char *argv[] ) else file = TEXTURE_FILE; - ImageYUV = LoadYUVImage(file, &ImgWidth, &ImgHeight, &ImgFormat); + ImageYUV = LoadYUVImage(file, &ImgWidth, &ImgHeight ); if (!ImageYUV) { printf("Couldn't read %s\n", TEXTURE_FILE); exit(0); @@ -230,28 +141,12 @@ static void Init( int argc, char *argv[] ) printf("Image: %dx%d\n", ImgWidth, ImgHeight); -/* error = gluBuild2DMipmaps( GL_TEXTURE_2D, */ -/* GL_YCBCR_MESA, */ -/* ImgWidth, ImgHeight, */ -/* GL_YCBCR_MESA, */ -/* GL_UNSIGNED_SHORT_8_8_MESA, */ -/* ImageYUV ); */ - - -#if 0 - glTexImage2D(GL_TEXTURE_2D, 0, - GL_RGB, - ImgWidth, ImgHeight, 0, - GL_RGB, - GL_UNSIGNED_SHORT_5_6_5, ImageYUV); -#else glTexImage2D(GL_TEXTURE_2D, 0, GL_YCBCR_MESA, ImgWidth, ImgHeight, 0, GL_YCBCR_MESA, GL_UNSIGNED_SHORT_8_8_MESA, ImageYUV); -#endif glEnable(GL_TEXTURE_2D); diff --git a/progs/util/readtex.c b/progs/util/readtex.c index d9a5dc78f5c..406498202b2 100644 --- a/progs/util/readtex.c +++ b/progs/util/readtex.c @@ -365,3 +365,88 @@ GLubyte *LoadRGBImage( const char *imageFile, GLint *width, GLint *height, return buffer; } +#define CLAMP( X, MIN, MAX ) ( (X)<(MIN) ? (MIN) : ((X)>(MAX) ? (MAX) : (X)) ) + + +static void ConvertRGBtoYUV(GLint w, GLint h, GLint texel_bytes, + const GLubyte *src, + GLushort *dest) +{ + GLint i, j; + + for (i = 0; i < h; i++) { + for (j = 0; j < w; j++) { + const GLfloat r = (src[0]) / 255.0; + const GLfloat g = (src[1]) / 255.0; + const GLfloat b = (src[2]) / 255.0; + GLfloat y, cr, cb; + GLint iy, icr, icb; + + y = r * 65.481 + g * 128.553 + b * 24.966 + 16; + cb = r * -37.797 + g * -74.203 + b * 112.0 + 128; + cr = r * 112.0 + g * -93.786 + b * -18.214 + 128; + /*printf("%f %f %f -> %f %f %f\n", r, g, b, y, cb, cr);*/ + iy = (GLint) CLAMP(y, 0, 254); + icb = (GLint) CLAMP(cb, 0, 254); + icr = (GLint) CLAMP(cr, 0, 254); + + if (j & 1) { + /* odd */ + *dest = (iy << 8) | icr; + } + else { + /* even */ + *dest = (iy << 8) | icb; + } + dest++; + src += texel_bytes; + } + } +} + + +/* + * Load an SGI .rgb file and return a pointer to the image data, converted + * to 422 yuv. + * + * Input: imageFile - name of .rgb to read + * Output: width - width of image + * height - height of image + * Return: pointer to image data or NULL if error + */ +GLushort *LoadYUVImage( const char *imageFile, GLint *width, GLint *height ) +{ + TK_RGBImageRec *image; + GLint bytes; + GLushort *buffer; + + image = tkRGBImageLoad( imageFile ); + if (!image) { + return NULL; + } + + if (image->components != 3 && image->components !=4 ) { + /* not implemented */ + fprintf(stderr, + "Error in LoadYUVImage %d-component images not implemented\n", + image->components ); + return NULL; + } + + *width = image->sizeX; + *height = image->sizeY; + + buffer = (GLushort *) malloc( image->sizeX * image->sizeY * 2 ); + + if (buffer) + ConvertRGBtoYUV( image->sizeX, + image->sizeY, + image->components, + image->data, + buffer ); + + + FreeImage(image); + return buffer; +} + diff --git a/progs/util/readtex.h b/progs/util/readtex.h index 8e544f1fb82..6c9a3828d38 100644 --- a/progs/util/readtex.h +++ b/progs/util/readtex.h @@ -20,5 +20,7 @@ extern GLubyte * LoadRGBImage( const char *imageFile, GLint *width, GLint *height, GLenum *format ); +extern GLushort * +LoadYUVImage( const char *imageFile, GLint *width, GLint *height ); #endif -- 2.30.2