home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / GRAPHICS / PLOT / SURFUTI3.ZIP / GXGIN.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-02-03  |  5.2 KB  |  177 lines

  1.   {$U-$V-} {disable CNTRL C, disable strict string length type checking}
  2.  
  3. {                 FOR USE WITH GXBASE PACKAGE
  4.  Graphics INput package.  Enables/Disables cross-hairs and allows user to
  5.  input the cursor coordinates in response to a keyboard character selected.
  6.  X-Y coordinates are screen values in the range 0..319, 0..199 respectively.
  7.  
  8.  Cursor movements are defined by the keys:
  9.  
  10.     up = ^I;   down = ^M;   left = ^J;  right = ^L;
  11.     nw = ^U;   sw   = ^N;   ne   = ^O;  se    = ^K;
  12.  
  13.  The movement is one pixel at a time, but can be set to n-pixel steps by
  14.  pressing the ESC key followed by any numeric key in the range 1 to 9.
  15. }
  16.  
  17. VAR
  18.  
  19.   {Graphics INput global variables}
  20.  
  21.   GxGinStep : Integer; {cross-hair step length}
  22.   GxGinOn : Boolean; {Gin status flag}
  23.   GinBeamX, GinBeamY : Integer; {Cross-hair coordinates}
  24.   GxGinIndex : Integer;
  25.  
  26.   { Read the kbd for a char, If its an F key}
  27.   { or an arrow key then a flag is set}
  28.   FUNCTION getch : Integer;
  29.   VAR Ch : Char;
  30.     arrow : Boolean;
  31.   BEGIN
  32.     Read(Kbd, Ch);
  33.     arrow := False;
  34.     IF ((Ord(Ch) = Esc) AND KeyPressed) THEN
  35.       BEGIN
  36.         arrow := True;
  37.         Read(Kbd, Ch)
  38.       END;
  39.     IF arrow THEN getch := Ord(Ch)+170
  40.     ELSE getch := Ord(Ch)
  41.   END;
  42.  
  43.  
  44.   PROCEDURE GinStep(n : Integer);
  45.   BEGIN
  46.     GxGinStep := n AND 15;
  47.   END {GinStep} ;
  48.  
  49.   PROCEDURE GinColour(index : Integer);
  50.   BEGIN
  51.     GxGinIndex := index AND $F;
  52.   END {GinColour} ;
  53.  
  54.   PROCEDURE GinEnable;
  55.  
  56.     {allow interactive input with a default step displacement of one pixel.}
  57.  
  58.   BEGIN
  59.     GinBeamX := (GxVxb+GxVxt) SHR 1;
  60.     GinBeamY := (GxVyt+GxVyb) SHR 1;
  61.     GxGinOn := True;
  62.     GxGinStep := 15;
  63.     GxGinIndex := GxPalette[15]; {white cross-hairs for default map}
  64.   END {GinEnable} ;
  65.  
  66.   PROCEDURE GinDisable;
  67.  
  68.     {disable interactive input}
  69.  
  70.   BEGIN
  71.     GinBeamX := -1; GinBeamY := -1;
  72.     GxGinOn := False;
  73.   END {GinDisable} ;
  74.  
  75.   PROCEDURE Gin(VAR GinC : Char; VAR GinX, GinY : Real);
  76.  
  77.   {allow user to move cross-hair cursor and fix coordinates of cursor in
  78.    response to a keyboard character.  Return coords of cross-hairs in GinX,
  79.    GinY and the key depressed in GinC}
  80.  
  81.   TYPE
  82.     direction = Integer;
  83.  
  84.   CONST
  85.     Up = 242; Down = 250; Left = 245; Right = 247;
  86.     nw = 241; sw = 249; ne = 243; se = 251;
  87.     Esc = 27;
  88.     movement : SET OF 7..253 = [Up, Down, Left, Right, nw, sw, ne, se];
  89.  
  90.  
  91.   VAR
  92.     c : Integer;
  93.     step : Integer;
  94.     newX, newY : Integer;
  95.     mode : Integer;
  96.     CurrIndex : Integer;
  97.  
  98.   BEGIN
  99.     IF GxGinOn THEN
  100.       BEGIN
  101.         mode := GxMode;
  102.         WriteModeXor;
  103.         CurrIndex := GxIndex;
  104.         GxIndex := GxGinIndex;
  105.         step := GxGinStep;
  106.         newX := GinBeamX; newY := GinBeamY;
  107.         DrawLine(newX, GxVyb, newX, GxVyt);
  108.         DrawLine(GxVxb, newY, GxVxt, newY);
  109.         REPEAT
  110.           c := getch;
  111.  
  112.           IF Chr(c) IN ['0'..'9'] THEN
  113.             BEGIN
  114.               IF Chr(c) IN ['1'..'9'] THEN
  115.                 step := c-Ord('0')
  116.               ELSE
  117.                 IF Chr(c) = '0' THEN step := 15;
  118.             END; { if chr(c) in..}
  119.  
  120.           IF c IN movement THEN
  121.             BEGIN
  122.               CASE c OF
  123.                 Up : newY := (GinBeamY-step);
  124.                 Down : newY := (GinBeamY+step);
  125.                 Right : newX := (GinBeamX+step);
  126.                 Left : newX := (GinBeamX-step);
  127.                 nw : BEGIN
  128.                        newX := (GinBeamX-step); newY := (GinBeamY-step);
  129.                      END;
  130.                 ne : BEGIN
  131.                        newX := (GinBeamX+step); newY := (GinBeamY-step);
  132.                      END;
  133.                 sw : BEGIN
  134.                        newX := (GinBeamX-step); newY := (GinBeamY+step);
  135.                      END;
  136.                 se : BEGIN
  137.                        newX := (GinBeamX+step); newY := (GinBeamY+step);
  138.                      END;
  139.               END {case} ;
  140.               IF newX < GxVxb THEN newX := GxVxt-GxVxb+newX;
  141.               IF newX > GxVxt THEN newX := GxVxb+newX-GxVxt;
  142.               IF newY > GxVyb THEN newY := GxVyt-GxVyb+newY;
  143.               IF newY < GxVyt THEN newY := GxVyb+newY-GxVyt;
  144.               IF newX <> GinBeamX THEN
  145.                 BEGIN
  146.                   DrawLine(GinBeamX, GxVyb, GinBeamX, GxVyt);
  147.                   DrawLine(newX, GxVyb, newX, GxVyt);
  148.                 END;
  149.               IF newY <> GinBeamY THEN
  150.                 BEGIN
  151.                   DrawLine(GxVxb, GinBeamY, GxVxt, GinBeamY);
  152.                   DrawLine(GxVxb, newY, GxVxt, newY);
  153.                 END;
  154.               GinBeamX := newX; GinBeamY := newY;
  155.             END; { if c in...}
  156.         UNTIL (NOT(c IN (movement+[Esc]))) AND (NOT(Chr(c) IN ['0'..'9']));
  157.  
  158.         GinC := Chr(c);
  159.         GinX := GxWxb+(GinBeamX-GxVxb)/GxSx;
  160.         GinY := GxWyb+(GinBeamY-GxVyb)/GxSy;
  161.         GxGinStep := step;
  162.  
  163.         {delete X-hairs until next GIN call}
  164.  
  165.         DrawLine(GinBeamX, GxVyb, GinBeamX, GxVyt);
  166.         DrawLine(GxVxb, GinBeamY, GxVxt, GinBeamY);
  167.  
  168.         {restore user's environment}
  169.  
  170.         IF mode = GxSet THEN
  171.           WriteModeSet
  172.         ELSE
  173.           WriteModeXor;
  174.         GxIndex := CurrIndex;
  175.       END;
  176.   END {gin} ;
  177.