132001f49Smrg/* 232001f49Smrg * Test the GL_NV_texture_rectangle and GL_MESA_ycrcb_texture extensions. 332001f49Smrg * 432001f49Smrg * Brian Paul 13 September 2002 532001f49Smrg */ 632001f49Smrg 732001f49Smrg 832001f49Smrg#include <math.h> 932001f49Smrg#include <stdio.h> 1032001f49Smrg#include <stdlib.h> 1132001f49Smrg#include <string.h> 1232001f49Smrg#include <GL/glew.h> 1332001f49Smrg#include "glut_wrap.h" 1432001f49Smrg 1532001f49Smrg#include "../util/readtex.c" /* I know, this is a hack. */ 1632001f49Smrg 1732001f49Smrg#define TEXTURE_FILE DEMOS_DATA_DIR "tile.rgb" 1832001f49Smrg 1932001f49Smrgstatic GLfloat Xrot = 0, Yrot = 0, Zrot = 0; 2032001f49Smrgstatic GLint ImgWidth, ImgHeight; 2132001f49Smrgstatic GLushort *ImageYUV = NULL; 2232001f49Smrgstatic GLubyte *ImageRGB = NULL; 2332001f49Smrgstatic const GLuint yuvObj = 100; 2432001f49Smrgstatic const GLuint rgbObj = 101; 2532001f49Smrg 2632001f49Smrg 2732001f49Smrgstatic void DrawObject(void) 2832001f49Smrg{ 2932001f49Smrg glBegin(GL_QUADS); 3032001f49Smrg 3132001f49Smrg glTexCoord2f(0, 0); 3232001f49Smrg glVertex2f(-1.0, -1.0); 3332001f49Smrg 3432001f49Smrg glTexCoord2f(1, 0); 3532001f49Smrg glVertex2f(1.0, -1.0); 3632001f49Smrg 3732001f49Smrg glTexCoord2f(1, 1); 3832001f49Smrg glVertex2f(1.0, 1.0); 3932001f49Smrg 4032001f49Smrg glTexCoord2f(0, 1); 4132001f49Smrg glVertex2f(-1.0, 1.0); 4232001f49Smrg 4332001f49Smrg glEnd(); 4432001f49Smrg} 4532001f49Smrg 4632001f49Smrg 4732001f49Smrgstatic void Display( void ) 4832001f49Smrg{ 4932001f49Smrg glClear( GL_COLOR_BUFFER_BIT ); 5032001f49Smrg 5132001f49Smrg glPushMatrix(); 5232001f49Smrg glTranslatef( -1.1, 0.0, -15.0 ); 5332001f49Smrg glRotatef(Xrot, 1.0, 0.0, 0.0); 5432001f49Smrg glRotatef(Yrot, 0.0, 1.0, 0.0); 5532001f49Smrg glRotatef(Zrot, 0.0, 0.0, 1.0); 5632001f49Smrg glBindTexture(GL_TEXTURE_2D, yuvObj); 5732001f49Smrg DrawObject(); 5832001f49Smrg glPopMatrix(); 5932001f49Smrg 6032001f49Smrg glPushMatrix(); 6132001f49Smrg glTranslatef( 1.1, 0.0, -15.0 ); 6232001f49Smrg glRotatef(Xrot, 1.0, 0.0, 0.0); 6332001f49Smrg glRotatef(Yrot, 0.0, 1.0, 0.0); 6432001f49Smrg glRotatef(Zrot, 0.0, 0.0, 1.0); 6532001f49Smrg glBindTexture(GL_TEXTURE_2D, rgbObj); 6632001f49Smrg DrawObject(); 6732001f49Smrg glPopMatrix(); 6832001f49Smrg 6932001f49Smrg glutSwapBuffers(); 7032001f49Smrg} 7132001f49Smrg 7232001f49Smrg 7332001f49Smrgstatic void Reshape( int width, int height ) 7432001f49Smrg{ 7532001f49Smrg glViewport( 0, 0, width, height ); 7632001f49Smrg glMatrixMode( GL_PROJECTION ); 7732001f49Smrg glLoadIdentity(); 7832001f49Smrg glFrustum( -1.1, 1.1, -1.1, 1.1, 10.0, 100.0 ); 7932001f49Smrg glMatrixMode( GL_MODELVIEW ); 8032001f49Smrg glLoadIdentity(); 8132001f49Smrg glTranslatef( 0.0, 0.0, -15.0 ); 8232001f49Smrg} 8332001f49Smrg 8432001f49Smrg 8532001f49Smrgstatic void Key( unsigned char key, int x, int y ) 8632001f49Smrg{ 8732001f49Smrg (void) x; 8832001f49Smrg (void) y; 8932001f49Smrg switch (key) { 9032001f49Smrg case 27: 9132001f49Smrg exit(0); 9232001f49Smrg break; 9332001f49Smrg } 9432001f49Smrg glutPostRedisplay(); 9532001f49Smrg} 9632001f49Smrg 9732001f49Smrg 9832001f49Smrgstatic void SpecialKey( int key, int x, int y ) 9932001f49Smrg{ 10032001f49Smrg float step = 3.0; 10132001f49Smrg (void) x; 10232001f49Smrg (void) y; 10332001f49Smrg 10432001f49Smrg switch (key) { 10532001f49Smrg case GLUT_KEY_UP: 10632001f49Smrg Xrot += step; 10732001f49Smrg break; 10832001f49Smrg case GLUT_KEY_DOWN: 10932001f49Smrg Xrot -= step; 11032001f49Smrg break; 11132001f49Smrg case GLUT_KEY_LEFT: 11232001f49Smrg Yrot += step; 11332001f49Smrg break; 11432001f49Smrg case GLUT_KEY_RIGHT: 11532001f49Smrg Yrot -= step; 11632001f49Smrg break; 11732001f49Smrg } 11832001f49Smrg glutPostRedisplay(); 11932001f49Smrg} 12032001f49Smrg 12132001f49Smrg 12232001f49Smrg#define CLAMP( X, MIN, MAX ) ( (X)<(MIN) ? (MIN) : ((X)>(MAX) ? (MAX) : (X)) ) 12332001f49Smrg 12432001f49Smrg 12532001f49Smrg 12632001f49Smrg/* #define LINEAR_FILTER */ 12732001f49Smrg 12832001f49Smrgstatic void Init( int argc, char *argv[] ) 12932001f49Smrg{ 13032001f49Smrg const char *file; 13132001f49Smrg GLenum format; 13232001f49Smrg 13332001f49Smrg if (!glutExtensionSupported("GL_MESA_ycbcr_texture")) { 13432001f49Smrg printf("Sorry, GL_MESA_ycbcr_texture is required\n"); 13532001f49Smrg exit(0); 13632001f49Smrg } 13732001f49Smrg 13832001f49Smrg glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 13932001f49Smrg 14032001f49Smrg if (argc > 1) 14132001f49Smrg file = argv[1]; 14232001f49Smrg else 14332001f49Smrg file = TEXTURE_FILE; 14432001f49Smrg 14532001f49Smrg /* First load the texture as YCbCr. 14632001f49Smrg */ 14732001f49Smrg 14832001f49Smrg glBindTexture(GL_TEXTURE_2D, yuvObj); 14932001f49Smrg glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 15032001f49Smrg glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 15132001f49Smrg 15232001f49Smrg ImageYUV = LoadYUVImage(file, &ImgWidth, &ImgHeight ); 15332001f49Smrg if (!ImageYUV) { 15432001f49Smrg printf("Couldn't read %s\n", TEXTURE_FILE); 15532001f49Smrg exit(0); 15632001f49Smrg } 15732001f49Smrg 15832001f49Smrg printf("Image: %dx%d\n", ImgWidth, ImgHeight); 15932001f49Smrg 16032001f49Smrg 16132001f49Smrg glTexImage2D(GL_TEXTURE_2D, 0, 16232001f49Smrg GL_YCBCR_MESA, 16332001f49Smrg ImgWidth, ImgHeight, 0, 16432001f49Smrg GL_YCBCR_MESA, 16532001f49Smrg GL_UNSIGNED_SHORT_8_8_MESA, ImageYUV); 16632001f49Smrg 16732001f49Smrg glEnable(GL_TEXTURE_2D); 16832001f49Smrg 16932001f49Smrg glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 17032001f49Smrg 17132001f49Smrg 17232001f49Smrg 17332001f49Smrg /* Now load the texture as RGB. 17432001f49Smrg */ 17532001f49Smrg 17632001f49Smrg glBindTexture(GL_TEXTURE_2D, rgbObj); 17732001f49Smrg glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 17832001f49Smrg glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 17932001f49Smrg 18032001f49Smrg ImageRGB = LoadRGBImage(file, &ImgWidth, &ImgHeight, &format ); 18132001f49Smrg if (!ImageRGB) { 18232001f49Smrg printf("Couldn't read %s\n", TEXTURE_FILE); 18332001f49Smrg exit(0); 18432001f49Smrg } 18532001f49Smrg 18632001f49Smrg printf("Image: %dx%d\n", ImgWidth, ImgHeight); 18732001f49Smrg 18832001f49Smrg 18932001f49Smrg glTexImage2D(GL_TEXTURE_2D, 0, 19032001f49Smrg format, 19132001f49Smrg ImgWidth, ImgHeight, 0, 19232001f49Smrg format, 19332001f49Smrg GL_UNSIGNED_BYTE, ImageRGB); 19432001f49Smrg 19532001f49Smrg glEnable(GL_TEXTURE_2D); 19632001f49Smrg 19732001f49Smrg glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 19832001f49Smrg 19932001f49Smrg 20032001f49Smrg 20132001f49Smrg glShadeModel(GL_FLAT); 20232001f49Smrg glClearColor(0.3, 0.3, 0.4, 1.0); 20332001f49Smrg 20432001f49Smrg if (argc > 1 && strcmp(argv[1], "-info")==0) { 20532001f49Smrg printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); 20632001f49Smrg printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); 20732001f49Smrg printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR)); 20832001f49Smrg printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS)); 20932001f49Smrg } 21032001f49Smrg 21132001f49Smrg printf( "Both images should appear the same.\n" ); 21232001f49Smrg} 21332001f49Smrg 21432001f49Smrg 21532001f49Smrgint main( int argc, char *argv[] ) 21632001f49Smrg{ 21732001f49Smrg glutInit( &argc, argv ); 21832001f49Smrg glutInitWindowSize( 300, 300 ); 21932001f49Smrg glutInitWindowPosition( 0, 0 ); 22032001f49Smrg glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE ); 22132001f49Smrg glutCreateWindow(argv[0] ); 22232001f49Smrg glewInit(); 22332001f49Smrg 22432001f49Smrg Init( argc, argv ); 22532001f49Smrg 22632001f49Smrg glutReshapeFunc( Reshape ); 22732001f49Smrg glutKeyboardFunc( Key ); 22832001f49Smrg glutSpecialFunc( SpecialKey ); 22932001f49Smrg glutDisplayFunc( Display ); 23032001f49Smrg 23132001f49Smrg glutMainLoop(); 23232001f49Smrg return 0; 23332001f49Smrg} 234