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