X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fgfxpoly%2Fpoly.h;h=6e4c7e40c1a34b6752bb0b5fdf279932d801aa2b;hp=54d54b11b46b73a2432e10a8055a3cf8f9f0bb8d;hb=de3641737991ed13571eb947068472cf73001032;hpb=bf04757cd94e94c1f67fa3d2a4e3e59fa5bce0c0 diff --git a/lib/gfxpoly/poly.h b/lib/gfxpoly/poly.h index 54d54b1..6e4c7e4 100644 --- a/lib/gfxpoly/poly.h +++ b/lib/gfxpoly/poly.h @@ -4,8 +4,11 @@ #include #include "../q.h" +//#define DEBUG +//#define CHECKS + typedef enum {DIR_UP, DIR_DOWN} segment_dir_t; -typedef enum {EVENT_CROSS, EVENT_END, EVENT_START, EVENT_HORIZONTAL} eventtype_t; +typedef enum {EVENT_CROSS, EVENT_END, EVENT_CORNER, EVENT_START, EVENT_HORIZONTAL} eventtype_t; typedef enum {SLOPE_POSITIVE, SLOPE_NEGATIVE} slope_t; typedef struct _point { @@ -21,6 +24,7 @@ typedef struct _edge { point_t a; point_t b; fillstyle_t*style; + int tmp; struct _edge *next; } edge_t; @@ -43,6 +47,7 @@ typedef struct _segment { point_t b; point_t delta; double k; //k = a.x*b.y-a.y*b.x = delta.y*a.x - delta.x*a.y (=0 for points on the segment) + int minx, maxx; segment_dir_t dir; fillstyle_t*fs; @@ -55,23 +60,44 @@ typedef struct _segment { struct _segment*left; struct _segment*right; - + char changed; + point_t pos; dict_t scheduled_crossings; } segment_t; #define LINE_EQ(p,s) ((double)(s)->delta.y*(p).x - (double)(s)->delta.x*(p).y - (s)->k) -#define XPOS(s,ypos) ((s)->a.x + ceil(((s)->delta.x * (double)((ypos) - (s)->a.y)) / (s)->delta.y)) + +/* x1 + ((x2-x1)*(y-y1)) / dy = + (x1*(y2-y1) + (x2-x1)*(y-y1)) / dy = + (x1*(y2-y) + x2 *(y-y1)) / dy = + (x1*y2 - x2*y1 + x2*y - y*x1) / dy = + (k + x2*y - x1*y) / dy + (k + dx*y) / dy +*/ +//#define XPOS(s,ypos) ((s)->a.x + ((s)->delta.x * (double)((ypos) - (s)->a.y)) / (s)->delta.y) +#define XPOS(s,ypos) (((s)->k + (double)(s)->delta.x*ypos) / (s)->delta.y) + +#define XPOS_INT(s,ypos) ((int)ceil(XPOS((s),ypos))) +#define XDIFF(s1,s2,ypos) (((s1)->k + (double)(s1)->delta.x*ypos)*(s2)->delta.y - \ + ((s2)->k + (double)(s1)->delta.x*ypos)*(s1)->delta.y) + +// rewrite as XDIFF==0? +#define XPOS_EQ(s1,s2,ypos) (XPOS((s1),(ypos))==XPOS((s2),(ypos))) typedef struct _gfxpoly { double gridsize; edge_t*edges; } gfxpoly_t; +void gfxpoly_fail(char*expr, char*file, int line, const char*function); + gfxpoly_t* gfxpoly_new(double gridsize); char gfxpoly_check(gfxpoly_t*poly); +int gfxpoly_size(gfxpoly_t*poly); void gfxpoly_dump(gfxpoly_t*poly); +gfxpoly_t* gfxpoly_save(gfxpoly_t*poly, const char*filename); gfxpoly_t* gfxpoly_process(gfxpoly_t*poly, windrule_t*windrule); typedef struct _event { @@ -81,4 +107,14 @@ typedef struct _event { segment_t*s2; } event_t; +#ifndef CHECKS +#ifdef assert +#undef assert +#endif +#define assert(x) +#else +#define assert(x) ((x)?0:gfxpoly_fail(__STRING(x), __FILE__, __LINE__, __PRETTY_FUNCTION__)) +#endif + + #endif