3 fillstyle_t fillstyle_default;
5 windstate_t windstate_nonfilled = {
9 /* TODO: move num_polygons into windstate_t.internal */
13 // -------------------- even/odd ----------------------
15 windstate_t evenodd_start(int num_polygons)
17 return windstate_nonfilled;
19 windstate_t evenodd_add(windstate_t left, fillstyle_t*edge, segment_dir_t dir, int master)
24 fillstyle_t* evenodd_diff(windstate_t*left, windstate_t*right)
26 if(left->is_filled==right->is_filled)
29 return &fillstyle_default;
32 windrule_t windrule_evenodd = {
38 // -------------------- circular ----------------------
40 windstate_t circular_start(int num_polygons)
42 return windstate_nonfilled;
45 windstate_t circular_add(windstate_t left, fillstyle_t*edge, segment_dir_t dir, int master)
47 /* which one is + and which one - doesn't actually make any difference */
53 left.is_filled = left.wind_nr != 0;
57 fillstyle_t* circular_diff(windstate_t*left, windstate_t*right)
59 if(left->is_filled==right->is_filled)
62 return &fillstyle_default;
65 windrule_t windrule_circular = {
66 start: circular_start,
71 // -------------------- intersect ----------------------
73 windstate_t intersect_start(int num_polygons)
76 w.num_polygons = num_polygons;
80 windstate_t intersect_add(windstate_t left, fillstyle_t*edge, segment_dir_t dir, int master)
82 assert(master < left.num_polygons);
84 left.wind_nr ^= 1<<master;
85 if(left.wind_nr == (1<<left.num_polygons)-1)
90 fillstyle_t* intersect_diff(windstate_t*left, windstate_t*right)
92 if(left->is_filled==right->is_filled)
95 return &fillstyle_default;
98 windrule_t windrule_intersect = {
99 start: intersect_start,
101 diff: intersect_diff,
104 // -------------------- union ----------------------
106 windstate_t union_start(int num_polygons)
108 return windstate_nonfilled;
111 windstate_t union_add(windstate_t left, fillstyle_t*edge, segment_dir_t dir, int master)
113 assert(master<sizeof(left.wind_nr)*8); //up to 32/64 polygons max
114 left.wind_nr ^= 1<<master;
120 fillstyle_t* union_diff(windstate_t*left, windstate_t*right)
122 if(left->is_filled==right->is_filled)
125 return &fillstyle_default;
128 windrule_t windrule_union = {
136 } else if (rule == WIND_NONZERO) {
138 } else if (rule == WIND_ODDEVEN) {
140 } else { // rule == WIND_POSITIVE