xref: /plan9-contrib/sys/src/libdraw/readsubfont.c (revision 108f07eed5e0376d0a0522a07177896de3f9c625)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier 
57dd7cddfSDavid du Colombier Subfont*
readsubfonti(Display * d,char * name,int fd,Image * ai,int dolock)67dd7cddfSDavid du Colombier readsubfonti(Display*d, char *name, int fd, Image *ai, int dolock)
77dd7cddfSDavid du Colombier {
87dd7cddfSDavid du Colombier 	char hdr[3*12+4+1];
97dd7cddfSDavid du Colombier 	int n;
107dd7cddfSDavid du Colombier 	uchar *p;
117dd7cddfSDavid du Colombier 	Fontchar *fc;
127dd7cddfSDavid du Colombier 	Subfont *f;
137dd7cddfSDavid du Colombier 	Image *i;
147dd7cddfSDavid du Colombier 
157dd7cddfSDavid du Colombier 	i = ai;
167dd7cddfSDavid du Colombier 	if(i == nil){
177dd7cddfSDavid du Colombier 		i = readimage(d, fd, dolock);
187dd7cddfSDavid du Colombier 		if(i == nil)
197dd7cddfSDavid du Colombier 			return nil;
207dd7cddfSDavid du Colombier 	}
217dd7cddfSDavid du Colombier 	if(read(fd, hdr, 3*12) != 3*12){
227dd7cddfSDavid du Colombier 		if(ai == nil)
237dd7cddfSDavid du Colombier 			freeimage(i);
247dd7cddfSDavid du Colombier 		werrstr("rdsubfonfile: header read error: %r");
257dd7cddfSDavid du Colombier 		return nil;
267dd7cddfSDavid du Colombier 	}
277dd7cddfSDavid du Colombier 	n = atoi(hdr);
287dd7cddfSDavid du Colombier 	p = malloc(6*(n+1));
297dd7cddfSDavid du Colombier 	if(p == nil)
30*b8661318SDavid du Colombier 		goto Err;
317dd7cddfSDavid du Colombier 	if(read(fd, p, 6*(n+1)) != 6*(n+1)){
327dd7cddfSDavid du Colombier 		werrstr("rdsubfonfile: fontchar read error: %r");
337dd7cddfSDavid du Colombier     Err:
34*b8661318SDavid du Colombier 		if(ai == nil)
35*b8661318SDavid du Colombier 			freeimage(i);
367dd7cddfSDavid du Colombier 		free(p);
377dd7cddfSDavid du Colombier 		return nil;
387dd7cddfSDavid du Colombier 	}
397dd7cddfSDavid du Colombier 	fc = malloc(sizeof(Fontchar)*(n+1));
407dd7cddfSDavid du Colombier 	if(fc == nil)
417dd7cddfSDavid du Colombier 		goto Err;
427dd7cddfSDavid du Colombier 	_unpackinfo(fc, p, n);
437dd7cddfSDavid du Colombier 	if(dolock)
447dd7cddfSDavid du Colombier 		lockdisplay(d);
457dd7cddfSDavid du Colombier 	f = allocsubfont(name, n, atoi(hdr+12), atoi(hdr+24), fc, i);
467dd7cddfSDavid du Colombier 	if(dolock)
477dd7cddfSDavid du Colombier 		unlockdisplay(d);
487dd7cddfSDavid du Colombier 	if(f == nil){
497dd7cddfSDavid du Colombier 		free(fc);
507dd7cddfSDavid du Colombier 		goto Err;
517dd7cddfSDavid du Colombier 	}
527dd7cddfSDavid du Colombier 	free(p);
537dd7cddfSDavid du Colombier 	return f;
547dd7cddfSDavid du Colombier }
557dd7cddfSDavid du Colombier 
567dd7cddfSDavid du Colombier Subfont*
readsubfont(Display * d,char * name,int fd,int dolock)577dd7cddfSDavid du Colombier readsubfont(Display *d, char *name, int fd, int dolock)
587dd7cddfSDavid du Colombier {
597dd7cddfSDavid du Colombier 	return readsubfonti(d, name, fd, nil, dolock);
607dd7cddfSDavid du Colombier }
61