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