RaspTestIntersection
__int64 __fastcall RaspTestIntersection(__int64 a1, int a2, _DWORD *a3, _DWORD *a4){
_DWORD *v4;
_DWORD *v6;
_DWORD *v7;
__int64 v8;
__int64 v9;
__int64 v10;
__int64 v11;
__int64 v12;
__int64 v13;
__int64 v14;
__int64 v15;
__int64 v16;
__int64 result;
char v18;
bool v19;
_DWORD *v20;
UINT64 v21;
__int64 v22;
__int64 v23;
__int64 v24;
INT64 v25;
__int64 v26;
__int64 v27;
__int64 v28;
__int64 v29;
__int128 v30;
__int64 v31;
bool v32;
__int128 v33;
__int128 v34;
__int64 v35;
v4 = *(_DWORD **)a1;
v6 = *(_DWORD **)(a1 + 8);
v7 = *(_DWORD **)(a1 + 16);
v8 = a2;
v9 = *v4 + v4[2];
v10 = v4[1] + v4[3];
v11 = v6[1] + v6[3];
v35 = *v7 + v7[2];
v12 = v9 << 16;
v13 = (__int64)(v7[1] + v7[3]) << 16;
v14 = v10 << 16;
v15 = v11 << 16;
v16 = v35 << 16;
result = (__int64)a2 << 16;
if( v10 << 16 == v13 )
{
if( v14 == result )
goto LABEL_9;
}
else if( v14 == result )
{
LABEL_39:
v18 = *(_BYTE *)(a1 + 24);
++result;
goto LABEL_5;
}
if( v13 == result )
goto LABEL_39;
v18 = *(_BYTE *)(a1 + 24);
if( v15 == result && *(_BYTE *)(a1 + 24) != 1 )
++result;
LABEL_5:
if( v18 == 1 )
{
*a4 = 0x7FFFFFFF;
v32 = v14 < result;
if( v14 > result )
{
if( v13 > result )
goto LABEL_27;
v32 = v14 < result;
}
if( !v32 || v13 >= result )
{
v33 = v12 + (v16 - v12) * (result - v14) / (v13 - v14);
result = (__int64)(WORD4(v33) + (_QWORD)v33) >> 16;
*a3 = result;
return result;
}
LABEL_27:
*a3 = 0x7FFFFFFF;
return result;
}
v19 = v14 < result;
if( v14 > result )
{
if( v13 > result && v15 > result )
goto LABEL_9;
v19 = v14 < result;
}
if( v19 && v15 < result && v13 < result )
goto LABEL_9;
v21 = v14 + v13 - ((__int64)(v6[1] + v6[3]) << 17);
if( !v21 )
{
v20 = a4;
v34 = v12 + (v16 - v12) * (result - v14) / (v13 - v14);
result = (__int64)(WORD4(v34) + (_QWORD)v34) >> 16;
*a3 = result;
goto LABEL_10;
}
v22 = *v6 + v6[2];
result = 2 * v11;
v23 = v10 + v7[1] + v7[3] - 2 * v11;
v24 = 2 * (v11 - v10);
v25 = v24 * v24 - 4 * v23 * (v10 - v8);
if( v25 < 0 )
{
LABEL_9:
v20 = a4;
*a3 = 0x7FFFFFFF;
LABEL_10:
*v20 = 0x7FFFFFFF;
return result;
}
LODWORD(v26) = BgpFmSqrt(v25, v21);
v27 = -65536 * v24;
v28 = (v27 + v26) / (2 * v23);
v29 = (v27 - v26) / (2 * v23);
v30 = v35 * v28 * v28 + (0x10000 - v28) * (v9 * (0x10000 - v28) + 2 * v22 * v28);
*(_QWORD *)&v30 = DWORD2(v30) + (_QWORD)v30;
v31 = (__int64)v30 >> 32;
*a3 = DWORD1(v30);
v20 = a4;
result = (v35 * v29 * v29 + (0x10000 - v29) * (v9 * (0x10000 - v29) + 2 * v22 * v29)) / 0x100000000i64;
*a4 = result;
if( v28 < 0 || v28 > 0x10000 )
{
*a3 = 0x7FFFFFFF;
LODWORD(v31) = 0x7FFFFFFF;
}
if( v29 < 0 || v29 > 0x10000 )
{
*a4 = 0x7FFFFFFF;
result = 0x7FFFFFFFi64;
}
if( (int)v31 > (int)result )
{
*a3 = result;
*a4 = v31;
return result;
}
if( (_DWORD)v31 == (_DWORD)result )
goto LABEL_10;
return result;
}Referenced by:
RaspScanConvert