Blame


1 324891a5 2006-06-25 devnull #include <u.h>
2 324891a5 2006-06-25 devnull #include <libc.h>
3 324891a5 2006-06-25 devnull #include <draw.h>
4 324891a5 2006-06-25 devnull #include <memdraw.h>
5 324891a5 2006-06-25 devnull
6 324891a5 2006-06-25 devnull Memsubfont*
7 324891a5 2006-06-25 devnull openmemsubfont(char *name)
8 324891a5 2006-06-25 devnull {
9 324891a5 2006-06-25 devnull Memsubfont *sf;
10 324891a5 2006-06-25 devnull Memimage *i;
11 324891a5 2006-06-25 devnull Fontchar *fc;
12 324891a5 2006-06-25 devnull int fd, n;
13 324891a5 2006-06-25 devnull char hdr[3*12+4+1];
14 324891a5 2006-06-25 devnull uchar *p;
15 324891a5 2006-06-25 devnull
16 324891a5 2006-06-25 devnull fd = open(name, OREAD);
17 324891a5 2006-06-25 devnull if(fd < 0)
18 324891a5 2006-06-25 devnull return nil;
19 324891a5 2006-06-25 devnull p = nil;
20 324891a5 2006-06-25 devnull i = readmemimage(fd);
21 324891a5 2006-06-25 devnull if(i == nil)
22 324891a5 2006-06-25 devnull goto Err;
23 324891a5 2006-06-25 devnull if(read(fd, hdr, 3*12) != 3*12){
24 324891a5 2006-06-25 devnull werrstr("openmemsubfont: header read error: %r");
25 324891a5 2006-06-25 devnull goto Err;
26 324891a5 2006-06-25 devnull }
27 324891a5 2006-06-25 devnull n = atoi(hdr);
28 324891a5 2006-06-25 devnull p = malloc(6*(n+1));
29 324891a5 2006-06-25 devnull if(p == nil)
30 324891a5 2006-06-25 devnull goto Err;
31 324891a5 2006-06-25 devnull if(read(fd, p, 6*(n+1)) != 6*(n+1)){
32 324891a5 2006-06-25 devnull werrstr("openmemsubfont: fontchar read error: %r");
33 324891a5 2006-06-25 devnull goto Err;
34 324891a5 2006-06-25 devnull }
35 324891a5 2006-06-25 devnull fc = malloc(sizeof(Fontchar)*(n+1));
36 324891a5 2006-06-25 devnull if(fc == nil)
37 324891a5 2006-06-25 devnull goto Err;
38 324891a5 2006-06-25 devnull _unpackinfo(fc, p, n);
39 324891a5 2006-06-25 devnull sf = allocmemsubfont(name, n, atoi(hdr+12), atoi(hdr+24), fc, i);
40 324891a5 2006-06-25 devnull if(sf == nil){
41 324891a5 2006-06-25 devnull free(fc);
42 324891a5 2006-06-25 devnull goto Err;
43 324891a5 2006-06-25 devnull }
44 324891a5 2006-06-25 devnull free(p);
45 324891a5 2006-06-25 devnull return sf;
46 324891a5 2006-06-25 devnull Err:
47 324891a5 2006-06-25 devnull close(fd);
48 324891a5 2006-06-25 devnull if (i != nil)
49 324891a5 2006-06-25 devnull freememimage(i);
50 324891a5 2006-06-25 devnull if (p != nil)
51 324891a5 2006-06-25 devnull free(p);
52 324891a5 2006-06-25 devnull return nil;
53 324891a5 2006-06-25 devnull }