kolibrios-fun/programs/media/imgview/formats/tga.cpp
Kirill Lipatov (Leency) aef7c5284b imgview 0.08
git-svn-id: svn://kolibrios.org@958 a494cfbc-eb01-0410-851d-a64ba20cac60
2008-12-13 23:11:59 +00:00

103 lines
2.9 KiB
C++

#include "..\kosSyst.h"
#include "tga.h"
int TGAFile::LoadTGAFile(Byte* filebuff, Dword filesize)
{
memcpy((Byte*)&Tga_head,(Byte*)filebuff,sizeof(sTGAHeader));
width=Tga_head.Width;
height=Tga_head.Height;
Byte* pImg=filebuff+sizeof(sTGAHeader)+Tga_head.BytesInIdentField+Tga_head.ColorMapOrigin+(Tga_head.ColorMapLength*Tga_head.ColorMapEntrySize/8);
Byte* pPal=filebuff+sizeof(sTGAHeader)+Tga_head.BytesInIdentField+Tga_head.ColorMapOrigin;
Byte* cBuffer;
int x,y;
Byte r;
int sm;
int state=1;
if (Tga_head.ImageDescByte >= 32) sm=height-1; else sm=0;
// Èçîáðàæåíèå ñ ïàëèòðîé (ïàëèòðà 24 èëè 32-áèòíàÿ)
if (Tga_head.ImageTypeCode==1)
{
if (Tga_head.ColorMapEntrySize>=24)
{
buffer=kos_GetMemory(width*height*3);
int bpp=Tga_head.ColorMapEntrySize/8;
for(y=height-1;y!=-1;y--)
{
for(x=0;x<width;x++)
{
r=*(pImg); pImg++;
cBuffer=buffer+(abs(sm-y)*width*3)+x*3;
*(cBuffer+0)=(Byte)(pPal[r*bpp+1]);
*(cBuffer+1)=(Byte)(pPal[r*bpp+2]);
*(cBuffer+2)=(Byte)(pPal[r*bpp+3]);
}
}
state=0;
}
}
// ÖÂåòíîå èçîáðàæåíèå áåç ñæàòèÿ è ïàëèòðû
else if (Tga_head.ImageTypeCode==2)
{
switch (Tga_head.ImagePixelSize)
{
case 32:
case 24:
buffer=kos_GetMemory(width*height*3);
for(y=height-1;y!=-1;y--)
{
for(x=0;x<width;x++)
{
cBuffer=buffer+(abs(sm-y)*width*3)+x*3;
*(cBuffer+0)=*(pImg+0);
*(cBuffer+1)=*(pImg+1);
*(cBuffer+2)=*(pImg+2);
pImg=pImg+Tga_head.ImagePixelSize/8;
}
}
state=0;
break;
case 16:
buffer=kos_GetMemory(width*height*3);
for(y=height-1;y!=-1;y--)
{
for(x=0;x<width;x++)
{
cBuffer=buffer+(abs(sm-y)*width*3)+x*3;
*(cBuffer+0)=(Byte)((*(Word*)(pImg)) & 31)<<3;
*(cBuffer+1)=(Byte)((*(Word*)(pImg)>>5) & 31)<<3;
*(cBuffer+2)=(Byte)((*(Word*)(pImg)>>10) & 31)<<3;
pImg=pImg+2;
}
}
state=0;
break;
}
}
// Ìîíîõðîìíîå èçîáðàæåíèå
else if (Tga_head.ImageTypeCode==3)
{
switch (Tga_head.ImagePixelSize)
{
case 8:
buffer=kos_GetMemory(width*height*3);
for(y=height-1;y!=-1;y--)
{
for(x=0;x<width;x++)
{
cBuffer=buffer+(abs(sm-y)*width*3)+x*3;
*(cBuffer+0)=*(pImg);
*(cBuffer+1)=*(pImg);
*(cBuffer+2)=*(pImg);
pImg++;
}
}
state=0;
break;
}
}
return state;
}