132 lines
3.3 KiB
C++
132 lines
3.3 KiB
C++
#include "TRACK.h"
|
|
#include "Rrasters.h"
|
|
#include "xmmintrin.h"
|
|
#define AVERAGE_COLOR_RADIUS 8
|
|
#define __55_RADIUS 0
|
|
#define __55_RADIUS_BIG 2
|
|
#define __55_RADIUS_RATIO 0//<< impair !!
|
|
|
|
#define __55_RADIUS_RATIO_BIG 4
|
|
#define __55_FACTOR_USED (0x0A0)
|
|
#define MAX_SURF 1000
|
|
#define ERROR_THRESHOLD 4
|
|
#define THRESH_R55 1
|
|
#define BORDER_LIMIT 10
|
|
|
|
#define SMALL_SURFACE 1//((((__55_RADIUS)<<1) + 1) * (((__55_RADIUS)<<1) + 1))
|
|
#define RSMALL_SURFACE ((((__55_RADIUS_RATIO)<<1) + 1) * (((__55_RADIUS_RATIO)<<1) + 1))
|
|
#define BIG_SURFACE ((((__55_RADIUS_BIG)<<1) + 1) * (((__55_RADIUS_BIG)<<1) + 1))
|
|
#define ONE_PO2 20
|
|
#define BIG_FACTOR ( (1<<ONE_PO2) / BIG_SURFACE )
|
|
#define SMALL_FACTOR ( (1<<ONE_PO2) / SMALL_SURFACE )
|
|
|
|
|
|
|
|
static float BigX;
|
|
static float BigY;
|
|
static s32 BigW;
|
|
static s32 BigE;
|
|
static TRACKEDPOINT *ALLXYW;
|
|
static s32 ALLPoints ;
|
|
static s32 SOLVXmax,SOLVYmax;
|
|
|
|
static void RATIO55(MAP *MapSRC,MAP *MapDST)
|
|
{
|
|
s32 *LAST,*DST,*SRC;
|
|
DST = MapDST->BASE;
|
|
SRC = MapSRC->BASE;
|
|
for (u32 SizeY = 0; SizeY < MapSRC->SY;SizeY ++)
|
|
{
|
|
LAST = DST + MapSRC->SX;
|
|
while (DST < LAST)
|
|
{
|
|
s32 Local,LocalBig;
|
|
Local = *(SRC);
|
|
LocalBig = *(DST);
|
|
*(DST) = 0;
|
|
if ((Local * __55_FACTOR_USED) > LocalBig<<8)
|
|
{
|
|
*(DST) = 1 | LocalBig;
|
|
}
|
|
DST++;
|
|
SRC++;
|
|
}
|
|
SRC+=MapSRC->PITCH-MapSRC->SX;
|
|
DST+=MapDST->PITCH-MapSRC->SX;
|
|
}
|
|
}
|
|
|
|
static void SOLVE(s32 *DST , s32 X, s32 Y,s32 P)
|
|
{
|
|
BigX += X ;
|
|
BigY += Y ;
|
|
BigW += 1;
|
|
if (BigE < *DST) BigE = *DST;
|
|
*DST &= ~1;
|
|
if (X <= BORDER_LIMIT) return;
|
|
if (Y <= BORDER_LIMIT) return;
|
|
if (X >= SOLVXmax - BORDER_LIMIT) return;
|
|
if (Y >= SOLVYmax - BORDER_LIMIT) return;
|
|
if (*(DST+1)&1) SOLVE(DST + 1 , X + 1, Y,P);
|
|
if (*(DST+P)&1) SOLVE(DST + P , X + 0, Y + 1,P);
|
|
if (*(DST-1)&1) SOLVE(DST - 1 , X - 1, Y,P);
|
|
if (*(DST-P)&1) SOLVE(DST - P , X + 0, Y - 1,P);
|
|
}
|
|
|
|
static void VECTORIZE_POINTS(MAP *MapDST,MAP *MapII,u32 SHIFT)
|
|
{
|
|
s32 *LAST,*DST;
|
|
#define VEC_BORDER (BORDER_LIMIT)
|
|
float Mulot;
|
|
DST = MapDST->BASE + MapDST->PITCH * VEC_BORDER;
|
|
SOLVXmax = MapDST->SX ;
|
|
SOLVYmax = MapDST->SY;
|
|
Mulot = (float)(1<<SHIFT);
|
|
for (u32 SizeY = VEC_BORDER; SizeY < MapDST->SY-VEC_BORDER;SizeY ++)
|
|
{
|
|
u32 SizeX;
|
|
DST += VEC_BORDER;
|
|
SizeX = VEC_BORDER;
|
|
LAST = DST + MapDST->SX - VEC_BORDER * 2;
|
|
while (DST < LAST)
|
|
{
|
|
if ((*DST & 1) && (*DST > ERROR_THRESHOLD)) // RASTER
|
|
{
|
|
if (ALLPoints<MAX_POINTS)
|
|
{
|
|
BigX = BigY = 0.0f;
|
|
BigW = BigE = 0;
|
|
SOLVE(DST , SizeX, SizeY ,MapDST->PITCH );
|
|
//if ((BigE > ERROR_THRESHOLD) /*&& (BigW < MAX_SURF)*/)
|
|
{
|
|
memset(&ALLXYW[ALLPoints],0,sizeof(TRACKEDPOINT));
|
|
BigX /= (float)BigW;
|
|
BigY /= (float)BigW;
|
|
|
|
BigX *= Mulot;
|
|
BigY *= Mulot;
|
|
|
|
ALLXYW[ALLPoints].BigE = BigE;
|
|
ALLXYW[ALLPoints].X = BigX;
|
|
ALLXYW[ALLPoints].Y = BigY;
|
|
BigE>>=2;
|
|
BigW<<=4;
|
|
if (BigW > 0xff) BigW = 0xff;
|
|
if (ALLXYW[ALLPoints].X < 0) ALLXYW[ALLPoints].X = 0;
|
|
if (ALLXYW[ALLPoints].Y < 0) ALLXYW[ALLPoints].Y = 0;
|
|
ALLXYW[ALLPoints].PreviousIndex = 0xffffffff;
|
|
ALLXYW[ALLPoints].NextIndex = 0xffffffff;
|
|
s32 *SRC;
|
|
SRC = MapII->BASE + (u32)ALLXYW[ALLPoints].X - (AVERAGE_COLOR_RADIUS>>1) - 1 + (u32)(ALLXYW[ALLPoints].Y-(AVERAGE_COLOR_RADIUS>>1) - 1) * MapII->PITCH;
|
|
ALLPoints++;
|
|
}
|
|
}
|
|
}
|
|
DST++;
|
|
SizeX++;
|
|
}
|
|
DST+=MapDST->PITCH-MapDST->SX;
|
|
DST+=VEC_BORDER;
|
|
}
|
|
}
|
|
|