void Merge(Polygon *P)
{
  Aet             *k;
  Segment         *sg, *sp;
  register float  I, J;
  register int    next_obj, top, bottom, line;
  
  /* setup code for polygon scan conversion goes here */
   
  top = P->ymin;
  bottom = P->ymax;

  for (line = top; line < bottom; line++) {

    /* code to maintain AET goes here */

    next_obj = 0;

    while (sg != NULL) {

      if (I <= sg->min) {
	if (J < sg->min) {
	  next_obj = 1;
	} else if (J < sg->max) {
	  Paint(sg->min, J, line, ds);
	  sg->max = sg->min;
	  sg->min = J+1;
	  next_obj = 1;
	} else {
	  Paint(sg->min, sg->max, line, ds);
	  if (J == sg->max) next_obj = 1;
	  Delete(sp, sg);
	  sp = sg;
	  sg = sg->next;
	}
      } else {
	  if (I > sg->max) {
	    sp = sg;
	    sg = sg->next;
	  } else if (J < sg->max) {
	    Paint(I, J, line, ds);
	    Split(I-1, J+1, sg);
	    next_obj = 1;
	  } else if (J == sg->max) {
	    Paint(I, J, line, ds);
	    sg->max = I-1;
	    next_obj = 1;
	    sp = sg;
	    sg = sg->next;
	  } else {
	    Paint(I, sg->max, line, ds);
	    sg->max = I-1;
	    sp = sg;
	    sg = sg->next;
	  }
      }
      if (next_obj) {
	if ((k=k->next) == NULL) break;
	I=k->x;
	k=k->next;
	J=k->x;
	next_obj = 0;
      }
    }
  }
}