X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fgfxpoly%2Fwind.c;h=e7cf95d01683f23b105522d8f914568ebb9c3ddc;hp=fa6d72488f6451836a159fcc2c26f2e0a5f65a5f;hb=eac1308d474f42fb9a7f8c89b1a02ff63c7c60e2;hpb=002f2ed7c404339e11d669aa86ec998d8dd473a5 diff --git a/lib/gfxpoly/wind.c b/lib/gfxpoly/wind.c index fa6d724..e7cf95d 100644 --- a/lib/gfxpoly/wind.c +++ b/lib/gfxpoly/wind.c @@ -1,33 +1,30 @@ -#include -#include "wind.h" +#include "poly.h" -fillstyle_t fillstyle_default; +edgestyle_t edgestyle_default; windstate_t windstate_nonfilled = { is_filled: 0, wind_nr: 0, - - /* TODO: move num_polygons into windstate_t.internal */ - num_polygons: 1, }; // -------------------- even/odd ---------------------- -windstate_t evenodd_start(int num_polygons) +windstate_t evenodd_start(windcontext_t*context) { return windstate_nonfilled; } -windstate_t evenodd_add(windstate_t left, fillstyle_t*edge, segment_dir_t dir, int master) +windstate_t evenodd_add(windcontext_t*context, windstate_t left, edgestyle_t*edge, segment_dir_t dir, int master) { + assert(edge); left.is_filled ^= 1; return left; } -fillstyle_t* evenodd_diff(windstate_t*left, windstate_t*right) +edgestyle_t* evenodd_diff(windstate_t*left, windstate_t*right) { if(left->is_filled==right->is_filled) return 0; else - return &fillstyle_default; + return &edgestyle_default; } windrule_t windrule_evenodd = { @@ -38,29 +35,33 @@ windrule_t windrule_evenodd = { // -------------------- circular ---------------------- -windstate_t circular_start(int num_polygons) +edgestyle_t edgestyle_down; +edgestyle_t edgestyle_up; + +windstate_t circular_start(windcontext_t*context) { return windstate_nonfilled; } -windstate_t circular_add(windstate_t left, fillstyle_t*edge, segment_dir_t dir, int master) +windstate_t circular_add(windcontext_t*context, windstate_t left, edgestyle_t*edge, segment_dir_t dir, int master) { + assert(edge); /* which one is + and which one - doesn't actually make any difference */ if(dir == DIR_DOWN) - left.wind_nr++; + left.wind_nr++; else - left.wind_nr--; + left.wind_nr--; left.is_filled = left.wind_nr != 0; return left; } -fillstyle_t* circular_diff(windstate_t*left, windstate_t*right) +edgestyle_t* circular_diff(windstate_t*left, windstate_t*right) { if(left->is_filled==right->is_filled) return 0; else - return &fillstyle_default; + return &edgestyle_default; } windrule_t windrule_circular = { @@ -71,29 +72,26 @@ windrule_t windrule_circular = { // -------------------- intersect ---------------------- -windstate_t intersect_start(int num_polygons) +windstate_t intersect_start(windcontext_t*context) { - windstate_t w; - w.num_polygons = num_polygons; - return w; + return windstate_nonfilled; } -windstate_t intersect_add(windstate_t left, fillstyle_t*edge, segment_dir_t dir, int master) +windstate_t intersect_add(windcontext_t*context, windstate_t left, edgestyle_t*edge, segment_dir_t dir, int master) { - assert(master < left.num_polygons); + assert(master < context->num_polygons); left.wind_nr ^= 1<num_polygons)-1); return left; } -fillstyle_t* intersect_diff(windstate_t*left, windstate_t*right) +edgestyle_t* intersect_diff(windstate_t*left, windstate_t*right) { if(left->is_filled==right->is_filled) return 0; else - return &fillstyle_default; + return &edgestyle_default; } windrule_t windrule_intersect = { @@ -104,26 +102,25 @@ windrule_t windrule_intersect = { // -------------------- union ---------------------- -windstate_t union_start(int num_polygons) +windstate_t union_start(windcontext_t*context) { return windstate_nonfilled; } -windstate_t union_add(windstate_t left, fillstyle_t*edge, segment_dir_t dir, int master) +windstate_t union_add(windcontext_t*context, windstate_t left, edgestyle_t*edge, segment_dir_t dir, int master) { assert(masteris_filled==right->is_filled) return 0; else - return &fillstyle_default; + return &edgestyle_default; } windrule_t windrule_union = {