xref: /plan9/sys/src/cmd/unix/drawterm/libmemdraw/openmemsubfont.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
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