GxpReadFrameBufferPixels

INT64 __fastcall GxpReadFrameBufferPixels(__int64 a1, unsigned int *a2){
  unsigned int v2; 
  unsigned int *v3; 
  unsigned int v5; 
  _DWORD *Resolution; 
  int v7; 
  int v8; 
  int v9; 
  int v10; 
  INT64 result; 
  __int64 v12; 
  unsigned int v13; 
  UINT8 *v14; 
  int v15; 
  UINT8 *v16; 
  UINT64 v17; 
  __int64 v18; 
  unsigned int v19; 
  __int64 a5; 
  UINT8 *v21; 
  INT64 a3; 
  int v23; 
  UINT64 a4; 
  int v25; 
  INT64 v26; 
  int v27; 
  INT64 a2a; 
  int v29; 
  int v30[4]; 
  __int64 v31; 
  int RotatedPixelOffset; 
  int v34; 
  UINT64 a1a; 
  v2 = 0;
  a4 = 0i64;
  v3 = a2;
  v25 = 0;
  a5 = 0i64;
  v34 = 0;
  v5 = (unsigned int)BgpGetBitsPerPixel((PVOID)a1, a2) >> 3;
  Resolution = BgpGetResolution(&a2a);
  v8 = Resolution[2];
  a3 = *(_QWORD *)Resolution;
  v23 = v8;
  if( !a1 )
    return 3221225485i64;
  v9 = *(_DWORD *)(a1 + 4);
  if( !v9 )
    return 3221225485i64;
  v10 = *(_DWORD *)a1;
  if( !*(_DWORD *)a1 || *(_DWORD *)(a1 + 8) != v7 || !v3 || v9 + *v3 > (unsigned int)a3 || v10 + v3[1] > HIDWORD(a3) )
    return 3221225485i64;
  if( (dword_140C13310 & 8) != 0 )
    return 3221225659i64;
  if( *(_DWORD *)(a1 + 12) < v5 * v9 * v10 )
    return 3221225507i64;
  if( (dword_140C13310 & 2) == 0 )
    return 3221225473i64;
  result = GxpAdjustRectangleToFrameBuffer((UINT64 *)a1, (UINT64 *)v3, (INT64)&a3, &a4, &a5, 0);
  if( (int)result >= 0 )
  {
    v13 = 0;
    RotatedPixelOffset = 0;
    if( !*(_BYTE *)BgInternal )
    {
      v30[0] = *(_DWORD *)a1;
      LOBYTE(v12) = 1;
      v30[1] = *(_DWORD *)(a1 + 4);
      v30[3] = *(_DWORD *)(a1 + 12);
      v30[2] = xmmword_140C132B0;
      v31 = *(_QWORD *)(a1 + 24);
      v13 = ((__int64(__fastcall *)(int *, unsigned int *, __int64))qword_140C132C0)(v30, v3, v12);
      goto LABEL_19;
    }
    v14 = *(UINT8 **)(a1 + 24);
    v15 = *(_DWORD *)a1;
    v21 = (UINT8 *)qword_140C132C0;
    if( *((_BYTE *)BgInternal + 2) )
    {
      HIDWORD(a1a) = 0;
      if( !v15 )
        goto LABEL_19;
      while( 1 )
      {
        v19 = 0;
        LODWORD(a1a) = 0;
        if( *(_DWORD *)(a1 + 4) )
          break;
LABEL_30:
        HIDWORD(a1a) = ++v2;
        if( v2 >= *(_DWORD *)a1 )
          goto LABEL_18;
      }
      v26 = a3;
      v27 = v23;
      a2a = a4;
      v29 = v25;
      while( 1 )
      {
        RotatedPixelOffset = GxpGetRotatedPixelOffset(a1a, &a2a, v3, (INT64)&v26, &v34);
        if( RotatedPixelOffset < 0 )
          break;
        memmove(v14, &v21[v5 * v34], v5);
        ++v19;
        v14 += v5;
        LODWORD(a1a) = v19;
        if( v19 >= *(_DWORD *)(a1 + 4) )
          goto LABEL_30;
      }
    }
    else
    {
      v16 = (UINT8 *)qword_140C132C0 + v5 * (*v3 + v23 * v3[1]);
      if( !v15 )
      {
LABEL_19:
        *(_DWORD *)a1 = HIDWORD(a4);
        *(_DWORD *)(a1 + 4) = a4;
        *(_QWORD *)v3 = a5;
        return v13;
      }
      v17 = v5 * *(_DWORD *)(a1 + 4);
      v18 = v5 * v23;
      do
      {
        memmove(v14, v16, v17);
        v16 += v18;
        v14 += v5 * *(_DWORD *)(a1 + 4);
        --v15;
      }
      while( v15 );
      v3 = a2;
    }
LABEL_18:
    v13 = RotatedPixelOffset;
    goto LABEL_19;
  }
  return result;
}

Referenced by:

BgpGxReadRectangle