(FILECREATED "30-Jun-86 16:44:43" {PHYLUM}<BURTON>MAGNIFIER.;13 19020  

      changes to:  (FNS \SLOWMAGSHOW \EXPANDBITMAPBY4 \SLOWMAGSHOW1 MAGTRACK \FFAST4BIT 
			\SLOWEXPANDBITMAPBY4)
		   (MACROS MAGSHOW)
		   (VARS MAGNIFIERCOMS)

      previous date: "27-Jun-86 17:39:52" {PHYLUM}<BURTON>MAGNIFIER.;11)


(* Copyright (c) 1986 by Xerox Corporation. All rights reserved.)

(PRETTYCOMPRINT MAGNIFIERCOMS)

(RPAQQ MAGNIFIERCOMS ((FNS MAGNIFYW MAGTRACK \EXPANDBITMAPBY4SLOW \SLOWMAGSHOW ONFOURGRID 
			     \EXPANDBITMAPBY4 \SLOWMAGSHOW1 \FFAST4BIT)
			(CURSORS EMPTYCURSOR)
			(MACROS MAGSHOW)
			(ADDVARS (BackgroundMenuCommands ("Magnifier" (MAGNIFYW)
								      
		"for enlarging the screen around the cursor;
     click to start, click to stop.")))
			(VARS (BackgroundMenu))
			(DECLARE: EVAL@COMPILE DONTCOPY DONTEVAL@LOAD (FILES (LOADCOMP)
									     LLARRAYELT))))
(DEFINEQ

(MAGNIFYW
  [LAMBDA (WIN)                                            (* rrb "14-Mar-86 10:03")
    (PROG NIL
	    (OR (WINDOWP WIN)
		  (SETQ WIN (CREATEW (GETREGION 28 28 NIL (FUNCTION ONFOURGRID))
					 NIL 12)))
	    (WINDOWPROP WIN (QUOTE BUTTONEVENTFN)
			  (FUNCTION MAGTRACK))
	    (WINDOWPROP WIN (QUOTE NEWREGIONFN)
			  (FUNCTION ONFOURGRID))           (* make the background black so that the part of the 
							     window that isn't a multiple of 4 is black.)
	    (DSPTEXTURE BLACKSHADE WIN])

(MAGTRACK
  [LAMBDA (WIN)                                            (* rrb "30-Jun-86 15:30")

          (* * tracking function for a magnify window)



          (* * if the mouse goes down in the window, track until it goes down again.)


    (PROG ((WININTERIOR (DSPCLIPPINGREGION NIL WIN))
	     (WINEXTERIOR (WINDOWPROP WIN (QUOTE REGION)))
	     MAGWIDTH MAGHEIGHT WIDTH HEIGHT NEARCURSORBITMAP EXPANDEDBITMAP CURX CURY LFT BTM 
	     MOUSEBEENUP WINLFT WINBTM WINRGHT WINTOP)
	    (COND
	      ((LASTMOUSESTATE UP)
		(RETURN)))
	    (CLEARW WIN)
	    (SETQ WINLFT (fetch (REGION LEFT) of WINEXTERIOR))
	    (SETQ WINBTM (fetch (REGION BOTTOM) of WINEXTERIOR))
	    (SETQ WINRGHT (fetch (REGION PRIGHT) of WINEXTERIOR))
	    (SETQ WINTOP (fetch (REGION PTOP) of WINEXTERIOR))
	    [SETQ NEARCURSORBITMAP (BITMAPCREATE (SETQ WIDTH (QUOTIENT (SETQ MAGWIDTH
										 (fetch
										   (REGION WIDTH)
										    of WININTERIOR))
									       4))
						     (SETQ HEIGHT (QUOTIENT
							 (SETQ MAGHEIGHT (fetch (REGION HEIGHT)
									      of WININTERIOR))
							 4]
	    (SETQ EXPANDEDBITMAP (BITMAPCREATE MAGWIDTH MAGHEIGHT))
	    [ERSETQ (RESETFORM (CURSOR EMPTYCURSOR)
				   (until (COND
					      (MOUSEBEENUP (MOUSESTATE (NOT UP)))
					      ((MOUSESTATE UP)
						(SETQ MOUSEBEENUP T)
						NIL))
				      when (OR (NEQ CURX LASTMOUSEX)
						   (NEQ CURY LASTMOUSEY))
				      do (AND LFT (DRAWGRAYBOX (DIFFERENCE LFT 2)
								     (DIFFERENCE BTM 2)
								     (PLUS LFT WIDTH 2)
								     (PLUS BTM HEIGHT 2)
								     (SCREENBITMAP)
								     BLACKSHADE))
					   (SETQ CURX LASTMOUSEX)
					   (SETQ CURY LASTMOUSEY)
					   [SETQ LFT (IMAX 0 (IMIN (DIFFERENCE SCREENWIDTH 
										       WIDTH)
									 (DIFFERENCE CURX
										       (IQUOTIENT
											 WIDTH 2]
					   [SETQ BTM (IMAX 0 (IMIN (DIFFERENCE SCREENHEIGHT 
										       HEIGHT)
									 (DIFFERENCE CURY
										       (IQUOTIENT
											 HEIGHT 2]
					   (COND
					     ((OR (GEQ LFT WINRGHT)
						    (GEQ BTM WINTOP)
						    (GREATERP WINLFT (PLUS LFT WIDTH))
						    (GREATERP WINBTM (PLUS BTM HEIGHT)))
                                                             (* no overlap between cursor box and magnifier 
							     window.)
					       (MAGSHOW WIN LFT BTM WIDTH HEIGHT NEARCURSORBITMAP 
							EXPANDEDBITMAP))
					     (T (\SLOWMAGSHOW WIN LFT BTM WIDTH HEIGHT 
								NEARCURSORBITMAP EXPANDEDBITMAP 
								WINLFT WINBTM WINRGHT WINTOP)))
					   (DRAWGRAYBOX (DIFFERENCE LFT 2)
							  (DIFFERENCE BTM 2)
							  (PLUS LFT WIDTH 2)
							  (PLUS BTM HEIGHT 2)
							  (SCREENBITMAP)
							  BLACKSHADE]
                                                             (* erase box from screen.)
	    (AND BTM (DRAWGRAYBOX (DIFFERENCE LFT 2)
				      (DIFFERENCE BTM 2)
				      (PLUS LFT WIDTH 2)
				      (PLUS BTM HEIGHT 2)
				      (SCREENBITMAP)
				      BLACKSHADE])

(\EXPANDBITMAPBY4SLOW
  [LAMBDA (SOURCE TARGET)                                    (* rrb "14-Mar-86 14:22")
                                                             (* expands a bitmap by a factor of 4 into another 
							     bitmap)
    (DECLARE (GLOBALVARS \4BITEXPANSIONTABLE))
    (PROG (NUW (BMH (fetch BITMAPHEIGHT of SOURCE))
		 (BMW (fetch BITMAPWIDTH of SOURCE)))
	    (SETQ NUW (ITIMES 4 BMW))
	    (for I from 0 to (SUB1 BMH) as C from 0 by 4
	       do (\FFAST4BIT (\ADDBASE (fetch BITMAPBASE of SOURCE)
					      (ITIMES (IDIFFERENCE BMH (ADD1 I))
							(fetch BITMAPRASTERWIDTH of SOURCE)))
				  (\ADDBASE (fetch BITMAPBASE of TARGET)
					      (ITIMES (IDIFFERENCE (fetch BITMAPHEIGHT
									  of TARGET)
								       (ADD1 C))
							(fetch BITMAPRASTERWIDTH of TARGET)))
				  (fetch BITMAPRASTERWIDTH of TARGET)
				  (fetch (ARRAYP BASE) of \4BITEXPANSIONTABLE))
                                                             (* copy line once.)
		    (BITBLT TARGET 0 C TARGET 0 (IPLUS C 1)
			      NUW 1 (QUOTE INPUT)
			      (QUOTE REPLACE))             (* copy both those lines.)
		    (BITBLT TARGET 0 C TARGET 0 (IPLUS C 2)
			      NUW 2 (QUOTE INPUT)
			      (QUOTE REPLACE)))
	    (RETURN TARGET])

(\SLOWMAGSHOW
  [LAMBDA (WIN X Y WID HGHT NEARCURSORBITMAP EXPANDEDBITMAP WINLFT WINBTM WINRIGHT WINTOP)
                                                             (* rrb "30-Jun-86 16:35")

          (* * displays a magnified image of the area X Y in WIN but knows that there is an overlap)

                                                             (* FOR NOW NOT IMPLEMENTED)
    (PROG ((SAVEBM (WINDOWPROP WIN (QUOTE IMAGECOVERED)))
	     BOTTOMHEIGHT LEFTWIDTH)
	    [COND
	      [(GREATERP WINBTM Y)                         (* bottom of nearcursor overlaps window.)
                                                             (* display the area below the overlap)
		(\SLOWMAGSHOW1 WIN (SCREENBITMAP)
				 X Y NEARCURSORBITMAP WID (SETQ BOTTOMHEIGHT (DIFFERENCE WINBTM Y)
				   )
				 0 0 EXPANDEDBITMAP)
		(COND
		  ((GREATERP WINLFT X)                     (* there is part of the screen to display before the 
							     window.)
		    (\SLOWMAGSHOW1 WIN (SCREENBITMAP)
				     X
				     (PLUS Y BOTTOMHEIGHT)
				     NEARCURSORBITMAP
				     (SETQ LEFTWIDTH (DIFFERENCE WINLFT X))
				     (DIFFERENCE HGHT BOTTOMHEIGHT)
				     0
				     (LLSH BOTTOMHEIGHT 2)
				     EXPANDEDBITMAP)         (* display the part under the window)
		    (\SLOWMAGSHOW1 WIN SAVEBM 0 0 NEARCURSORBITMAP (DIFFERENCE WID LEFTWIDTH)
				     (DIFFERENCE HGHT BOTTOMHEIGHT)
				     (LLSH LEFTWIDTH 2)
				     (LLSH BOTTOMHEIGHT 2)
				     EXPANDEDBITMAP))
		  ((LESSP WINRIGHT (PLUS X WID))         (* there is screen to display after the window.)
                                                             (* display the part under the window)
		    (\SLOWMAGSHOW1 WIN SAVEBM (DIFFERENCE X WINLFT)
				     0 NEARCURSORBITMAP (SETQ LEFTWIDTH (DIFFERENCE WINRIGHT X))
				     (DIFFERENCE HGHT BOTTOMHEIGHT)
				     0
				     (LLSH BOTTOMHEIGHT 2)
				     EXPANDEDBITMAP)         (* display the part to the right of the mag window.)
		    (\SLOWMAGSHOW1 WIN (SCREENBITMAP)
				     WINRIGHT
				     (PLUS Y BOTTOMHEIGHT)
				     NEARCURSORBITMAP
				     (DIFFERENCE WID LEFTWIDTH)
				     (DIFFERENCE HGHT BOTTOMHEIGHT)
				     (LLSH LEFTWIDTH 2)
				     (LLSH BOTTOMHEIGHT 2)
				     EXPANDEDBITMAP))
		  (T                                         (* the width of the nearcursor area is completely 
							     within the magnifier window;)
		     (\SLOWMAGSHOW1 WIN SAVEBM (DIFFERENCE X WINLFT)
				      0 NEARCURSORBITMAP WID (DIFFERENCE HGHT BOTTOMHEIGHT)
				      0
				      (LLSH BOTTOMHEIGHT 2)
				      EXPANDEDBITMAP]
	      [(GREATERP (PLUS Y HGHT)
			   WINTOP)                           (* top of nearcursor overlaps the magnifier window.)
                                                             (* display the area above the overlap)
		(\SLOWMAGSHOW1 WIN (SCREENBITMAP)
				 X WINTOP NEARCURSORBITMAP WID (DIFFERENCE HGHT (SETQ 
									       BOTTOMHEIGHT
									       (DIFFERENCE WINTOP Y)
									       ))
				 0
				 (LLSH BOTTOMHEIGHT 2)
				 EXPANDEDBITMAP)
		(COND
		  ((GREATERP WINLFT X)                     (* there is part of the screen to display before the 
							     window.)
		    (\SLOWMAGSHOW1 WIN (SCREENBITMAP)
				     X Y NEARCURSORBITMAP (SETQ LEFTWIDTH (DIFFERENCE WINLFT X))
				     BOTTOMHEIGHT 0 0 EXPANDEDBITMAP)
                                                             (* display the part under the window)
		    (\SLOWMAGSHOW1 WIN SAVEBM 0 (DIFFERENCE Y WINBTM)
				     NEARCURSORBITMAP
				     (DIFFERENCE WID LEFTWIDTH)
				     BOTTOMHEIGHT
				     (LLSH LEFTWIDTH 2)
				     0 EXPANDEDBITMAP))
		  ((LESSP WINRIGHT (PLUS X WID))         (* there is screen to display after the window.)
                                                             (* display the part under the window)
		    (\SLOWMAGSHOW1 WIN SAVEBM (DIFFERENCE X WINLFT)
				     (DIFFERENCE Y WINBTM)
				     NEARCURSORBITMAP
				     (SETQ LEFTWIDTH (DIFFERENCE WINRIGHT X))
				     BOTTOMHEIGHT 0 0 EXPANDEDBITMAP)
                                                             (* display the part to the right of the mag window.)
		    (\SLOWMAGSHOW1 WIN (SCREENBITMAP)
				     WINRIGHT Y NEARCURSORBITMAP (DIFFERENCE WID LEFTWIDTH)
				     BOTTOMHEIGHT
				     (LLSH LEFTWIDTH 2)
				     0 EXPANDEDBITMAP))
		  (T                                         (* the width of the nearcursor area is completely 
							     within the magnifier window;)
		     (\SLOWMAGSHOW1 WIN SAVEBM (DIFFERENCE X WINLFT)
				      (DIFFERENCE Y WINBTM)
				      NEARCURSORBITMAP WID BOTTOMHEIGHT 0 0 EXPANDEDBITMAP]
	      (T                                             (* whole height of nearcursor overlaps the magnifier 
							     window.)
		 (COND
		   ((GREATERP WINLFT X)                    (* there is part of the screen to display before the 
							     window.)
		     (\SLOWMAGSHOW1 WIN (SCREENBITMAP)
				      X Y NEARCURSORBITMAP (SETQ LEFTWIDTH (DIFFERENCE WINLFT X))
				      HGHT 0 0 EXPANDEDBITMAP)
                                                             (* display the part under the window)
		     (\SLOWMAGSHOW1 WIN SAVEBM 0 (DIFFERENCE Y WINBTM)
				      NEARCURSORBITMAP
				      (DIFFERENCE WID LEFTWIDTH)
				      HGHT
				      (LLSH LEFTWIDTH 2)
				      0 EXPANDEDBITMAP))
		   ((LESSP WINRIGHT (PLUS X WID))        (* there is screen to display after the window.)
                                                             (* display the part under the window)
		     (\SLOWMAGSHOW1 WIN SAVEBM (DIFFERENCE X WINLFT)
				      (DIFFERENCE Y WINBTM)
				      NEARCURSORBITMAP
				      (SETQ LEFTWIDTH (DIFFERENCE WINRIGHT X))
				      HGHT 0 0 EXPANDEDBITMAP)
                                                             (* display the part to the right of the mag window.)
		     (\SLOWMAGSHOW1 WIN (SCREENBITMAP)
				      WINRIGHT Y NEARCURSORBITMAP (DIFFERENCE WID LEFTWIDTH)
				      HGHT
				      (LLSH LEFTWIDTH 2)
				      0 EXPANDEDBITMAP))
		   (T                                        (* the width of the nearcursor area is completely 
							     within the magnifier window;)
		      (\SLOWMAGSHOW1 WIN SAVEBM (DIFFERENCE X WINLFT)
				       (DIFFERENCE Y WINBTM)
				       NEARCURSORBITMAP WID HGHT 0 0 EXPANDEDBITMAP]
	    (RETURN])

(ONFOURGRID
  [LAMBDA (FIXPT MOVEPT)                                     (* rrb "14-Mar-86 10:08")
                                                             (* makes sure that both points are on a mod of 4 
							     grid.)
    (COND
      (MOVEPT (replace (POSITION XCOORD) of MOVEPT with (DIFFERENCE
								  (fetch (POSITION XCOORD)
								     of MOVEPT)
								  (IMOD (fetch (POSITION XCOORD)
									     of MOVEPT)
									  4)))
	      (replace (POSITION YCOORD) of MOVEPT with (DIFFERENCE
								  (fetch (POSITION YCOORD)
								     of MOVEPT)
								  (IMOD (fetch (POSITION YCOORD)
									     of MOVEPT)
									  4)))
	      MOVEPT)
      (T (replace (POSITION XCOORD) of FIXPT with (DIFFERENCE (fetch (POSITION XCOORD)
									   of FIXPT)
									(IMOD (fetch
										  (POSITION XCOORD)
										   of FIXPT)
										4)))
	 (replace (POSITION YCOORD) of FIXPT with (DIFFERENCE (fetch (POSITION YCOORD)
									   of FIXPT)
									(IMOD (fetch
										  (POSITION YCOORD)
										   of FIXPT)
										4)))
	 FIXPT])

(\EXPANDBITMAPBY4
  [LAMBDA (SOURCE TARGET WIDTH HEIGHT)                       (* rrb "30-Jun-86 16:39")
                                                             (* expands a bitmap by a factor of 4 into another 
							     bitmap)
    (DECLARE (GLOBALVARS \4BITEXPANSIONTABLE))
    (PROG ((NUW (ITIMES 4 WIDTH))
	     (NUH (ITIMES 4 HEIGHT))
	     (SOURCEBASE (fetch BITMAPBASE of SOURCE))
	     (TARGETBASE (fetch BITMAPBASE of TARGET))
	     (TARGETRASTERWIDTH (fetch BITMAPRASTERWIDTH of TARGET))
	     (TABLEBASE (fetch (ARRAYP BASE) of \4BITEXPANSIONTABLE)))
                                                             (* clear out the part of the target that will be 
							     used.)
	    (BITBLT NIL NIL NIL TARGET 0 0 NUW NUH (QUOTE TEXTURE)
		      (QUOTE REPLACE)
		      0)
	    (for I from 1 to HEIGHT as SOURCEADDR from (TIMES (DIFFERENCE
									    (fetch (BITMAP 
										     BITMAPHEIGHT)
									       of SOURCE)
									    HEIGHT)
									  (fetch BITMAPRASTERWIDTH
									     of SOURCE))
	       by (fetch BITMAPRASTERWIDTH of SOURCE) as TARGETADDR
	       from (ITIMES (PLUS (DIFFERENCE (fetch (BITMAP BITMAPHEIGHT) of TARGET)
						      NUH)
					3)
				TARGETRASTERWIDTH)
	       by (ITIMES 4 TARGETRASTERWIDTH) do (\FFAST4BIT (\ADDBASE SOURCEBASE 
										  SOURCEADDR)
								      (\ADDBASE TARGETBASE 
										  TARGETADDR)
								      (QUOTIENT (PLUS WIDTH 3)
										  4)
								      TABLEBASE))
                                                             (* copy single lines once.)
	    (BITBLT TARGET 0 0 TARGET 0 1 NUW NUH (QUOTE INPUT)
		      (QUOTE PAINT))                       (* copy both those lines.)
	    (BITBLT TARGET 0 0 TARGET 0 2 NUW NUH (QUOTE INPUT)
		      (QUOTE PAINT))
	    (RETURN TARGET])

(\SLOWMAGSHOW1
  [LAMBDA (MAGW SOURCEBM SOURCEX SOURCEY TEMPBM WIDTH HEIGHT MAGWX MAGWY EXPANDEDBITMAP)
                                                             (* rrb "30-Jun-86 16:41")
    (PROGN                                                 (* rrb "27-Jun-86 17:27")

          (* * displays a magnified image of the area SOURCEX SOURCEY in MAGW)


	     (BITBLT SOURCEBM SOURCEX SOURCEY TEMPBM 0 0 WIDTH HEIGHT)
	     (BITBLT (\EXPANDBITMAPBY4 TEMPBM EXPANDEDBITMAP WIDTH HEIGHT)
		       0 0 MAGW MAGWX MAGWY (LLSH WIDTH 2)
		       (LLSH HEIGHT 2)
		       (QUOTE INPUT)
		       (QUOTE REPLACE])

(\FFAST4BIT
  [LAMBDA (A B N MAPBASE)                                    (* rrb "14-Mar-86 14:22")
                                                             (* DECLARATIONS: (BLOCKRECORD NIBBLE 
							     ((N1 BITS 4) (N2 BITS 4) (N3 BITS 4) 
							     (N4 BITS 4))))
                                                             (* homebrew version of \FAST4BIT that removes ELT and 
							     is 60 percent faster.)
    (bind AW (I ← 0) for J from 0
       do (SETQ AW (\ADDBASE A J))
	    (OR (IGREATERP N I)
		  (RETURN))
	    (\PUTBASE B I (\GETBASE MAPBASE (fetch N1 of AW)))
	    (OR (IGREATERP N (add I 1))
		  (RETURN))
	    (\PUTBASE B I (\GETBASE MAPBASE (fetch N2 of AW)))
	    (OR (IGREATERP N (add I 1))
		  (RETURN))
	    (\PUTBASE B I (\GETBASE MAPBASE (fetch N3 of AW)))
	    (OR (IGREATERP N (add I 1))
		  (RETURN))
	    (\PUTBASE B I (\GETBASE MAPBASE (fetch N4 of AW)))
	    (add I 1])
)
(RPAQ EMPTYCURSOR (CURSORCREATE (READBITMAP) 0 7))
(16 16
"@@@@"
"@@@@"
"@@@@"
"@@@@"
"@@@@"
"@@@@"
"@@@@"
"@@@@"
"@@@@"
"@@@@"
"@@@@"
"@@@@"
"@@@@"
"@@@@"
"@@@@"
"@@@@")(DECLARE: EVAL@COMPILE 
[PUTPROPS MAGSHOW MACRO ((WIN X Y WID HGHT NEARCURSORBITMAP EXPANDEDBITMAP)
	   (* rrb "27-Jun-86 17:27")
	   (* * displays a magnified image of the area X Y in WIN)
	   (BITBLT (SCREENBITMAP)
		   X Y NEARCURSORBITMAP 0 0 WID HGHT)
	   (BITBLT (\EXPANDBITMAPBY4 NEARCURSORBITMAP EXPANDEDBITMAP WID HGHT)
		   0 0 WIN 0 0 (LLSH WID 2)
		   (LLSH HGHT 2]
)

(ADDTOVAR BackgroundMenuCommands ("Magnifier" (MAGNIFYW)
						
		"for enlarging the screen around the cursor;
     click to start, click to stop."))

(RPAQQ BackgroundMenu NIL)
(DECLARE: EVAL@COMPILE DONTCOPY DONTEVAL@LOAD 
(FILESLOAD (LOADCOMP)
	   LLARRAYELT)
)
(PUTPROPS MAGNIFIER COPYRIGHT ("Xerox Corporation" 1986))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (892 18116 (MAGNIFYW 902 . 1485) (MAGTRACK 1487 . 4808) (\EXPANDBITMAPBY4SLOW 4810 . 
6275) (\SLOWMAGSHOW 6277 . 13057) (ONFOURGRID 13059 . 14336) (\EXPANDBITMAPBY4 14338 . 16360) (
\SLOWMAGSHOW1 16362 . 17018) (\FFAST4BIT 17020 . 18114)))))
STOP