136 lines
No EOL
3.1 KiB
C++
136 lines
No EOL
3.1 KiB
C++
#include "MAP_SpFunctions.h"
|
|
#include "math.h"
|
|
|
|
#ifndef __DEFINE_NUMS__
|
|
#define __DEFINE_NUMS__
|
|
|
|
#define f32 float
|
|
#define u32 unsigned int
|
|
#define s32 int
|
|
#define u16 unsigned short
|
|
#define s16 signed short
|
|
#define u8 unsigned char
|
|
#define s8 char
|
|
|
|
#endif
|
|
|
|
|
|
void COPY_PATCH_RGBA(
|
|
MAP *MapSRC,
|
|
MAP *MapDST,
|
|
s32 SX,s32 SY, // Source XY
|
|
s32 DX,s32 DY, // Dest XY
|
|
u32 DSizeX,u32 DSizeY, //SourceSize
|
|
u32 SizeX,u32 SizeY, // DestSieze
|
|
float Rot128,float SCLAEV)
|
|
{
|
|
s32 *LAST,*DST,*DST2,*SRC,*BIGLAST;
|
|
s32 SYS,SYS2,SXS2,SXS3,SXI3,SYS3,SYI3,SXI,SYI,SYI2,SXI2;
|
|
s32 ScaleROTTable[1024],*p_ScaleROTTable;
|
|
s32 ScaleROTTableLenght[1024],*p_ScaleROTTableLenght;
|
|
float CosA,SinA;
|
|
|
|
CosA = cosf(Rot128);
|
|
SinA = sinf(Rot128);
|
|
|
|
//AAAA+= 1<<13 ;
|
|
SX -= (int)((CosA * (DSizeX>>1)) - (SinA * (DSizeY>>1))) ;
|
|
SY -= (int)((SinA * (DSizeX>>1)) + (CosA * (DSizeY>>1))) ;
|
|
SX <<= 8;
|
|
SY <<= 8;
|
|
|
|
SYS = 0;
|
|
SXI = (int)(65536.0f * ((float)DSizeX / (float)SizeX ));
|
|
SYI = (int)(65536.0f * ((float)DSizeY / (float)SizeY ));
|
|
|
|
/* Compute Scale X */
|
|
SXI3 = -(int)((float)SXI * SinA * SCLAEV);
|
|
SYI3 = (int)((float)SXI * CosA * SCLAEV);
|
|
SXS3 = SX;
|
|
SYS3 = SY;
|
|
|
|
/* Compute raster X */
|
|
|
|
SXI2 = (int)((float)SXI * CosA);
|
|
SYI2 = (int)((float)SXI * SinA);
|
|
SXS2 = 0;
|
|
SYS2 = 0;
|
|
|
|
/* Rasterize */
|
|
DX -= SizeX>>1;
|
|
DY -= SizeY>>1;
|
|
DX>>=8;DY>>=8;
|
|
if (DX < 0 ) DX = 0;
|
|
if (DY < 0 ) DY = 0;
|
|
|
|
p_ScaleROTTable = (s32 *)ScaleROTTable;
|
|
p_ScaleROTTableLenght = (s32*)ScaleROTTableLenght;
|
|
DST = MapDST->GetBase() + DY * MapDST->PITCH + DX;
|
|
BIGLAST = MapDST->GetBase() + MapDST->SY * MapDST->PITCH;
|
|
SizeX>>=8;SizeY>>=8;
|
|
while (SizeY--)
|
|
{
|
|
DST2 = DST;
|
|
SRC = MapSRC->GetBase();
|
|
LAST = DST + SizeX;
|
|
SXS2 = SXS3 + SXI2 * SizeX;
|
|
SYS2 = SYS3 + SYI2 * SizeX;
|
|
while (((SXS2>>16 >= MapSRC->SX-1) || (SXS2>>16 < 1) ||
|
|
(SYS2>>16 >= MapSRC->SY-1) || (SYS2>>16 < 1)) && (DST < LAST))
|
|
{
|
|
SXS2 -= SXI2;
|
|
SYS2 -= SYI2;
|
|
LAST--;
|
|
}
|
|
SXS2 = SXS3;
|
|
SYS2 = SYS3;
|
|
while (((SXS2>>16 >= MapSRC->SX-1) || (SXS2>>16 < 1) ||
|
|
(SYS2>>16 >= MapSRC->SY-1) || (SYS2>>16 < 1)) && (DST < LAST))
|
|
{
|
|
SXS2 += SXI2;
|
|
SYS2 += SYI2;
|
|
DST++;
|
|
}
|
|
|
|
while (DST < LAST)
|
|
{
|
|
//if ((DST > MapDST->GetBase()) && (DST < BIGLAST))
|
|
*(DST) = (*(SRC+(SXS2>>16) + (SYS2>>16)*MapSRC->PITCH)) & 0xfffffffe;
|
|
SXS2 += SXI2;
|
|
SYS2 += SYI2;
|
|
DST++;
|
|
}
|
|
SXS3 += SXI3;
|
|
SYS3 += SYI3;
|
|
DST = DST2 + MapDST->PITCH;
|
|
}
|
|
}
|
|
|
|
|
|
void RGBA_2_II(MAP *pSrcMAP,MAP *pDstMAP)
|
|
{
|
|
s32 *pSrc,*pSrcL,*pSrcLL,*pDst;
|
|
|
|
pSrc = pSrcMAP->GetBase();
|
|
pDst = pDstMAP->GetBase();
|
|
pSrcLL = pSrc + pSrcMAP->SX + pSrcMAP->PITCH * pSrcMAP->SY;
|
|
pSrcL = pSrc + pSrcMAP->SX;
|
|
*(pDst++) = (*(pSrc++)>>8) & 0xff;
|
|
while (pSrc<pSrcL)
|
|
{
|
|
*(pDst++) = ((*(pSrc++)>>8) & 0xff) + *(pDst-1);
|
|
}
|
|
pSrc += pSrcMAP->PITCH - pSrcMAP->SX;
|
|
pDst += pDstMAP->PITCH - pDstMAP->SX;
|
|
while (pSrc<pSrcLL)
|
|
{
|
|
pSrcL = pSrc + pSrcMAP->SX;
|
|
*(pDst++) = ((*(pSrc++)>>8) & 0xff) + *(pDst-pDstMAP->PITCH);
|
|
while (pSrc<pSrcL)
|
|
{
|
|
*(pDst++) = ((*(pSrc++)>>8) & 0xff) + *(pDst-pDstMAP->PITCH) + *(pDst-1) - *(pDst-pDstMAP->PITCH-1);
|
|
}
|
|
pSrc += pSrcMAP->PITCH - pSrcMAP->SX;
|
|
pDst += pDstMAP->PITCH - pDstMAP->SX;
|
|
}
|
|
} |