Annotation of 43BSDReno/old/lib2648/lib2648.3, revision 1.1.1.1

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.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.