windows-nt/Source/XPSP1/NT/multimedia/opengl/test/auxprogs/rgb/etex.c
2020-09-26 16:20:57 +08:00

264 lines
6.7 KiB
C

#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "glaux.h"
#define WWIDTH (2*TWIDTH+GAP)
#define WHEIGHT (4*THEIGHT+3*GAP)
#define TWIDTH 128
#define THEIGHT 128
#define GAP 16
int wwidth = WWIDTH;
int wheight = WHEIGHT;
int twidth = TWIDTH;
int theight = THEIGHT;
int gap = GAP;
char *tex1_file = "1.rgb";
char *tex2_file = "2.rgb";
AUX_RGBImageRec *tex1, *tex2;
BYTE tex1d1[TWIDTH*3], tex1d2[TWIDTH*3];
#define NTEXID 3
GLuint texids[NTEXID+1];
GLboolean texres[NTEXID];
GLfloat texpri[NTEXID];
void TexPoly(int x, int y)
{
glBegin(GL_POLYGON);
glTexCoord2i(0, 0);
glVertex2i(x, y);
glTexCoord2i(1, 0);
glVertex2i(x+twidth-1, y);
glTexCoord2i(1, 1);
glVertex2i(x+twidth-1, y+theight-1);
glTexCoord2i(0, 1);
glVertex2i(x, y+theight-1);
glEnd();
}
void Test(void)
{
int i;
GLint res;
GLfloat pri;
GLboolean retval;
int x1, x2, y;
x2 = 0;
x1 = x2+twidth+gap;
y = 0;
glGenTextures(NTEXID, texids);
for (i = 0; i < NTEXID; i++)
{
printf("Texture id %d is %d\n", i, texids[i]);
}
// Should fail for all because none have been bound and last is invalid
for (i = 0; i < NTEXID+1; i++)
{
printf("IsTexture %d is %d\n", i, glIsTexture(texids[i]));
}
// Should fail because these are all unbound right now
retval = glAreTexturesResident(NTEXID, texids, texres);
printf("AreTexturesResident %d\n", retval);
glBindTexture(GL_TEXTURE_2D, texids[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, tex1->sizeX, tex1->sizeY, 0, GL_RGB,
GL_UNSIGNED_BYTE, tex1->data);
glEnable(GL_TEXTURE_2D);
glGetTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, &pri);
printf("2D Priority is %f\n", pri);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, 0.5f);
glGetTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, &pri);
printf("2D Priority is %f\n", pri);
glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_RESIDENT, &res);
printf("2D Residency is %d\n", res);
retval = glAreTexturesResident(1, texids, texres);
printf("AreTexturesResident %d\n", retval);
for (i = 0; i < 1; i++)
{
printf("Residency %d is %d\n", i, texres[i]);
}
glClear(GL_COLOR_BUFFER_BIT);
TexPoly(x2, y);
glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_1D, texids[1]);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage1D(GL_TEXTURE_1D, 0, 3, TWIDTH, 0, GL_RGB,
GL_UNSIGNED_BYTE, tex1d1);
glEnable(GL_TEXTURE_1D);
glGetTexParameterfv(GL_TEXTURE_1D, GL_TEXTURE_PRIORITY, &pri);
printf("1D Priority is %f\n", pri);
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_PRIORITY, 0.5f);
glGetTexParameterfv(GL_TEXTURE_1D, GL_TEXTURE_PRIORITY, &pri);
printf("1D Priority is %f\n", pri);
glGetTexParameteriv(GL_TEXTURE_1D, GL_TEXTURE_RESIDENT, &res);
printf("1D Residency is %d\n", res);
TexPoly(x1, y);
retval = glAreTexturesResident(2, texids, texres);
printf("AreTexturesResident %d\n", retval);
for (i = 0; i < 2; i++)
{
printf("Residency %d is %d\n", i, texres[i]);
}
texpri[0] = 0.25f;
texpri[1] = 0.4f;
texpri[2] = 0.7f;
glPrioritizeTextures(NTEXID, texids, texpri);
glGetTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, &pri);
printf("2D Priority is %f\n", pri);
glGetTexParameterfv(GL_TEXTURE_1D, GL_TEXTURE_PRIORITY, &pri);
printf("1D Priority is %f\n", pri);
retval = glAreTexturesResident(NTEXID, texids, texres);
printf("AreTexturesResident %d\n", retval);
for (i = 0; i < NTEXID; i++)
{
printf("Residency %d is %d\n", i, texres[i]);
}
glBindTexture(GL_TEXTURE_2D, texids[NTEXID-1]);
// Should succeed for all
for (i = 0; i < NTEXID; i++)
{
printf("IsTexture %d is %d\n", i, glIsTexture(texids[i]));
}
glDeleteTextures(1, &texids[NTEXID-1]);
// Should fail for last
for (i = 0; i < NTEXID; i++)
{
printf("IsTexture %d is %d\n", i, glIsTexture(texids[i]));
}
glBindTexture(GL_TEXTURE_2D, texids[0]);
y += theight+gap;
glPixelStorei(GL_UNPACK_ROW_LENGTH, tex2->sizeX);
glDisable(GL_TEXTURE_1D);
glEnable(GL_TEXTURE_2D);
glTexSubImage2D(GL_TEXTURE_2D, 0, tex1->sizeX/4, tex1->sizeY/4,
tex1->sizeX/2, tex1->sizeY/2, GL_RGB, GL_UNSIGNED_BYTE,
tex2->data);
TexPoly(x2, y);
glDisable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_1D);
glTexSubImage1D(GL_TEXTURE_1D, 0, TWIDTH/4, TWIDTH/2,
GL_RGB, GL_UNSIGNED_BYTE, tex1d2);
TexPoly(x1, y);
y += theight+gap;
glDisable(GL_TEXTURE_1D);
glEnable(GL_TEXTURE_2D);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, x2, 0,
tex1->sizeX, tex1->sizeY, 0);
TexPoly(x2, y);
glDisable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_1D);
glCopyTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, x1, 0,
TWIDTH, 0);
TexPoly(x1, y);
y += theight+gap;
glDisable(GL_TEXTURE_1D);
glEnable(GL_TEXTURE_2D);
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, tex1->sizeX/4, tex1->sizeY/4,
x2+twidth/4, theight+theight/4+gap,
tex1->sizeX/2, tex1->sizeY/2);
TexPoly(x2, y);
glDisable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_1D);
glCopyTexSubImage1D(GL_TEXTURE_1D, 0, TWIDTH/4,
x1+TWIDTH/4, theight+gap,
TWIDTH/2);
TexPoly(x1, y);
glFlush();
glDeleteTextures(NTEXID-1, texids);
}
void Display(void)
{
}
void Reshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, w, 0, h, -1, 1);
glMatrixMode(GL_MODELVIEW);
wwidth = w;
wheight = h;
}
void __cdecl main(int argc, char** argv)
{
int i;
auxInitDisplayMode(AUX_SINGLE | AUX_RGB);
auxInitPosition(10, 10, wwidth, wheight);
auxInitWindow("Texture Enhancements Test");
tex1 = auxRGBImageLoad(tex1_file);
if (tex1 == NULL)
{
printf("Unable to load '%s'\n", tex1_file);
exit(1);
}
printf("tex1 %d,%d\n", tex1->sizeX, tex1->sizeY);
tex2 = auxRGBImageLoad(tex2_file);
if (tex2 == NULL)
{
printf("Unable to load '%s'\n", tex2_file);
exit(1);
}
printf("tex2 %d,%d\n", tex2->sizeX, tex2->sizeY);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
for (i = 0; i < TWIDTH; i++)
{
tex1d1[i*3+2] = (i*256/TWIDTH);
tex1d2[i*3] = (i*256/TWIDTH);
}
// glDisable(GL_DITHER);
Reshape(wwidth, wheight);
Test();
auxMainLoop(Display);
}