xref: /plan9/sys/src/libdraw/getsubfont.c (revision 50e5f38d649a06ef8aef42696e09b6c4c5964957)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier 
57dd7cddfSDavid du Colombier /*
67dd7cddfSDavid du Colombier  * Default version: treat as file name
77dd7cddfSDavid du Colombier  */
87dd7cddfSDavid du Colombier 
97dd7cddfSDavid du Colombier Subfont*
_getsubfont(Display * d,char * name)107dd7cddfSDavid du Colombier _getsubfont(Display *d, char *name)
117dd7cddfSDavid du Colombier {
127dd7cddfSDavid du Colombier 	int fd;
137dd7cddfSDavid du Colombier 	Subfont *f;
147dd7cddfSDavid du Colombier 
157dd7cddfSDavid du Colombier 	fd = open(name, OREAD);
167dd7cddfSDavid du Colombier 
177dd7cddfSDavid du Colombier 	if(fd < 0){
189a747e4fSDavid du Colombier 		fprint(2, "getsubfont: can't open %s: %r\n", name);
197dd7cddfSDavid du Colombier 		return 0;
207dd7cddfSDavid du Colombier 	}
217dd7cddfSDavid du Colombier 	/*
227dd7cddfSDavid du Colombier 	 * unlock display so i/o happens with display released, unless
237dd7cddfSDavid du Colombier 	 * user is doing his own locking, in which case this could break things.
247dd7cddfSDavid du Colombier 	 * _getsubfont is called only from string.c and stringwidth.c,
257dd7cddfSDavid du Colombier 	 * which are known to be safe to have this done.
267dd7cddfSDavid du Colombier 	 */
27b8661318SDavid du Colombier 	if(d && d->locking == 0)
287dd7cddfSDavid du Colombier 		unlockdisplay(d);
29b8661318SDavid du Colombier 	f = readsubfont(d, name, fd, d && d->locking==0);
30b8661318SDavid du Colombier 	if(d && d->locking == 0)
317dd7cddfSDavid du Colombier 		lockdisplay(d);
327dd7cddfSDavid du Colombier 	if(f == 0)
339a747e4fSDavid du Colombier 		fprint(2, "getsubfont: can't read %s: %r\n", name);
347dd7cddfSDavid du Colombier 	close(fd);
35*50e5f38dSDavid du Colombier 	setmalloctag(f, getcallerpc(&d));
367dd7cddfSDavid du Colombier 	return f;
377dd7cddfSDavid du Colombier }
38