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