mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-12 11:10:07 +00:00
16d0081989
If $font is not set, the default font is constructed from font data linked into every libdraw binary. That process was different from the usual openfont code, and so it was not hidpi-aware, resulting in very tiny fonts out of the box on hidpi systems, until users set $font. Fix this by using openfont to construct the default font, by recognizing the name *default* when looking for font and subfont file contents. Then all the hidpi scaling applies automatically. As a side effect, the concept of a 'default subfont' is gone, as are display->defaultsubfont, getdefont, and memgetdefont.
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,
|
|
.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.
|
|
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
|
|
.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 .
|