BgpGxFindSubRectangle

INT64 __fastcall BgpGxFindSubRectangle(UINT64 *a1, INT64 a2, _QWORD *a3, UINT64 *a4, _BYTE *a5){
  UINT64 *v5; 
  __int64 *v6; 
  UINT64 *v7; 
  unsigned int v8; 
  unsigned int v9; 
  unsigned int v10; 
  unsigned int v11; 
  UINT64 v12; 
  unsigned int v13; 
  unsigned int v14; 
  unsigned int v15; 
  unsigned int v16; 
  unsigned int v17; 
  unsigned int i; 
  int v19; 
  __int64 v20; 
  INT64 result; 
  unsigned int v22; 
  UINT64 v23; 
  UINT8 *v24; 
  UINT8 *v25; 
  __int64 v26; 
  unsigned int v27; 
  unsigned int v28; 
  unsigned int v29; 
  unsigned int v30; 
  unsigned int v31; 
  unsigned int v32; 
  __int64 v33; 
  unsigned int v34; 
  unsigned int v35; 
  unsigned int v36; 
  unsigned int v37; 
  char v38; 
  int v39[24]; 
  v39[2] = 0;
  v5 = a4;
  v6 = a3;
  v7 = a1;
  if( !a4 )
    return 3221225485i64;
  if( !a1 )
    return 3221225485i64;
  v8 = *((_DWORD *)a1 + 2);
  if( ((v8 - 24) & 0xFFFFFFF7) != 0 )
    return 3221225485i64;
  v9 = *(_DWORD *)a1;
  v10 = *((_DWORD *)a1 + 1);
  v11 = 0;
  v12 = a1[3];
  v13 = 0;
  v14 = v8 >> 3;
  v15 = v9;
  v38 = 0;
  v16 = v10;
  if( (_DWORD)a2 == -16777216 && v14 == 4 )
  {
    v17 = 0;
    if( !v9 )
    {
LABEL_33:
      *a5 = 1;
      *a3 = 0i64;
      return 0i64;
    }
    do
    {
      for( i = 0; i < v10; ++i )
      {
        if( *(_DWORD *)v12 )
        {
          v38 = 1;
          v27 = i;
          if( i >= v16 )
            v27 = v16;
          v16 = v27;
          v28 = i;
          if( i <= v13 )
            v28 = v13;
          v13 = v28;
          v29 = v17;
          if( v17 >= v15 )
            v29 = v15;
          v15 = v29;
          v30 = v17;
          if( v17 <= v11 )
            v30 = v11;
          v11 = v30;
        }
        v12 += 4i64;
      }
      ++v17;
    }
    while( v17 < v9 );
  }
  else
  {
    v31 = 0;
    if( !v9 )
      goto LABEL_33;
    do
    {
      v32 = 0;
      if( v10 )
      {
        v33 = v14;
        do
        {
          if( *(_BYTE *)(v12 + 2) != BYTE2(a2) || *(_WORD *)v12 != (_WORD)a2 )
          {
            v38 = 1;
            v34 = v32;
            if( v32 >= v16 )
              v34 = v16;
            v16 = v34;
            v35 = v32;
            if( v32 <= v13 )
              v35 = v13;
            v13 = v35;
            v36 = v31;
            if( v31 >= v15 )
              v36 = v15;
            v15 = v36;
            v37 = v31;
            if( v31 <= v11 )
              v37 = v11;
            v11 = v37;
            v33 = v14;
          }
          v12 += v33;
          ++v32;
        }
        while( v32 < v10 );
      }
      ++v31;
    }
    while( v31 < v9 );
    v7 = a1;
    v5 = a4;
    v6 = a3;
  }
  if( !v38 )
    goto LABEL_33;
  v19 = v13 - v16 + 1;
  v20 = v11 - v15 + 1;
  v39[0] = v19;
  v39[1] = v20;
  if( !v15 && !v16 && v19 == v10 && (_DWORD)v20 == v9 )
    return 3221226021i64;
  result = BgpGxRectangleCreate(v39, v8, v6);
  if( (int)result >= 0 )
  {
    v22 = v14 * *((_DWORD *)v7 + 1);
    v23 = v14 * v19;
    v24 = (UINT8 *)(v7[3] + v22 * v15 + v16 * v14);
    v25 = *(UINT8 **)(*a3 + 24i64);
    if( (_DWORD)v20 )
    {
      v26 = v22;
      do
      {
        memmove(v25, v24, v23);
        v25 += v23;
        v24 += v26;
        --v20;
      }
      while( v20 );
    }
    *(_DWORD *)v5 = v16;
    *((_DWORD *)v5 + 1) = v15;
    *a5 = 0;
    return 0i64;
  }
  return result;
}

Referenced by:

AnFwDisplayFade