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