⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gfx.cpp

📁 liu7788414
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/*
* ============================================================================
*  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 + -