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