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