| 844 | //------------------------------------------------------------------------------ |
| 845 | |
| 846 | void Clipper::SetWindingCount(TEdge &edge) |
| 847 | { |
| 848 | TEdge *e = edge.prevInAEL; |
| 849 | //find the edge of the same polytype that immediately preceeds 'edge' in AEL |
| 850 | while ( e && e->polyType != edge.polyType ) e = e->prevInAEL; |
| 851 | if ( !e ) |
| 852 | { |
| 853 | edge.windCnt = edge.windDelta; |
| 854 | edge.windCnt2 = 0; |
| 855 | e = m_ActiveEdges; //ie get ready to calc windCnt2 |
| 856 | } else if ( IsNonZeroFillType(edge) ) |
| 857 | { |
| 858 | //nonZero filling ... |
| 859 | if ( e->windCnt * e->windDelta < 0 ) |
| 860 | { |
| 861 | if (Abs(e->windCnt) > 1) |
| 862 | { |
| 863 | if (e->windDelta * edge.windDelta < 0) edge.windCnt = e->windCnt; |
| 864 | else edge.windCnt = e->windCnt + edge.windDelta; |
| 865 | } else |
| 866 | edge.windCnt = e->windCnt + e->windDelta + edge.windDelta; |
| 867 | } else |
| 868 | { |
| 869 | if ( Abs(e->windCnt) > 1 && e->windDelta * edge.windDelta < 0) |
| 870 | edge.windCnt = e->windCnt; |
| 871 | else if ( e->windCnt + edge.windDelta == 0 ) |
| 872 | edge.windCnt = e->windCnt; |
| 873 | else edge.windCnt = e->windCnt + edge.windDelta; |
| 874 | } |
| 875 | edge.windCnt2 = e->windCnt2; |
| 876 | e = e->nextInAEL; //ie get ready to calc windCnt2 |
| 877 | } else |
| 878 | { |
| 879 | //even-odd filling ... |
| 880 | edge.windCnt = 1; |
| 881 | edge.windCnt2 = e->windCnt2; |
| 882 | e = e->nextInAEL; //ie get ready to calc windCnt2 |
| 883 | } |
| 884 | |
| 885 | //update windCnt2 ... |
| 886 | if ( IsNonZeroAltFillType(edge) ) |
| 887 | { |
| 888 | //nonZero filling ... |
| 889 | while ( e != &edge ) |
| 890 | { |
| 891 | edge.windCnt2 += e->windDelta; |
| 892 | e = e->nextInAEL; |
| 893 | } |
| 894 | } else |
| 895 | { |
| 896 | //even-odd filling ... |
| 897 | while ( e != &edge ) |
| 898 | { |
| 899 | edge.windCnt2 = (edge.windCnt2 == 0) ? 1 : 0; |
| 900 | e = e->nextInAEL; |
| 901 | } |
| 902 | } |
| 903 | } |