home *** CD-ROM | disk | FTP | other *** search
/ Carousel / CAROUSEL.cdr / mactosh / code / p_zoomre.sit < prev    next >
Text File  |  1988-06-20  |  2KB  |  83 lines

  1. 18-Jun-88 14:47:17-MDT,2446;000000000000
  2. Return-Path: <u-lchoqu%sunset@cs.utah.edu>
  3. Received: from cs.utah.edu by SIMTEL20.ARPA with TCP; Sat, 18 Jun 88 14:47:12 MDT
  4. Received: by cs.utah.edu (5.54/utah-2.0-cs)
  5.     id AA22709; Sat, 18 Jun 88 14:47:14 MDT
  6. Received: by sunset.utah.edu (5.54/utah-2.0-leaf)
  7.     id AA24833; Sat, 18 Jun 88 14:47:12 MDT
  8. Date: Sat, 18 Jun 88 14:47:12 MDT
  9. From: u-lchoqu%sunset@cs.utah.edu (Lee Choquette)
  10. Message-Id: <8806182047.AA24833@sunset.utah.edu>
  11. To: rthum@simtel20.arpa
  12. Subject: ZoomRect.p
  13.  
  14.  
  15.  
  16. PROCEDURE ZoomRect(VAR smallRect,bigRect: Rect; zoomUp: BOOLEAN);
  17.  
  18. { Given two rectangles in global coords, interpolate one into the other, }
  19. { making a zooming rectangle image on the screen.  The rectangles and the }
  20. { screen image are not altered }
  21.  
  22. CONST zoomSteps = 16;
  23. VAR rect1,rect2,rect3,rect4: Rect;
  24.     i,j: INTEGER;
  25.     savePort: GrafPtr;
  26.     fract,factor,one: Fixed;   { reals are too slow }
  27.  
  28.    FUNCTION Blend(smallCoord,bigCoord: INTEGER): INTEGER;
  29.    VAR smallFix,bigFix,tempFix: Fixed;
  30.    BEGIN
  31.      smallFix:=one * smallCoord;     { scale up to fixed point }
  32.      bigFix  :=one * bigCoord;
  33.      tempFix :=FixMul(fract,bigFix) + FixMul(one-fract,smallFix);
  34.      Blend   :=FixRound(tempFix);
  35.    END;
  36.  
  37. BEGIN
  38.   GetPort(savePort);
  39.   SetPort(deskPort);
  40.   PenPat(gray);
  41.   PenMode(notPatXor);
  42.  
  43.   one:=65536;   { fixed point 'const' }
  44.   IF zoomUp
  45.   THEN
  46.     BEGIN
  47.       rect1:=smallRect;
  48.       factor:=FixRatio(6,5);        { make bigger each time }
  49.       fract:=FixRatio(541,10000);   { 5/6 ^16 = 0.540877 }
  50.     END
  51.   ELSE
  52.     BEGIN
  53.       rect1:=bigRect;
  54.       factor:=FixRatio(5,6);        { make smaller each time }
  55.       fract:=one;                   { start full size }
  56.     END;
  57.  
  58.   rect2:=rect1;
  59.   rect3:=rect1;
  60.   FrameRect(rect1);   { draw initial image }
  61.  
  62.   FOR i:=1 TO zoomSteps DO
  63.     BEGIN
  64.       rect4.left   :=Blend(smallRect.left,bigRect.left);
  65.       rect4.right  :=Blend(smallRect.right,bigRect.right);
  66.       rect4.top    :=Blend(smallRect.top,bigRect.top);
  67.       rect4.bottom :=Blend(smallRect.bottom,bigRect.bottom);
  68.  
  69.       FrameRect(rect4);  { draw newest }
  70.       FrameRect(rect1);  { erase oldest }
  71.       rect1:=rect2;
  72.       rect2:=rect3;
  73.       rect3:=rect4;
  74.  
  75.       fract:=FixMul(fract,factor);  { bump interpolation fraction }
  76.     END;
  77.   FrameRect(rect1);  { erase final image }
  78.   FrameRect(rect2);
  79.   FrameRect(rect3);
  80.   PenNormal;
  81.   SetPort(savePort);
  82. END;
  83.