RaspInitializeCompositeGlyphData

__int64 __fastcall RaspInitializeCompositeGlyphData(
        _FILE_IMAGE *a1,
        VOID **a2,
        __int64 a3,
        unsigned __int16 a4,
        __int16 a5,
        __int16 a6,
        UINT64 Offset,
        __int64 a8,
        __int64 a9,
        _BG_RASTERIZER_WORKSPACE *Workspace){
  VOID **v10; 
  __int64 v11; 
  UINT64 v12; 
  char *Memory; 
  char *v14; 
  _DWORD *v16; 
  __int64 v17; 
  char *v18; 
  __int16 *v19; 
  int v20; 
  int v21; 
  _DWORD *v22; 
  _WORD *v23; 
  char *v24; 
  char *v25; 
  char *v26; 
  __int16 v27; 
  char *v28; 
  VOID **v29; 
  unsigned __int16 *v30; 
  unsigned __int16 v31; 
  __int64 v32; 
  size_t v33; 
  __int64 v34; 
  __int16 v35; 
  __int16 v36; 
  __int16 v37; 
  unsigned __int16 v38; 
  __int16 v39; 
  __int16 v40; 
  __int64 v41; 
  __int64 v42; 
  __int64 v43; 
  __int16 v44; 
  __int16 v45; 
  _WORD *v46; 
  _DWORD *v47; 
  char *v48; 
  __int16 v52; 
  __int16 v53; 
  __int16 v54; 

  v10 = a2;
  v11 = a4;
  v12 = a4 + (unsigned __int16)a6 + 8 * (unsigned int)a4 + 2 * (a5 + 41);
  Memory = (char *)RaspAllocateMemory(v12, Workspace);
  v14 = Memory;
  if( !Memory )
    return 3221225626i64;
  memset(Memory, 0i64, v12);
  v16 = v14 + 2;
  v17 = 4i64;
  v48 = v14;
  v18 = v14;
  *(_WORD *)v14 = a5;
  v19 = (__int16 *)(a3 + 2);
  do
  {
    v20 = *v19++;
    *v16++ = v20;
    --v17;
  }
  while( v17 );
  v21 = *(_DWORD *)(v14 + 2);
  v22 = v14 + 18;
  *((_WORD *)v14 + 11) = a6;
  *((_WORD *)v14 + 12) = v11;
  v23 = v14 + 66;
  v47 = v22;
  *v22 = v21;
  v46 = v23;
  *(_QWORD *)(v18 + 26) = v23;
  v24 = (char *)&v23[a5];
  if( a6 )
  {
    *(_QWORD *)(v18 + 34) = v24;
    v24 += (unsigned __int16)a6;
    FioFwReadBytesAtOffset(a1, (unsigned int)Offset, (unsigned __int16)a6, &v23[a5]);
    v22 = v47;
    v23 = *(_WORD **)(v18 + 26);
    v46 = v23;
  }
  v25 = &v24[v11];
  *(_QWORD *)(v18 + 42) = v24;
  *(_QWORD *)(v18 + 50) = &v24[v11];
  v26 = &v24[4 * (unsigned int)(v11 + 2) + v11];
  v54 = 0;
  *(_QWORD *)(v18 + 58) = v26;
  v27 = 0;
  v53 = 0;
  while( 1 )
  {
    v28 = (char *)*v10;
    if( *v10 == v10 )
      break;
    if( *((VOID ***)v28 + 1) != v10 || (v29 = *(VOID ***)v28, *(char **)(*(_QWORD *)v28 + 8i64) != v28) )
      __fastfail(3u);
    *v10 = v29;
    v29[1] = v10;
    v30 = (unsigned __int16 *)*((_QWORD *)v28 + 2);
    if( (*((_WORD *)v28 + 12) & 0x200) != 0 )
    {
      *(_WORD *)a8 = *((_WORD *)v28 + 13);
      *v22 = *(_DWORD *)(v30 + 1);
    }
    v31 = 0;
    if( (__int16)*v30 > 0 )
    {
      do
      {
        v32 = v31++;
        *v23++ = v27 + *(_WORD *)(*(_QWORD *)(v30 + 13) + 2 * v32);
      }
      while( v31 < (__int16)*v30 );
      v46 = v23;
    }
    v33 = v30[12];
    v52 = v33 + v27;
    memmove(v24, *(const VOID **)(v30 + 21), v33);
    v34 = v30[12];
    v35 = 0x4000;
    v36 = *((_WORD *)v28 + 12);
    v24 += v34;
    v37 = 0x4000;
    if( (v36 & 8) != 0 )
    {
      v37 = *((_WORD *)v28 + 16);
      v35 = v37;
    }
    else if( (v36 & 0x40) != 0 )
    {
      v37 = *((_WORD *)v28 + 16);
      v35 = *((_WORD *)v28 + 17);
    }
    v38 = 0;
    if( (_WORD)v34 )
    {
      v39 = v54;
      v40 = v53;
      v41 = v37;
      v42 = v35;
      do
      {
        *(_WORD *)v25 = *(_WORD *)(*(_QWORD *)(v30 + 25) + 4i64 * v38);
        *(_WORD *)v26 = *(_WORD *)(*(_QWORD *)(v30 + 29) + 4i64 * v38);
        *(_WORD *)v25 = v41 * *(__int16 *)v25 / 0x4000;
        v43 = v42 * *(__int16 *)v26 / 0x4000;
        *(_WORD *)v26 = v43;
        if( !v38 )
        {
          *(_WORD *)v25 -= v39;
          *(_WORD *)v26 -= v40;
          v44 = *((_WORD *)v28 + 12);
          LOWORD(v43) = *(_WORD *)v26;
          if( (v44 & 2) != 0 )
          {
            if( (v44 & 1) != 0 )
            {
              *(_WORD *)v25 += *((_WORD *)v28 + 14);
              v45 = *((_WORD *)v28 + 15);
            }
            else
            {
              *(_WORD *)v25 += v28[28];
              v45 = v28[29];
            }
            *(_WORD *)v26 += v45;
            LOWORD(v43) = *(_WORD *)v26;
          }
        }
        v39 += *(_WORD *)v25;
        v40 += v43;
        v25 += 4;
        v26 += 4;
        ++v38;
      }
      while( v38 < v30[12] );
      v23 = v46;
      v53 = v40;
      v10 = a2;
      v54 = v39;
      v18 = v48;
    }
    RaspFreeMemory(v30, Workspace);
    RaspFreeMemory(v28, Workspace);
    v27 = v52;
    v22 = v47;
  }
  *(_QWORD *)a9 = v18;
  return 0i64;
}

Referenced by:

RaspLoadCompositeGlyphData