4 fillstyle_t fillstyle_default;
6 windstate_t windstate_nonfilled = {
10 /* TODO: move num_polygons into windstate_t.internal */
14 // -------------------- even/odd ----------------------
16 windstate_t evenodd_start(int num_polygons)
18 return windstate_nonfilled;
20 windstate_t evenodd_add(windstate_t left, fillstyle_t*edge, segment_dir_t dir, int master)
25 fillstyle_t* evenodd_diff(windstate_t*left, windstate_t*right)
27 if(left->is_filled==right->is_filled)
30 return &fillstyle_default;
33 windrule_t windrule_evenodd = {
39 // -------------------- circular ----------------------
41 windstate_t circular_start(int num_polygons)
43 return windstate_nonfilled;
46 windstate_t circular_add(windstate_t left, fillstyle_t*edge, segment_dir_t dir, int master)
48 /* which one is + and which one - doesn't actually make any difference */
54 left.is_filled = left.wind_nr != 0;
58 fillstyle_t* circular_diff(windstate_t*left, windstate_t*right)
60 if(left->is_filled==right->is_filled)
63 return &fillstyle_default;
66 windrule_t windrule_circular = {
67 start: circular_start,
72 // -------------------- intersect ----------------------
74 windstate_t intersect_start(int num_polygons)
77 w.num_polygons = num_polygons;
81 windstate_t intersect_add(windstate_t left, fillstyle_t*edge, segment_dir_t dir, int master)
83 assert(master < left.num_polygons);
85 left.wind_nr ^= 1<<master;
86 if(left.wind_nr == (1<<left.num_polygons)-1)
91 fillstyle_t* intersect_diff(windstate_t*left, windstate_t*right)
93 if(left->is_filled==right->is_filled)
96 return &fillstyle_default;
99 windrule_t windrule_intersect = {
100 start: intersect_start,
102 diff: intersect_diff,
105 // -------------------- union ----------------------
107 windstate_t union_start(int num_polygons)
109 return windstate_nonfilled;
112 windstate_t union_add(windstate_t left, fillstyle_t*edge, segment_dir_t dir, int master)
114 assert(master<sizeof(left.wind_nr)*8); //up to 32/64 polygons max
115 left.wind_nr ^= 1<<master;
121 fillstyle_t* union_diff(windstate_t*left, windstate_t*right)
123 if(left->is_filled==right->is_filled)
126 return &fillstyle_default;
129 windrule_t windrule_union = {
137 } else if (rule == WIND_NONZERO) {
139 } else if (rule == WIND_ODDEVEN) {
141 } else { // rule == WIND_POSITIVE