📄 ani.cpp
字号:
#include "basefunc.H"
#include "nd_bitmap.H"
#include "ani.H"
// static
HANDLE CAni::s_hHeap =NULL;
UINT CAni::s_uNumAllocsInHeap =0;
CAniFileSet CAni::s_setAniFile;
IDai* CAni::s_pDai = IDai::CreateNew();
IFrameSet* CAni::s_pFrameSet = IFrameSet::CreateNew();
CRITICAL_SECTION sAniCritical;
//--------------------------------------------------------------
DWORD Str2ID( const char* str )
{
int i;
unsigned int v;
static unsigned m[70];
strncpy((char *)m,str,256);
for (i=0;i<256/4 && m[i];i++) ;
m[i++]=0x9BE74448,m[i++]=0x66F42C48;
v=0xF4FA8928;
__asm {
mov esi,0x37A8470E ;x0=0x37A8470E
mov edi,0x7758B42B ;y0=0x7758B42B
xor ecx,ecx
_loop:
mov ebx,0x267B0B11 ;w=0x267B0B11
rol v,1
lea eax,m
xor ebx,v
mov eax,[eax+ecx*4]
mov edx,ebx
xor esi,eax
xor edi,eax
add edx,edi
or edx,0x2040801 ;a=0x2040801
and edx,0xBFEF7FDF ;c=0xBFEF7FDF
mov eax,esi
mul edx
adc eax,edx
mov edx,ebx
adc eax,0
add edx,esi
or edx,0x804021 ;b=0x804021
and edx,0x7DFEFBFF ;d=0x7DFEFBFF
mov esi,eax
mov eax,edi
mul edx
add edx,edx
adc eax,edx
jnc _skip
add eax,2
_skip:
inc ecx;
mov edi,eax
cmp ecx,i
jnz _loop
xor esi,edi
mov v,esi
}
return v;
}
//--------------------------------------------------------------
void * CAni::operator new(size_t size)
{
// got heap?
if (!s_hHeap)
{
s_hHeap =::HeapCreate(0, 0, 0);
if (!s_hHeap)
return NULL;
}
// alloc mem for new obj
void* p =::HeapAlloc(s_hHeap, HEAP_ZERO_MEMORY, size);
if (p)
{
s_uNumAllocsInHeap++;
}
return p;
}
//--------------------------------------------------------------
void CAni::operator delete(void* p)
{
// check param
if (!s_hHeap || s_uNumAllocsInHeap <= 0)
return;
// free it...
if (::HeapFree(s_hHeap, 0, p))
{
s_uNumAllocsInHeap--;
}
// time to destroy heap?
if (s_uNumAllocsInHeap <= 0)
{
if (::HeapDestroy(s_hHeap))
s_hHeap =NULL;
}
}
//--------------------------------------------------------------
BOOL CAni::IsValidPt(void* p)
{
if (!s_hHeap || !p)
return false;
if ((DWORD)p < 0x00010000 || (DWORD)p >= 0x7FFEFFFF) // user address range from 1M--2G-64k
return false;
if (::IsBadCodePtr((FARPROC)p))
return false;
return ::HeapValidate(s_hHeap, 0, p);
}
//--------------------------------------------------------------
void CAni::Init(void)
{
m_nStatus =ANISTATUS_INIT;
m_bHalf =false;
m_iFrameAmount =0;
for(int i=0;i<_MAX_FRAME;i++)
{
m_pbmpFrame[i] =NULL;
}
return;
}
//#define USE_ENCRYPTANI
#ifdef USE_ENCRYPTANI
//--------------------------------------------------------------
BOOL CAni::Create(const char* pszDataFile, const char* pszIndex, BOOL bHalf,DWORD dwLoadWay)
{
if (!pszDataFile || !pszIndex)
return false;
if (m_nStatus == ANISTATUS_LOADED)
Destroy();
m_bHalf = bHalf;
FILE *fp= fopen(pszDataFile,"rb");
if (!fp) {
m_nStatus =ANISTATUS_FAILED;
return false;
}
WORD wFileFlag = 0;
fread(&wFileFlag,sizeof(WORD),1,fp);
WORD ANIFILE_FLAG = 0x8888;
if(wFileFlag != ANIFILE_FLAG)
return false;
int nTotal = 0;
fread(&nTotal,sizeof(int),1,fp);
typedef struct CSection{
DWORD dwID;
int nFrame;
int nOffSet;
}Section;
Section* pTitle = (Section*)calloc(sizeof(Section),nTotal);
if (!pTitle)
return false;
fread(pTitle,sizeof(Section),nTotal,fp);
// search the titile
DWORD dwIDSearch = String2ID( pszIndex );
int i = 0, nfind = -1;
Section* pTitleFind = NULL;
for (i=0; i<nTotal; i++)
{
pTitleFind = pTitle + i;
if (pTitleFind->dwID == dwIDSearch)
{
nfind = i;
break;
}
}
if(nfind == -1)
{
m_nStatus =ANISTATUS_FAILED;
fclose(fp);
return false;
}
else
pTitleFind = pTitle+nfind;
fseek(fp, 256*pTitleFind->nOffSet, SEEK_CUR);
m_iFrameAmount = pTitleFind->nFrame%_MAX_FRAME;
// get frame file name & load it...
for( i=0; i<m_iFrameAmount; i ++)
{
char szFrame[MAX_PATH];
if(!feof(fp))
fread(szFrame,256,1,fp);
m_pbmpFrame[i] =new CMyBitmap;
assert(m_pbmpFrame[i]);
if((i != 0)&&(i%2 == 0)&&m_bHalf)
{
m_pbmpFrame[i] = m_pbmpFrame[i-1];
}
else
if (!m_pbmpFrame[i]->Load(szFrame,dwLoadWay)) // frame load error
{
for(int j=0; j<i+1; j++)
{
if (m_pbmpFrame[j])
delete m_pbmpFrame[j];
m_pbmpFrame[j] =NULL;
}
fclose(fp);
m_iFrameAmount =0;
m_nStatus =ANISTATUS_FAILED;
return false;
}
}
fclose(fp);
m_nStatus =ANISTATUS_LOADED;
return true;
}
//--------------------------------------------------------------
#else
//--------------------------------------------------------------
BOOL CAni::Create(const char* pszDataFile, const char* pszIndex, BOOL bHalf,DWORD dwLoadWay)
{
// param check
::EnterCriticalSection(&sAniCritical);
if (!pszDataFile || !pszIndex)
return false;
// release mem if data have loaded.
if (m_nStatus == ANISTATUS_LOADED)
Destroy();
m_bHalf = bHalf;
if(s_pDai->Locate(pszDataFile, pszIndex, CAni::s_pFrameSet) == IDai::SUCCESS)
{
BOOL bReturn = this->Create(CAni::s_pFrameSet);
::LeaveCriticalSection(&sAniCritical);
return bReturn;
}
else
{
m_nStatus =ANISTATUS_FAILED;
::LeaveCriticalSection(&sAniCritical);
return false;
}
::LeaveCriticalSection(&sAniCritical);
return false;
}
//--------------------------------------------------------------
#endif
//--------------------------------------------------------------
BOOL CAni::Create(AniIndexInfo* pInfo)
{
if(!pInfo)
{
m_nStatus =ANISTATUS_FAILED;
return false;
}
m_iFrameAmount = pInfo->setAniLine.size()-1;
for(int i=0; i<m_iFrameAmount; i ++)
{
char* pszFile = pInfo->setAniLine[i+1];
m_pbmpFrame[i] =new CMyBitmap;
assert(m_pbmpFrame[i]);
if((i != 0)&&(i%2 == 0)&&m_bHalf)
{
m_pbmpFrame[i] = m_pbmpFrame[i-1];
}
else
if (!pszFile || !m_pbmpFrame[i]->Load(pszFile)) // frame load error
{
for(int j=0; j<i+1; j++)
{
if (m_pbmpFrame[j])
delete m_pbmpFrame[j];
m_pbmpFrame[j] =NULL;
}
m_iFrameAmount =0;
m_nStatus =ANISTATUS_FAILED;
//::ErrorOut("Error: %s load failed in CAni::Create().", szFrame);
return false;
}
}
m_nStatus =ANISTATUS_LOADED;
return true;
}
//--------------------------------------------------------------
BOOL CAni::Create(IFrameSet* pFrameSet)
{
if(!pFrameSet)
{
m_nStatus =ANISTATUS_FAILED;
return false;
}
m_iFrameAmount = pFrameSet->GetFrameAmount();
for(int i=0; i<m_iFrameAmount; i ++)
{
char* pszFile = pFrameSet->GetFrameByIndex(i);
m_pbmpFrame[i] =new CMyBitmap;
assert(m_pbmpFrame[i]);
if((i != 0)&&(i%2 == 0)&&m_bHalf)
{
m_pbmpFrame[i] = m_pbmpFrame[i-1];
}
else
if (!pszFile || !m_pbmpFrame[i]->Load(pszFile)) // frame load error
{
for(int j=0; j<i+1; j++)
{
if (m_pbmpFrame[j])
delete m_pbmpFrame[j];
m_pbmpFrame[j] =NULL;
}
m_iFrameAmount =0;
m_nStatus =ANISTATUS_FAILED;
//::ErrorOut("Error: %s load failed in CAni::Create().", szFrame);
return false;
}
}
m_nStatus =ANISTATUS_LOADED;
return true;
}
//--------------------------------------------------------------
// return true means is the last frame
BOOL CAni::Show(UINT uFrame, int x, int y, int alpha,DWORD dwShowWay) const
{
if(m_nStatus != ANISTATUS_LOADED || m_iFrameAmount <= 0)
return false;
uFrame %=m_iFrameAmount;
m_pbmpFrame[uFrame]->Show(x, y, alpha,dwShowWay);
if(uFrame+1 >= m_iFrameAmount)
return true;
else
return false;
}
//--------------------------------------------------------------
BOOL CAni::ShowEx(UINT uFrame, int x, int y, RECT *lpSrc, DWORD dwWidth, DWORD dwHeight, int alpha, DWORD dwShowWay)
{
if(m_nStatus != ANISTATUS_LOADED || m_iFrameAmount <= 0)
return false;
uFrame %=m_iFrameAmount;
m_pbmpFrame[uFrame]->ShowEx(x, y, lpSrc, dwWidth, dwHeight, alpha, dwShowWay);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -