Newer
Older
AMI-Aptio-BIOS-Reversed / PurleyPlatPkg / Platform / Pei / EarlyVideoPei / ImageRenderFull.c
@Ajax Dong Ajax Dong 2 days ago 4 KB Full restructure
/*
 * 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];
}