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