SGTexture::read_rgb(a)_texture:

- support greyscale and greyscale/alpha format
- cleanup & make it faster
This commit is contained in:
mfranz
2007-04-28 12:30:38 +00:00
parent 8258fd7d9f
commit 2cc31ff425
+25 -23
View File
@@ -218,7 +218,7 @@ void
SGTexture::read_rgb_texture(const char *name) SGTexture::read_rgb_texture(const char *name)
{ {
GLubyte *ptr; GLubyte *ptr;
GLubyte *rbuf, *gbuf, *bbuf, *abuf; GLubyte *rbuf, *gbuf, *bbuf;
SGTexture::ImageRec *image; SGTexture::ImageRec *image;
int y; int y;
@@ -232,51 +232,45 @@ SGTexture::read_rgb_texture(const char *name)
texture_width = image->xsize; texture_width = image->xsize;
texture_height = image->ysize; texture_height = image->ysize;
if (image->zsize != 3 && image->zsize != 4) { if (image->zsize < 1 || image->zsize > 4) {
ImageClose(image); ImageClose(image);
errstr = WRONG_COUNT; errstr = WRONG_COUNT;
return; return;
} }
texture_data = new GLubyte[ image->xsize * image->ysize * 3 ];
num_colors = 3; num_colors = 3;
texture_data = new GLubyte[ image->xsize * image->ysize * num_colors ];
rbuf = new GLubyte[ image->xsize ]; rbuf = new GLubyte[ image->xsize ];
gbuf = new GLubyte[ image->xsize ]; gbuf = new GLubyte[ image->xsize ];
bbuf = new GLubyte[ image->xsize ]; bbuf = new GLubyte[ image->xsize ];
abuf = new GLubyte[ image->xsize ]; if(!texture_data || !rbuf || !gbuf || !bbuf) {
if(!texture_data || !rbuf || !gbuf || !bbuf || !abuf) {
delete[] texture_data; delete[] texture_data;
delete[] rbuf; delete[] rbuf;
delete[] gbuf; delete[] gbuf;
delete[] bbuf; delete[] bbuf;
delete[] abuf;
errstr = OUT_OF_MEMORY; errstr = OUT_OF_MEMORY;
return; return;
} }
ptr = texture_data; ptr = texture_data;
for(y=0; y<image->ysize; y++) { for(y=0; y<image->ysize; y++) {
if(image->zsize == 4) { if(image->zsize == 4 || image->zsize == 3) {
ImageGetRow(image,rbuf,y,0); ImageGetRow(image,rbuf,y,0);
ImageGetRow(image,gbuf,y,1); ImageGetRow(image,gbuf,y,1);
ImageGetRow(image,bbuf,y,2); ImageGetRow(image,bbuf,y,2);
ImageGetRow(image,abuf,y,3); // discard
rgbtorgb(rbuf,gbuf,bbuf,ptr,image->xsize);
ptr += (image->xsize * 3);
} else { } else {
ImageGetRow(image,rbuf,y,0); ImageGetRow(image,rbuf,y,0);
ImageGetRow(image,gbuf,y,1); memcpy(gbuf,rbuf,image->xsize);
ImageGetRow(image,bbuf,y,2); memcpy(bbuf,rbuf,image->xsize);
rgbtorgb(rbuf,gbuf,bbuf,ptr,image->xsize);
ptr += (image->xsize * 3);
} }
rgbtorgb(rbuf,gbuf,bbuf,ptr,image->xsize);
ptr += (image->xsize * num_colors);
} }
ImageClose(image); ImageClose(image);
delete[] rbuf; delete[] rbuf;
delete[] gbuf; delete[] gbuf;
delete[] bbuf; delete[] bbuf;
delete[] abuf;
} }
@@ -299,14 +293,14 @@ SGTexture::read_rgba_texture(const char *name)
texture_width = image->xsize; texture_width = image->xsize;
texture_height = image->ysize; texture_height = image->ysize;
if (image->zsize != 3 && image->zsize != 4) { if (image->zsize < 1 || image->zsize > 4) {
ImageClose(image); ImageClose(image);
errstr = WRONG_COUNT; errstr = WRONG_COUNT;
return; return;
} }
texture_data = new GLubyte[ image->xsize * image->ysize * 4 ];
num_colors = 4; num_colors = 4;
texture_data = new GLubyte[ image->xsize * image->ysize * num_colors ];
rbuf = new GLubyte[ image->xsize ]; rbuf = new GLubyte[ image->xsize ];
gbuf = new GLubyte[ image->xsize ]; gbuf = new GLubyte[ image->xsize ];
bbuf = new GLubyte[ image->xsize ]; bbuf = new GLubyte[ image->xsize ];
@@ -322,22 +316,30 @@ SGTexture::read_rgba_texture(const char *name)
} }
ptr = texture_data; ptr = texture_data;
memset(abuf, 255, image->xsize);
for(y=0; y<image->ysize; y++) { for(y=0; y<image->ysize; y++) {
if(image->zsize == 4) { if(image->zsize == 4) {
ImageGetRow(image,rbuf,y,0); ImageGetRow(image,rbuf,y,0);
ImageGetRow(image,gbuf,y,1); ImageGetRow(image,gbuf,y,1);
ImageGetRow(image,bbuf,y,2); ImageGetRow(image,bbuf,y,2);
ImageGetRow(image,abuf,y,3); ImageGetRow(image,abuf,y,3);
rgbatorgba(rbuf,gbuf,bbuf,abuf,ptr,image->xsize); } else if(image->zsize == 3) {
ptr += (image->xsize * 4);
} else {
ImageGetRow(image,rbuf,y,0); ImageGetRow(image,rbuf,y,0);
ImageGetRow(image,gbuf,y,1); ImageGetRow(image,gbuf,y,1);
ImageGetRow(image,bbuf,y,2); ImageGetRow(image,bbuf,y,2);
rgbatorgba(rbuf,gbuf,bbuf,abuf,ptr,image->xsize); memset(abuf, 255, image->xsize);
ptr += (image->xsize * 3); } else if(image->zsize == 2) {
ImageGetRow(image,rbuf,y,0);
memcpy(gbuf,rbuf,image->xsize);
memcpy(bbuf,rbuf,image->xsize);
ImageGetRow(image,abuf,y,1);
} else {
ImageGetRow(image,rbuf,y,0);
memcpy(gbuf,rbuf,image->xsize);
memcpy(bbuf,rbuf,image->xsize);
memset(abuf, 255, image->xsize);
} }
rgbatorgba(rbuf,gbuf,bbuf,abuf,ptr,image->xsize);
ptr += (image->xsize * num_colors);
} }
ImageClose(image); ImageClose(image);