// File: hzeller[P]gcode-multi-shell-extrude/third_party/clipper.cpp
// Function: ClipperLib::Clipper::IsContributing(ClipperLib::TEdge const&) const
bool Clipper::IsContributing(const TEdge& edge) const
{
  PolyFillType pft, pft2;
  if (edge.PolyTyp == ptSubject)
  {
    pft = m_SubjFillType;
    pft2 = m_ClipFillType;
  } else
  {
    pft = m_ClipFillType;
    pft2 = m_SubjFillType;
  }

  switch(pft)
  {
    case pftEvenOdd: 
      //return false if a subj line has been flagged as inside a subj polygon
      if (edge.WindDelta == 0 && edge.WindCnt != 1) return false;
      break;
    case pftNonZero:
      if (Abs(edge.WindCnt) != 1) return false;
      break;
    case pftPositive: 
      if (edge.WindCnt != 1) return false;
      break;
    default: //pftNegative
      if (edge.WindCnt != -1) return false;
  }

  switch(m_ClipType)
  {
    case ctIntersection:
      switch(pft2)
      {
        case pftEvenOdd: 
        case pftNonZero: 
          return (edge.WindCnt2 != 0);
        case pftPositive: 
          return (edge.WindCnt2 > 0);
        default: 
          return (edge.WindCnt2 < 0);
      }
      break;
    case ctUnion:
      switch(pft2)
      {
        case pftEvenOdd: 
        case pftNonZero: 
          return (edge.WindCnt2 == 0);
        case pftPositive: 
          return (edge.WindCnt2 <= 0);
        default: 
          return (edge.WindCnt2 >= 0);
      }
      break;
    case ctDifference:
      if (edge.PolyTyp == ptSubject)
        switch(pft2)
        {
          case pftEvenOdd: 
          case pftNonZero: 
            return (edge.WindCnt2 == 0);
          case pftPositive: 
            return (edge.WindCnt2 <= 0);
          default: 
            return (edge.WindCnt2 >= 0);
        }
      else
        switch(pft2)
        {
          case pftEvenOdd: 
          case pftNonZero: 
            return (edge.WindCnt2 != 0);
          case pftPositive: 
            return (edge.WindCnt2 > 0);
          default: 
            return (edge.WindCnt2 < 0);
        }
      break;
    case ctXor:
      if (edge.WindDelta == 0) //XOr always contributing unless open
        switch(pft2)
        {
          case pftEvenOdd: 
          case pftNonZero: 
            return (edge.WindCnt2 == 0);
          case pftPositive: 
            return (edge.WindCnt2 <= 0);
          default: 
            return (edge.WindCnt2 >= 0);
        }
      else 
        return true;
      break;
    default:
      return true;
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x18(%rbp), %rax
cmpl $0x0, 0x48(%rax)
jne 0x1714a
movq -0x28(%rbp), %rax
movl 0xb8(%rax), %ecx
movl %ecx, -0x1c(%rbp)
movl 0xb4(%rax), %eax
movl %eax, -0x20(%rbp)
jmp 0x17160
movq -0x28(%rbp), %rax
movl 0xb4(%rax), %ecx
movl %ecx, -0x1c(%rbp)
movl 0xb8(%rax), %eax
movl %eax, -0x20(%rbp)
movl -0x1c(%rbp), %eax
movl %eax, -0x2c(%rbp)
testl %eax, %eax
je 0x17180
jmp 0x1716c
movl -0x2c(%rbp), %eax
subl $0x1, %eax
je 0x1719f
jmp 0x17176
movl -0x2c(%rbp), %eax
subl $0x2, %eax
je 0x171bd
jmp 0x171d2
movq -0x18(%rbp), %rax
cmpl $0x0, 0x50(%rax)
jne 0x1719d
movq -0x18(%rbp), %rax
cmpl $0x1, 0x54(%rax)
je 0x1719d
movb $0x0, -0x1(%rbp)
jmp 0x173cd
jmp 0x171e7
movq -0x18(%rbp), %rax
movslq 0x54(%rax), %rdi
callq 0x20680
cmpq $0x1, %rax
je 0x171bb
movb $0x0, -0x1(%rbp)
jmp 0x173cd
jmp 0x171e7
movq -0x18(%rbp), %rax
cmpl $0x1, 0x54(%rax)
je 0x171d0
movb $0x0, -0x1(%rbp)
jmp 0x173cd
jmp 0x171e7
movq -0x18(%rbp), %rax
cmpl $-0x1, 0x54(%rax)
je 0x171e5
movb $0x0, -0x1(%rbp)
jmp 0x173cd
jmp 0x171e7
movq -0x28(%rbp), %rax
movl 0x68(%rax), %eax
movq %rax, -0x38(%rbp)
subq $0x3, %rax
ja 0x173c9
movq -0x38(%rbp), %rax
leaq 0x154d1(%rip), %rcx     # 0x2c6d8
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movl -0x20(%rbp), %eax
movl %eax, -0x3c(%rbp)
subl $0x2, %eax
jb 0x17227
jmp 0x1721d
movl -0x3c(%rbp), %eax
subl $0x2, %eax
je 0x1723c
jmp 0x17251
movq -0x18(%rbp), %rax
cmpl $0x0, 0x58(%rax)
setne %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x173cd
movq -0x18(%rbp), %rax
cmpl $0x0, 0x58(%rax)
setg %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x173cd
movq -0x18(%rbp), %rax
cmpl $0x0, 0x58(%rax)
setl %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x173cd
movl -0x20(%rbp), %eax
movl %eax, -0x40(%rbp)
subl $0x2, %eax
jb 0x1727d
jmp 0x17273
movl -0x40(%rbp), %eax
subl $0x2, %eax
je 0x17292
jmp 0x172a7
movq -0x18(%rbp), %rax
cmpl $0x0, 0x58(%rax)
sete %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x173cd
movq -0x18(%rbp), %rax
cmpl $0x0, 0x58(%rax)
setle %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x173cd
movq -0x18(%rbp), %rax
cmpl $0x0, 0x58(%rax)
setge %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x173cd
movq -0x18(%rbp), %rax
cmpl $0x0, 0x48(%rax)
jne 0x1731c
movl -0x20(%rbp), %eax
movl %eax, -0x44(%rbp)
subl $0x2, %eax
jb 0x172dd
jmp 0x172d3
movl -0x44(%rbp), %eax
subl $0x2, %eax
je 0x172f2
jmp 0x17307
movq -0x18(%rbp), %rax
cmpl $0x0, 0x58(%rax)
sete %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x173cd
movq -0x18(%rbp), %rax
cmpl $0x0, 0x58(%rax)
setle %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x173cd
movq -0x18(%rbp), %rax
cmpl $0x0, 0x58(%rax)
setge %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x173cd
movl -0x20(%rbp), %eax
movl %eax, -0x48(%rbp)
subl $0x2, %eax
jb 0x17333
jmp 0x17329
movl -0x48(%rbp), %eax
subl $0x2, %eax
je 0x17348
jmp 0x1735a
movq -0x18(%rbp), %rax
cmpl $0x0, 0x58(%rax)
setne %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x173cd
movq -0x18(%rbp), %rax
cmpl $0x0, 0x58(%rax)
setg %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x173cd
movq -0x18(%rbp), %rax
cmpl $0x0, 0x58(%rax)
setl %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x173cd
movq -0x18(%rbp), %rax
cmpl $0x0, 0x50(%rax)
jne 0x173c3
movl -0x20(%rbp), %eax
movl %eax, -0x4c(%rbp)
subl $0x2, %eax
jb 0x1738d
jmp 0x17383
movl -0x4c(%rbp), %eax
subl $0x2, %eax
je 0x1739f
jmp 0x173b1
movq -0x18(%rbp), %rax
cmpl $0x0, 0x58(%rax)
sete %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x173cd
movq -0x18(%rbp), %rax
cmpl $0x0, 0x58(%rax)
setle %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x173cd
movq -0x18(%rbp), %rax
cmpl $0x0, 0x58(%rax)
setge %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x173cd
movb $0x1, -0x1(%rbp)
jmp 0x173cd
movb $0x1, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x50, %rsp
popq %rbp
retq
nopl (%rax,%rax)