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,


⇐ вернуться назад | | далее ⇒