############################################################################
#
#	File:     wipe.icn
#
#	Subject:  Procedure to wipe window area
#
#	Author:   Ralph E. Griswold
#
#	Date:     May 2, 2001
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  wipe(window, color, direction, x, y, w, h)  "wipes" a rectangular area of
#  window to the specified color.  The direction of wiping can be any one of:
#
#	"right"		from left to right
#	"left"		from right to left
#	"down"		from top to bottom
#	"up		from bottom to top
#	"left-right"	from left and right toward center
#	"up-down"	from top and bottom toward center
#	"in"		from outside to inside
#
#  The default direction is "right".
#
#  The default color is the background color of the window.
#
#  x, y is the top left corner of the area and w and h are the width and
#  height. An omitted value defaults to the one for the entire window.
#
############################################################################
#
#  Requires:  Version 9 graphics
#
############################################################################

procedure wipe(window, color, direction, x1, y1, w, h)
   local x, y, x2, y2, fg

   /color := Bg(window)			# establish defaults
   /direction := "right"
   /x1 := 0
   /y1 := 0
   /w := WAttrib(window, "width")
   /h := WAttrib(window, "height")
   x2 := x1 + w
   y2 := y1 + h

   fg := Fg(window)				# save present foreground color
   Fg(window, color)				# set foreground for wiping

   if not(integer(x1) & integer(x2) & integer(y1) & integer(y2)) |
      (x1 > x2) | (y1 > y2) then stop("*** illegal coordinates in wipe()")

   case direction of {
      "right": {
         every x := x1 to x2 do {
            DrawLine(window, x, y1, x, y2)
            }
         }
      "left": {
         every x := x2 to x1 by -1 do {
            DrawLine(window, x, y1, x, y2)
            }
         }
      "left-right": {
         until (x2 < x1) do {
           DrawLine(window, x1, y1, x1, y2)
           DrawLine(window, x2, y1, x2, y2)
           x1 +:= 1
           x2 -:= 1
           }
         }
      "up-down": {
          until y2 < y1 do {
            DrawLine(window, x1, y1, x2, y1)
            DrawLine(window, x1, y2, x2, y2)
            y1 +:= 1
            y2 -:= 1
            }
         }
      "down": {
         every y := y1 to y2 do {
            DrawLine(window, x1, y, x2, y)
            }
         }
      "up": {
         every y := y2 to y1 by -1 do {
            DrawLine(window, x1, y, x2, y)
            }
         }
      "in": {
         until (x2 < x1) | (y2 < y1) do {
            DrawLine(window, x1, y1, x1, y2, x2, y2, x2, y1, x1, y1)
            x1 +:= 1
            x2 -:= 1
            y1 +:= 1
            y2 -:= 1
            }
         }
      default: stop("*** illegal direction specificaion in wipe()")
      }

   Fg(window, fg)			# restore foreground color

   return

end
