(FILECREATED " 1-Nov-85 17:51:44" {ERIS}<LISP>KOTO>LISPUSERS>SCALEBITMAP.;2 8104         changes to:  (FNS SCALEBITMAP)      previous date: "18-Mar-85 14:34:44" {PHYLUM}<PAPERWORKS>SCALEBITMAP.;1)(* Copyright (c) 1985 by Xerox Corporation. All rights reserved.)(PRETTYCOMPRINT SCALEBITMAPCOMS)(RPAQQ SCALEBITMAPCOMS ((FNS SCALEBITMAP)))(DEFINEQ(SCALEBITMAP  [LAMBDA (BITMAP FACTOR)                                    (* rrb " 1-Nov-85 17:50")          (* SCALES BITMAPS BY AN ARBITRARY AMOUNT OF 2 DECIMAL PLACES. FACTOR CAN BE OF THE FOLLOWING FORMS: I 	  (AN INTEGER REPRESENTING A PERCENTAGE AMOUNT; E.G. I=67 MEANS REDUCE THE X AND Y AXIS TO 67% OF THEIR ORIGINAL); R 	  (A REAL; E.G. R=1.3 MEANS INCREASE THE X AND Y AXIS BY A FACTOR OF 1.3); (IX . IY) (A DOTTED PAIR OF INTEGERS;	  E.G. (75 . 125) MEANS REDUCE THE X AXIS TO 75% OF ORIGINAL; INCREASE Y TO 125% OF ORIGINAL); 	  (RX . RY) (A DOTTED PAIR OF REALS; E.G. (2.3 . .81) MEANS 2.3 TIMES ORIGINAL X AXIS, .81 TIMES ORIGINAL Y))    (PROG (XFACTOR YFACTOR DELTAX DELTAY XROUND YROUND BITMAPWIDTH BITMAPHEIGHT HEIGHT-1 		     RASTERWIDTH BITMAPBASE NEWBITMAP NEWHEIGHT-1 NEWBITMAPWIDTH NEWBITMAPBASE 		     NEWRASTERWIDTH ORIGBASE NEWBASE ORIGWORD NEWWORD XSTART YSTART ENDX ENDY ONLINE)	    (OR (type? BITMAP BITMAP)		  (\ILLEGAL.ARG BITMAP))	    (SETQ BITMAPWIDTH (fetch (BITMAP BITMAPWIDTH) of BITMAP))	    (SETQ BITMAPHEIGHT (fetch (BITMAP BITMAPHEIGHT) of BITMAP))	    (COND	      ((NUMBERP FACTOR)		(SETQ XFACTOR FACTOR)		(SETQ YFACTOR FACTOR))	      ((POSITIONP FACTOR)		(SETQ XFACTOR (CAR FACTOR))		(SETQ YFACTOR (CDR FACTOR)))	      (T (\ILLEGAL.ARG FACTOR)))	    [AND (FLOATP XFACTOR)		   (SETQ XFACTOR (FIX (FTIMES XFACTOR 100]	    [AND (FLOATP YFACTOR)		   (SETQ YFACTOR (FIX (FTIMES YFACTOR 100]          (* I don't know why this code was in here but it causes the bitmap to scale incorrectly if it clips Y but not X;	  e.g. (BITMAPHEIGHT (SCALEBITMAP (BITMAPCREATE 3 3) 10.0)) was 24 not 30.0 Therefore, I commented it out.	  rrb -	  1-nov-85 (PROGN (SETQ XFACTOR (IMIN SCREENWIDTH XFACTOR)) (SETQ YFACTOR (IMIN SCREENHEIGHT YFACTOR))))	    (COND	      ((ILESSP XFACTOR 101)		(SETQ DELTAX 100)		(SETQ XROUND (IQUOTIENT XFACTOR 2)))	      (T (SETQ DELTAX XFACTOR)		 (SETQ XROUND 50)))	    (COND	      ((ILESSP YFACTOR 101)		(SETQ DELTAY 100)		(SETQ YROUND (IQUOTIENT YFACTOR 2)))	      (T (SETQ DELTAY YFACTOR)		 (SETQ YROUND 50)))	    (SETQ NEWBITMAP (BITMAPCREATE (SETQ NEWBITMAPWIDTH						(IQUOTIENT (IPLUS XROUND DELTAX								      (ITIMES (SUB1 BITMAPWIDTH)										XFACTOR))							     100))					      (IQUOTIENT (IPLUS YROUND DELTAY								    (ITIMES (SUB1 BITMAPHEIGHT)									      YFACTOR))							   100)					      1))            (* MAKE ALL VALUES QUICKLY AVAILABLE)	    (SETQ HEIGHT-1 (SUB1 BITMAPHEIGHT))	    (SETQ RASTERWIDTH (fetch (BITMAP BITMAPRASTERWIDTH) of BITMAP))	    (SETQ BITMAPBASE (fetch (BITMAP BITMAPBASE) of BITMAP))                                                             (* AND THE NEW BITMAP VALUES)	    (SETQ NEWHEIGHT-1 (SUB1 (fetch (BITMAP BITMAPHEIGHT) of NEWBITMAP)))	    (SETQ NEWRASTERWIDTH (fetch (BITMAP BITMAPRASTERWIDTH) of NEWBITMAP))	    (SETQ NEWBITMAPBASE (fetch (BITMAP BITMAPBASE) of NEWBITMAP))                                                             (* OK, CRANK IT OUT)                                                             (* ORIGWORD AND NEWWORD ARE SORTA CACHED FOR SPEED 							     PURPOSES)	    [for Y from 0 to HEIGHT-1	       do [SETQ ORIGBASE (\ADDBASE BITMAPBASE (ITIMES RASTERWIDTH (IDIFFERENCE									HEIGHT-1 Y]		    (SETQ ONLINE NIL)		    [for X from 0 to (SUB1 BITMAPWIDTH)		       do [AND (ZEROP (IMOD X 16))				   (SETQ ORIGWORD (\GETBASE ORIGBASE (LRSH X 4]                                                             (* LOOK FOR STRINGS OF "ON" BITS;							     THEN TREAT AS A LINE FOR TRANSLATIONAL PURPOSES)			    (COND			      [(BITTEST ORIGWORD (\WORDELT BITMASKARRAY (IMOD X 16)))				(OR ONLINE (AND (SETQ ONLINE T)						    (SETQ XSTART X)						    (SETQ YSTART Y]			      ((NULL ONLINE)               (* JUST SKIP OVER BLANKS)				)			      (T                             (* SPELL THIS ALL OUT SO I CAN SEE WHAT'S GOIN' ON 							     HERE)				 (SETQ XSTART (IQUOTIENT (IPLUS XROUND (ITIMES XSTART XFACTOR)								      )							     100))				 (SETQ ENDY (IQUOTIENT (IPLUS (ITIMES YSTART YFACTOR)								    YROUND DELTAY)							   100))				 (SETQ YSTART (IQUOTIENT (IPLUS YROUND (ITIMES YSTART YFACTOR)								      )							     100))				 [SETQ ENDX (COND				     ((GREATERP XFACTOR 100)                                                             (* Subtract the 1 differently depending on whether the							     size is going up or down.)				       (SUB1 (IQUOTIENT (IPLUS XROUND (ITIMES X XFACTOR))							    100)))				     (T (IQUOTIENT (IPLUS XROUND (ITIMES (SUB1 X)									       XFACTOR))						     100]				 (for NY from YSTART to (SUB1 ENDY)				    do (SETQ NEWWORD (\GETBASE [SETQ NEWBASE								       (\ADDBASE									 NEWBITMAPBASE									 (ITIMES NEWRASTERWIDTH										   (IDIFFERENCE										     NEWHEIGHT-1 NY]								     (LRSH XSTART 4)))					 (for NX from XSTART to ENDX					    do [AND (ZEROP (IMOD NX 16))							(SETQ NEWWORD (\GETBASE NEWBASE										    (LRSH NX 4]						 [SETQ NEWWORD (LOGOR NEWWORD									  (\WORDELT BITMASKARRAY										      (IMOD NX 16]						 (AND (ZEROP (IMOD (ADD1 NX)									 16))							(\PUTBASE NEWBASE (LRSH NX 4)								    NEWWORD)))					 (\PUTBASE NEWBASE (LRSH ENDX 4)						     NEWWORD))				 (SETQ ONLINE NIL]		    (COND		      (ONLINE                                (* GOTTA CLEANUP AFTER THE LAST CASE)                                                             (* THIS IN CASE WORKING ON A LINE THAT GOES TO END OF 							     BITMAP)                                                             (* GAWD! WHAT A WASTE O SPACE THIS IS.							     FIX LATER)			      (SETQ XSTART (IQUOTIENT (IPLUS XROUND (ITIMES XSTART XFACTOR))							  100))			      (SETQ ENDY (IQUOTIENT (IPLUS (ITIMES YSTART YFACTOR)								 YROUND DELTAY)							100))			      (SETQ YSTART (IQUOTIENT (IPLUS YROUND (ITIMES YSTART YFACTOR))							  100))			      (SETQ ENDX (SUB1 NEWBITMAPWIDTH))			      (for NY from YSTART to (SUB1 ENDY)				 do (SETQ NEWWORD (\GETBASE [SETQ NEWBASE								    (\ADDBASE NEWBITMAPBASE										(ITIMES										  NEWRASTERWIDTH										  (IDIFFERENCE										    NEWHEIGHT-1 NY]								  (LRSH XSTART 4)))				      (for NX from XSTART to ENDX					 do [AND (ZEROP (IMOD NX 16))						     (SETQ NEWWORD (\GETBASE NEWBASE										 (LRSH NX 4]					      [SETQ NEWWORD (LOGOR NEWWORD								       (\WORDELT BITMASKARRAY										   (IMOD NX 16]					      (AND (ZEROP (IMOD (ADD1 NX)								      16))						     (\PUTBASE NEWBASE (LRSH NX 4)								 NEWWORD)))				      (\PUTBASE NEWBASE (LRSH ENDX 4)						  NEWWORD]	    (RETURN NEWBITMAP]))(PUTPROPS SCALEBITMAP COPYRIGHT ("Xerox Corporation" 1985))(DECLARE: DONTCOPY  (FILEMAP (NIL (358 8022 (SCALEBITMAP 368 . 8020)))))STOP