Blame src/Clip.c

Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Copyright (c) 1998 by The XFree86 Project, Inc.
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Permission is hereby granted, free of charge, to any person obtaining a
Packit Service 2b1f13
 * copy of this software and associated documentation files (the "Software"),
Packit Service 2b1f13
 * to deal in the Software without restriction, including without limitation
Packit Service 2b1f13
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
Packit Service 2b1f13
 * and/or sell copies of the Software, and to permit persons to whom the
Packit Service 2b1f13
 * Software is furnished to do so, subject to the following conditions:
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * The above copyright notice and this permission notice shall be included in
Packit Service 2b1f13
 * all copies or substantial portions of the Software.
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit Service 2b1f13
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit Service 2b1f13
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
Packit Service 2b1f13
 * THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
Packit Service 2b1f13
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
Packit Service 2b1f13
 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
Packit Service 2b1f13
 * SOFTWARE.
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Except as contained in this notice, the name of the XFree86 Project shall
Packit Service 2b1f13
 * not be used in advertising or otherwise to promote the sale, use or other
Packit Service 2b1f13
 * dealings in this Software without prior written authorization from the
Packit Service 2b1f13
 * XFree86 Project.
Packit Service 2b1f13
 */
Packit Service 2b1f13
Packit Service 2b1f13
#ifdef HAVE_CONFIG_H
Packit Service 2b1f13
#include <config.h>
Packit Service 2b1f13
#endif
Packit Service 2b1f13
#include <stdlib.h>
Packit Service 2b1f13
Packit Service 2b1f13
#include <X11/IntrinsicP.h>
Packit Service 2b1f13
#include <X11/Xmu/Xmu.h>
Packit Service 2b1f13
Packit Service 2b1f13
#define XmuMax(a, b)	((a) > (b) ? (a) : (b))
Packit Service 2b1f13
#define XmuMin(a, b)	((a) < (b) ? (a) : (b))
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	XmuNewArea
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	x1 - Coordinates of the rectangle
Packit Service 2b1f13
 *	y1 - ""
Packit Service 2b1f13
 *	x2 - ""
Packit Service 2b1f13
 *	y2 - ""
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 *	Creates a new rectangular clipping area
Packit Service 2b1f13
 */
Packit Service 2b1f13
XmuArea *
Packit Service 2b1f13
XmuNewArea(int x1, int y1, int x2, int y2)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuArea *area;
Packit Service 2b1f13
Packit Service 2b1f13
  area = (XmuArea *)XtMalloc(sizeof(XmuArea));
Packit Service 2b1f13
  if (x2 > x1 && y2 > y1)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      area->scanline = XmuNewScanline(y1, x1, x2);
Packit Service 2b1f13
      area->scanline->next = XmuNewScanline(y2, 0, 0);
Packit Service 2b1f13
    }
Packit Service 2b1f13
  else
Packit Service 2b1f13
    area->scanline = (XmuScanline *)NULL;
Packit Service 2b1f13
Packit Service 2b1f13
  return (area);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	XmuAreaDup
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	area - Area to copy
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 *	Returns a copy of its argument
Packit Service 2b1f13
 */
Packit Service 2b1f13
XmuArea *
Packit Service 2b1f13
XmuAreaDup(XmuArea *area)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuArea *dst;
Packit Service 2b1f13
Packit Service 2b1f13
  if (!area)
Packit Service 2b1f13
    return ((XmuArea *)NULL);
Packit Service 2b1f13
Packit Service 2b1f13
  dst = XmuCreateArea();
Packit Service 2b1f13
  XmuAreaCopy(dst, area);
Packit Service 2b1f13
  return (dst);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	XmuAreaCopy
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	dst - destination area
Packit Service 2b1f13
 *	src - source area
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 *	Minimizes memory alocation, trying to use already alocated memory
Packit Service 2b1f13
 *	in dst, freeing what is not required anymore.
Packit Service 2b1f13
 */
Packit Service 2b1f13
XmuArea *
Packit Service 2b1f13
XmuAreaCopy(XmuArea *dst, XmuArea *src)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuScanline *z, *p, *Z;
Packit Service 2b1f13
Packit Service 2b1f13
  if (!dst || !src || dst == src)
Packit Service 2b1f13
    return (dst);
Packit Service 2b1f13
Packit Service 2b1f13
  z = p = dst->scanline;
Packit Service 2b1f13
  Z = src->scanline;
Packit Service 2b1f13
Packit Service 2b1f13
  /*CONSTCOND*/
Packit Service 2b1f13
  while (1)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      if (!Z)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  if (z == dst->scanline)
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      XmuDestroyScanlineList(dst->scanline);
Packit Service 2b1f13
	      dst->scanline = (XmuScanline *)NULL;
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	  else
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      XmuDestroyScanlineList(p->next);
Packit Service 2b1f13
	      p->next = (XmuScanline *)NULL;
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	  return (dst);
Packit Service 2b1f13
	}
Packit Service 2b1f13
      if (z)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  XmuScanlineCopy(z, Z);
Packit Service 2b1f13
	  z->y = Z->y;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      else
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  z = XmuNewScanline(Z->y, 0, 0);
Packit Service 2b1f13
	  XmuScanlineCopy(z, Z);
Packit Service 2b1f13
	  if (p == dst->scanline && !dst->scanline)
Packit Service 2b1f13
	    p = dst->scanline = z;
Packit Service 2b1f13
	  else
Packit Service 2b1f13
	    p->next = z;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      p = z;
Packit Service 2b1f13
      z = z->next;
Packit Service 2b1f13
      Z = Z->next;
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  return (dst);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *   XmuAreaNot
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	area - area to operate
Packit Service 2b1f13
 *	x1   - retangle to clip the result against
Packit Service 2b1f13
 *	y1   - ""
Packit Service 2b1f13
 *	x2   - ""
Packit Service 2b1f13
 *	y2   - ""
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 * (Input)
Packit Service 2b1f13
 * (x1, y1)                                                (x2, y1)
Packit Service 2b1f13
 *                   +-------------+
Packit Service 2b1f13
 *      +------------+             +----+
Packit Service 2b1f13
 *      |                +--------------+
Packit Service 2b1f13
 *      +----------------+
Packit Service 2b1f13
 * (x1, y2)                                                (x2, y2)
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * (Output)
Packit Service 2b1f13
 * (x1, y1)                                                (x2, y1)
Packit Service 2b1f13
 *    +--------------+             +--------------------------+
Packit Service 2b1f13
 *    | +------------+             +----+                     |
Packit Service 2b1f13
 *    | |                +--------------+                     |
Packit Service 2b1f13
 *    +-+                +------------------------------------+
Packit Service 2b1f13
 * (x1, y2)                                                (x2, y2)
Packit Service 2b1f13
 */
Packit Service 2b1f13
XmuArea *
Packit Service 2b1f13
XmuAreaNot(XmuArea *area, int x1, int y1, int x2, int y2)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuScanline *z;
Packit Service 2b1f13
  XmuArea *and;
Packit Service 2b1f13
Packit Service 2b1f13
  if (!area)
Packit Service 2b1f13
    return (area);
Packit Service 2b1f13
Packit Service 2b1f13
  if (x1 > x2)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      x1 ^= x2; x2 ^= x1; x1 ^= x2;
Packit Service 2b1f13
    }
Packit Service 2b1f13
    if (y1 > y2)
Packit Service 2b1f13
      {
Packit Service 2b1f13
	y1 ^= y2; y2 ^= y1; y1 ^= y2;
Packit Service 2b1f13
      }
Packit Service 2b1f13
    if (!area->scanline)
Packit Service 2b1f13
      {
Packit Service 2b1f13
	if ((area->scanline = XmuNewScanline(y1, x1, x2)) != NULL)
Packit Service 2b1f13
	  area->scanline->next = XmuNewScanline(y2, 0, 0);
Packit Service 2b1f13
	return (area);
Packit Service 2b1f13
      }
Packit Service 2b1f13
    and = XmuNewArea(x1, y1, x2, y2);
Packit Service 2b1f13
    XmuAreaAnd(area, and);
Packit Service 2b1f13
    XmuDestroyArea(and);
Packit Service 2b1f13
    z = area->scanline;
Packit Service 2b1f13
    if (z->y != y1)
Packit Service 2b1f13
      {
Packit Service 2b1f13
	XmuScanline *q = XmuNewScanline(y1, x1, x2);
Packit Service 2b1f13
	q->next = z;
Packit Service 2b1f13
	area->scanline = q;
Packit Service 2b1f13
      }
Packit Service 2b1f13
    else
Packit Service 2b1f13
      {
Packit Service 2b1f13
	area->scanline = area->scanline->next;
Packit Service 2b1f13
	XmuDestroyScanline(z);
Packit Service 2b1f13
	XmuOptimizeArea(area);
Packit Service 2b1f13
	if((z = area->scanline) == (XmuScanline *)NULL)
Packit Service 2b1f13
	  return (area);
Packit Service 2b1f13
      }
Packit Service 2b1f13
Packit Service 2b1f13
    /* CONSTCOND */
Packit Service 2b1f13
    while (1)
Packit Service 2b1f13
      {
Packit Service 2b1f13
	XmuScanlineNot(z, x1, x2);
Packit Service 2b1f13
	if (!z->next)
Packit Service 2b1f13
	  {
Packit Service 2b1f13
	    z->next = XmuNewScanline(y2, 0, 0);
Packit Service 2b1f13
	    break;
Packit Service 2b1f13
	  }
Packit Service 2b1f13
	if (z->next->y == y2)
Packit Service 2b1f13
	  {
Packit Service 2b1f13
	    XmuDestroyScanlineList(z->next);
Packit Service 2b1f13
	    z->next = XmuNewScanline(y2, 0, 0);
Packit Service 2b1f13
	    break;
Packit Service 2b1f13
	  }
Packit Service 2b1f13
	z = z->next;
Packit Service 2b1f13
      }
Packit Service 2b1f13
Packit Service 2b1f13
    return (area);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	XmuAreaOrXor
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	dst - destination area
Packit Service 2b1f13
 *	src - source area
Packit Service 2b1f13
 *	or  - or operation if true, else xor operation
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 *	Executes Or (Union) or Xor (Reverse intesection) of the areas
Packit Service 2b1f13
 */
Packit Service 2b1f13
XmuArea *
Packit Service 2b1f13
XmuAreaOrXor(XmuArea *dst, XmuArea *src, Bool or)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuScanline *z, *p, *Z, *P, *ins, *top;
Packit Service 2b1f13
Packit Service 2b1f13
  if (!dst || !src)
Packit Service 2b1f13
    return (dst);
Packit Service 2b1f13
Packit Service 2b1f13
  if (dst == src)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      if (or)
Packit Service 2b1f13
	return (dst);
Packit Service 2b1f13
      XmuDestroyScanlineList(dst->scanline);
Packit Service 2b1f13
      dst->scanline = (XmuScanline *)NULL;
Packit Service 2b1f13
      return (dst);
Packit Service 2b1f13
    }
Packit Service 2b1f13
  if (!XmuValidArea(src))
Packit Service 2b1f13
    return (dst);
Packit Service 2b1f13
  if (!XmuValidArea(dst))
Packit Service 2b1f13
    {
Packit Service 2b1f13
      XmuAreaCopy(dst, src);
Packit Service 2b1f13
      return (dst);
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  p = z = dst->scanline;
Packit Service 2b1f13
  P = Z = src->scanline;
Packit Service 2b1f13
  ins = XmuNewScanline(dst->scanline->y, 0, 0);
Packit Service 2b1f13
  top = XmuNewScanline(dst->scanline->y, 0, 0);
Packit Service 2b1f13
  XmuScanlineCopy(ins, dst->scanline);
Packit Service 2b1f13
  XmuScanlineCopy(top, dst->scanline);
Packit Service 2b1f13
Packit Service 2b1f13
  /*CONSTCOND*/
Packit Service 2b1f13
  while (1)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      if (!Z)
Packit Service 2b1f13
	break;
Packit Service 2b1f13
      else if (Z->y < z->y)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  XmuScanline  *q = XmuNewScanline(Z->y, 0, 0);
Packit Service 2b1f13
	  XmuScanlineCopy(q, Z);
Packit Service 2b1f13
Packit Service 2b1f13
	  if (z == dst->scanline)
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      dst->scanline = p = q;
Packit Service 2b1f13
	      q->next = z;
Packit Service 2b1f13
            }
Packit Service 2b1f13
	  else
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      p->next = q;
Packit Service 2b1f13
	      q->next = z;
Packit Service 2b1f13
	      if (Z->y >= p->y)
Packit Service 2b1f13
		{
Packit Service 2b1f13
		  if (ins->y >= top->y
Packit Service 2b1f13
		      && (p->y != P->y || !XmuScanlineEqu(p, P)
Packit Service 2b1f13
			  || (ins->y <= P->y && !XmuScanlineEqu(ins, P))))
Packit Service 2b1f13
		    {
Packit Service 2b1f13
		      if (or)
Packit Service 2b1f13
			XmuScanlineOr(q, ins);
Packit Service 2b1f13
		      else
Packit Service 2b1f13
			XmuScanlineXor(q, ins);
Packit Service 2b1f13
                    }
Packit Service 2b1f13
		  else if (Z->y >= top->y
Packit Service 2b1f13
			   && (top->y == p->y || top->y > ins->y
Packit Service 2b1f13
			       || !XmuValidScanline(Z)
Packit Service 2b1f13
			       || (p->y == P->y && XmuValidScanline(p)
Packit Service 2b1f13
				   && XmuValidScanline(P))
Packit Service 2b1f13
			       || XmuScanlineEqu(ins, top)))
Packit Service 2b1f13
		    {
Packit Service 2b1f13
		      if (or)
Packit Service 2b1f13
			XmuScanlineOr(q, top);
Packit Service 2b1f13
		      else
Packit Service 2b1f13
			XmuScanlineXor(q, top);
Packit Service 2b1f13
		    }
Packit Service 2b1f13
		  if (ins->y != p->y && p->y != P->y)
Packit Service 2b1f13
		    {
Packit Service 2b1f13
		      XmuScanlineCopy(ins, p);
Packit Service 2b1f13
		      ins->y = p->y;
Packit Service 2b1f13
		    }
Packit Service 2b1f13
		}
Packit Service 2b1f13
	      if (!XmuValidScanline(p) || Z->y <= p->y)
Packit Service 2b1f13
		{
Packit Service 2b1f13
		  XmuScanlineCopy(top, p);
Packit Service 2b1f13
		  top->y = p->y;
Packit Service 2b1f13
                }
Packit Service 2b1f13
	      p = q;
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	  P = Z;
Packit Service 2b1f13
	  Z = Z->next;
Packit Service 2b1f13
	  continue;
Packit Service 2b1f13
        }
Packit Service 2b1f13
      else if (Z->y == z->y)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  if (top->y != z->y)
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      XmuScanlineCopy(top, z);
Packit Service 2b1f13
	      top->y = z->y;
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	  if (or)
Packit Service 2b1f13
	    XmuScanlineOr(z, Z);
Packit Service 2b1f13
	  else
Packit Service 2b1f13
	    XmuScanlineXor(z, Z);
Packit Service 2b1f13
	  P = Z;
Packit Service 2b1f13
	  Z = Z->next;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      else if (P != Z)		/* && Z->y > z->y */
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  if (top->y == ins->y && top->y != z->y)
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      XmuScanlineCopy(top, z);
Packit Service 2b1f13
	      top->y = z->y;
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	  if (ins->y != z->y)
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      XmuScanlineCopy(ins, z);
Packit Service 2b1f13
	      ins->y = z->y;
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	  if (or)
Packit Service 2b1f13
	    XmuScanlineOr(z, P);
Packit Service 2b1f13
	  else
Packit Service 2b1f13
	    XmuScanlineXor(z, P);
Packit Service 2b1f13
	}
Packit Service 2b1f13
      else if (ins->y != z->y)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  XmuScanlineCopy(ins, z);
Packit Service 2b1f13
	  ins->y = z->y;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      p = z;
Packit Service 2b1f13
      z = z->next;
Packit Service 2b1f13
      if (!z)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  while (Z)
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      p->next = XmuNewScanline(Z->y, 0, 0);
Packit Service 2b1f13
	      XmuScanlineCopy(p->next, Z);
Packit Service 2b1f13
	      p = p->next;
Packit Service 2b1f13
	      Z = Z->next;
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	  break;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      else if (ins->y > top->y && !XmuValidScanline(z)
Packit Service 2b1f13
	       && XmuValidScanline(ins))
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  XmuScanlineCopy(top, ins);
Packit Service 2b1f13
	  top->y = ins->y;
Packit Service 2b1f13
	}
Packit Service 2b1f13
    }
Packit Service 2b1f13
  XmuOptimizeArea(dst);
Packit Service 2b1f13
  XmuDestroyScanline(ins);
Packit Service 2b1f13
  XmuDestroyScanline(top);
Packit Service 2b1f13
Packit Service 2b1f13
  return (dst);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	XmuAreaAnd(dst, src)
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	dst - destination area
Packit Service 2b1f13
 *	src - source area
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 *	Executes And (intersection) of the areas
Packit Service 2b1f13
 */
Packit Service 2b1f13
XmuArea *
Packit Service 2b1f13
XmuAreaAnd(XmuArea *dst, XmuArea *src)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuScanline *z, *p, *Z, *P, *top;
Packit Service 2b1f13
Packit Service 2b1f13
  if (!dst || !src || dst == src)
Packit Service 2b1f13
    return (dst);
Packit Service 2b1f13
  if (!XmuValidArea(dst) || !XmuValidArea(src))
Packit Service 2b1f13
    {
Packit Service 2b1f13
      XmuDestroyScanlineList(dst->scanline);
Packit Service 2b1f13
      dst->scanline = (XmuScanline *)NULL;
Packit Service 2b1f13
      return (dst);
Packit Service 2b1f13
    }
Packit Service 2b1f13
  z = p = dst->scanline;
Packit Service 2b1f13
  Z = P = src->scanline;
Packit Service 2b1f13
  top = XmuNewScanline(dst->scanline->y, 0, 0);
Packit Service 2b1f13
  XmuScanlineCopy(top, dst->scanline);
Packit Service 2b1f13
Packit Service 2b1f13
  while (z)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      while (Z->next && Z->next->y < z->y)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  P = Z;
Packit Service 2b1f13
	  Z = Z->next;
Packit Service 2b1f13
	  if (Z->y >= p->y)
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      XmuScanline *q = XmuNewScanline(Z->y, 0, 0);
Packit Service 2b1f13
	      XmuScanlineCopy(q, Z);
Packit Service 2b1f13
Packit Service 2b1f13
	      XmuScanlineAnd(q, top);
Packit Service 2b1f13
	      if (p->y != P->y)
Packit Service 2b1f13
		{
Packit Service 2b1f13
		  XmuScanlineAnd(p, P);
Packit Service 2b1f13
		  p->y = XmuMax(p->y, P->y);
Packit Service 2b1f13
		}
Packit Service 2b1f13
	      p->next = q;
Packit Service 2b1f13
	      q->next = z;
Packit Service 2b1f13
	      p = q;
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	}
Packit Service 2b1f13
      if (!z->next)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  z->y = XmuMax(z->y, Z->y);
Packit Service 2b1f13
	  break;
Packit Service 2b1f13
        }
Packit Service 2b1f13
      while (Z->y >= z->next->y)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  if (z == dst->scanline)
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      p = dst->scanline = dst->scanline->next;
Packit Service 2b1f13
	      XmuDestroyScanline(z);
Packit Service 2b1f13
	      z = dst->scanline;
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	  else
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      p->next = z->next;
Packit Service 2b1f13
	      XmuDestroyScanline(z);
Packit Service 2b1f13
	      z = p;
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	  if (!z || !z->next)
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      XmuOptimizeArea(dst);
Packit Service 2b1f13
	      XmuDestroyScanline(top);
Packit Service 2b1f13
Packit Service 2b1f13
	      return (dst);
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	}
Packit Service 2b1f13
      if (Z->y > p->y)
Packit Service 2b1f13
	z->y = XmuMax(z->y, Z->y);
Packit Service 2b1f13
      if (top->y != z->y)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  XmuScanlineCopy(top, z);
Packit Service 2b1f13
	  top->y = z->y;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      XmuScanlineAnd(z, Z);
Packit Service 2b1f13
      p = z;
Packit Service 2b1f13
      z = z->next;
Packit Service 2b1f13
    }
Packit Service 2b1f13
  XmuOptimizeArea(dst);
Packit Service 2b1f13
  XmuDestroyScanline(top);
Packit Service 2b1f13
Packit Service 2b1f13
  return (dst);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *   XmuValidArea(area)
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	area - area to verify
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 *	Verifies if the area is valid and/or useful
Packit Service 2b1f13
 */
Packit Service 2b1f13
Bool
Packit Service 2b1f13
XmuValidArea(XmuArea *area)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuScanline *at;
Packit Service 2b1f13
Packit Service 2b1f13
  if (!area || !area->scanline)
Packit Service 2b1f13
    return (False);
Packit Service 2b1f13
Packit Service 2b1f13
  at = area->scanline;
Packit Service 2b1f13
  while (at)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      if (XmuValidScanline(at))
Packit Service 2b1f13
	return (True);
Packit Service 2b1f13
      at = at->next;
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  return (False);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	XmuValidScanline
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	scanline - scanline to verify
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 *	Verifies if a scanline is useful
Packit Service 2b1f13
 */
Packit Service 2b1f13
Bool
Packit Service 2b1f13
XmuValidScanline(XmuScanline *scanline)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuSegment *z;
Packit Service 2b1f13
Packit Service 2b1f13
  if (!scanline)
Packit Service 2b1f13
    return (False);
Packit Service 2b1f13
Packit Service 2b1f13
  z = scanline->segment;
Packit Service 2b1f13
  while (z)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      if (XmuValidSegment(z))
Packit Service 2b1f13
	return (True);
Packit Service 2b1f13
      z = z->next;
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  return (False);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *   XmuScanlineEqu
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	s1 - scanline 1
Packit Service 2b1f13
 *	s2 - scanline 2
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 *	Checks if s1 and s2 are equal
Packit Service 2b1f13
 */
Packit Service 2b1f13
Bool
Packit Service 2b1f13
XmuScanlineEqu(XmuScanline *s1, XmuScanline *s2)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuSegment *z, *Z;
Packit Service 2b1f13
Packit Service 2b1f13
  if ((!s1 && !s2) || s1 == s2)
Packit Service 2b1f13
    return (True);
Packit Service 2b1f13
  if (!s1 || !s2)
Packit Service 2b1f13
    return (False);
Packit Service 2b1f13
Packit Service 2b1f13
  z = s1->segment;
Packit Service 2b1f13
  Z = s2->segment;
Packit Service 2b1f13
Packit Service 2b1f13
  /*CONSTCOND*/
Packit Service 2b1f13
  while (1)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      if (!z && !Z)
Packit Service 2b1f13
	return (True);
Packit Service 2b1f13
      if (!z || !Z)
Packit Service 2b1f13
	return (False);
Packit Service 2b1f13
      if (!XmuSegmentEqu(z, Z))
Packit Service 2b1f13
	return (False);
Packit Service 2b1f13
      z = z->next;
Packit Service 2b1f13
      Z = Z->next;
Packit Service 2b1f13
    }
Packit Service 2b1f13
  /*NOTREACHED*/
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	XmuNewSegment
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	x1 - coordinates of the segment
Packit Service 2b1f13
 *	x2 - ""
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 *	Creates a new segments with the coordinates x1 and x2
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Returns:
Packit Service 2b1f13
 *	New Segment of NULL
Packit Service 2b1f13
 */
Packit Service 2b1f13
XmuSegment *
Packit Service 2b1f13
XmuNewSegment(int x1, int x2)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuSegment *segment;
Packit Service 2b1f13
Packit Service 2b1f13
  if ((segment = (XmuSegment *)XtMalloc(sizeof(XmuSegment))) == NULL)
Packit Service 2b1f13
    return (segment);
Packit Service 2b1f13
Packit Service 2b1f13
  segment->x1 = x1;
Packit Service 2b1f13
  segment->x2 = x2;
Packit Service 2b1f13
  segment->next = (XmuSegment *)NULL;
Packit Service 2b1f13
Packit Service 2b1f13
  return (segment);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	XmuDestroySegmentList
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	segment - Segment to destroy
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 *	Frees the memory used by the list headed by segment
Packit Service 2b1f13
 */
Packit Service 2b1f13
void
Packit Service 2b1f13
XmuDestroySegmentList(XmuSegment *segment)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuSegment *z;
Packit Service 2b1f13
Packit Service 2b1f13
  if (!segment)
Packit Service 2b1f13
    return;
Packit Service 2b1f13
Packit Service 2b1f13
  while (segment)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      z = segment;
Packit Service 2b1f13
      segment = segment->next;
Packit Service 2b1f13
      XmuDestroySegment(z);
Packit Service 2b1f13
    }
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	XmuScanlineCopy
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	dst - destination scanline
Packit Service 2b1f13
 *	src - source scanline
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 *	Makes dst contain the same data as src
Packit Service 2b1f13
 */
Packit Service 2b1f13
XmuScanline *
Packit Service 2b1f13
XmuScanlineCopy(XmuScanline *dst, XmuScanline *src)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuSegment *z, *p, *Z;
Packit Service 2b1f13
Packit Service 2b1f13
  if (!dst || !src || dst == src)
Packit Service 2b1f13
    return (dst);
Packit Service 2b1f13
Packit Service 2b1f13
  z = p = dst->segment;
Packit Service 2b1f13
  Z = src->segment;
Packit Service 2b1f13
Packit Service 2b1f13
  /*CONSTCOND*/
Packit Service 2b1f13
  while (1)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      if (!Z)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  if (z == dst->segment)
Packit Service 2b1f13
	    dst->segment = (XmuSegment *)NULL;
Packit Service 2b1f13
	  else
Packit Service 2b1f13
	    p->next = (XmuSegment *)NULL;
Packit Service 2b1f13
	  XmuDestroySegmentList(z);
Packit Service 2b1f13
	  return (dst);
Packit Service 2b1f13
	}
Packit Service 2b1f13
      if (z)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  z->x1 = Z->x1;
Packit Service 2b1f13
	  z->x2 = Z->x2;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      else
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  z = XmuNewSegment(Z->x1, Z->x2);
Packit Service 2b1f13
	  if (p == dst->segment && !dst->segment)
Packit Service 2b1f13
	    p = dst->segment = z;
Packit Service 2b1f13
	  else
Packit Service 2b1f13
	    p->next = z;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      p = z;
Packit Service 2b1f13
      z = z->next;
Packit Service 2b1f13
      Z = Z->next;
Packit Service 2b1f13
    }
Packit Service 2b1f13
  /*NOTREACHED*/
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	XmuAppendSegment
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	segment - destination segment
Packit Service 2b1f13
 *	append  - segment to add
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 *	Adds a copy of the append list at the end of the segment list
Packit Service 2b1f13
 */
Packit Service 2b1f13
Bool
Packit Service 2b1f13
XmuAppendSegment(XmuSegment *segment, XmuSegment *append)
Packit Service 2b1f13
{
Packit Service 2b1f13
  if (!segment || !append)
Packit Service 2b1f13
    return (False);
Packit Service 2b1f13
Packit Service 2b1f13
  if (segment->next)
Packit Service 2b1f13
    /* Should not happen! */
Packit Service 2b1f13
    XmuDestroySegmentList(segment->next);
Packit Service 2b1f13
Packit Service 2b1f13
  while (append)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      if (XmuValidSegment(append))
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  if ((segment->next = XmuNewSegment(append->x1, append->x2)) == NULL)
Packit Service 2b1f13
	    return (False);
Packit Service 2b1f13
	  segment = segment->next;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      append = append->next;
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  return (True);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	XmuOptimizeScanline
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	scanline - scanline to optimize
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 *	  Some functions, when transforming Segments of Scanlines, left these
Packit Service 2b1f13
 *	with unnecessary data (that may cause error in these same functions).
Packit Service 2b1f13
 *	  This function corrects these incorrect segments.
Packit Service 2b1f13
 */
Packit Service 2b1f13
XmuScanline *
Packit Service 2b1f13
XmuOptimizeScanline(XmuScanline *scanline)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuSegment *z, *p;
Packit Service 2b1f13
Packit Service 2b1f13
  while (scanline->segment && !XmuValidSegment(scanline->segment))
Packit Service 2b1f13
    {
Packit Service 2b1f13
      XmuSegment *s = scanline->segment;
Packit Service 2b1f13
Packit Service 2b1f13
      scanline->segment = scanline->segment->next;
Packit Service 2b1f13
      XmuDestroySegment(s);
Packit Service 2b1f13
    }
Packit Service 2b1f13
  for (z = p = scanline->segment; z; p = z, z = z->next)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      if (!XmuValidSegment(z))
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  p->next = z->next;
Packit Service 2b1f13
	  XmuDestroySegment(z);
Packit Service 2b1f13
	  z = p;
Packit Service 2b1f13
	}
Packit Service 2b1f13
    }
Packit Service 2b1f13
  return (scanline);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Name:
Packit Service 2b1f13
 *	XmuScanlineNot(scanline, minx, maxx)
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	scanline - scanlines operate
Packit Service 2b1f13
 *	minx	 - minimum x coordinate
Packit Service 2b1f13
 *	maxx	 - maximum x coordinate
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 *         (minx)                                                        (maxx)
Packit Service 2b1f13
 *           +                                                             +
Packit Service 2b1f13
 * (input)         +---------+     +--------+        +--------+
Packit Service 2b1f13
 * (output)  +-----+         +-----+        +--------+        +------------+
Packit Service 2b1f13
 */
Packit Service 2b1f13
XmuScanline *
Packit Service 2b1f13
XmuScanlineNot(XmuScanline *scanline, int minx, int maxx)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuSegment *z;
Packit Service 2b1f13
  static XmuSegment x = { 0, 0, NULL };
Packit Service 2b1f13
  static XmuScanline and = { 0, &x, NULL };
Packit Service 2b1f13
Packit Service 2b1f13
  if (!scanline)
Packit Service 2b1f13
    return (scanline);
Packit Service 2b1f13
Packit Service 2b1f13
  XmuOptimizeScanline(scanline);
Packit Service 2b1f13
  if (minx > maxx)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      minx ^= maxx; maxx ^= minx; minx ^= maxx;
Packit Service 2b1f13
    }
Packit Service 2b1f13
  and.segment->x1 = minx;
Packit Service 2b1f13
  and.segment->x2 = maxx;
Packit Service 2b1f13
  XmuScanlineAnd(scanline, &and);
Packit Service 2b1f13
  if (!scanline->segment)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      scanline->segment = XmuNewSegment(minx, maxx);
Packit Service 2b1f13
      return (scanline);
Packit Service 2b1f13
    }
Packit Service 2b1f13
  z = scanline->segment;
Packit Service 2b1f13
  if (z->x1 != minx)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      XmuSegment *q = XmuNewSegment(minx, z->x1);
Packit Service 2b1f13
Packit Service 2b1f13
      q->next = z;
Packit Service 2b1f13
      scanline->segment = q;
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  /*CONSTCOND*/
Packit Service 2b1f13
  while (1)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      z->x1 = z->x2;
Packit Service 2b1f13
      if (!z->next)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  z->x2 = maxx;
Packit Service 2b1f13
	  break;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      z->x2 = z->next->x1;
Packit Service 2b1f13
      if (z->next->x2 == maxx)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  XmuDestroySegment(z->next);
Packit Service 2b1f13
	  z->next = (XmuSegment *)NULL;
Packit Service 2b1f13
	  break;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      z = z->next;
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  return (scanline);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
Packit Service 2b1f13
#ifndef notdef
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	XmuScanlineOrSegment
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	dst - destionation scanline
Packit Service 2b1f13
 *	src - source segment
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 * (input)      +-----------+  +--------+    +---------+
Packit Service 2b1f13
 * (src)              +-------------------+
Packit Service 2b1f13
 * (output)     +-------------------------+  +---------+
Packit Service 2b1f13
 */
Packit Service 2b1f13
XmuScanline *
Packit Service 2b1f13
XmuScanlineOrSegment(XmuScanline *dst, XmuSegment *src)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuSegment *z, *p, ins;
Packit Service 2b1f13
Packit Service 2b1f13
  if (!src || !dst || !XmuValidSegment(src))
Packit Service 2b1f13
    return (dst);
Packit Service 2b1f13
Packit Service 2b1f13
  if (!dst->segment)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      dst->segment = XmuNewSegment(src->x1, src->x2);
Packit Service 2b1f13
      return (dst);
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  z = p = dst->segment;
Packit Service 2b1f13
  ins.x1 = src->x1;
Packit Service 2b1f13
  ins.x2 = src->x2;
Packit Service 2b1f13
Packit Service 2b1f13
  /*CONSTCOND*/
Packit Service 2b1f13
  while (1)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      if (!z)
Packit Service 2b1f13
	{
Packit Service 2b1f13
            XmuSegment *q = XmuNewSegment(ins.x1, ins.x2);
Packit Service 2b1f13
Packit Service 2b1f13
	    if (p == dst->segment && z == p)
Packit Service 2b1f13
	      dst->segment = q;
Packit Service 2b1f13
	    else
Packit Service 2b1f13
	      p->next = q;
Packit Service 2b1f13
	    break;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      else if (ins.x2 < z->x1)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  XmuSegment *q = XmuNewSegment(ins.x1, ins.x2);
Packit Service 2b1f13
Packit Service 2b1f13
	  if (p == dst->segment && z == p)
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      q->next = dst->segment;
Packit Service 2b1f13
	      dst->segment = q;
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	  else
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      p->next = q;
Packit Service 2b1f13
	      q->next = z;
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	  break;
Packit Service 2b1f13
        }
Packit Service 2b1f13
      else if (ins.x2 <= z->x2)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  z->x1 = XmuMin(z->x1, ins.x1);
Packit Service 2b1f13
	  break;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      else if (ins.x1 <= z->x2)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  ins.x1 = XmuMin(z->x1, ins.x1);
Packit Service 2b1f13
	  if (!z->next)
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      z->x1 = ins.x1;
Packit Service 2b1f13
	      z->x2 = ins.x2;
Packit Service 2b1f13
	      break;
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	  else
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      if (z == dst->segment)
Packit Service 2b1f13
		{
Packit Service 2b1f13
		  p = dst->segment = dst->segment->next;
Packit Service 2b1f13
		  XmuDestroySegment(z);
Packit Service 2b1f13
		  z = dst->segment;
Packit Service 2b1f13
		  continue;
Packit Service 2b1f13
		}
Packit Service 2b1f13
	      else
Packit Service 2b1f13
		{
Packit Service 2b1f13
		  p->next = z->next;
Packit Service 2b1f13
		  XmuDestroySegment(z);
Packit Service 2b1f13
		  z = p;
Packit Service 2b1f13
		}
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	}
Packit Service 2b1f13
      p = z;
Packit Service 2b1f13
      z = z->next;
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  return (dst);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	XmuScanlineAndSegment
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	dst - destination scanline
Packit Service 2b1f13
 *	src - source segment
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 * (input)      +------------+   +------+     +----------+
Packit Service 2b1f13
 * (src)             +---------------------+
Packit Service 2b1f13
 * (output)          +-------+   +------+
Packit Service 2b1f13
 */
Packit Service 2b1f13
XmuScanline *
Packit Service 2b1f13
XmuScanlineAndSegment(XmuScanline *dst, XmuSegment *src)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuSegment *z, *p;
Packit Service 2b1f13
Packit Service 2b1f13
  if (!dst || !src)
Packit Service 2b1f13
    return (dst);
Packit Service 2b1f13
Packit Service 2b1f13
  if (!XmuValidSegment(src))
Packit Service 2b1f13
    {
Packit Service 2b1f13
      XmuDestroySegmentList(dst->segment);
Packit Service 2b1f13
      dst->segment = (XmuSegment *)NULL;
Packit Service 2b1f13
      return (dst);
Packit Service 2b1f13
    }
Packit Service 2b1f13
  if (!dst->segment)
Packit Service 2b1f13
    return (dst);
Packit Service 2b1f13
Packit Service 2b1f13
  z = p = dst->segment;
Packit Service 2b1f13
  while (z)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      if (src->x2 <= z->x1 || src->x1 >= z->x2)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  if (z == dst->segment)
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      p = dst->segment = dst->segment->next;
Packit Service 2b1f13
	      XmuDestroySegment(z);
Packit Service 2b1f13
	      z = dst->segment;
Packit Service 2b1f13
	      continue;
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	  else
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      p->next = z->next;
Packit Service 2b1f13
	      XmuDestroySegment(z);
Packit Service 2b1f13
	      z = p;
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	}
Packit Service 2b1f13
      else
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  z->x1 = XmuMax(z->x1, src->x1);
Packit Service 2b1f13
	  z->x2 = XmuMin(z->x2, src->x2);
Packit Service 2b1f13
	}
Packit Service 2b1f13
      p = z;
Packit Service 2b1f13
      z = z->next;
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  return (dst);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	XmuScanlineXorSegment
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	dst - destionation scanline
Packit Service 2b1f13
 *	src - source segment
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Descriptipn:
Packit Service 2b1f13
 * (input)     +------------+  +----------+    +-----------+
Packit Service 2b1f13
 * (src)           +------------------------+
Packit Service 2b1f13
 * (output)    +---+        +--+          +-+  +-----------+
Packit Service 2b1f13
 */
Packit Service 2b1f13
XmuScanline *
Packit Service 2b1f13
XmuScanlineXorSegment(XmuScanline *dst, XmuSegment *src)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuSegment *p, *z, ins;
Packit Service 2b1f13
  int tmp1, tmp2;
Packit Service 2b1f13
Packit Service 2b1f13
  if (!dst || !src || !XmuValidSegment(src))
Packit Service 2b1f13
    return (dst);
Packit Service 2b1f13
  if (!dst->segment)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      dst->segment = XmuNewSegment(src->x1, src->x2);
Packit Service 2b1f13
      return (dst);
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  p = z = dst->segment;
Packit Service 2b1f13
  ins.x1 = src->x1;
Packit Service 2b1f13
  ins.x2 = src->x2;
Packit Service 2b1f13
Packit Service 2b1f13
  /*CONSTCOND*/
Packit Service 2b1f13
  while (1)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      if (!XmuValidSegment((&ins)))
Packit Service 2b1f13
	break;
Packit Service 2b1f13
      if (!z || ins.x2 < z->x1)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  XmuSegment *q = XmuNewSegment(ins.x1, ins.x2);
Packit Service 2b1f13
Packit Service 2b1f13
	  q->next = z;
Packit Service 2b1f13
	  if (z == dst->segment)
Packit Service 2b1f13
	    dst->segment = q;
Packit Service 2b1f13
	  else
Packit Service 2b1f13
	    p->next = q;
Packit Service 2b1f13
	  break;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      else if (ins.x2 == z->x1)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  z->x1 = ins.x1;
Packit Service 2b1f13
	  break;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      else if (ins.x1 < z->x2)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  if (ins.x1 < z->x1)
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      tmp1 = ins.x2;
Packit Service 2b1f13
	      tmp2 = z->x2;
Packit Service 2b1f13
	      ins.x2 = XmuMax(ins.x2, z->x2);
Packit Service 2b1f13
	      z->x2 = z->x1;
Packit Service 2b1f13
	      z->x1 = ins.x1;
Packit Service 2b1f13
	      ins.x1 = XmuMin(tmp1, tmp2);
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	  else if (ins.x1 > z->x1)
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      tmp1 = ins.x1;
Packit Service 2b1f13
	      ins.x1 = XmuMin(ins.x2, z->x2);
Packit Service 2b1f13
	      ins.x2 = XmuMax(z->x2, ins.x2);
Packit Service 2b1f13
	      z->x2 = tmp1;
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	  else	/* ins.x1 == z->x1 */
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      if (ins.x2 < z->x2)
Packit Service 2b1f13
		{
Packit Service 2b1f13
		  z->x1 = ins.x2;
Packit Service 2b1f13
		  break;
Packit Service 2b1f13
		}
Packit Service 2b1f13
	      else
Packit Service 2b1f13
		{
Packit Service 2b1f13
		  ins.x1 = z->x2;
Packit Service 2b1f13
		  if (z == dst->segment)
Packit Service 2b1f13
		    p = dst->segment = dst->segment->next;
Packit Service 2b1f13
		  else
Packit Service 2b1f13
		    p->next = z->next;
Packit Service 2b1f13
		  XmuDestroySegment(z);
Packit Service 2b1f13
		  z = p;
Packit Service 2b1f13
		  continue;
Packit Service 2b1f13
		}
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	}
Packit Service 2b1f13
      else if (ins.x1 == z->x2)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  ins.x1 = z->x1;
Packit Service 2b1f13
	  if (z == dst->segment)
Packit Service 2b1f13
	    p = dst->segment = dst->segment->next;
Packit Service 2b1f13
	  else
Packit Service 2b1f13
	    p->next = z->next;
Packit Service 2b1f13
	  XmuDestroySegment(z);
Packit Service 2b1f13
	  z = p;
Packit Service 2b1f13
	  continue;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      p = z;
Packit Service 2b1f13
      z = z->next;
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  return (dst);
Packit Service 2b1f13
}
Packit Service 2b1f13
#endif /* notdef */
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	ScanlineOr
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	dst - destionation scanline
Packit Service 2b1f13
 *	src - source scanline
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 * (input)    +--------------+  +-----+    +----------+
Packit Service 2b1f13
 * (src)          +---------------------+       +-----------+
Packit Service 2b1f13
 * (output)   +-------------------------+  +----------------+
Packit Service 2b1f13
 */
Packit Service 2b1f13
XmuScanline *
Packit Service 2b1f13
XmuScanlineOr(XmuScanline *dst, XmuScanline *src)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuSegment *z, *p, *Z, ins;
Packit Service 2b1f13
Packit Service 2b1f13
  if (!src || !src->segment || !dst || dst == src)
Packit Service 2b1f13
    return (dst);
Packit Service 2b1f13
  if (!dst->segment)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      XmuScanlineCopy(dst, src);
Packit Service 2b1f13
      return (dst);
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  z = p = dst->segment;
Packit Service 2b1f13
  Z = src->segment;
Packit Service 2b1f13
  ins.x1 = Z->x1;
Packit Service 2b1f13
  ins.x2 = Z->x2;
Packit Service 2b1f13
Packit Service 2b1f13
  /*CONSTCOND*/
Packit Service 2b1f13
  while (1)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      while (!XmuValidSegment((&ins)))
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  if ((Z = Z->next) == (XmuSegment *)NULL)
Packit Service 2b1f13
	    return (dst);
Packit Service 2b1f13
	  ins.x1 = Z->x1;
Packit Service 2b1f13
	  ins.x2 = Z->x2;
Packit Service 2b1f13
	}
Packit Service 2b1f13
        if (!z)
Packit Service 2b1f13
	  {
Packit Service 2b1f13
            XmuSegment *q = XmuNewSegment(ins.x1, ins.x2);
Packit Service 2b1f13
Packit Service 2b1f13
            if (p == dst->segment && z == p)
Packit Service 2b1f13
	      dst->segment = p = q;
Packit Service 2b1f13
            else
Packit Service 2b1f13
	      {
Packit Service 2b1f13
		p->next = q;
Packit Service 2b1f13
		p = q;
Packit Service 2b1f13
	      }
Packit Service 2b1f13
	    Z = Z->next;
Packit Service 2b1f13
	    XmuAppendSegment(p, Z);
Packit Service 2b1f13
	    break;
Packit Service 2b1f13
	  }
Packit Service 2b1f13
        else if (ins.x2 < z->x1)
Packit Service 2b1f13
	  {
Packit Service 2b1f13
	    XmuSegment *r = XmuNewSegment(ins.x1, ins.x2);
Packit Service 2b1f13
Packit Service 2b1f13
	    if (p == dst->segment && z == p)
Packit Service 2b1f13
	      {
Packit Service 2b1f13
		r->next = dst->segment;
Packit Service 2b1f13
		dst->segment = p = r;
Packit Service 2b1f13
	      }
Packit Service 2b1f13
	    else
Packit Service 2b1f13
	      {
Packit Service 2b1f13
		p->next = r;
Packit Service 2b1f13
		r->next = z;
Packit Service 2b1f13
		p = r;
Packit Service 2b1f13
	      }
Packit Service 2b1f13
	    Z = Z->next;
Packit Service 2b1f13
            if (!Z)
Packit Service 2b1f13
	      break;
Packit Service 2b1f13
            else
Packit Service 2b1f13
	      {
Packit Service 2b1f13
		ins.x1 = Z->x1;
Packit Service 2b1f13
		ins.x2 = Z->x2;
Packit Service 2b1f13
		continue;
Packit Service 2b1f13
	      }
Packit Service 2b1f13
	  }
Packit Service 2b1f13
	else if (ins.x2 <= z->x2)
Packit Service 2b1f13
	  {
Packit Service 2b1f13
	    z->x1 = XmuMin(z->x1, ins.x1);
Packit Service 2b1f13
	    Z = Z->next;
Packit Service 2b1f13
	    if (!Z)
Packit Service 2b1f13
	      break;
Packit Service 2b1f13
            else
Packit Service 2b1f13
	      {
Packit Service 2b1f13
		ins.x1 = Z->x1;
Packit Service 2b1f13
		ins.x2 = Z->x2;
Packit Service 2b1f13
		continue;
Packit Service 2b1f13
	      }
Packit Service 2b1f13
	  }
Packit Service 2b1f13
	else if (ins.x1 <= z->x2)
Packit Service 2b1f13
	  {
Packit Service 2b1f13
	    ins.x1 = XmuMin(z->x1, ins.x1);
Packit Service 2b1f13
	    if (!z->next)
Packit Service 2b1f13
	      {
Packit Service 2b1f13
		z->x1 = ins.x1;
Packit Service 2b1f13
		z->x2 = ins.x2;
Packit Service 2b1f13
		p = z;
Packit Service 2b1f13
		Z = Z->next;
Packit Service 2b1f13
		XmuAppendSegment(p, Z);
Packit Service 2b1f13
		break;
Packit Service 2b1f13
	      }
Packit Service 2b1f13
            else
Packit Service 2b1f13
	      {
Packit Service 2b1f13
		if (z == dst->segment)
Packit Service 2b1f13
		  {
Packit Service 2b1f13
		    p = dst->segment = dst->segment->next;
Packit Service 2b1f13
		    XmuDestroySegment(z);
Packit Service 2b1f13
		    z = p;
Packit Service 2b1f13
		    continue;
Packit Service 2b1f13
		  }
Packit Service 2b1f13
                else
Packit Service 2b1f13
		  {
Packit Service 2b1f13
		    p->next = z->next;
Packit Service 2b1f13
		    XmuDestroySegment(z);
Packit Service 2b1f13
		    z = p;
Packit Service 2b1f13
		  }
Packit Service 2b1f13
	      }
Packit Service 2b1f13
	  }
Packit Service 2b1f13
	p = z;
Packit Service 2b1f13
	z = z->next;
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  return (dst);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	XmuScanlineAnd
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	dst - destination scanline
Packit Service 2b1f13
 *	src - source scanline
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 * (input)    +--------------+  +-----+    +----------+
Packit Service 2b1f13
 * (src)          +---------------------+       +-----------+
Packit Service 2b1f13
 * (output)       +----------+  +-----+         +-----+
Packit Service 2b1f13
 */
Packit Service 2b1f13
XmuScanline *
Packit Service 2b1f13
XmuScanlineAnd(XmuScanline *dst, XmuScanline *src)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuSegment  *z, *p, *Z;
Packit Service 2b1f13
Packit Service 2b1f13
  if (!dst || !src || dst == src || !dst->segment) {
Packit Service 2b1f13
        return (dst);
Packit Service 2b1f13
  }
Packit Service 2b1f13
  if (!src->segment)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      XmuDestroySegmentList(dst->segment);
Packit Service 2b1f13
      dst->segment = (XmuSegment *)NULL;
Packit Service 2b1f13
      return (dst);
Packit Service 2b1f13
    }
Packit Service 2b1f13
  z = p = dst->segment;
Packit Service 2b1f13
  Z = src->segment;
Packit Service 2b1f13
Packit Service 2b1f13
  while (z)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      while (!XmuValidSegment(Z) || Z->x2 <= z->x1)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  Z = Z->next;
Packit Service 2b1f13
	  if (!Z)
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      if (z == dst->segment)
Packit Service 2b1f13
		dst->segment = (XmuSegment *)NULL;
Packit Service 2b1f13
	      else
Packit Service 2b1f13
		p->next = (XmuSegment *)0;
Packit Service 2b1f13
	      XmuDestroySegmentList(z);
Packit Service 2b1f13
	      return (dst);
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	}
Packit Service 2b1f13
      if (Z->x1 >= z->x2)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  if (z == dst->segment)
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      p = dst->segment = dst->segment->next;
Packit Service 2b1f13
	      XmuDestroySegment(z);
Packit Service 2b1f13
	      z = dst->segment;
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	  else
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      p->next = z->next;
Packit Service 2b1f13
	      XmuDestroySegment(z);
Packit Service 2b1f13
	      z = p->next;
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	  if (!z)
Packit Service 2b1f13
	    return (dst);
Packit Service 2b1f13
	  else
Packit Service 2b1f13
	    continue;
Packit Service 2b1f13
	}
Packit Service 2b1f13
        z->x1 = XmuMax(z->x1, Z->x1);
Packit Service 2b1f13
	if (z->x2 > Z->x2)
Packit Service 2b1f13
	  {
Packit Service 2b1f13
            if (Z->next)
Packit Service 2b1f13
	      {
Packit Service 2b1f13
                XmuSegment *q = XmuNewSegment(Z->x2, z->x2);
Packit Service 2b1f13
Packit Service 2b1f13
		q->next = z->next;
Packit Service 2b1f13
		z->next = q;
Packit Service 2b1f13
	      }
Packit Service 2b1f13
	    z->x2 = Z->x2;
Packit Service 2b1f13
	  }
Packit Service 2b1f13
	p = z;
Packit Service 2b1f13
	z = z->next;
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  return (dst);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	ScanlineXor
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	dst - destination scanline
Packit Service 2b1f13
 *	src - source scanline
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 * (input)    +--------------+  +-----+    +----------+
Packit Service 2b1f13
 * (src)          +---------------------+       +-----------+
Packit Service 2b1f13
 * (output)   +---+          +--+     +-+  +----+     +-----+
Packit Service 2b1f13
 */
Packit Service 2b1f13
XmuScanline *
Packit Service 2b1f13
XmuScanlineXor(XmuScanline *dst, XmuScanline *src)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuSegment *z, *p, *Z, ins;
Packit Service 2b1f13
  int tmp1, tmp2;
Packit Service 2b1f13
Packit Service 2b1f13
  if (!src || !dst || !src->segment)
Packit Service 2b1f13
    return (dst);
Packit Service 2b1f13
  if (src == dst)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      XmuDestroySegmentList(dst->segment);
Packit Service 2b1f13
      dst->segment = (XmuSegment *)NULL;
Packit Service 2b1f13
      return (dst);
Packit Service 2b1f13
    }
Packit Service 2b1f13
  if (!dst->segment)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      XmuScanlineCopy(dst, src);
Packit Service 2b1f13
      return (dst);
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  z = p = dst->segment;
Packit Service 2b1f13
  Z = src->segment;
Packit Service 2b1f13
  ins.x1 = Z->x1;
Packit Service 2b1f13
  ins.x2 = Z->x2;
Packit Service 2b1f13
Packit Service 2b1f13
  /*CONSTCOND*/
Packit Service 2b1f13
  while (1)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      while (!XmuValidSegment((&ins)))
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  if ((Z = Z->next) == (XmuSegment *)NULL)
Packit Service 2b1f13
	    return (dst);
Packit Service 2b1f13
	  ins.x1 = Z->x1;
Packit Service 2b1f13
	  ins.x2 = Z->x2;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      if (!z)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  XmuSegment *q = XmuNewSegment(ins.x1, ins.x2);
Packit Service 2b1f13
Packit Service 2b1f13
            if (!dst->segment)
Packit Service 2b1f13
	      dst->segment = q;
Packit Service 2b1f13
            else
Packit Service 2b1f13
	      p->next = q;
Packit Service 2b1f13
	    p = q;
Packit Service 2b1f13
	    Z = Z->next;
Packit Service 2b1f13
	    XmuAppendSegment(p, Z);
Packit Service 2b1f13
	    break;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      else if (ins.x2 < z->x1)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  XmuSegment *q = XmuNewSegment(ins.x1, ins.x2);
Packit Service 2b1f13
Packit Service 2b1f13
	  q->next = z;
Packit Service 2b1f13
	  if (z == dst->segment)
Packit Service 2b1f13
	    dst->segment = q;
Packit Service 2b1f13
	  else
Packit Service 2b1f13
	    p->next = q;
Packit Service 2b1f13
	  if ((Z = Z->next) == (XmuSegment *)NULL)
Packit Service 2b1f13
	    return (dst);
Packit Service 2b1f13
Packit Service 2b1f13
	  p = q;
Packit Service 2b1f13
	  ins.x1 = Z->x1;
Packit Service 2b1f13
	  ins.x2 = Z->x2;
Packit Service 2b1f13
	  continue;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      else if (ins.x2 == z->x1)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  z->x1 = ins.x1;
Packit Service 2b1f13
	  if ((Z = Z->next) == (XmuSegment *)NULL)
Packit Service 2b1f13
	    break;
Packit Service 2b1f13
	  ins.x1 = Z->x1;
Packit Service 2b1f13
	  ins.x2 = Z->x2;
Packit Service 2b1f13
	  continue;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      else if (ins.x1 < z->x2)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  if (ins.x1 == z->x1)
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      if (ins.x2 < z->x2)
Packit Service 2b1f13
		{
Packit Service 2b1f13
		  z->x1 = ins.x2;
Packit Service 2b1f13
		  if ((Z = Z->next) == (XmuSegment *)NULL)
Packit Service 2b1f13
		    break;
Packit Service 2b1f13
		  ins.x1 = Z->x1;
Packit Service 2b1f13
		  ins.x2 = Z->x2;
Packit Service 2b1f13
		  continue;
Packit Service 2b1f13
		}
Packit Service 2b1f13
	      else
Packit Service 2b1f13
		{
Packit Service 2b1f13
		  ins.x1 = z->x2;
Packit Service 2b1f13
		  if (z == dst->segment)
Packit Service 2b1f13
		    p = dst->segment = dst->segment->next;
Packit Service 2b1f13
		  else
Packit Service 2b1f13
		    p->next = z->next;
Packit Service 2b1f13
		  XmuDestroySegment(z);
Packit Service 2b1f13
		  z = p;
Packit Service 2b1f13
		  continue;
Packit Service 2b1f13
		}
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	  else
Packit Service 2b1f13
	    {
Packit Service 2b1f13
	      if (Z->x2 < z->x2)
Packit Service 2b1f13
		{
Packit Service 2b1f13
		  XmuSegment  *q = XmuNewSegment(XmuMin(ins.x1, z->x1),
Packit Service 2b1f13
						 XmuMax(z->x1, ins.x1));
Packit Service 2b1f13
Packit Service 2b1f13
		  q->next = z;
Packit Service 2b1f13
		  if (z == dst->segment)
Packit Service 2b1f13
		    dst->segment = q;
Packit Service 2b1f13
		  else
Packit Service 2b1f13
		    p->next = q;
Packit Service 2b1f13
		  ins.x1 = z->x2;
Packit Service 2b1f13
		  z->x1 = ins.x2;
Packit Service 2b1f13
		  p = q;
Packit Service 2b1f13
		  continue;
Packit Service 2b1f13
		}
Packit Service 2b1f13
	      else
Packit Service 2b1f13
		{
Packit Service 2b1f13
		  tmp1 = ins.x2;
Packit Service 2b1f13
		  tmp2 = z->x2;
Packit Service 2b1f13
		  ins.x2 = XmuMax(ins.x2, z->x2);
Packit Service 2b1f13
		  z->x2 = XmuMax(z->x1, ins.x1);
Packit Service 2b1f13
		  z->x1 = XmuMin(ins.x1, z->x1);
Packit Service 2b1f13
		  ins.x1 = XmuMin(tmp1, tmp2);
Packit Service 2b1f13
		}
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	}
Packit Service 2b1f13
      else if (ins.x1 == z->x2)
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  ins.x1 = z->x1;
Packit Service 2b1f13
	  if (z == dst->segment)
Packit Service 2b1f13
	    p = dst->segment = dst->segment->next;
Packit Service 2b1f13
	  else
Packit Service 2b1f13
	    p->next = z->next;
Packit Service 2b1f13
	  XmuDestroySegment(z);
Packit Service 2b1f13
	  z = p;
Packit Service 2b1f13
	  continue;
Packit Service 2b1f13
	}
Packit Service 2b1f13
      p = z;
Packit Service 2b1f13
      z = z->next;
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  return (dst);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	XmuNewScanline
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	y  - y coordinate
Packit Service 2b1f13
 *	x1 - left coordinate
Packit Service 2b1f13
 *	x2 - right coordinate
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 *	Creates a new Scanline
Packit Service 2b1f13
 */
Packit Service 2b1f13
XmuScanline *
Packit Service 2b1f13
XmuNewScanline(int y, int x1, int x2)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuScanline *scanline;
Packit Service 2b1f13
Packit Service 2b1f13
  scanline = (XmuScanline *)XtMalloc(sizeof(XmuScanline));
Packit Service 2b1f13
  scanline->y = y;
Packit Service 2b1f13
  if (x1 < x2)
Packit Service 2b1f13
    scanline->segment = XmuNewSegment(x1, x2);
Packit Service 2b1f13
  else
Packit Service 2b1f13
    scanline->segment = (XmuSegment *)NULL;
Packit Service 2b1f13
Packit Service 2b1f13
  scanline->next = (XmuScanline *)NULL;
Packit Service 2b1f13
Packit Service 2b1f13
  return (scanline);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	XmuDestroyScanlineList
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	scanline - scanline list to destroy
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 *	Destroy a scanline list
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Observation:
Packit Service 2b1f13
 *	Use as follow:
Packit Service 2b1f13
 *	XmuDestroyScanlineList(area->scanline);
Packit Service 2b1f13
 *	area->scanline = (XmuScanline *)NULL;
Packit Service 2b1f13
 */
Packit Service 2b1f13
void
Packit Service 2b1f13
XmuDestroyScanlineList(XmuScanline *scanline)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuScanline *z;
Packit Service 2b1f13
Packit Service 2b1f13
  if (!scanline)
Packit Service 2b1f13
    return;
Packit Service 2b1f13
Packit Service 2b1f13
  while (scanline)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      z = scanline;
Packit Service 2b1f13
      scanline = scanline->next;
Packit Service 2b1f13
      XmuDestroyScanline(z);
Packit Service 2b1f13
    }
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * Function:
Packit Service 2b1f13
 *	XmuOptimizeArea
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Parameters:
Packit Service 2b1f13
 *	area - area to optimize
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * Description:
Packit Service 2b1f13
 *	  Optimizes an area. This function is called when finishing a
Packit Service 2b1f13
 *	operation between areas, since they can end with redundant data,
Packit Service 2b1f13
 *	and the algorithms for area combination waits a area with
Packit Service 2b1f13
 *	correct data (but can left unnecessary data in the area, to avoid
Packit Service 2b1f13
 *	to much paranoia tests).
Packit Service 2b1f13
 */
Packit Service 2b1f13
XmuArea *XmuOptimizeArea(XmuArea *area)
Packit Service 2b1f13
{
Packit Service 2b1f13
  XmuScanline *pr, *at;
Packit Service 2b1f13
Packit Service 2b1f13
  if (!area || !area->scanline)
Packit Service 2b1f13
    return (area);
Packit Service 2b1f13
Packit Service 2b1f13
  if (!area->scanline->next)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      XmuDestroyScanlineList(area->scanline);
Packit Service 2b1f13
      area->scanline = (XmuScanline *)0;
Packit Service 2b1f13
      return (area);
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  pr = area->scanline;
Packit Service 2b1f13
  at = area->scanline->next;
Packit Service 2b1f13
  while (area->scanline && (!XmuValidScanline(area->scanline)
Packit Service 2b1f13
			    || (area->scanline->next && area->scanline->y
Packit Service 2b1f13
				>= area->scanline->next->y)))
Packit Service 2b1f13
    {
Packit Service 2b1f13
      area->scanline = area->scanline->next;
Packit Service 2b1f13
      XmuDestroyScanline(pr);
Packit Service 2b1f13
      pr = area->scanline;
Packit Service 2b1f13
      if (pr)
Packit Service 2b1f13
	at = pr->next;
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  for (; at; pr = at, at = at->next)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      if (XmuScanlineEqu(at, pr)
Packit Service 2b1f13
	  || (!XmuValidScanline(at) && !XmuValidScanline(pr))
Packit Service 2b1f13
	  || (at->next && at->y >= at->next->y))
Packit Service 2b1f13
	{
Packit Service 2b1f13
	  pr->next = at->next;
Packit Service 2b1f13
	  XmuDestroyScanline(at);
Packit Service 2b1f13
	  at = pr;
Packit Service 2b1f13
	}
Packit Service 2b1f13
    }
Packit Service 2b1f13
  if (pr && XmuValidScanline(pr))
Packit Service 2b1f13
    {
Packit Service 2b1f13
      XmuDestroySegmentList(pr->segment);
Packit Service 2b1f13
      pr->segment = (XmuSegment *)NULL;
Packit Service 2b1f13
    }
Packit Service 2b1f13
  if (area->scanline && !area->scanline->next)
Packit Service 2b1f13
    {
Packit Service 2b1f13
      XmuDestroyScanlineList(area->scanline);
Packit Service 2b1f13
      area->scanline = (XmuScanline *)NULL;
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
  return (area);
Packit Service 2b1f13
}