From 64824cab2bfa21e105b18906dd24602f7106a484 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sat, 28 Sep 2019 01:39:19 +0200 Subject: [PATCH] Implement CelGetFrameStart --- Source/engine.cpp | 4 +--- Source/engine.h | 10 +++++++++- Source/engine.inc | 29 +++++++++++++++++++++++++++++ Source/gendung.cpp | 12 ++++++------ Source/missiles.cpp | 2 +- defs.h | 6 ------ 6 files changed, 46 insertions(+), 17 deletions(-) create mode 100644 Source/engine.inc diff --git a/Source/engine.cpp b/Source/engine.cpp index 9b9db8c9c..9c46cd438 100644 --- a/Source/engine.cpp +++ b/Source/engine.cpp @@ -1560,14 +1560,12 @@ void Cl2ApplyTrans(BYTE *p, BYTE *ttbl, int nCel) int i, nDataSize; char width; BYTE *dst; - DWORD *pFrameTable; /// ASSERT: assert(p != NULL); /// ASSERT: assert(ttbl != NULL); for (i = 1; i <= nCel; i++) { - pFrameTable = (DWORD *)&p[4 * i]; - dst = &p[pFrameTable[0] + 10]; + dst = CelGetFrameStart(p, i) + 10; nDataSize = CelGetFrameSize(p, i) - 10; while (nDataSize) { width = *dst++; diff --git a/Source/engine.h b/Source/engine.h index 4752c72ee..1399e10e8 100644 --- a/Source/engine.h +++ b/Source/engine.h @@ -11,7 +11,15 @@ extern int orgseed; extern int SeedCount; extern BOOL gbNotInView; // valid - if x/y are in bounds -__FINLINE BYTE *CelGetFrame(BYTE *pCelBuff, int nCel, int *nDataSize); +#ifdef USE_ASM +#define __FORCEINLINE __forceinline +#include "engine.inc" +#else +#define __FORCEINLINE +BYTE *CelGetFrameStart(BYTE *pCelBuff, int nCel); +int CelGetFrameSize(BYTE *pCelBuff, int nCel); +BYTE *CelGetFrame(BYTE *pCelBuff, int nCel, int *nDataSize); +#endif void CelDrawDatOnly(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth); void CelDecodeOnly(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth); diff --git a/Source/engine.inc b/Source/engine.inc new file mode 100644 index 000000000..fed5981dc --- /dev/null +++ b/Source/engine.inc @@ -0,0 +1,29 @@ +__FORCEINLINE BYTE *CelGetFrameStart(BYTE *pCelBuff, int nCel) +{ + DWORD *pFrameTable; + + pFrameTable = (DWORD *)pCelBuff; + + return pCelBuff + SwapLE32(pFrameTable[nCel]); +} + +__FORCEINLINE int CelGetFrameSize(BYTE *pCelBuff, int nCel) +{ + DWORD *pFrameTable; + + pFrameTable = (DWORD *)pCelBuff; + + return SwapLE32(pFrameTable[nCel + 1]) - SwapLE32(pFrameTable[nCel]); +} + +__FORCEINLINE BYTE *CelGetFrame(BYTE *pCelBuff, int nCel, int *nDataSize) +{ + DWORD *pFrameTable; + DWORD nCellStart; + + pFrameTable = (DWORD *)pCelBuff; + nCellStart = SwapLE32(pFrameTable[nCel]); + *nDataSize = SwapLE32(pFrameTable[nCel + 1]) - nCellStart; + + return pCelBuff + nCellStart; +} diff --git a/Source/gendung.cpp b/Source/gendung.cpp index cf8b14a60..cf61b2170 100644 --- a/Source/gendung.cpp +++ b/Source/gendung.cpp @@ -159,12 +159,12 @@ void MakeSpeedCels() } pFrameTable = (DWORD *)pDungeonCels; - nDataSize = pFrameTable[0]; + nDataSize = SwapLE32(pFrameTable[0]); nlevel_frames = nDataSize & 0xFFFF; for (i = 1; i < nlevel_frames; i++) { z = i; - nDataSize = pFrameTable[i + 1] - pFrameTable[i]; + nDataSize = CelGetFrameSize(pDungeonCels, i); level_frame_sizes[i] = nDataSize & 0xFFFF; } @@ -178,14 +178,14 @@ void MakeSpeedCels() blood_flag = TRUE; if (level_frame_count[i] != 0) { if (level_frame_types[i] != 0x1000) { - src = &pDungeonCels[pFrameTable[i]]; + src = CelGetFrameStart(pDungeonCels, i); for (j = level_frame_sizes[i]; j; j--) { pix = *src++; if (pix && pix < 32) blood_flag = FALSE; } } else { - src = &pDungeonCels[pFrameTable[i]]; + src = CelGetFrameStart(pDungeonCels, i); for (k = 32; k; k--) { for (l = 32; l;) { width = *src++; @@ -244,7 +244,7 @@ void MakeSpeedCels() t = level_frame_sizes[i]; for (j = 1; j < blk_cnt; j++) { SpeedFrameTbl[i][j] = frameidx; - src = &pDungeonCels[pFrameTable[z]]; + src = CelGetFrameStart(pDungeonCels, z); dst = &pSpeedCels[frameidx]; tbl = &pLightTbl[256 * j]; for (k = t; k; k--) { @@ -255,7 +255,7 @@ void MakeSpeedCels() } else { for (j = 1; j < blk_cnt; j++) { SpeedFrameTbl[i][j] = frameidx; - src = &pDungeonCels[pFrameTable[z]]; + src = CelGetFrameStart(pDungeonCels, z); dst = &pSpeedCels[frameidx]; tbl = &pLightTbl[256 * j]; for (k = 32; k; k--) { diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 6b4dc66b8..fb08bf316 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -1096,7 +1096,7 @@ void LoadMissileGFX(BYTE mi) sprintf(pszName, "Missiles\\%s.CL2", mfd->mName); file = LoadFileInMem(pszName, NULL); for (i = 0; i < mfd->mAnimFAmt; i++) - mfd->mAnimData[i] = &file[((int *)file)[i]]; + mfd->mAnimData[i] = CelGetFrameStart(file, i); } else if (mfd->mAnimFAmt == 1) { sprintf(pszName, "Missiles\\%s.CL2", mfd->mName); if (!mfd->mAnimData[0]) diff --git a/defs.h b/defs.h index 6f5a53551..03fd6a3f0 100644 --- a/defs.h +++ b/defs.h @@ -183,12 +183,6 @@ typedef void (*_PVFV)(void); #define ALIGN_BY_1 #endif -#if (_MSC_VER == 1200) -#define __FINLINE __forceinline -#else -#define __FINLINE -#endif - #ifndef _BIG_ENDIAN_ #define SwapLE32 #else