3 edgestyle_t edgestyle_default;
5 windstate_t windstate_nonfilled = {
10 // -------------------- even/odd ----------------------
12 windstate_t evenodd_start(windcontext_t*context)
14 return windstate_nonfilled;
16 windstate_t evenodd_add(windcontext_t*context, windstate_t left, edgestyle_t*edge, segment_dir_t dir, int master)
22 edgestyle_t* evenodd_diff(windstate_t*left, windstate_t*right)
24 if(left->is_filled==right->is_filled)
27 return &edgestyle_default;
30 windrule_t windrule_evenodd = {
36 // -------------------- circular ----------------------
38 edgestyle_t edgestyle_down;
39 edgestyle_t edgestyle_up;
41 windstate_t circular_start(windcontext_t*context)
43 return windstate_nonfilled;
46 windstate_t circular_add(windcontext_t*context, windstate_t left, edgestyle_t*edge, segment_dir_t dir, int master)
49 /* which one is + and which one - doesn't actually make any difference */
55 left.is_filled = left.wind_nr != 0;
59 edgestyle_t* circular_diff(windstate_t*left, windstate_t*right)
61 if(left->is_filled==right->is_filled) {
63 } else if(left->is_filled) {
64 return &edgestyle_down;
65 } else {//right->is_filled
70 windrule_t windrule_circular = {
71 start: circular_start,
76 // -------------------- intersect ----------------------
78 windstate_t intersect_start(windcontext_t*context)
80 return windstate_nonfilled;
83 windstate_t intersect_add(windcontext_t*context, windstate_t left, edgestyle_t*edge, segment_dir_t dir, int master)
85 assert(master < context->num_polygons);
87 left.wind_nr ^= 1<<master;
88 left.is_filled = (left.wind_nr == (1<<context->num_polygons)-1);
92 edgestyle_t* intersect_diff(windstate_t*left, windstate_t*right)
94 if(left->is_filled==right->is_filled)
97 return &edgestyle_default;
100 windrule_t windrule_intersect = {
101 start: intersect_start,
103 diff: intersect_diff,
106 // -------------------- union ----------------------
108 windstate_t union_start(windcontext_t*context)
110 return windstate_nonfilled;
113 windstate_t union_add(windcontext_t*context, windstate_t left, edgestyle_t*edge, segment_dir_t dir, int master)
115 assert(master<sizeof(left.wind_nr)*8); //up to 32/64 polygons max
116 left.wind_nr ^= 1<<master;
117 left.is_filled = (left.wind_nr!=0);
121 edgestyle_t* union_diff(windstate_t*left, windstate_t*right)
123 if(left->is_filled==right->is_filled)
126 return &edgestyle_default;
129 windrule_t windrule_union = {
137 } else if (rule == WIND_NONZERO) {
139 } else if (rule == WIND_ODDEVEN) {
141 } else { // rule == WIND_POSITIVE