Files
sicspsi/tecs/pg_plus/pgband.f

105 lines
4.9 KiB
Fortran

C*PGBAND -- read cursor position, with anchor
C%int cpgband(int mode, int posn, float xref, float yref, float *x,\
C% float *y, char *ch_scalar);
C+
INTEGER FUNCTION PGBAND (MODE, POSN, XREF, YREF, X, Y, CH)
INTEGER MODE, POSN
REAL XREF, YREF, X, Y
CHARACTER*(*) CH
C
C Read the cursor position and a character typed by the user.
C The position is returned in world coordinates. PGBAND positions
C the cursor at the position specified (if POSN=1), allows the user to
C move the cursor using the mouse or arrow keys or whatever is available
C on the device. When he has positioned the cursor, the user types a
C single character on the keyboard; PGBAND then returns this
C character and the new cursor position (in world coordinates).
C
C Some interactive devices offer a selection of cursor types,
C implemented as thin lines that move with the cursor, but without
C erasing underlying graphics. Of these types, some extend between
C a stationary anchor-point at XREF,YREF, and the position of the
C cursor, while others simply follow the cursor without changing shape
C or size. The cursor type is specified with one of the following MODE
C values. Cursor types that are not supported by a given device, are
C treated as MODE=0.
C
C -- If MODE=0, the anchor point is ignored and the routine behaves
C like PGCURS.
C -- If MODE=1, a straight line is drawn joining the anchor point
C and the cursor position.
C -- If MODE=2, a hollow rectangle is extended as the cursor is moved,
C with one vertex at the anchor point and the opposite vertex at the
C current cursor position; the edges of the rectangle are horizontal
C and vertical.
C -- If MODE=3, two horizontal lines are extended across the width of
C the display, one drawn through the anchor point and the other
C through the moving cursor position. This could be used to select
C a Y-axis range when one end of the range is known.
C -- If MODE=4, two vertical lines are extended over the height of
C the display, one drawn through the anchor point and the other
C through the moving cursor position. This could be used to select an
C X-axis range when one end of the range is known.
C -- If MODE=5, a horizontal line is extended through the cursor
C position over the width of the display. This could be used to select
C an X-axis value such as the start of an X-axis range. The anchor point
C is ignored.
C -- If MODE=6, a vertical line is extended through the cursor
C position over the height of the display. This could be used to select
C a Y-axis value such as the start of a Y-axis range. The anchor point
C is ignored.
C -- If MODE=7, a cross-hair, centered on the cursor, is extended over
C the width and height of the display. The anchor point is ignored.
C -- If MODE<0, the routine behaves like PGCURS, but if the user does
C nothing until a time of -MODE seconds has expired, the routine returns
C with CH=CHAR(0)
C
C Returns:
C PGBAND : 1 if the call was successful; 0 if the device
C has no cursor or some other error occurs.
C Arguments:
C MODE (input) : display mode (0, 1, ..7: see above).
C POSN (input) : if POSN=1, PGBAND attempts to place the cursor
C at point (X,Y); if POSN=0, it leaves the cursor
C at its current position. (On some devices this
C request may be ignored.)
C XREF (input) : the world x-coordinate of the anchor point.
C YREF (input) : the world y-coordinate of the anchor point.
C X (in/out) : the world x-coordinate of the cursor.
C Y (in/out) : the world y-coordinate of the cursor.
C CH (output) : the character typed by the user; if the device has
C no cursor or if some other error occurs, the value
C CHAR(0) [ASCII NUL character] is returned.
C
C Note: The cursor coordinates (X,Y) may be changed by PGBAND even if
C the device has no cursor or if the user does not move the cursor.
C Under these circumstances, the position returned in (X,Y) is that of
C the pixel nearest to the requested position.
C--
C 7-Sep-1994 - new routine [TJP].
C 27-Aug-2001 - timeout mode [M.Z.]
C-----------------------------------------------------------------------
INCLUDE 'pgplot.inc'
INTEGER GRCURS, I, J, IREF, JREF
LOGICAL PGNOTO
C
IF (PGNOTO('PGBAND')) THEN
CH = CHAR(0)
PGBAND = 0
RETURN
END IF
IF (MODE.GT.7) CALL GRWARN(
: 'Invalid MODE argument in PGBAND')
IF (POSN.LT.0 .OR. POSN.GT.1) CALL GRWARN(
: 'Invalid POSN argument in PGBAND')
C
I = NINT(PGXORG(PGID) + X*PGXSCL(PGID))
J = NINT(PGYORG(PGID) + Y*PGYSCL(PGID))
IREF = NINT(PGXORG(PGID) + XREF*PGXSCL(PGID))
JREF = NINT(PGYORG(PGID) + YREF*PGYSCL(PGID))
PGBAND = GRCURS(PGID,I,J,IREF,JREF,MODE,POSN,CH)
X = (I - PGXORG(PGID))/PGXSCL(PGID)
Y = (J - PGYORG(PGID))/PGYSCL(PGID)
CALL GRTERM
END