|
|
1.1 root 1: .\" Copyright (c) 1983 Regents of the University of California.
2: .\" All rights reserved. The Berkeley software License Agreement
3: .\" specifies the terms and conditions for redistribution.
4: .\"
5: .\" @(#)lib2648.3 6.2 (Berkeley) 5/27/86
6: .\"
7: .TH LIB2648 3X "May 27, 1986"
8: .UC 5
9: .SH NAME
10: lib2648 \- subroutines for the HP 2648 graphics terminal
11: .SH SYNOPSIS
12: .B #include <stdio.h>
13: .sp
14: .B "typedef char"
15: .RB * bitmat ;
16: .br
17: FILE *trace;
18: .sp
19: cc file.c
20: .B \-l2648
21: .SH DESCRIPTION
22: .I Lib2648
23: is a general purpose library of subroutines useful
24: for interactive graphics on the Hewlett-Packard 2648 graphics terminal.
25: To use it you must call the routine
26: .IR ttyinit ()
27: at the beginning of execution,
28: and
29: .IR done ()
30: at the end of execution.
31: All terminal input and output must go through the routines
32: .IR rawchar ,
33: .IR readline ,
34: .IR outchar ,
35: and
36: .IR outstr .
37: .PP
38: .I Lib2648
39: does the necessary ^E/^F handshaking if
40: .I "getenv(``TERM'')"
41: returns ``hp2648'', as it will if set by
42: .IR tset (1).
43: Any other value, including for example ``2648'', will disable handshaking.
44: .PP
45: Bit matrix routines are provided to model the graphics memory of the 2648.
46: These routines are generally useful, but are specifically useful for the
47: .I update
48: function which efficiently changes what is on the screen to what is
49: supposed to be on the screen.
50: The primative bit matrix routines are
51: .IR newmat ,
52: .IR mat ,
53: and
54: .IR setmat .
55: .PP
56: The file
57: .IR trace ,
58: if non-null, is expected to be a file descriptor as returned by
59: .IR fopen .
60: If so,
61: .I lib2648
62: will trace the progress of the output by writing onto
63: this file.
64: It is provided to make debugging output feasible for graphics programs without
65: messing up the screen or the escape sequences being sent.
66: Typical use of trace will include:
67: .nf
68: \fBswitch\fP (argv[1][1]) {
69: \fBcase\fP 'T':
70: trace = fopen("trace", "w");
71: \fBbreak\fP;
72: ...
73: \fBif\fP (trace)
74: fprintf(trace, "x is %d, y is %s\en", x, y);
75: ...
76: dumpmat("before update", xmat);
77: .fi
78: .SH ROUTINES
79: .TP
80: .B agoto(x, y)
81: Move the alphanumeric cursor to position (x, y),
82: measured from the upper left corner of the screen.
83: .TP
84: .B aoff()
85: Turn the alphanumeric display off.
86: .TP
87: .B aon()
88: Turn the alphanumeric display on.
89: .TP
90: .B areaclear(rmin, cmin, rmax, cmax)
91: Clear the area on the graphics screen bordered by the four arguments.
92: In normal mode the area is set to all black, in inverse video mode
93: it is set to all white.
94: .TP
95: .B beep()
96: Ring the bell on the terminal.
97: .TP
98: .B bitcopy(dest, src, rows, cols) bitmat dest, src;
99: Copy a
100: .I rows
101: by
102: .I cols
103: bit matrix from
104: .I src
105: to (user provided)
106: .I dest.
107: .TP
108: .B cleara()
109: Clear the alphanumeric display.
110: .TP
111: .B clearg()
112: Clear the graphics display.
113: Note that the 2648 will only clear the part of the screen
114: that is visible if zoomed in.
115: .TP
116: .B curoff()
117: Turn the graphics cursor off.
118: .TP
119: .B curon()
120: Turn the graphics cursor on.
121: .TP
122: .B dispmsg(str, x, y, maxlen) char *str;
123: Display the message
124: .I str
125: in graphics text at position
126: .I (x, y).
127: The maximum message length is given by
128: .IR maxlen ,
129: and is needed for dispmsg to know how big an area to clear
130: before drawing the message.
131: The lower left corner of the first character is at
132: .I (x, y).
133: .TP
134: .B done()
135: Should be called before the program exits.
136: Restores the tty to normal, turns off graphics screen,
137: turns on alphanumeric screen, flushes the standard output, etc.
138: .TP
139: .B draw(x, y)
140: Draw a line from the pen location to
141: .I (x, y).
142: As with all graphics coordinates,
143: .I (x, y)
144: is measured from the bottom left corner of the screen.
145: .I (x, y)
146: coordinates represent the first quadrant of the usual Cartesian system.
147: .TP
148: .B drawbox(r, c, color, rows, cols)
149: Draw a rectangular box on the graphics screen.
150: The lower left corner is at location
151: .I (r, c).
152: The box is
153: .I rows
154: rows high and
155: .I cols
156: columns wide.
157: The box is drawn if
158: .I color
159: is 1, erased if
160: .I color
161: is 0.
162: .I (r, c)
163: absolute coordinates represent row and column on the screen,
164: with the origin at the lower left.
165: They are equivalent to
166: .I (x, y)
167: except for being reversed in order.
168: .TP
169: .B "dumpmat(msg, m, rows, cols) char *msg; bitmat m;"
170: If
171: .I trace
172: is non-null, write a readable ASCII representation
173: of the matrix
174: .I m
175: on
176: .I trace.
177: .I Msg
178: is a label to identify the output.
179: .TP
180: .B emptyrow(m, rows, cols, r) bitmat m;
181: Returns 1 if row
182: .I r
183: of matrix
184: .I m
185: is all zero, else returns 0.
186: This routine is provided because it can be implemented more
187: efficiently with a knowledge of the internal representation
188: than a series of calls to
189: .I mat.
190: .TP
191: .B error(msg) char *msg;
192: Default error handler.
193: Calls
194: .I message(msg)
195: and returns.
196: This is called by certain routines in
197: .IR lib2648 .
198: It is also suitable for calling by the user program.
199: It is probably a good idea for a fancy graphics program
200: to supply its own error procedure which uses
201: .IR setjmp (3)
202: to restart the program.
203: .TP
204: .B gdefault()
205: Set the terminal to the default graphics modes.
206: .TP
207: .B goff()
208: Turn the graphics display off.
209: .TP
210: .B gon()
211: Turn the graphics display on.
212: .TP
213: .B koff()
214: Turn the keypad off.
215: .TP
216: .B kon()
217: Turn the keypad on.
218: This means that most special keys on the terminal (such as the alphanumeric
219: arrow keys) will transmit an escape sequence instead of doing their function
220: locally.
221: .TP
222: .B line(x1, y1, x2, y2)
223: Draw a line in the current mode from
224: .I (x1, y1)
225: to
226: .I (x2, y2).
227: This is equivalent to
228: .I "move(x1, y1); draw(x2, y2);"
229: except that a bug in the terminal involving repeated lines from the
230: same point is compensated for.
231: .TP
232: .B lowleft()
233: Move the alphanumeric cursor to the lower left (home down) position.
234: .TP
235: .B "mat(m, rows, cols, r, c) bitmat m;"
236: Used to retrieve an element from a bit matrix.
237: Returns 1 or 0 as the value of the
238: .I [r, c]
239: element of the
240: .I rows
241: by
242: .I cols
243: matrix
244: .I m.
245: Bit matrices are numbered
246: .I (r, c)
247: from the upper left corner of the matrix,
248: beginning at (0, 0).
249: .I R
250: represents the row, and
251: .I c
252: represents the column.
253: .TP
254: .B message(str) char *str;
255: Display the text message
256: .I str
257: at the bottom of the graphics screen.
258: .TP
259: .B "minmax(g, rows, cols, rmin, cmin, rmax, cmax) bitmat g;"
260: .ti -.5i
261: .B int *rmin, *cmin, *rmax, *cmax;
262: .br
263: Find the smallest rectangle that contains all the 1 (on) elements in
264: the bit matrix g.
265: The coordinates are returned in the variables
266: pointed to by rmin, cmin, rmax, cmax.
267: .TP
268: .B move(x, y)
269: Move the pen to location
270: .I (x, y).
271: Such motion is internal and will not cause output
272: until a subsequent
273: .I sync().
274: .TP
275: .B movecurs(x, y)
276: Move the graphics cursor to location
277: .I (x, y).
278: .TP
279: .B bitmat newmat(rows, cols)
280: Create (with
281: .IR malloc (3))
282: a new bit matrix of size
283: .I rows
284: by
285: .I cols.
286: The value created (e.g. a pointer to the first location) is returned.
287: A bit matrix can be freed directly with
288: .IR free .
289: .TP
290: .B outchar(c) char c;
291: Print the character
292: .I c
293: on the standard output.
294: All output to the terminal should go through this routine or
295: .IR outstr .
296: .TP
297: .B outstr(str) char *str;
298: Print the string str on the standard output by repeated calls to
299: .I outchar.
300: .TP
301: .B printg()
302: Print the graphics display on the printer.
303: The printer must be configured as device 6 (the default) on the HPIB.
304: .TP
305: .B char rawchar()
306: Read one character from the terminal and return it.
307: This routine or
308: .I readline
309: should be used to get all input,
310: rather than
311: .IR getchar (3).
312: .TP
313: .B rboff()
314: Turn the rubber band line off.
315: .TP
316: .B rbon()
317: Turn the rubber band line on.
318: .TP
319: .B char *rdchar(c) char c;
320: Return a readable representation of the character
321: .I c.
322: If
323: .I c
324: is a printing character it returns itself, if a control
325: character it is shown in the ^X notation, if negative
326: an apostrophe is prepended. Space returns ^\`, rubout returns ^?.
327: .IP
328: .B NOTE:
329: A pointer to a static place is returned.
330: For this reason, it will not work to pass rdchar twice to the same
331: .IR fprintf / sprintf
332: call.
333: You must instead save one of the values in your own buffer with strcpy.
334: .TP
335: .B readline(prompt, msg, maxlen) char *prompt, *msg;
336: Display
337: .I prompt
338: on the bottom line of the graphics display
339: and read one line of text from the user, terminated by a newline.
340: The line is placed in the buffer
341: .IR msg ,
342: which has size
343: .I maxlen
344: characters.
345: Backspace processing is supported.
346: .TP
347: .B setclear()
348: Set the display to draw lines in erase mode.
349: (This is reversed by inverse video mode.)
350: .TP
351: .B "setmat(m, rows, cols, r, c, val) bitmat m;"
352: The basic operation to store a value in an element of a bit matrix.
353: The
354: .I [r, c]
355: element of
356: .I m
357: is set to
358: .I val,
359: which should be either 0 or 1.
360: .TP
361: .B setset()
362: Set the display to draw lines in normal (solid) mode.
363: (This is reversed by inverse video mode.)
364: .TP
365: .B setxor()
366: Set the display to draw lines in exclusive or mode.
367: .TP
368: .B sync()
369: Force all accumulated output to be displayed on the screen.
370: This should be followed by fflush(stdout).
371: The cursor is not affected by this function.
372: Note that it is normally never necessary to call
373: .IR sync ,
374: since
375: .I rawchar
376: and
377: .I readline
378: call
379: .I sync()
380: and
381: .I fflush(stdout)
382: automatically.
383: .TP
384: .B togvid()
385: Toggle the state of video.
386: If in normal mode, go into inverse video mode,
387: and vice versa.
388: The screen is reversed as well as the
389: internal state of the library.
390: .TP
391: .B ttyinit()
392: Set up the terminal for processing.
393: This routine should be called at the beginning of execution.
394: It places the terminal in CBREAK mode, turns off echo,
395: sets the proper modes in the terminal,
396: and initializes the library.
397: .TP
398: .B "update(mold, mnew, rows, cols, baser, basec) bitmat mold, mnew;"
399: Make whatever changes are needed to make a window on the screen
400: look like
401: .IR mnew .
402: .I Mold
403: is what the window on the screen currently looks like.
404: The window has size
405: .I rows
406: by
407: .IR cols ,
408: and the lower left corner on
409: the screen of the window is
410: .I [baser, basec].
411: Note:
412: .I update
413: was not intended to be used for the entire screen.
414: It would work but be very slow and take 64K bytes
415: of memory just for mold and mnew.
416: It was intended for 100 by 100 windows with objects in the center
417: of them, and is quite fast for such windows.
418: .TP
419: .B vidinv()
420: Set inverse video mode.
421: .TP
422: .B vidnorm()
423: Set normal video mode.
424: .TP
425: .B zermat(m, rows, cols) bitmat m;
426: Set the bit matrix
427: .I m
428: to all zeros.
429: .TP
430: .B zoomn(size)
431: Set the hardware zoom to value
432: .I size,
433: which can range from 1 to 15.
434: .TP
435: .B zoomoff()
436: Turn zoom off.
437: This forces the screen to zoom level 1 without affecting the
438: current internal zoom number.
439: .TP
440: .B zoomon()
441: Turn zoom on.
442: This restores the screen to the previously specified zoom size.
443: .SH DIAGNOSTICS
444: The routine
445: .I error
446: is called when an error is detected.
447: The only error currently detected is overflow of the buffer
448: provided to
449: .IR readline .
450: .PP
451: Subscripts out of bounds to
452: .I setmat
453: return without setting anything.
454: .SH FILES
455: /usr/lib/lib2648.a
456: .SH "SEE ALSO"
457: fed(1)
458: .SH AUTHOR
459: Mark Horton
460: .SH BUGS
461: This library is not supported.
462: It makes no attempt to use all of the features of the terminal,
463: only those needed by fed.
464: Contributions from users will be accepted for addition to the library.
465: .PP
466: The HP 2648 terminal is somewhat unreliable at speeds over 2400 baud,
467: even with the ^E/^F handshaking.
468: In an effort to improve reliability, handshaking is done every 32 characters.
469: (The manual claims it is only necessary every 80 characters.)
470: Nonetheless, I/O errors sometimes still occur.
471: .PP
472: There is no way to control the amount of debugging output generated
473: on
474: .I trace
475: without modifying the source to the library.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.