// File: hzeller[P]gcode-multi-shell-extrude/third_party/clipper.cpp
// Function: ClipperLib::Clipper::BuildIntersectList(long long, long long)
void Clipper::BuildIntersectList(const cInt botY, const cInt topY)
{
  if ( !m_ActiveEdges ) return;

  //prepare for sorting ...
  TEdge* e = m_ActiveEdges;
  m_SortedEdges = e;
  while( e )
  {
    e->PrevInSEL = e->PrevInAEL;
    e->NextInSEL = e->NextInAEL;
    e->Curr.X = TopX( *e, topY );
    e = e->NextInAEL;
  }

  //bubblesort ...
  bool isModified;
  do
  {
    isModified = false;
    e = m_SortedEdges;
    while( e->NextInSEL )
    {
      TEdge *eNext = e->NextInSEL;
      IntPoint Pt;
      if(e->Curr.X > eNext->Curr.X)
      {
        if (!IntersectPoint(*e, *eNext, Pt, m_UseFullRange) && e->Curr.X > eNext->Curr.X +1)
          throw clipperException("Intersection error");
        if (Pt.Y > botY)
        {
            Pt.Y = botY;
            if (std::fabs(e->Dx) > std::fabs(eNext->Dx))
              Pt.X = TopX(*eNext, botY); else
              Pt.X = TopX(*e, botY);
        }

        IntersectNode * newNode = new IntersectNode;
        newNode->Edge1 = e;
        newNode->Edge2 = eNext;
        newNode->Pt = Pt;
        m_IntersectList.push_back(newNode);

        SwapPositionsInSEL(e, eNext);
        isModified = true;
      }
      else
        e = eNext;
    }
    if( e->PrevInSEL ) e->PrevInSEL->NextInSEL = 0;
    else break;
  }
  while ( isModified );
  m_SortedEdges = 0; //important
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x60(%rbp)
cmpq $0x0, 0xa0(%rax)
jne 0x19cbb
jmp 0x19f64
movq -0x60(%rbp), %rax
movq 0xa0(%rax), %rcx
movq %rcx, -0x20(%rbp)
movq -0x20(%rbp), %rcx
movq %rcx, 0xa8(%rax)
cmpq $0x0, -0x20(%rbp)
je 0x19d2b
movq -0x20(%rbp), %rax
movq 0x80(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x90(%rax)
movq -0x20(%rbp), %rax
movq 0x78(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x88(%rax)
movq -0x20(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x20580
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x20(%rbp), %rax
movq 0x78(%rax), %rax
movq %rax, -0x20(%rbp)
jmp 0x19cd5
jmp 0x19d2d
movq -0x60(%rbp), %rax
movb $0x0, -0x21(%rbp)
movq 0xa8(%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
cmpq $0x0, 0x88(%rax)
je 0x19f21
movq -0x20(%rbp), %rax
movq 0x88(%rax), %rax
movq %rax, -0x30(%rbp)
leaq -0x40(%rbp), %rdi
xorl %eax, %eax
movl %eax, %edx
movq %rdx, %rsi
callq 0xcae0
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x30(%rbp), %rcx
cmpq 0x10(%rcx), %rax
jle 0x19f14
movq -0x60(%rbp), %rax
movq -0x20(%rbp), %rdi
movq -0x30(%rbp), %rsi
movq (%rax), %rcx
movq -0x18(%rcx), %rcx
movb 0x18(%rax,%rcx), %al
leaq -0x40(%rbp), %rdx
andb $0x1, %al
movzbl %al, %ecx
callq 0x11af0
testb $0x1, %al
jne 0x19e1c
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x30(%rbp), %rcx
movq 0x10(%rcx), %rcx
addq $0x1, %rcx
cmpq %rcx, %rax
jle 0x19e1c
movl $0x28, %edi
callq 0x3110
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x68(%rbp)
leaq 0x12a24(%rip), %rsi     # 0x2c808
callq 0x20830
jmp 0x19deb
movq -0x68(%rbp), %rdi
leaq 0x20f6a(%rip), %rsi     # 0x3ad60
leaq 0x6ad3(%rip), %rdx      # 0x208d0
callq 0x3430
movq -0x68(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
callq 0x31c0
jmp 0x19f6a
movq -0x38(%rbp), %rax
cmpq -0x10(%rbp), %rax
jle 0x19e82
movq -0x10(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x20(%rbp), %rax
movsd 0x40(%rax), %xmm0
movaps 0x12072(%rip), %xmm1    # 0x2beb0
pand %xmm1, %xmm0
movq -0x30(%rbp), %rax
movsd 0x40(%rax), %xmm1
movaps 0x1205e(%rip), %xmm2    # 0x2beb0
pand %xmm2, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x19e6f
movq -0x30(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x20580
movq %rax, -0x40(%rbp)
jmp 0x19e80
movq -0x20(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x20580
movq %rax, -0x40(%rbp)
jmp 0x19e82
movl $0x20, %edi
callq 0x3280
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x70(%rbp)
callq 0x21190
jmp 0x19e9d
movq -0x60(%rbp), %rdi
movq -0x70(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x20(%rbp), %rcx
movq -0x58(%rbp), %rax
movq %rcx, (%rax)
movq -0x30(%rbp), %rcx
movq -0x58(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x58(%rbp), %rax
movq -0x40(%rbp), %rcx
movq %rcx, 0x10(%rax)
movq -0x38(%rbp), %rcx
movq %rcx, 0x18(%rax)
addq $0x50, %rdi
leaq -0x58(%rbp), %rsi
callq 0x211c0
movq -0x60(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq -0x30(%rbp), %rdx
callq 0x19630
movb $0x1, -0x21(%rbp)
jmp 0x19f1c
movq -0x70(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
movl $0x20, %esi
callq 0x3290
jmp 0x19f6a
movq -0x30(%rbp), %rax
movq %rax, -0x20(%rbp)
jmp 0x19d40
movq -0x20(%rbp), %rax
cmpq $0x0, 0x90(%rax)
je 0x19f47
movq -0x20(%rbp), %rax
movq 0x90(%rax), %rax
movq $0x0, 0x88(%rax)
jmp 0x19f49
jmp 0x19f55
jmp 0x19f4b
testb $0x1, -0x21(%rbp)
jne 0x19d2d
movq -0x60(%rbp), %rax
movq $0x0, 0xa8(%rax)
addq $0x70, %rsp
popq %rbp
retq
movq -0x48(%rbp), %rdi
callq 0x3440
nopw %cs:(%rax,%rax)