#include <stdint.h>
#include "../q.h"
#include "../types.h"
+#include "wind.h"
/* features */
#define SPLAY
#define DONT_REMEMBER_CROSSINGS
-typedef enum {DIR_UP, DIR_DOWN, DIR_UNKNOWN} segment_dir_t;
typedef enum {EVENT_CROSS, EVENT_END, EVENT_START, EVENT_HORIZONTAL} eventtype_t;
typedef enum {SLOPE_POSITIVE, SLOPE_NEGATIVE} slope_t;
} point_t;
type_t point_type;
-typedef struct _fillstyle {
- void*internal;
-} fillstyle_t;
-
-typedef struct _windstate
-{
- char is_filled;
- int wind_nr;
-} windstate_t;
-
-/* TODO: maybe we should merge windcontext and windrule */
-typedef struct _windcontext
-{
- int num_polygons;
-} windcontext_t;
-
-typedef struct _windrule
-{
- windstate_t (*start)(windcontext_t* num_polygons);
- windstate_t (*add)(windcontext_t*context, windstate_t left, fillstyle_t*edge, segment_dir_t dir, int polygon_nr);
- fillstyle_t* (*diff)(windstate_t*left, windstate_t*right);
-} windrule_t;
-
-#define SEGNR(s) ((s)?(s)->nr:-1)
+#define SEGNR(s) ((int)((s)?(s)->nr:-1))
typedef struct _gfxpolystroke {
segment_dir_t dir;
+ edgestyle_t*fs;
int points_size;
int num_points;
point_t*points;
- fillstyle_t*fs;
struct _gfxpolystroke*next;
} gfxpolystroke_t;
typedef struct _gfxpoly {
int32_t minx, maxx;
segment_dir_t dir;
- fillstyle_t*fs;
- fillstyle_t*fs_out;
+ edgestyle_t*fs;
+ edgestyle_t*fs_out;
#ifdef CHECKS
char fs_out_ok;
#endif
void gfxpoly_fail(char*expr, char*file, int line, const char*function);
-char gfxpoly_check(gfxpoly_t*poly);
+char gfxpoly_check(gfxpoly_t*poly, char updown);
int gfxpoly_num_segments(gfxpoly_t*poly);
int gfxpoly_size(gfxpoly_t*poly);
void gfxpoly_dump(gfxpoly_t*poly);
void gfxpoly_save(gfxpoly_t*poly, const char*filename);
+void gfxpoly_save_arrows(gfxpoly_t*poly, const char*filename);
gfxpoly_t* gfxpoly_process(gfxpoly_t*poly1, gfxpoly_t*poly2, windrule_t*windrule, windcontext_t*context);
gfxpoly_t* gfxpoly_intersect(gfxpoly_t*p1, gfxpoly_t*p2);