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