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