- edge_t*l;
- for(l=list;l;l=l->next) {
- if(l->a.x == l->b.x &&
- l->a.y == l->b.y) {
- fprintf(stderr, "Warning: intersector input contains zero-length segments\n");
- continue;
- }
- segment_t*s = segment_new(l->a.x, l->a.y, l->b.x, l->b.y, initial, polygon_nr);
- if(l->tmp)
- s->nr = l->tmp;
+ if(!stroke)
+ return;
+ segment_t*s = 0;
+ /* we need to queue multiple segments at once because we need to process start events
+ before horizontal events */
+ while(pos < stroke->num_points-1) {
+ assert(stroke->points[pos].y <= stroke->points[pos+1].y);
+ s = segment_new(stroke->points[pos], stroke->points[pos+1], polygon_nr, stroke->dir);
+ pos++;
+ s->stroke = 0;
+ s->stroke_pos = 0;
+#ifdef DEBUG
+ /*if(l->tmp)
+ s->nr = l->tmp;*/
+ fprintf(stderr, "[%d] (%d,%d) -> (%d,%d) %s (stroke %08x, %d more to come)\n",
+ s->nr, s->a.x, s->a.y, s->b.x, s->b.y,
+ s->dir==DIR_UP?"up":"down", stroke, stroke->num_points - 1 - pos);
+#endif
+ event_t* e = event_new();
+ e->type = s->delta.y ? EVENT_START : EVENT_HORIZONTAL;
+ e->p = s->a;
+ e->s1 = s;
+ e->s2 = 0;
+
+ if(queue) queue_put(queue, e);
+ else hqueue_put(hqueue, e);
+
+ if(e->type != EVENT_HORIZONTAL) {
+ break;
+ }
+ }
+ if(s) {