home *** CD-ROM | disk | FTP | other *** search
/ ftp.ncsa.uiuc.edu / ftp.ncsa.uiuc.edu.zip / ftp.ncsa.uiuc.edu / Contour / utilities.p < prev    next >
Text File  |  2017-03-03  |  4KB  |  167 lines

  1. {$U-}
  2. {$R-}
  3. unit Utilities(20);
  4. interface
  5. uses
  6.     MemTypes, QuickDraw, OSIntf, ToolIntf,MacPrint,FixMath,Graf3D,
  7.     Globals;
  8.  
  9.     
  10. function min (a, b : integer) : integer;
  11. function max (a, b : integer) : integer;
  12.     
  13. procedure SelectRectangle (P1 : Point;
  14.                               var dstRect : Rect);
  15.      
  16. procedure UnZoom;
  17.     
  18. procedure GetMatrixBounds(r : rect; var x1,x2,y1,y2 : integer);
  19.  
  20. procedure ChangeWindow(myWindow : WindowPtr);
  21.  
  22. implementation
  23.  
  24. function min; {(a, b : integer) : integer}
  25. begin
  26.     if a < b then
  27.               min := a
  28.        else
  29.               min := b;
  30. end;
  31.  
  32. function max; {(a, b : integer) : integer}
  33. begin
  34.     if a > b then
  35.            max := a
  36.     else
  37.            max := b;
  38. end;
  39.  
  40.  
  41. { The procedure below can be used to achieve a marquee effect }
  42. { that is , the rectangle is framed with a dashed line , where the dashes move . }
  43. { To use it set up a rectangle, then call MarqueeRect repeatedly to achieve the effect of motion . }
  44. { A generalization to MarqueeRgn for regions is straightforward .}
  45.  
  46. procedure SelectRectangle; {(P1 : Point;}
  47.                                               {var dstRect : Rect)}
  48. { return the rectangle of selection starting at P1 }
  49. var
  50.     P2, P3 : Point;
  51.     R : Rect;
  52.     marqueePat : Pattern;
  53.     clipRgn : RgnHandle;
  54.     
  55.     P : PenState;
  56.     b : 0..255;
  57.     i : integer;
  58.  
  59. begin
  60.     if zooming[windowIndex] then
  61.         UnZoom;
  62.     
  63.     clipRgn := NewRgn;
  64.     GetClip(clipRgn);
  65.     ClipRect(plotRect[windowIndex]);
  66.     StuffHex(@marqueePat, '0f87c3e11e3c78f0 ');
  67.     GetPenState(p);
  68.     
  69.     PenMode(PatXor);
  70.     GetMouse(P2);
  71.     Pt2Rect(P1, P2, R);
  72.     PenPat(marqueePat);
  73.     FrameRect(R);    { draw }
  74.     
  75.     repeat
  76.     
  77.         GetMouse(P2);
  78.         { SYNCHs }
  79.         
  80.         FrameRect(R);    { erase }
  81.         Pt2Rect(P1, P2, R);
  82.             
  83.         {/* shift pattern up for next call */}
  84.         b := marqueePat[0];
  85.         for i := 0 to 6 do
  86.             marqueePat[i] := marqueePat[i+1];
  87.             marqueePat[7] := b;
  88.         
  89.         PenPat(marqueePat);
  90.         {SYNCHs }
  91.         FrameRect(R);    { draw }
  92.         
  93.     until not Button;
  94.     
  95.     dstRect := R;
  96.     marqueeRect[windowIndex] := dstRect;
  97.     GetPenState(marqueeState[windowIndex]);
  98.     SetPenState(p);
  99.     SetClip(clipRgn);
  100.     DisposeRgn(clipRgn);
  101.     
  102. end;
  103.  
  104. procedure UnZoom;
  105. {exits from zooming mode}
  106.  
  107. var
  108.     PState : PenState;
  109.     PPtr : WindowPtr;
  110. begin
  111.     if FrontWindow <> ContourWindow[windowIndex] then begin
  112.         GetPort(PPtr);
  113.         SetPort(ContourWindow[windowIndex]);
  114.     end;
  115.     
  116.     GetPenState(PState);
  117.     SetPenState(marqueeState[windowIndex]);
  118.     FrameRect(marqueeRect[windowIndex]);
  119.     DisableItem(GoodiesMenu,1);
  120.     DisableItem(GoodiesMenu,2);
  121.     DisableItem(PlotMenu,3);
  122.     SetItem(FileMenu,4,'Print ...');
  123.     SetItem(EditMenu,4,'Copy');
  124.     selection[windowIndex] := false;
  125.     InitCursor;
  126.     SetPenState(PState);
  127.     zooming[windowIndex] := false;
  128.     zoomed[windowIndex] := false;
  129.     
  130. if FrontWindow <> ContourWindow[windowIndex] then
  131.     SetPort(PPtr);
  132.         
  133. end;
  134.  
  135.  
  136. { ---------------------------------------------------------- }
  137. procedure GetMatrixBounds; {r : rect; var x1,x2,y1,y2 : integer)}
  138. begin
  139.     with r do begin
  140.         x1 := max(minDataX,left div currentGridSize);
  141.         x2 := min(maxX[windowIndex]-1, round(right/currentGridSize+0.49));
  142.         y1 := max(minDataY, top div currentGridSize);
  143.         y2 := min(maxY[windowIndex]-1, round(bottom/currentGridSize+0.49));
  144.     end;
  145. end;
  146.  
  147. procedure ChangeWindow{(myWindow : WindowPtr)};
  148. var
  149.     i : integer;
  150.     done : boolean;
  151. begin
  152.     i := 1; done := false;
  153.     while (i <= maxWindows) and not done do begin
  154.         if (contourWindow[i] = myWindow) or (threeDWindow[i] = myWindow) then begin
  155.             oldWindowIndex := windowIndex;
  156.             gridSize[windowIndex] := currentGridSize;
  157.             windowIndex := i;
  158.             currentGridSize := gridSize[windowIndex];
  159.             done := true;
  160.             
  161.         end;
  162.         i := i + 1;
  163.     end;
  164.     SelectWindow(myWindow);
  165. end;
  166. end.
  167.