📄 gfx.cpp
字号:
/*
* ============================================================================
* Name : CGlobalData from GlobalData.cpp
* Part of : Game
* Created : 2003-06-16 by Qiu Wei Min
* Modified : 2003-09-03 by Zheng Jie Sheng to adapt on LGVX6000
* Implementation notes:
*
* Version :
* Copyright: Gameloft S.A.
* ============================================================================
*/
// INCLUDE FILES
#include "gfx.h"
#include "simplememory.h"
#include "resfile.h"
#include "imath.h"
#include "Sysdef.h"
extern CSimpleMemory *SMemory;
extern CResFile *pResFile;
// ================= MEMBER FUNCTIONS =======================
CGfx::CGfx(void)
{
for(int i=0;i<256;i++)
m_tmppal[i] = 0;
// m_pEngine = pEngine;
m_pVideo = NULL;
m_bw_level = 0;
m_pLastBWPal = NULL;
// idisp = m_pEngine->m_pIDisplay;
}
CGfx::~CGfx()
{
}
GFXBMP* CGfx::LoadBmp(const char *pName, bool bGlobal)
{
CResFile *pFile = pResFile;
void *h = pFile->FindRecord(pName);
GFXBMP *p;
if(h == NULL)
{
SYS_ASSERT(0);
return NULL;
}
p = (GFXBMP*)pFile->ReadBMPToHeap(h, bGlobal);
return p;
}
//##ModelId=402850A40343
void CGfx::Blt8_16(GFXBMP *pDes, int dx, int dy, int w, int h, GFXBMP *pSrc, int sx, int sy, int flag)
{
int hflip = flag & GFX_FLIPX; // flip flag
int vflip = flag & GFX_FLIPY;
unsigned short *pD, *pE, *pPal;
unsigned char *pS;
int i;
int s_space, d_space;
//copy to buffer
if(m_bw_level)
{
ComputBWPalette((unsigned short*)pSrc->pData, pSrc->npal);
pPal = m_tmppal + ((flag >> 8) & 0xff);
}
else
pPal = (unsigned short*)pSrc->pData + ((flag >> 8) & 0xff);
pS = pSrc->pData + pSrc->w * sy + sx + pSrc->npal * 2;
s_space= (pSrc->w - w);
pD = (unsigned short*)(pDes->pData + (pDes->w * dy + dx) * 2);
if( hflip && vflip){
d_space = -pDes->w + w;
pD += (h-1) *pDes->w +(w-1); //move to(w-1,h-1)
} else if( hflip ){
d_space = pDes->w + w ;
pD += w -1; //move to (w-1,0)
} else if( vflip)
{
d_space = -pDes->w - w ;
pD += (h-1)*pDes->w; //move to the (0,7)
} else { //no flip
d_space = pDes->w - w;
}
if(pSrc->flag & GFXBMP_TRANS)
{
if((flag & GFX_SEMITRANS) == 0)
{
for(i = 0; i < h; i++)
{
if(!hflip)
{
pE = pD + w;
while(pD < pE)
{
if( *pS)
*pD = pPal[*pS];
pD++;
pS++;
}
}
else
{
pE = pD - w;
while(pD > pE)
{
if( *pS)
*pD = pPal[*pS];
pD--;
pS++;
}
}
pS += s_space;
pD += d_space;
}
}
else
{
for(i = 0; i < h; i++)
{
if(!hflip)
{
pE = pD + w;
while(pD < pE)
{
if( *pS)
{
*pD = ((pPal[*pS] >> 1) & 0x777) + ((*pD >> 1) & 0x777);
}
pD++;
pS++;
}
}
else
{
pE = pD - w;
while(pD > pE)
{
if( *pS)
{
*pD = ((pPal[*pS] >> 1) & 0x777) + ((*pD >> 1) & 0x777);
}
pD--;
pS++;
}
}
pS += s_space;
pD += d_space;
}
}
}
else {
for(i = 0; i < h; i++)
{
if(!hflip)
{
pE = pD + w - 8;
while(pD < pE)
{
*pD++ = pPal[*pS++];
*pD++ = pPal[*pS++];
*pD++ = pPal[*pS++];
*pD++ = pPal[*pS++];
*pD++ = pPal[*pS++];
*pD++ = pPal[*pS++];
*pD++ = pPal[*pS++];
*pD++ = pPal[*pS++];
}
pE += 8;
while(pD < pE)
{
*pD++ = pPal[*pS++];
}
}
else
{
pE = pD - w + 8;
while(pD > pE)
{
*pD-- = pPal[*pS++];
*pD-- = pPal[*pS++];
*pD-- = pPal[*pS++];
*pD-- = pPal[*pS++];
*pD-- = pPal[*pS++];
*pD-- = pPal[*pS++];
*pD-- = pPal[*pS++];
*pD-- = pPal[*pS++];
}
pE -= 8;
while(pD > pE)
{
*pD-- = pPal[*pS++];
}
}
pS += s_space;
pD += d_space;
}
}
}
//##ModelId=402850A40339
void CGfx::Blt16_16(GFXBMP *pDes, int dx, int dy, int w, int h, GFXBMP *pSrc, int sx, int sy, int flag)
{
register unsigned short *pS, *pD;
//
unsigned short *pE;
int i;
//
pS = (unsigned short*)(pSrc->pData + (pSrc->w * sy + sx) * 2);
pD = (unsigned short*)(pDes->pData + (pDes->w * dy + dx) * 2);
if(flag == 0)
{
//SYS_ASSERT(((int)pS & 0x3) == 0 && ((int)pD & 0x3) == 0);
/*#if !defined AEE_SIMULATOR //&& !defined BREW11
if(((int)pS & 0x3) == 0 && ((int)pD & 0x3) == 0)
LongCopy2((unsigned char*)pD, (unsigned char*)pS, w*2, h, (pDes->w - w)*2,(pSrc->w - w)*2);
#else
*/ //LongCopy1(pD, pS, w, h, (pDes->w - w),(pSrc->w - w));
for( i = 0; i < h; i++)
{
pE = pD + w;
while(pD < pE)
{
*pD++ = *pS++;
}
pD += (pDes->w - w);
pS += (pSrc->w - w);
}
//#endif
}
}
//##ModelId=402850A4032C
void CGfx::Blt(GFXBMP *pDes, int dx, int dy, int w, int h, GFXBMP *pSrc, int sx, int sy, int flag)
{
SYS_ASSERT(pSrc!=NULL);
SYS_ASSERT(pDes!=NULL);
int invisible;
//set clip area, it's long and puzzling...
if(dx < 0 )
{
if(flag & GFX_ROT90)
{
h += dx;
if(flag & GFX_FLIPX) sy -= dx;
}
else
{
w += dx;
if(!(flag & GFX_FLIPX)) sx -= dx;
}
dx= 0;
}
if(flag & GFX_ROT90)
{
invisible = dx + h - pDes->w;
if(invisible > 0)
{
if(!(flag & GFX_FLIPX)) sy += invisible;
h -= invisible;
}
}
else
{
invisible = dx + w - pDes->w;
if(invisible > 0)
{
if(flag & GFX_FLIPX) sx += invisible;
w -= invisible;
}
}
if(dy < 0 )
{
if(flag & GFX_ROT90)
{
w += dy;
if(!(flag & GFX_FLIPY)) sx -= dy;
}
else
{
h += dy;
if(!(flag & GFX_FLIPY)) sy -= dy;
}
dy= 0;
}
if(flag & GFX_ROT90)
{
invisible = dy + w - pDes->h;
if(invisible > 0)
{
if(flag & GFX_FLIPY) sx += invisible;
w -= invisible;
}
}
else
{
invisible = dy + h - pDes->h;
if(invisible > 0)
{
if(flag & GFX_FLIPY) sy += invisible;
h -= invisible;
}
}
if(w<=0 || h <=0)
return;
if(pDes->bpp == 16)
{
if(pSrc->bpp == 8)
{
Blt8_16(pDes, dx, dy, w, h, pSrc, sx, sy, flag);
}
else if(pSrc->flag == 0)
Blt16_16(pDes, dx, dy, w, h, pSrc, sx, sy, flag);
else //if(pSrc->flag & GFXBMP_ALPHA)
{
SYS_ASSERT(0);
//Blt16_16_Alpha(pDes, dx, dy, w, h, pSrc, sx, sy, flag);
}
}
}
//##ModelId=402850A40320
void CGfx::DrawBmp(int dx, int dy, int w, int h, GFXBMP *pSrc, int sx, int sy, int flag)
{
SYS_ASSERT(m_pVideo != NULL);
Blt(m_pVideo, dx, dy, w, h, pSrc, sx, sy, flag);
}
//##ModelId=402850A40318
void CGfx::DrawOpaque( int dx, int dy, int w, int h, GFXBMP *pSrc, int sx, int sy )
{
int invisible;
//set clip area, it's long and puzzling...
if(dx < 0 )
{
w += dx;
sx -= dx;
dx= 0;
}
invisible = dx + w - m_pVideo->w;
if(invisible > 0)
{
w -= invisible;
}
if(dy < 0 )
{
h += dy;
sy -= dy;
dy= 0;
}
invisible = dy + h - m_pVideo->h;
if(invisible > 0)
{
h -= invisible;
}
if(w<=0 || h <=0)
return;
if(m_pVideo->bpp == 16)
{
if(pSrc->bpp == 8)
{
Blt8_16(m_pVideo, dx, dy, w, h, pSrc, sx, sy, 0);
}
else if(pSrc->flag == 0)
Blt16_16(m_pVideo, dx, dy, w, h, pSrc, sx, sy, 0);
else if(pSrc->flag & GFXBMP_ALPHA)
{
SYS_ASSERT(0);
}
}
}
//##ModelId=402850A40315
void CGfx::ComputBWPalette(unsigned short *pSrc, int nPal)
{
unsigned short *p = m_tmppal;
register int c, r, g, b, t, a = 16 - m_bw_level;
if(m_pLastBWPal == pSrc)return;
while(nPal--)
{
c = *pSrc++;
r = ((c >> 8) & 0xf);
g = ((c >> 4) & 0xf);
b = ((c) & 0xf);
t = (r * 64 + g * 160 + b * 32) * m_bw_level / 256;
r = (r * a + t) / 16;
g = (g * a + t) / 16;
b = (b * a + t) / 16;
*p++ = (r << 8) | (g << 4) | b;
}
}
//##ModelId=402850A4030D
void CGfx::BltTile(GFXBMP *pDes, int dx, int dy, GFXBMP *pSrc, int sx, int sy, int flag)
{
SYS_ASSERT(16 == pDes->bpp);
SYS_ASSERT(8 == pSrc->bpp);
int hflip = flag & GFX_FLIPX; // flip flag
int vflip = flag & GFX_FLIPY;
unsigned short *pD, *pE, *pPal;
unsigned char *pS;
int i;
int s_space, d_space;
//copy to buffer
if(m_bw_level)
{
ComputBWPalette((unsigned short*)pSrc->pData, pSrc->npal);
pPal = m_tmppal + ((flag >> 8) & 0xff);
}
else
pPal = (unsigned short*)pSrc->pData + ((flag >> 8) & 0xff);
pS = pSrc->pData + pSrc->w * sy + sx + ((pSrc->npal)<<1);
s_space= (pSrc->w - 8);
pD = (unsigned short*)(pDes->pData + ((pDes->w * dy + dx)<<1));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -