move LoadYUVImage into readtex.c
authorKeith Whitwell <keith@tungstengraphics.com>
Tue, 20 May 2003 09:54:58 +0000 (09:54 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Tue, 20 May 2003 09:54:58 +0000 (09:54 +0000)
progs/tests/Makefile
progs/tests/texrect.c
progs/tests/yuvrect.c
progs/tests/yuvsquare.c
progs/util/readtex.c
progs/util/readtex.h

index eb087813e029fd30b789506648cd4d424e0d173c..1ab2df91c874b7c45ca738c7d648fc70b12b68a6 100644 (file)
@@ -28,7 +28,9 @@ PROGS = antialias \
        vptest2 \
        vptest3 \
        vptorus \
-       vpwarpmesh
+       vpwarpmesh \
+       yuvrect \
+       yuvsquare
 
 
 ##### RULES #####
index 685dd863ea096dcfb6e2b848ffdd0979c255c9d2..c20251801c77c2e0351fff116f1a0c7b4e04a928 100644 (file)
@@ -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 <string.h>
 #include <GL/glut.h>
 
-#include "readtex.c"   /* I know, this is a hack. */
-
 #define TEXTURE_0_FILE "../images/girl.rgb"
 #define TEXTURE_1_FILE "../images/reflect.rgb"
 
index 22ee91cae973142f4e0784b29430f80c576ae03f..509c0433b915d9ab6469ed7620d31d277e640246 100644 (file)
@@ -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);
index 1d2ce135fe9139a4c9b0774f6f56b9256029bc6f..eab255b42754cf4b87786a9f0d4034ab0efee9f7 100644 (file)
@@ -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);
 
index d9a5dc78f5c55ca4e51e01311e12edf5e59b27e6..406498202b298c627885190f2505ef29e546a3e6 100644 (file)
@@ -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;
+}
+
index 8e544f1fb826af1e775122c29acecd81629d6eb9..6c9a3828d3826faa7a49bdfe17bd99efe2adad6b 100644 (file)
@@ -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