/*
* ImageRenderFull at 0xffe73898.
* Full-frame image render path that dispatches bitmap/header handling and
* scanline conversion helpers.
*/
int __fastcall ImageRenderFull(int *p_n2, int n26, int a3, int a4)
{
int *p_n2_1; // ebx
int v5; // esi
int n2; // edi
int v7; // eax
int v8; // ecx
int v9; // eax
char *count; // ebp
char *i; // edx
int v12; // ecx
char v13; // al
int v14; // eax
int v15; // eax
char n48_1; // cl
char *i_1; // edi
void *count_1; // edx
int v19; // ecx
char v20; // al
int v21; // eax
char n48; // cl
int *p_n2_3; // esi
unsigned int *p_count; // eax
int v25; // eax
int v26; // edi
int *p_n2_2; // [esp+14h] [ebp-8h]
p_n2_1 = p_n2;
v5 = 0;
if ( p_n2[3] )
p_n2[3] = 0;
n2 = *p_n2;
if ( (unsigned int)*p_n2 > 3 )
{
v9 = a4;
}
else
{
if ( n26 > 9 )
v7 = (n26 > 26) + 1;
else
v7 = 0;
v8 = v7 + 3 * n2;
v9 = a4;
p_n2 = *(int **)(a4 + 4 * v8 + 128);
count = (char *)((1 << (char)p_n2) - 1);
if ( 1 << (char)p_n2 != 1 && p_n2_1[1] > (int)count )
{
i = (char *)p_n2_1[2];
if ( n2 )
{
if ( n2 != 1 )
{
if ( n2 != 2 )
return -1;
LABEL_26:
p_n2_2 = BitmapDecodeHeader(n2, count, i);
if ( p_n2_2 )
{
i_1 = &count[p_n2_1[2]];
count_1 = (void *)(p_n2_1[1] - (_DWORD)count);
if ( *p_n2_1 )
{
if ( *p_n2_1 != 1 )
{
if ( *p_n2_1 != 2 )
return -1;
goto LABEL_46;
}
v19 = 0;
if ( (int)count_1 > 0 )
{
while ( 1 )
{
v20 = count[p_n2_1[2] + v19];
if ( v20 < 0 || *(char *)(v20 + a4) < 0 )
break;
if ( ++v19 >= (int)count_1 )
goto LABEL_38;
}
v5 = -1;
}
LABEL_38:
i_1 = &count[p_n2_1[2]];
}
else
{
v21 = 0;
if ( (int)count_1 > 0 )
{
while ( 1 )
{
n48 = i_1[v21];
if ( n48 < 48 || n48 > 57 )
break;
if ( ++v21 >= (int)count_1 )
goto LABEL_45;
}
v5 = -1;
}
}
LABEL_45:
if ( !v5 )
{
LABEL_46:
p_n2_3 = BitmapDecodeHeader(*p_n2_1, count_1, i_1);
if ( !p_n2_3 )
return -1;
if ( ImageRenderFull(p_n2_2, n26, a3, a4) < 0 )
return -1;
if ( ImageRenderFull(p_n2_3, n26, a3, a4) < 0 )
return -1;
p_count = ImageRenderAllocContext();
p_n2_1[3] = (int)p_count;
if ( !p_count || ImageRenderSetPixel(p_count, (unsigned int *)p_n2_2[3]) < 0 )
return -1;
v25 = ImageRenderSetPixel((unsigned int *)p_n2_1[3], (unsigned int *)p_n2_3[3]);
goto LABEL_59;
}
}
return -1;
}
v12 = 0;
if ( (int)count <= 0 )
{
LABEL_17:
v14 = 0;
}
else
{
while ( 1 )
{
v13 = *(_BYTE *)(v12 + p_n2_1[2]);
if ( v13 < 0 || *(char *)(v13 + a4) < 0 )
break;
if ( ++v12 >= (int)count )
goto LABEL_17;
}
v14 = -1;
}
i = (char *)p_n2_1[2];
}
else
{
v15 = 0;
if ( (int)count <= 0 )
{
LABEL_24:
v14 = 0;
}
else
{
while ( 1 )
{
n48_1 = i[v15];
if ( n48_1 < 48 || n48_1 > 57 )
break;
if ( ++v15 >= (int)count )
goto LABEL_24;
}
v14 = -1;
}
}
if ( v14 )
return -1;
goto LABEL_26;
}
}
if ( n2 )
{
v26 = n2 - 1;
if ( v26 )
{
if ( v26 != 1 )
return *(_DWORD *)p_n2_1[3];
v25 = ImageRenderCopyBlock(p_n2_1, n26, (int)p_n2, v9);
}
else
{
v25 = ImageRenderLine(p_n2_1, n26, (int)p_n2, v9);
}
}
else
{
v25 = ImageRenderBlock(p_n2_1, n26, (int)p_n2, v9);
}
LABEL_59:
if ( v25 < 0 )
return -1;
return *(_DWORD *)p_n2_1[3];
}