📄 tga.cpp
字号:
tt=i*para;
for(j=0; j<para1; j++)
{
data[tt+j]=DataBuf[BufPoint];
BufPoint++;
if(BufPoint>=BUF_SIZE)
{
_lread(handle, DataBuf, BUF_SIZE);
BufPoint=0;
}
}
}
i+=len;
if(i>(unsigned int)(xsize-1))
{
*total=(short)i;
break;
}
} while(1==1);
return;
}
void WriteLine(TGA_HEAD* head, void* data, void * tdata, char* matxbuf, short* xtable,
short xsize, short protflag, short matxflag, short xdirection,
short pixelflag, short visibleflag)
{
short i, i1, xfirst, xlast, xinc, xinc1, xsize1;
unsigned long *sdata32, *tdata32;
unsigned short *sdata16, *tdata16;
char flag;
if(matxflag==YES)
{
if(head->TgaXSize%8==0) xsize1=head->TgaXSize/8;
else xsize1=head->TgaXSize/8+1;
}
else xsize1=0;
if(xdirection==_PX)
{
xfirst=0;
xlast=xsize-1;
xinc=1;
}
else
{
xfirst=xsize-1;
xlast=0;
xinc=-1;
}
i1=0;
xinc1=1;
if(pixelflag==_32BIT)
{
sdata32=(unsigned long*)data;
tdata32=(unsigned long *)tdata;
i=xfirst;
if(matxflag==NO)
{
do
{
if(protflag==ON)
{
if(visibleflag==YES)
{
//if((sdata32[xtable[i]]&0x00ffffffL)!=0)
tdata32[i1]=sdata32[xtable[i]];//&0x00ffffffL;
}
else
{
if((sdata32[xtable[i]]&0x00ffffffL)!=0)
tdata32[i1]=sdata32[xtable[i]];//|0xff000000L;
}
}
else
{
if(visibleflag==YES)
{
//if((sdata32[xtable[i]]&0x00ffffffL)==0)
// tdata32[i1]=0x00000000L;
// else
tdata32[i1]=sdata32[xtable[i]];//&0x00ffffffL;
}
else
{
/*
if((sdata32[xtable[i]]&0x00ffffffL)==0)
tdata32[i1]=0xff000000L;//10101
else
*/
tdata32[i1]=sdata32[xtable[i]];//|0xff000000L;
}
}
if(i==xlast) break;
i+=xinc;
i1+=xinc1;
}while(1==1);
}
else
{
do{
if(xdirection==_PX)
flag=matxbuf[xtable[i]/8]&(0x80>>(xtable[i]%8));
else
flag=matxbuf[xsize1-xtable[i]/8]&(0x1<<(8-xtable[i]%8));
if(flag!=0)
{
if(protflag==ON)
{
if(visibleflag==YES)
{
if((sdata32[xtable[i]]&0x00ffffffL)!=0)
tdata32[i1]=sdata32[xtable[i]];//&0x00ffffffL;
}
else
{
if((sdata32[xtable[i]]&0x00ffffffL)!=0)
tdata32[i1]=sdata32[xtable[i]];//|0xff000000L;
}
}
else
{
if(visibleflag==YES)
{
if((sdata32[xtable[i]]&0x00ffffffL)==0)
tdata32[i1]=0x00000000L;
else
tdata32[i1]=sdata32[xtable[i]];//&0x00ffffffL;
}
else
{
if((sdata32[xtable[i]]&0x00ffffffL)==0)
tdata32[i1]=0xff000000L;
else
tdata32[i1]=sdata32[xtable[i]];//|0xff000000L;
}
}
}
if(i==xlast) break;
i+=xinc;
i1+=xinc1;
}while(1==1);
}
}
else
{
sdata16=(unsigned short*)data;
tdata16=(unsigned short*)tdata;
i=xfirst;
if(matxflag==NO)
{
do
{
if(protflag==ON)
{
if(visibleflag==YES)
{
if((sdata16[xtable[i]]&0x7fff)!=0)
{
if((sdata16[xtable[i]]&0x7c00)==0)
tdata16[i1]=(sdata16[xtable[i]]&0x7fff)|0x0400;
else tdata16[i1]=sdata16[xtable[i]]&0x7fff;
}
}
else
{
if((sdata16[xtable[i]]&0x7fff)!=0)
{
if((sdata16[xtable[i]]&0x7c00)==0)
tdata16[i1]=sdata16[xtable[i]]|0x8400;
else tdata16[i1]=sdata16[xtable[i]]|0x8000;
}
}
}
else
{
if(visibleflag==YES)
{
if((sdata16[xtable[i]]&0x7c00)==0)
tdata16[i1]=(sdata16[xtable[i]]&0x7fff)|0x0400;
else tdata16[i1]=sdata16[xtable[i]]&0x7fff;
}
else
{
if((sdata16[xtable[i]]&0x7c00)==0)
tdata16[i1]=sdata16[xtable[i]]|0x8400;
else
tdata16[i1]=sdata16[xtable[i]]|0x8000;
}
}
if(i==xlast) break;
i+=xinc;
i1+=xinc1;
} while(1==1);
}
else
{
do
{
if(xdirection==_PX)
flag=matxbuf[xtable[i]/8]&(0x80>>(xtable[i]%8));
else
flag=matxbuf[xsize1-xtable[i]/8]&(0x1<<(8-xtable[i]%8));
if(flag!=0)
{
if(protflag==ON)
{
if(visibleflag==YES)
{
if((sdata16[xtable[i]]&0x7fff)!=0)
{
if((sdata16[xtable[i]]&0x7c00)==0)
tdata16[i1]=(sdata16[xtable[i]]&0x7fff)|0x0400;
else
tdata16[i1]=sdata16[xtable[i]]&0x7fff;
}
}
else
{
if((sdata16[xtable[i]]&0x7fff)!=0)
{
if((sdata16[xtable[i]]&0x7c00)==0)
tdata16[i1]=sdata16[xtable[i]]|0x8400;
else
tdata16[i1]=sdata16[xtable[i]]|0x8000;
}
}
}
else
{
if(visibleflag==YES)
{
if((sdata16[xtable[i]]&0x7c00)==0)
tdata16[i1]=(sdata16[xtable[i]]&0x7fff)|0x0400;
else
tdata16[i1]=sdata16[xtable[i]]&0x7fff;
}
else
{
if((sdata16[xtable[i]]&0x7c00)==0)
tdata16[i1]=sdata16[xtable[i]]|0x8400;
else
tdata16[i1]=sdata16[xtable[i]]|0x8000;
}
}
}
if(i==xlast) break;
i+=xinc;
i1+=xinc1;
}while(1==1);
}
}
return;
}
void TransData24To16(void* data1, void* data, short size)
{
unsigned long temp;
int i;
unsigned short* data16;
char* data24;
data24=(char*)data1;
data16=(unsigned short*)data;
for(i=0; i<size; i++)
{
temp=0xff000000L|((unsigned long)data24[i*3])|
(((unsigned long)data24[i*3+1])<<8)|(((unsigned long)data24[i*3+2])<<16);
Trans32To16(&temp, &data16[i]);
}
return;
}
void TransData24To32(void* data1, void* data, short size)
{
unsigned char* data24, t1,t2,t3;
int i;
unsigned long* data32;
data24=(unsigned char*)data1;
data32=(unsigned long*)data;
for(i=0; i<size; i++)
{
t1 = (unsigned char)data24[i*3];
t2 = (unsigned char)data24[i*3+1];
t3 = (unsigned char)data24[i*3+2];
data32[i]=( unsigned long )(0xff000000L |
( (unsigned long )t1)|
( ( (unsigned long ) t2)<<8)|
( ( (unsigned long ) t3)<<16)
);
}
return;
}
void TransData32To16(void* data1, void* data, short size)
{
unsigned long *data32;
int i;
unsigned short* data16;
data32=(unsigned long*)data1;
data16=(unsigned short*)data;
for(i=0; i<size; i++) Trans32To16(&data32[i], &data16[i]);
return;
}
void TransData16To32(void* data1, void* data, short size)
{
unsigned long *data32;
int i;
unsigned short* data16;
data32=(unsigned long*)data;
data16=(unsigned short*)data1;
for(i=0; i<size; i++) Trans16To32(&data16[i], &data32[i]);
return;
}
void Trans16To32(unsigned short* color16, unsigned long* color32p)
{
unsigned short color=*color16;
unsigned long* color32=color32p;
*color32=0;
*color32|=((color&0x001f)<<3);
*color32|=((color&0x03e0)<<6);
*color32|=((color&0x7c00)<<9);
if((color&0x8000)!=0) *color32|=0xff000000L;
return;
}
void Trans32To16(unsigned long* color32, unsigned short* color16p)
{
unsigned long color=*color32;
unsigned short* color16=color16p;
*color16=0;
*color16|=(unsigned short)((color&0x000000ffL)>>3);
*color16|=(unsigned short)(((color&0x0000ff00L)>>11)<<5);
*color16|=(unsigned short)(((color&0x00ff0000L)>>19)<<10);
if((color&0x80000000L)!=0) *color16|=0x8000;
return;
}
void GetALLScrTable(short xsize, short ysize, short scrx, short scry,
short* xtab, short* ytab )
{
short i;
double para, total;
para=(double)xsize/(double)scrx;
total=0;
for(i=0; i<scrx; i++)
{
xtab[i]=(short)total;
total+=para;
}
para=(double)ysize/(double)scry;
total=0;
for(i=0; i<scry; i++)
{
ytab[i]=(short)total;
total+=para;
}
return;
}
LPVOID winalloc(long size)
{
HGLOBAL hmem;
hmem=GlobalAlloc(GHND,size);
return GlobalLock(hmem);
};
void winfree(LPVOID ptr)
{
HGLOBAL hmem=(HGLOBAL)GlobalHandle(ptr);
GlobalUnlock(hmem);
GlobalFree(hmem);
};
/* ******************************* add function by zjb ********************** */
unsigned int ReadTgaFileToBuffer( char* filename, unsigned int * over_buf, short & xsize, short & ysize )
{
TGA_HEAD head;
HFILE handle;
long size;
LPUSLONG ppp = (LPUSLONG)over_buf;
handle=_lopen(filename, O_BINARY|O_RDONLY);
if(handle==-1)
{
_lclose(handle);
return(0);
}
_llseek(handle, 0, SEEK_SET);
_lread(handle, (char*)&head, sizeof(TGA_HEAD));
if(head.It!=2 && head.It!=10)
{
_lclose(handle);
return(FORMAT_ERROR);
}
size=18L;
if(head.Id>0) size+=(long)head.Id;
if(head.Cmt==1) size+=(long)head.Cms2*((long)head.Cms3/8);
xsize=head.TgaXSize;
ysize=head.TgaYSize;
ReadCelFIle(handle, &head, NULL, /*pp*/ppp, xsize, ysize,
xsize/*VIDEOWIDTH*/, NO, size, NO, _32BIT, NO);
_lclose(handle);
return(SUCCESS);
}
/******************************* End of File *******************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -