RaspInitializeGlyphData

__int64 __fastcall RaspInitializeGlyphData(__int64 a1, int a2, _QWORD *a3, _BG_RASTERIZER_WORKSPACE *a4){
  int v7; 
  unsigned int v8; 
  _FILE_IMAGE *v9; 
  unsigned int v10; 
  unsigned int v11; 
  unsigned int v12; 
  unsigned __int16 v13; 
  unsigned __int16 v14; 
  char *Memory; 
  char *v16; 
  char *v17; 
  int v18; 
  UINT16 *v19; 
  int v20; 
  int v21; 
  unsigned int v22; 
  __int64 v23; 
  unsigned int v24; 
  _BG_RASTERIZER_WORKSPACE *v25; 
  unsigned int v26; 
  char *v27; 
  _BG_RASTERIZER_WORKSPACE *v28; 
  VOID *v29; 
  _BYTE *v30; 
  int v31; 
  __int64 v32; 
  __int64 v33; 
  __int16 v34; 
  __int64 v35; 
  __int64 v36; 
  unsigned int v37; 
  char *v38; 
  __int16 v39; 
  char *v40; 
  char v41; 
  __int64 v42; 
  __int16 v43; 
  _DWORD *v44; 
  char v45; 
  _BG_RASTERIZER_WORKSPACE *v46; 
  VOID *v47; 
  __int64 v49; 
  char *v50; 
  unsigned int v51; 
  UINT16 v52; 
  size_t Size[2]; 
  VOID *v54; 
  _FILE_IMAGE *v55; 
  UINT16 Buffer[4]; 
  __int16 v57[12]; 
  __int64 v58; 
  int v59; 
  _QWORD *v60; 
  _BG_RASTERIZER_WORKSPACE *Workspace; 

  Workspace = a4;
  v60 = a3;
  v59 = a2;
  *(_QWORD *)Buffer = 0i64;
  v57[0] = 0;
  LOWORD(v58) = 0;
  v52 = 0;
  if( !a1 )
    return 3221225473i64;
  v7 = *(_DWORD *)(a1 + 60);
  if( !v7 )
    return 3221225473i64;
  v8 = v7 + a2;
  v55 = *(_FILE_IMAGE **)(*(_QWORD *)(a1 + 16) + 16i64);
  v9 = v55;
  FioFwReadUshortAtOffset(v55, (unsigned int)(v7 + a2), Buffer);
  FioFwReadUshortAtOffset(v55, v8 + 2, &Buffer[1]);
  v8 += 4;
  FioFwReadUshortAtOffset(v55, v8, &Buffer[2]);
  FioFwReadUshortAtOffset(v55, v8 + 2, &Buffer[3]);
  v10 = v8 + 4;
  FioFwReadUshortAtOffset(v55, v10, (UINT16 *)v57);
  v11 = Buffer[0];
  if( (Buffer[0] & 0x8000u) != 0 )
    return 3221225485i64;
  if( Buffer[0] )
  {
    v12 = v10 + 2 * (__int16)Buffer[0];
    FioFwReadUshortAtOffset(v55, v12, &v52);
    v13 = v52 + 1;
    FioFwReadUshortAtOffset(v9, v12 + 2, (UINT16 *)&v58);
    v14 = v58;
    v54 = (VOID *)(unsigned __int16)v58;
    *(_QWORD *)Size = v13 + (unsigned __int64)(unsigned __int16)v58 + 8i64 * v13 + 2 * ((__int16)v11 + 41i64);
    Memory = (char *)RaspAllocateMemory(*(UINT64 *)Size, a4);
    v16 = Memory;
    if( Memory )
    {
      memset(Memory, 0i64, Size[0]);
      v17 = v16;
      v18 = (__int16)Buffer[1];
      *(_DWORD *)(v16 + 6) = (__int16)Buffer[2];
      *(_DWORD *)(v16 + 10) = (__int16)Buffer[3];
      *(_DWORD *)(v16 + 14) = v57[0];
      *(_WORD *)v16 = v11;
      *(_DWORD *)(v16 + 2) = v18;
      *(_DWORD *)(v16 + 18) = v18;
      *((_WORD *)v16 + 11) = v14;
      *((_WORD *)v16 + 12) = v13;
      v19 = (UINT16 *)(v16 + 66);
      v20 = *(_DWORD *)(a1 + 60);
      v21 = v59 + 10;
      *(_QWORD *)(v17 + 26) = v19;
      v22 = v20 + v21;
      if( (__int16)v11 > 0 )
      {
        v23 = v11;
        do
        {
          FioFwReadUshortAtOffset(v9, v22, v19);
          v22 += 2;
          ++v19;
          --v23;
        }
        while( v23 );
        v14 = v58;
      }
      v24 = v22 + 2;
      *(_QWORD *)(v17 + 34) = v19;
      FioFwReadBytesAtOffset(v9, v24, v14, v19);
      v25 = Workspace;
      v26 = v14 + v24;
      v27 = (char *)v19 + (_QWORD)v54;
      v28 = Workspace;
      *(_QWORD *)(v17 + 42) = v27;
      v29 = RaspAllocateMemory(v13, v28);
      v54 = v29;
      v30 = v29;
      if( v29 )
      {
        v31 = v13;
        FioFwReadBytesAtOffset(v9, v26, v13, v29);
        LODWORD(v32) = 0;
        LODWORD(v33) = 0;
        v34 = 0;
        if( v13 )
        {
          do
          {
            v35 = (unsigned int)v33;
            v36 = v34++;
            *(_BYTE *)(v36 + *(_QWORD *)(v17 + 42)) = v30[(unsigned int)v33];
            if( (v30[(unsigned int)v33] & 8) != 0 )
            {
              v33 = (unsigned int)(v33 + 1);
              if( v30[v33] )
              {
                v32 = (unsigned __int8)v30[v33];
                do
                {
                  v49 = v34++;
                  *(_BYTE *)(v49 + *(_QWORD *)(v17 + 42)) = v30[v35];
                  --v32;
                }
                while( v32 );
                v31 = v13;
              }
            }
            LODWORD(v33) = v33 + 1;
          }
          while( v34 < v31 );
          v9 = v55;
        }
        v37 = v33 + v26;
        v38 = &v27[v13];
        v39 = v32;
        *(_QWORD *)(v17 + 50) = v38;
        if( v31 )
        {
          while( 1 )
          {
            v40 = &v38[4 * v39];
            *(_DWORD *)v40 = v32;
            v41 = *(_BYTE *)(v39 + *(_QWORD *)(v17 + 42));
            if( (v41 & 2) != 0 )
            {
              FioFwReadBytesAtOffset(v9, v37++, 1ui64, &v38[4 * v39]);
              if( (*(_BYTE *)(v39 + *(_QWORD *)(v17 + 42)) & 0x10) == 0 )
                *(_DWORD *)v40 = -*(_DWORD *)v40;
            }
            else
            {
              if( (v41 & 0x10) != 0 )
                goto LABEL_20;
              FioFwReadUshortAtOffset(v9, v37, (UINT16 *)&v38[4 * v39]);
              v37 += 2;
            }
            LODWORD(v32) = 0;
LABEL_20:
            if( ++v39 >= v31 )
            {
              v38 = *(char **)(v17 + 50);
              break;
            }
          }
        }
        v42 = (__int64)&v38[4 * v31 + 8];
        v43 = v32;
        v58 = v42;
        *(_QWORD *)(v17 + 58) = v42;
        if( v31 )
        {
          do
          {
            v44 = (_DWORD *)(v42 + 4i64 * v43);
            *v44 = v32;
            v45 = *(_BYTE *)(*(_QWORD *)(v17 + 42) + v43);
            if( (v45 & 4) != 0 )
            {
              FioFwReadBytesAtOffset(v9, v37++, 1ui64, v44);
              if( (*(_BYTE *)(*(_QWORD *)(v17 + 42) + v43) & 0x20) == 0 )
                *v44 = -*v44;
            }
            else
            {
              if( (v45 & 0x20) != 0 )
                goto LABEL_27;
              FioFwReadUshortAtOffset(v9, v37, (UINT16 *)v44);
              v37 += 2;
            }
            LODWORD(v32) = 0;
LABEL_27:
            ++v43;
            v42 = v58;
          }
          while( v43 < v31 );
        }
        v46 = Workspace;
        v47 = v54;
        *v60 = v17;
        RaspFreeMemory(v47, v46);
        return 0i64;
      }
      RaspFreeMemory(v17, v25);
    }
  }
  else
  {
    v50 = (char *)RaspAllocateMemory(0x42ui64, a4);
    if( v50 )
    {
      v51 = (__int16)Buffer[1];
      *(_DWORD *)(v50 + 6) = (__int16)Buffer[2];
      *(_DWORD *)(v50 + 10) = (__int16)Buffer[3];
      *(_DWORD *)(v50 + 14) = v57[0];
      *(_WORD *)v50 = 0;
      *(_DWORD *)(v50 + 2) = v51;
      *(_QWORD *)(v50 + 18) = v51;
      *a3 = v50;
      return 0i64;
    }
  }
  return 3221225626i64;
}

Referenced by:

RaspLoadGlyphData