Subversion Repositories planix.SVN

Rev

Rev 2 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
.TH GRAPHICS 2
2
.SH NAME
3
Display, Point, Rectangle, Cursor, initdraw, geninitdraw, drawerror, initdisplay, closedisplay, getdefont, getwindow, gengetwindow, flushimage, bufimage, lockdisplay, unlockdisplay, openfont, buildfont, freefont, Pfmt, Rfmt, strtochan, chantostr, chantodepth \- interactive graphics
4
.SH SYNOPSIS
5
.nf
6
.ft L
7
#include <u.h>
8
#include <libc.h>
9
#include <draw.h>
10
#include <cursor.h>
11
.ft P
12
.PP
13
.ta \w'\fLFont* 'u
14
.B
15
int	initdraw(void (*errfun)(Display*, char*), char *font,
16
.B
17
	   char *label)
18
.PP
19
.B
20
int	geninitdraw(char *devdir, void(*errfun)(Display*, char*),
21
.B
22
	   char *font, char *label, char *windir, int ref)
23
.PP
24
.B
25
int	newwindow(char *str)
26
.PP
27
.B
28
void	drawerror(Display *d, char *msg)
29
.PP
30
.B
31
Display*	initdisplay(char *devdir, char *win, void(*errfun)(Display*, char*))
32
.PP
33
.B
34
void	closedisplay(Display *d)
35
.PP
36
.B
37
Subfont*	getdefont(Display *d)
38
.PP
39
.B
40
int	flushimage(Display *d, int vis)
41
.PP
42
.B
43
uchar*	bufimage(Display *d, int n)
44
.PP
45
.B
46
void	lockdisplay(Display *d)
47
.PP
48
.B
49
void	unlockdisplay(Display *d)
50
.PP
51
.B
52
int	getwindow(Display *d, int ref)
53
.PP
54
.B
55
int	gengetwindow(Display *d, char *winname,
56
.br
57
.B
58
	   Image **ip, Screen **sp, int ref)
59
.PP
60
.B
61
Font*	openfont(Display *d, char *name)
62
.PP
63
.B
64
Font*	buildfont(Display *d, char *desc, char *name)
65
.PP
66
.B
67
void	freefont(Font *f)
68
.PP
69
.B
70
int	Pfmt(Fmt*)
71
.PP
72
.B
73
int	Rfmt(Fmt*)
74
.PP
75
.B
76
ulong	strtochan(char *s)
77
.PP
78
.B
79
char*	chantostr(char *s, ulong chan)
80
.PP
81
.B
82
int	chantodepth(ulong chan)
83
.PP
84
.B
85
extern Display *display
86
.PP
87
.B
88
extern Image   *screen
89
.PP
90
.B
91
extern Screen   *_screen
92
.PP
93
.B
94
extern Font    *font
95
.fi
96
.SH DESCRIPTION
97
A
98
.B Display
99
structure represents a connection to the graphics device,
100
.IR draw (3),
101
holding all graphics resources associated with the connection,
102
including in particular raster image data in use by the client program.
103
The structure is defined (in part) as:
104
.IP
105
.EX
106
.ta 6n +10n
107
typedef
108
struct Display
109
{
110
	...
111
	void	(*error)(Display*, char*);
112
	...
113
	Image	*black;
114
	Image	*white;
115
	Image	*opaque;
116
	Image	*transparent;
117
	Image	*image;
118
	Font		*defaultfont;
119
	Subfont	*defaultsubfont;
120
	...
121
};
122
.EE
123
.PP
124
A
125
.B Point
126
is a location in an Image
127
(see below and
128
.IR draw (2)),
129
such as the display, and is defined as:
130
.IP
131
.EX
132
.ta 6n
133
typedef
134
struct Point {
135
	int x;
136
	int y;
137
} Point;
138
.EE
139
.PP
140
The coordinate system has
141
.I x
142
increasing to the right and
143
.I y
144
increasing down.
145
.PP
146
A
147
.B Rectangle
148
is a rectangular area in an image.
149
.IP
150
.EX
151
.ta 6n
152
typedef
153
struct Rectangle {
154
	Point min;      /* upper left */
155
	Point max;      /* lower right */
156
} Rectangle;
157
.EE
158
.PP
159
By definition,
160
.BR min.x ≤ max.x
161
and
162
.BR min.y ≤ max.y .
163
By convention, the right (maximum
164
.IR x )
165
and bottom (maximum
166
.IR y )
167
edges are
168
excluded from the represented rectangle, so abutting rectangles have no
169
points in common.
170
Thus,
171
.B max
172
contains the coordinates of the first point beyond the rectangle.
173
.PP
174
The
175
.B Image
176
data structure is defined in
177
.IR draw (2).
178
.PP
179
A
180
.B Font
181
is a set of character images, indexed by runes (see
182
.IR utf (6)).
183
The images are organized into
184
.BR Subfonts ,
185
each containing the images for a small, contiguous set of runes.
186
The detailed format of these data structures,
187
which are described in detail in
188
.IR cachechars (2),
189
is immaterial for most applications.
190
.B Font
191
and
192
.B Subfont
193
structures contain two interrelated fields:
194
.LR ascent ,
195
the distance from the top of the highest character
196
(actually the top of the image holding all the characters)
197
to the baseline,
198
and
199
.LR height ,
200
the distance from the top of the highest character to the bottom of
201
the lowest character (and hence, the interline spacing).
202
See
203
.IR cachechars (2)
204
for more details.
205
.PP
206
.I Buildfont
207
parses the font description in the buffer
208
.BR desc ,
209
returning a 
210
.B Font*
211
pointer that can be used by
212
.B string
213
(see
214
.IR draw (2))
215
to draw characters from the font.
216
.I Openfont
217
does the same, but reads the description
218
from the named file.
219
.I Freefont
220
frees a font.
221
The convention for naming font files is:
222
.IP
223
.B /lib/font/bit/\fIname\fP/\fIrange\fP.\fIsize\fP.font
224
.PD
225
.PP
226
where
227
.I size
228
is approximately the height in pixels of the lower case letters
229
(without ascenders or descenders).
230
.I Range
231
gives some indication of which characters will be available: for example
232
.BR ascii ,
233
.BR latin1 ,
234
.BR euro ,
235
or
236
.BR unicode .
237
.B Euro
238
includes most European languages, punctuation marks, the International Phonetic
239
Alphabet, etc., but no Oriental languages.
240
.B Unicode
241
includes every character for which appropriate-sized images exist on the system.
242
.PP
243
A
244
.I Cursor
245
is defined:
246
.IP
247
.EX
248
.ta 6n +\w'Point 'u
249
typedef struct
250
Cursor {
251
	Point	offset;
252
	uchar	clr[2*16];
253
	uchar	set[2*16];
254
} Cursor;
255
.EE
256
.PP
257
The arrays are arranged in rows, two bytes per row, left to
258
right in big-endian order to give 16 rows
259
of 16 bits each.
260
A cursor is displayed on the screen by adding
261
.B offset
262
to the current mouse position, using
263
.B clr
264
as a mask to draw white at the pixels where
265
.B clr
266
is one, and then drawing black at the pixels where
267
.B set
268
is one.
269
.I Setcursor
270
and
271
.I moveto
272
(see
273
.IR mouse (2))
274
and
275
.I esetcursor
276
and
277
.I emoveto
278
(see
279
.IR event (2))
280
change the cursor image and its location on the screen.
281
.PP
282
The routine
283
.I initdraw
284
connects to the display; it returns \-1 if it fails and sets the error string.
285
.I Initdraw
286
sets up the global variables
287
.B display
288
(the
289
.B Display
290
structure representing the connection),
291
.B screen
292
(an
293
.B Image
294
representing the display memory itself or, if
295
.IR rio (1)
296
is running, the client's window),
297
and
298
.B font
299
(the default font for text).
300
The arguments to
301
.I initdraw
302
include a
303
.IR label ,
304
which is written to
305
.B /dev/label
306
if non-nil
307
so that it can be used to identify the window when hidden (see
308
.IR rio (1)).
309
The font is created by reading the named
310
.I font
311
file.  If
312
.B font
313
is null,
314
.I initdraw
315
reads the file named in the environment variable
316
.BR $font ;
317
if
318
.B $font
319
is not set, it imports the default (usually minimal)
320
font from the operating system.
321
The global
322
.I font
323
will be set to point to the resulting
324
.B Font
325
structure.
326
The
327
.I errfun
328
argument is a
329
.I graphics error function
330
to call in the event of a fatal error in the library; it must never return.
331
Its arguments are the
332
display pointer and an error string.
333
If
334
.I errfun
335
is nil, the library provides a default, called
336
.IR drawerror .
337
Another effect of
338
.I initdraw
339
is that it installs
340
.IR print (2)
341
formats
342
.I Pfmt
343
and
344
.I Rfmt
345
as
346
.L %P
347
and
348
.L %R
349
for printing
350
.B Points
351
and
352
.BR Rectangles .
353
.PP
354
The
355
.I geninitdraw
356
function provides a less automated way to establish a connection, for programs
357
that wish to connect to multiple displays.
358
.I Devdir
359
is the name of the directory containing the device files for the display
360
(if nil, default
361
.BR /dev );
362
.IR errfun ,
363
.IR font ,
364
and
365
.I label
366
are as in
367
.IR initdraw ;
368
.I windir
369
is the directory holding the
370
.B winname
371
files; and
372
.I ref
373
specifies the refresh function to be used to create the window, if running under
374
.IR rio (1)
375
(see
376
.IR window (2)).
377
.PP
378
The function
379
.I newwindow
380
may be called before
381
.I initdraw
382
or
383
.IR geninitdraw
384
to cause the program to occupy a newly created window rather than take over the one in
385
which it is running when it starts.
386
The
387
.I str
388
argument, if non-null, is concatenated to the string \f5\&"new\ "\fP
389
that is used to create the window (see
390
.IR rio (4)).
391
For example,
392
.B newwindow("-hide -dy 100")
393
will cause the program to run in a newly created, hidden window
394
100 pixels high.
395
.PP
396
.I Initdisplay
397
is part of
398
.IR geninitdraw ;
399
it sets up the display structures but does not allocate any fonts or call
400
.IR getwindow .
401
The arguments are similar to those of
402
.IR initdraw ;
403
.I win
404
names the directory, default
405
.BR /dev ,
406
in which the files associated with the window reside.
407
.I Closedisplay
408
disconnects the display and frees the associated data structures.
409
.I Getdefont
410
builds a
411
.B Subfont
412
structure from in-core data describing a default subfont.
413
None of these routines is needed by most programs, since
414
.I initdraw
415
calls them as needed.
416
.PP
417
The data structures associated with the display must be protected in a multi-process program,
418
because they assume only one process will be using them at a time.
419
Multi-process programs should set
420
.B display->locking
421
to
422
.BR 1 ,
423
to notify the library to use a locking protocol for its own accesses,
424
and call
425
.I lockdisplay
426
and
427
.I unlockdisplay
428
around any calls to the graphics library that will cause messages to be sent to the display device.
429
.I Initdraw
430
and
431
.I geninitdraw
432
initialize the display to the locked state.
433
.PP
434
.I Getwindow
435
returns a pointer to the window associated with the application; it is called
436
automatically by
437
.I initdraw
438
to establish the
439
.B screen
440
pointer but must be called after each resizing of the window to restore
441
the library's connection to the window.
442
If
443
.B rio
444
is not running, it returns
445
.BR display->image ;
446
otherwise it negotiates with
447
.B rio
448
by looking in
449
.B /dev/winname
450
to find the name of the window and opening it using
451
.B namedimage
452
(see
453
.IR allocimage (2)).
454
The resulting window will be created using the refresh method
455
.I ref
456
(see
457
.IR window (2));
458
this should almost always be
459
.B Refnone
460
because
461
.B rio
462
provides backing store for the window.
463
.PP
464
.I Getwindow
465
overwrites the global variables
466
.BR screen ,
467
a pointer to the
468
.B Image
469
defining the window (or the overall display, if no window system is running); and
470
.BR _screen ,
471
a pointer to the
472
.B Screen
473
representing the root of the window's hierarchy. (See
474
.IR window (2).
475
The overloading of the
476
.B screen
477
word is an unfortunate historical accident.)
478
.I Getwindow
479
arranges that
480
.B screen
481
point to the portion of the window inside the border;
482
sophisticated clients may use
483
.B _screen
484
to make further subwindows.
485
Programs desiring multiple independent windows
486
may use the mechanisms of
487
.IR rio (4)
488
to create more windows (usually by a fresh mount of the window sytem
489
in a directory other than
490
.BR /dev ),
491
then use
492
.I gengetwindow
493
to connect to them.
494
.IR Gengetwindow 's
495
extra arguments are the full path of the window's
496
.B winname
497
file and pointers to be overwritten with the values of the `global'
498
.B Image
499
and
500
.B Screen
501
variables for the new window.
502
.PP
503
The graphics functions described in
504
.IR draw (2),
505
.IR allocimage (2),
506
.IR cachechars (2),
507
and
508
.IR subfont (2)
509
are implemented by writing commands to files under
510
.B /dev/draw
511
(see
512
.IR draw (3));
513
the writes are buffered, so the functions may not take effect immediately.
514
.I Flushimage
515
flushes the buffer, doing all pending graphics operations.
516
If
517
.I vis
518
is non-zero, any changes are also copied from the `soft screen' (if any) in the
519
driver to the visible frame buffer.
520
The various allocation routines in the library flush automatically, as does the event
521
package (see
522
.IR event (2));
523
most programs do not need to call
524
.IR flushimage .
525
It returns \-1 on error.
526
.PP
527
.I Bufimage
528
is used to allocate space for
529
.I n
530
bytes in the display buffer.
531
It is used by all the graphics routines to send messages to the display.
532
.PP
533
The functions
534
.I strtochan
535
and
536
.I chantostr
537
convert between the channel descriptor strings
538
used by
539
.IR image (6)
540
and the internal 
541
.B ulong
542
representation 
543
used by the graphics protocol
544
(see
545
.IR draw (3)'s
546
.B b
547
message).
548
.B Chantostr
549
writes at most nine bytes into the buffer pointed at by 
550
.I s
551
and returns 
552
.I s
553
on success,
554
 
555
on failure.
556
.B Chantodepth
557
returns the number of bits per pixel used by the
558
format specified by
559
.IR chan .
560
Both
561
.B chantodepth
562
and
563
.B strtochan
564
return 0 when presented
565
with bad input.
566
.SH EXAMPLES
567
To reconnect to the window after a resize event,
568
.IP
569
.EX
570
if(getwindow(display, Refnone) < 0)
571
	sysfatal("resize failed: %r");
572
.EE
573
.PP
574
To create and set up a new
575
.IR rio (1)
576
window,
577
.IP
578
.EX
579
Image *screen2;
580
Screen *_screen2;
581
 
582
srvwsys = getenv("wsys");
583
if(srvwsys == nil)
584
	sysfatal("can't find $wsys: %r");
585
rfork(RFNAMEG); /* keep mount of rio private */
586
 
587
fd = open(srvwsys, ORDWR);
588
if(fd < 0)
589
	sysfatal("can't open $wsys: %r");
590
 
591
/* mount creates window; see \f2rio\fP(4) */
592
if(mount(fd, -1, "/tmp", MREPL, "new -dx 300-dy 200") < 0)
593
	sysfatal("can't mount new window: %r");
594
if(gengetwindow(display, "/tmp/winname",
595
   &screen2, &_screen2, Refnone) < 0)
596
	sysfatal("resize failed: %r");
597
 
598
/* now open /tmp/cons, /tmp/mouse */
599
\&...
600
.EE
601
.SH FILES
602
.BR /lib/font/bit "    directory of fonts
603
.SH SOURCE
604
.B /sys/src/libdraw
605
.SH "SEE ALSO"
606
.IR rio (1),
607
.IR addpt (2),
608
.IR allocimage (2),
609
.IR cachechars (2),
610
.IR subfont (2),
611
.IR draw (2),
612
.IR event (2),
613
.IR frame (2),
614
.IR print (2),
615
.IR window (2),
616
.IR draw (3),
617
.IR rio (4),
618
.IR image (6),
619
.IR font (6)
620
.SH DIAGNOSTICS
621
An error function may call
622
.IR errstr (2)
623
for further diagnostics.
624
.SH BUGS
625
The names
626
.B clr
627
and
628
.B set
629
in the 
630
.B Cursor
631
structure are reminders of an archaic color map
632
and might be more appropriately called
633
.B white
634
and
635
.BR black .