5 extern vlong _drawflength(int);
9 parsefontscale(char *name, char **base)
16 while('0' <= *p && *p <= '9') {
17 scale = scale*10 + *p - '0';
20 if(*p == '*' && scale > 0)
30 openfont1(Display *d, char *name)
34 char *buf, *nambuf, *fname, *freename;
38 scale = parsefontscale(name, &fname);
40 fd = open(fname, OREAD);
41 if(fd < 0 && strncmp(fname, "/lib/font/bit/", 14) == 0){
42 nambuf = smprint("#9/font/%s", fname+14);
45 nambuf = unsharp(nambuf);
48 if((fd = open(nambuf, OREAD)) < 0){
54 name = smprint("%d*%s", scale, fname);
62 if(fd < 0 && strncmp(fname, "/mnt/font/", 10) == 0) {
63 fd = _fontpipe(fname+10);
75 i = readn(fd, buf, n);
83 fnt = buildfont(d, buf, name);
97 swapfont(Font *targ, Font **oldp, Font **newp)
102 sysfatal("bad swapfont %p %p %p", targ, *oldp, *newp);
108 f.display = old->display;
109 f.height = old->height;
110 f.ascent = old->ascent;
111 f.width = old->width;
114 f.maxdepth = old->maxdepth;
115 f.ncache = old->ncache;
116 f.nsubf = old->nsubf;
117 f.scale = old->scale;
118 f.cache = old->cache;
121 f.cacheimage = old->cacheimage;
123 old->name = new->name;
124 old->display = new->display;
125 old->height = new->height;
126 old->ascent = new->ascent;
127 old->width = new->width;
128 old->nsub = new->nsub;
130 old->maxdepth = new->maxdepth;
131 old->ncache = new->ncache;
132 old->nsubf = new->nsubf;
133 old->scale = new->scale;
134 old->cache = new->cache;
135 old->subf = new->subf;
137 old->cacheimage = new->cacheimage;
140 new->display = f.display;
141 new->height = f.height;
142 new->ascent = f.ascent;
143 new->width = f.width;
146 new->maxdepth = f.maxdepth;
147 new->ncache = f.ncache;
148 new->nsubf = f.nsubf;
149 new->scale = f.scale;
150 new->cache = f.cache;
153 new->cacheimage = f.cacheimage;
165 // If font name has form x,y return y.
166 p = strchr(f->namespec, ',');
170 // If font name is /mnt/font/Name/Size/font, scale Size.
171 if(strncmp(f->name, "/mnt/font/", 10) == 0) {
172 p = strchr(f->name+10, '/');
173 if(p == nil || *++p < '0' || *p > '9')
177 while('0' <= *q && *q <= '9')
178 size = size*10 + *q++ - '0';
179 return smprint("%.*s%d%s", utfnlen(f->name, p-f->name), f->name, size*2, q);
182 // Otherwise use pixel doubling.
184 return smprint("%d*%s", f->scale*2, f->name);
195 if(f->hidpi != nil) {
196 swapfont(f, &f->lodpi, &f->hidpi);
201 fnew = openfont1(f->display, name);
207 swapfont(f, &f->lodpi, &f->hidpi);
211 openfont(Display *d, char *name)
217 // If font name has form x,y use x for lodpi, y for hidpi.
219 namespec = strdup(name);
220 if((p = strchr(name, ',')) != nil)
223 f = openfont1(d, name);
227 f->namespec = namespec;
229 /* add to display list for when dpi changes */
230 /* d can be nil when invoked from mc. */
232 f->ondisplaylist = 1;
233 f->prev = d->lastfont;
241 /* if this is a hi-dpi display, find hi-dpi version and swap */
242 if(d->dpi >= DefaultDPI*3/2)
252 _fontpipe(char *name)
256 char buf[1024], *argv[10];
261 pid = rfork(RFNOWAIT|RFFDG|RFPROC);
277 execvp("fontsrv", argv);
278 print("exec fontsrv: %r\n");
283 // success marked with leading \001.
284 // otherwise an error happened.
285 for(nbuf=0; nbuf<sizeof buf-1; nbuf++) {
286 if(read(p[0], &c, 1) < 1 || c == '\n') {