Add support for rgba textures

This commit is contained in:
ehofman
2003-08-07 12:31:16 +00:00
parent f404161d23
commit 54b3c711c3
2 changed files with 85 additions and 3 deletions

View File

@@ -23,7 +23,8 @@
SGTexture::SGTexture()
: texture_id(0),
texture_data(0)
texture_data(0),
num_colors(3)
{
}
@@ -225,7 +226,7 @@ SGTexture::read_rgb_texture(const char *name)
return;
}
texture_data = new GLubyte[ image->xsize * image->ysize * 3];
texture_data = new GLubyte[ image->xsize * image->ysize * 3 ];
rbuf = new GLubyte[ image->xsize ];
gbuf = new GLubyte[ image->xsize ];
bbuf = new GLubyte[ image->xsize ];
@@ -245,7 +246,7 @@ SGTexture::read_rgb_texture(const char *name)
ImageGetRow(image,rbuf,y,0);
ImageGetRow(image,gbuf,y,1);
ImageGetRow(image,bbuf,y,2);
ImageGetRow(image,abuf,y,3); /* Discard. */
ImageGetRow(image,abuf,y,3); // discard
rgbtorgb(rbuf,gbuf,bbuf,ptr,image->xsize);
ptr += (image->xsize * 3);
} else {
@@ -264,6 +265,70 @@ SGTexture::read_rgb_texture(const char *name)
delete abuf;
}
void
SGTexture::read_rgba_texture(const char *name)
{
GLubyte *ptr;
GLubyte *rbuf, *gbuf, *bbuf, *abuf;
SGTexture::ImageRec *image;
int y;
if (texture_data)
delete texture_data;
image = ImageOpen(name);
if(!image)
return;
texture_width = image->xsize;
texture_height = image->ysize;
if (image->zsize != 3 && image->zsize != 4) {
ImageClose(image);
return;
}
texture_data = new GLubyte[ image->xsize * image->ysize * 4 ];
rbuf = new GLubyte[ image->xsize ];
gbuf = new GLubyte[ image->xsize ];
bbuf = new GLubyte[ image->xsize ];
abuf = new GLubyte[ image->xsize ];
if(!texture_data || !rbuf || !gbuf || !bbuf || !abuf) {
delete texture_data;
delete rbuf;
delete gbuf;
delete bbuf;
delete abuf;
return;
}
ptr = texture_data;
memset(abuf, 255, image->xsize);
for(y=0; y<image->ysize; y++) {
if(image->zsize == 4) {
ImageGetRow(image,rbuf,y,0);
ImageGetRow(image,gbuf,y,1);
ImageGetRow(image,bbuf,y,2);
ImageGetRow(image,abuf,y,3);
rgbatorgba(rbuf,gbuf,bbuf,abuf,ptr,image->xsize);
ptr += (image->xsize * 4);
} else {
ImageGetRow(image,rbuf,y,0);
ImageGetRow(image,gbuf,y,1);
ImageGetRow(image,bbuf,y,2);
rgbatorgba(rbuf,gbuf,bbuf,abuf,ptr,image->xsize);
ptr += (image->xsize * 3);
}
}
ImageClose(image);
delete rbuf;
delete gbuf;
delete bbuf;
delete abuf;
}
void
SGTexture::read_raw_texture(const char *name)
{
@@ -522,6 +587,19 @@ SGTexture::rgbtorgb(GLubyte *r, GLubyte *g, GLubyte *b, GLubyte *l, int n) {
}
}
void
SGTexture::rgbatorgba(GLubyte *r, GLubyte *g, GLubyte *b, GLubyte *a,
GLubyte *l, int n) {
while(n--) {
l[0] = r[0];
l[1] = g[0];
l[2] = b[0];
l[3] = a[0];
l += 4; r++; g++; b++; a++;
}
}
void
SGTexture::ConvertShort(unsigned short *array, unsigned int length) {
unsigned short b1, b2;

View File

@@ -31,6 +31,7 @@ private:
GLsizei texture_width;
GLsizei texture_height;
GLsizei num_colors;
void resize(unsigned int width = 256, unsigned int height = 256);
@@ -55,6 +56,8 @@ protected:
void ConvertUint(unsigned *array, unsigned int length);
void ConvertShort(unsigned short *array, unsigned int length);
void rgbtorgb(GLubyte *r, GLubyte *g, GLubyte *b, GLubyte *l, int n);
void rgbatorgba(GLubyte *r, GLubyte *g, GLubyte *b, GLubyte *a,
GLubyte *l, int n);
ImageRec *ImageOpen(const char *fileName);
ImageRec *RawImageOpen(const char *fileName);
@@ -80,6 +83,7 @@ public:
/* Copyright (c) Mark J. Kilgard, 1997. */
void read_alpha_texture(const char *name);
void read_rgb_texture(const char *name);
void read_rgba_texture(const char *name);
void read_raw_texture(const char *name);
void read_r8_texture(const char *name);