RaspCreateSegmentList
__int64 __fastcall RaspCreateSegmentList(
__int64 a1,
__int64 a2,
unsigned int a3,
_GLYPH_SEGMENT **a4,
__int64 a5,
_BG_RASTERIZER_WORKSPACE *Workspace){
unsigned __int16 *v8;
unsigned int v9;
unsigned int v10;
int v11;
unsigned int v12;
int v13;
_BYTE *v14;
unsigned int v15;
unsigned int v16;
_GLYPH_SEGMENT *Memory;
_GLYPH_SEGMENT *v18;
int v19;
_GLYPH_SEGMENT *v20;
unsigned int v21;
unsigned int v22;
unsigned int v23;
unsigned int v24;
unsigned int v25;
int v26;
__int64 v27;
__int64 v28;
__int64 v29;
__int64 v30;
_BYTE *v31;
_BYTE *v32;
_GLYPH_SEGMENT *v33;
__int64 result;
__int64 v35;
__int64 v36;
char v37;
_BYTE *v38;
char v39;
_BYTE *v40;
int v41;
unsigned int v42;
_GLYPH_SEGMENT *SegmentList;
if( a3 < 2 )
return 3221225485i64;
v8 = *(unsigned __int16 **)(a1 + 26);
v9 = a3 - 2;
v10 = 0;
v42 = a3 - 2;
v11 = 0;
v12 = 0;
v13 = 0;
if( a3 == 2 )
goto LABEL_53;
v14 = (_BYTE *)(a2 + 16);
do
{
v15 = v13 + 1;
v16 = v13 + 1;
if( v13 == v8[v11] )
{
if( v11 )
v16 = v8[v11 - 1] + 1;
else
v16 = 0;
++v11;
}
if( (*v14 & 1) != 0 || (*(_BYTE *)(17i64 * v16 + a2 + 16) & 1) == 0 )
++v12;
v14 += 17;
++v13;
}
while( v15 < v9 );
if( !v12 )
{
LABEL_53:
*a4 = 0i64;
result = 0i64;
LABEL_54:
*(_DWORD *)a5 = 0;
return result;
}
Memory = (_GLYPH_SEGMENT *)RaspAllocateMemory(25i64 * v12, Workspace);
SegmentList = Memory;
v18 = Memory;
if( !Memory )
{
result = 3221225626i64;
goto LABEL_54;
}
memset(Memory, 0i64, 25 * v12);
v19 = 0;
v20 = v18 + 4;
v21 = 0;
while( 1 )
{
v22 = v21 + 1;
v23 = v21 + 1;
v24 = v21 - 1;
v25 = v21 + 2;
if( v21 )
{
if( v19 && v21 == v8[v19 - 1] + 1 )
v24 = v8[v19];
}
else
{
v24 = *v8;
}
v26 = v8[v19];
if( v21 == v26 - 1 )
{
if( v19 )
v25 = v8[v19 - 1] + 1;
else
v25 = 0;
}
if( v21 == v26 )
{
if( v19 )
{
v41 = v8[v19 - 1];
v23 = v41 + 1;
v25 = v41 + 2;
}
else
{
v23 = 0;
v25 = 1;
}
++v19;
}
v27 = a2 + 17i64 * v21;
if( (*(_BYTE *)(v27 + 16) & 1) != 0 )
{
v35 = a2 + 17i64 * v23;
if( (*(_BYTE *)(v35 + 16) & 1) != 0 )
{
*((_QWORD *)v20 - 2) = v27;
*((_QWORD *)v20 - 1) = v35;
*(_QWORD *)v20 = v35;
*((_BYTE *)v20 + 8) = 1;
}
else
{
v36 = a2 + 17i64 * v25;
v37 = *(_BYTE *)(v36 + 16);
*((_QWORD *)v20 - 2) = v27;
*((_QWORD *)v20 - 1) = v35;
if( (v37 & 1) != 0 )
{
*(_QWORD *)v20 = v36;
v39 = 2;
}
else
{
v38 = RaspInterpolatePoint(v35, v36, Workspace);
*(_QWORD *)v20 = v38;
if( !v38 )
break;
v22 = v21 + 1;
v39 = 4;
}
*((_BYTE *)v20 + 8) = v39;
if( v23 > v21 )
{
v21 = v22;
if( v22 == v8[v19] )
++v19;
}
}
goto LABEL_24;
}
if( !v21 && (*(_BYTE *)(17i64 * v24 + a2 + 16) & 1) != 0
|| v19 && v21 == v8[v19 - 1] + 1 && (*(_BYTE *)(17i64 * v24 + a2 + 16) & 1) != 0 )
{
goto LABEL_25;
}
v28 = a2 + 17i64 * v21;
v29 = a2 + 17i64 * v24;
v30 = a2 + 17i64 * v23;
if( (*(_BYTE *)(v30 + 16) & 1) != 0 )
{
v40 = RaspInterpolatePoint(v29, v28, Workspace);
*((_QWORD *)v20 - 2) = v40;
if( !v40 )
break;
*((_QWORD *)v20 - 1) = v27;
*(_QWORD *)v20 = v30;
*((_BYTE *)v20 + 8) = 3;
goto LABEL_24;
}
v31 = RaspInterpolatePoint(v29, v28, Workspace);
*((_QWORD *)v20 - 2) = v31;
if( !v31 )
break;
*((_QWORD *)v20 - 1) = v27;
v32 = RaspInterpolatePoint(v27, v30, Workspace);
*(_QWORD *)v20 = v32;
if( !v32 )
break;
*((_BYTE *)v20 + 8) = 5;
LABEL_24:
v20 = (_GLYPH_SEGMENT *)((char *)v20 + 25);
LABEL_25:
if( ++v21 >= v42 )
{
v33 = SegmentList;
goto LABEL_27;
}
}
RaspDestroySegmentList(SegmentList, v12, Workspace);
v33 = 0i64;
v12 = 0;
v10 = -1073741670;
LABEL_27:
*(_DWORD *)a5 = v12;
*a4 = v33;
return v10;
}Referenced by:
RaspScanConvert