RaspGetCompositeGlyphList

__int64 __fastcall RaspGetCompositeGlyphList(
        __int64 a1,
        int a2,
        _WORD *a3,
        _WORD *a4,
        UINT16 *a5,
        __int64 a6,
        __int64 a7,
        _BG_RASTERIZER_WORKSPACE *Workspace){
  int v9; 
  int v10; 
  _FILE_IMAGE *v11; 
  _QWORD *v12; 
  unsigned int v13; 
  _BG_RASTERIZER_WORKSPACE *i; 
  _OWORD *Memory; 
  _OWORD *v16; 
  _QWORD *v17; 
  UINT16 v18; 
  unsigned int v19; 
  char v20; 
  NTSTATUS v21; 
  _WORD *v22; 
  _GLYPH_DATA *v23; 
  _QWORD *v25; 
  __int64 v26; 
  UINT16 v27[2]; 
  UINT16 v28[2]; 
  UINT16 Buffer[2]; 
  UINT16 v30; 
  int v31; 
  _GLYPH_DATA *v32; 
  UINT16 v33; 
  _WORD *v34; 
  _WORD *v35; 

  v35 = a4;
  v34 = a3;
  v27[0] = 0;
  v30 = 0;
  v28[0] = 0;
  *(_DWORD *)a6 = 0;
  v31 = 0;
  v33 = 0;
  v32 = 0i64;
  *a5 = 0;
  *a4 = 0;
  *a3 = 0;
  if( a2 == -1 )
    return 3221225485i64;
  if( !a1 )
    return 3221225473i64;
  v9 = *(_DWORD *)(a1 + 60);
  if( !v9 )
    return 3221225473i64;
  v10 = v9 + a2;
  Buffer[0] = 0;
  v11 = *(_FILE_IMAGE **)(*(_QWORD *)(a1 + 16) + 16i64);
  FioFwReadUshortAtOffset(v11, (unsigned int)(v9 + a2), Buffer);
  if( (Buffer[0] & 0x8000u) == 0 )
    return 3221225485i64;
  v12 = (_QWORD *)a7;
  v13 = v10 + 10;
  *(_DWORD *)Buffer = v13;
  *(_QWORD *)(a7 + 8) = a7;
  *v12 = v12;
  while( 1 )
  {
    i = Workspace;
    Memory = RaspAllocateMemory(0x2Aui64, Workspace);
    v16 = Memory;
    if( !Memory )
    {
      v21 = -1073741670;
      break;
    }
    *Memory = 0i64;
    Memory[1] = 0i64;
    *((_QWORD *)Memory + 4) = 0i64;
    *((_WORD *)Memory + 20) = 0;
    v17 = (_QWORD *)v12[1];
    if( (_QWORD *)*v17 != v12 )
LABEL_31:
      __fastfail(3u);
    *(_QWORD *)v16 = v12;
    *((_QWORD *)v16 + 1) = v17;
    *v17 = v16;
    v12[1] = v16;
    FioFwReadUshortAtOffset(v11, v13, &v30);
    v18 = v30;
    v19 = v13 + 2;
    *((_WORD *)v16 + 12) = v30;
    FioFwReadUshortAtOffset(v11, v19, v28);
    *((_WORD *)v16 + 13) = v28[0];
    FioFwReadUshortAtOffset(v11, v19 + 2, v27);
    if( (v18 & 1) != 0 )
    {
      *((_WORD *)v16 + 14) = v27[0];
      FioFwReadUshortAtOffset(v11, v19 + 4, v27);
      v13 = v19 + 6;
      *((_WORD *)v16 + 15) = v27[0];
    }
    else
    {
      v13 = v19 + 4;
      v20 = HIBYTE(v27[0]);
      *((_BYTE *)v16 + 29) = v27[0];
      *((_BYTE *)v16 + 28) = v20;
    }
    if( (v18 & 8) == 0 )
    {
      if( (v18 & 0x40) != 0 )
      {
        FioFwReadUshortAtOffset(v11, v13, &v33);
        *((_WORD *)v16 + 16) = v33;
        FioFwReadUshortAtOffset(v11, v13 + 2, &v33);
        *((_WORD *)v16 + 17) = v33;
      }
      else
      {
        if( (v18 & 0x80u) == 0 )
          goto LABEL_18;
        FioFwReadUshortAtOffset(v11, v13, &v33);
        *((_WORD *)v16 + 16) = v33;
        FioFwReadUshortAtOffset(v11, v13 + 2, &v33);
        v13 += 4;
        *((_WORD *)v16 + 17) = v33;
        FioFwReadUshortAtOffset(v11, v13, &v33);
        *((_WORD *)v16 + 18) = v33;
        FioFwReadUshortAtOffset(v11, v13 + 2, &v33);
        *(_DWORD *)((char *)v16 + 38) = (__int16)v33;
      }
      v13 += 4;
      goto LABEL_18;
    }
    FioFwReadUshortAtOffset(v11, v13, &v33);
    v13 += 2;
    *((_WORD *)v16 + 16) = v33;
LABEL_18:
    v21 = RaspMapGlyphIndexToLocation(a1, v28[0], &v31);
    if( v21 < 0 )
      break;
    v21 = RaspLoadGlyphData(a1, v31, (__int64)v28, &v32, Workspace);
    if( v21 < 0 )
      break;
    v22 = v34;
    *((_QWORD *)v16 + 2) = v32;
    v23 = v32;
    *v22 += *((_WORD *)v32 + 12);
    *v35 += *(_WORD *)v23;
    if( (v18 & 0x20) == 0 )
    {
      if( (v18 & 0x100) != 0 )
      {
        FioFwReadUshortAtOffset(v11, v13, a5);
        v13 += 2;
      }
      *(_DWORD *)a6 = v13 - *(_DWORD *)Buffer;
      return(unsigned int)v21;
    }
  }
  for( i = Workspace; ; RaspFreeMemory(v25, i) )
  {
    v25 = (_QWORD *)*v12;
    if( (_QWORD *)*v12 == v12 )
      break;
    if( (_QWORD *)v25[1] != v12 )
      goto LABEL_31;
    v26 = *v25;
    if( *(_QWORD **)(*v25 + 8i64) != v25 )
      goto LABEL_31;
    *v12 = v26;
    *(_QWORD *)(v26 + 8) = v12;
    RaspFreeMemory((VOID *)v25[2], i);
  }
  return(unsigned int)v21;
}

Referenced by:

RaspLoadCompositeGlyphData