xref: /inferno-os/libdraw/readsubfont.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth #include "lib9.h"
2*37da2899SCharles.Forsyth #include "kernel.h"
3*37da2899SCharles.Forsyth #include "draw.h"
4*37da2899SCharles.Forsyth 
5*37da2899SCharles.Forsyth Subfont*
readsubfonti(Display * d,char * name,int fd,Image * ai,int dolock)6*37da2899SCharles.Forsyth readsubfonti(Display*d, char *name, int fd, Image *ai, int dolock)
7*37da2899SCharles.Forsyth {
8*37da2899SCharles.Forsyth 	char hdr[3*12+4+1];
9*37da2899SCharles.Forsyth 	int n;
10*37da2899SCharles.Forsyth 	uchar *p;
11*37da2899SCharles.Forsyth 	Fontchar *fc;
12*37da2899SCharles.Forsyth 	Subfont *f;
13*37da2899SCharles.Forsyth 	Image *i;
14*37da2899SCharles.Forsyth 
15*37da2899SCharles.Forsyth 	i = ai;
16*37da2899SCharles.Forsyth 	if(i == nil){
17*37da2899SCharles.Forsyth 		i = readimage(d, fd, dolock|2);
18*37da2899SCharles.Forsyth 		if(i == nil)
19*37da2899SCharles.Forsyth 			return nil;
20*37da2899SCharles.Forsyth 	}
21*37da2899SCharles.Forsyth 	if(libreadn(fd, hdr, 3*12) != 3*12){
22*37da2899SCharles.Forsyth 		if(ai == nil)
23*37da2899SCharles.Forsyth 			freeimage(i);
24*37da2899SCharles.Forsyth 		kwerrstr("rdsubfonfile: header read error: %r");
25*37da2899SCharles.Forsyth 		return nil;
26*37da2899SCharles.Forsyth 	}
27*37da2899SCharles.Forsyth 	n = atoi(hdr);
28*37da2899SCharles.Forsyth 	p = malloc(6*(n+1));
29*37da2899SCharles.Forsyth 	if(p == nil)
30*37da2899SCharles.Forsyth 		return nil;
31*37da2899SCharles.Forsyth 	if(libreadn(fd, p, 6*(n+1)) != 6*(n+1)){
32*37da2899SCharles.Forsyth 		kwerrstr("rdsubfonfile: fontchar read error: %r");
33*37da2899SCharles.Forsyth     Err:
34*37da2899SCharles.Forsyth 		free(p);
35*37da2899SCharles.Forsyth 		return nil;
36*37da2899SCharles.Forsyth 	}
37*37da2899SCharles.Forsyth 	fc = malloc(sizeof(Fontchar)*(n+1));
38*37da2899SCharles.Forsyth 	if(fc == nil)
39*37da2899SCharles.Forsyth 		goto Err;
40*37da2899SCharles.Forsyth 	_unpackinfo(fc, p, n);
41*37da2899SCharles.Forsyth 	if(dolock)
42*37da2899SCharles.Forsyth 		lockdisplay(d);
43*37da2899SCharles.Forsyth 	f = allocsubfont(name, n, atoi(hdr+12), atoi(hdr+24), fc, i);
44*37da2899SCharles.Forsyth 	if(dolock)
45*37da2899SCharles.Forsyth 		unlockdisplay(d);
46*37da2899SCharles.Forsyth 	if(f == nil){
47*37da2899SCharles.Forsyth 		free(fc);
48*37da2899SCharles.Forsyth 		goto Err;
49*37da2899SCharles.Forsyth 	}
50*37da2899SCharles.Forsyth 	free(p);
51*37da2899SCharles.Forsyth 	return f;
52*37da2899SCharles.Forsyth }
53*37da2899SCharles.Forsyth 
54*37da2899SCharles.Forsyth Subfont*
readsubfont(Display * d,char * name,int fd,int dolock)55*37da2899SCharles.Forsyth readsubfont(Display*d, char *name, int fd, int dolock)
56*37da2899SCharles.Forsyth {
57*37da2899SCharles.Forsyth 	return readsubfonti(d, name, fd, nil, dolock);
58*37da2899SCharles.Forsyth }
59