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