123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- .TH CACHECHARS 2
- .SH NAME
- cachechars, agefont, loadchar, Subfont, Fontchar, Font \- font utilities
- .SH SYNOPSIS
- .B #include <u.h>
- .br
- .B #include <draw.h>
- .br
- .B #include <draw.h>
- .PP
- .ta \w'\fLCacheinfo 'u
- .PP
- .B
- int cachechars(Font *f, char **s, Rune **r, ushort *c, int max,
- .PP
- .B
- int *widp, char **sfname)
- .PP
- .B
- int loadchar(Font *f, Rune r, Cacheinfo *c, int h,
- .PP
- .B
- int noclr, char **sfname)
- .PP
- .B
- void agefont(Font *f)
- .SH DESCRIPTION
- A
- .I Font
- may contain too many characters to hold in memory
- simultaneously.
- The graphics library and draw device (see
- .IR draw (3))
- cooperate to solve this problem by maintaining a cache of recently used
- character images.
- The details of this cooperation need not be known by most programs:
- .I initdraw
- and its associated
- .I font
- variable,
- .IR openfont ,
- .IR stringwidth ,
- .IR string ,
- and
- .I freefont
- are sufficient for most purposes.
- The routines described below are used internally by the graphics library
- to maintain the font cache.
- .PP
- A
- .B Subfont
- is a set of images for a contiguous range of characters, stored as a single
- image
- with the characters
- placed side-by-side on a common baseline.
- It is described by the following data structures.
- .IP
- .EX
- .ta 6n +\w'Fontchar 'u +\w'bottom; 'u
- typedef
- struct Fontchar {
- int x; /* left edge of bits */
- uchar top; /* first non-zero scan-line */
- uchar bottom; /* last non-zero scan-line */
- char left; /* offset of baseline */
- uchar width; /* width of baseline */
- } Fontchar;
- typedef
- struct Subfont {
- char *name;
- short n; /* number of chars in subfont */
- uchar height; /* height of image */
- char ascent; /* top of image to baseline */
- Fontchar *info; /* n+1 Fontchars */
- Image *bits; /* of font */
- } Subfont;
- .EE
- .PP
- The image fills the rectangle
- \fL(0, 0, \fIw\fP, height)\fR,
- where
- .I w
- is the sum of the horizontal extents (of non-zero pixels)
- for all characters.
- The pixels to be displayed for character
- .I c
- are in the rectangle
- \fL(\fIi\fP->x, \fIi\fP->top, (\fIi\fP+1)->x, \%\fIi\fP->bottom)\fR
- where
- .I i
- is
- .B
- &subfont->info[\fIc\fP]\fR.
- When a character is displayed at
- .B Point
- .B p
- in an image,
- the character rectangle is placed at
- .BI (p.x+ i ->left,
- .B p.y)
- and the next character of the string is displayed at
- .BI (p.x+ i ->width,
- .BR p.y) .
- The baseline of the characters is
- .L ascent
- rows down from the top of the subfont image.
- The
- .L info
- array has
- .B n+1
- elements, one each for characters 0 to
- .BR n-1
- plus an additional entry so the size of the last character
- can be calculated.
- Thus the width,
- .IR w ,
- of the
- .B Image
- associated with a
- .B Subfont
- .B s
- is
- .BR s->info[s->n].x .
- .PP
- A
- .B Font
- consists of an overall height and ascent
- and a collection of subfonts together with the ranges of runes (see
- .IR utf (6))
- they represent.
- Fonts are described by the following structures.
- .IP
- .EX
- .ta 6n +\w'Cacheinfo 'u +\w'height; 'u
- typedef
- struct Cachefont {
- Rune min; /* value of 0th char in subfont */
- Rune max; /* value+1 of last char in subfont */
- int offset; /* posn in subfont of char at min */
- char *name; /* stored in font */
- char *subfontname; /* to access subfont */
- } Cachefont;
- typedef
- struct Cacheinfo {
- ushort x; /* left edge of bits */
- uchar width; /* width of baseline */
- schar left; /* offset of baseline */
- Rune value; /* of char at this slot in cache */
- ushort age;
- } Cacheinfo;
- typedef
- struct Cachesubf {
- ulong age; /* for replacement */
- Cachefont *cf; /* font info that owns us */
- Subfont *f; /* attached subfont */
- } Cachesubf;
- typedef
- struct Font {
- char *name;
- Display *display;
- short height; /* max ht of image;interline space*/
- short ascent; /* top of image to baseline */
- short width; /* widest so far; used in caching */
- short nsub; /* number of subfonts */
- ulong age; /* increasing counter; for LRU */
- int ncache; /* size of cache */
- int nsubf; /* size of subfont list */
- Cacheinfo *cache;
- Cachesubf *subf;
- Cachefont **sub; /* as read from file */
- Image *cacheimage;
- } Font;
- .EE
- .PP
- The
- .LR height
- and
- .LR ascent
- fields of Font are described in
- .IR graphics (2).
- .L Sub
- contains
- .L nsub
- pointers to
- .BR Cachefonts .
- A
- .B Cachefont
- connects runes
- .L min
- through
- .LR max ,
- inclusive, to the subfont
- with file name
- .LR name ;
- it corresponds to a line of the file describing the font.
- .PP
- The characters
- are taken from the subfont starting at character number
- .L offset
- (usually zero) in the subfont, permitting selection of parts of subfonts.
- Thus
- the image for rune
- .I r
- is found in position
- .IB r -min+offset
- of the subfont.
- .PP
- For each font, the library, with support from the
- graphics server,
- maintains a cache of
- subfonts and a cache of recently used
- character images.
- The
- .B subf
- and
- .B cache
- fields are used by the library to maintain these caches.
- The
- .L width
- of a font is the maximum of the horizontal extents of the characters
- in the cache.
- .I String
- draws a string by loading the cache and emitting a sequence of
- cache indices to draw.
- .I Cachechars
- guarantees the images for the characters pointed to by
- .I *s
- or
- .I *r
- (one of these must be nil in each call)
- are in the cache of
- .IR f .
- It calls
- .I loadchar
- to put missing characters into the cache.
- .I Cachechars
- translates the character string into a set of cache indices
- which it loads into the array
- .IR c ,
- up to a maximum of
- .I n
- indices or the length of the string.
- .I Cachechars
- returns in
- .I c
- the number of cache indices emitted,
- updates
- .I *s
- to point to the next character to be processed, and sets
- .I *widp
- to the total width of the characters processed.
- .I Cachechars
- may return before the end of the string if it cannot
- proceed without destroying active data in the caches.
- If it needs to load a new subfont, it will fill
- .B *sfname
- with the name of the subfont it needs and return \-1.
- It can return zero if it is unable to make progress because
- it cannot resize the caches.
- .PP
- .I Loadchar
- loads a character image into the character cache.
- Then it tells the graphics server to copy the character
- into position
- .I h
- in the character cache.
- If the current font
- .L width
- is smaller than the horizontal extent of the character being loaded,
- .I loadfont
- clears the cache and resets it to
- accept characters with the bigger width, unless
- .I noclr
- is set, in which case it just returns \-1.
- If the character does not exist in the font at all,
- .I loadfont
- returns 0; if it is unable to load the character
- without destroying cached information, it returns \-1,
- updating
- .B *sfname
- as described above.
- It returns 1 to indicate success.
- .PP
- The
- .L age
- fields record when
- subfonts and characters have been used.
- The font
- .L age
- is increased every time the font is used
- .RI ( agefont
- does this).
- A character or subfont
- .L age
- is set to the font age at each use.
- Thus, characters or subfonts with small ages are the best candidates
- for replacement when the cache is full.
- .SH SOURCE
- .B /sys/src/libdraw
- .SH SEE ALSO
- .IR graphics (2),
- .IR allocimage (2),
- .IR draw (2),
- .IR subfont (2),
- .IR image (6),
- .IR font (6)
- .SH DIAGNOSTICS
- All of the functions use the graphics error function (see
- .IR graphics (2)).
|