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