JD2022-TU1/main/extern/Camcam/HeadDetector/MAP_SpFunctions.cpp

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;
}
}