X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fgfxpoly%2Fpoly.h;h=dfada99fbe21268de2640cc64c364dde72658ae7;hp=54d54b11b46b73a2432e10a8055a3cf8f9f0bb8d;hb=ba166d59c4c6672c8cb65c881193bb104c629bf7;hpb=bf04757cd94e94c1f67fa3d2a4e3e59fa5bce0c0 diff --git a/lib/gfxpoly/poly.h b/lib/gfxpoly/poly.h index 54d54b1..dfada99 100644 --- a/lib/gfxpoly/poly.h +++ b/lib/gfxpoly/poly.h @@ -4,8 +4,12 @@ #include #include "../q.h" +//#define DEBUG +//#define CHECKS +#define SPLAY + 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 +25,9 @@ typedef struct _edge { point_t a; point_t b; fillstyle_t*style; +#ifdef DEBUG + int tmp; +#endif struct _edge *next; } edge_t; @@ -38,11 +45,14 @@ typedef struct _windrule fillstyle_t* (*diff)(windstate_t*left, windstate_t*right); } windrule_t; +#define SEGNR(s) ((s)?(s)->nr:-1) + typedef struct _segment { point_t a; 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; @@ -53,25 +63,48 @@ typedef struct _segment { windstate_t wind; int nr; +#ifdef SPLAY + struct _segment*parent; + struct _segment*leftchild; + struct _segment*rightchild; +#endif 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)(s2)->delta.x*ypos)*(s1)->delta.y) 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 +114,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