.TH GRAPHICS 3
.SH NAME
Display, Point, Rectangle, Cursor, initdraw, geninitdraw, drawerror, initdisplay, closedisplay, getdefont, getwindow, gengetwindow, flushimage, bufimage, lockdisplay, unlockdisplay, cursorswitch, cursorset, openfont, buildfont, freefont, Pfmt, Rfmt, strtochan, chantostr, chantodepth \- interactive graphics
.SH SYNOPSIS
.nf
.PP
.ft L
#include <u.h>
#include <libc.h>
#include <draw.h>
#include <cursor.h>
.ft P
.PP
.ta \w'\fLFont* 'u
.B
int	initdraw(void (*errfun)(Display*, char*), char *font,
.B
	   char *label)
.PP
.B
int	geninitdraw(char *devdir, void(*errfun)(Display*, char*),
.PP
.B
	   char *font, char *label, char *mousedir, char *windir,
.B
	   int ref)
.PP
.B
int	newwindow(char *str)
.PP
.B
void	drawerror(Display *d, char *msg)
.PP
.B
Display*	initdisplay(char *devdir, char *win, void(*errfun)(Display*, char*))
.PP
.B
void	closedisplay(Display *d)
.PP
.B
Font*	getdefont(Display *d)
.PP
.B
int	flushimage(Display *d, int vis)
.PP
.B
int	bufimage(Display *d, int n)
.PP
.B
int	lockdisplay(Display *d)
.PP
.B
int	unlockdisplay(Display *d)
.PP
.B
int	getwindow(Display *d, int ref)
.PP
.B
int	gengetwindow(Display *d, char *winname,
.br
.B
	   Image **ip, Screen **sp, int ref)
.PP
.B
int	scalesize(Display *d, int n)
.PP
.B
void	cursorswitch(Cursor *curs)
.PP
.B
void	cursorset(Point p)
.PP
.B
Font*	openfont(Display *d, char *name)
.PP
.B
Font*	buildfont(Display *d, char *desc, char *name)
.PP
.B
void	freefont(Font *f)
.PP
.B
int	Pfmt(Fmt*)
.PP
.B
int	Rfmt(Fmt*)
.PP
.B
ulong	strtochan(char *s)
.PP
.B
char*	chantostr(char *s, ulong chan)
.PP
.B
int	chantodepth(ulong chan)
.PP
.B
extern Display *display
.PP
.B
extern Image   *screen
.PP
.B
extern Screen   *_screen
.PP
.B
extern Font    *font
.fi
.SH DESCRIPTION
A
.B Display
structure represents a connection to the graphics device,
.IR draw (3),
holding all graphics resources associated with the connection,
including in particular raster image data in use by the client program.
The structure is defined (in part) as:
.IP
.EX
.ta 6n +10n
typedef
struct Display
{
	...
	void	(*error)(Display*, char*);
	...
	Image	*black;
	Image	*white;
	Image	*opaque;
	Image	*transparent;
	Image	*image;
	Font		*defaultfont;
	Subfont	*defaultsubfont;
	...
};
.EE
.PP
A
.B Point
is a location in an Image
(see below and
.IR draw (3)),
such as the display, and is defined as:
.IP
.EX
.ta 6n
typedef
struct Point {
	int x;
	int y;
} Point;
.EE
.PP
The coordinate system has
.I x
increasing to the right and
.I y
increasing down.
.PP
A
.B Rectangle
is a rectangular area in an image.
.IP
.EX
.ta 6n
typedef
struct Rectangle {
	Point min;      /* upper left */
	Point max;      /* lower right */
} Rectangle;
.EE
.PP
By definition,
.BR min.x ≤ max.x
and
.BR min.y ≤ max.y .
By convention, the right (maximum
.IR x )
and bottom (maximum
.IR y )
edges are
excluded from the represented rectangle, so abutting rectangles have no
points in common.
Thus,
.B max
contains the coordinates of the first point beyond the rectangle.
.PP
The
.B Image
data structure is defined in
.IR draw (3).
.PP
A
.B Font
is a set of character images, indexed by runes (see
.IR utf (7)).
The images are organized into
.BR Subfonts ,
each containing the images for a small, contiguous set of runes.
The detailed format of these data structures,
which are described in detail in
.IR cachechars (3),
is immaterial for most applications.
.B Font
and
.B Subfont
structures contain two interrelated fields:
.LR ascent ,
the distance from the top of the highest character
(actually the top of the image holding all the characters)
to the baseline,
and
.LR height ,
the distance from the top of the highest character to the bottom of
the lowest character (and hence, the interline spacing).
See
.IR cachechars (3)
for more details.
.PP
.I Buildfont
parses the font description in the buffer
.BR desc ,
returning a 
.B Font*
pointer that can be used by
.B string
(see
.IR draw (3))
to draw characters from the font.
.I Openfont
does the same, but reads the description
from the named font.
.I Freefont
frees a font.
In contrast to Plan 9, font names in Plan 9 from User Space are
a small language describing the desired font.
See
.IR font (7)
for details.
.PP
A
.I Cursor
is defined:
.IP
.EX
.ta 6n +\w'Point 'u
typedef struct
Cursor {
	Point	offset;
	uchar	clr[2*16];
	uchar	set[2*16];
} Cursor;
.EE
.PP
The arrays are arranged in rows, two bytes per row, left to
right in big-endian order to give 16 rows
of 16 bits each.
A cursor is displayed on the screen by adding
.B offset
to the current mouse position, using
.B clr
as a mask to draw white at the pixels where
.B clr
is one, and then drawing black at the pixels where
.B set
is one.
.PP
The routine
.I initdraw
connects to the display; it returns \-1 if it fails and sets the error string.
.I Initdraw
sets up the global variables
.B display
(the
.B Display
structure representing the connection),
.B screen
(an
.B Image
representing the display memory itself or, if
.IR rio (1)
is running, the client's window),
and
.B font
(the default font for text).
The arguments to
.I initdraw
include a
.IR label ,
which is written to
.B /dev/label
if non-nil
so that it can be used to identify the window when hidden (see
.IR rio (1)).
The font is created by reading the named
.I font
file.  If
.B font
is null,
.I initdraw
reads the file named in the environment variable
.BR $font ;
if
.B $font
is not set, it imports the default (usually minimal)
font from the operating system.
(See
.IR font (7)
for a full discussion of font syntaxes.)
The global
.I font
will be set to point to the resulting
.B Font
structure.
The
.I errfun
argument is a
.I graphics error function
to call in the event of a fatal error in the library; it must never return.
Its arguments are the
display pointer and an error string.
If
.I errfun
is nil, the library provides a default, called
.IR drawerror .
Another effect of
.I initdraw
is that it installs
.IR print (3)
formats
.I Pfmt
and
.I Rfmt
as
.L %P
and
.L %R
for printing
.B Points
and
.BR Rectangles .
.PP
The
.I geninitdraw
function provides a less automated way to establish a connection, for programs
that wish to connect to multiple displays.
.I Devdir
is the name of the directory containing the device files for the display
(if nil, default
.BR /dev );
.IR errfun ,
.IR font ,
and
.I label
are as in
.IR initdraw ;
.I mousedir
and
.I windir
are the directories holding the
.B mouse
and
.B winname
files; and
.I ref
specifies the refresh function to be used to create the window, if running under
.IR rio (1)
(see
.IR window (3)).
.\" .PP
.\" The function
.\" .I newwindow
.\" may be called before
.\" .I initdraw
.\" or
.\" .IR geninitdraw
.\" to cause the program to occupy a newly created window rather than take over the one in
.\" which it is running when it starts.
.\" The
.\" .I str
.\" argument, if non-null, is concatenated to the string \f5\&"new\ "\fP
.\" that is used to create the window (see
.\" .IR rio (4)).
.\" For example,
.\" .B newwindow("-hide -dy 100")
.\" will cause the program to run in a newly created, hidden window
.\" 100 pixels high.
.PP
.I Initdisplay
is part of
.IR geninitdraw ;
it sets up the display structures but does not allocate any fonts or call
.IR getwindow .
The arguments are similar to those of
.IR initdraw ;
.I win
names the directory, default
.BR /dev ,
in which the files associated with the window reside.
.I Closedisplay
disconnects the display and frees the associated data structures.
.I Getdefont
builds a
.B Font
structure from in-core data describing a default font.
None of these routines is needed by most programs, since
.I initdraw
calls them as needed.
.PP
The data structures associated with the display must be protected in a multi-process program,
because they assume only one process will be using them at a time.
Multi-process programs should set
.B display->locking
to
.BR 1 ,
to notify the library to use a locking protocol for its own accesses,
and call
.I lockdisplay
and
.I unlockdisplay
around any calls to the graphics library that will cause messages to be sent to the display device.
.I Initdraw
and
.I geninitdraw
initialize the display to the locked state.
.PP
.I Getwindow
returns a pointer to the window associated with the application; it is called
automatically by
.I initdraw
to establish the
.B screen
pointer but must be called after each resizing of the window to restore
the library's connection to the window.
If
.B rio
is not running, it returns
.BR display->image ;
otherwise it negotiates with
.B rio
by looking in
.B /dev/winname
to find the name of the window and opening it using
.B namedimage
(see
.IR allocimage (3)).
The resulting window will be created using the refresh method
.I ref
(see
.IR window (3));
this should almost always be
.B Refnone
because
.B rio
provides backing store for the window.
.PP
.I Getwindow
overwrites the global variables
.BR screen ,
a pointer to the
.B Image
defining the window (or the overall display, if no window system is running); and
.BR _screen ,
a pointer to the
.B Screen
representing the root of the window's hierarchy. (See
.IR window (3).
The overloading of the
.B screen
word is an unfortunate historical accident.)
.I Getwindow
arranges that
.B screen
point to the portion of the window inside the border;
sophisticated clients may use
.B _screen
to make further subwindows.
If
.I getwindow
is being called due to a resizing of the window,
the resize may be accompanied by a change in screen pixel density (DPI),
in which case the value of the
.BR Display 's
.B dpi
field and any open
.BR Font 's
.B height
and
.B ascent
fields may be updated during the call to
.IR getwindow .
Programs should discard any cached information about display or font sizes.
.\" Programs desiring multiple independent windows
.\" may use the mechanisms of
.\" .IR rio (4)
.\" to create more windows (usually by a fresh mount of the window sytem
.\" in a directory other than
.\" .BR /dev ),
.\" then use
.\" .I gengetwindow
.\" to connect to them.
.IR Gengetwindow 's
extra arguments are the full path of the window's
.B winname
file and pointers to be overwritten with the values of the `global'
.B Image
and
.B Screen
variables for the new window.
.PP
Historically, Plan 9 graphics programs have used fixed-size graphics features that assume a narrow range of display densities, around 100 dpi: pixels (or dots) per inch.
The new field
.B display->dpi
contains the display's actual density if known, or else
.B DefaultDPI
(100).
.I Scalesize
scales the fixed pixel count
.I n
by
.BR display->dpi / DefaultDPI ,
rounding appropriately.
.PP
The mouse cursor is always displayed.
The initial cursor is an arrow.
.I Cursorswitch
causes the argument cursor to be displayed instead.
A zero argument causes a switch back to the arrow cursor.
.I Cursorset
moves the mouse cursor to position
.IR p ,
provided (if in a window) that the requesting program is
executing in the current window and the mouse is within
the window boundaries; otherwise
.I cursorset
is a no-op.
.PP
The graphics functions described in
.IR draw (3),
.IR allocimage (3),
.IR cachechars (3),
and
.IR subfont (3)
are implemented by writing commands to files under
.B /dev/draw
(see
.IR draw (3));
the writes are buffered, so the functions may not take effect immediately.
.I Flushimage
flushes the buffer, doing all pending graphics operations.
If
.I vis
is non-zero, any changes are also copied from the `soft screen' (if any) in the
driver to the visible frame buffer.
The various allocation routines in the library flush automatically, as does the event
package (see
.IR event (3));
most programs do not need to call
.IR flushimage .
It returns \-1 on error.
.PP
.I Bufimage
is used to allocate space for
.I n
bytes in the display buffer.
It is used by all the graphics routines to send messages to the display.
.PP
The functions
.I strtochan
and
.I chantostr
convert between the channel descriptor strings
used by
.IR image (7)
and the internal 
.B ulong
representation 
used by the graphics protocol
(see
.IR draw (3)'s
.B b
message).
.B Chantostr
writes at most nine bytes into the buffer pointed at by 
.I s
and returns 
.I s
on success,
0
on failure.
.B Chantodepth
returns the number of bits per pixel used by the
format specified by
.IR chan .
Both
.B chantodepth
and
.B strtochan
return 0 when presented
with bad input.
.SH EXAMPLES
To reconnect to the window after a resize event,
.IP
.EX
if(getwindow(display, Refnone) < 0)
	sysfatal("resize failed: %r");
.EE
.PP
To create and set up a new
.IR rio (1)
window,
.IP
.EX
Image *screen2;
Screen *_screen2;

srvwsys = getenv("wsys");
if(srvwsys == nil)
	sysfatal("can't find $wsys: %r");
rfork(RFNAMEG); /* keep mount of rio private */

fd = open(srvwsys, ORDWR);
if(fd < 0)
	sysfatal("can't open $wsys: %r");

/* mount creates window; see \f2rio\fP(4) */
if(mount(fd, -1, "/tmp", MREPL, "new -dx 300-dy 200") < 0)
	sysfatal("can't mount new window: %r");
if(gengetwindow(display, "/tmp/winname",
   &screen2, &_screen2, Refnone) < 0)
	sysfatal("resize failed: %r");

/* now open /tmp/cons, /tmp/mouse */
\&...
.EE
.SH FILES
.BR \*9/font/bit "    directory of fonts
.SH SOURCE
.B \*9/src/libdraw
.SH "SEE ALSO"
.IR rio (1),
.IR addpt (3),
.IR allocimage (3),
.IR cachechars (3),
.IR subfont (3),
.IR draw (3),
.IR event (3),
.IR frame (3),
.IR print (3),
.IR window (3),
.IR draw (3),
.\" .IR rio (4),
.IR image (7),
.IR font (7)
.SH DIAGNOSTICS
An error function may call
.IR errstr (3)
for further diagnostics.
.SH BUGS
The names
.B clr
and
.B set
in the 
.B Cursor
structure are reminders of an archaic color map
and might be more appropriately called
.B white
and
.BR black .
.PP
These manual pages contain many references to
the now-fictitious
.BR /dev/draw .
