f=fopen(fname,"wb+"); // открываем файл if(!f)return 0;
// сохранение заголовка fwrite(&header,1,54, f) ; if(sizepal)// сохранение палитры {
fseek(f, header.imgdata-(sizepal*4),SEEK_SET); fsave_data(pal,4,4,sizepal,2,f);
}
// сохранение изображения
fseek(f, header.imgdata,SEEK_SET); switch(bpp)
{
case 32:
fsave_data(inddata,4,4,k/4,2,f); break; case 24:
fsave_data(inddata,3,3,k/3,1,f); break; case l:case 4: case 8: fwrite(inddata,1,k,f); break; default:retvalue=0;
}
fclose(f); // закрываем файл if(!retvalue){clear();return 0; } return 1;
}
// загрузка TGA файла
int IMAGE::loadtga(char*fname)
{
tgaheader header; // заголовок bmp файла // временные переменные
int k; // размер данных изображения в байтах int retvalue=l; // возвращаемое значение FILE*f=fopen(fname,"rb+"); // открываем файл if(!f)return 0;
clear(); // освобождаем возможную память // загрузка заголовка fread(&header,1,18,f); if(header.idlen) fseek(f,header.idlen,SEEK_CUR);
// заполняем наш объект width=header.width; height=header.height ; bpp=header.bpp;
// загружаем палитру if(header.typepal)
{
sizepal=header.colornum; bpppal=header.colorbpp;
// у нас всегда 32-битная палитра pal=new uchar[sizepal*4]; fload_data(pal,bpppal/8,4,sizepal, (bpppal==24)?1:2,f);
else sizepal=0;
// загружаем изображение k=imagesize(); inddata=new uchar[k]; switch(bpp)
{
case 32:
fload_data(inddata,4,4, k/4, 2, f) ; break;
case 24:
fload_data(inddata,3,3,k/3,1,f); break;
case 8: fread(inddata,1,k,f); break; default: retvalue=0;
}
fclose(f);
if(!retvalue) {clear();return 0; } return 1;
}
// сохранение TGA файла
int IMAGE::savetga(char*fname)
{
tgaheader header; // заголовок tga файла header.init();
// размер данных изображения в байтах int k=imagesize ();
int retvalue=l; // возвращаемое значение FILE*f=fopen(fname,"wb"); // открываем файл if(!f) return 0;
// заполняем поля header header.width=width; header.height=height; header.bpp=bpp; header.colornum=si zepal; if(sizepal)
{
header.typepal=l; header.typeimg=l; header.colorbpp=bpppal;
}
else header.typeimg=2;
// сохраняем заголовок fwrite(Sheader, 1, 18, f) ; if(sizepal) // сохраняем палитру fsave_data(pal,bpppal/8,4,sizepal, (bpppal==24)?1:2,f);
// сохраняем изображение switch(bpp)
{
case 32:
fsave_data(inddata,4,4,k/4,2,f);
break; case 24:
fsave_data(inddata,3,3,k/3,1, f) ; break;
case 1 :case 4: case 8: fwrite(inddata,1,k,f); break; default: retvalue=0;
}
fclose(f); // закрываем файл
if(!retvalue) {clear(); return 0;}
return 1;
}
// сохранение участка буфера цвета в изображение void IMAGE::fromcolor(int xorg,int yorg)
{
glReadBuffer(GL_BACK); switch(bpp)
case 1:
glReadPixels(xorg,yorg,width,height,
GL_RGBA,GL_BITMAP,inddata);
break;
case 8: // палитра должна быть установлена glReadPixels(xorg,yorg,width, height,
GL_COLOR_INDEX,GL_UNSIGNED_BYTE, inddata) ; break; case 24:
glReadPixels(xorg,yorg, width, height,
GL_RGB,GL_UNSIGNED_BYTE,inddata);
break; case 32:
glReadPixels(xorg,yorg, width, height,
GL_RGBA,GL_UNSIGNED_BYTE, inddata) ;
break; default:;
}
}
// загрузить из файлов несколько текстур int IMAGE::load2dtexture(char*str,uint* tex,