// File: hzeller[P]gcode-multi-shell-extrude/third_party/clipper.cpp
// Function: ClipperLib::ClipperBase::ProcessBound(ClipperLib::TEdge*, bool)
TEdge* ClipperBase::ProcessBound(TEdge* E, bool IsClockwise)
{
  TEdge *EStart = E, *Result = E;
  TEdge *Horz = 0;
  cInt StartX;
  if (IsHorizontal(*E))
  {
    //it's possible for adjacent overlapping horz edges to start heading left
    //before finishing right, so ...
    if (IsClockwise) StartX = E->Prev->Bot.X;
    else StartX = E->Next->Bot.X;
    if (E->Bot.X != StartX) ReverseHorizontal(*E);
  }
  
  if (Result->OutIdx != Skip)
  {
    if (IsClockwise)
    {
      while (Result->Top.Y == Result->Next->Bot.Y && Result->Next->OutIdx != Skip)
        Result = Result->Next;
      if (IsHorizontal(*Result) && Result->Next->OutIdx != Skip)
      {
        //nb: at the top of a bound, horizontals are added to the bound
        //only when the preceding edge attaches to the horizontal's left vertex
        //unless a Skip edge is encountered when that becomes the top divide
        Horz = Result;
        while (IsHorizontal(*Horz->Prev)) Horz = Horz->Prev;
        if (Horz->Prev->Top.X == Result->Next->Top.X) 
        {
          if (!IsClockwise) Result = Horz->Prev;
        }
        else if (Horz->Prev->Top.X > Result->Next->Top.X) Result = Horz->Prev;
      }
      while (E != Result) 
      {
        E->NextInLML = E->Next;
        if (IsHorizontal(*E) && E != EStart &&
          E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E);
        E = E->Next;
      }
      if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Prev->Top.X) 
        ReverseHorizontal(*E);
      Result = Result->Next; //move to the edge just beyond current bound
    } else
    {
      while (Result->Top.Y == Result->Prev->Bot.Y && Result->Prev->OutIdx != Skip) 
        Result = Result->Prev;
      if (IsHorizontal(*Result) && Result->Prev->OutIdx != Skip)
      {
        Horz = Result;
        while (IsHorizontal(*Horz->Next)) Horz = Horz->Next;
        if (Horz->Next->Top.X == Result->Prev->Top.X) 
        {
          if (!IsClockwise) Result = Horz->Next;
        }
        else if (Horz->Next->Top.X > Result->Prev->Top.X) Result = Horz->Next;
      }

      while (E != Result)
      {
        E->NextInLML = E->Prev;
        if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X) 
          ReverseHorizontal(*E);
        E = E->Prev;
      }
      if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X) 
        ReverseHorizontal(*E);
      Result = Result->Prev; //move to the edge just beyond current bound
    }
  }

  if (Result->OutIdx == Skip) 
  {
    //if edges still remain in the current bound beyond the skip edge then
    //create another LocMin and call ProcessBound once more
    E = Result;
    if (IsClockwise)
    {
      while (E->Top.Y == E->Next->Bot.Y) E = E->Next;
      //don't include top horizontals when parsing a bound a second time,
      //they will be contained in the opposite bound ...
      while (E != Result && IsHorizontal(*E)) E = E->Prev;
    } else
    {
      while (E->Top.Y == E->Prev->Bot.Y) E = E->Prev;
      while (E != Result && IsHorizontal(*E)) E = E->Next;
    }
    if (E == Result)
    {
      if (IsClockwise) Result = E->Next;
      else Result = E->Prev;
    } else
    {
      //there are more edges in the bound beyond result starting with E
      if (IsClockwise)
        E = Result->Next; 
      else
        E = Result->Prev;
      LocalMinima* locMin = new LocalMinima;
      locMin->Next = 0;
      locMin->Y = E->Bot.Y;
      locMin->LeftBound = 0;
      locMin->RightBound = E;
      locMin->RightBound->WindDelta = 0;
      Result = ProcessBound(locMin->RightBound, IsClockwise);
      InsertLocalMinima(locMin);
    }
  }
  return Result;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movb %dl, %al
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
andb $0x1, %al
movb %al, -0x11(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x28(%rbp)
movq $0x0, -0x30(%rbp)
movq -0x10(%rbp), %rdi
callq 0x20510
testb $0x1, %al
jne 0x13076
jmp 0x130b4
testb $0x1, -0x11(%rbp)
je 0x1308d
movq -0x10(%rbp), %rax
movq 0x68(%rax), %rax
movq (%rax), %rax
movq %rax, -0x38(%rbp)
jmp 0x1309c
movq -0x10(%rbp), %rax
movq 0x60(%rax), %rax
movq (%rax), %rax
movq %rax, -0x38(%rbp)
movq -0x10(%rbp), %rax
movq (%rax), %rax
cmpq -0x38(%rbp), %rax
je 0x130b2
movq -0x10(%rbp), %rdi
callq 0x20800
jmp 0x130b4
movq -0x28(%rbp), %rax
cmpl $-0x2, 0x5c(%rax)
je 0x133f1
testb $0x1, -0x11(%rbp)
je 0x13260
jmp 0x130ce
movq -0x28(%rbp), %rax
movq 0x28(%rax), %rcx
movq -0x28(%rbp), %rax
movq 0x60(%rax), %rdx
xorl %eax, %eax
cmpq 0x8(%rdx), %rcx
movb %al, -0x49(%rbp)
jne 0x130fb
movq -0x28(%rbp), %rax
movq 0x60(%rax), %rax
cmpl $-0x2, 0x5c(%rax)
setne %al
movb %al, -0x49(%rbp)
movb -0x49(%rbp), %al
testb $0x1, %al
jne 0x13104
jmp 0x13112
movq -0x28(%rbp), %rax
movq 0x60(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x130ce
movq -0x28(%rbp), %rdi
callq 0x20510
testb $0x1, %al
jne 0x13124
jmp 0x131b7
movq -0x28(%rbp), %rax
movq 0x60(%rax), %rax
cmpl $-0x2, 0x5c(%rax)
je 0x131b7
movq -0x28(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
movq 0x68(%rax), %rdi
callq 0x20510
testb $0x1, %al
jne 0x13151
jmp 0x1315f
movq -0x30(%rbp), %rax
movq 0x68(%rax), %rax
movq %rax, -0x30(%rbp)
jmp 0x1313e
movq -0x30(%rbp), %rax
movq 0x68(%rax), %rax
movq 0x20(%rax), %rax
movq -0x28(%rbp), %rcx
movq 0x60(%rcx), %rcx
cmpq 0x20(%rcx), %rax
jne 0x1318d
testb $0x1, -0x11(%rbp)
jne 0x1318b
movq -0x30(%rbp), %rax
movq 0x68(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x131b5
movq -0x30(%rbp), %rax
movq 0x68(%rax), %rax
movq 0x20(%rax), %rax
movq -0x28(%rbp), %rcx
movq 0x60(%rcx), %rcx
cmpq 0x20(%rcx), %rax
jle 0x131b3
movq -0x30(%rbp), %rax
movq 0x68(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x131b5
jmp 0x131b7
jmp 0x131b9
movq -0x10(%rbp), %rax
cmpq -0x28(%rbp), %rax
je 0x13218
movq -0x10(%rbp), %rax
movq 0x60(%rax), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x70(%rax)
movq -0x10(%rbp), %rdi
callq 0x20510
testb $0x1, %al
jne 0x131e2
jmp 0x1320a
movq -0x10(%rbp), %rax
cmpq -0x20(%rbp), %rax
je 0x1320a
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq -0x10(%rbp), %rcx
movq 0x68(%rcx), %rcx
cmpq 0x20(%rcx), %rax
je 0x1320a
movq -0x10(%rbp), %rdi
callq 0x20800
movq -0x10(%rbp), %rax
movq 0x60(%rax), %rax
movq %rax, -0x10(%rbp)
jmp 0x131b9
movq -0x10(%rbp), %rdi
callq 0x20510
testb $0x1, %al
jne 0x13227
jmp 0x1324f
movq -0x10(%rbp), %rax
cmpq -0x20(%rbp), %rax
je 0x1324f
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq -0x10(%rbp), %rcx
movq 0x68(%rcx), %rcx
cmpq 0x20(%rcx), %rax
je 0x1324f
movq -0x10(%rbp), %rdi
callq 0x20800
movq -0x28(%rbp), %rax
movq 0x60(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x133ef
jmp 0x13262
movq -0x28(%rbp), %rax
movq 0x28(%rax), %rcx
movq -0x28(%rbp), %rax
movq 0x68(%rax), %rdx
xorl %eax, %eax
cmpq 0x8(%rdx), %rcx
movb %al, -0x4a(%rbp)
jne 0x1328f
movq -0x28(%rbp), %rax
movq 0x68(%rax), %rax
cmpl $-0x2, 0x5c(%rax)
setne %al
movb %al, -0x4a(%rbp)
movb -0x4a(%rbp), %al
testb $0x1, %al
jne 0x13298
jmp 0x132a6
movq -0x28(%rbp), %rax
movq 0x68(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x13262
movq -0x28(%rbp), %rdi
callq 0x20510
testb $0x1, %al
jne 0x132b8
jmp 0x1334b
movq -0x28(%rbp), %rax
movq 0x68(%rax), %rax
cmpl $-0x2, 0x5c(%rax)
je 0x1334b
movq -0x28(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
movq 0x60(%rax), %rdi
callq 0x20510
testb $0x1, %al
jne 0x132e5
jmp 0x132f3
movq -0x30(%rbp), %rax
movq 0x60(%rax), %rax
movq %rax, -0x30(%rbp)
jmp 0x132d2
movq -0x30(%rbp), %rax
movq 0x60(%rax), %rax
movq 0x20(%rax), %rax
movq -0x28(%rbp), %rcx
movq 0x68(%rcx), %rcx
cmpq 0x20(%rcx), %rax
jne 0x13321
testb $0x1, -0x11(%rbp)
jne 0x1331f
movq -0x30(%rbp), %rax
movq 0x60(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x13349
movq -0x30(%rbp), %rax
movq 0x60(%rax), %rax
movq 0x20(%rax), %rax
movq -0x28(%rbp), %rcx
movq 0x68(%rcx), %rcx
cmpq 0x20(%rcx), %rax
jle 0x13347
movq -0x30(%rbp), %rax
movq 0x60(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x13349
jmp 0x1334b
jmp 0x1334d
movq -0x10(%rbp), %rax
cmpq -0x28(%rbp), %rax
je 0x133ac
movq -0x10(%rbp), %rax
movq 0x68(%rax), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x70(%rax)
movq -0x10(%rbp), %rdi
callq 0x20510
testb $0x1, %al
jne 0x13376
jmp 0x1339e
movq -0x10(%rbp), %rax
cmpq -0x20(%rbp), %rax
je 0x1339e
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq -0x10(%rbp), %rcx
movq 0x60(%rcx), %rcx
cmpq 0x20(%rcx), %rax
je 0x1339e
movq -0x10(%rbp), %rdi
callq 0x20800
movq -0x10(%rbp), %rax
movq 0x68(%rax), %rax
movq %rax, -0x10(%rbp)
jmp 0x1334d
movq -0x10(%rbp), %rdi
callq 0x20510
testb $0x1, %al
jne 0x133bb
jmp 0x133e3
movq -0x10(%rbp), %rax
cmpq -0x20(%rbp), %rax
je 0x133e3
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq -0x10(%rbp), %rcx
movq 0x60(%rcx), %rcx
cmpq 0x20(%rcx), %rax
je 0x133e3
movq -0x10(%rbp), %rdi
callq 0x20800
movq -0x28(%rbp), %rax
movq 0x68(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x133f1
movq -0x28(%rbp), %rax
cmpl $-0x2, 0x5c(%rax)
jne 0x13590
movq -0x28(%rbp), %rax
movq %rax, -0x10(%rbp)
testb $0x1, -0x11(%rbp)
je 0x13469
jmp 0x1340f
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x10(%rbp), %rcx
movq 0x60(%rcx), %rcx
cmpq 0x8(%rcx), %rax
jne 0x13433
movq -0x10(%rbp), %rax
movq 0x60(%rax), %rax
movq %rax, -0x10(%rbp)
jmp 0x1340f
jmp 0x13435
movq -0x10(%rbp), %rcx
xorl %eax, %eax
cmpq -0x28(%rbp), %rcx
movb %al, -0x4b(%rbp)
je 0x13450
movq -0x10(%rbp), %rdi
callq 0x20510
movb %al, -0x4b(%rbp)
movb -0x4b(%rbp), %al
testb $0x1, %al
jne 0x13459
jmp 0x13467
movq -0x10(%rbp), %rax
movq 0x68(%rax), %rax
movq %rax, -0x10(%rbp)
jmp 0x13435
jmp 0x134c5
jmp 0x1346b
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x10(%rbp), %rcx
movq 0x68(%rcx), %rcx
cmpq 0x8(%rcx), %rax
jne 0x1348f
movq -0x10(%rbp), %rax
movq 0x68(%rax), %rax
movq %rax, -0x10(%rbp)
jmp 0x1346b
jmp 0x13491
movq -0x10(%rbp), %rcx
xorl %eax, %eax
cmpq -0x28(%rbp), %rcx
movb %al, -0x4c(%rbp)
je 0x134ac
movq -0x10(%rbp), %rdi
callq 0x20510
movb %al, -0x4c(%rbp)
movb -0x4c(%rbp), %al
testb $0x1, %al
jne 0x134b5
jmp 0x134c3
movq -0x10(%rbp), %rax
movq 0x60(%rax), %rax
movq %rax, -0x10(%rbp)
jmp 0x13491
jmp 0x134c5
movq -0x10(%rbp), %rax
cmpq -0x28(%rbp), %rax
jne 0x134f4
testb $0x1, -0x11(%rbp)
je 0x134e3
movq -0x10(%rbp), %rax
movq 0x60(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x134ef
movq -0x10(%rbp), %rax
movq 0x68(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x1358e
testb $0x1, -0x11(%rbp)
je 0x13508
movq -0x28(%rbp), %rax
movq 0x60(%rax), %rax
movq %rax, -0x10(%rbp)
jmp 0x13514
movq -0x28(%rbp), %rax
movq 0x68(%rax), %rax
movq %rax, -0x10(%rbp)
movl $0x20, %edi
callq 0x3280
movq -0x48(%rbp), %rdi
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rax
movq $0x0, 0x18(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x40(%rbp), %rax
movq %rcx, (%rax)
movq -0x40(%rbp), %rax
movq $0x0, 0x8(%rax)
movq -0x10(%rbp), %rcx
movq -0x40(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
movl $0x0, 0x50(%rax)
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rsi
movb -0x11(%rbp), %al
andb $0x1, %al
movzbl %al, %edx
callq 0x13030
movq -0x48(%rbp), %rdi
movq %rax, -0x28(%rbp)
movq -0x40(%rbp), %rsi
callq 0x135a0
jmp 0x13590
movq -0x28(%rbp), %rax
addq $0x50, %rsp
popq %rbp
retq
nopw (%rax,%rax)