]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libdraw/readsubfont.c
libdraw: use readn() to read headers and Fontchar array
[plan9front.git] / sys / src / libdraw / readsubfont.c
1 #include <u.h>
2 #include <libc.h>
3 #include <draw.h>
4
5 Subfont*
6 readsubfonti(Display*d, char *name, int fd, Image *ai, int dolock)
7 {
8         char hdr[3*12+4+1];
9         int n;
10         uchar *p;
11         Fontchar *fc;
12         Subfont *f;
13         Image *i;
14
15         i = ai;
16         if(i == nil){
17                 i = readimage(d, fd, dolock);
18                 if(i == nil)
19                         return nil;
20         }
21         p = nil;
22         if(readn(fd, hdr, 3*12) != 3*12){
23                 werrstr("readsubfont: header read error: %r");
24                 goto Err;
25         }
26         n = atoi(hdr);
27         if(n <= 0 || n > 0x7fff){
28                 werrstr("readsubfont: bad fontchar count %d", n);
29                 goto Err;
30         }
31         p = malloc(6*(n+1));
32         if(p == nil)
33                 goto Err;
34         if(readn(fd, p, 6*(n+1)) != 6*(n+1)){
35                 werrstr("readsubfont: fontchar read error: %r");
36                 goto Err;
37         }
38         fc = malloc(sizeof(Fontchar)*(n+1));
39         if(fc == nil)
40                 goto Err;
41         _unpackinfo(fc, p, n);
42         if(dolock)
43                 lockdisplay(d);
44         f = allocsubfont(name, n, atoi(hdr+12), atoi(hdr+24), fc, i);
45         if(dolock)
46                 unlockdisplay(d);
47         if(f == nil){
48                 free(fc);
49                 goto Err;
50         }
51         free(p);
52         return f;
53 Err:
54         if(ai == nil)
55                 freeimage(i);
56         free(p);
57         return nil;
58 }
59
60 Subfont*
61 readsubfont(Display *d, char *name, int fd, int dolock)
62 {
63         return readsubfonti(d, name, fd, nil, dolock);
64 }