mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-12 11:10:07 +00:00
d32deab17b
Suggested by G. Brandon Robinson.
666 lines
13 KiB
Groff
666 lines
13 KiB
Groff
.TH GRAPHICS 3
|
|
.SH NAME
|
|
Display, Point, Rectangle, Cursor, initdraw, geninitdraw, drawerror, initdisplay, closedisplay, 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
|
|
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,
|
|
.MR 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
|
|
.MR 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
|
|
.MR draw (3) .
|
|
.PP
|
|
A
|
|
.B Font
|
|
is a set of character images, indexed by runes (see
|
|
.MR 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
|
|
.MR 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
|
|
.MR 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
|
|
.MR 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
|
|
.MR 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
|
|
.MR 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
|
|
.MR 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
|
|
.MR 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
|
|
.MR 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
|
|
.MR rio (1)
|
|
(see
|
|
.MR 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.
|
|
Neither 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
|
|
.MR allocimage (3) ).
|
|
The resulting window will be created using the refresh method
|
|
.I ref
|
|
(see
|
|
.MR 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
|
|
.MR 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
|
|
.MR draw (3) ,
|
|
.MR allocimage (3) ,
|
|
.MR cachechars (3) ,
|
|
and
|
|
.MR subfont (3)
|
|
are implemented by writing commands to files under
|
|
.B /dev/draw
|
|
(see
|
|
.MR 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
|
|
.MR 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
|
|
.MR image (7)
|
|
and the internal
|
|
.B ulong
|
|
representation
|
|
used by the graphics protocol
|
|
(see
|
|
.MR 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
|
|
.MR 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"
|
|
.MR rio (1) ,
|
|
.MR addpt (3) ,
|
|
.MR allocimage (3) ,
|
|
.MR cachechars (3) ,
|
|
.MR subfont (3) ,
|
|
.MR draw (3) ,
|
|
.MR event (3) ,
|
|
.MR frame (3) ,
|
|
.MR print (3) ,
|
|
.MR window (3) ,
|
|
.MR draw (3) ,
|
|
.\" .IR rio (4),
|
|
.MR image (7) ,
|
|
.MR font (7)
|
|
.SH DIAGNOSTICS
|
|
An error function may call
|
|
.MR 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 .
|