blob: 05370eacc95899850aaadde56bfd897dd27c6fbe [file] [log] [blame]
rsc76193d72003-09-30 17:47:42 +00001#include <u.h>
2#include <libc.h>
3#include <draw.h>
4
rsc161060a2003-10-11 02:47:43 +00005extern vlong _drawflength(int);
6
rsc76193d72003-09-30 17:47:42 +00007Font*
8openfont(Display *d, char *name)
9{
10 Font *fnt;
11 int fd, i, n;
rsc32f69c32003-12-11 17:48:38 +000012 char *buf, *nambuf;
rsc76193d72003-09-30 17:47:42 +000013
rsce6f4b2e2003-10-13 17:16:15 +000014 nambuf = 0;
rsc76193d72003-09-30 17:47:42 +000015 fd = open(name, OREAD);
rsce6f4b2e2003-10-13 17:16:15 +000016
17 if(fd < 0 && strncmp(name, "/lib/font/bit/", 14) == 0){
rsc32f69c32003-12-11 17:48:38 +000018 nambuf = smprint("#9/font/%s", name+14);
rsce6f4b2e2003-10-13 17:16:15 +000019 if(nambuf == nil)
20 return 0;
rsc8ad51792004-03-25 23:03:57 +000021 nambuf = unsharp(nambuf);
22 if(nambuf == nil)
23 return 0;
rsce6f4b2e2003-10-13 17:16:15 +000024 if((fd = open(nambuf, OREAD)) < 0){
25 free(nambuf);
26 return 0;
27 }
28 name = nambuf;
29 }
rsc76193d72003-09-30 17:47:42 +000030 if(fd < 0)
31 return 0;
32
rsc161060a2003-10-11 02:47:43 +000033 n = _drawflength(fd);
rsc76193d72003-09-30 17:47:42 +000034 buf = malloc(n+1);
35 if(buf == 0){
36 close(fd);
rsce6f4b2e2003-10-13 17:16:15 +000037 free(nambuf);
rsc76193d72003-09-30 17:47:42 +000038 return 0;
39 }
40 buf[n] = 0;
41 i = read(fd, buf, n);
42 close(fd);
43 if(i != n){
44 free(buf);
rsce6f4b2e2003-10-13 17:16:15 +000045 free(nambuf);
rsc76193d72003-09-30 17:47:42 +000046 return 0;
47 }
48 fnt = buildfont(d, buf, name);
49 free(buf);
rsce6f4b2e2003-10-13 17:16:15 +000050 free(nambuf);
rsc76193d72003-09-30 17:47:42 +000051 return fnt;
52}