RaspGetCompositeGlyphList

INT64 __fastcall RaspGetCompositeGlyphList(
        INT64 a1,
        INT64 a2,
        _WORD *a3,
        _WORD *a4,
        INT64 NumberOfInstructions,
        INT64 GlyphTableSize){
  int v7; 
  int v8; 
  INT64 v9; 
  _QWORD *v10; 
  unsigned int v11; 
  _QWORD *i; 
  unsigned __int64 Memory; 
  unsigned __int64 v14; 
  unsigned __int64 *v15; 
  __int16 v16; 
  unsigned int v17; 
  char v18; 
  int GlyphData; 
  _WORD *v20; 
  _WORD *v21; 
  _QWORD *v23; 
  __int64 v24; 
  _WORD v25[2]; 
  _WORD v26[2]; 
  unsigned int v27; 
  __int16 v28; 
  INT64 v29; 
  INT64 v30; 
  __int16 v31; 
  _WORD *v32; 
  _WORD *v33; 
  _QWORD *v34; 
  INT64 Workspace; 
  v33 = a4;
  v32 = a3;
  v25[0] = 0;
  v28 = 0;
  v26[0] = 0;
  *(_DWORD *)GlyphTableSize = 0;
  LODWORD(v29) = 0;
  v31 = 0;
  v30 = 0i64;
  *(_WORD *)NumberOfInstructions = 0;
  *a4 = 0;
  *a3 = 0;
  if( (_DWORD)a2 == -1 )
    return 3221225485i64;
  if( !a1 )
    return 3221225473i64;
  v7 = *(_DWORD *)(a1 + 60);
  if( !v7 )
    return 3221225473i64;
  v8 = v7 + a2;
  LOWORD(v27) = 0;
  v9 = *(_QWORD *)(*(_QWORD *)(a1 + 16) + 16i64);
  FioFwReadUshortAtOffset(v9, (unsigned int)(v7 + a2), &v27);
  if( (v27 & 0x8000u) == 0 )
    return 3221225485i64;
  v10 = v34;
  v11 = v8 + 10;
  v27 = v11;
  v34[1] = v34;
  *v10 = v10;
  while( 1 )
  {
    i = (_QWORD *)Workspace;
    Memory = RaspAllocateMemory(0x2Aui64, (__int64 *)Workspace);
    v14 = Memory;
    if( !Memory )
    {
      GlyphData = -1073741670;
      break;
    }
    *(_OWORD *)Memory = 0i64;
    *(_OWORD *)(Memory + 16) = 0i64;
    *(_QWORD *)(Memory + 32) = 0i64;
    *(_WORD *)(Memory + 40) = 0;
    v15 = (unsigned __int64 *)v10[1];
    if( (_QWORD *)*v15 != v10 )
LABEL_31:
      __fastfail(3u);
    *(_QWORD *)v14 = v10;
    *(_QWORD *)(v14 + 8) = v15;
    *v15 = v14;
    v10[1] = v14;
    FioFwReadUshortAtOffset(v9, v11, &v28);
    v16 = v28;
    v17 = v11 + 2;
    *(_WORD *)(v14 + 24) = v28;
    FioFwReadUshortAtOffset(v9, v17, v26);
    *(_WORD *)(v14 + 26) = v26[0];
    FioFwReadUshortAtOffset(v9, v17 + 2, v25);
    if( (v16 & 1) != 0 )
    {
      *(_WORD *)(v14 + 28) = v25[0];
      FioFwReadUshortAtOffset(v9, v17 + 4, v25);
      v11 = v17 + 6;
      *(_WORD *)(v14 + 30) = v25[0];
    }
    else
    {
      v11 = v17 + 4;
      v18 = HIBYTE(v25[0]);
      *(_BYTE *)(v14 + 29) = v25[0];
      *(_BYTE *)(v14 + 28) = v18;
    }
    if( (v16 & 8) == 0 )
    {
      if( (v16 & 0x40) != 0 )
      {
        FioFwReadUshortAtOffset(v9, v11, &v31);
        *(_WORD *)(v14 + 32) = v31;
        FioFwReadUshortAtOffset(v9, v11 + 2, &v31);
        *(_WORD *)(v14 + 34) = v31;
      }
      else
      {
        if( (v16 & 0x80u) == 0 )
          goto LABEL_18;
        FioFwReadUshortAtOffset(v9, v11, &v31);
        *(_WORD *)(v14 + 32) = v31;
        FioFwReadUshortAtOffset(v9, v11 + 2, &v31);
        v11 += 4;
        *(_WORD *)(v14 + 34) = v31;
        FioFwReadUshortAtOffset(v9, v11, &v31);
        *(_WORD *)(v14 + 36) = v31;
        FioFwReadUshortAtOffset(v9, v11 + 2, &v31);
        *(_DWORD *)(v14 + 38) = v31;
      }
      v11 += 4;
      goto LABEL_18;
    }
    FioFwReadUshortAtOffset(v9, v11, &v31);
    v11 += 2;
    *(_WORD *)(v14 + 32) = v31;
LABEL_18:
    GlyphData = RaspMapGlyphIndexToLocation(a1, v26[0], &v29);
    if( GlyphData < 0 )
      break;
    GlyphData = RaspLoadGlyphData(a1, (unsigned int)v29, (INT64)v26, (INT64)&v30, Workspace);
    if( GlyphData < 0 )
      break;
    v20 = v32;
    *(_QWORD *)(v14 + 16) = v30;
    v21 = (_WORD *)v30;
    *v20 += *(_WORD *)(v30 + 24);
    *v33 += *v21;
    if( (v16 & 0x20) == 0 )
    {
      if( (v16 & 0x100) != 0 )
      {
        FioFwReadUshortAtOffset(v9, v11, (_WORD *)NumberOfInstructions);
        v11 += 2;
      }
      *(_DWORD *)GlyphTableSize = v11 - v27;
      return(unsigned int)GlyphData;
    }
  }
  for( i = (_QWORD *)Workspace; ; RaspFreeMemory((INT64)v23, i) )
  {
    v23 = (_QWORD *)*v10;
    if( (_QWORD *)*v10 == v10 )
      break;
    if( (_QWORD *)v23[1] != v10 )
      goto LABEL_31;
    v24 = *v23;
    if( *(_QWORD **)(*v23 + 8i64) != v23 )
      goto LABEL_31;
    *v10 = v24;
    *(_QWORD *)(v24 + 8) = v10;
    RaspFreeMemory(v23[2], i);
  }
  return(unsigned int)GlyphData;
}

Referenced by:

RaspLoadCompositeGlyphData