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