RaspInitializeCompositeGlyphData

INT64 __fastcall RaspInitializeCompositeGlyphData(
        INT64 a1,
        INT64 a2,
        INT64 a3,
        UINT16 a4,
        INT16 TotalContours,
        INT16 NumberOfInstructions,
        INT64 InstructionOffset,
        INT64 MetricGlyphIndex,
        INT64 GlyphData,
        INT64 Workspace){
  INT64 *v10; 
  __int64 v11; 
  unsigned __int64 Memory; 
  unsigned __int64 v13; 
  _DWORD *v15; 
  __int64 v16; 
  unsigned __int64 v17; 
  __int16 *v18; 
  int v19; 
  int v20; 
  _DWORD *v21; 
  _WORD *v22; 
  UINT8 *v23; 
  UINT8 *v24; 
  UINT8 *v25; 
  __int16 v26; 
  INT64 v27; 
  INT64 v28; 
  unsigned __int16 *v29; 
  unsigned __int16 v30; 
  __int64 v31; 
  UINT64 v32; 
  __int64 v33; 
  __int16 v34; 
  __int16 v35; 
  __int16 v36; 
  unsigned __int16 v37; 
  INT16 v38; 
  INT16 v39; 
  __int64 v40; 
  __int64 v41; 
  __int64 v42; 
  __int16 v43; 
  __int16 v44; 
  _WORD *v45; 
  _DWORD *v46; 
  unsigned __int64 v47; 
  __int16 v51; 
  INT16 TotalContoursa; 
  INT16 NumberOfInstructionsa; 
  v10 = (INT64 *)a2;
  v11 = a4;
  Memory = RaspAllocateMemory(
             a4 + (unsigned __int16)NumberOfInstructions + 8 * (unsigned int)a4 + 2 * (TotalContours + 41),
             (__int64 *)Workspace);
  v13 = Memory;
  if( !Memory )
    return 3221225626i64;
  memset(Memory, 0i64);
  v15 = (_DWORD *)(v13 + 2);
  v16 = 4i64;
  v47 = v13;
  v17 = v13;
  *(_WORD *)v13 = TotalContours;
  v18 = (__int16 *)(a3 + 2);
  do
  {
    v19 = *v18++;
    *v15++ = v19;
    --v16;
  }
  while( v16 );
  v20 = *(_DWORD *)(v13 + 2);
  v21 = (_DWORD *)(v13 + 18);
  *(_WORD *)(v13 + 22) = NumberOfInstructions;
  *(_WORD *)(v13 + 24) = v11;
  v22 = (_WORD *)(v13 + 66);
  v46 = v21;
  *v21 = v20;
  v45 = v22;
  *(_QWORD *)(v17 + 26) = v22;
  v23 = (UINT8 *)&v22[TotalContours];
  if( NumberOfInstructions )
  {
    *(_QWORD *)(v17 + 34) = v23;
    v23 += (unsigned __int16)NumberOfInstructions;
    FioFwReadBytesAtOffset(
      a1,
      (unsigned int)InstructionOffset,
      (unsigned __int16)NumberOfInstructions,
      &v22[TotalContours]);
    v21 = v46;
    v22 = *(_WORD **)(v17 + 26);
    v45 = v22;
  }
  v24 = &v23[v11];
  *(_QWORD *)(v17 + 42) = v23;
  *(_QWORD *)(v17 + 50) = &v23[v11];
  v25 = &v23[4 * (unsigned int)(v11 + 2) + v11];
  NumberOfInstructionsa = 0;
  *(_QWORD *)(v17 + 58) = v25;
  v26 = 0;
  TotalContoursa = 0;
  while( 1 )
  {
    v27 = *v10;
    if( (INT64 *)*v10 == v10 )
      break;
    if( *(INT64 **)(v27 + 8) != v10 || (v28 = *(_QWORD *)v27, *(_QWORD *)(*(_QWORD *)v27 + 8i64) != v27) )
      __fastfail(3u);
    *v10 = v28;
    *(_QWORD *)(v28 + 8) = v10;
    v29 = *(unsigned __int16 **)(v27 + 16);
    if( (*(_WORD *)(v27 + 24) & 0x200) != 0 )
    {
      *(_WORD *)MetricGlyphIndex = *(_WORD *)(v27 + 26);
      *v21 = *(_DWORD *)(v29 + 1);
    }
    v30 = 0;
    if( (__int16)*v29 > 0 )
    {
      do
      {
        v31 = v30++;
        *v22++ = v26 + *(_WORD *)(*(_QWORD *)(v29 + 13) + 2 * v31);
      }
      while( v30 < (__int16)*v29 );
      v45 = v22;
    }
    v32 = v29[12];
    v51 = v32 + v26;
    memmove(v23, *(UINT8 **)(v29 + 21), v32);
    v33 = v29[12];
    v34 = 0x4000;
    v35 = *(_WORD *)(v27 + 24);
    v23 += v33;
    v36 = 0x4000;
    if( (v35 & 8) != 0 )
    {
      v36 = *(_WORD *)(v27 + 32);
      v34 = v36;
    }
    else if( (v35 & 0x40) != 0 )
    {
      v36 = *(_WORD *)(v27 + 32);
      v34 = *(_WORD *)(v27 + 34);
    }
    v37 = 0;
    if( (_WORD)v33 )
    {
      v38 = NumberOfInstructionsa;
      v39 = TotalContoursa;
      v40 = v36;
      v41 = v34;
      do
      {
        *(_WORD *)v24 = *(_WORD *)(*(_QWORD *)(v29 + 25) + 4i64 * v37);
        *(_WORD *)v25 = *(_WORD *)(*(_QWORD *)(v29 + 29) + 4i64 * v37);
        *(_WORD *)v24 = v40 * *(__int16 *)v24 / 0x4000;
        v42 = v41 * *(__int16 *)v25 / 0x4000;
        *(_WORD *)v25 = v42;
        if( !v37 )
        {
          *(_WORD *)v24 -= v38;
          *(_WORD *)v25 -= v39;
          v43 = *(_WORD *)(v27 + 24);
          LOWORD(v42) = *(_WORD *)v25;
          if( (v43 & 2) != 0 )
          {
            if( (v43 & 1) != 0 )
            {
              *(_WORD *)v24 += *(_WORD *)(v27 + 28);
              v44 = *(_WORD *)(v27 + 30);
            }
            else
            {
              *(_WORD *)v24 += *(char *)(v27 + 28);
              v44 = *(char *)(v27 + 29);
            }
            *(_WORD *)v25 += v44;
            LOWORD(v42) = *(_WORD *)v25;
          }
        }
        v38 += *(_WORD *)v24;
        v39 += v42;
        v24 += 4;
        v25 += 4;
        ++v37;
      }
      while( v37 < v29[12] );
      v22 = v45;
      TotalContoursa = v39;
      v10 = (INT64 *)a2;
      NumberOfInstructionsa = v38;
      v17 = v47;
    }
    RaspFreeMemory((INT64)v29, (_QWORD *)Workspace);
    RaspFreeMemory(v27, (_QWORD *)Workspace);
    v26 = v51;
    v21 = v46;
  }
  *(_QWORD *)GlyphData = v17;
  return 0i64;
}

Referenced by:

RaspLoadCompositeGlyphData